docs(qa): checklist refs name the live duration keys, not the #14478 tombstones - #16997
Merged
zhuangjianguo merged 1 commit intoSep 9, 2026
Merged
Conversation
…tombstones The hook and job liveness ledgers split their `timeout` row in two when `#14478` ruling B renamed the key to `timeoutMs`: a `live` row for the new spelling and a `dead` tombstone row for the old one. Five checklist rows were not moved with the rename, so each cited a key its own referent records as retired. `records-forms.object-hook-lifecycle` (rev 1 -> 2), source citation only: packages/spec/liveness/hook.json#retryPolicy asserted `timeout` among the props that are 'live'. Measured on the ledger it names, `timeout` is `dead` and `timeoutMs` is `live`. Because the row is a REF -- the coordinate a runner opens to learn what the item must prove -- following it landed the reader on a tombstone row with the replacement key unmentioned, leaving them to reconstruct which of the two spellings was meant. The citation now names `timeoutMs` as live and anchors the `timeout` tombstone explicitly. `integration-system.job-scheduled-run` (rev 2 -> 3), key spelling only, found by the bounded sweep for residue of the same rename: - the fixture citation said `timeout 300000`; the file it names, examples/app-showcase/src/automation/jobs/index.ts, authors `timeoutMs: 300000`; - the timing step and the over-limit acceptance clause instructed a runner to author `timeout`, which the schema now refuses at parse and at tsc; - the job.zod.ts citation named the `timeout` docs, which are the tombstone's. No clause moved in either item and no oracle changed; the job execution STATUS is still spelled 'timeout' and is left alone, as are the ladder-step name in hook-wrappers.ts, the ApprovalEscalationSchema `timeoutHours` rows and their `timeout`/`sla` alias, and the webhook and CLI prose uses. Verified: pnpm check:platform-checklist OK (631/631 symbol anchors resolved, 17 file floors held; areas/records-forms.json 78 -> 79 anchors, well over its floor). No changeset: docs/qa/** is in no package's files[], and an npm pack of @objectstack/spec -- the only publishable package whose files[] reaches past dist/README/CHANGELOG, and the one that publishes the referent liveness/ tree -- carries none of the changed text, with positive controls firing in the same sweep. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x
zhuangjianguo
marked this pull request as ready for review
September 9, 2026 01:10
zhuangjianguo
enabled auto-merge
September 9, 2026 01:10
zhuangjianguo
deleted the
claude/issue-15839-records-forms-hook-timeout-ref
branch
September 9, 2026 01:28
This was referenced Sep 9, 2026
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.
Fixes #15839
Clause-②: no
Checklist citations only. No accept set moves, no export is added, no schema arm, bound or
behaviour changes, and no test outcome changes.
packages/spec/liveness/hook.jsonis theREFERENT here and is untouched — it is already correct. 拉回已声明契约 ⇒ 常规档.
The dispatch's fence held: no row turned out to be testing the wrong thing, only citing
it wrongly, so nothing was re-authored and no clause, oracle or evidence field moved.
The contradiction, re-measured on this branch's base (
bb7d91f19)Both halves stand, measured — not inherited:
packages/spec/liveness/hook.json→timeoutdead(verifiedAt2026-09-04)packages/spec/liveness/hook.json→timeoutMslive(verifiedAt2026-09-04)docs/qa/platform-checklist/areas/records-forms.json:3171…retryPolicy/timeout/onError all 'live'…Resolving what the citation asserts against the ledger it names, mechanically, before and after:
⭐ The row is a
ref— the coordinate a checklist runner opens to decide what the item issupposed to prove — so the corrected citation had to leave a runner with no reconstruction to
do, not merely stop being false. It now names the live key and anchors the tombstone, and the
#timeoutanchor resolves under the gate's own resolver (thedeadrow keeps the key in thewalked shape).
The bounded sweep
audit. #15626 is seven ADR-0087 renames, not one, so the sweep ran over all seven old spellings
across the whole of
docs/qa/platform-checklist/:hook.timeoutrecords-forms.json:3171)job.timeoutintegration-system.json, see below)DriverOptions.timeoutMetadataManagerConfig.cache.ttl/.databaseLoader.ttlconnectionPool.idleTimeoutaccessControl.sessionTimeoutJobScheduleOptions.timeout(contract)Firing control, so the zeroes are readings rather than instrument silence: the same instrument
over the same corpus returns 19 hits for
\btimeout\band 7 for\btimeoutMs\b. It fires.The other 14
\btimeout\bhits were each resolved against the artefact they name and left alone —they are correct today:
records-forms.json:3168— the wrapper ladder step, whichpackages/objectql/src/hook-wrappers.tsitself still spells
timeout(4. timeout → abort if handler runs too long).approvals.json×5 +FOLLOW-UPS.md×1 —ApprovalEscalationSchema.timeoutHoursand the livetimeout/sla→timeoutHoursaliases (packages/spec/src/automation/approval.zod.ts). Adifferent schema; feat(spec)!: duration-shaped number keys carry their unit in the key name — no-baseline gate + seven ADR-0087 renames (timeoutMs, ttlSeconds/ttlMs, *TimeoutSeconds) #15626 did not touch it.
integration-system.json×4 — theJobExecutionStatusenum value'timeout'(still live), thewebhook item (its key was always
timeoutMs; feat(spec)!: duration-shaped number keys carry their unit in the key name — no-baseline gate + seven ADR-0087 renames (timeoutMs, ttlSeconds/ttlMs, *TimeoutSeconds) #15626's diff does not touchwebhook.zod.ts), andtwo concept phrases mirroring
run-with-policy.ts's own wording.api-backend.json:682,cli.json:415,integration-system.json:147— ordinary prose about aprobe budget or a hang.
ttl/TTLhits (10) aresystem-file.object.tsandsystem-upload-session.object.tslifecycleTTLs — unrelated to the
MetadataManagerConfigcache keys #15626 renamed.What changed
records-forms.object-hook-lifecycle(rev 1 → 2) — thesourcecitation only.integration-system.job-scheduled-run(rev 2 → 3) — the sibling area file the sweep turned up,four rows, key spelling only:
fixtures.requires[0]timeout 300000timeoutMs: 300000—examples/app-showcase/src/automation/jobs/index.ts:23steps[4]`timeout`retiredKeyparse and tsc erroracceptanceover-limit clause`timeout`run'timeout'is correct and untouchedsource[0]retryPolicy/timeout docsjob.zod.tsdocumentstimeoutMs;timeoutis the tombstoneBoth items carry a
historyentry saying explicitly that nothing moved — the house shape for aspelling correction (cf. the
?id=com.example.showcase→showcase_appcorrections). Precedentfor treating a step/clause key-spelling as part of a rename rather than a content change comes from
#15626's own landing commit, which corrected
cacheTtl→cacheTtlSecondsin avariantsentryand an
acceptanceclause ofapi-backend.json.Checks
Derived mechanically from the change set (
node scripts/pm/dispatch-gates.mjs --commands), thenreconciled: 12 derived families, 12 run, 0 NOT-MEASURED, 0 UNRUN. All green, all re-run at the
final commit
98c651703:pnpm check:platform-checklistOK — 15 areas, 264 items … symbol anchors: 631/631 resolved against 307 cited sources, 17 file floors heldpnpm check:nul-bytesOK (scanned 8407 text file(s) … no raw ASCII control bytes)pnpm check:doc-authoring398 files clean·46 published skill files clean·821 pinned site(s) … no growthpnpm check:cross-package-test-inputsOK: 28 package(s) read outside themselves, all declaredpnpm check:watch-hint-literal66 declaration(s) across 4 rostered name(s)pnpm check:refd-timer-probeOK … 6385 source file(s) sweptpnpm check:driver-memory-censusOK — every declaration is ledgeredpnpm --filter @objectstack/lint check:doc-formula-expressionsturbo build --filter=@objectstack/formula --filter=@objectstack/lint)node scripts/check-ci-filter-parity.mjsOK: all 174 declared cross-package glob(s)node scripts/check-closing-keyword-parity.mjs(+--self-test)OK (3 parsers agree on all 9 keywords)·24 assertionsnode scripts/check-comment-mask-corpus.mjs6390 files, 0 disagreeAnchor floor —
areas/records-forms.jsonwent 78 → 79 resolved anchors (the addedhook.json#timeoutanchor resolves); its floor is 78.areas/integration-system.jsonheld at 57against a floor of 57. Nothing was lowered.
check:platform-checklistis not CI-wired (by design — see the README's cadence note), sothese are local readings; that is exactly why they are quoted by their own verdict lines here.
Changeset — no changeset owed, both halves measured
Is the path inside any package's
files[]? No. 82 trackedpackage.json, 70 publishable;every one declares an explicit
files[], the whole vocabulary isdist/README.md/CHANGELOG.mdplus seven@objectstack/spec-only entries. No entry namesdocs/, none escapesits package dir, and no publishable package is rooted at the repo root.
Is the changed text in what a package publishes? No — measured, not reasoned.
npm packof@objectstack/spec(2,073 files): the deciding tree, because it is the onlypublishable package whose
files[]reaches pastdist/README/CHANGELOG(liveness,json-schema,api-surface,prompts,llms.txt,src/**/*.zod.ts,spec-changes.json) andthe one that actually publishes the referent,
liveness/hook.json. Searching the extractedbytes:
The positive controls fire and the negative control is silent, so the zeroes are readings. And
nothing could inline it:
turbo.jsondeclares nodocs/qainput, and the only publishedpackage source mentioning the tree is a docblock in
packages/services/service-settings/src/config-change-audit.tsnamingareas/platform-core.jsonas a path — a file this PR does not touch, and not quoted text.⇒ Nothing released moves.
skip-changesetapplied to this PR.For the reviewer
⛔ Draft, and staying draft — no seat flips it ready, enqueues it, or arms auto-merge.
Generated by Claude Code