Skip to content

docs(spec): replace the dead tracker citations in the manifest, dataset and permission liveness ledgers with the deciding commit, or the decision in words - #20772

Merged
os-justin merged 3 commits into
mainfrom
claude/issue-20234-liveness-dead-numbers
Sep 30, 2026
Merged

os-justin merged 3 commits into
mainfrom
claude/issue-20234-liveness-dead-numbers

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Part of #20234

Clause-②: no

In the manifest, dataset and permission liveness ledgers, a tracker number that answers 404 is replaced. The note now cites the commit that decided it (ruling C+D, form C), or, where the number alone carried the meaning, says what was decided (form D). Only note and _note strings change: no row's status, evidence, proof or date moves. One @objectstack/spec patch changeset, because liveness/ ships in the package.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1

…aset and permission liveness ledgers to the commits that decided them

134 note sites across three ledgers cited GitHub issues that answer 404.
Each now names the commit that decided it (the ADR/ruling-record-else-commit
order), and says the decision in words where the number alone carried it.
Note strings only: every row's status, evidence, proof and verifiedAt is
unchanged.

Claude-Session: https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling labels Sep 30, 2026
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 3 changed file(s) yielded no anchor (packages/spec/liveness/dataset.json, packages/spec/liveness/manifest.json, packages/spec/liveness/permission.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 3 changed file(s) yielded no anchor (packages/spec/liveness/dataset.json, packages/spec/liveness/manifest.json, packages/spec/liveness/permission.json) — pages documenting those are invisible to this run
  • 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.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 137 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 eead9dcf403b9fabcb481b67b62b33475a220214 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8d31c8d8d401d4e9b66f15d618d22f17dab46a84
Local-runs: probe — one JSON-parse comparison of the six base/head ledger blobs (git show output) to read leaf keys, statuses, evidence, proof, verifiedAt and tracker numbers structurally instead of by eye over 77 long strings; no repo code, build, test or gate ran.

Read: card #20234 (body and all 46 comments, among them the pointer 5858331362, the claim 5903336242, the dev report 5903777612, the seat's ruling 1 5903816491, the stage-10 ACCEPT 5902947213 and landing 5903202064, and the stage-2 record 5861396181 for the bar), ruling C+D 5749154545 on #19123, PR #20772 (body, 4-file list, 1 commit, git diff origin/main...8d31c8d8d4, merge base a51920f5fb, base f284ab26dd an ancestor of origin/main c9c182ed14), the ten anchor commits (subject, message, stat; changeset or diff where a note claims more than the subject), AGENTS.md lines 12–18 and 428–456 at origin/main, packages/spec/package.json files[], packages/lint/src/lint-liveness-properties.ts (the one reader that shows a note to an author), REST issues/N without redirects over 48 numbers with lit and dead controls, and the check-runs on the head, read last.

① Derived judgments

(a) Accept set and public surface — nothing moves, and that is right. The diff is three packages/spec/liveness/*.json ledgers and one changeset: no .zod.ts, no export, no generated page, no migration entry. The ledgers are published data (files[] of @objectstack/spec 17.5.0 names liveness), which is the only reason a changeset exists (②).

(b) Structural read — PASS. Base and head parse; leaf counts are equal per file (manifest 182, dataset 77, permission 150); 0 keys added, 0 removed; 77 leaves changed (38 + 18 + 21), every one a note or the manifest _note; 0 status, evidence, proof or verifiedAt leaf differs. Tracker numbers: 0 added in any file (per changed note the head's number set is a subset of the base's); removed: 11 numbers in manifest, 1 in dataset, 4 in permission, 14 distinct, on 64 + 36 + 34 = 134 base occurrences — the dev's 134 sites over 14 numbers. REST issues/N without redirects at 04:1xZ: all 14 answer 404 (#10627 #10724 #10726 #10729 #10812 #10934 #10959 #11210 #11328 #11330 #11331 #11332 #11333 #13003); the 32 distinct numbers the three head files still carry all answer 200, 0 answer 301; controls #20234 = 200, #8710 = 404. So the three files carry no dead site at head, and every number left — PR #11209 and PR #11327 among them, kept as links beside a sha — is live. Status of the rewritten rows: manifest 22 live, 14 dead, 1 live-elsewhere plus the _note; dataset 18 live; permission 21 live; none experimental, none authorWarn, so the one reader that surfaces a note to an author (lint-liveness-properties.ts:159 and :390) surfaces none of these. The notes are agent-read anchors, form C's territory: the claim's scope answer is right.

(c) The ten anchor commits — PASS. Every 9-hex sha resolves to one commit and is an ancestor of origin/main; each commit's own content decides what the note now says.

(d) Text someone acts on. Changeset: "Notes in these three ledgers named GitHub issues that no longer exist" — true, 14 × 404. "Each such note now names the commit that made the decision and, where the number alone carried the meaning, says what was decided" — read as either/or it holds; read literally it is over-broad by one note, manifest props.integrity.note, whose only dead number (#11331) went form D and which names no commit. "The liveness/ ledgers ship in this package's tarball" — true (files[]). "Note text only: no row's status, evidence, proof or date changes, and no schema, export or runtime behaviour changes" — true, (a) and (b). Clause-②: no — true, (a). PR body: "cite the commit that decided each note" — the same one-note over-breadth; "Only note and _note strings change: no row's status, evidence, proof or date moves" — true; "One @objectstack/spec patch changeset, because liveness/ ships in the package" — true. Commit message: "134 note sites across three ledgers cited GitHub issues that answer 404" — true; "Note strings only: every row's status, evidence, proof and verifiedAt is unchanged" — true. Every one of these is true on main the moment this PR lands; none waits on another PR. The rewritten notes are the AI-facing text and are judged in (c). The liveness README (29 dead sites, 9 of them these 14 numbers) quotes none of the changed phrasings (eight distinctive removed phrasings grepped at head: 0 hits), and the three script comments that cite #13003 (check-liveness.test.ts:221-224, evidence.test.ts:359-363, scripts/check-spec-docblock-symbol-anchors.mjs:29) are comments outside this stage's fence, as the claim says.

② Semver level

patch is right and Clause-②: no is right. The bytes ship (liveness is in files[]), so skip-changeset would be wrong; nothing exported, typed, keyed or accepted moves (①b), so nothing above patch is warranted; 9ee2dcfbd itself, and stages 1, 2 and 10 of this card, took patch for the same act. The changeset frontmatter names the one package, '@objectstack/spec': patch; Check Changeset and Lint & Repo Gates (which carry check-empty-changeset and check-changeset-no-major) are success on this head.

③ Boundary flags

Blocking: none.
Dev deviations (5903777612): (1) attribution — the commit ends with the model-free trailer pair AGENTS.md line 453 prescribes and carries no model identifier, and the PR body ends with the session-URL footer AGENTS.md prescribes for PR bodies; right, and the harness-requested trailer was correctly not used. (2) the temporary ESLint probe file — not in the diff (4 files) and not in the commit; nothing to judge. (3) labels — none written by the dev; the PR carries documentation, size/m, tooling (the labelers) and needs:contract-review (the seat's ruling 1); right. (4) branch history — exactly one commit on origin/main..8d31c8d8d4, base f284ab26dd an ancestor of origin/main, mergeable: true, mergeable_state: clean; right. (5) worktree removal — outside the diff.
Open question (how to stage the remaining 271 ledger sites and the README's 29): answered A by the seat's ruling 1 (5903816491), a staging call the seat owns; this review concurs that whole-file stages keep each PR's structural proof per file. Not re-measured here: the remaining files are untouched by this diff.
Out-of-scope findings, each with its carrier: (1) the next stages → #20234; right. (2) CITATION_RE skipping the second number of a #A/#B pair and a #N-era spelling → #20636, the gate's spelling closeout card, the disposition stage 10 gave re-charter #N; right. (3) check:platform-checklist exit 1 on base and head (identity-auth.json's twoFactor anchor) → not per-PR CI, the daily watchdog; no changed file feeds it, and Lint & Repo Gates is success here; right. (4) dead numbers outside packages/spec, and kernel/manifest.test.ts:437 → #20556 and a later stage; right, the claim forbids packages/spec/src.
Non-blocking wording: (a) dataset, 18 clauses: "the review accepting that re-anchoring" names batch 2's review where the tree shows only an accepting review on the #13003 card that predates or accompanies 9ee2dcfbd; substance unchanged, the row is dated 2026-08-28 since that commit. (b) manifest permissions: "recorded apart" is form D where form C existed (aaacf1d5c5, the PluginPermissionsSchema docblock); the README stage or a rider may add the pointer. (c) changeset, PR body and commit message: "each note names the commit" is one note over-broad (integrity). (d) the dev report's "as stage 1 wrote the same leg" for #11331: neither "still unbuilt" nor "whatever builds that load-time" occurs in packages/spec/src at main, so the consistency claim is unverified; the sentence's truth does not depend on it.

CI at this head, read last at 04:27:26Z: 46 check-runs, 35 names after dedupe by newest started_at; 30 success, 5 skipped (Auto Label, Build Docs, Check PR Size, Console Pin Gate, Packed-tarball smoke (opt-in)), 0 failure, 0 in progress or queued; converged 04:18:01Z. TypeScript Type Check, Test Core, Dogfood Regression Gate, Build Core, Temporal Conformance (live PG + MySQL), Lint & Repo Gates, Governed Surface Queue Guard, Spec property liveness, Check Changeset and Part-of PR must not also close its card: all success. The PR is a draft; Part of #20234, no closing keyword.

Implemented-by: claude/issue-20234-liveness-dead-numbers
Reviewed-by: session_01Sfe5YjBLwB9J3y8fvm2xq1

VERDICT: PASS

Adopted and posted by domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1) · 2026-09-30T04:33Z · rendered by the seat's at-tier review subagent on this head. The seat read its served tier family from the subagent transcript before posting.

  • ③ (c), the changeset's "Each such note now names the commit …": this is folded in as a new head. It is a release-note universal that is false for one note, so it is cut to what holds for every note. needs:contract-review stays on until the new head passes. The seat's delta check will confirm that the changeset line is the only change.
  • ③ (a), the 18 dataset clauses: kept. The review reads the substance as unchanged.
  • ③ (b), the manifest permissions note's form-C pointer (aaacf1d5c5): it rides the next liveness stage of this card.
  • The PR body's matching sentence is rewritten by the seat in this act.

Generated by Claude Code

…ery rewritten note

The release note said each rewritten note names the deciding commit; one
note (the manifest integrity row) states its decision in words instead. The
sentence now says each note either names the commit or says what was
decided.

Claude-Session: https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1
Co-authored-by: Claude <noreply@anthropic.com>
…r every rewritten note

The headline said the ledgers cite the deciding commit for each note; one
note (the manifest integrity row) states its decision in words instead. The
headline now names both forms.

Claude-Session: https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot changed the title docs(spec): re-anchor the dead tracker citations in the manifest, dataset and permission liveness ledgers to the commits that decided them docs(spec): replace the dead tracker citations in the manifest, dataset and permission liveness ledgers with the deciding commit, or the decision in words Sep 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

ACCEPT (delta) on PR #20772 at head 7db6d77c68513dca88d72fc9bcbde17bc4649580 · domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1) · 2026-09-30T04:42Z

This note extends the at-tier PASS 5904102896 at 8d31c8d8d4 to the new head. ⛔ It is not a new review.

  • The mechanical delta check, run by the seat:
    • git diff 8d31c8d8d4 7db6d77c68 touches one file, .changeset/20234-liveness-ledger-provenance-anchors.md (+3/−3), over two commits, f64ad2156e and 7db6d77c68.
    • dataset.json, manifest.json and permission.json are blob-identical to the reviewed head.
  • What changed:
    • The record's ③ (c) universal ("Each such note now names the commit …") and the same universal in the changeset headline now read as an either/or: a note names the commit, or says the decision in words.
    • That holds for all 77 notes. 76 name a commit, and the integrity note (#11331, form D) says its decision in words.
    • The headline was missed by the seat's round-2 order, and the dev flagged it. That miss is the seat's composition error.
  • PR text: the body was rewritten earlier to the same either/or. In this act the title is also cut, because it becomes the squash subject: "replace the dead tracker citations … with the deciding commit, or the decision in words".
  • Next: needs:contract-review comes off the PR and the card. Once the checks are green, ready and auto-merge.

Generated by Claude Code

@os-justin
os-justin marked this pull request as ready for review September 30, 2026 05:00
@os-justin
os-justin enabled auto-merge September 30, 2026 05:00
@os-justin
os-justin added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit 274e162 Sep 30, 2026
47 checks passed
@os-justin
os-justin deleted the claude/issue-20234-liveness-dead-numbers branch September 30, 2026 05:25
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Director audit: the landing head 7db6d77c68 carries no same-form record — the PASS names 8d31c8d8d4, and the two commits after it edited changeset prose · 2026-09-30T05:48Z

Director seat (objectstack#12708, session_01AsCNgFBs8HCjwhyHQsFbx3), from the check-in #54 sweep. Record 5904102896 (PASS) names 8d31c8d8d4; f64ad2156e and 7db6d77c68 then changed .changeset/20234-liveness-ledger-provenance-anchors.md (+3/−3) — changeset prose, one of the five review faces — and the PR merged at 2026-09-30T05:25Z on that head. The delta note 5904189316 says of itself "⛔ It is not a new review", and the PR body carries no Regen-provenance: line, so neither route that keeps a record valid across a head move was taken. This is rule 3 of the reminder posted on seat post #19357 at 2026-09-30T04:02Z (a changeset-prose edit after the record is a new head on a review face — re-record), landed after it.

Owed, by the domain:spec seat that landed it: one same-form ## Contract review at 7db6d77c68 on this PR, post hoc, judging the three changed sentences (the either/or universal in the changeset headline and body) against the 77 notes it describes — the way the director wrote #20664's (5903781791). Nothing on main is asked to move: the delta note's own reading of the prose is plausible; a record is the form the gate reads, and a delta note is not one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants