Repository navigation
Run it the way a deployment runs it, and fix what that found - #8
Open
AlexisRodriguezCS wants to merge 2 commits into
Open
AlexisRodriguezCS wants to merge 2 commits into
AlexisRodriguezCS wants to merge 2 commits into
Conversation
Everything so far had been proved against the demo stack: H2, seeders, one container each. The configuration a real deployment uses - the prod profile on Postgres, Flyway, ddl-auto=validate, no seed data - had only ever been tested per service by Testcontainers. Running the whole thing on it for the first time found that **nobody could sign in at all**: every seeder is @Profile("!prod"), so the user table was empty and there was no way to make an account. The stack was healthy and completely unusable. BootstrapAdmin creates one ADMIN when the table is empty and credentials are configured. Both halves matter: configured but users present does nothing, so a restart cannot resurrect a deleted account or reset a changed password; empty but unconfigured says how to fix it in the log rather than leaving an operator with a bare 401. Nothing ships with a default password. infra/qa/prod-smoke.cjs is that run, kept: sign in, create a tenant and its records, check gear out and back, correct a person, refuse to delete a desk with gear on it, delete it once empty. 11 checks, and it needs no seed data, which is the point. Also in this pass, from the v1 list: - **Locations can be corrected and removed.** PATCH for the label, tag, building and floor; DELETE refused while anything is placed there, which asset-service answers - and it refuses to answer at all if unreachable, because "couldn't verify" must not read as "nothing is there". - **The rate limiter is no longer silent when it fails open.** A counter and two Prometheus alert rules: one for the store being unreachable, one for sustained refusals. The trade is still the right one; it is just visible. - **People and locations paginate.** Both get /paged endpoints in the shape asset-service already uses, and people-service gets /stats so the console stops fetching everyone to count them - nothing at five people, a whole tenant over the wire at five thousand. The desk map deliberately keeps the unpaged read: it groups by building and floor, and a page boundary through the middle of a floor is not a map. Verified: 11/11 prod smoke on Postgres, 57/57 API matrix, 38/38 browser, 109 web unit, all modules green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Opening this as a pull request rather than pushing to main turned out to weaken the gate, not strengthen it. `images` - and `e2e`, which needs it - only ran on a push to main or develop, so a pull request was checked by build, web and secret-scan while a direct push additionally stood the whole stack up and drove it through a browser. That is exactly backwards, and this session proves it: the browser suite is what caught the seeder losing its identity when services began validating tokens, and the employee page disagreeing with its own subtitle. Merging on everything except that suite would have let both through. Images from a pull request are tagged by commit SHA like any other, plus a pr-N tag instead of a branch name, so they are identifiable and disposable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Everything so far had been proved against the demo stack: H2, seeders, one container each. The configuration a real deployment uses — the
prodprofile on Postgres, Flyway,ddl-auto=validate, no seed data — had only ever been tested per service by Testcontainers.Running the whole stack on it for the first time found that nobody could sign in at all: every seeder is
@Profile("!prod"), so the user table was empty and there was no way to create an account. The stack came up healthy and completely unusable.What changed
BootstrapAdmin— creates one ADMIN when the user table is empty and credentials are configured. Configured but users present does nothing, so a restart cannot resurrect a deleted account or reset a changed password; empty but unconfigured says how to fix it in the log rather than leaving a bare 401. No default password ships.infra/qa/prod-smoke.cjs— that run, kept. 11 checks against the prod profile, needing no seed data, which is the point.PATCHfor label/tag/building/floor;DELETErefused while anything is placed there. asset-service answers that, and refuses to answer at all if unreachable, because "couldn't verify" must not read as "nothing is there"./pagedin the shape asset-service already uses, and/statsso the console stops fetching everyone to count them. The desk map keeps the unpaged read on purpose: it groups by building and floor, and a page boundary through the middle of a floor is not a map.Verification
11/11 prod smoke on Postgres · 57/57 API matrix · 38/38 browser · 109 web unit · all Gradle modules green.
Why this is a PR
Every commit in this session went straight to
mainwith required checks bypassed — 27 of them. CI caught two real regressions along the way, both after the push. This one waits for the checks instead.🤖 Generated with Claude Code