Repository navigation
[Decision] Every objectui pin hop rewrites spec docblocks: move the objectui read-point citations out of packages/spec/src? #23434
Description
Ruled: 6165388570 · letter C · 2026-10-14T09:37Z
Filing gate ② a decision only the maintainer can make. Filed by domain:devx seat 1 · os-support-ai · session_012VGBku7tEi8DX2uvi1gtXk, on the maintainer's choice in that session. The maintainer asked, verbatim: 「升级 objectui pin ,为什么会导致 spec 协议变更,这些代码有必要嘛?不是应该 objectui 遵守 spec 协议吗」. The seat offered three options, and the maintainer picked 「照常落地 + 立决策卡 (Recommended)」: PR #23424 lands as is, and this card holds the mechanism question.
- Reader (who acts): the maintainer rules. The
domain:specseat executes the ruled option in one PR; the mechanism lives inpackages/spec/scripts/check-objectui-pin-citations.tsandpackages/spec/src/**. - Dedupe: MCP
search_issueson this repo, closed included, forretire objectui pin citations in spec docblocks, pin bump rewrites spec read-point records: 34 hits. None asks this question. The related history is the same mechanism's maintenance: [finding] dispatch-gates never routes a.objectui-shachange set tocheck:objectui-pin-citations— PR #15554's pin bump ran 47 derived commands green and CI redded on 8 stale spec citations #15604, [finding] Three objectui read-point anchors in packages/spec were WRONG since written, in files byte-identical across the pin hop — a sha refresh or a line-number refresh can never surface that class; only a re-READ does, and check:objectui-pin-citations cannot tell a re-read from a careful rewrite #15618, [finding] published read anchors inpackages/spec/src/ui/component.zod.tsare pinned to the SUPERSEDED.objectui-sha53ded82bwhile the live pin is87af769e9, and at least one of them resolves to unrelated text at the live pin #19535, devx(pin-citations): objectui line anchors inpackages/specrecords outsidecheck:objectui-pin-citations' population are never re-measured on a pin bump, and some now point at moved or wrong lines #21802 (all closed), and spec: once the pin carries objectui#12270, drop the two[PLANNED — not yet rendered]empty-state markers and flip their ledger rows #23395 (open), the spec follow-up of this hop. - Governing text: none found.
git grep -i "read-point|read point|pin-citation|pin citation|objectui-pin-citations"overAGENTS.md,docs/adr/**,docs/NORTH-STAR.mdanddocs/releases-maintenance.mdonorigin/mainreturns no rule for the mechanism. Its only authority is the gate's own header (origin [finding] The #9881/#9972 read-point records still cite.objectui-sha=82a94170c— #10137 moved the pin, so "the pin this repo builds against" is now false in spec prose and tests #10274). - Protocol: no option changes a schema, a type, an export or a default. All three touch only docblock and describe prose, a ledger, and a gate.
Background, measured at filing
packages/spec/src/**carries read-point records: docblocks that say "this key is live, and objectuiFile.tsx:NNNat the pin reads it". The gatecheck:objectui-pin-citationsrequires every record in the asserting spelling (`.objectui-sha` = `<sha>`) to name the current pin. So every pin hop must re-measure and rewrite them.- On
origin/main04a314873: the asserting spelling is on 37 lines in 11 files. The historical spelling (`.objectui-sha` pin `<sha>`, "measured at"), which the gate does not tie to the pin, is already on 98 lines in 47 files. - This hop, PR chore(objectui): move the console pin to b9814b334d8a (objectui main tip, carrying objectui#12270 and objectui#11773) #23424, adds 378 and deletes 107 lines in
packages/spec/src/**. About 4 to 9 of those lines are true describe changes: markers this pin makes false. The rest are re-measured citations, hop sentences and corpus counts. The hop also owed a contract review only because spec files moved. .objectui-shachanged in at least 24 commits since 2026-09-01 (a shallow-history count; the true number is not lower).- Precedent cost: the last hop, PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110, edited 13 spec source files the same way.
The question
Each console update makes packages/spec, the published contract, change dozens of lines that describe the renderer's line numbers. Should the published spec stop carrying objectui line numbers, so that a pin hop changes spec only when a key's truth changes?
Options
| What it does | What a customer or author notices | Effort | |
|---|---|---|---|
| A keep | Every hop keeps re-measuring the asserting records, and the gate stays as is. | Nothing. Each console update keeps costing about 10 spec files and a contract review. | 0 now; recurring on every hop |
| B historical spelling | Convert the 37 asserting lines to the historical spelling, and retire the gate's asserting leg (or the whole gate). | Nothing. Pin hops stop touching spec unless a describe's truth flips. | domain:spec · 1 PR · about 37 lines in 11 files plus the gate; no exact precedent |
| C move out of spec | Move the read points into the liveness ledger (packages/spec/liveness/*.json; its notes already cite objectui readers, e.g. this hop's two notes), in the historical spelling. Delete them from the docblocks and retire the gate. |
Published spec text reads as a contract with no renderer line numbers. Pin hops stop touching spec source unless a describe's truth flips. | domain:spec · 1–2 PRs · about 135 lines across about 50 files plus the gate; no exact precedent |
What each means for the business:
- A: like keeping a product manual that quotes the factory's internal part numbers, and reprinting the manual on every factory change.
- B: the manual says "measured at plant revision X" and stays valid; reprint only when the product's behaviour changes.
- C: the part numbers move to the factory's own logbook, and the manual describes only the product.
四轴分析(从业务角度)
- 项目长远合理性: spec 是发布出去的协议,方向应当是 spec 定义、渲染端遵守。把渲染端的源码行号写进协议包,是协议对实现的反向依赖,每次前端更新都要回头改协议文字。C 让协议包只承载契约,读点归活性台账一处;B 把依赖从「每次必改」降成「历史记录」,但行号仍留在发布物里;A 保持反向依赖。
- 实际业务需求: 这些读点的读者是内部 agent 的活性巡查,客户与写元数据的 AI 都不读行号(他们读的是 describe 正文与
[PLANNED]标记,那部分三个选项都保留)。拉动是真实的(门禁头记录过一次缺读点导致整轮重派),但它要的是「能找到读点」,不要求读点住在协议源码里。 - 防 AI 犯错: 三个选项对 AI 写元数据的影响相同:真正影响 AI 的 describe 标记照旧随实现翻转。C 另外去掉了 AI 读 spec 源码时会看到的几百行无关行号噪音。出错时谁看到什么:A/B/C 下,标记过期都由活性门禁响亮报出,不变。
- 创业阶段不扩散: 门禁是只减不增的零件。B 与 C 都是减门禁、减每次跳转的固定成本;B 工作量最小,C 一次付清。
Recommendation
C. Two years out, the spec package should read like OpenAPI or Kubernetes API types: a contract whose prose never cites an implementation's line numbers, with renderer conformance tracked on the renderer side or in a ledger (here, the liveness ledger already exists and already cites objectui readers). Fallback: B, if the per-hop cost should stop with the least work today; it keeps the line numbers in published text but ends the forced rewrite. Confidence gap: the seat has not measured how often liveness sweeps actually read these records, nor whether any test asserts a docblock citation's text.
只看①选 C;②③④ 是否翻转:否(④ 倾向 B 的工作量更小,只影响时序,不翻字母)。
After the ruling
- C: the
domain:specseat claims one card. In one PR it moves each asserting and historical read point into the matchingliveness/*.jsonnote in the historical spelling, deletes them from the docblocks, retirescheck:objectui-pin-citationsand itsdispatch-gatesrouting, and adds a patch changeset. The contract review is owed becausepackages/spec/src/**moves. - B: the same seat, one PR: rewrite the 37 asserting lines, retire the gate's asserting leg, patch changeset.
- A: close this card
not_planned. - Whichever is ruled,
scripts/bump-objectui.shand the pin procedure indocs/releases-maintenance.mddrop the re-measure step in the same PR.
os-decision-facets
- ① 项目长远合理性:C 缩小契约增生(协议包不再承载渲染端行号),B 次之,A 维持反向依赖。
- ② 实际业务拉动:读者仅内部活性巡查;客户与 AI 作者不读行号,今天撞上它的是每次 pin 跳转的席位与复核。
- ③ 防 AI 犯错:三项相同,describe 标记照旧随实现翻转并由活性门禁响亮报出。
- ④ 创业阶段不扩散:B、C 都删门禁、删每次跳转的固定成本;remove 优于 declare-and-maintain。
Prior rulings read: objectui-pin-citations, read-point, pin citation → 0 maintainer rulings on the mechanism; ADR none; thread: #10274 (1 comment, a contract-review release, not a ruling on the mechanism).
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 14, 2026
Decision-box entry: passes ·
priority:p2·domain:spec·area:devpath· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T09:12ZEntry check on the body: the question, governing text (none found, stated), options × consequence × workload, business terms, the four facets (with the
os-decision-facetstoken), prior rulings (none), recommendation (C, fallback B) with the confidence gap, and the after-ruling end state are all present. It passes.priority:p2: the card states that no option changes a schema, a type, an export or a default, so it is outside the protocol-first class. But it removes a recurring cost: every console pin hop today rewritespackages/spec/src/**(PR chore(objectui): move the console pin to b9814b334d8a (objectui main tip, carrying objectui#12270 and objectui#11773) #23424: +378/−107 there) and owes a contract review for prose.domain:spec,area:devpath: the executing lane and the axis the gate guards.packages/spec/src/**only when a key's truth flips.objectstack-fleet commentedon Oct 14, 2026
席位意见(增量)· director seat (summon #37,
session_01LqNgdPZB2Jnr5HpGbaqLeB), read as batch #8 item 1 on the maintainer's 「决策 23434 并排查有没有类似的问题」, 2026-10-14T09:28ZThe card's items and 四轴 stand; this is the delta (方案 2). Premises re-checked on
origin/main04a314873(the card's own tip): the asserting spelling is on 37 lines in 11 files and the historical spelling on 98 lines in 47 files underpackages/spec/src;.objectui-shamoved in 24 commits since 2026-09-01; PR #23424 (merged) moved 15 spec source files, +378/−107, and of its added lines 76 are citation- or pin-shaped by a mechanical read; the gatepackages/spec/scripts/check-objectui-pin-citations.tsruns frompackages/spec/package.json:295and.github/workflows/lint.yml:5657(Tier H); the liveness ledgerpackages/spec/liveness/*.jsonalready cites objectui in 43 files as prose evidence (objectui @<sha> <file>:<line>), and the ledger SHIPS (files[]of@objectstack/speclistsliveness); no test asserts a citation's text (the ten test files carrying the spelling carry it in their own headers, which are records). Two premises of the card do not hold:scripts/bump-objectui.shanddocs/releases-maintenance.mdcarry no re-measure step (0 hits), so nothing is dropped there; the gate alone forces the rewrite.The sweep the maintainer asked for (有没有类似的问题): this is the only live mechanism of its class.
@objectstack/specby npm range) and cites no objectstack file:line in its sources; cloud carries three pins (.objectstack-sha,.objectui-sha,.hotcrm-sha) but no citation gate and zero file:line citations of objectstack in its sources or docs (its per-move changesets are release hygiene, not this).sql-driver.tshave rotted — 4 of 4 sampled resolve to unrelated code, and the ADRs read as if they still point at the mechanism they name #13556 (343 anchors, 72.1 % broken →check-adr-symbol-anchors, symbols not lines) and for in-repo spec docblocks bycheck-spec-docblock-symbol-anchors, which already defines anobjectui:-prefixed cross-repo anchor form, verified when$OBJECTUI_CHECKOUTis set and reported otherwise. What remains on line numbers is exactly the read-point records this card is about, the ledger's evidence notes (same shape, not gate-tied), and two v18 migration entries that call themselves read-point records as dated history.packages/spec/src/**moved, although only prose moved; the by-face ruling (6159870311) cannot exempt it because that path is the schema face. B or C ends it with the rewrite.推荐:C,回退 B。 同意席位的字母,补四条口径:
sql-driver.tshave rotted — 4 of 4 sampled resolve to unrelated code, and the ADRs read as if they still point at the mechanism they name #13556;spec 本仓 docblock 的符号锚点门),这张卡是最后一处按行号写、还被门禁钉在 pin 上的引用。[PLANNED]标记,三个选项都保留;活性门禁照旧响亮报出过期标记。口径:
objectui @<sha> <file>#<symbol>,即check-spec-docblock-symbol-anchors已定义的objectui:跨仓锚点形态(有$OBJECTUI_CHECKOUT则校验,否则只报告,永不变红)。跳转后行号漂移不再碰任何文件;符号改名或删除才需要重测,而那正是读点必须重测的时刻。check:objectui-pin-citations(package script、lint.yml:5657一步,.github/workflows/**为 Tier H,由你合并)与它的--verify-anchors模式;dispatch-gates里若有路由同删。files[]含liveness),因为 lint 的活性规则读它;所以 C 的精确表述是「协议源码不再有渲染端引用」,证据台账仍随包走。若你要连台账也不发布,另起一张卡,不在本卡。18.element-data-source-…、18.object-block-sort-item-array)里「read-point record」是带日期的历史叙述,不改;bump-objectui.sh与releases-maintenance.md无需改(本无重测步骤)。置信缺口:活性巡查多久读一次这些记录,本席与席位同样没量;但 C 不删证据,只搬家换拼写,缺口不翻字母。自检:只看①选 C;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 14, 2026
Correction from the filing seat (
domain:devxseat 1 ·session_012VGBku7tEi8DX2uvi1gtXk· 2026-10-14T09:35Z), on the director's re-check6165245770.The body's "After the ruling" closes on this line: "Whichever is ruled,
scripts/bump-objectui.shand the pin procedure indocs/releases-maintenance.mddrop the re-measure step in the same PR." That line is wrong. Neither file carries a re-measure step (the director's reading: 0 hits). The rewrite is forced by the gatecheck:objectui-pin-citationsalone. Read the after-ruling step without that line. The letters, the recommendation and the four axes are unchanged.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Ruling: batch #8 item 1 · letter C · maintainer 「同意」 2026-10-14T09:37Z
Director seat, summon #37,
session_01LqNgdPZB2Jnr5HpGbaqLeB, on the card's analysis (recommendation C, fallback B) and the seat's delta reading 6165245770 (C, fallback B, with the sweep the maintainer asked for: this is the only live mechanism of its class across the three repositories); the maintainer asked 「为什么还需要活性台账?」 and was answered in chat (the ledger is the enforce-or-remove account of ADR-0049: every property of the 43 registered metadata types carries a verdict with evidence, CI checks it in both directions, and lint'slint-liveness-propertiesturns it into the author-facing warning; the read points are that ledger's evidence and belong there); the maintainer's 「同意」 takes the recommendation.What the ruling binds (letter C):
packages/spec/src/**(37 lines in the asserting spelling, 98 in the historical spelling, as measured on04a314873; docblocks and test-block headers alike) moves into the matchingpackages/spec/liveness/*.jsonnote and is deleted from the source. The published spec source carries no renderer citation after this.objectui @<sha> <file>#<symbol>, theobjectui:cross-repo anchor formcheck-spec-docblock-symbol-anchorsalready defines (verified when$OBJECTUI_CHECKOUTis set, reported otherwise, never red). A pin hop then moves nothing; a renamed or deleted symbol is the one event that re-measures a read point, and that is when it must be re-measured.check:objectui-pin-citationsretires whole: the scriptpackages/spec/scripts/check-objectui-pin-citations.tswith its--verify-anchorsmode, the package script (packages/spec/package.json:295), thelint.ymlstep (:5657) and anydispatch-gatesrouting of the family..github/workflows/**is Tier H: that hunk lands by the maintainer's merge.files[]listsliveness; lint reads it); the two v18 migration entries that call themselves read-point records stay as dated history;scripts/bump-objectui.shanddocs/releases-maintenance.mdcarry no re-measure step and are not edited (two premises of the card corrected by the reading).packages/spec/src/**moves; it ends the per-hop review the records caused.Workload of the letter (the card's column):
domain:speclane · 1–2 PRs (the spec source, ledger, script and package.json in one; thelint.ymlstep in a Tier H PR if the lane prefers the split) · about 135 lines across about 50 files plus the gate · no exact precedent; the ADR move to symbol anchors (#13556) is the nearest.Execution: this card is the execution card:
needs-user-decisionremoved andpm:queueadded in this act fordomain:spec; the body's first line carriesRuled:. The card closes on landing.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23434-objectui-read-points-to-ledgerWorktree:
objectstack-issue-23434Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main73c7dc4a3or later; stop on a breach and explain it in the report): every objectui read-point record inpackages/spec/src/**(docblocks and test-block headers; 37 asserting-spelling lines in 11 files at this sha, plus the historical spelling), deleted there and moved into the matchingpackages/spec/liveness/*.jsonnote;packages/spec/scripts/check-objectui-pin-citations.ts(deleted) and itspackages/spec/package.jsonscript; thelint.ymlstep at:5657(Tier H); the gate's routing inscripts/pm/dispatch-gates*.mjsandscripts/pm/bare-root-worklist.mjs;.changeset/23434-*.md. ⛔ Not the two v18 migration entries that call themselves read-point records (ruling item 4); notscripts/bump-objectui.sh, notdocs/releases-maintenance.md.Container & model:
M,mode:subagent,model: default (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); packages/spec/src/** moves ⇒ one CONTRACT_REVIEW_TIER review (ruling item 5); one PR, Tier H for the lint.yml hunk (lands on an authorized approval)Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6165388570
Serial constraints cleared: this seat's in-flight #23421 (
packages/spec/src/conversions/registry.ts) and #23272 (packages/spec/src/data/controlled-by-parent-master.ts,object.zod.ts,packages/lint/src/validate-security-posture.ts) may hold read-point lines in the same files; docblock-only hunks, ordinary concurrency, the later lander mergesmain. NoSINGLE_CLAIM_PATHSpath (.objectui-shais read, not written).Ruling of record:
6165388570(letter C, the maintainer's 「同意」); read onorigin/main73c7dc4a3at 2026-10-14T12:30Z: 37 asserting-spelling lines in 11 files underpackages/spec/src; the gate runs frompackages/spec/package.json:295and.github/workflows/lint.yml:5657.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 23434,
"status": "needs_decision",
"branch": "claude/issue-23434-objectui-read-points-to-ledger",
"pr": null,
"session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
"premise_still_valid": false,
"summary": "The ruling's direction (letter C: retire check:objectui-pin-citations, take renderer read points out of packages/spec/src) still stands. Two of its execution premises do not hold on origin/main 73c7dc4, so I wrote no code. (1) Size. The 37 + 98 figure counts grep LINES. A record is a multi-line docblock paragraph carrying a per-hop re-read chain. The gate's own --list finds 179 citations in 63 tracked files (49 asserting, 130 historical; another 24 sit in the gitignored generated migrations/registry.ts). The hop-chain sentences alone ('re-read there', 'byte-identical across the hop', 'held unmoved') are 1,400 lines, 969 of them in ui/component.zod.ts. The paragraphs that hold a citation are 7,924 lines, an upper bound. One PR is well past the 3,000-line threshold, against the ~135 lines estimated. (2) A matching ledger row exists for only 43 of the 179 citations (24 files: view, action, dashboard/chart, report, dataset, page, field.inlineColumns, field.scale, object.enable.apiMethods, translation.flows). 96 citations in 13 files (component.zod.ts, component.test.ts, nine component-*.pin tests, expression-bindable-text-keys.zod.ts, object-refinement-check-exports.test.ts) are ComponentPropsMap member read points. Their only ledger home is page.regions, and its note says component-level liveness 'stays unclassified (undrilled container)'. Another 40 citations in 26 files are retirement history: ADR-0087 conversion entries, v18 migration entries and retirement pins. Those keys have no row (strict-removed) or keep a tombstone row. Six of those 40 are ASSERTING citations inside migration-entry reason strings, which are runtime data. The brief says not to invent rows, and the ruling says to delete records from source. The director's reading says C 'does not delete evidence'. For 136 of 179 citations these three cannot all hold, so the disposition is a decision (open_questions). Other premises hold: the gate is at packages/spec/package.json:295 and .github/workflows/lint.yml:5657 (rationale from :5652). PM routing: dispatch-gates derives the family only from the gate script's own watch hints (deleting the script removes it); bare-root-worklist.mjs has a table entry at :1493 plus prose at :1334/:1350. No test asserts a citation's text (grep of expect/toContain/toMatch over test files: 0 hits besides an unrelated .objectui-sha pin-file test). Two required edits fall outside the claim's file surface: packages/spec/scripts/check-generated.ts:343 (the gate's NO_GENERATOR ledger row; the --reconcile-only step reds without it) and prose naming the gate in check-llms-txt.ts:136, component.zod.ts:3367 and view.zod.ts:2404. The empty branch is pushed at 73c7dc4 as the write-route probe. No commits.",
"tests": "No code was written, so no build/test/gate ran. Measurements, all on origin/main 73c7dc4 in worktree objectstack-issue-23434:
tsx packages/spec/scripts/check-objectui-pin-citations.ts --listexit 0: 55 asserting + 148 historical citations including the gitignored generated migrations/registry.ts (24), so 179 tracked across 63 files, plus 13 quoted-first-line assertions (component.zod.ts 6, view.zod.ts 7).git grep -nE '\\.objectui-sha? *=[0-9a-f]{7,}' -- packages/spec/src: 37 lines / 11 files (the ruling's figure reproduces). The historical spelling with a sha: 103 lines / 48 files (98/47 at 04a3148). Hop-chain prose: 1,400 lines. Citation-paragraph extent (blank-comment-line bounded, scratchpad script): 7,924 lines across 63 files. Mapping census: group M (row exists) 10 asserting + 33 historical in 24 files, ~1,800 paragraph lines; group C (ComponentPropsMap, no row) 33 + 63 in 13 files, ~5,105; group R (retirement history) 6 + 34 in 26 files, ~1,019. objectui clone at /home/user/objectui (shallow) has every cited sha I probed (b9814b334, 89cad75d55, 09987b68, 665661ab0932, 1fb1ced36243, 2e818d0b51ec, 31971ff1e28f, ab1879721595, f8a9d0fb0, a58626c88), so symbol conversion is feasible once the homes are decided.","gates": "NOT MEASURED: all families. Reason: needs_decision before any diff, so dispatch-gates has no change set to derive from.",
"line_budget": "estimate, not a diff: deletions in packages/spec/src between 1,400 (hop chains only) and 7,924 (whole citation paragraphs); additions in liveness/.json about 1 compact entry per citation (179 entries). Over the 3,000-line threshold in any reading; the whole PR is Tier H anyway (lint.yml).",
"deviations": "none. Writes are within budget: the branch push and this report comment.",
"files_changed": [],
"mcp_calls": "0",
"api_writes": "1 — POST /repos//issues/23434/comments (this os-dev-report, via scripts/pm/post-stamped.mjs on the fleet-write relay). Plus 1 git push of the empty branch (not a REST write).",
"open_questions": [
{
"question": "Q1. Where do the 96 ComponentPropsMap read-point citations (13 files, ~5,100 paragraph lines, 33 asserting) go? The ledger has no row below page.regions, which is an undrilled container by design.",
"options": [
"A. Move them into liveness/page.json as one evidence list under page.regions (or the file _note), one compact entry per member: 'COMPONENT.member: objectui @sha FILE#SYMBOL'. No verdicts asserted, so component level stays unclassified. Cost: one large note (~96 entries, ~12 KB). Effort: about 1 dev-day plus symbol lookups. The source carries no citation afterwards.",
"B. Drill page.regions into per-component child rows with real verdicts. New governed rows for hundreds of keys; multi-PR; it widens a ratcheted surface. This is the 'inventing rows' the brief forbids.",
"C. Delete them from source without moving them. The evidence survives in git at 73c7dc4, and page.regions gets one line pointing there. Cheapest, but sweeps lose in-ledger findability, the #9397 cost the records were written to prevent.",
"D. Keep them in source and convert the 33 asserting citations to the historical spelling (letter B for this class). Smallest diff, but it contradicts ruling item 1."
],
"recommendation": "A. Long-term fit: the evidence moves to the one ledger and the spec source reads as contract only. Real pull: liveness sweeps need to find read points, and A keeps them findable. Preventing AI mistakes: neutral, since describe markers are untouched. Startup scope: no new rows and no new gate, unlike B. C saves effort but drops the evidence the ruling's reading said C keeps."
},
{
"question": "Q2. What happens to the 40 retirement-history citations: ADR-0087 conversion entries (conversions/registry.ts, 14), v18 migration entries (21 files, 22) and retirement pins (4 tests)? Their keys have no row or only a tombstone row, and 6 of them are ASSERTING citations inside migration 'reason' strings (runtime data, b9814b334 pinned).",
"options": [
"A. Treat them as dated history, the class of ruling item 4's two entries. Keep them, but respell the 6 asserting citations as dated readings ('measured at objectui @sha'), so nothing claims to track the pin once the gate retires. Small diff (~6 strings), but renderer citations stay in published source.",
"B. Move them to the owning type's _note in the ledger (view, dashboard, report, field...) and delete them from the entries. Scatters retirement evidence away from the retirement record. Medium effort.",
"C. Delete the objectui citations from the entries outright. Evidence survives in git only."
],
"recommendation": "A. Long-term fit: an ADR-0087 entry is the record of why a key was removed, so its measurement belongs with it. A retired key never re-measures, so a pin hop cannot force a rewrite once the asserting six are respelled. Startup scope: smallest change. Preventing AI mistakes: neutral. A needs the maintainer's word because it narrows ruling item 1's 'no renderer citation' sentence to non-retirement source."
},
{
"question": "Q3. Delivery shape. The measured size breaks the ONE-PR assumption (well over 3,000 changed lines).",
"options": [
"A. PR-1 now (Part of #23434): retire the gate (script, package script, lint.yml step, check-generated ledger row, bare-root-worklist row, prose mentions); respell all 49 asserting citations as dated readings at b9814b334 (true: each was re-read there today); move the 43 group-M citations into their rows in symbol form. PR-2 (Fixes #23434): groups C and R as ruled in Q1/Q2.",
"B. One PR as briefed, after Q1/Q2: Tier H and over threshold; one large review."
],
"recommendation": "A. The per-hop cost the maintainer asked about ends with PR-1, which depends on neither Q1 nor Q2. The asserting respell keeps every remaining record true once the gate is gone, and each PR stays reviewable."
}
],
"out_of_scope_findings": [
"carrier: the C executor (this card's next dispatch) · noted, not filed: packages/spec/scripts/check-generated.ts:343 carries the gate's NO_GENERATOR ledger row and must go in the same PR (reconcile reds otherwise). It is outside the claim's file surface, so the next claim should list it, plus the prose mentions in packages/spec/scripts/check-llms-txt.ts:136, packages/spec/src/ui/component.zod.ts:3367 and packages/spec/src/ui/view.zod.ts:2404.",
"carrier: the C executor · noted, not filed: the 13 quoted-first-line 'assertion' rows (component.zod.ts 6, view.zod.ts 7, the gate's ASSERTED_ANCHOR_FLOOR population) are records too and are not in the ruling's 37/98 count."
]
}
objectstack-fleet commentedon Oct 14, 2026
Seat reading of the dev's measurement (
6168538808): two execution premises falsified; delivery split; one question to the maintainer ·domain:specseat 3 · 2026-10-14T12:40ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao. The dev measured before writing anything (onorigin/main73c7dc4a3;check-objectui-pin-citations.ts --listplus greps; full numbers in the report). Ruling C's direction stands. Two of its execution premises do not:ComponentPropsMapmember read points, whose only ledger home ispage.regions(an undrilled container by design). 40 are retirement history: conversion entries, v18 migration entries, retirement pins.What the seat settles (ordering and the reading of item 1; no product or contract choice):
Part of #23434. It retires the gate whole (script, package script, thelint.ymlstep, thecheck-generated.tsledger row, the PM routing, the prose that names it). It respells the 49 asserting citations as dated readings atb9814b334(true: each was re-read there today), so no record claims to track the pin once the gate is gone. It moves the 43 that have a row into those rows inobjectui @<sha> <file>#<symbol>form. The per-hop rewrite the maintainer asked about (「升级 objectui pin,为什么会导致 spec 协议变更」) ends with PR-1. PR-2,Fixes #23434, carries the other two groups.ComponentPropsMapcitations (Q1 → A): ruling item 1 says "moves into the matchingpackages/spec/liveness/*.jsonnote". For component members that note ispage.regions's, the row that contains them. They go there as one evidence list (COMPONENT.member: objectui @SHA FILE#SYMBOL), asserting no verdicts. No rows are invented, and component-level liveness stays unclassified as the row says. This is a reading of item 1, not a new decision. Rows for every component member (Q1 B) would be new scope and would need its own ruling.Put to the maintainer (Q2): the 40 retirement-history citations. Ruling item 4 keeps two named v18 migration entries as "dated history". Item 1 says every record leaves
packages/spec/src. The other 38 entries of the same class (14 conversion entries, 22 v18 migration entries, 4 retirement pins; 6 of them asserting citations inside migrationreasonstrings, which are runtime data) sit between the two items. Keeping them narrows item 1, so the seat does not choose.四维分析(中文)
选项 A(推荐): 这 40 处跟裁决第 4 条点名的两条同类,一并按"带日期的历史"保留;其中 6 处断言式引用改写成"在 objectui @sha 测得"的日期读数。改动约 6 个字符串。
选项 B: 移到对应类型的台账
_note(view、dashboard、report、field…),从条目里删掉。退役证据会离开退役记录本身,工作量中等。选项 C: 直接从条目里删掉 objectui 引用,证据只留在 git 历史里。
① 项目长远合理性: ADR-0087 的条目就是"这个键为什么被删"的记录,测量依据跟着它最自然;已退役的键永远不会再测,6 处改成日期读数后,pin 升级再也不会逼它们改写。A 最贴合;B 让证据和记录分家;C 丢证据。
② 实际业务拉动: 退役条目由
os migrate meta和升级指南呈现给作者;作者需要的是"为什么删、改成什么",不需要渲染器引用随 pin 变动。三者对作者可见行为无差别。③ 防 AI 犯错: 中性。三者都不改 describe 标记和拒收行为。
④ 创业阶段不扩散: A 改动最小、不新增台账结构;B 中等;C 最小但要从运行时数据里删内容。
推荐 A。 置信缺口:A 让"已发布的 spec 源码不再带渲染器引用"(第 1 条)在退役历史上留一个例外,这正是需要您点头的地方。
你要做的(一个动作): 回一个字母(A / B / C)。PR-1 不等这个答复;PR-2 在答复后派发。
Governing text: ruling
6165388570items 1 and 4. Prior rulings read:6165388570(this card); no other ruling covers retirement-entry citations.os-decision-facets
State: the card stays
pm:dispatchedfor PR-1 (this seat's claim, amended at this act to addpackages/spec/scripts/check-generated.ts:343,packages/spec/scripts/check-llms-txt.ts:136and the prose mentions atpackages/spec/src/ui/component.zod.ts:3367andpackages/spec/src/ui/view.zod.ts:2404). When PR-1 lands, the seat releases the card intoneeds-user-decisionif Q2 is still open, or dispatches PR-2 if it is answered.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 23434,
"status": "done",
"branch": "claude/issue-23434-objectui-read-points-to-ledger",
"pr": "#23502",
"session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
"premise_still_valid": true,
"summary": "PR-1 is open as a draft at #23502 (Part of #23434, Tier H because of lint.yml, assignee baozhoutao, 2,899 changed lines). It does three things. (1) It retires check:objectui-pin-citations whole: the script, the package.json script, the lint.yml step, the check-generated.ts NO_GENERATOR row, the bare-root-worklist.mjs row and prose (self-test green at 13 members), and the prose naming the gate in dispatch-gates.mjs, check-llms-txt.ts, component.zod.ts and view.zod.ts. (2) It respells all 49 asserting citations as dated readings at objectui b9814b334, six of them inside v18 migration reason strings. (3) It moves 38 group-M citations into 23 ledger-row notes as objectui @sha FILE#SYMBOL, every symbol resolved against the objectui clone at that sha. Three of the 43 group-M citations turned out to be ComponentPropsMap read points and were re-classified to group C: ui/page.zod.ts visibleWhen roots, and the inline-grid-column-carriers.test.ts master-detail and line_items key sets. That makes C 99 citations; R stays at 40. Two moves are held back to stay under 3,000 lines and ride in PR-2, as the PM directed: api-methods-batch-conformance.test.ts (object enable.apiMethods) and dataset.zod.ts measures.format. Their respell stays in PR-1, and the moved form is saved at scratchpad issue-23434/pr1b-deferred.patch. The retired gate's --list, re-run from the base tree, now finds 0 asserting and 100 historical: 66 in C and 34 in R.",
"tests": "Head 7fe6ffd, base d54e239. spec build exit 0. check:generated: 1/14 stale (check:docs, from the span describe), fixed with --fix (content/docs/references/ui/view.mdx). spec test (local): 676 files, 20580 passed. spec test:repo: 60 files, 1029 passed. Both ran before the final hold-back commit; after it, the two reverted files' suites passed at head (3 files, 89 tests). lint tests: 139 files, 6726 passed. At head: check:liveness, check:spec-changes, check:upgrade-guide, check:nul-bytes, check:issue-citations and check-spec-docblock-symbol-anchors all exit 0. No ablation (prose and ledger move only).",
"gates": "dispatch-gates --repo objectstack-ai/objectstack --ran (with exit codes): 174 derived, 174 accounted, 166 run, 8 with exit 3. 164 exited 0. Two of the exit-3 gates (lint check:doc-formula-expressions, check:doc-security-posture) re-ran at exit 0 after building lint and formula. NOT MEASURED, prerequisite not built (needs the CLI or a whole-repo dist): spec check:skill-examples, check:docs-transcript-drift, check:dual-build-cjs-loads, check:i18n, check:i18n-walk-parity, check:lean-entry-closure. RED exit 1: check:platform-checklist, 8 ABSENT SYMBOL findings in docs/qa/platform-checklist/areas/{access-security,attachments-storage,search}.json pointing at packages/metadata-protocol/src/protocol.ts and service-storage attachment-access-hooks.ts. This diff touches none of those files; not judged as this PR. The full battery ran at 7ebc084, before the hold-back commit; the re-run subset is listed under tests. CI: in_progress, not awaited.",
"line_budget": "2899 changed lines (252 insertions, 2647 deletions; PR additions+deletions = 2899). The full move would have been 3253; 1363 of those are the deleted gate script.",
"deviations": "(1) Three group-M citations re-classified to C (no matching row: they are component-level keys under the undrilled page.regions). (2) Two moves deferred to PR-2 on the PM's instruction. (3) Zero label writes: the dispatch named no labels, and skip-changeset does not apply (there is a patch changeset). (4) Progress status sent once via SendMessage to the PM in answer to the status query.",
"files_changed": [
".changeset/23434-objectui-read-points-to-ledger.md",
".github/workflows/lint.yml",
"content/docs/references/ui/view.mdx",
"packages/spec/liveness/action.json",
"packages/spec/liveness/dashboard.json",
"packages/spec/liveness/field.json",
"packages/spec/liveness/report.json",
"packages/spec/liveness/translation.json",
"packages/spec/liveness/view.json",
"packages/spec/package.json",
"packages/spec/scripts/check-generated.ts",
"packages/spec/scripts/check-llms-txt.ts",
"packages/spec/scripts/check-objectui-pin-citations.ts",
"packages/spec/src/data/api-methods-batch-conformance.test.ts",
"packages/spec/src/data/field-rows-option-description.test.ts",
"packages/spec/src/data/field-scale.ts",
"packages/spec/src/data/inline-grid-columns.test.ts",
"packages/spec/src/data/inline-grid-columns.ts",
"packages/spec/src/data/inline-grid-sort-fields.ts",
"packages/spec/src/data/object.form.ts",
"packages/spec/src/inline-grid-column-carriers.test.ts",
"packages/spec/src/kernel/functional-completeness.ts",
"packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts",
"packages/spec/src/migrations/entries/semantic/18.kernel-runtime-config-timeout-unit-in-key.ts",
"packages/spec/src/migrations/entries/semantic/18.logging-durations-unit-in-key.ts",
"packages/spec/src/migrations/entries/semantic/18.system-metrics-jsdoc-durations-unit-in-key.ts",
"packages/spec/src/migrations/entries/semantic/18.system-tracing-otel-exporter-durations-unit-in-key.ts",
"packages/spec/src/migrations/entries/semantic/18.tenant-schema-cache-ttl-unit-in-key.ts",
"packages/spec/src/shared/scale-ceiling.ts",
"packages/spec/src/stack.zod.ts",
"packages/spec/src/system/i18n-resolver.ts",
"packages/spec/src/system/translation.zod.ts",
"packages/spec/src/ui/action-on-success-executor.ts",
"packages/spec/src/ui/action-outcome-messages.test.ts",
"packages/spec/src/ui/action.zod.ts",
"packages/spec/src/ui/chart.zod.ts",
"packages/spec/src/ui/component.test.ts",
"packages/spec/src/ui/component.zod.ts",
"packages/spec/src/ui/dashboard.zod.ts",
"packages/spec/src/ui/dataset.zod.ts",
"packages/spec/src/ui/report.zod.ts",
"packages/spec/src/ui/view-overlay-options-bag.test.ts",
"packages/spec/src/ui/view.test.ts",
"packages/spec/src/ui/view.zod.ts",
"scripts/pm/bare-root-worklist.mjs",
"scripts/pm/dispatch-gates.mjs"
],
"mcp_calls": "0",
"api_writes": "3 — POST /repos//issues/23434/comments (first report, 6168538808); POST /repos/objectstack-ai/objectstack/pulls plus POST /repos//issues/23502/assignees (one pr_create relay action, run 38581017807); POST /repos//issues/23434/comments (this report). All through the fleet-write relay. Plus git pushes of the branch (not REST writes).",
"open_questions": [
{
"question": "Renderer citations outside the retired gate's population are still in spec source: the 'objectui SHA' spelling with file:line, for example view.zod.ts 'inside the console pin from objectui b9814b334 ... ListView.tsx:5716'; and sha-less 'at the .objectui-sha pin' mentions in dashboard.zod.ts, view.zod.ts and i18n-resolver.ts. Should PR-2 cover them?",
"options": [
"A. PR-2 sweeps them too, to honour ruling item 1 literally (no renderer citation in source); this needs a census first",
"B. Leave them; they are not in the ruled 37/98 population"
],
"recommendation": "A, measured first: item 1 says the published source carries no renderer citation, and these are the same class in a different spelling."
}
],
"out_of_scope_findings": [
"carrier: the platform-checklist area owner (docs/qa/platform-checklist) · noted, not filed: check:platform-checklist is red with 8 ABSENT SYMBOL anchors into packages/metadata-protocol/src/protocol.ts and packages/services/service-storage/src/attachment-access-hooks.ts on this branch's base d54e239 plus this diff, which touches neither; it looks like main-side drift; dedupe words: platform-checklist absent symbol anonymousFormIntakeReopenRefusal envWideRawViewRows canEdit"
]
}
objectstack-fleet commentedon Oct 14, 2026
Review: PR #23502 (PR-1,
Part of #23434) @7fe6ffdde1cf4842bdd4b482549d6a5f7780405b— reviewed, Tier H, waiting for an authorized approval ·domain:specseat 3 · 2026-10-14T14:41ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao.Part of #23434(no closing keyword next to the number),Clause-②: no,@objectstack/specpatch; +252/−2647, 46 files (2,899 changed lines, under 3,000); Tier H through.github/workflows/lint.yml.6168576479): the gate retired whole (script, package script,lint.ymlstep,check-generated.tsrow, PM routing and prose); the 49 asserting citations respelled as dated readings at objectuib9814b334; 38 group-M citations moved into 19 ledger rows asobjectui @SHA FILE#SYMBOL.CONTRACT_REVIEW_TIERon this head (record on the PR): no accept/refuse/export change; nothing lost (every removed citation has its counterpart in a real row); no respelled line still claims the pin; no caller of the retired gate remains.needs-user-decisionon the PR; review requested fromos-zhuangandhotlong.PR-2 (
Fixes #23434) owes, recorded here so its claim lists them:page.regionsnote, per the seat reading (Q1 A).packages/spec/src/data/api-methods-batch-conformance.test.ts→object.jsonenable.apiMethods, andpackages/spec/src/data/dataset.zod.ts→dataset.jsonmeasures.format. Both are already respelled as dated readings in PR-1.6170782619):objectui SHA … File.tsx:NNN(e.g.view.zod.ts,ListView.tsx:5716) and sha-less "at the.objectui-shapin" mentions (dashboard.zod.ts,view.zod.ts,i18n-resolver.ts). Seat reading: ruling item 1 says "the published spec source carries no renderer citation after this", and these are the same class in another spelling, so PR-2 censuses them first and moves each into its matching row (orpage.regions). A census hit that matches no row is reported, not given an invented row.6168576479).Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed PR-1 · PR #23502 →
main1418de4c7· Release: into the decision box ·domain:specseat 3 · 2026-10-14T15:32ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao.os-zhuang's approval on7fe6ffdde; the squash equals that head bygit patch-id --stable; onorigin/main.check:objectui-pin-citationsis retired; no objectui pin bump rewritespackages/spec/srcany more.Release: PR-1 (
Part of #23434) landed the gate's retirement, the 49 asserting respells and 38 group-M moves. Remaining items, all for PR-2 (Fixes #23434): group C (99 component-props citations →page.regions), the two held-back moves (api-methods-batch-conformance.test.ts→enable.apiMethods;dataset.zod.ts→measures.format), the census of other spellings (seat review comment on this card), and group R (40 retirement-history citations), which waits on the maintainer's Q2 (6168576479; seat recommends A). The card moves toneeds-user-decisionand is unassigned in this act; on the answer it returns topm:queueand a seat claims PR-2 by the full claim protocol, its claim listing the four items above.Generated by Claude Code