Uh oh!
There was an error while loading. Please reload this page.
docs(qa): land the #9296 wave's 32 checklist item corrections and the console-session-auth environment fact - #9475
Merged
Conversation
…ion-auth environment fact Closes out the second half of the QA wave #9296 ledger debt. Part 1 (five of the six environment facts plus the absence-inference trap row) landed in PR #9427; this carries the sixth fact and every areas/*.json item correction. RUNNER.md — the one environment fact still missing: console session auth is a bearer token in localStorage (auth-session-token), so a clearCookies() gesture expires nothing and leaves a fully authed shell rendering; true expiry is POST /api/v1/auth/sign-out. The cookie half matters too — the storage family resolves its caller through better-auth's own getSession, so a bearer-only session 401s on /storage/upload/presigned. areas/*.json — 32 items corrected across 12 area files, each with its own revision bump and history entry naming what changed and why. Sources: the five run records #9334, #9401, #9417, #9453 and #9467. Every correction was re-grounded against origin/main before being written; four reported corrections were rejected as already-true or contradicted by the tree, and four items carrying the same defect class were found by that grounding rather than from any report. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ai9gUdihXjg7FumzsBNSSs
This was referenced Aug 18, 2026
os-zhuang
marked this pull request as ready for review
August 18, 2026 04:37
os-zhuang
enabled auto-merge
August 18, 2026 04:38
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 freeto 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#9386
Completes the second half of the QA wave #9296 ledger debt. Docs-only,
docs/qa/platform-checklist/**and nothing else.absence-inferencetrap row. The card's Part 2 (theareas/*.jsonitem corrections) had never been done, and the card's fact 5 was never landed. Both are in this PR. The card being closed is a state I did not create and did not change; flagging it because the closing PR covered roughly a third of the card.Validator
Run at the final commit
39bc17f53, clean tree:Also green at the same commit:
check:nul-bytes(OK, scanned 6130 text files, no raw ASCII control bytes),check:doc-anchors(246 internal fragment links across 397 files all resolve),check:doc-authoring(377 files clean).node scripts/pm/dispatch-gates.mjson the actual changed paths reports "No check family names the given paths" — asilentverdict, treated as not-a-clearance, so the four above were run anyway.Part 1 remainder —
RUNNER.md, the sixth environment factPR #9427 landed facts 1, 2, 3, 4 and 6. Fact 5 — console session auth — was never landed, and it is the one behind this wave's near-miss false P0. Added with both halves, because each on its own has already misled a round:
localStorageunderauth-session-token(objectuipackages/auth/src/createAuthClient.ts), so aclearCookies()gesture expires nothing and the shell keeps rendering fully authed — exactly the "dead shell serving stale data" shape. True expiry isPOST /api/v1/auth/sign-out.getSession(resolveSessionData,packages/runtime/src/security/resolve-session-principal.ts), not the REST bearer seam, so a bearer-only session gets 401AUTH_REQUIREDfrom/storage/upload/presignedwhile/auth/get-sessionanswers 200.Part 2 — 32 item corrections across 12 area files
Every touched item carries its own
revisionbump and ahistoryentry saying what changed and why — verified mechanically againstHEAD: 32 items changed, 32 with exactly +1 revision and +1 history entry, allref: #9386, zero exceptions.Sources: run records #9334, #9401, #9417, #9453, #9467.
The counts the PM asked for
The dispatch said "34 corrections, that count is my arithmetic — let the real total be whatever it is". The real shape:
The 4 rejected corrections
owd-save-gate's knownGap mispredicts which layer answers, claiming R1owd_widening_forbiddenanswered directly on a stock deploy.packages/plugins/plugin-security/src/object-posture-gate.tssays the opposite verbatim — R1 "applies only to overlay writes over an artifact-backed object (theOS_METADATA_WRITABLEescape-hatch path — the default deploy already 403s these before this gate runs)", enforced byif (!ctx.isArtifactBacked) return;. The item's knownGap and clause 4 already record whichever layer answers. Not applied; worth a re-measure naming the exact fixture, since the runner did observe something.studio-authoring.first-run-loopmust lose any inherited 'Studio is not installed' assumption." The item never carried one: noblockedmarker, no such knownGap, and its steps drive the App Builder directly. That assumption lived in the tracking: full platform-checklist regression against main @ e4e5c6e3 — five-round orchestration #9296 briefing and the run records, not in the ledger. (The item was still edited, for an unrelated?id=defect — see below.)showcase_contact=33baseline, already counted as QA run · priority:P0 · e4e5c6e3 · 2026-08-17 · 7 PASS / 7 PARTIAL / 2 FAIL / 2 BLOCKED #9334 no. 1.?id=spelling, already counted as QA run · priority:P0 · e4e5c6e3 · 2026-08-17 · 7 PASS / 7 PARTIAL / 2 FAIL / 2 BLOCKED #9334 no. 2.The 4 corrections found by grounding rather than by report
#9334 named two items carrying the wrong
?id=spelling. Grounding the mechanism (rest-server.tsmatchesa.name === appIdFilter;Appdeclares noid) against the whole ledger found four more:platform-core.nav-surfaces-render— load-bearing: the step extracts every nav destination from a response the package-id spelling leaves empty.platform-core.console-login— the clause-2 network-trace example.studio-authoring.first-run-loop— step 8 / clause 4 say?id=followed by a placeholder reading "new app id" in an item whose step 2 creates the packagecom.example.repairs.platform-core.builtin-apps-nav-renderandplatform-core.boot-healthwere the two QA run · priority:P0 · e4e5c6e3 · 2026-08-17 · 7 PASS / 7 PARTIAL / 2 FAIL / 2 BLOCKED #9334 named.)Corrections where grounding produced a sharper answer than the report
api-backend.error-envelope-ledger— the report said the union "should name all three exports". The tree already has one canonical export that is the union:ErrorCode(error-code-ledger.zod.ts, ADR-0112 D4).ERROR_CODE_LEDGERis a package-name to code-array map, not a flat code list — which is the real reason a literal membership check fails. The clause now names one export instead of prescribing a union the runner rebuilds by hand.api-backend.batch-transactional-discovery— the report saidcapabilities.transactionalBatch"is an object". It is, on the wire — but the@objectstack/clientgetter flattens eachCapabilityDescriptorto a real boolean, so the two reads are legitimately spelled differently and the item now says so instead of picking one.access-security.permission-matrix-edit-loop— the report said thepublishsub-route "404s forpermission". The route is mounted type-generically; it answers 404[no_draft]because the console's plain PUT landsstate:'active', leaving nothing to promote. The clause now keys on the published set carrying the verb and records which save path was taken.access-security.capability-declaration-lifecycle—zoowas never an object name; it is the local TS const inpredicate-matrix.action.ts(const zoo = 'showcase_field_zoo').cli.migrate-meta-codemod— the fixture warning claimed the command "REWRITES files in place".commands/migrate/meta.tsstates the opposite: the authored-source chain "writes nothing but--out", and--applyis documented as "--stored: rewrite the rows (default is a read-only preview)". The warning both misdescribed the safe default and hid where the real write lands (thesys_metadatarows).platform-core.settings-hub-roundtrip— 11 namespaces confirmed, and the reason the count drifts is now recorded:builtinSettingsManifestsholds 10, whilelifecycle(5 specifiers) is registered separately byObjectQLPluginatkernel:ready, so enumerating the manifests directory undercounts by exactly one.The two markers the card called out
access-security.no-active-org-session-semantics— addedblocked: { by: "fixture", ref: "#9334" }, plus theautomated.refit was also missing (no-active-organization-write-refusal.test.ts, which pins every clause at unit level and was already green — RUNNER rule 6's converse).studio-authoring.first-run-loop— see rejected no. 2; the assumption was not in the item.Scope
docs/qa/platform-checklist/**only — 13 files. ⛔ No.claude/skills/**(that is #9387). ⛔ No CI/workflow changes. ⛔ No product code. Nothing undercontent/docs/releases/.Changeset
None — docs-only, publishes nothing. Expecting
Check Changesetto skip by path filter as it did on the wave's previous docs-only PR (#9309); if it demands one, the repo's realskip-changesetlabel is the mechanism.Generated by Claude Code
Generated by Claude Code