Skip to content

docs(spec): twenty-one more liveness ledgers cite the deciding commit, or state the decision in words, in place of dead tracker numbers - #20815

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

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20234

Clause-②: no

Liveness slice 3, the 22 ledgers claim 5906190042 names. In 21 of them, each note that cited a tracker number answering 404 now names the commit that decided it or, where the number alone carried the meaning, says what was decided. In datasource, the one ssl.rejectUnauthorized evidence parenthesis ruling 5905232957 permits now names commit d70428ae7; no path#symbol token moves. 121 sites in 109 leaves (108 note / _note, 1 evidence); no status, proof, date, producer or scope moves, and no number is added. One clause in the rest_api header moves to past tense ("were cited"), because after this slice none of the places it lists still cites those numbers. Left for later: field, app and view (27 sites, held for other cards) and liveness/README.md (29). One @objectstack/spec patch changeset.

Local runs at 3fc249165e: build 71/71; spec local 577 files pass; spec repo 41 of 45 pass; spec typecheck and the lint package's liveness test pass; 58 derived gates, 57 exit 0 (check:platform-checklist: the pre-existing auth-plugin.ts#twoFactor anchor, not per-PR CI). Lint: ESLint's config matches none of the 23 changed files (23 "no matching configuration" results, 0 errors); type-aware linting is never enabled.


Generated by Claude Code

…, or state the decision in words, in place of dead tracker numbers

121 sites across 22 liveness ledgers cited tracker numbers that answer
404. 120 sit in note/_note strings: each changed note now names the
commit that decided it, or says the decision in words where the number
alone carried the meaning. The 121st is the prose parenthesis of the
datasource ssl.rejectUnauthorized evidence string, which now names the
commit that added mysqlSslOption; no path#symbol token moves.

Status, proof, verifiedAt, producer and evidenceScope are unchanged in
every row, no evidence leaf other than that one differs, and no number
is added.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 22 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/agent.json, packages/spec/liveness/analytics_cube.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
  • 22 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/agent.json, packages/spec/liveness/analytics_cube.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 4cc5bcd858a71d17e8b7f3e1224b91c1331efc3f → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 3fc249165e73340972dc9563131fd33c2098bf49
Local-runs: none

Read: card #20234 (body and all 56 comments, among them the liveness-stage claim 5903336242 and ruling 5903816491, the slice-1 landing 5904695627, the slice-2 claim 5904704847, report 5905206041, ruling 5905232957 and landing 5906157441, the slice-3 claim 5906190042, the dev report 5907292001 and the seat's ruling 5907367381, plus every earlier stage's claim, report, ACCEPT and landing); ruling C+D 5749154545 on #19123; the slice-1 and slice-2 records 5904102896 (PR #20772) and 5905625045 (PR #20788) for the bar; PR #20815 (object, body, 23-file list, its one commit 3fc249165e, the net diff origin/main...3fc249165e from merge base 96e724475c); the 22 ledgers at base and head by git show; the 16 new anchor commits plus the 7 writer or context commits the report names (9ee2dcfbd, e9fcd6bbd, 26daf0b036, a60e04d7d4, a286411dfe, 863c7c44f3, 559041d39d) by git show (message, stat, and the hunk each note leans on); packages/spec/package.json files[], packages/lint/src/lint-liveness-properties.ts, eslint.config.mjs lines 327 and 971, AGENTS.md lines 12–18 and 452–454, packages/spec/src/data/analytics.zod.ts and the stage-10 registry entries on origin/main; REST issues/N without redirects for the 16 removed numbers, the 9 other dead numbers in the report's list, the 4 live numbers that stay beside an anchor (#13271, #10144, #9126, #14478 by way of the notes), a lit control (#20234) and a dead control (#8710); the check-runs on the head, last. Nothing built, tested, re-run or checked out: the structural read below parses git show output as JSON and compares leaves, which is a read of the diff and not a repo tool.

