Skip to content

docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 - #23591

Merged
objectstack-fleet[bot] merged 19 commits into
mainfrom
claude/issue-23434-pin-citations-pr2
Oct 15, 2026
Merged

objectstack-fleet[bot] merged 19 commits into
mainfrom
claude/issue-23434-pin-citations-pr2

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Part of #23434

Clause-②: no

Part 3 of 3 of PR-2 for issue 23434. The issue stays open after it lands, for the remainder named below. It executes ruling 6165388570 (letter C, items 1 and 4) and ruling 6181034096 (Q2 → A, Q1 → A), under claim 6181304005. Parts 1 and 2 are #23589 and #23590, which move the records in packages/spec/src/ui/component.zod.ts. All three branch from origin/main; none is stacked on another.

What this part changes

Item 1, group C outside component.zod.ts. The component-member read points in component.test.ts move into liveness/page.json, row regions, as do those in the component-*.pin.test.ts family (action-member params, form custom-fields, form / list / metric families, object-grid declared keys and typed members, objectui-held members, z.unknown() members, report-items / action members), the record-block tests (approvals / attachments, field security, record blocks, reference rail), the action-row and element-navigation tests, expression-bindable-text-keys.zod.ts, object-refinement-check-exports.test.ts, page.zod.ts and inline-grid-column-carriers.test.ts. Where a test record carried a reading the ledger lacked, it became an entry or a clause of an entry: the page:tabs retired type, the icon vocabulary table, the static-params drop, the drill-down writer pins, the grid's AggregationType, the page-builder guide, the object-manager dialog writer, the bindable-text rows, PageComponent.visibleWhen roots and the PLANNED dataSource API binding. object-refinement-check-exports.test.ts's two mirror citations went to their own rows (view.json list.appearance, dashboard.json widgets), not to page.regions.

Item 2, the two held-back moves, applied as PR-1's hold-back reversed (git diff 7fe6ffdde1 7ebc084841 over the four files, which were byte-identical on origin/main):

  • src/ui/dataset.zod.ts → liveness/dataset.json, row measures.format.
  • src/data/api-methods-batch-conformance.test.ts → liveness/object.json, row enable.apiMethods.

Item 3, the other spellings, each into its matching row as objectui @SHA FILE#SYMBOL. Every symbol was resolved at that SHA, and a sha-less citation was re-read at a named tree:

