Skip to content

docs(runtime): keys.ts's catch annotation states its measured determination instead of promising a gate entry (#12981 batch 10b) - #15472

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-12981-batch10b-keys-annotation
Sep 4, 2026
Merged

docs(runtime): keys.ts's catch annotation states its measured determination instead of promising a gate entry (#12981 batch 10b)#15472
baozhoutao merged 1 commit into
mainfrom
claude/issue-12981-batch10b-keys-annotation

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #12981 — batch 10b, the closing half of batch 10, under the ruling Q1 = A (#12981 comment 5543738972). Batch 10a is PR #15458.

Why

The annotation at the handleKeysRequest catch in packages/runtime/src/domains/keys.ts promised a FAILURE_PROPAGATION_SITES entry, keyed keys.ts::handleKeysRequest, "in the step that widens DURABILITY_CRITICAL_CALLEES". That promise is falsified by the ruling's own instrument: the widening that was actually sanctioned adds the seeder wrappers tryInsert / tryUpdate, and neither matches a seam in handleKeysRequest; the only name that would match is bare insert, which the swallow-family census refuses by design (measured at 36 quiet degradations in 30 files). So an entry keyed at that site would not be early — it would be STALE on arrival, and the gate deletes entries that excuse nothing.

What changed

One file, comment-only. The note now states the measured truth:

  • the catch delivers on every path — measured by batch 10a's dev with the gate's own catchDeliversFailure(): with a matching vocabulary name present, every path out of this catch reaches deps.error;
  • the determination is carried by the census's DETERMINED register row for packages/runtime/src/domains/keys.ts::handleKeysRequest in scripts/measure-durability-swallow-family.mjs, which re-verifies on every run that the file exists, that the determination sentence is still written at the site, and that the site is still a tier-1 DARK member — going STALE, loudly, otherwise. A gate entry would have proved the delivery alone;
  • no gate entry is owed.

The register's anchor sentence — [#12981] This catch is silent BY DESIGN and it is NOT a durability swallow. — is kept byte-identical; only the surrounding promise is rewritten. The "do not bolt on a log" instruction and the http-dispatcher.keys.test.ts pin pointer are unchanged.

The register row, before and after

Identical, which is the point — diff of the two census readings exits 0:

    packages/runtime/src/domains/keys.ts::handleKeysRequest
      silent BY DESIGN — every path out of the catch hands the caller a 500 envelope  (#12981, in-file determination)

listed under DETERMINED, not outstanding 3 site(s) in 3 file(s) before and after, with --self-test reporting 3 DETERMINED register row(s) cross-check clean on both sides.

The row is proved live over the edited file, not merely still printed. Ablation on the committed tree: the anchor sentence was reworded on disk (silent BY DESIGNquiet ON PURPOSE; injected marker count 1, original 0, counted on disk before the run), and the census answered

  ✗ 1 STALE row(s) in the DETERMINED register — each one still counts as OUTSTANDING above,
    packages/runtime/src/domains/keys.ts::handleKeysRequest  [anchor-gone]

then the file was restored with git checkout HEAD -- ABSOLUTE_PATH under a trap ... EXIT INT TERM, proved by state: restored blob 1408cfb21954547ac6a1c8bd5a0e889e258f5ca8 equals the HEAD blob, and git diff HEAD for that path is empty.

Verification

All on the final commit 0afa8ba3e. Exit codes captured by redirecting first, then reading $?; verdicts quoted from each tool's own line.

  • Non-comment diff is emptygit diff -U0 filtered to lines that are not // comments produces nothing. No code changed.
  • pnpm check:durability-log-level exit 0, verdict line unchanged before and after (whole output diff exits 0): 29 durability-critical catch seam(s), all loud, rethrowing or propagating to the caller (4 propagating, declared).
  • node scripts/measure-durability-swallow-family.mjs exit 0 before and after, reading byte-identical (diff exit 0); --self-test exit 0 both sides: 4 positive control(s) ... 3 DETERMINED register row(s) cross-check clean, 56 member site(s) total.
  • Typecheck pnpm --filter @objectstack/runtime typecheck exit 0 (tsc --noEmit plus check:test-typecheck: OK), after building the dependency closure (pnpm --workspace-concurrency=2 --filter '@objectstack/runtime^...' build, exit 0 under the shared verify lock, VERDICT command-exit 0). A bare first attempt failed on unbuilt deps (TS2307), which reads exactly like a broken import.
  • Derived family node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths passed; it read the change set itself) — 33 commands, every one run. 32 exit 0, including check:nul-bytes. check:pm-dispatch-gates is not in this card's family, so nothing was owed under the lock there.
  • NOT MEASURED: pnpm check:dual-build-cjs-loads exits 3PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/ ... ⛔ This is NOT a pass: nothing was measured. Its self-test passed (93 cases). A full pnpm build was not run for a comment-only diff; CI measures it.
  • Whole-repo pnpm lint (eslint . --no-inline-config) exit 0 — run in full, no narrowing, so no narrowing evidence is owed.
  • Control-byte self-scan of the edited file (grep -naP over the C0 range plus DEL): no hits.

