Repository navigation
Description
Found while implementing #15362 (docs: the 409 unique-constraint refusal is UNIQUE_VIOLATION on the wire). It blocks that card.
Repro
On a branch whose only change is renaming #### DUPLICATE_RECORD to #### UNIQUE_VIOLATION (keeping **HTTP Status:** 409) in content/docs/protocol/kernel/error-handling.mdx:
pnpm check:error-status-conformance # exit 1
scope: 52 code(s) reconciled = 50 StandardErrorCode member(s) + 2 ledger code(s) a doc page
publishes a status for (INVALID_REQUEST, UNIQUE_VIOLATION)
unpinned: 33 documented code(s) with no derivable producer (baselined: 32).
UNIQUE_VIOLATION: documented with an HTTP status, but no producer declares one - nothing
pins the doc's claim on either side, so it can drift with no test to update.
The gate's own --self-test passes (40 cases), so this is a derivation gap, not a broken gate.
Why the deriver misses it — two independent blind spots
R5b (scripts/check-error-status-conformance.mjs, the { status, body } mapper terminal) matches with a body group that forbids nested braces — the pattern is status, colon, three digits, comma, body, colon, then a brace group whose contents are spelled as a negated character class excluding both brace characters.
The real terminal — packages/rest/src/error-response.ts:992, structuredCodeAnswer's DuplicateRecordError arm — builds its body with conditional spreads, so nested braces sit between status: 409 and code: 'UNIQUE_VIOLATION':
return {
status: 409,
body: {
error: field
? `A record with this ${field} already exists`
: 'A record with this value already exists',
code: 'UNIQUE_VIOLATION',
...(typeof error?.message === 'string' && error.message.length > 0
? { developerMessage: error.message }
: {}),
...(field ? { field } : {}),
...(refused ? { object: refused } : {}),
},
};R5b skips it. The second real producer is missed for a different reason — driver-memory declares the pair by ASSIGNMENT, which no rule matches:
// packages/drivers/driver-memory/src/memory-unique-constraint.ts:504-505
err.code = UNIQUE_VIOLATION_CODE; // = 'UNIQUE_VIOLATION'
err.status = UNIQUE_VIOLATION_STATUS; // = 409The 409 UNIQUE_VIOLATION answer itself is pinned by tests — packages/rest/src/rest-duplicate-record-arm.test.ts section 1 asserts status 409 and body.code UNIQUE_VIOLATION, and packages/rest/src/rest-5xx-status-passthrough.test.ts:379 asserts the same through another door. So the code IS emitted; only the deriver is blind.
Why neither remedy the gate offers is right as it stands
Its failure text names two: wire a producer that declares status/statusCode, or admit the code to scripts/error-status-unpinned-baseline.json. The first describes a producer that already exists. The second is maintainer-only by the script's own header AND would record the opposite of the truth — the baseline means "genuinely unemitted today", and UNIQUE_VIOLATION is emitted on every route.
The gate's header states the invariant this violates: "The runtime side is DERIVED, never listed ... Where an identifier cannot be resolved the declaration is REPORTED as unresolved, never silently dropped — a deriver that goes quietly blind is the same failure one layer down." A terminal skipped by the regex is neither derived nor reported: it drops out silently, which is the shape that header rules out.
Suggested disposition
Extend the deriver so both shapes are seen, with a --self-test case per shape (the script's header requires the self-test case in the same edit):
- R5b: allow one level of nesting inside the
bodygroup, or locatecodewithin a brace-balanced span rather than a brace-free one. - A new rule for the assignment form (
err.code = X;followed byerr.status = Y;) where both resolve to literals through the existingresolveString/resolveStatusindex.
Consider also whether a terminal carrying a status whose code cannot be located should land in the unresolved report rather than being skipped — that is what would have surfaced this without a docs change to trip it.
Until this lands, the #15362 docs fix cannot go green.
Activity
claude commentedon Sep 5, 2026
Graded — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.Bug·domain:devx·priority:p2(it blocks #15362, a p2, and the class is a deriver going quietly blind — the failure the gate's own header forbids):check:error-status-conformance's R5b body group forbids nested braces, so the realUNIQUE_VIOLATIONterminal aterror-response.ts:992(conditional spreads) is skipped, and theerr.code = …; err.status = …assignment form (driver-memory/src/memory-unique-constraint.ts:504–505) has no rule. Ruling for the dispatch (option A of #15362's report): brace-balanced body span for R5b + an assignment-form rule, one self-test case per shape both directions, live verdict movesunpinned 33 (baselined 32)→32withUNIQUE_VIOLATIONderived; ⛔ never the baseline (maintainer-only, and it would record the opposite of the truth).Generated by Claude Code
claude commentedon Sep 5, 2026
Claim: PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, 2026-09-05T00:59Z — dispatching to anos-devsubagent on branchclaude/issue-15633-error-status-deriver(graded by this seat above, as the blocker of its own dispatched #15362). Assignee = the shared account (identity is this session ID). Hot-file check:scripts/check-error-status-conformance.mjsis in no open PR. Live devs after this claim: 5/5.Generated by Claude Code
fix(devx): check-error-status-conformance derives a { status, body } …
claude commentedon Sep 5, 2026
os-dev-report
{ "issue": 15633, "status": "needs_decision", "branch": "claude/issue-15633-error-status-deriver", "pr": null, "premise_still_valid": true, "summary": "Both deriver shapes are implemented, committed and pushed on claude/issue-15633-error-status-deriver @ cd26dd16b (one file, scripts/check-error-status-conformance.mjs). R5b's body group is now a brace-BALANCED span walked on a projection with comments AND string/template/regex content blanked (js-comment-mask scanSource + blank), and a new R6 reads the assignment form err.code = X; err.status = Y bounded to one identifier inside one block plus a 20-line window, reporting a pair it cannot resolve instead of dropping it. Both UNIQUE_VIOLATION producers now derive: packages/rest/src/error-response.ts:996 as '{ status, body }' and packages/drivers/driver-memory/src/memory-unique-constraint.ts:504 as 'assignment' (plus a third at error-response.ts:1539). NO PR: I hit the dispatch's own stop condition -- 'the fix needs any other file'. The widened deriver reads 135 further TRUE producer sites tree-wide (144 → 279 sites), and six of them pin codes currently listed in scripts/error-status-unpinned-baseline.json, so the gate reds with six nowPinned findings until those six rows are removed -- and the dispatch says NEVER touch that file. Direction A is clean: zero emittedNotDocumented findings, so every newly derived status is already documented. Measured in a throwaway worktree: with those six rows removed the gate is GREEN, and GREEN again with #15634's docs diff applied on top, reconciling UNIQUE_VIOLATION at 409. Neither of the other two stop conditions fired -- no EXISTING derived site's status changed, and I found no false pairing from the assignment form on this tree (every R6 site I spot-checked is a real producer, in both statement orders).", "tests": "SELF-TEST: `node scripts/check-error-status-conformance.mjs --self-test` EXIT=0 -- 'check-error-status-conformance --self-test: 47 cases pass' (was 40). Two new batteries, floor 23 → 25: '23 - R5b: the body span is brace-BALANCED, and the braces it counts are' (3 cases: conditional-spread body derives / a body with no code fabricates nothing / a brace inside a string does not close the span early) and '24 - R6, the ASSIGNMENT form, and the two bounds that keep it honest.' (4 cases: constants resolve / an unresolvable status is REPORTED not dropped / a different identifier never pairs / a different block never pairs). No existing case weakened.\n\nLIVE VERDICT, main vs branch (`node scripts/check-error-status-conformance.mjs`, exit captured before any pipe):\n main d30ccb9bd EXIT=0 -- scope: 51 code(s) ... 2243 source files scanned; 144 producer site(s) derived; 56 further ledger code(s) derived but NOT reconciled | reconciled: 19 code(s), 20 pair(s) | unpinned: 32 documented code(s) with no derivable producer (baselined: 32).\n branch cd26dd16b EXIT=1 -- scope: 51 code(s) ... 2243 source files scanned; 279 producer site(s) derived; 84 further ledger code(s) ... | reconciled: 25 code(s), 26 pair(s) | unpinned: 26 documented code(s) with no derivable producer (baselined: 32) | unresolved: 50 declaration(s) the deriver could not read | six findings, all one shape: 'INVALID_FIELD / INVALID_FILTER / INVALID_QUERY / INVALID_SORT / OBJECT_NOT_FOUND / RECORD_NOT_ACCESSIBLE: baselined as unpinned, but a producer now declares its status -- ratchet the baseline down with --update.' ZERO emittedNotDocumented and ZERO documentedNotReachable findings.\n\nSITE LISTS. R5b before (the only two it could read): error-response.ts:126 DATABASE_ERROR@500, error-response.ts:179 INTERNAL_ERROR@500. R5b after: those two byte-identical, plus 46 more, incl. error-response.ts:996 UNIQUE_VIOLATION@409, :1539 UNIQUE_VIOLATION@409, :893 DELETE_RESTRICTED@409, :922 CONCURRENT_UPDATE@409, :1020 ERR_DATASOURCE_UNAVAILABLE@503, :1086 RECORD_NOT_ACCESSIBLE@403, :1123/:1772 OBJECT_NOT_FOUND@404, :1146/:1652 INVALID_FIELD@400, :1177 PERMISSION_DENIED@403, rest-server.ts:355/:364, trigger-api and plugin-auth terminals. R6 (new): memory-unique-constraint.ts:504 UNIQUE_VIOLATION@409, protocol.ts:894 INVALID_FILTER@400, engine.ts:997 INVALID_SORT@400, comment-access-hooks.ts:186 RECORD_NOT_ACCESSIBLE@403, query-multiplicity.ts:250 INVALID_FILTER@400, filter-comparand-shape.ts:254 INVALID_FILTER@400, and others. Every derived site the old deriver had is still derived at the same status; the diff of the full (code, status, site) dump is additions only.\n\nSCRATCH-WORKTREE PROOF (detached worktree at cd26dd16b, removed afterwards). (a) branch + the six now-pinned rows removed from the baseline: EXIT=0 -- 'unpinned: 26 documented code(s) with no derivable producer (baselined: 26)' / 'OK every derivable runtime status is documented, and every documented status is reachable.' (b) (a) + `git diff origin/main...origin/claude/issue-15362-error-handling-unique-violation | git apply` (1 file, 14 insertions / 14 deletions): EXIT=0 -- 'scope: 52 code(s) reconciled = 50 StandardErrorCode member(s) + 2 ledger code(s) a doc page publishes a status for (INVALID_REQUEST, UNIQUE_VIOLATION); ... 279 producer site(s) derived' / 'reconciled: 26 code(s) with a derived producer, 27 (code, status) pair(s) matched against the docs' / green. That is the proof this card unblocks #15634. (c) control leg -- docs diff WITHOUT the baseline shrink: EXIT=1, same six nowPinned findings and nothing else, so the six-row shrink is the ONLY thing between this branch and a green #15634. The docs change was applied in the throwaway worktree only and is NOT committed here.\n\nABLATIONS (fix committed first; trap 'restore' EXIT INT TERM; absolute paths; restore is `git checkout HEAD -- PATH`; HEAD blob 759d420098b76d4bd9229465ef797e42f4b84476). (1) revert R5b to the brace-free character class: mutation confirmed ON DISK (deleted anchor text 'const close = matchingBrace' count 0, injected marker count 1, blob 4188246bcb10d2884305aa731f5329726259d8a8 != HEAD) → self-test EXIT=1, '2/47 case(s) failed': '23 a conditional-spread body derives across its nested braces' and '23c a brace inside a string does not close the span early'. (2) remove R6 (call site replaced by an empty iterable): mutation confirmed ON DISK (injected marker count 1, the one remaining 'assignmentPairs(src, structural)' line is the function DEFINITION, blob 465cc194884157b1b09fed4418cdd97c52233883 != HEAD) → self-test EXIT=1, '2/47 case(s) failed': '24 the assignment form derives through the constant index' and '24b an assignment pair whose status will not resolve is REPORTED, not dropped'. Both restore legs verified: blob back to 759d4200... and `git diff HEAD --name-only` empty.\n\nDERIVED GATE FAMILY: `node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack` EXIT=0, answer stated as taken from 'objectstack-ai/objectstack at commit cd26dd16b', change set 1 path (three-dot vs merge base d30ccb9bd) → 29 commands. All 29 run, exit codes captured before any pipe. 28 EXIT=0, 1 EXIT=1 (`pnpm check:error-status-conformance`, the six nowPinned findings above). Named verdicts: `pnpm check:pm-dispatch-gates` → 'dispatch-gates self-test: 1445 cases pass.'; `pnpm check:nul-bytes` → 'check-nul-bytes: OK (scanned 7571 text file(s) ... no raw ASCII control bytes)'; `pnpm check:ratchet-remedy-authority` EXIT=0 (the MAINTAINER-ONLY marker in this file is intact and untouched); `pnpm check:entry-guard`, `check:parse-guard`, `check:cross-package-test-inputs`, `check:driver-memory-census`, `node scripts/check-comment-mask-corpus.mjs` (the corpus gate over the very scanner R5b's brace walk now reads) all EXIT=0. NOT MEASURED on the first pass and re-run to a real reading after `pnpm install` (EXIT=0, 11.3s): 7 commands that had exited 3 'PREREQUISITE NOT MET' or ERR_MODULE_NOT_FOUND -- check-reference-carrier-shape (x2), check-ci-filter-parity, check-closing-keyword-parity (x2), check-comment-mask-corpus, pnpm check:driver-memory-census -- all EXIT=0 on the re-run. Still NOT MEASURED, by the tool's own account: the 3 families whose argv carries a CI-only variable (check-cross-package-test-inputs --union-into, check-shard-attestation, check-test-completeness) and the 36 artifact-roster families it scores silent for every card. Whole-repo `pnpm lint` was NOT named by the derivation and was not run.\n\nNARROWING DECLARED: no repo-wide scan was run; the derived family above is the coverage, and CI runs the full farm regardless.", "mcp_calls": "2 -- two `search_issues` calls: one duplicate check for the out-of-scope finding (0 hits) and one control query in the same session that returned #15633, so the null read is a measurement rather than a dead channel. Everything else went through REST.", "open_questions": [ { "question": "The widened deriver pins six codes the ratchet baseline still lists as having no derivable producer -- INVALID_FIELD, INVALID_FILTER, INVALID_QUERY, INVALID_SORT, OBJECT_NOT_FOUND, RECORD_NOT_ACCESSIBLE -- so `check:error-status-conformance` reds with six nowPinned findings until those six rows leave scripts/error-status-unpinned-baseline.json. The dispatch says NEVER touch that file, and 'the fix needs any other file' is one of its stop conditions, so I stopped rather than deciding this myself. May the six rows be removed in this PR?", "options": [ "A -- remove exactly those six rows BY HAND in this PR (not `--update`, which regenerates the whole list and could admit a row nobody read). This is the SHRINK direction: the gate's own failure text says 'ratchet the baseline down with --update', the file's own note says 'a row that becomes pinned must be removed', and the script's self-test battery 11 pins the asymmetry deliberately -- 11b asserts that neither ratchet-DOWN message carries the MAINTAINER-ONLY marker, which only the baseline-EXPANDING remedy does. Each removed row is a row that has become false: all six codes demonstrably have producers on this tree. Measured green (leg (a) above), and green with #15634 (leg (b)).", "B -- the maintainer removes the six rows (or runs --update) in a separate, maintainer-owned commit, and this branch lands after it. Costs a serialisation but leaves every ratchet edit in maintainer hands.", "C -- narrow the deriver so only the UNIQUE_VIOLATION producers are picked up. ⛔ I do not recommend this and did not implement it: it would mean gerrymandering a derivation rule to a predetermined answer, which is the exact failure mode this gate's header exists to prevent, and it contradicts the ruling's 'widen R5b to a brace-balanced body span'." ], "recommendation": "A. The six rows are false statements about the tree, removing them STRENGTHENS the shrink-only ratchet, and the script itself grades this remedy as the author's own rather than maintainer-only (battery 11b). It is a six-line deletion I can push onto the existing branch in one step, after which the branch is green and #15634 goes green unchanged. I stopped only because the dispatch fenced the file explicitly; one word and the PR is up. If A is granted, the PR body should name the six rows and quote the two legs above, so a reviewer can see the shrink is a measurement rather than a convenience." } ], "out_of_scope_findings": [ "filed as #15644: check:error-status-conformance leaves 36 real producers unresolved -- StandardErrorCode.enum.CODE is one mechanical shape lookup() cannot read (it allows at most one dot, and a z.enum declaration is not indexed). Surfaced BY this card's R6, which now reports them instead of dropping them. Unassigned, no label; the issue notes that fixing it also moves the same baseline ratchet." ] }Generated by Claude Code
claude commentedon Sep 5, 2026
Ruling — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, on the dev's open question (needs_decisionreport above): A, granted.The dispatch fenced
scripts/error-status-unpinned-baseline.jsonto keep the EXPANDING direction (--updateadmitting rows nobody read) out of a dev's hands — that direction is MAINTAINER-ONLY by the script's own marker. The SHRINK direction is the opposite case and the script grades it as the author's own remedy (battery 11b: neither ratchet-DOWN message carries the marker). The six rows —INVALID_FIELD,INVALID_FILTER,INVALID_QUERY,INVALID_SORT,OBJECT_NOT_FOUND,RECORD_NOT_ACCESSIBLE— are now false statements about the tree: the widened deriver reads a real producer for each (the gate's own sixnowPinnedfindings say so), and the measured legs show the baseline shrink is the ONLY thing between the branch and green, with #15634's docs diff green on top. ⛔ Not C (narrowing a derivation rule to a predetermined answer is the failure the gate's header forbids). B costs a serialisation for no safety.Instruction to the dev: remove exactly those six rows by hand (never
--update), re-run the gate +check:ratchet-remedy-authority, repeat scratch leg (b) on the final head, open the draft PR naming the six rows. This seat accepts on the three-dot diff. Deriver widening 144 → 279 producer sites with zeroemittedNotDocumentedis itself a reading worth the PR body's first paragraph.Generated by Claude Code
fix(devx): ratchet the unpinned baseline down by the six rows the wid…
claude commentedon Sep 5, 2026
os-dev-report
{ "issue": 15633, "status": "done", "branch": "claude/issue-15633-error-status-deriver", "pr": "https://github.com/objectstack-ai/objectstack/pull/15656", "premise_still_valid": true, "summary": "Draft PR #15656 at head 87ad25178, two commits, two files. cd26dd16b widens the deriver in scripts/check-error-status-conformance.mjs: R5b's body group is now a brace-BALANCED span walked on a structural projection (comments AND string/template/regex content blanked, offsets preserved, from one js-comment-mask scanSource call), and a new R6 reads the assignment form IDENT.code = X paired with the same identifier's IDENT.status, bounded by sameBlock() plus a 20-line window, reporting an unresolvable pair instead of dropping it. Both UNIQUE_VIOLATION producers now derive: packages/rest/src/error-response.ts:996 as '{ status, body }' and packages/drivers/driver-memory/src/memory-unique-constraint.ts:504 as 'assignment' (plus a third at error-response.ts:1539). 87ad25178 ratchets scripts/error-status-unpinned-baseline.json DOWN by exactly six rows -- INVALID_FIELD, INVALID_FILTER, INVALID_QUERY, INVALID_SORT, OBJECT_NOT_FOUND, RECORD_NOT_ACCESSIBLE -- removed BY HAND, six deletions and zero insertions, no --update, no other row touched; authorised by the PM ruling on this card after the measurement was reported. The widened deriver reads 135 further true producer sites (144 → 279), which is why those six rows had become false statements about the tree. Direction A stayed clean the whole way: zero emittedNotDocumented and zero documentedNotReachable findings. Not ready-flipped, no auto-merge, skip-changeset applied and read back. Worktree removed.", "tests": "All exit codes captured BEFORE any pipe; every verdict quoted is the gate's own printed line. The union below was re-run on the FINAL head `git rev-parse --short HEAD` = 87ad25178, after the baseline commit.\n\nGATE, final head: `pnpm check:error-status-conformance` EXIT=0 --\n 'OK check-error-status-conformance --self-test: 47 cases pass' (was 40)\n 'scope: 51 code(s) reconciled = 50 StandardErrorCode member(s) + 1 ledger code(s) a doc page publishes a status for (INVALID_REQUEST); 2243 source files scanned; 279 producer site(s) derived; 84 further ledger code(s) derived but NOT reconciled'\n 'reconciled: 25 code(s) with a derived producer, 26 (code, status) pair(s) matched against the docs.'\n 'unpinned: 26 documented code(s) with no derivable producer (baselined: 26).'\n 'OK every derivable runtime status is documented, and every documented status is reachable.'\n main d30ccb9bd for comparison: 144 producer site(s) derived | reconciled 19 codes / 20 pairs | 'unpinned: 32 documented code(s) with no derivable producer (baselined: 32).'\n\nRATCHET AUTHORITY: `pnpm check:ratchet-remedy-authority` EXIT=0 -- 'OK check-ratchet-remedy-authority: 205 scripts swept (scripts/*.{mjs,mts} + scripts/pm/*.{mjs,mts}); 14 mark the expanding remedy MAINTAINER-ONLY, 6 turn it down outright, 185 hand out no ratchet-expanding remedy.' The MAINTAINER-ONLY marker in this file is intact and untouched.\nNUL BYTES: `pnpm check:nul-bytes` EXIT=0 -- 'check-nul-bytes: OK (scanned 7571 text file(s) -- 7571 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).'\n\nDERIVED FAMILY, re-derived on the final head: `node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack` EXIT=0, answer stated as taken from 'objectstack-ai/objectstack at commit 87ad25178', change set 2 paths (three-dot vs merge base d30ccb9bd): scripts/check-error-status-conformance.mjs and scripts/error-status-unpinned-baseline.json. The emitted command list is BYTE-IDENTICAL to the one derived at cd26dd16b (diff empty), 29 commands. ALL 29 RE-RUN ON 87ad25178: 29 EXIT=0, zero non-zero. Named verdicts: `pnpm check:pm-dispatch-gates` 'OK dispatch-gates self-test: 1445 cases pass.'; `node scripts/check-comment-mask-corpus.mjs` EXIT=0 (the corpus gate over the very scanner R5b's brace walk now reads); `pnpm check:entry-guard`, `check:parse-guard`, `check:cross-package-test-inputs`, `check:driver-memory-census`, `check:pnpm-filter-targets`, `check:refd-timer-probe`, `check:watch-hint-literal`, check-declaration-mirrors, check-self-test-wired, check-self-test-workflow-commands, check-whole-set-label-write, check-reference-carrier-shape, check-ci-filter-parity, check-closing-keyword-parity, bare-root-worklist -- all EXIT=0. (On the FIRST sweep, before `pnpm install`, 7 of these had exited 3 'PREREQUISITE NOT MET' or ERR_MODULE_NOT_FOUND -- read as NOT MEASURED, not as failures, and re-run to a real reading after install EXIT=0.)\nSTILL NOT MEASURED, by the tool's own account: the 3 families whose argv carries a CI-only variable (check-cross-package-test-inputs --union-into, check-shard-attestation, check-test-completeness) and the 36 artifact-roster families it scores silent for every card. Whole-repo `pnpm lint` was NOT named by the derivation and was NOT run -- narrowing declared; CI runs the full farm regardless.\n\nTHE THREE LEGS (throwaway detached worktrees, removed afterwards; the docs change was NEVER committed here).\n (a) this branch alone, EXIT=0: 'unpinned: 26 documented code(s) with no derivable producer (baselined: 26).' / 'OK every derivable runtime status is documented, and every documented status is reachable.'\n (b) branch + PR #15634's docs diff, RE-RUN ON THE FINAL HEAD 87ad25178 (`git diff origin/main...origin/claude/issue-15362-error-handling-unique-violation | git apply`, 1 file, 14 insertions / 14 deletions), EXIT=0: 'scope: 52 code(s) reconciled = 50 StandardErrorCode member(s) + 2 ledger code(s) a doc page publishes a status for (INVALID_REQUEST, UNIQUE_VIOLATION); 2243 source files scanned; 279 producer site(s) derived' / 'reconciled: 26 code(s) with a derived producer, 27 (code, status) pair(s) matched against the docs.' / 'unpinned: 26 ... (baselined: 26).' / 'OK every derivable runtime status is documented, and every documented status is reachable.' That is the proof this card unblocks #15634.\n (c) control leg -- the docs diff with the deriver change but WITHOUT the baseline shrink, EXIT=1: the six nowPinned findings and NOTHING else ('INVALID_FIELD: baselined as unpinned, but a producer now declares its status -- ratchet the baseline down with --update.' and the same for INVALID_FILTER, INVALID_QUERY, INVALID_SORT, OBJECT_NOT_FOUND, RECORD_NOT_ACCESSIBLE). Leg (c) is what makes the shrink accountable: it is the only thing standing between the deriver change and a green #15634, and it produces no other finding.\n\nSITE LISTS. R5b before, the only two it could read: error-response.ts:126 DATABASE_ERROR@500 and :179 INTERNAL_ERROR@500. R5b after: those two unchanged at the same statuses, plus 46 more -- error-response.ts:996 UNIQUE_VIOLATION@409, :1539 UNIQUE_VIOLATION@409, :893 DELETE_RESTRICTED@409, :922 CONCURRENT_UPDATE@409, :1020 ERR_DATASOURCE_UNAVAILABLE@503, :1086 RECORD_NOT_ACCESSIBLE@403, :1123/:1772 OBJECT_NOT_FOUND@404, :1146/:1652 INVALID_FIELD@400, :1177 PERMISSION_DENIED@403, rest-server.ts:355/:364, plus trigger-api and plugin-auth terminals. R6, all new: memory-unique-constraint.ts:504 UNIQUE_VIOLATION@409, protocol.ts:894 INVALID_FILTER@400, engine.ts:997 INVALID_SORT@400, comment-access-hooks.ts:186 RECORD_NOT_ACCESSIBLE@403, query-multiplicity.ts:250 INVALID_FILTER@400, filter-comparand-shape.ts:254 INVALID_FILTER@400 and others. Every site the old deriver had is still derived AT THE SAME STATUS -- the diff of the full (code, status, site) dump is additions only, which is what makes the six-row shrink a measurement rather than a side effect. Each of the six removed rows was spot-read at source and is a genuine producer, in both statement orders (status-then-code and code-then-status); no false pairing was found on this tree.\n\nABLATIONS (fix committed FIRST; trap 'restore' EXIT INT TERM; absolute paths from `git rev-parse --show-toplevel`; restore is `git checkout HEAD -- PATH`, never the bare form; HEAD blob of the gate script 759d420098b76d4bd9229465ef797e42f4b84476).\n (1) revert R5b to the brace-free character class -- mutation confirmed ON DISK: deleted anchor 'const close = matchingBrace' count 0, injected marker count 1, blob 4188246bcb10d2884305aa731f5329726259d8a8 (differs from HEAD). Self-test EXIT=1, '2/47 case(s) failed': 'x self-test: 23 a conditional-spread body derives across its nested braces' and 'x self-test: 23c a brace inside a string does not close the span early'.\n (2) remove R6, call site replaced by an empty iterable -- mutation confirmed ON DISK: injected marker count 1, and the one line still matching 'assignmentPairs(src, structural)' is the function DEFINITION; blob 465cc194884157b1b09fed4418cdd97c52233883. Self-test EXIT=1, '2/47 case(s) failed': 'x self-test: 24 the assignment form derives through the constant index' and 'x self-test: 24b an assignment pair whose status will not resolve is REPORTED, not dropped'.\n Both RESTORE legs verified the same way as the mutation legs: blob back to 759d4200... and `git diff HEAD --name-only` empty. No build/dist is involved -- the gate is run directly as a .mjs, so there is no rebuild leg to state.\n\nSELF-TEST: 40 → 47 cases, roster floor 23 → 25, no existing case weakened. New batteries: '23 - R5b: the body span is brace-BALANCED, and the braces it counts are' (3 cases) and '24 - R6, the ASSIGNMENT form, and the two bounds that keep it honest.' (4 cases).\n\nLABEL: skip-changeset applied via the ADDITIVE REST endpoint (POST .../issues/15656/labels, HTTP 200) and read back -- 'labels now: skip-changeset'. PR body read back in full after creation: 13445 bytes stored vs 13354 sent (the difference is the platform's own create-time session-URL footer block), first line 'Fixes #15633', no less-than fragments, draft=true.", "mcp_calls": "2 -- two `search_issues` calls, both for the out-of-scope finding: one duplicate check (0 hits) and one control query in the same session that returned #15633, so the null read is a measurement rather than a dead channel. Every other GitHub read and write went through REST.", "open_questions": [], "out_of_scope_findings": [ "filed as #15644: check:error-status-conformance leaves 36 real producers unresolved -- StandardErrorCode.enum member expressions are one mechanical shape lookup() cannot read (it allows at most one dot, and a z.enum declaration is not indexed). Surfaced BY this card's R6, which now REPORTS them rather than dropping them, so this is the header's rule working as intended. Unassigned, no label; the issue notes that fixing it moves this same baseline ratchet again, which is why it is its own card." ] }Generated by Claude Code
claude commentedon Sep 5, 2026
LANDED — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.PR #15656 merged 2026-09-05T03:10:27Z as
f99dbcc45onmain(squash, via the merge queue). Probed AND run on re-fetchedorigin/main(detached worktree; plainnode, no dist involved):Closures in the landing window: #15633 (this card) only in this lane; #15325 closed by another seat's #15611 at the same minute — not this PR's. Stripping
pm:dispatched+ assignee; the card closed viaFixeson merge.Unblocks #15362 / PR #15634: the held docs PR now needs
origin/mainmerged in (merge, never rebase) andcheck:error-status-conformancere-run green; that resume is next in this seat's dispatch order (batch cap 5 is full at this minute).Generated by Claude Code
fix(devx): check-error-status-conformance derives the nested { status…