source row
ui/action-declarative-update.ts (.objectui-sha pin b9814b334; landed with #23494 after PR-1) action.json operation
ui/navigation-target.ts, ui/action-url-target-scheme-set.test.ts (objectui 7578323) action.json target
ui/app.zod.ts viewName rule (sha-less pin) app.json navigation.viewName
ui/bulk-action.zod.ts promoted route (objectui main dca25aff2) view.json list.bulkActionDefs
ui/dashboard.zod.ts #20960 census (objectui main 5262f7dd) dashboard.json widgets.options
ui/dashboard.zod.ts mirror check (sha-less pin) dashboard.json widgets (already recorded by PR-1)
ui/view.zod.ts groupByField consumer (objectui dda8f3815) view.json list.kanban
ui/view.zod.ts empty-state link (objectui b9814b334, four File.tsx:NNN) view.json list.emptyState (+ page.json interfaceConfig)
ui/view.zod.ts form-layout twin (sha-less pin) page.json regions (already in the list)
ui/list-view-export-options.ts, ui/view.test.ts (origin/main@878140b) view.json list.exportOptions (already recorded)
data/field.form.ts hint face (sha-less pin) field.json relatedListFilter
data/field.zod.ts currency width (sha-less pin) field.json currencyConfig
data/field.zod.ts lookup snake twins (objectui ed971e8) field.json lookupColumns
shared/editability-boundary.ts per-option disabled (objectui main aca27fa) field.json options
system/i18n-resolver.ts resolveFlowScreenTitle caller (sha-less pin) translation.json flows.screens (already recorded)
system/metadata-form-zod-reconciliation.test.ts emptyState omit reason (objectui 7af0ab3); #23568 has since removed that omit row on main, and the merge took main's side page.json interfaceConfig; the 7af0ab3 reading is kept there in the past tense
page.zod.ts emptyState hand-off (InterfaceListPage.tsx:509) page.json interfaceConfig (already recorded)

Also: content/docs/references/ui/expression-bindable-text-keys.mdx is regenerated (check-generated.ts --fix), and .changeset/23434-component-read-points-part-3.md is a @objectstack/spec patch.

Changed lines: 1,754 (+336 / -1,418) across 49 files, under the 3,000-line review line. Head be8657fa44, which contains merge 7ea3bb007d of origin/main.

Census, base 7ffc57846a → all three parts merged

Group C = the ComponentPropsMap member read points (seat 3's 99). Group R = retirement history, which ruling 6181034096 (Q2 → A) keeps in place.

reading base after all three parts
retired gate --list, historical `.objectui-sha` pin SHA spelling: group C 66 0
same: action-declarative-update.ts (landed with #23494 after PR-1; item 3) 1 0
same: group R 34 34 (unchanged)
retired gate's quoted-first-line assertions (component.zod.ts) 6 0 (the quoted line is now in the entry)
PR-1's dated respell "objectui b9814b334 (re-read there 2026-10-14 …" 27 0
wide census, component files: .objectui-sha pin with SHA / sha-less / objectui SHA 65 / 24 / 170 0 / 0 / 14 (14 = objectui commit references such as "since objectui ce991bd70", which are not read points)
wide census, group R files (H / S / O) 36 / 8 / 30 36 / 8 / 30 (unchanged)
wide census, other files, item 3 (H / S / O) 2 / 12 / 38 0 / 5 / 16 (the remainder is listed in part 3)

page.regions note: 120 entries, 62,138 characters. No schema or gate caps a note's length. Only evidence and producer are path-scanned by check:liveness, and note is free text that the lint layer never shows an author.

How the three parts were measured

The three parts were built from one verified union branch, claude/issue-23434-pin-citations-pr2 at 1646d39e53 (all three parts' changes in one tree). The split was then checked mechanically:

  • git merge-tree of part 1 + part 2 + part 3 onto origin/main gives a tree whose packages/spec and content match the union head exactly (empty diff). The three parts merge in any order without conflict. They share one changed line in packages/spec/liveness/page.json (the regions note), and it is byte-identical in all three.
  • Comment-only: every changed .ts file was parsed with TypeScript and compared with origin/main on its code tokens, JSDoc and comments excluded. All published files are identical. In this part's head, five string literals changed across two test files: two test names, one why reason string, and the two pieces of one assertion message. No schema, type, export, default, accept or refuse change, and no .describe() text change.
  • Every objectui @SHA FILE#SYMBOL in the new evidence list and in the edited ledger notes was resolved against an objectui clone at that SHA: the file exists and the symbol occurs in it. 656 references in the 120 entries and 32 in the other notes; 0 unresolved. A negative control (a bogus path and two bogus symbols) reported 3 of 3.

Union head 1646d39e53, through scripts/pm/os-verify-lock.sh:

  • pnpm --filter @objectstack/spec build: VERDICT command-exit 0.
  • check-generated.ts --fix: 1 of 14 artefacts stale (content/docs/references/ui/expression-bindable-text-keys.mdx, from part 3's shortened docblock), regenerated. The re-check afterwards: "All 14 generated artifacts are up to date".
  • pnpm --filter @objectstack/spec typecheck (tsc, scripts and test typecheck): exit 0.
  • vitest run --project local: Test Files 678 passed (678), Tests 20728 passed, 1 todo.
  • vitest run --project repo: Test Files 61 passed (61), Tests 1033 passed.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, each exit code captured before any pipe, then --ran: "103 derived famil(ies) accounted for — 99 run, 4 NOT-MEASURED". The 4 recorded exit 3 (prerequisite not built): lint check:doc-formula-expressions, check:dual-build-cjs-loads, check:i18n, check:lean-entry-closure. One RED that comes from the base, not this diff: check:platform-checklist exits 1 with ABSENT SYMBOL findings in docs/qa/platform-checklist/areas/{access-security,attachments-storage,search}.json. They point at packages/metadata-protocol and service-storage, which no part touches; PR-1 reported the same findings. The other 98 exited 0, including check:liveness, check:nul-bytes, check:issue-citations and check-spec-docblock-symbol-anchors. On the anchors gate, "citations name no tracked file" went from 1965 on the base to 228.

This part's head be8657fa44: merge 7ea3bb007d of origin/main, then the past-tense fix to the page.json interfaceConfig note. Every run below was taken after the last commit, in a fresh worktree:

  • Spec build: VERDICT command-exit 0. typecheck: exit 0.
  • vitest run --project local: Test Files 678 passed (678), Tests 20728 passed, 1 todo. --project repo: Test Files 61 passed (61), Tests 1033 passed. Lock VERDICT command-exit 0. The targeted run first, src/system/metadata-form-zod-reconciliation and src/ui/component: Test Files 28 passed (28), Tests 1542 passed.
  • check:generated ("All 14 generated artifacts are up to date"), check:liveness, check:issue-citations, check-spec-docblock-symbol-anchors and check:nul-bytes: all exit 0.
  • dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, then --ran: "111 derived famil(ies) accounted for — 111 run, 0 NOT-MEASURED". No STALE TREE note. Seven families first exited 3 because the fresh worktree had no built prerequisites. After pnpm turbo run build --concurrency=2 (lock VERDICT 0), all seven re-ran at exit 0: lint check:doc-formula-expressions and check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:dual-build-cjs-loads, check:i18n and check:lean-entry-closure. 110 exit 0. One RED, from the base: check:platform-checklist, exit 1, the same 7 ABSENT SYMBOL findings (areas/access-security.json 5, attachments-storage.json 1, search.json 1); no part touches those paths.

Acceptance notes

Deviations from the claim, stated rather than chosen silently:

  1. Split by file range, not strictly by item. The measured union diff is 7,395 changed lines. Item 1 alone is over 3,000, because component.zod.ts alone is 5,675 lines. So component.zod.ts splits into two halves at an unchanged 33-line gap (parts 1 and 2, 2,770 and 2,931 lines). Item 1's remaining files ride here with items 2 and 3. Every part carries the identical page.regions line so that each part's ledger is complete; a git merge-tree of all three onto origin/main reproduces the verified union tree.
  2. The claim's item 1 names component.zod.ts only. Seat 3's group C, the 99 that ruling 6181034096 counts, spans 15 files: component.zod.ts, component.test.ts, the component-*.pin tests, expression-bindable-text-keys.zod.ts, object-refinement-check-exports.test.ts, page.zod.ts and inline-grid-column-carriers.test.ts. I followed the ruling's 99. Some tombstone docblocks inside component.zod.ts (sortField, resizableColumns, defaultSort, quickAdd, form layout inline/grid) were moved, per seat 3's file-based classification. Their migrations/entries and retirement-test counterparts (group R) are untouched.
  3. Branches. Part 3 lands from the claimed branch. Its history holds the WIP commits of the verified union, which a squash discards. Parts 1 and 2 are new branches cut from origin/main.

Left in place on purpose (census remainder after all three parts):

  • Retirement history, the class ruling 6181034096 keeps. It is not limited to the 40 in the ruling's three locations: integration/connector.test.ts (errorMapping retired, objectui 0d8fd7c), system/email-template.zod.ts (category / isSystem retired), ui/app.zod.ts (homePageId tombstone, objectui @785b8a5d), ui/dashboard.zod.ts (actionUrl / actionType / actionIcon removed, objectui@91757a7), ui/view.zod.ts (responsive / performance removed, objectui@fb35e48) and api/export-job-family-retirement.test.ts.
  • No matching ledger row, so reported here and given no invented row:
    • ai/build-progress.zod.ts (objectui dda8f3815; the build-progress phase vocabulary; no ledger file covers AI stream frames).
    • api/dataset-selection.test.ts (objectui @98178b2; the five call sites that build a runtime DatasetSelection, which is a request rather than dataset metadata).
    • system/metadata-form-zod-reconciliation.test.ts:578-579 (seven view keys the ledger walk cannot hold, as that comment itself says).
    • ui/view-console-round-trip-keys.test.ts:19,42 and the matching ui/view.zod.ts round-trip census (VIEW_CONSOLE_ROUND_TRIP_KEYS, sha-less pin); the walk stops at the union's container arm.
  • objectui commit references, which mark a change and are not read points: 14 in the component files, plus kernel/functional-completeness.ts (afb228418, 5f4514f7b, fec3b1a8b, 04a67b9dc), ui/bulk-action.zod.ts (29b99490), and ui/page.zod.ts / ui/view.zod.ts (b434f5f47, 0253416). Three of these sentences said "at the pin"; they now read "on the console this repo ships" or use the past tense.
  • A third spelling, outside the claim's two. These are sha-less File.tsx:NNN citations with neither a SHA nor a pin mention. They do not claim to track the pin, so a pin hop never forces their rewrite. There are 17 lines in 8 published source files: ai/build-progress.zod.ts, data/field.zod.ts (2), ui/action.zod.ts (3), ui/app.zod.ts, ui/bulk-action.zod.ts, ui/dashboard.zod.ts, ui/i18n-label-resolver.ts and ui/view.zod.ts (6). There are also 40 in tests: 30 of them in the pin tests name the objectui TEST file a fixture's shape was copied from (writer provenance, not a renderer read point). These stay for a later round under [Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src? #23434, which stays open: ruling item 1's last sentence covers them.

Measured drift (zone 2):

  • Counts: group C is 66 historical spellings on the retired gate's --list, plus the respelled ones (27 of PR-1's "re-read there 2026-10-14" form across the component files and the two held-back files). Group R holds at 34 historical citations, unchanged. One new live historical citation landed after PR-1: ui/action-declarative-update.ts (fix(spec)!: page action rows carry ActionSchema's declarative-update rules, read from one judge #23494), moved here.
  • Note capacity: nothing caps a note. regions now holds 62,138 characters.
  • Only read points moved: commit references, in-repo anchors and retirement records stayed. Each record's per-hop chain went with its read points.
  • One stale claim was dropped rather than moved. component.test.ts said the tree renderer reads data through the 'undeclared' arm (true at objectui 87af769e9). At objectui b9814b334 it is the 'view-data' arm. The ledger entry records the current reading.

Merge note: #23568 removed the interfaceConfig.emptyState omit row from metadata-form-zod-reconciliation.test.ts on main. The merge (7ea3bb007d) took main's side, and this part no longer touches that file.

  • No ablation: no tested behaviour changed.
  • No label written: skip-changeset does not apply, because a published file changes and the patch changeset is present.

Generated by Claude Code

claude added 17 commits October 15, 2026 00:26
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0121ooBYRmS8ziFXm9ai5YHm
…hangeset

component.zod.ts's moves ship as two separate pull requests so each stays
under the 3000-line review line; this branch carries the tests, the other
group-C files, the two held-back moves and the other spellings.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0121ooBYRmS8ziFXm9ai5YHm
One conflict, packages/spec/src/system/metadata-form-zod-reconciliation.test.ts:
main (1692cd1, #23568) deleted the page / interfaceConfig / emptyState
omit row whose why string this branch had edited. Resolved by taking main's
side: the row's own text said it leaves once the renderer half lands.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

13 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/analytics.mdx (via DatasetMeasureSchema (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))
  • content/docs/protocol/objectui/layout-dsl.mdx (via PageComponentSchema (symbol, a top-level const))

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

  • content/docs/releases/v15.mdx (via PageComponentSchema (symbol, a top-level const))
  • 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/v17/17-7.mdx (via PageComponentSchema (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
  • 17 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/app.json, packages/spec/liveness/dashboard.json, …) — pages documenting those are invisible to this run
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • 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 744b73f53f716ea45cc1078c403db0d42761cbab → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 63448079ef93f64d7797b396fa7179429e232e3b — the merge of head be8657fa446caddb5ec4de9777016c103621fe10 into base 744b73f53f716ea45cc1078c403db0d42761cbab, 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 63448079ef93f64d7797b396fa7179429e232e3b && git checkout 63448079ef93f64d7797b396fa7179429e232e3b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 744b73f53f716ea45cc1078c403db0d42761cbab be8657fa446caddb5ec4de9777016c103621fe10 && git checkout -B drift-repro 744b73f53f716ea45cc1078c403db0d42761cbab && git merge --no-ff be8657fa446caddb5ec4de9777016c103621fe10

node scripts/docs-audit/affected-docs.mjs --json 744b73f53f716ea45cc1078c403db0d42761cbab

⚠️ 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 744b73f53f716ea45cc1078c403db0d42761cbab → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

domain:spec seat 4 (#18917) · sunhaolin · session session_0121ooBYRmS8ziFXm9ai5YHm · claim 6181304005 on #23434 · reviewed head be8657fa446caddb5ec4de9777016c103621fe10 · 2026-10-15T03:31Z

Verdict: ACCEPT. Not governed (check-governed-merges --pr 23591). 49 files, +336 / −1,418, under the 3,000-line line. Prose and ledger-note work with Clause-②: no, so no contract review is owed; this record is the review.

  1. Shape.
  2. Scope against the claim.
    • Items 1 (group C outside component.zod.ts), 2 (the two held-back moves) and 3 (the other spellings) are done; split as the claim set it.
    • The card stays open for one remainder, by this seat's reading of ruling 6165388570's item 1 ("The published spec source carries no renderer citation after this"): 17 sha-less File.tsx:NNN lines in 8 published files, listed in this PR's acceptance notes.
  3. Merge round.
    • main's feat(spec): the page form offers the list page's own empty state, interfaceConfig.emptyState #23568 removed the interfaceConfig.emptyState omit row whose why text this branch edited. Merge 7ea3bb007d takes main's side, and this PR no longer touches metadata-form-zod-reconciliation.test.ts.
    • The page.json interfaceConfig note now records that reading in the past tense.
    • git merge-tree against origin/main 2372e0a7b7 (parts 1 and 2 already merged) is clean.
    • The dev's report gave the head as be8657fa446c9a0b…. Only the first 12 characters are right; git reads be8657fa446caddb…, and that is the head reviewed here.
  4. Seat readings, taken on this head.
    • Code. I compared parser-accurate token streams (AST leaves, JSDoc excluded) of all 39 changed .ts files against merge base 744b73f53f. Every published file is identical. The only differences are string literals in two test files: a test name in component-element-navigation-17987.test.ts, and two message strings in component-props-unknown-members.pin.test.ts.
    • Ledger. I deep-compared the 8 changed liveness/*.json files against the base. Every changed path is a note; no verdict, evidence or producer moved. The regions note is byte-identical to the one parts 1 and 2 landed.
    • Evidence. All 29 objectui @SHA FILE#SYMBOL references in the notes this part edits outside regions resolve at their own SHAs, across 8 trees. In every one, the file exists and the symbol occurs.
    • CI. On this head: 48 check-runs, 41 success, 7 skipped, 0 other. The skip roster answers OK.
    • Changeset. Its headline says live read points no longer tie to an objectui commit or the console pin. Its "Unchanged on purpose" bullet names the exception: citations with no ledger row stay, and the PR lists them. Read together, the note is accurate.
  5. Accepted deviations.
  6. Out-of-scope dispositions.
  7. Landing clauses.
    • (a) Every check is green or skipped by design: met at this record.
    • (b) mergeable_state is clean at enqueue: read at landing.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 15, 2026 03:32
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 15, 2026 03:32
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 56b2612 Oct 15, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23434-pin-citations-pr2 branch October 15, 2026 04:04
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: be8657fa446caddb5ec4de9777016c103621fe10
Local-runs: none

① Derived judgments

Post-hoc review of PR #23591 (part 3 of 3 of PR-2 for card #23434), judged as if it were still waiting to enter the queue. Inputs: the card body and every comment (rulings 6165388570 and 6181034096; dev reports 6168538808, 6170782619, 6183204136, 6183710619), the PR body and file list, the net diff 744b73f53f..be8657fa44 (49 files, +336 / -1,418; the head carries the merge 7ea3bb007d of main, and 744b73f53f is the merge base, so nothing of main's is in that diff), and the 50 check-runs on the head. Every reading below is a git show / git diff of fetched refs in this repo, or a git show / git grep of the sibling objectui clone at the cited SHA; nothing was built, run or re-run.

Accept set: unchanged (right). Of the 38 changed .ts files, 36 are byte-identical to 744b73f53f once comments are stripped (string literals kept). The two that differ are test files, and they differ by exactly five string literals: src/ui/component-element-navigation-17987.test.ts (one it(…) name) and src/ui/component-props-unknown-members.pin.test.ts (one why reason string, the definition list's toText line; the two concatenated pieces of one assertion message; one it(…) name). Test files are not in files[] and are not compiled into dist, so none of that ships; none is a schema, a .describe(), an export or a default. No Zod shape, strict door, refinement, export or type changed anywhere in the diff. Test Core (6 of 6 shards) is green on the head.

Published surface that does change, all of it prose or ledger, all right:

  1. Docblocks in published .zod.ts sources (files[] lists src/**/*.zod.ts; the .d.ts docblocks follow): data/field.zod.ts (head 456-460 the currencyConfig.precision retirement; 1713-1715 the lookup snake-case twins), ui/app.zod.ts (433-434), ui/bulk-action.zod.ts (158-159), ui/dashboard.zod.ts (269-271, 694-695), ui/dataset.zod.ts (280-289, a 118-line hop chain replaced by a six-line reading), ui/expression-bindable-text-keys.zod.ts (49-57 the read-point table loses its three file names, 66), ui/page.zod.ts (320-322, 425, 433, 646-650, 657, 673, 926-930), ui/view.zod.ts (1310-1311, 1897-1904, 2632-2635, 4244-4245). Each replaces an objectui file-and-line, a SHA, or a "at the .objectui-sha pin" phrase with a pointer to a ledger row.
  2. Docblocks in published non-zod modules, which ship compiled with their .d.ts docblocks: data/field.form.ts (215-217), kernel/functional-completeness.ts (290-291, 310-311, 327), shared/editability-boundary.ts (24-30), system/i18n-resolver.ts (4284-4286), ui/action-declarative-update.ts (16-17), ui/list-view-export-options.ts (119-120), ui/navigation-target.ts (28-30).
  3. Eight ledger files (files[] lists liveness), each note gaining one dated, symbol-spelled clause (objectui @SHA FILE#SYMBOL, no line numbers; ruling 6165388570 item 2): action.json operation, target; app.json navigation.viewName; dashboard.json widgets.options; dataset.json measures.format; field.json currencyConfig, lookupColumns, options, relatedListFilter; object.json enable.apiMethods; page.json interfaceConfig (and regions, the 120-entry list byte-identical to parts 1 and 2, sha256 prefix bf5b96cec57d); view.json list.appearance, list.bulkActionDefs, list.emptyState, list.kanban. No status, evidence, producer or verifiedAt changes; check:liveness reads evidence and producer, not note; Spec property liveness is green.
  4. One generated docs page, content/docs/references/ui/expression-bindable-text-keys.mdx (head 51-72), regenerated from the header docblock of expression-bindable-text-keys.zod.ts; its new text is that docblock's new text, and check:docs (inside the green TypeScript Type Check job, which has no paths filter) confirms it is current. The table there loses the three renderer file names and keeps the key sets; the reader is sent to page.regions entry [118], which records them by symbol (statistic.tsx#StatisticRenderer, card.tsx#CardRenderer, button.tsx#ButtonRenderer, and the deliberate text omission).

Sentences that could now be false: none found. Checked, with the tree each reading was taken against:

  • Item-3 rows read against the objectui clone, symbols present: at b9814b334 ObjectView.tsx#activeViewId and #buildViewTabs (app navigation.viewName); ActionRunner.ts isUpdateOperationAction (action operation); SchemaForm.tsx#resolveFieldFace and widgets.tsx#WIDGETS (field relatedListFilter); CurrencyField.tsx#CurrencyField, number-format.ts#currencyDisplayWidth, currency.ts#currencyFractionDigits (field currencyConfig); dataset-format.ts#formatMeasureDate, date-display.ts#absoluteFallbackOptions, #formatRelativeDate (dataset measures.format); ObjectGrid.tsx#selectionMode, #hasBulkActions, #rowDeleteVerdict, #dispatchBulkAction, useBulkExecutor.ts#useBulkExecutor (object enable.apiMethods); ListEmptyState.tsx#addRecordAction (its line 131, with EmptyStateLink at 153; view list.emptyState); InterfaceListPage.tsx line 509 emptyState: cfg.emptyState ?? view.emptyState (page interfaceConfig); FlowRunner.tsx lines 210 and 311 still import and call resolveFlowScreenTitle (the i18n-resolver.ts sentence "it still imports it"). At 7af0ab3 InterfaceListPage.tsx line 503 emptyState: view.emptyState, so the past-tense clause the head's last commit added to page.json interfaceConfig ("handed ListView the source view's emptyState only; at objectui @b9814b334 the same symbol hands cfg.emptyState ?? view.emptyState") is true. At 7578323 navigationTarget.ts#classifyNavigationTarget and __tests__/navigationTarget.mailto-12191.test.ts (action target); at ed971e8 LookupField.tsx#lookupPageSize, #explicitAllowCreate; at aca27fa SelectField.tsx#SingleSelectField, RadioField.tsx#hostGroupProps, select.tsx#SelectRenderer; at dda8f3815 ListView.tsx#laneField, ObjectGantt.tsx#groupByAccessor, ObjectTimeline.tsx#effectiveItems. Not read here because the shallow clone lacks the SHA: 5262f7dd (dashboard widgets.options), dca25aff2 (view list.bulkActionDefs), a472b07167a3 and 53ded82bf7a4 (view list.appearance), 82a9417 (entry [118]); CI does not read them either. The dev's 32-of-32 resolution of the other notes (PR body) is the only full reading, and the sample agrees with it.
  • The three "already recorded" pointers resolve to rows that hold the read point at the base 744b73f53f: translation.json flows.screens (the FlowRunner overlay, read at objectui @f8a9d0fb; moved by PR-1), dashboard.json widgets (the @object-ui/types DashboardWidgetSchema .shape mirror at objectui @53ded82bf7a4; PR-1), view.json list.exportOptions (ObjectGrid.tsx five keys at origin/main@878140b). The last of these still carries line numbers (:1596-:1611); that is a pre-existing note outside this diff, and ruling item 2's symbol spelling would be a one-line follow-up there, not a finding against this PR.
  • The empty-state link's four read points (view.zod.ts 1897-1904 used to cite ListView.tsx:5716, ListEmptyState.tsx:153, ObjectGrid.tsx:6897-6899, InterfaceListPage.tsx:509) are all still findable: the ListView hand-off and the ObjectGrid draw site stay in view.json list.emptyState's existing sentence and in page.regions entry [34] (B#renderedGridContent (EmptyStateLink)), the ListEmptyState site is the new symbol clause, the InterfaceListPage site is in page.json interfaceConfig. The sentence at 1897-1899 names two rows while the ObjectGrid symbol lives in a third (page.json regions); imprecise, not false, and nothing is lost.
  • Prose respells (dev report 6183204136 deviation 5), each read: functional-completeness.ts 290-291 says objectui#10101 (afb228418) is in "the console this repo ships", the same claim the base made ("which the pin now contains"); .objectui-sha is b9814b334 at both ends of this diff, so the diff does not change its truth (the SHA is not in the shallow clone, so not re-read here). view.zod.ts 2632-2635 restates the chart-floor history relative to objectui 0253416 and drops the claim about "the pin"; a weaker sentence, true whatever the pin. dashboard.test.ts says "measured against the console this repo ships". component.test.ts drops the claim that the tree renderer reads data through the 'undeclared' arm: at b9814b334 ObjectTree.tsx passes 'view-data' (2 occurrences; 'undeclared' once, in a comment), and entry [104] records P#dataConfig (resolveRecordSourceConfig with the view-data arm). The dropped claim was stale, so the diff removes a false sentence rather than adding one.
  • page.zod.ts 425 ("Measured on the renderer: … ApiDataSource issues every read … with an explicit method: 'GET'") and 433 ("No renderer reads this binding yet"): entry [119] and the page.json _note (the spec(ui): a page element dataSource can name an API endpoint (provider: 'api'), so a product page composes from a control-plane summary in metadata instead of a product-specific React widget (maintainer ruling 2026-10-12) #23016 PLANNED record, measured at objectui @7578323a544e) carry the dated readings; ApiDataSource.ts#ApiDataSource and element-data-source.ts#isElementDataSourceConfig are present at that SHA.
  • The two held-back moves are PR-1's deferred hunks applied in reverse: dataset.zod.ts 280-289 now describes the formatter's behaviour without a file or line and points at dataset.json measures.format, whose new clause names formatMeasure, formatMeasureDate, formatDate, absoluteFallbackOptions, formatRelativeDate, formatDateTime at b9814b334; api-methods-batch-conformance.test.ts keeps its assertions (tokens identical) and its 222 chain lines become a two-line pointer at object.json enable.apiMethods.
  • Left in place on purpose and correctly: retirement history (group R, ruling 6181034096), objectui commit references that mark a change, in-repo anchors, the four citations with no ledger row (listed in the PR body under "No matching ledger row", given no invented row, as claim 6181304005 item 3 orders), and the third spelling (below, ③). After the three landings, main at 56b2612778 carries .objectui-sha in non-test packages/spec/src files only inside conversions/registry.ts and migrations/entries/**, the group-R locations.
  • The file this branch had conflicted on, system/metadata-form-zod-reconciliation.test.ts, is not in the 49-file list: the merge took main's copy (feat(spec): the page form offers the list page's own empty state, interfaceConfig.emptyState #23568, 1692cd1505), so this PR no longer edits it, as the body's merge note says.

Comment- and ledger-note-only on the published surface: yes. This part publishes changed docblock prose, ledger notes and one regenerated docs page, and nothing else.

Landing check (post-hoc): the squash 56b2612778 has the same git patch-id --stable as 744b73f53f..be8657fa44 once page.json is excluded (the regions line was already on main from part 2); page.json on main after the landing hashes equal to this head's for both regions and interfaceConfig. Nothing landed that this review did not read.

② Semver level

.changeset/23434-component-read-points-part-3.md declares '@objectstack/spec': patch and carries Clause-②: no; the PR body's third line is Clause-②: no. Both are right. The packed tarball changes (published .zod.ts sources, dist docblocks and liveness notes), so a changeset is owed and skip-changeset would be wrong; no accept set widens or narrows (the five test-string edits publish nothing; no .describe() text changed), so no with no arm is the correct declaration and patch is its level (yes would demand at least minor; nothing narrows). The changeset body names what moved and what stays, as ruling 6165388570 item 5 asks. The regenerated content/docs/references/** page is the AUTO-GEN artifact of the docblock and is committed with it, as the spec-artifact rule requires; it is not a release-owned page. Check Changeset is green on the head (both runs).

③ Boundary flags

Every flag and open_questions entry on the card's four os-dev-report comments, with its disposition as read from the rulings, the seat readings and this diff (not from the seat's ACCEPT lines):

flag where disposition
Q1: home of the ComponentPropsMap citations 6168538808 A. Seat reading 6168576479, confirmed by ruling 6181034096 ("Q1 A as the seat read it"). Executed: the component tests, expression-bindable-text-keys.zod.ts, page.zod.ts and inline-grid-column-carriers.test.ts point at page.regions; the two mirror citations in object-refinement-check-exports.test.ts went to view.json list.appearance and dashboard.json widgets (their own rows), not to page.regions. No verdict, no new row. Answered.
Q2: the 40 retirement-history citations 6168538808 A by ruling 6181034096. This diff touches no file under migrations/entries/**, not conversions/registry.ts, no retirement test; the body's "Unchanged on purpose" list names the further retirement history it left alone. Answered.
Q3: delivery shape 6168538808 A by seat reading 6168576479; PR-1 (#23502) landed as 1418de4c7. Answered.
other spellings (objectui SHA … File.tsx:NNN, sha-less pin mentions) 6170782619 A, measured first: seat review 6171000736 item 3 and claim 6181304005 item 3. Executed here as the item-3 table (17 rows), each into a matching row or reported with no invented row. Answered.
third spelling: 17 sha-less File.tsx:NNN lines in 8 published files, 40 in tests 6183204136 open question Left in place (6183710619: "untouched, as the PM ruled"). This PR's first line is Part of #23434 (Part-of PR must not also close its card green, both runs) and its body says they stay for a later round under the card, which is open with pm:queue and no assignee. Escalated into the card's remainder, not closed over. Until that round lands, the last sentence of ruling 6165388570 item 1 ("The published spec source carries no renderer citation after this") is not yet fully true; recorded here, not a defect of this diff. The dev's option A (a follow-up card) was not taken; keeping the ruled card open is an equivalent escalation.
split by file range, not by item 6183204136 deviation 1 Claim 6181304005 ordered a split by item, each under 3,000 lines; item 1 alone cannot meet that, so parts 1 and 2 split component.zod.ts and this part carries item 1's other files with items 2 and 3. This part is 1,754 changed lines; Check PR Size is green. Stated in the PR body. Accepted.
the claim names component.zod.ts only; group C spans 15 files; tombstone docblocks moved 6183204136 deviation 2 Ruling 6181034096 counts seat 3's 99 (15 files) and outranks the claim's shorter wording; the 14 other group-C files are this part's. The tombstone entries are labelled tombstone or retired and assert nothing; group R is untouched. Answered; no contract effect.
branches: part 3 on the claimed branch with the union's WIP history; parts 1 and 2 cut fresh 6183204136 deviation 3 The card this PR closes must claim this branch is green on the head; the squash discards the WIP commits (56b2612778 is one commit). Process; nothing to answer.
item 3 went past the two named spellings for three SHA-carrying citations (list-view-export-options.ts, view.test.ts origin/main@878140b; editability-boundary.ts aca27fa) 6183204136 deviation 4 Within ruling item 1 (a renderer citation in published source, whatever its spelling). Each now points at a row that holds the read point (view.json list.exportOptions at the base; field.json options in this diff). Answered.
prose-only respells; one stale claim dropped in component.test.ts 6183204136 deviation 5 Each read above under "Sentences that could now be false"; none false, one falsehood removed. Answered.
commit trailers: os-dev.md against the harness reminder 6183204136 deviation 6 Decided by AGENTS.md's commit-message rule (model-free trailer pair; the pre-push hook refuses a model id). The landed squash 56b2612778 carries Co-authored-by: Claude and no model id. Answered by the repo rule; no contract effect.
metadata-form-zod-reconciliation.test.ts omit row still marked PLANNED after the renderer shipped 6183204136 out-of-scope 1 Overtaken: #23568 (1692cd1505) removed the row on main; the merge 7ea3bb007d took main's side and the file is not in this diff. The reading it carried (objectui @7af0ab3) is kept in page.json interfaceConfig in the past tense. Answered.
check:platform-checklist red base-side, 7 ABSENT SYMBOL anchors 6183204136, 6183710619 out-of-scope Carrier named (the platform-checklist area owner), not filed. Outside this diff; Lint & Repo Gates is green on this head, so CI does not show it. Noted.
PR #23591's body not edited by the dev; prepared body left for the seat 6183710619 deviation 1 The live body carries all seven described edits: first line Part of #23434; the item-3 row for metadata-form-zod-reconciliation.test.ts with the #23568 note; the merge note; the third-spelling note; 1,754 (+336 / -1,418), 49 files, head be8657fa44 with merge 7ea3bb007d; "five string literals across two test files"; the be8657fa44 evidence block. Answered. The same comment's last sentence flags that #23589's and #23590's bodies still say "Part 3 carries the issue's closing line": they do. Unanswered; a stale sentence in two merged PR bodies, not on the published surface; the fix is one body edit each, or a correcting comment, by the seat. Not a FAIL.
push order (push before the long battery, no commit after); worktree cleanup; no env value printed 6183710619 deviations 2-3; 6183204136 deviations 7-8 Every reported run names be8657fa44, the reviewed head. Hygiene; nothing to answer.

Check-runs on the head: 50 (two trigger events, the push at 02:52 and the body change at 03:28), of which 43 success and 7 skipped by path filter or by the second event (Console Pin Gate, the Dogfood shards and Verify CLI, Packed-tarball smoke, Temporal Conformance, and the second event's Auto Label and Check PR Size; each name that matters has a success run); 0 failures. The five required contexts are green: Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard (both runs). Build Docs is success because a docs page changed. No governed path is in the file list.

Implemented-by: claude/issue-23434-pin-citations-pr2
Reviewed-by: session_0121ooBYRmS8ziFXm9ai5YHm

VERDICT: PASS

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.

2 participants