Changeset

skip-changeset: the diff is a comment in a published package (@objectstack/runtime) — no behaviour, no types, no exports, nothing to publish. Label applied on this PR by the additive endpoint and read back.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…nation

The annotation at the `handleKeysRequest` catch promised a
`FAILURE_PROPAGATION_SITES` entry "in the step that widens
DURABILITY_CRITICAL_CALLEES". That promise is falsified by the widening
that was actually sanctioned: the seeder wrappers `tryInsert`/`tryUpdate`
match no seam in this function, and the only name that would match is
bare `insert`, which the swallow-family census refuses by design. An
entry keyed `keys.ts::handleKeysRequest` would be stale on arrival.

The note now states the measured truth instead: the catch delivers the
failure to the caller on every path (measured with the gate's own
`catchDeliversFailure()`), the determination is carried by the census's
DETERMINED register row for `keys.ts::handleKeysRequest` -- which
re-verifies on every run that the file exists, that the determination
sentence is written at the site, and that the site is still a tier-1
DARK member, going STALE loudly otherwise -- and no gate entry is owed.

Comment-only. The register's anchor sentence is byte-identical, the
census reading is byte-identical, and the gate verdict is unchanged
(29 seams, all loud, rethrowing or propagating).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added the size/s label Sep 4, 2026
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to listnot a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see
  • the SDK route bridge reached 61 of 219 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 56 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 102 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 24 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json e8c7956c46c0e8abda9d259ce07ba5f64e072c47packageMentionDocs.

Which tree this was computed on

This run read content/docs from e3eaad4008fc7b1fa008417b2d0c826384810597 — the merge of head 0afa8ba3ee0722b6bdf511160e2576946555d444 into base e8c7956c46c0e8abda9d259ce07ba5f64e072c47, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin e3eaad4008fc7b1fa008417b2d0c826384810597 && git checkout e3eaad4008fc7b1fa008417b2d0c826384810597
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin e8c7956c46c0e8abda9d259ce07ba5f64e072c47 0afa8ba3ee0722b6bdf511160e2576946555d444 && git checkout -B drift-repro e8c7956c46c0e8abda9d259ce07ba5f64e072c47 && git merge --no-ff 0afa8ba3ee0722b6bdf511160e2576946555d444

node scripts/docs-audit/affected-docs.mjs --json e8c7956c46c0e8abda9d259ce07ba5f64e072c47

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@claude

claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk.

