You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] the swallow-family census's DETERMINED row for keys.ts still says the site is waiting for a FAILURE_PROPAGATION_SITES declaration the ruling refused #15473
Sub-issue of #15459, which enumerates three statements in the census header that went stale when the #12981 handover landed. This is a fourth stale statement in the same file, outside the header — found while landing #12981 batch 10b (PR #15472), which deletes the identical promise from the site itself.
scripts/measure-durability-swallow-family.mjs, the DETERMINED register row for packages/runtime/src/domains/keys.ts::handleKeysRequest, still ends its why with:
⛔ The declaration this site is waiting for belongs to the programme's LAST step, the one that widens DURABILITY_CRITICAL_CALLEES; this row does not bring that step forward and must not be re-keyed by it.
The ruling on #12981 (comment 5543738972, Q1 = A) settles that no such declaration is owed at that site, ever: the sanctioned widening added tryInsert / tryUpdate, neither of which matches a seam in handleKeysRequest, and the only name that would match is bare insert, which this census refuses by design. An entry keyed there would be STALE on arrival. So the site is not "waiting for" anything — the register row is the record, which is exactly what the ruling relies on.
Scope of the repair: prose in one why string. The row's anchor, verdict, scope and key are correct and must not move — the anchor is cross-checked against the file on every run, and PR #15472 keeps that sentence byte-identical for precisely this reason.
⛔ Not a behaviour defect: the census reading, its --self-test (3 DETERMINED register row(s) cross-check clean) and its controls are green and unchanged by #15472 (reading byte-identical before and after, diff exit 0).
Why filed rather than fixed in batch 10b: that card's surface is one comment in packages/runtime/src/domains/keys.ts, and this instrument is the shared measurement device of the same programme — the same reason #15459 was filed rather than repaired in-batch. Duplicate check: 561 open issues enumerated by page over the repo-scoped REST list endpoint (591 total open items, matching open_issues_count) and grepped locally, plus one directed semantic search including closed cards; no match. Unassigned.
domain:devx / priority:p3, queued. One why string in scripts/measure-durability-swallow-family.mjs's DETERMINED register carries the promise ruling Q1 = A refused (PR #15472 deletes it at the site); anchor / verdict / scope / key stay as they are. Serial on the census file with #15459 (both wait for #15458 and #15472 to land); fold into #15459's dispatch if that card is still queued when a slot opens, otherwise dispatch alone as S.
Claim: PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk, dispatching to an os-dev subagent on branch claude/issue-15459-census-post-handover — one PR, Fixes #15459 and Fixes #15473 (folded: the same instrument, the same post-handover truth). Ruling on item 3: tryInsert / tryUpdate move to origin: 'gate-vocabulary' — after #15458 (merged 17:29Z) they ARE declared in the gate, and the census's overlap reading must say what the tree says; the by-value copy stays (the header's stated reason), with a self-test cross-check that the copied vocabulary equals the gate's DURABILITY_CRITICAL_CALLEES (20 today) so the copy reds on drift instead of lying. Items 1–2 and #15473's why string are prose: rewrite to past tense with the landed PR numbers. Serial on scripts/measure-durability-swallow-family.mjs: #15472 merged 18:15Z; no open PR touches the census (scan across all open PRs at claim time). Main at 6c9f34f20. Assignee fields were empty at the read immediately before this write.
{
"issue": 15473,
"issues": [
15459,
15473
],
"status": "done",
"branch": "claude/issue-15459-census-post-handover",
"pr": "https://github.com/objectstack-ai/objectstack/pull/15502",
"premise_still_valid": true,
"summary": "One PR, #15502, covering both folded cards on scripts/measure-durability-swallow-family.mjs. #15459: the header's \"The handover\" section is past tense naming PR #15458 (performed) and PR #15472 (programme closed); \"an 18-entry DURABILITY_CRITICAL_CALLEES vocabulary\" is now 20; and tryInsert/tryUpdate move from origin 'seed-wrapper' to 'gate-vocabulary' in WRITE_SHAPED_CALLEES, because after #15458 they ARE declared in the gate. tryDelete was not part of the handover and stays 'seed-wrapper'. The by-value copy of the gate vocabulary STAYS a copy (the header says why), but a new readGateVocabulary() parses the gate's own declaration (never imports it; the map is not exported) 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, never absorbs it. #15473: the DETERMINED row for keys.ts::handleKeysRequest no longer says the site is waiting for a declaration the Q1 = A ruling refused; its anchor, verdict, scope and key are byte-identical and the row is proved live by ablation. DECLARED BEYOND THE CARDS' LETTER, under the bounded in-place exemption: the SELF_TEST_MODES gated-subset note also still called the handover \"reserved\" and \"still gated on outstanding == 0\" — same defect class, same file, correct form pinned by the same landed evidence — so its tense is fixed too and it is named in the PR body. The instruction's force is unchanged. OVERLAP reading before/after: names labelled gate-vocabulary 18 -> 20 (now set-equal to the gate's 20); MEMBER sites whose guarded write resolves to a gate-vocabulary name 5 of 56 -> 5 of 56, QUIET 4 of 98 -> 4 of 98 — unchanged, because 0 member and 0 quiet sites resolve their guarded write through tryInsert/tryUpdate on this tree (those names are the ENCLOSING seeder helpers; the write inside them is ql.insert/ql.update, origin 'objectql'). So the relabel corrects the VOCABULARY side of the overlap and moves no printed row: normal, --sites and --json readings all diff exit 0.",
"tests": "Exit codes captured by redirecting to a file first and reading $? before any pipe; verdicts quoted from each tool's own printed line. Final commit a841a374b. (1) node scripts/measure-durability-swallow-family.mjs exit 0 on the branch and exit 0 on a second checkout of the fork point 6c9f34f20 (pnpm install'ed, so packages/** is held byte-identical and this file is the only variable); diff of the two normal-mode outputs exit 0, --sites diff exit 0, --json diff exit 0. NOTE: origin/main advanced to 4f85e4d11 (#15475, touching packages/triggers/**) after this branch was cut, so the comparison is against the fork point deliberately — a diff against the newer main would conflate another PR's packages/ changes with this one. (2) --self-test exit 0: '4 positive control(s) yield members at their declared tier, 3 negative control(s) yield none, 2 regression control(s) stay clear, 6 resolution control(s) resolve as declared, 3 DETERMINED register row(s) cross-check clean, 20 copied gate-vocabulary name(s) match the gate's own declaration, 56 member site(s) total'. --self-test=gated exit 0, same counts. (3) pnpm check:durability-log-level exit 0 on BOTH trees; output diff differs only in pnpm's own banner line naming the checkout directory; verdict unchanged: '29 durability-critical catch seam(s), all loud, rethrowing or propagating to the caller (4 propagating, declared)'. (4) ANCHOR ABLATION on the committed tree, trap-guarded on EXIT INT TERM with absolute paths from git rev-parse --show-toplevel: mutation confirmed ON DISK before the run by counting both markers ('silent BY DESIGN' 1 -> 0, 'silent ON PURPOSE' 0 -> 1) and by blob hash (1408cfb2... -> 510a2954...); the census answered '1 STALE row(s) in the DETERMINED register ... keys.ts::handleKeysRequest [anchor-gone]' and put the site back on the printed worklist; --self-test exit 1 and --self-test=gated exit 1. Restore proved BY STATE, not by an exit code: restored blob 1408cfb21954547ac6a1c8bd5a0e889e258f5ca8 equals the HEAD blob, git diff HEAD for that path empty, marker counts back at 1/0. (5) Derived family: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths passed (it read the change set itself, 1 path vs merge base 6c9f34f20) — 25 commands, EVERY ONE RUN, ALL exit 0. Including pnpm check:pm-dispatch-gates ('dispatch-gates self-test: 1402 cases pass.' — no case edited), pnpm check:nul-bytes ('scanned 7498 text file(s) ... no raw ASCII control bytes'), pnpm check:swallow-census-controls (the gated self-test above), pnpm check:ratchet-remedy-authority ('202 scripts swept'), node scripts/check-self-test-wired.mjs ('every one of the 169 script(s) CI runs that ship a --self-test has that self-test run by CI'). (6) pnpm lint whole repo (eslint . --no-inline-config) exit 0 under the shared verify lock: 'VERDICT command-exit 0 - held the lock 88s - waited 129s'. No narrowing, so no narrowing evidence is owed. A FIRST attempt returned the wrapper's exit 99 ('VERDICT queue-timeout ... never acquired'), recorded as NOT MEASURED and counted nowhere; the slot was kept and re-used. (7) Control-byte self-scan of the edited file (grep -naP over the C0 range plus DEL): no hits. (8) No test file is owed and none exists to re-run: the edited script has no test suite anywhere in the tree — its assertions ARE its --self-test, run above in both modes and given a new leg. The only test naming it, packages/runtime/src/http-dispatcher.keys.test.ts, pins keys.ts delivery, a file this PR does not touch (proved by the ablation restore). NOT MEASURED anywhere in this run: only the exit-99 lint attempt in (6), superseded by the run that acquired.",
"mcp_calls": "1 — one directed mcp__github__search_issues for the out-of-scope dedup, which returned an API rate-limit error; the dedup was then done over the repo-scoped REST list endpoint (561 open issues enumerated by page, grepped locally, control word verified to hit). Everything else — both issue bodies, both PR bodies, PR creation, the label write and read-back, these comments — went over REST with $GH_TOKEN.",
"open_questions": [],
"out_of_scope_findings": [
"filed as #15503: the census's empty-worklist line still prints \"the gate handover step is unblocked\" after PR #15458 performed that handover — a fifth stale statement in the same file, but in the PRINTED READING rather than a comment, so it is outside this dispatch's ruling (which holds the reading byte-identical except the named OVERLAP rows). Unreachable on the current tree (tier-1 has 1 outstanding member), one string literal to repair."
]
}
PR #15502 merged 2026-09-04T19:42:54Z (merged: true, main ed9d87653). Probe: the DETERMINED row's why for keys.ts::handleKeysRequest no longer carries the refused promise (0 hits for the old sentence), the anchor / verdict / scope / key are unchanged, and the census self-test reads Node.js v22.22.2. Fixes closed this card on merge; labels and assignee stripped.
Correction to the LANDED note above — PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk. The quoted "self-test" line is a Node stack-trace tail, not a verdict: on this seat's checkout node scripts/measure-durability-swallow-family.mjs --self-test exits 1 on a missing prerequisite (the census parses source through typescript, which is not installed here), so that run is NOT MEASURED locally. What the probe does establish is textual (gate-vocabulary rows :292–293, readGateVocabulary() :1756, 0 hits for the refused promise); the measurement channel is CI's merge-group run that merged #15502 green, and the dev's report quotes the self-test verdict (20 copied gate-vocabulary name(s) match the gate's own declaration). Rest of the note stands.
Activity
claude commentedon Sep 4, 2026
Graded — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.domain:devx/priority:p3, queued. Onewhystring inscripts/measure-durability-swallow-family.mjs's DETERMINED register carries the promise ruling Q1 = A refused (PR #15472 deletes it at the site); anchor / verdict / scope / key stay as they are. Serial on the census file with #15459 (both wait for #15458 and #15472 to land); fold into #15459's dispatch if that card is still queued when a slot opens, otherwise dispatch alone as S.Generated by Claude Code
claude commentedon Sep 4, 2026
Claim: PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, dispatching to anos-devsubagent on branchclaude/issue-15459-census-post-handover— one PR,Fixes #15459andFixes #15473(folded: the same instrument, the same post-handover truth). Ruling on item 3:tryInsert/tryUpdatemove toorigin: 'gate-vocabulary'— after #15458 (merged 17:29Z) they ARE declared in the gate, and the census's overlap reading must say what the tree says; the by-value copy stays (the header's stated reason), with a self-test cross-check that the copied vocabulary equals the gate'sDURABILITY_CRITICAL_CALLEES(20 today) so the copy reds on drift instead of lying. Items 1–2 and #15473'swhystring are prose: rewrite to past tense with the landed PR numbers. Serial onscripts/measure-durability-swallow-family.mjs: #15472 merged 18:15Z; no open PR touches the census (scan across all open PRs at claim time). Main at6c9f34f20. Assignee fields were empty at the read immediately before this write.Generated by Claude Code
docs(scripts): the swallow-family census reads the #12981 handover as…
claude commentedon Sep 4, 2026
os-dev-report
{ "issue": 15473, "issues": [ 15459, 15473 ], "status": "done", "branch": "claude/issue-15459-census-post-handover", "pr": "https://github.com/objectstack-ai/objectstack/pull/15502", "premise_still_valid": true, "summary": "One PR, #15502, covering both folded cards on scripts/measure-durability-swallow-family.mjs. #15459: the header's \"The handover\" section is past tense naming PR #15458 (performed) and PR #15472 (programme closed); \"an 18-entry DURABILITY_CRITICAL_CALLEES vocabulary\" is now 20; and tryInsert/tryUpdate move from origin 'seed-wrapper' to 'gate-vocabulary' in WRITE_SHAPED_CALLEES, because after #15458 they ARE declared in the gate. tryDelete was not part of the handover and stays 'seed-wrapper'. The by-value copy of the gate vocabulary STAYS a copy (the header says why), but a new readGateVocabulary() parses the gate's own declaration (never imports it; the map is not exported) 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, never absorbs it. #15473: the DETERMINED row for keys.ts::handleKeysRequest no longer says the site is waiting for a declaration the Q1 = A ruling refused; its anchor, verdict, scope and key are byte-identical and the row is proved live by ablation. DECLARED BEYOND THE CARDS' LETTER, under the bounded in-place exemption: the SELF_TEST_MODES gated-subset note also still called the handover \"reserved\" and \"still gated on outstanding == 0\" — same defect class, same file, correct form pinned by the same landed evidence — so its tense is fixed too and it is named in the PR body. The instruction's force is unchanged. OVERLAP reading before/after: names labelled gate-vocabulary 18 -> 20 (now set-equal to the gate's 20); MEMBER sites whose guarded write resolves to a gate-vocabulary name 5 of 56 -> 5 of 56, QUIET 4 of 98 -> 4 of 98 — unchanged, because 0 member and 0 quiet sites resolve their guarded write through tryInsert/tryUpdate on this tree (those names are the ENCLOSING seeder helpers; the write inside them is ql.insert/ql.update, origin 'objectql'). So the relabel corrects the VOCABULARY side of the overlap and moves no printed row: normal, --sites and --json readings all diff exit 0.", "tests": "Exit codes captured by redirecting to a file first and reading $? before any pipe; verdicts quoted from each tool's own printed line. Final commit a841a374b. (1) node scripts/measure-durability-swallow-family.mjs exit 0 on the branch and exit 0 on a second checkout of the fork point 6c9f34f20 (pnpm install'ed, so packages/** is held byte-identical and this file is the only variable); diff of the two normal-mode outputs exit 0, --sites diff exit 0, --json diff exit 0. NOTE: origin/main advanced to 4f85e4d11 (#15475, touching packages/triggers/**) after this branch was cut, so the comparison is against the fork point deliberately — a diff against the newer main would conflate another PR's packages/ changes with this one. (2) --self-test exit 0: '4 positive control(s) yield members at their declared tier, 3 negative control(s) yield none, 2 regression control(s) stay clear, 6 resolution control(s) resolve as declared, 3 DETERMINED register row(s) cross-check clean, 20 copied gate-vocabulary name(s) match the gate's own declaration, 56 member site(s) total'. --self-test=gated exit 0, same counts. (3) pnpm check:durability-log-level exit 0 on BOTH trees; output diff differs only in pnpm's own banner line naming the checkout directory; verdict unchanged: '29 durability-critical catch seam(s), all loud, rethrowing or propagating to the caller (4 propagating, declared)'. (4) ANCHOR ABLATION on the committed tree, trap-guarded on EXIT INT TERM with absolute paths from git rev-parse --show-toplevel: mutation confirmed ON DISK before the run by counting both markers ('silent BY DESIGN' 1 -> 0, 'silent ON PURPOSE' 0 -> 1) and by blob hash (1408cfb2... -> 510a2954...); the census answered '1 STALE row(s) in the DETERMINED register ... keys.ts::handleKeysRequest [anchor-gone]' and put the site back on the printed worklist; --self-test exit 1 and --self-test=gated exit 1. Restore proved BY STATE, not by an exit code: restored blob 1408cfb21954547ac6a1c8bd5a0e889e258f5ca8 equals the HEAD blob, git diff HEAD for that path empty, marker counts back at 1/0. (5) Derived family: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths passed (it read the change set itself, 1 path vs merge base 6c9f34f20) — 25 commands, EVERY ONE RUN, ALL exit 0. Including pnpm check:pm-dispatch-gates ('dispatch-gates self-test: 1402 cases pass.' — no case edited), pnpm check:nul-bytes ('scanned 7498 text file(s) ... no raw ASCII control bytes'), pnpm check:swallow-census-controls (the gated self-test above), pnpm check:ratchet-remedy-authority ('202 scripts swept'), node scripts/check-self-test-wired.mjs ('every one of the 169 script(s) CI runs that ship a --self-test has that self-test run by CI'). (6) pnpm lint whole repo (eslint . --no-inline-config) exit 0 under the shared verify lock: 'VERDICT command-exit 0 - held the lock 88s - waited 129s'. No narrowing, so no narrowing evidence is owed. A FIRST attempt returned the wrapper's exit 99 ('VERDICT queue-timeout ... never acquired'), recorded as NOT MEASURED and counted nowhere; the slot was kept and re-used. (7) Control-byte self-scan of the edited file (grep -naP over the C0 range plus DEL): no hits. (8) No test file is owed and none exists to re-run: the edited script has no test suite anywhere in the tree — its assertions ARE its --self-test, run above in both modes and given a new leg. The only test naming it, packages/runtime/src/http-dispatcher.keys.test.ts, pins keys.ts delivery, a file this PR does not touch (proved by the ablation restore). NOT MEASURED anywhere in this run: only the exit-99 lint attempt in (6), superseded by the run that acquired.", "mcp_calls": "1 — one directed mcp__github__search_issues for the out-of-scope dedup, which returned an API rate-limit error; the dedup was then done over the repo-scoped REST list endpoint (561 open issues enumerated by page, grepped locally, control word verified to hit). Everything else — both issue bodies, both PR bodies, PR creation, the label write and read-back, these comments — went over REST with $GH_TOKEN.", "open_questions": [], "out_of_scope_findings": [ "filed as #15503: the census's empty-worklist line still prints \"the gate handover step is unblocked\" after PR #15458 performed that handover — a fifth stale statement in the same file, but in the PRINTED READING rather than a comment, so it is outside this dispatch's ruling (which holds the reading byte-identical except the named OVERLAP rows). Unreachable on the current tree (tier-1 has 1 outstanding member), one string literal to repair." ] }Generated by Claude Code
claude commentedon Sep 4, 2026
LANDED — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk.PR #15502 merged 2026-09-04T19:42:54Z (
merged: true, mained9d87653). Probe: the DETERMINED row'swhyforkeys.ts::handleKeysRequestno longer carries the refused promise (0 hits for the old sentence), the anchor / verdict / scope / key are unchanged, and the census self-test readsNode.js v22.22.2.Fixesclosed this card on merge; labels and assignee stripped.Generated by Claude Code
claude commentedon Sep 4, 2026
Correction to the LANDED note above — PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk. The quoted "self-test" line is a Node stack-trace tail, not a verdict: on this seat's checkoutnode scripts/measure-durability-swallow-family.mjs --self-testexits 1 on a missing prerequisite (the census parses source throughtypescript, which is not installed here), so that run is NOT MEASURED locally. What the probe does establish is textual (gate-vocabularyrows :292–293,readGateVocabulary():1756, 0 hits for the refused promise); the measurement channel is CI's merge-group run that merged #15502 green, and the dev's report quotes the self-test verdict (20 copied gate-vocabulary name(s) match the gate's own declaration). Rest of the note stands.Generated by Claude Code
docs(scripts): the swallow-family census reads the objectstack-ai#12981…