Skip to content

docs(qa): checklist refs name the live duration keys, not the #14478 tombstones - #16997

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-15839-records-forms-hook-timeout-ref
Sep 9, 2026
Merged

docs(qa): checklist refs name the live duration keys, not the #14478 tombstones#16997
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-15839-records-forms-hook-timeout-ref

Conversation

@claude

@claude claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

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.json is the
REFERENT 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:

reading result
packages/spec/liveness/hook.jsontimeout dead (verifiedAt 2026-09-04)
packages/spec/liveness/hook.jsontimeoutMs live (verifiedAt 2026-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:

--- BEFORE (origin/main bb7d91f19)
    asserts 'live': [object, events, body, priority, async, condition, retryPolicy, timeout, onError]
    contradicted by the ledger: [('timeout', 'dead')]
    mentions the replacement key 'timeoutMs': False

--- AFTER  (this branch)
    asserts 'live': [object, events, body, priority, async, condition, retryPolicy, timeoutMs, onError]
    contradicted by the ledger: NONE
    asserts 'timeout' dead -> ledger says: dead
    mentions the replacement key 'timeoutMs': True

⭐ The row is a ref — the coordinate a checklist runner opens to decide what the item is
supposed 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
#timeout anchor resolves under the gate's own resolver (the dead row keeps the key in the
walked shape).

The bounded sweep

⚠️ Bounded, per triage, to rename residue from #15626 — ⛔ not a general checklist-vs-ledger
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/:

old spelling #15626 retired checklist hits verdict
hook.timeout 1 residue — fixed (records-forms.json:3171)
job.timeout 4 residue — fixed (integration-system.json, see below)
DriverOptions.timeout 0 no checklist surface
MetadataManagerConfig.cache.ttl / .databaseLoader.ttl 0 no checklist surface
connectionPool.idleTimeout 0 no checklist surface
accessControl.sessionTimeout 0 no checklist surface
JobScheduleOptions.timeout (contract) 0 no checklist surface

Firing control, so the zeroes are readings rather than instrument silence: the same instrument
over the same corpus returns 19 hits for \btimeout\b and 7 for \btimeoutMs\b. It fires.

The other 14 \btimeout\b hits were each resolved against the artefact they name and left alone —
they are correct today:

ttl / TTL hits (10) are system-file.object.ts and system-upload-session.object.ts lifecycle
TTLs — unrelated to the MetadataManagerConfig cache keys #15626 renamed.

What changed

records-forms.object-hook-lifecycle (rev 1 → 2) — the source citation only.

integration-system.job-scheduled-run (rev 2 → 3) — the sibling area file the sweep turned up,
four rows, key spelling only:

row said the artefact it names says
fixtures.requires[0] timeout 300000 timeoutMs: 300000examples/app-showcase/src/automation/jobs/index.ts:23
steps[4] author `timeout` authoring it is now a retiredKey parse and tsc error
acceptance over-limit clause over-`timeout` run same key; the execution status 'timeout' is correct and untouched
source[0] retryPolicy/timeout docs job.zod.ts documents timeoutMs; timeout is the tombstone

Both items carry a history entry saying explicitly that nothing moved — the house shape for a
spelling correction (cf. the ?id= com.example.showcaseshowcase_app corrections). Precedent
for 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 cacheTtlcacheTtlSeconds in a variants entry
and an acceptance clause of api-backend.json.

Checks

Derived mechanically from the change set (node scripts/pm/dispatch-gates.mjs --commands), then
reconciled: 12 derived families, 12 run, 0 NOT-MEASURED, 0 UNRUN. All green, all re-run at the
final commit 98c651703:

gate verdict line
pnpm check:platform-checklist OK — 15 areas, 264 items … symbol anchors: 631/631 resolved against 307 cited sources, 17 file floors held
pnpm check:nul-bytes OK (scanned 8407 text file(s) … no raw ASCII control bytes)
pnpm check:doc-authoring 398 files clean · 46 published skill files clean · 821 pinned site(s) … no growth
pnpm check:cross-package-test-inputs OK: 28 package(s) read outside themselves, all declared
pnpm check:watch-hint-literal 66 declaration(s) across 4 rostered name(s)
pnpm check:refd-timer-probe OK … 6385 source file(s) swept
pnpm check:driver-memory-census OK — every declaration is ledgered
pnpm --filter @objectstack/lint check:doc-formula-expressions exit 0 (after turbo build --filter=@objectstack/formula --filter=@objectstack/lint)
node scripts/check-ci-filter-parity.mjs OK: 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 assertions
node scripts/check-comment-mask-corpus.mjs 6390 files, 0 disagree

Anchor floorareas/records-forms.json went 78 → 79 resolved anchors (the added
hook.json#timeout anchor resolves); its floor is 78. areas/integration-system.json held at 57
against a floor of 57. Nothing was lowered.

⚠️ check:platform-checklist is not CI-wired (by design — see the README's cadence note), so
these are local readings; that is exactly why they are quoted by their own verdict lines here.

Changeset — no changeset owed, both halves measured

  1. Is the path inside any package's files[]? No. 82 tracked package.json, 70 publishable;
    every one declares an explicit files[], the whole vocabulary is dist / README.md /
    CHANGELOG.md plus seven @objectstack/spec-only entries. No entry names docs/, none escapes
    its package dir, and no publishable package is rooted at the repo root.

  2. Is the changed text in what a package publishes? No — measured, not reasoned.
    npm pack of @objectstack/spec (2,073 files): the deciding tree, because it is the only
    publishable package whose files[] reaches past dist/README/CHANGELOG (liveness,
    json-schema, api-surface, prompts, llms.txt, src/**/*.zod.ts, spec-changes.json) and
    the one that actually publishes the referent, liveness/hook.json. Searching the extracted
    bytes:

    POSITIVE CONTROL  hook.json ledger note "REMOVED 2026-09-04 (#14478)"     2 file(s)
    POSITIVE CONTROL  hook.zod describe "Maximum execution time in millis…"  21 file(s)
    SUBJECT  the OLD citation text this PR replaces                           0 file(s)
    SUBJECT  the checklist item ids (both)                                    0 file(s)
    SUBJECT  the step text edited here                                        0 file(s)
    SUBJECT  any "docs/qa/platform-checklist" path at all                     0 file(s)
    NEGATIVE CONTROL  a sentinel string in no tree                            0 file(s)
    

    The positive controls fire and the negative control is silent, so the zeroes are readings. And
    nothing could inline it: turbo.json declares no docs/qa input, and the only published
    package source mentioning the tree is a docblock in
    packages/services/service-settings/src/config-change-audit.ts naming
    areas/platform-core.json as a path — a file this PR does not touch, and not quoted text.

⇒ Nothing released moves. skip-changeset applied 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

…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
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.

[finding] the records-forms platform checklist still cites hook.json timeout as 'live' — the ledger marked it dead when #15626 renamed it to timeoutMs

2 participants