Skip to content

docs(spec): the sha-less objectui line citations move to their liveness rows - #23621

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-23434-sha-less-read-points
Oct 15, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-23434-sha-less-read-points

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23434

Clause-②: no

The last part of issue 23434, under claim 6184826965. It moves the remainder listed in landing record 6184152953 under ruling 6165388570 (letter C) item 1 ("The published spec source carries no renderer citation after this") into the matching liveness notes, in item 2's spelling. The two live citations with no matching note stay as named exceptions (the "stays: no ledger row" rows below); the seat's ACCEPT on this PR keeps Fixes on that reading. It also carries residual 2 of the post-hoc review 6184726608. Ruling 6181034096 (Q2 → A) keeps retirement history in place, and this PR applies that test to two of the listed lines.

What changes

Every edit to packages/spec/src is to a comment. The ledger notes take the moved records as objectui @SHA FILE#SYMBOL, each read at objectui b9814b334 (the .objectui-sha pin on this base).

source line(s) on base 8d05456cbe record disposition ledger row
data/field.zod.ts:1816 slider step reader moved field.json step
data/field.zod.ts:1835 vector dimensions reader moved field.json dimensions
ui/action.zod.ts:966, :969, :970 (+ :971, a .ts line) param-dialog description chain moved; stale claim corrected action.json description
system/translation.zod.ts:161 (a .ts line, outside the 8 files) the same chain, on the translation slot moved; stale claim corrected (bounded in-place fix, below) action.json description
ui/bulk-action.zod.ts:81 (+ :73, :76, :79, .ts lines) bulk param options[] passthrough moved; stale claim dropped view.json list.bulkActionDefs
ui/i18n-label-resolver.ts:136 the two resolvers' composition order moved page.json regions, entry [2] (page:tabs items[].label)
ui/view.zod.ts:456, :458 (+ :457) row-id decoration producers moved view.json list.filter and list.sort
ui/view.zod.ts:965 (+ :967) ViewFilterRule row id moved view.json list.filter
ui/view.zod.ts:1701 allowAddTab reader moved view.json list.userFilters
ui/view.zod.ts:2803 sort entry row id moved view.json list.sort
ui/app.zod.ts:963 areas[].order retirement record stays: retirement history none
ui/dashboard.zod.ts:1462 widgets[].aria removal record stays: retirement history none
ai/build-progress.zod.ts:100 (+ :102) build-progress phase readers stays: no ledger row none
ui/view.zod.ts:5283 (+ :5284) the "pin this view" trace on ViewItemSchema stays: no ledger row none

Each moved comment now names its row, in the form PR #23591 used ("read points recorded in liveness/view.json, row list.filter").

Residual 2 (review 6184726608). view.json list.exportOptions named ObjectGrid.tsx by line (:1596-:1611, :1620-:1631). It now names objectui @b9814b334 packages/plugin-grid/src/ObjectGrid.tsx#exportableFormats (formats, streaming) and #handleExport (maxRecords, includeHeaders, fileNamePrefix, and streaming again for the server-stream choice). The note keeps that the first measurement was by line at objectui origin/main@878140b.

Two stale claims, corrected on the move. These were renderer readings that no longer hold at the pin. Each source comment now states only the contract, and the ledger records the current reading:

  • ui/action.zod.ts and system/translation.zod.ts said the description resolver falls back from objects.{object}._actions.{action}.description to globalActions.{action}.description. At objectui b9814b334, useObjectLabel.ts#actionSuffixes reads one address only: the object's for an action with a key object, the global one for an action without (objectui#11439 retired the chain). That matches the spec's own packages/spec/src/system/i18n-resolver.ts#actionTranslationNode. The action.json description evidence carried the same stale chain and now reads by symbol.
  • ui/bulk-action.zod.ts said objectui's bulk-param option TYPE is closed (a label/value pair only). At b9814b334, objectql.ts#BulkActionParam types an option entry open, with an index signature. The passthrough reasoning does not depend on the type, and it stays.

The four items listed without a ledger row (6184152953): one reading each