① Derived judgments

(a) Accept set and public surface: nothing moves. Right. The diff is 22 files under packages/spec/liveness/ plus one new changeset (23 files, +128/−109). No .zod.ts, no export, no generated page, no migration entry, no script, no README, no state-counts/. The ledgers are published data (files[] of @objectstack/spec 17.5.0 names liveness), which is the only reason a changeset exists (②). Author-shown text: the one reader of a ledger note is lint-liveness-properties.ts:390 (authorHint ?? note, authorWarn rows only); none of the 109 changed leaves sits on an authorWarn row, so no author-shown string moves. Clause-②: no is right.

(b) Structural read: PASS, and it matches the report and the ruling exactly. Every leaf of each of the 22 ledgers at 96e724475c and at the head compared: key sets equal in every file (0 added, 0 removed); 109 leaves differ, 87 note, 21 _note and 1 evidence (datasource props.ssl.children.rejectUnauthorized.evidence, the leaf ruling 5905232957 permits); 0 status, proof, verifiedAt, producer or evidenceScope leaves differ; 0 tracker numbers added (no head leaf carries a #N its base leaf did not); removed occurrences 121 over 16 numbers, #13003 81, #14691 12, #14369 6, #13042 5, #14365 4, #6306 2, #13317 2, and one each of #14143, #13036, #10194, #10238, #8874, #10243, #14366, #14690, #13345, the report's table to the digit. At the head the 22 files carry 0 of the 25 dead numbers; field 11, app 10, view 6 (27, the held files) and the README's 29 are untouched, and connector / permission carry 0, so their exclusion cost nothing. REST issues/N without redirects, read during this review: all 16 removed numbers answer 404, the 9 other dead numbers 404, #13271 / #10144 / #9126 200, controls #20234 200 and #8710 404. Every changed note / _note leaf at head names a commit (the commit or Commit word followed by a 9-hex sha; rest_api apiPath spells it with the capital). The permitted evidence leaf: both path#symbol tokens (default-datasource-driver-factory.ts#resolveSslOption, #mysqlSslOption) are byte-identical at base and head; only #8874 inside the second parenthesis became commit d70428ae7; Spec property liveness is success on the head, so check:liveness still resolves it.

(c) The 16 anchors: real, reachable, and each one's own content decides what the note says. Right. rev-parse --disambiguate returns exactly one object for every 9-hex prefix on an added line, and merge-base --is-ancestor origin/main exits 0 for all 16.

(d) Form D, tested against the tree. Right. (1) analytics_cube "THE END-TO-END MEASUREMENT IS NOT PREJUDGED" for "#10238 IS NOT PREJUDGED": the writer 559041d39d's message reads "#10238 is not prejudged. Whether cube authoring is live end to end …", and stage 1 (21ab410417) dropped the same number from the UNREGISTERED_KIND_SCHEMAS docblock leaving the same sentence; the clause after it already names the measurement. (2) crud_endpoints patterns "Closes the open question about the record's input type" and "a different question was open about this same key (its z.record input type demands all five operations)": a3d5724c8's own crud_endpoints.json wrote the "asks a different question … z.record input type" sentence and b3a63d32c wrote the "Closes … no record left to reshape" sentence beside its own retirement, so the tree shows a question was open and that the retirement closed it; f60ab90ae's changeset names only the overrides record, so not citing it here is right. (3) rest_api header "and two more" for "#14365 and #14690": the header gave those two no description, and #14690's only commit (a8fac3ac1c, docs(objectql)) is outside this family. (4) tool label "the census that prompted this re-close" beside the form-C sha. Each sits in a note that also names a commit.

(e) The one clause changed without a number. rest_api _note "Those numbers were cited throughout rest-server.ts, rest-server.zod.ts and the four sibling ledgers" (was "are cited"), keeping "measured 2026-09-21". At a60e04d7d4 (2026-09-21) rest-server.ts carried #14366 ×8, #14369 ×2, #14691 ×6, rest-server.zod.ts #14369 ×2, #14691 ×9, and the four ledgers #14365 ×3, #14369 ×4, #14691 ×10; at base both source files carry 0 (earlier stages) and at head the four ledgers carry 0, so the present tense would be false on main when this lands and the past tense is true of the dated moment. Exception, pre-existing: #14690 was cited nowhere but rest_api.json even at a60e04d7d4 (git grep at that commit), and "the work they name is all VISIBLY LANDED" covers #14365, a proposal the retirement closed rather than built; ruling 5907367381 records both as not taken up, and this PR makes neither worse.

(f) Text someone acts on, sentence by sentence; every one true on main the moment this PR lands, none waits on another PR. Changeset headline "Notes in twenty-one more liveness ledgers, and one datasource evidence string, cite the commit that decided them, or say the decision in words, instead of a tracker number that no longer resolves": either/or, true, every changed note names a commit and the evidence leaf names d70428ae7; the 21 named ledgers are exactly the 21 files whose note / _note leaves changed. "cited tracker numbers that no longer resolve on GitHub": true, 16 × 404. "Each such note now either names the commit that made the decision or … says what was decided": true, either/or. "The datasource ledger's ssl.rejectUnauthorized evidence string cited one such number in its prose; it now names the commit that made the fix, and its code anchors are unchanged": true (b, c). "The liveness/ ledgers ship in this package's tarball": true (files[]). "Note text and that one evidence parenthesis only: no row's status, proof or date changes, and no schema, export or runtime behaviour changes": true (a, b); the no-change list rightly drops evidence. PR body: "the 22 ledgers claim 5906190042 names" true (the claim's list, 22 files); "In 21 of them, each note that cited a tracker number answering 404 now names the commit that decided it or … says what was decided" true (0 dead sites left in the 21, every changed note names a commit); the datasource sentence true; "121 sites in 109 leaves (108 note / _note, 1 evidence); no status, proof, date, producer or scope moves, and no number is added" true to the digit; the rest_api tense sentence true (e); "Left for later: field, app and view (27 sites, held for other cards) and liveness/README.md (29)" true (11 + 10 + 6, README 29); "One @objectstack/spec patch changeset" true. The "Local runs" and "Lint" paragraphs are the dev's measurements and not re-run here; what the tree can confirm holds: eslint.config.mjs:971's files glob is **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs} so no .json or .md is matched, and line 327 says type-aware linting is never enabled; the CI columns that own the derived gates are read last below. PR title, either/or, true, and it does not claim the datasource leaf. Commit message: "121 sites across 22 liveness ledgers … 120 sit in note/_note strings … The 121st is the prose parenthesis of the datasource ssl.rejectUnauthorized evidence string, which now names the commit that added mysqlSslOption; no path#symbol token moves. Status, proof, verifiedAt, producer and evidenceScope are unchanged in every row, no evidence leaf other than that one differs, and no number is added": true (b, c). No README, script or test quotes a rewritten phrasing: twelve distinctive removed phrasings grepped at head hit only the held ledgers (app, field, view) and packages/rest/CHANGELOG.md's own "(#6306)"; the three #13003 script comments (check-liveness.test.ts:221-224, evidence.test.ts:359-363, 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 PR publishes bytes: packages/spec/package.json files[] carries liveness, so the 22 rewritten ledgers ship in the tarball, and skip-changeset would be wrong; no accept set, schema, export, key or runtime behaviour moves (①a, ①b) and no author-shown string moves, so nothing above patch is warranted, the level slices 1 (274e16271d) and 2 (41dcf11884) took for the same act. The changeset frontmatter names the one package ('@objectstack/spec': patch), the file is added, no foreign changeset is touched, it carries a standalone Clause-②: no line, and its headline and body are worded either/or, so slice 1's universal is absent. Check Changeset and Lint & Repo Gates are success on the head. Clause-②: no.

③ Boundary flags

Blocking: none.

Dev flags (5907292001), each disposed. Deviations: (1) attribution: the head commit ends with the model-free trailer pair AGENTS.md lines 452–454 prescribe, carries no model identifier, and the PR body ends with the session-URL footer; the harness-requested trailer was rightly not used. Confirmed. (2) branch history: origin/main..3fc249165e is exactly one commit, the PR object reports 1 commit, mergeable: true, mergeable_state: clean. Confirmed. (3) labels: none written by the dev; the PR carries documentation, size/m, tooling (labelers) and needs:contract-review (the seat's, per ruling 5907367381); skip-changeset rightly absent since the diff publishes. Confirmed. (4) worktree removal: not readable from the inputs and no diff consequence. open_questions: empty. out_of_scope_findings, each with its carrier: (1) the next slice (field, app, view once #20313 and the #20287/#20299 fold land, and the README's 29) → this card, staging A of ruling 5903816491; right, and the head leaves exactly those 27 + 29. (2) check:platform-checklist exit 1 on identity-auth.json's auth-plugin.ts#twoFactor anchor, pre-existing on a51920f5fb and c2a9936356 per the slice-1 and slice-2 records → the daily watchdog; not per-PR CI, no changed file feeds it, Lint & Repo Gates is success here; right. (3) the two loose rest_api header sentences (①e) → carrier none, an observation; ruling 5907367381 says slice 4 may tighten it if it touches that header; right, and this PR's tense change is the only edit that sentence needed for truth. The claim's fences hold: no packages/spec/src/**, no packages/spec/scripts/**, no README, no field / app / view / connector / permission, no status, proof, date, producer or scope change, one evidence leaf and only its prose parenthesis; the dev re-measured the 121 per file at the new base as the claim asked, and the seat's ruling 5907367381 accepted the same 109-leaf structure proof this read reproduces.

Non-blocking wording notes from this review, none of which makes a sentence false: (1) rest_api _note "(commits 53cbad9, a3d5724 and b3a63d3, in that order)" maps the three shas onto the three descriptions that precede them (seam, enrolment, retirement); a reader who takes "in that order" as chronological will find the dates run 09-05, 09-02, 09-03. (2) The eight batch-4 _notes keep "2026-08-28 (commit 8f10a79)" while that commit's author date is 2026-08-29T00:39Z; the date is the batch's verification date that the rows' verifiedAt carry, pre-existing, the same note slice 2's record made for mapping. (3) tool parameters keeps "merged 2026-08-30T04:42:09Z" beside e29fc212c whose commit date is 04:03Z; the merge stamp is ececf7a21's own message, pre-existing. (4) The tool _note now names the commit that wrote the note itself as "this re-close (commit c19035e)", which is exact.

CI at this head, read last at 2026-09-30T08:58:23Z: 39 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 08:43:59Z. Spec property liveness, Check Changeset, Lint & Repo Gates, Build Core, Test Core (and its six shards), TypeScript Type Check, the four Type Check · gates, Dogfood Regression Gate (and its three shards), Dogfood Verify CLI, Temporal Conformance (live PG + MySQL), Governed Surface Queue Guard, Check Documentation Links, Flag docs affected by code changes, Part-of PR must not also close its card, The card this PR closes must claim this branch, No other open PR may claim the same issue and No other open PR may claim the same single-writer path: all success. PR: draft, base main, first line Part of #20234, no closing keyword, bare Clause-②: no line, assignee os-justin.

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

VERDICT: PASS

Adopted and posted by domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1) · 2026-09-30T09:02Z · 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.

  • ③'s four wording notes are kept as they are, with no new head. The record finds none of them false.
  • This PR is not governed. After this record reads back, needs:contract-review comes off in a separate act, then the PR goes ready and into the merge queue.

Generated by Claude Code

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