Reviewed against the three-dot diff origin/main...claude/issue-12981-batch10b-keys-annotation (merge base 0db29473c, head 0afa8ba3e): one file, +25/−7, every changed line a // comment (non-comment filter of the diff is empty), matching the PR file list. The note now states what the ruling Q1 = A (comment 5543738972) established — no FAILURE_PROPAGATION_SITES entry is owed, the delivery was measured with catchDeliversFailure(), and the determination is carried by the census's DETERMINED register row — and the row's anchor sentence is byte-identical, so the register cross-check stays live (dev's ablation reds [anchor-gone], restore proven by blob). No overlap with the queued batch 10a (#15458 touches only check-durability-degradation-log-level.mjs). skip-changeset is right for a comment-only change. Fixes #12981 closes the programme card on merge; #15473 (the census why prose carrying the same refused promise) is graded on the card. Flipping ready and arming auto-merge now.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 4, 2026 17:19
@baozhoutao
baozhoutao enabled auto-merge September 4, 2026 17:20
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 6c9f34f Sep 4, 2026
39 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-12981-batch10b-keys-annotation branch September 4, 2026 18:15
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
… landed (#15459, #15473)

The census `scripts/measure-durability-swallow-family.mjs` is the #12981
programme's instrument of record. PR #15458 performed the handover it had
reserved for the programme's last step (`tryInsert`/`tryUpdate` into the gate's
`DURABILITY_CRITICAL_CALLEES`) and PR #15472 closed the programme; four
statements in this file still described both as pending.

- The header's "The handover" section is past tense and names PR #15458/#15472.
- "an 18-entry vocabulary" is 20, the count the gate now declares.
- `tryInsert`/`tryUpdate` move from `origin: 'seed-wrapper'` to
  `'gate-vocabulary'` in `WRITE_SHAPED_CALLEES`: after #15458 they ARE declared
  in the gate, and the OVERLAP reading has to say what the tree says.
  `tryDelete` was not part of the handover and stays `seed-wrapper`.
- The `DETERMINED` row for `keys.ts::handleKeysRequest` no longer says the site
  is waiting for a declaration the #12981 ruling (Q1 = A) refused. Its `anchor`,
  `verdict`, `scope` and key are byte-identical.
- The `SELF_TEST_MODES` gated-subset note stops calling the handover reserved.

The by-value copy of the gate's vocabulary stays a copy — the header says why —
but a by-value copy's failure mode is silence, which is what let this file go
stale under a green farm. `readGateVocabulary()` parses the gate's own
declaration (never imports it) and the `--self-test` cross-checks the copy
against it in BOTH modes, with a negative leg proving the comparison can fire.
It announces drift; it never absorbs it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
…nded handover (#15503)

The tier-1 worklist's empty reading still announced the #12981 ruling's gate
handover step as "unblocked" after PR #15458 performed it (`tryInsert` /
`tryUpdate` declared in the gate's `DURABILITY_CRITICAL_CALLEES`) and PR #15472
closed the programme. It is the same future-tense-over-a-landed-step defect
PR #15502 repaired four times in this file, surviving in the one place no run
could contradict it: this tree reaches the row-per-file branch instead (tier 1
holds one outstanding member, `auth-manager.ts::verifyMcpAccessToken`, beside
three DETERMINED rows), so the sentence has never been printed.

The line is now past tense and names both PRs. So that the new wording is
asserted rather than read, the worklist body moves into `worklistLines()` — a
producer that takes its population as arguments — and `WORKLIST_READING_CONTROLS`
pins all three readings BY VALUE, in both self-test modes: the two `(none …)`
lines the tree cannot reach, plus a populated fixture that must print work and
neither of them, which is what keeps the two pins from passing against a
producer that ignored its population. The table is pinned to its own length
first (#13799's floor recipe). The pins spell each line independently of the
producer on purpose; comparing against a shared constant would pass whatever
that constant said.

The census's own reading over `packages/**` does not move: `--sites`, `--json`
and the normal report are byte-identical against a checkout of the fork point.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The durability log-level gate cannot see the catch { return null; } seeder family — 15 files outside #12923's five, and neither widening path is cheap

2 participants