fix(qa-checklist): re-point thirteen identity-auth bad-citation anchors and drain their residual rows - #19196
Merged
Conversation
…rs and drain their residual rows The second slice of the SHARED_RESOLVER_RESIDUAL drain: areas/identity-auth.json, 13 rows, 13 anchor occurrences — the largest single-file block of the bad-citation rows the first slice left behind. All 13 are genuinely wrong citations, re-pointed. None is an accept-set case; that file's 2 accept-set rows are deliberately left standing and are a different card's. SHARED_RESOLVER_RESIDUAL 46 rows -> 33 and SHARED_RESOLVER_RESIDUAL_CEILING 46 -> 33 in the same edit. The header's shape and verdict tallies are re-counted with the rows. No file floor moved and no anchor was dropped: the per-file census is identical, 17/17. 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 10:58
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.
Part of #18104
Clause-②: no
The slice
The second slice of the
SHARED_RESOLVER_RESIDUALdrain:areas/identity-auth.json— 13 rows, 13 anchor occurrences. It is the largest single-file block of the 38bad-citationrows the first slice (#19181, landed at82b322585) left behind, and it is one file, so every judgement in it is made against one item ledger.areas/identity-auth.jsonalso carries 2accept-setrows —packages/spec/src/kernel/public-auth-features.ts#sys_userand#sys_invitation, both thedotted-string-headshape. They are #18101's, not this card's, and they stay exactly where they are. Reaching them means wideningscripts/symbol-anchors.mjs, which is the red line #18104 / #18101 / #18107 share by name. After this slice the ledger carries 33 rows —bad-citation25 +accept-set8 — andareas/identity-auth.jsonaccounts for 2 of them.Per row: which kind it was (acceptance item 2)
All 13 are genuinely wrong citations, re-pointed. None is an
accept-setcase, so none belongs to #18101. Each old symbol was put toscripts/symbol-anchors.mjs#symbolSegmentResolutiondirectly and returnsnull; each new one returnsdeclaration.areas/access-security.json#access#itemsseed-approval-demo.ts#PHONE_DEMO_USERdemo-personas.ts#PHONE_DEMO_USER(the path moved, the symbol did not)sys-member.object.ts#BUILTIN_MEMBERSHIP_ROLE_OPTIONS@objectstack/spec/identity#SysMembersys-oauth-application.object.ts#OAuthlabel/descriptionstrings#SysOauthApplicationauth-route-ledger.ts#bootstrapStatus#AUTH_ROUTE_LEDGERauth-route-ledger.ts#linkSocial#AUTH_ROUTE_LEDGERauth-route-ledger.ts#revokeOthers#AUTH_ROUTE_LEDGERauth-route-ledger.ts#sendVerificationEmail#AUTH_ROUTE_LEDGERauth-route-ledger.ts#setActive#AUTH_ROUTE_LEDGERauth-route-ledger.ts#updateUser#AUTH_ROUTE_LEDGERsecurity-plugin.ts#__referentialFieldClearopCtx.context#SecurityPluginmembership-role-vocabulary.dogfood.test.ts#PermissionSetit(...)title#CLOSED_VOCABULARYrest-route-ledger.ts#describeDelegableScopeclient:string value#REST_ROUTE_LEDGERSix of them (5–10) are the first slice's reading applied again: a route ledger's
clientfield is DATA the table carries, and the declaration the item means is the exported table. That spelling is already this corpus's own —areas/api-backend.jsonhas readauth-route-ledger.ts#AUTH_ROUTE_LEDGERsince before this card.Three needed a reading of their own:
detector-artifactrow, and it was repaired citation-side, per the PM's ruling in comment5740561848. The ledger's own fields say why:detector-artifactis theshape(why the withdrawn permissive rule used to resolve it), while theverdicthas always readbad-citation. Reading the shape as the disposition sends the next author at the detector, which since platform-checklist reuses the shared resolver's RULE but is still not a registered corpus — the anchor grammar stays forked, and the two copies have already drifted (23 extensions vs 8) #18107 ISscripts/symbol-anchors.mjs— the file this card forbids by name. And the truncation is not happening on today's bytes anyway: the citation's fragment is followed by a SPACE, so the symbol was simply what the author wrote. What they meant is the item id in the parenthetical, which the checklist JSON carries as a VALUE, never a key — so the citation now names theitemsblock and the item id stays in the prose beside it. The ledger header records this so the next reader is not sent the same way.seed-approval-demo.tssays so in its own header: the demo identities "now live indemo-personas.ts, because the SEED needs them too". The file only imports the persona and provisions it; the constant,phone_numberincluded, is declared next door. The path is what was stale, so the path is what moved. This is the one change that adds a cited source (309 → 310).packages/spec/src/identity/membership-role.ts#BUILTIN_MEMBERSHIP_ROLEStwo rows above, so re-pointing this one at the spec too would have been a duplicate. This citation is about the object's role select, and whatsys-member.object.tsdeclares is the object.No
#symbolwas dropped, and no floor moved (acceptance item 3)areas/identity-auth.json's census is 83 against a floor of 82 — one of headroom — so this was measured, not assumed. The per-file census is identical before and after, 17/17 files:That is the mechanism, not luck: the floor population is
resolved + residual, so a repair moves an occurrence from one side to the other and leaves the per-file count where it was. The bare gate says it in its own words —17 file floors held.scripts/checklist-symbol-anchor-baseline.jsonis untouched.Rows left by repair, and the ceiling came down with them (acceptance items 1 and 4)
SHARED_RESOLVER_RESIDUAL46 rows → 33;SHARED_RESOLVER_RESIDUAL_CEILING46 → 33, in the same edit. The header's tallies are re-counted off the surviving rows rather than adjusted by hand:string-substring21 → 12,import-only8 → 6,member-access3 → 2,detector-artifact1 → 0,bad-citation38 → 25;accept-setstays 8 and is untouched.The
detector-artifactblock is kept at zero rows on purpose, carrying the ruling above — the shape reading is what a future author needs, and deleting it would delete the reason this row is not a detector bug.Positive control (acceptance item 3) — two legs, opposite directions
Both legs mutate the committed tree, prove the mutation landed on disk before any verdict is read, restore with
git checkout HEAD -- PATHunder anEXIT INT TERMtrap on an absolute path, and prove the restore by blob hash against HEAD plus an emptygit diff HEAD— never by an exit code. Control run first: bare gate exit 0, zeroABSENT SYMBOLlines.Leg A — a repaired anchor is still being judged, and it resolves through the shared resolver. Row 1's repaired citation was re-pointed to a symbol
areas/access-security.jsondoes not declare (on-disk proof: target text before=1 after=0, injected marker before=0 after=1). Gate exit 1:Restored (blob
f6baec3c...== HEAD,git diff HEADempty), gate back to exit 0. So the green on these citations is the shared resolver answeringdeclaration, not the gate having gone quiet on them.Leg B — an unrelated row on THIS SAME FILE still reds. One of the two
accept-setrows this slice deliberately leaves behind (public-auth-features.ts#sys_user) was deleted from the ledger without repairing its citation (on-disk proof: row before=1, after=0). Gate exit 1 withABSENT SYMBOLnaming that anchor; restored (blob4ae200e4...== HEAD,git diff HEADempty), back to exit 0. Soareas/identity-auth.jsonis still swept and its residual rows still fire — the 13 left this ledger by repair, not because the document went dark.Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackre-derived against the real changed set (2 committed paths,+42/-33) yields 31 families — the same count as the first slice, on a different path set.scripts/check-platform-checklist.mjsis itself a gate, so both halves were run separately, not only the aggregate:OK — 15 areas, 264 items … symbol anchors: 600/633 resolved … 33 on the named residual, 17 file floors held--self-testexit 0 — 221 assertionspnpm check:platform-checklist(which chainschecklist-select --self-testin front of both) exit 0One family reported exit 3 — PREREQUISITE NOT MET, which is not a finding:
@objectstack/lint run check:doc-formula-expressionswants@objectstack/formulaand@objectstack/lintbuilt.No import relationship changed and no TypeScript program's view moved — the diff is one ESM gate script's data and comments plus one JSON document, neither of which any
tsconfigincludes — so no per-packagetypecheckis owed beyond what the derivation already places."All 31 derived families green" is not "CI green". The derivation names what sits outside those 31: 53 artifact-roster families, 11 declared-wide-population families, 14 families that apply once a changeset exists, 2 families taking a value from the workflow, and 1 path-scheduled CI job. CI is the authority on those.
Changeset
No changeset: nothing published moves. Measured rather than assumed — the diff touches only repo-root
scripts/anddocs/qa/, neither of which is inside any package directory, so no package manifest'sfiles[]can ship either path.skip-changesetapplies.Acceptance notes
$commentis still inaccurate, and this PR deliberately does not fix it. It reads "Each entry is the count of anchors that RESOLVED in that family file"; since [finding] the platform-checklist corpus resolves symbol anchors with its OWN rule, not the shared resolver — a permissive token match where the ruling says there is to be exactly one implementation #16898 an entry is resolved + residual, which this gate's own--anchor-censusfooter states outright.scripts/checklist-symbol-anchor-baseline.jsonline 3 declares itself⛔ MAINTAINER-ONLY. Reported, not touched — a one-sentence maintainer edit, already recorded on the card.detector-artifactrow is left standing as history, with the PM's correction under it. This PR follows the correction.Generated by Claude Code