item reading reason
ai/build-progress.zod.ts, objectui dda8f3815 (the same record as line 100 above) stays BuildProgressFrame is a stream frame, not a registered metadata type, so no ledger file covers it. The module's own "Liveness watch" section says so, and it keeps each reading beside its surface by design. A row would mean enrolling the frame in check-liveness.mts's SPEC_ONLY_SCHEMAS, as query and realtime_subscription were, each by its own card with a census. That widens what the gate governs, which is not this card's to decide.
api/dataset-selection.test.ts (objectui @98178b2) stays Writer provenance for test specimens: the request shapes five objectui call sites build. This is the class 6184152953 keeps for the 30 pin-test citations. DatasetSelection is a query request, and dataset.json governs DatasetSchema only.
system/metadata-form-zod-reconciliation.test.ts:578-579 stays The comment records that a row is impossible: planting config in view.json failed check:liveness as an ORPHAN. The walk stops at the view union's container arm (check-liveness.mts#shapeOf). It is a dated census of seven keys, not a renderer read point.
the VIEW_CONSOLE_ROUND_TRIP_KEYS census (ui/view.zod.ts, and ui/view-console-round-trip-keys.test.ts:19, :42) stays The same walk boundary: the round-trip keys live on the viewItem and listOverlay arms, which have no rows. The record is also the symbol ADR-0005 appendix (c) cites (docs/adr/0005-metadata-customization-overlay.md, packages/spec/src/ui/view.zod.ts#VIEW_CONSOLE_ROUND_TRIP_KEYS). It names no renderer file.

The recount, on origin/main 8d05456cbe (re-taken on 9a6f790a38, which changes none of the six source files: the same 16)

  • Instrument: git grep -nE '[A-Za-z0-9_-]+\.tsx:[0-9]+' -- 'packages/spec/src/**' ':!*.test.ts'. It gives 38 lines. 22 of them are in conversions/registry.ts, migrations/** and registry.ts.template, which are group R and stay. That leaves 16 in the 8 named files: build-progress 1, field 2, action 3, app 1, bulk-action 1, dashboard 1, i18n-label-resolver 1, view 6. Landing record 6184152953 says 17, but its own per-file list sums to 16.
  • Control: the same instrument at HEAD still counts the 22 group-R lines (22 → 22), so its zeros elsewhere are readings.
  • The records also cite objectui by .ts:NNN. A wider instrument (objectui package paths with :NNN, any .ts/.tsx) adds 8 lines on the same records. It also finds one record outside the 8 files, system/translation.zod.ts:161. In-repo .ts:NNN citations (dataset-compiler.ts, memory-driver.ts, kernel-base.ts, middleware.ts) and the cloud one in agent.zod.ts are not renderer citations, and they stay.
  • After this PR: 16 → 4 .tsx:NNN lines (the four "stays" rows above), and 21 → 5 on the wide instrument.

Bounded in-place fix, outside the claim's file surface

system/translation.zod.ts:161 is not in claim 6184826965's file surface. I fixed it here because all four of os-dev's bounded in-place conditions hold:

  1. It is the same defect class: a sha-less objectui file:line in published spec source.
  2. The fix is mechanical, in the shape this card fixed.
  3. No open PR touches the file. I read the file lists of all 12 open non-release PRs.
  4. The gate family is the same; no new verification surface.

The claim's file surface needs this file added. The seat records that.

Verification

Head 5596717198 merges origin/main 9a6f790a38 into this PR's one change commit, f7160d1f2e. Head 023b160afe follows it with one changeset-only commit (the headline now names which read points moved and which stay); no build or test input changed. The merge was clean, and it brought PR #23600 and PR #23601, which touch packages/spec. After the merge, git diff --stat origin/main HEAD is still these 11 files (+62 / -54). Every reading below was taken on 5596717198 after the merge:

  • pnpm --filter @objectstack/spec build through os-verify-lock.sh: VERDICT command-exit 0. After it, git status was clean, so the build wrote no tracked file.
  • pnpm --filter @objectstack/spec typecheck && pnpm --filter @objectstack/spec test (vitest --project local; no test:repo) through the lock: VERDICT command-exit 0. "Test Files 678 passed (678) · Tests 20741 passed | 1 todo (20742)".
  • Comment-only check. Each of the 6 changed .ts files was parsed with TypeScript at origin/main and at head and printed with comments removed. 6 of 6 are identical. The control: a one-character string-literal mutation printed differently, and a comment-only mutation printed the same.
  • Ledger anchors. The 21 new objectui @SHA FILE#SYMBOL anchors were checked with scripts/symbol-anchors.mjs#symbolSegmentResolution against git show SHA:FILE in an objectui clone. 21 of 21 are declarations, and 0 are unresolved. The containers.tsx anchors on the edited page.json line are declarations too. Negative control: one bogus path and two bogus symbols gave 3 of 3 unresolved. The clone was read only, and its git status stayed empty.
  • check-spec-docblock-symbol-anchors, with OBJECTUI_CHECKOUT set to that clone and without it: the same verdict, exit 0 both times. "4888 anchors … 3 cross-repo … 0 NEW line anchors on tracked targets survive (199 citations name no tracked file …)". None of the 3 cross-repo anchors is objectui:, so the variable had nothing to judge in spec source.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) derived 81 commands. The list is the same as on the pre-merge head. Each command was run with its exit code captured before any pipe, then reconciled with --ran: "81 derived famil(ies) accounted for — 78 run, 3 NOT-MEASURED".
    • 77 exited 0. They include check:liveness, check:docs, check:api-surface, check:authorable-surface, check:empty-state, check:issue-citations, check:nul-bytes, check:doc-authoring, check-closing-keyword-parity and lint's check:doc-formula-expressions (after building @objectstack/formula, @objectstack/sdui-parser and @objectstack/lint).
    • 3 exited 3, prerequisite not met: check:dual-build-cjs-loads, check:i18n-walk-parity and check:lean-entry-closure. They read the built output of packages this diff does not touch (every dist, packages/cli/dist, packages/objectql/dist). This is a declared narrowing, and CI's Lint & Repo Gates runs them.
    • 1 exited 1, and it comes from the base: check:platform-checklist. It reports the same 7 ABSENT SYMBOL findings PR docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 #23591 reported (areas/access-security.json 5, attachments-storage.json 1, search.json 1), plus that area's anchor floor (27 against 28). This PR touches none of those paths.
  • pnpm --filter @objectstack/spec run check:generated: "All 14 generated artifacts are up to date".
  • Census on head: 4 .tsx:NNN lines and 5 on the wide instrument, with group R still at 22.

Acceptance notes

  • Census class, stated. This PR moves the file:line spelling: the third spelling PR docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 #23591 left. Symbol-only mentions of renderer components in prose stay, as they did in PRs docs(spec): component-member read points to the ledger, part 1 of 3 #23589 to docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 #23591. Examples are "objectui's ActionParamDialog" and "the console's filter builder". They name no file or line, and a pin hop cannot falsify them.
  • Observed, not filed (carrier: none). Existing ledger rows this card did not move into still cite objectui by line. Examples: app.json navigation.order (NavigationRenderer.tsx:1154, :913 at objectui @940ba24; at b9814b334 the sort is packages/layout/src/navOrder.ts#byNavOrder), translation.json objects (useObjectLabel.ts:397-400), view.json list.kanban, list.emptyState and list.aria. Ruling item 2 governs the spelling of moved records. Respelling the ledger's older entries is not a defect class, and this card does not claim it.
  • Observed, not filed. Three census sentences say "at the .objectui-sha pin" without naming the tree: VIEW_CONSOLE_ROUND_TRIP_KEYS, the switcher row-state docblock in ui/view.zod.ts, and view-console-round-trip-keys.test.ts. No gate ties them to the pin any more, so a pin hop forces nothing. Naming the tree the spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) #20456 census used would make them dated readings.
  • Retirement test, applied. ui/app.zod.ts:963 sits in the areas[].order retirement docblock (retired 17.0.0), and ui/dashboard.zod.ts:1462 in the widgets[].aria removal record (call graph closed 2026-08-04). Both are parts of retirement records, so ruling 6181034096 keeps them as dated history. The app.zod.ts line no longer points at the sort at the pin. As history it is not re-measured.
  • No ablation: no tested behaviour changed.
  • No label written: a published file changes and a patch changeset is present, so skip-changeset does not apply.

Generated by Claude Code

…ss rows

Ten live read-point records in packages/spec/src named an objectui file by
line with no SHA. Each moves into the note of its liveness row as
`objectui @sha FILE#SYMBOL`, re-read at objectui b9814b334, and the source
comment names the row. The view.json list.exportOptions note is respelled
by symbol. Retirement history and the two records with no ledger row stay.

Claude-Session: https://claude.ai/code/session_01LFqdRsuM5nkqoJdHd5ztVk
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec, touching 4 documentable anchor(s). ⚠️ 6 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/field.json, packages/spec/liveness/page.json, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/concepts/metadata-driven.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/external-datasources.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/field-types.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/data-modeling/validation-rules.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/deployment/troubleshooting.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/deployment/validating-metadata.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/getting-started/quick-reference.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/kernel/contracts/data-engine.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/backward-compatibility.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/objectql/types.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/protocol/objectui/concept.mdx (via FieldSchema (symbol, a top-level const))

⛔ 2 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-0.mdx (via FieldSchema (symbol, a top-level const))
  • content/docs/releases/v17/17-1.mdx (via FieldSchema (symbol, a top-level const))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 6 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/field.json, packages/spec/liveness/page.json, …) — pages documenting those are invisible to this run
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • 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 — 142 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 af255525c833a74c0c98e9da1bdfa083725fa39e → packageMentionDocs.

Which tree this was computed on

This run read content/docs from fe32ffc1b973278aefd81cf7482fdcfb0af93c16 — the merge of head 023b160afec657bcedf0ee7787b6abe85beb8996 into base af255525c833a74c0c98e9da1bdfa083725fa39e, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin fe32ffc1b973278aefd81cf7482fdcfb0af93c16 && git checkout fe32ffc1b973278aefd81cf7482fdcfb0af93c16
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin af255525c833a74c0c98e9da1bdfa083725fa39e 023b160afec657bcedf0ee7787b6abe85beb8996 && git checkout -B drift-repro af255525c833a74c0c98e9da1bdfa083725fa39e && git merge --no-ff 023b160afec657bcedf0ee7787b6abe85beb8996

node scripts/docs-audit/affected-docs.mjs --json af255525c833a74c0c98e9da1bdfa083725fa39e

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs af255525c833a74c0c98e9da1bdfa083725fa39e → pass the list as
args.docs, on the commit named under Which tree this was computed on.

…hich stay

The headline claimed packages/spec/src no longer cites an objectui
File.tsx:NNN for a live read point. Two live citations with no ledger row
stay, as the changeset's own last bullet says, so the headline now states
what the diff delivers: the read points that have a liveness row move into
it, and the two without one stay, named below.

Claude-Session: https://claude.ai/code/session_01LFqdRsuM5nkqoJdHd5ztVk
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-15T06:29Z

This is the seat review of record for #23434 (claim 6184826965, rulings 6165388570 letter C and 6181034096 Q2 → A) on head:

023b160afe (5596717198 plus one changeset-only commit from this seat's patch round)

It is not the contract review. That review is owed once at CONTRACT_REVIEW_TIER, because packages/spec/src/** moves (ruling item 5).

  1. Form.
    • Draft to main. The first line is Fixes #23434, and Clause-②: no sits at the start of a line.
    • 11 files, +62/−54. Not governed: check-governed-merges --pr 23621 reads NOT governed, 116 changed lines.
    • One patch changeset for @objectstack/spec. No content/docs/releases/ change.
  2. Against the rulings.
    • Ten live read-point records leave packages/spec/src. Each lands in its liveness row as objectui @b9814b334 FILE#SYMBOL (item 2's spelling), and each source comment names the row.
    • view.json list.exportOptions is respelled by symbol (review 6184726608, residual 2).
    • The new ledger text uses symbols. The ListView.tsx:1343 prefix in list.bulkActionDefs predates this card and is listed below as drift.
    • Two lines stay as retirement history under 6181034096: ui/app.zod.ts (areas[].order) and ui/dashboard.zod.ts (widgets[].aria).
    • Every src edit is comment-only. The dev printed the 6 changed .ts files without comments at base and at head, and all 6 are identical, with a mutation control. No .describe() text moved.
  3. The dev's count. The recount reads 16 lines, not 17, and the landing record's own per-file list sums to 16. Accepted.
  4. Gates.
    • On 5596717198: 41 check-runs, 33 success, 6 skipped, 2 cancelled when the head was superseded, none red.
    • Locally: 81 derived families, 78 run, 3 NOT MEASURED (no built dist, run by CI). check:platform-checklist is red on main's tree, outside this diff.
    • check-spec-docblock-symbol-anchors gave the same verdict with and without OBJECTUI_CHECKOUT. All 21 new anchors resolve to declarations at b9814b334.
    • On 023b160afe (prose only): the closing-keyword parity check and the changeset gates exited 0. CI is converging, and landing waits on every check.
  5. Patch round (this seat).
    • The changeset headline said packages/spec/src "no longer cites an objectui File.tsx:NNN for a live read point". The same changeset kept two such citations, so the headline was false. It now names which read points moved and which stay (023b160afe).
    • The PR body's opening paragraph leaned on the same overstatement, and this seat corrected it through the relay (issue_patch).
  6. Accepted deviations.
    • system/translation.zod.ts is outside the claim's surface. It was fixed in place under os-dev's bounded in-place rule: the same defect class, a mechanical fix, no open PR on the file, and the same gate family. This record amends the claim's surface to the PR's file list.
    • The merge of main, the extra builds that let a lint gate be measured, and the model-free commit trailers (AGENTS.md).
  7. The dev's open question: A. Fixes #23434 stays.
    • Ruling item 1 moves each record "into the matching liveness note". Two live citations have no matching note: ai/build-progress.zod.ts (BuildProgressFrame is not a registered metadata type) and the ViewItemSchema trace in ui/view.zod.ts (outside the liveness walk).
    • Both are named exceptions in the changeset and the PR body, and the landing record will list them. No new card and no widening of what check:liveness governs (no new gate by default).
  8. Out-of-scope findings.
    • check:platform-checklist red on main: dropped here, because the daily watchdog files and owns that card.
    • Pre-existing ledger rows that still cite objectui by line (app.json navigation.order, translation.json objects, the view.json kanban, empty-state and aria rows, and the list.bulkActionDefs prefix): drift, not this card's defect class. Noted in this seat's body, not filed.
  9. Landing terms. First a contract review PASS at CONTRACT_REVIEW_TIER on the head, then every check green. Then the seat marks the PR ready and enables auto-merge. On merge [Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src? #23434 closes, and its pm:* labels leave in the same act.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 023b160afec657bcedf0ee7787b6abe85beb8996
Local-runs: none

Scope read. Card #23434 (body and all 23 comments: rulings of record 6165388570, letter C, and 6181034096, Q2 to A; landing record 6184152953; post-hoc review 6184726608; claim 6184826965; the dev's two newest os-dev-report comments 6185606730 and 6185920936), PR #23621 (body, 11-file list, the three-dot diff against origin/main: +62/-54), and the 52 check-runs on the head. The head is the tip of origin/claude/issue-23434-sha-less-read-points, three commits over merge base 9a6f790a38 (the change f7160d1f2e, the merge 5596717198, the changeset-only 023b160afe); head repo equals base repo. Cited objectui symbols were resolved by git show against b9814b334 in the sibling clone, read only; nothing was built, run or re-run.

Tier. The file list carries packages/spec/src/**/*.zod.ts, the published-schema face, and no governed path, so CONTRACT_REVIEW_TIER is the owed tier.

Gate verdicts (the check-runs on 023b160afe). 52 runs, all completed; every conclusion is success or skipped, none failing, none in progress. Success includes Check Changeset (three runs), Spec property liveness, Governed Surface Queue Guard, Lint & Repo Gates, every Lint and Type Check lane, Test Core 1 to 6, Check PR Size, Flag docs affected by code changes, and The card this PR closes must claim this branch. The skips are by design: Console Pin Gate (.objectui-sha is b9814b334 at the merge base, the head and origin/main), Build Docs, the Dogfood shards, Temporal Conformance, Packed-tarball smoke.

① Derived judgments

Accept set: unchanged, named right. Every hunk in the six .ts files is inside a // or /** */ comment: data/field.zod.ts (the step and dimensions comments), system/translation.zod.ts (the description slot comment), ui/action.zod.ts (the description docblock), ui/bulk-action.zod.ts (the .passthrough() rationale header), ui/i18n-label-resolver.ts (the module docblock), ui/view.zod.ts (the row-decoration header, the ViewFilterRule docblock, the allowAddTab docblock, the sort-entry id docblock). No .describe() string, export, default, refusal or union arm moves, and no content/docs regeneration is in the diff, which agrees with check:docs green inside Lint & Repo Gates. Clause-②: no is the right declaration.

Published surface: prose and ledger evidence, each change named right. @objectstack/spec ships liveness/ and src/**/*.zod.ts in its files[], so the four ledger notes and five of the six .ts files are published text. Every sentence the diff adds was read against the tree it cites:

  1. field.json step: SliderField.tsx#SliderField reads sliderField?.step ?? 1 (:62) and hands it to the Slider (:95). dimensions: VectorField.tsx#VectorField reads vectorField?.dimensions, the value's length when unset (:11). Right.
  2. action.json description (evidence and note): ActionParamDialog.tsx#ActionParamDialog renders it as DialogDescription with the actionDialog.description fallback (:518 to :519); useConsoleActionRuntime.tsx#paramCollectionHandler (:303) and RecordDetailView.tsx#paramCollectionHandler (:1003) feed actionDescription(objForI18n, action?.name, action?.description); useObjectLabel.ts#actionDescription (:618 to :621) resolves actionSuffixes(objectName, actionName, 'description'), and #actionSuffixes (:215 to :222) returns the object address for a bound action and globalActions.{action}.description for an object-less one, never both; objectui#11439 is named at :128, :206 and :558. The object-then-global chain the removed evidence and the two source comments stated is gone at the pin, so the move replaces a false published sentence with a true one. Right, and the new wording in both source comments (one address, never both) matches.
  3. view.json list.filter and list.sort: filter-builder.tsx#FilterBuilder stamps id: crypto.randomUUID() in addCondition (:1414 to :1416); view-config-utils.ts#parseTriplet (:140 to :145) and #parseSingleOrNested (:152 to :159) re-stamp on read-back, both reached from parseSpecFilter (:168); sort-builder.tsx#SortBuilder mints the id in normalize for a row without one (:74 to :77) and in addItem (:104 to :106); view-config-utils.ts#toSortItems (:317 to :319). Right.
  4. view.json list.bulkActionDefs: bulkParamToField.ts#bulkParamToField spreads { ...o, value: String(o.value) } (:175); field-types.ts#SelectOptionMetadata extends SelectOptionBase (:655); select-option.ts#SelectOptionBase carries color, visibleWhen, disabled and icon (:69 to :95); fields/src/index.tsx#SelectCellRenderer reads option?.color (:1903 to :1926); objectql.ts#BulkActionParam types an options entry with an index signature (:580 to :584), citing objectstack#4001 (:569). The closed-type claim the source comment dropped is false at the pin, and the passthrough rationale never rested on it. Right.
  5. view.json list.exportOptions (residual 2 of 6184726608): ObjectGrid.tsx#exportableFormats reads exportOptions?.formats and ?.streaming (:4293 to :4309); #handleExport (:4311) reads maxRecords (:4319), includeHeaders (:4320), fileNamePrefix (:4324) and streaming again for the server-stream choice (:4344). The by-line form is gone and the first measurement at origin/main@878140b is kept as history. Right.
  6. view.json list.userFilters: UserFilters.tsx#UserFilters reads config.allowAddTab (:225) and hands it to #TabFilters (:883), which draws the affordance (:1072) and holds user-added tabs in component state only (:894). Right.
  7. page.json regions: the one change to the 62 KB line is an insertion inside entry [2] (page:tabs, T = containers.tsx#PageTabsRenderer): items[].label via translateLabel(pickLocalized(it.label, language), language, ttLabel) at :854, inside PageTabsRenderer (declared :591), with the same composition in #PageAccordionRenderer at :1153 (declared :1126). Nothing in the entry is removed. Right.
  8. Symbol anchors (ruling item 2): 21 anchors are new (added minus removed) and 0 are removed; all 21 are at b9814b334, the pin on the merge base and on origin/main, and each resolves to a declaration in that tree. Right.
  9. Each source comment now points at its row ("read points recorded in liveness/X.json, row Y"), and every named row exists at head. Nothing is lost on the move: each deleted line's file, symbol and reading is in its row, marked "first cited by line, sha-less; moved out of spec source, [Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src? #23434". Right.
  10. Census, reproduced with the body's own instrument on 9a6f790a38 and on the head: 16 .tsx:NNN lines in the eight files on the base (the landing record's 17 sums to 16 in its own per-file list) and 4 at head; group R 22 and 22, so the control holds. The four that stay are the four the body names: ai/build-progress.zod.ts:100 (with :102), ui/app.zod.ts:963, ui/dashboard.zod.ts:1462, ui/view.zod.ts:5281 (5283 on the base). The wide instrument's one extra non-R hit at head, system/http-server.zod.ts:238, cites this repo's packages/runtime/src/middleware.ts, not objectui. Right to leave all of them; the dispositions are judged under ③.
  11. Retirement-history stays (app.zod.ts areas[].order, dashboard.zod.ts widgets[].aria): both lines sit inside retirement records, the class ruling 6181034096 keeps as dated history. Right.

Nothing in the diff is named wrong.

② Semver level

.changeset/23434-sha-less-read-points.md declares '@objectstack/spec': patch, carries the body line Clause-②: no and no (widening) or (narrowing) arm; the PR body carries the same Clause-②: no. The diff publishes (the ledger JSON and the .zod.ts prose ship in the package, and the docblocks reach dist), so skip-changeset would be wrong, and no label is written. patch is the right level: evidence prose only, no accept-set, export or default change, so minor is not owed. The changeset's claims match the diff: ten moved records named by file and row (field step and dimensions; action description from two files; list.bulkActionDefs; list.filter and list.sort from two docblocks and the header; list.userFilters; page regions), the two stale renderer claims, the list.exportOptions respell, and an "Unchanged on purpose" list naming both retirement stays and both no-row stays. Its closing sentence ("No schema, type, export, default, accept or refuse change. No .describe() text changed.") is true against the diff. Check Changeset is green on all three runs. Clause-②: no is right.

③ Boundary flags

Flag 1, the open_questions entry (6185606730): does the card close with two no-row citations left in published source? Answered: yes, option A; Fixes #23434 stays. Ruling 6165388570 item 1 binds the mechanism "moves into the matching liveness/*.json note", and neither record has a matching note. BuildProgressFrame is not a governed type (check-liveness.mts: GOVERNED at :279, SPEC_ONLY_SCHEMAS at :479, where query and realtime_subscription were each enrolled by their own card), so a row means widening what check:liveness governs, which the ruling did not authorize and the card's own premise ("no option changes a schema, a type, an export or a default") leaves outside. The ViewItemSchema trace is a write-path rationale for the strict/passthrough split (updateView PUTs { ...current, ...partial }), not a key's read point, and the viewItem arm has no rows. Neither is pin-tied: the build-progress record is already a dated reading at dda8f3815 whose own text says "line numbers drift, the two symbols are the anchor", and the ViewItem trace names no sha and no pin. The test 6181034096 applied to retirement history (a pin hop can never force the rewrite; the failure is loud and one revert away; no floor moves) passes for both. The exceptions are named in the published changeset, so the claim is as narrow as the delivery. Two residuals, neither blocking: (a) this reading narrows item 1's last sentence the way 6181034096 did, so the seat presents it for the maintainer's recognition in its closing table, where an overturn is a new ruling; (b) view.json already has a _note, a non-widening home for the ViewItem trace that the dev's option B bundled with the enrolment, so if the maintainer wants the sentence literal, that half is a few lines on a small card.

Flag 2, the file-surface deviation (6185606730): packages/spec/src/system/translation.zod.ts is outside claim 6184826965. Answered: right to include. The bounded in-place exemption in .claude/agents/os-dev.md (same defect class; mechanical fix in a pinned shape; no other claim holds the file; same gate family, no new verification surface) holds on its face: the hunk is the same record, the action-description chain, on the translation slot, comment-only; leaving it would have left a now-contradicted sentence in a file that ships while action.json says the chain is gone. The exemption owes two things: the PR body names the fix with evidence (done, under "Bounded in-place fix"), and the claim's file surface is amended in the same round, which is not yet on the card (neither the claim nor the seat's ACCEPT 6185994982 lists the file). That amendment is a seat write on the card, owed before the queue; it is not a defect of the diff.

The other dev flags, each answered. Count 17 against 16: 16 reproduced on the base; the landing record's figure was a summing error, right to report. The merge of origin/main 9a6f790a38 before the PR: the three-dot diff is unchanged (11 files, +62/-54), and the two spec PRs it brought (#23600, #23601) touch no file here. The changeset-only patch commit 023b160afe: the headline now says which read points moved and which stay, matching the diff, and no build input moved. The commit-trailer and extra-build notes concern no published surface; no model identifier is in the PR title, body or changeset. Nothing is escalated.

Implemented-by: claude/issue-23434-sha-less-read-points
Reviewed-by: session_01LFqdRsuM5nkqoJdHd5ztVk

VERDICT: PASS

Reading taken at 2026-10-15T07:11Z, on the head's check-runs, the net diff and the card's comments; nothing built, run or re-run.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 15, 2026 07:14
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 15, 2026 07:14
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 7a96bf8 Oct 15, 2026
56 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23434-sha-less-read-points branch October 15, 2026 07:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src?

2 participants