docs(qa): re-anchor three approvals knownGaps on the sys_account.issuer retirement - #19213
Merged
os-try-charles merged 1 commit intoSep 19, 2026
Merged
Conversation
…er retirement Three knownGap texts in the approvals area cited `packages/plugins/plugin-auth/src/backfill-account-issuer.ts, CREDENTIAL_ISSUER`. That module retired with `sys_account.issuer` when better-auth 1.7.3 rolled the issuer-scoped account identity back, so the citation names a file that is not there and a reader cannot tell whether the gap is closed or the citation rotted. There is no successor symbol to re-point at: `CREDENTIAL_ISSUER` survives only as history, in the retirement's migration entry and as a deliberately renamed test constant. So the texts keep the reason they exist to carry -- a password hash alone was not enough, and the failure was a silent lockout whose `User not found` warn pointed at the `sys_user` row rather than at the account -- and record that the trap retired with the column, anchored on `packages/spec/src/migrations/entries/semantic/18.sys-account-issuer-retired.ts`. The same pass withdraws the clauses the retirement falsified: the seed no longer derives the issuer from the dev admin's own row (nothing to derive), and the dogfood test no longer pins an issuer -- it pins the account under `(provider_id, account_id)` and asserts nothing still writes the retired field. One runner step in the same item told a runner to check `issuer=local:credential` when provisioning delegate B; it is withdrawn with them. Each item bumps `revision` and appends a `history` entry, per the checklist's change lifecycle. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
os-try-charles
marked this pull request as ready for review
September 19, 2026 23:44
os-try-charles
deleted the
claude/issue-17453-approvals-knowngap-citations
branch
September 19, 2026 23:56
This was referenced Sep 20, 2026
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.
Fixes #17453
What this changes
Three
knownGaptexts indocs/qa/platform-checklist/areas/approvals.jsoncitedpackages/plugins/plugin-auth/src/backfill-account-issuer.ts, CREDENTIAL_ISSUER. That moduleretired with
sys_account.issuerwhen better-auth 1.7.3 rolled the issuer-scoped account identityback (#17440, closed 2026-09-12), so the citation names a file that is not on the tree and a reader
who follows it cannot tell whether the gap is closed or the citation merely rotted.
The file's convention is explicit — the gap text stays because it carries the reason — so this is
not a path substitution, and there is nothing to substitute anyway:
backfill-account-issuer.tsis gone. Positive control:ls packages/plugins/plugin-auth/src/lists 176 files, so the empty
grep backfillis a reading, not a broken instrument.CREDENTIAL_ISSUERsurvives only as history — as a retired symbol named inpackages/spec/src/migrations/entries/semantic/18.sys-account-issuer-retired.ts(and its copy inthe generated
packages/spec/src/migrations/registry.ts), and as the deliberately renamed testconstant
LEGACY_CREDENTIAL_ISSUERinpackages/plugins/plugin-auth/src/account-issuer-upgrade-path.test.ts.There is no live symbol to re-point the three citations at.
So each text keeps the reason it exists to carry — a password hash alone was not enough; the failure
was a silent lockout whose
User not foundwarn pointed at thesys_userrow rather than at theaccount — and now records that the trap retired with the column, anchored on the retirement's
own migration entry, which is a durable record rather than a module that can be deleted.
The clauses the retirement also falsified
The card's second claim measured true, and this pass fixes it in the same edit. The governing text
is the repo's own, in
examples/app-showcase/src/security/seed-approval-demo.ts:Withdrawn accordingly:
approvals.per-group-signoff$context; there is no issuer to readapprovals.viewer-gating-submitter-sideapprovals.ooo-delegation-rerouteEach of the three items bumps
revisionand appends ahistoryentry, per the checklist'schange lifecycle (
docs/qa/platform-checklist/README.md).One bounded in-place fix, declared
approvals.ooo-delegation-reroute's steps carried the same dead requirement one field below thegap text it points at: "provision B as a real login (see knownGaps: the credential account's issuer
must be local:credential)". Left alone it would have contradicted the rewritten
knownGapthreelines above it and still sent a runner looking for a column that no longer exists — a replayed
instruction, not prose. It is corrected to "a stock boot already does it, see knownGaps".
It is declared here because it sits outside the three texts the dispatch named, and it is inside
every other boundary: same file (the declared file surface), same defect class, mechanical, no new
verification surface, and no other claim holds this file.
Measurements
Base
origin/main@24d622b94; gates re-run on the final commit.The three citations were at
:23,:259,:662— no drift from the card.node scripts/pm/dispatch-gates.mjs --commandsprescribes 12 commands for this surface. All 12 aregreen (
EXIT=0), includingpnpm check:platform-checklist. Two needed prerequisites first(
pnpm installin the fresh worktree;turbo run build --filter=@objectstack/formula --filter=@objectstack/lintforcheck:doc-formula-expressions) — their firstexit 3wasPREREQUISITE NOT MET, not a finding.The zero-headroom surface did not move. Census line before and after the edit are identical:
That is the expected reading rather than luck: the three citations were bare paths, not
path#symbolanchors, so they were never in the anchor population the floors count — and the newanchor is written bare and without a line number, which also keeps the
file:linelimb at 0.No floor and no baseline JSON was touched.
Acceptance notes
docs/qa/platform-checklist/areas/approvals.jsonhistory entries at revisions 4 and 5 of the threeitems still narrate the issuer trap in the past tense ("issuer derived from the dev admin's own
row"). They are left alone on purpose:
historyis the append-only record of what the item saidwhen a run was pinned against it, and rewriting it would destroy the thing that makes old run
records interpretable.
scripts/check-platform-checklist.mjscarries abad-citationledger row for this file(
seed-approval-demo.ts#AUDITOR_DEMO_USER,shape: import-only). It is a different citation fromthe three changed here and is untouched; noted, not filed.
Generated by Claude Code