v1.8.1: shadow:check names the database it audited - #8
Merged
Conversation
The gate's own guidance says a NOT RUN result is usually the wrong database - but the report never said which one it read, so a PASS could not be checked against the box you meant to audit. Printed twice on purpose: once before the run, so a run that dies partway (missing identities table, unreadable media) has still said what it was pointed at, and once inside the report block, which is the part that gets teed to a file and pasted into tickets. The Postgres password is stripped. That output is screenshotted and shared, and a connection string carrying rackstack_user:hunter2 would leak the database password into every copy. Redaction goes through the URL parser rather than a regex, so a password containing an @ cannot survive half-masked - asserted by test. Also brings the docs into line with reality now that the gate has been run against production (2026-08-08, Unraid, 6/6, GATE: PASS): - The runbook's "what has NOT been verified" list had shadow mode as never run. It is now struck through and records the result. Cutover to dual is cleared. - authentication-methods.md Phase 0 dropped the "supply a production export" prerequisite - running the gate on the container audits the live database and is strictly better than auditing a copy. - Phase 0's v1.7-on-Postgres item is now honest that the status is unconfirmed, and notes the SuperTokens core needs its own Postgres database in Phase 2 whatever RackStack itself runs on. - The v1.8.0 changelog entry still says shadow mode had not been run, which was true at that release; the v1.8.1 entry records that it has. 634 tests green on SQLite, 660 on Postgres, 39 smoke assertions. 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.
Closes the gap noticed right after the production gate run: the report proved
100% but never said which database produced that number.
What changed
npm run shadow:checknow names the database, twice:Once before the run, so a run that dies partway — missing
identitiestable, unreadable media — has still said what it was pointed at. That is
exactly the run where an operator most needs to know. And once inside the
report block, because that is the part people
teeto a file and paste intotickets, and a
PASSis only meaningful next to the database that produced it.The gate's own
NOT RUNguidance says the usual cause is the wrong database,so not naming it was a real omission.
The password is stripped
DATABASE_URLcarries the database password, and this output getsscreenshotted and shared. So:
Redaction goes through the URL parser, not a regex, so a password containing an
@cannot survive half-masked — asserted by test. An unparseableDATABASE_URLsays so rather than being echoed back.Docs brought in line with the production run
The gate passed on 2026-08-08 (Unraid, 6 identities, 6 matched, 0 mismatched,
0 orphaned,
GATE: PASS), so several docs were stale:Now struck through with the result — cutover to
dualis cleared.authentication-methods.mdPhase 0 dropped the "supply a production export"prerequisite. Running the gate on the container audits the live database,
which is strictly better than auditing a copy.
— and notes the SuperTokens core needs its own Postgres database in Phase 2
whatever RackStack itself runs on.
accurate at that release; v1.8.1 records that it has.
Verification
npm run test:all), 39 smoke assertionsabsent,
@-containing password not half-masked, unparseable URL handled,DATABASE_URLpreferred overDB_PATHto matchopenReader, the linepresent in the report block and above the
GATE:line, and omitted entirelywhen no source is supplied (the live per-login path has no single database)
Version bumped to 1.8.1;
client/package.jsondeliberately untouched.🤖 Generated with Claude Code