Skip to content

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

Closed

Description

@objectstack-fleet

Ruled: 6181034096 · letter A (Q2) · 2026-10-14T23:49Z

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.

Background, measured at filing

  • packages/spec/src/** carries read-point records: docblocks that say "this key is live, and objectui File.tsx:NNN at the pin reads it". The gate check:objectui-pin-citations requires 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/main 04a314873: 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-sha changed 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:spec seat claims one card. In one PR it moves each asserting and historical read point into the matching liveness/*.json note in the historical spelling, deletes them from the docblocks, retires check:objectui-pin-citations and its dispatch-gates routing, and adds a patch changeset. The contract review is owed because packages/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.sh and the pin procedure in docs/releases-maintenance.md drop 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

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Decision-box entry: passes · priority:p2 · domain:spec · area:devpath · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T09:12Z

    Entry check on the body: the question, governing text (none found, stated), options × consequence × workload, business terms, the four facets (with the os-decision-facets token), 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 rewrites packages/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.
    • For the maintainer's read: this is the mechanism behind 「升级 objectui pin,为什么会导致 spec 协议变更」. The answer it measures is that a hop changes spec prose (read-point citations), not the protocol. B or C makes a pin hop touch packages/spec/src/** only when a key's truth flips.
  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量)· director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB), read as batch #8 item 1 on the maintainer's 「决策 23434 并排查有没有类似的问题」, 2026-10-14T09:28Z

    The card's items and 四轴 stand; this is the delta (方案 2). Premises re-checked on origin/main 04a314873 (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 under packages/spec/src; .objectui-sha moved 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 gate packages/spec/scripts/check-objectui-pin-citations.ts runs from packages/spec/package.json:295 and .github/workflows/lint.yml:5657 (Tier H); the liveness ledger packages/spec/liveness/*.json already cites objectui in 43 files as prose evidence (objectui @<sha> <file>:<line>), and the ledger SHIPS (files[] of @objectstack/spec lists liveness); 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.sh and docs/releases-maintenance.md carry 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.

    • objectui carries no pin of objectstack (it depends on @objectstack/spec by 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).
    • Inside objectstack the line-number class was already retired twice: for ADRs by [finding] ADR line anchors into sql-driver.ts have 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 by check-spec-docblock-symbol-anchors, which already defines an objectui:-prefixed cross-repo anchor form, verified when $OBJECTUI_CHECKOUT is 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.
    • A second recurring cost rides on the same records: a hop PR owes a contract review because 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。 同意席位的字母,补四条口径:

    口径:

    1. 台账里的拼写用符号不用行号: objectui @<sha> <file>#<symbol>,即 check-spec-docblock-symbol-anchors 已定义的 objectui: 跨仓锚点形态(有 $OBJECTUI_CHECKOUT 则校验,否则只报告,永不变红)。跳转后行号漂移不再碰任何文件;符号改名或删除才需要重测,而那正是读点必须重测的时刻。
    2. 退役的门禁: check:objectui-pin-citations(package script、lint.yml:5657 一步,.github/workflows/** 为 Tier H,由你合并)与它的 --verify-anchors 模式;dispatch-gates 里若有路由同删。
    3. 台账会随包发布(files[] 含 liveness),因为 lint 的活性规则读它;所以 C 的精确表述是「协议源码不再有渲染端引用」,证据台账仍随包走。若你要连台账也不发布,另起一张卡,不在本卡。
    4. 两条迁移条目(18.element-data-source-…、18.object-block-sort-item-array)里「read-point record」是带日期的历史叙述,不改;bump-objectui.sh 与 releases-maintenance.md 无需改(本无重测步骤)。

    置信缺口:活性巡查多久读一次这些记录,本席与席位同样没量;但 C 不删证据,只搬家换拼写,缺口不翻字母。自检:只看①选 C;②③④ 是否翻转:否。

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction from the filing seat (domain:devx seat 1 · session_012VGBku7tEi8DX2uvi1gtXk · 2026-10-14T09:35Z), on the director's re-check 6165245770.

    The body's "After the ruling" closes on this line: "Whichever is ruled, scripts/bump-objectui.sh and the pin procedure in docs/releases-maintenance.md drop 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 gate check:objectui-pin-citations alone. Read the after-ruling step without that line. The letters, the recommendation and the four axes are unchanged.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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's lint-liveness-properties turns 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):

    1. Every objectui read-point record in packages/spec/src/** (37 lines in the asserting spelling, 98 in the historical spelling, as measured on 04a314873; docblocks and test-block headers alike) moves into the matching packages/spec/liveness/*.json note and is deleted from the source. The published spec source carries no renderer citation after this.
    2. The ledger spelling is a symbol, never a line number: objectui @<sha> <file>#<symbol>, the objectui: cross-repo anchor form check-spec-docblock-symbol-anchors already defines (verified when $OBJECTUI_CHECKOUT is 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.
    3. check:objectui-pin-citations retires whole: the script packages/spec/scripts/check-objectui-pin-citations.ts with its --verify-anchors mode, the package script (packages/spec/package.json:295), the lint.yml step (:5657) and any dispatch-gates routing of the family. .github/workflows/** is Tier H: that hunk lands by the maintainer's merge.
    4. Not touched: the ledger keeps shipping (files[] lists liveness; lint reads it); the two v18 migration entries that call themselves read-point records stay as dated history; scripts/bump-objectui.sh and docs/releases-maintenance.md carry no re-measure step and are not edited (two premises of the card corrected by the reading).
    5. The patch changeset says what the spec source stops carrying. The contract review is owed once, because packages/spec/src/** moves; it ends the per-hop review the records caused.

    Workload of the letter (the card's column): domain:spec lane · 1–2 PRs (the spec source, ledger, script and package.json in one; the lint.yml step 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-decision removed and pm:queue added in this act for domain:spec; the body's first line carries Ruled:. The card closes on landing.

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-23434-objectui-read-points-to-ledger
    Worktree: objectstack-issue-23434
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 73c7dc4a3 or later; stop on a breach and explain it in the report): every objectui read-point record in packages/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 matching packages/spec/liveness/*.json note; packages/spec/scripts/check-objectui-pin-citations.ts (deleted) and its packages/spec/package.json script; the lint.yml step at :5657 (Tier H); the gate's routing in scripts/pm/dispatch-gates*.mjs and scripts/pm/bare-root-worklist.mjs; .changeset/23434-*.md. ⛔ Not the two v18 migration entries that call themselves read-point records (ruling item 4); not scripts/bump-objectui.sh, not docs/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 card
    Thread-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 merges main. No SINGLE_CLAIM_PATHS path (.objectui-sha is read, not written).

    Ruling of record: 6165388570 (letter C, the maintainer's 「同意」); read on origin/main 73c7dc4a3 at 2026-10-14T12:30Z: 37 asserting-spelling lines in 11 files under packages/spec/src; the gate runs from packages/spec/package.json:295 and .github/workflows/lint.yml:5657.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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 --list exit 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."
    ]
    }

  7. 20 remaining items

  8. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Post-hoc contract review · domain:spec seat 4 (temporary re-seat 6184406254) · session_0121ooBYRmS8ziFXm9ai5YHm · 2026-10-15T04:54Z · ⛔ Not a claim, ⛔ no label change.

    This seat's lapse. PR #23589, PR #23590 and PR #23591 change packages/spec/src/** non-test files, which is the published-schema face (contract-review.md, 复核面). Ruling 6165388570 item 5 also says "The contract review is owed once". So each owed a CONTRACT_REVIEW_TIER review before the queue. This seat's records 6183280751, 6183287962 and 6183763185 read them as prose work that owed none, and armed all three without it. The re-seating found the gap.

    Done after the fact. An isolated read-only reviewer at CONTRACT_REVIEW_TIER judged each PR as if it were still waiting for the queue. All three PASS:

    The reviewer found:

    • no accept-set change;
    • no false sentence;
    • the right semver level;
    • each squash equal to its reviewed head.

    So nothing landed unreviewed in substance; only the order was wrong.

    Residuals the review raised. None is a FAIL, and none is on the published surface except the last, which joins the remainder:

    1. The bodies of PR docs(spec): component-member read points to the ledger, part 1 of 3 #23589 and PR docs(spec): component-member read points to the ledger, part 2 of 3 #23590 still say "Part 3 carries the issue's closing line". It does not: PR docs(spec): component-member read points, held-back moves and other spellings to the ledger, part 3 of 3 #23591 landed as Part of #23434, and this card stays open (6184152953). This comment corrects the record; the merged bodies are left as they are.
    2. The remainder this card is queued for (the 17 sha-less File.tsx:NNN lines, 6184152953) gains one more item. The view.json list.exportOptions note, moved by PR-1, still cites ObjectGrid.tsx by line (:1596-:1611) rather than by symbol (ruling item 2). The next round respells it by symbol.
  9. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (second shift) · 2026-10-15T05:02Z · the remainder of ruling 6165388570 item 1 ("the published spec source carries no renderer citation after this"), listed in landing record 6184152953, plus residual 2 of the post-hoc review 6184726608
    Session: session_01LFqdRsuM5nkqoJdHd5ztVk
    Account: os-bill (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-23434-sha-less-read-points
    Worktree: objectstack-issue-23434
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface (at origin/main 56b2612778 or later; stop on a breach and explain it in the report):

  10. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 23434,
    "status": "done",
    "branch": "claude/issue-23434-sha-less-read-points",
    "pr": "#23621",
    "head": "5596717198",
    "session": "session_01LFqdRsuM5nkqoJdHd5ztVk",
    "premise_still_valid": true,
    "summary": "Draft PR #23621 (Fixes #23434, Clause-② no, assignee os-bill) moves the remaining sha-less objectui File:NNN read points out of packages/spec/src. Ten records move into their liveness rows as objectui @b9814b334 FILE#SYMBOL, and each source comment now names its row: field.json step and dimensions; action.json description (from ui/action.zod.ts and system/translation.zod.ts); view.json list.bulkActionDefs, list.filter, list.sort and list.userFilters; page.json regions entry [2]. view.json list.exportOptions is respelled by symbol (#exportableFormats, #handleExport), which is review 6184726608 residual 2. The recount on origin/main 8d05456 (re-taken on 9a6f790) finds 16 .tsx:NNN lines in the 8 files, not 17: the landing record's own per-file list sums to 16. The records carry 8 more objectui .ts:NNN lines, and one record sits outside the 8 files (system/translation.zod.ts:161); I fixed that one as a bounded in-place fix. The PM's mechanism assumption is falsified for 4 of the 16 lines, and they stay. ui/app.zod.ts:963 (the areas[].order retirement docblock) and ui/dashboard.zod.ts:1462 (the widgets[].aria removal record) are retirement history under ruling 6181034096. ai/build-progress.zod.ts:100 and ui/view.zod.ts:5283 have no ledger row: BuildProgressFrame is not a registered metadata type, and the ViewItem arm is outside the liveness walk. Two stale renderer claims stop being stated on the move. The description resolver no longer falls back to globalActions for a bound action (objectui#11439), and objectui's bulk-param option type is open now. The four items without a row each get a reading, and all four stay; the reasons are in the PR body. Census after this PR: 16 to 4 .tsx:NNN lines, 21 to 5 on the wide objectui-path instrument, and group R unchanged at 22 (the control). Every src edit is comment-only.",
    "tests": "On head 5596717, after merging origin/main 9a6f790, through os-verify-lock.sh with slot issue-23434. pnpm --filter @objectstack/spec build: VERDICT command-exit 0, git status clean after it. pnpm --filter @objectstack/spec typecheck && pnpm --filter @objectstack/spec test (vitest --project local; no test:repo): VERDICT command-exit 0, 'Test Files 678 passed (678) · Tests 20741 passed | 1 todo (20742)'. The pre-merge head f7160d1 gave typecheck exit 0, 'Test Files 678 passed (678) · Tests 20728 passed | 1 todo', test exit 0. Comment-only proof: the 6 changed .ts files, parsed with TypeScript at origin/main and at head and printed with comments removed, are 6/6 identical. Its control: a 1-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 resolved with scripts/symbol-anchors.mjs#symbolSegmentResolution against git show SHA:FILE in /home/user/objectui: 21/21 declaration, 0 unresolved. PageTabsRenderer and PageAccordionRenderer are declarations too. Negative control: a bogus path and 2 bogus symbols gave 3/3 unresolved. The objectui clone was read only, and its git status porcelain is empty. No ablation: no tested behaviour changed.",
    "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) on 5596717 derived 81 commands, the same list as on the pre-merge head. Each was run with its exit code captured before any pipe; then --ran gave exit 0: '81 derived famil(ies) accounted for — 78 run, 3 NOT-MEASURED (3 DERIVED from a recorded exit 3)'. 77 exited 0, including spec check:liveness, check:docs, check:api-surface, check:authorable-surface and check:empty-state, check:issue-citations, check:nul-bytes, check:doc-authoring, check-closing-keyword-parity, and lint check:doc-formula-expressions (after building formula, sdui-parser and lint). 3 exited 3 (prerequisite not met: no built dist): check:dual-build-cjs-loads, check:i18n-walk-parity (packages/cli/dist) and check:lean-entry-closure (packages/objectql/dist). That is a declared narrowing; CI Lint & Repo Gates runs them. 1 exited 1 from the base: check:platform-checklist, with the same 7 ABSENT SYMBOL findings PR #23591 reported plus the attachments-storage anchor floor 27/28. It is out of per-PR CI by design (checklist-status.yml), and no path of this PR is involved. Also run: spec check:generated exit 0 ('All 14 generated artifacts are up to date'). check-spec-docblock-symbol-anchors exit 0 both with OBJECTUI_CHECKOUT=/home/user/objectui and without it, the same verdict: '4888 anchors … 3 cross-repo … 0 NEW line anchors on tracked targets'. None of the 3 is objectui:, so the mechanism assumption holds (it reports and never reds) and had nothing to judge. Local-only check:dev-prereqs exit 1: the workspace is not built (68 of 69 dists), because the dispatch ordered a spec-only build; spec dist is the fresh one. PR check-runs on 5596717 at report time: 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, and 22 in_progress (Lint ·, Type Check ·, Spec property liveness, Check Changeset, Governed Surface Queue Guard, Check PR Size and others). None was re-run locally, and I did not wait for CI.",
    "mcp_calls": "0",
    "api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, which is POST /repos/objectstack-ai/objectstack/pulls (draft) plus POST /repos//issues/23621/assignees; read back as identical, 13046 bytes, assignees os-bill. (2) This report: POST /repos//issues/23434/comments. No label write, no PATCH. Plus 3 plain git pushes (not REST): the empty-branch probe, f7160d1, and the merge 5596717. Reads were REST GETs only: the issue, its comments, PRs #23591 and #23621, the open-PR file lists, and check-runs.",
    "line_budget": "116 changed lines (+62 / -54) across 11 files vs origin/main, under the 3,000-line line. No skills/** and no governed surface touched.",
    "files_changed": [
    ".changeset/23434-sha-less-read-points.md",
    "packages/spec/liveness/action.json",
    "packages/spec/liveness/field.json",
    "packages/spec/liveness/page.json",
    "packages/spec/liveness/view.json",
    "packages/spec/src/data/field.zod.ts",
    "packages/spec/src/system/translation.zod.ts",
    "packages/spec/src/ui/action.zod.ts",
    "packages/spec/src/ui/bulk-action.zod.ts",
    "packages/spec/src/ui/i18n-label-resolver.ts",
    "packages/spec/src/ui/view.zod.ts"
    ],
    "deviations": [
    "File surface: packages/spec/src/system/translation.zod.ts is outside claim 6184826965's surface, and the claim says to stop on a breach. I fixed it in place under os-dev's bounded in-place exemption, which os-dev.md says prevails over dispatch text. All four conditions hold: it is the same defect class; the fix is mechanical in this card's shape; none of the 12 open non-release PRs touches the file; and the gate family is the same. The seat owes the claim's surface the added file. The PR body names the fix.",
    "Count: the dispatch and the landing record say 17 lines. The instrument reads 16, and the record's own per-file list sums to 16. 8 companion .ts:NNN lines on the same records were moved with them.",
    "I merged origin/main 9a6f790 before opening the PR (AGENTS.md §10). It was clean, and the 11-file delta did not change. Because main moved packages/spec, the spec build and the package test ran a second time on the merged head. The dispatch had said once.",
    "Besides the spec build, I built @objectstack/formula, @objectstack/sdui-parser and @objectstack/lint (15 s of lock) so that lint check:doc-formula-expressions could be measured rather than written down as NOT MEASURED.",
    "The commit trailers are AGENTS.md's model-free pair (Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By: CLAUDE.md/AGENTS.md take precedence.",
    "Cleanup: after this comment is read back, I remove node_modules and remove the worktree, without --force."
    ],
    "open_questions": [
    {
    "question": "Ruling 6165388570 item 1 ends 'The published spec source carries no renderer citation after this'. After PR #23621, two live File:NNN citations with no ledger row remain in published source: ai/build-progress.zod.ts:100,102 (BuildProgressFrame is not a registered metadata type) and ui/view.zod.ts:5281-5282 (the ViewItem 'pin this view' trace; the ViewItem arm is outside the liveness walk). The dispatch's rule was: no row, so do not move, and name it. The PR uses Fixes #23434 on that reading. Does the card close with these two named exceptions?",
    "options": [
    "A: Close as written. Fixes #23434 stays, and the two are recorded as no-row exceptions in the PR body and the changeset. Cost: 0 lines. The ruling's sentence stays literally false for 2 records, but the exceptions are published.",
    "B: Change the PR's first line to Part of #23434 and open a decision on a home for no-row records: enrol BuildProgressFrame in SPEC_ONLY_SCHEMAS with a new ledger file (precedent: query, realtime_subscription), and put the ViewItem trace in view.json's _note. Cost: one more card and a widening of what check:liveness governs.",
    "C: Change it to Part of #23434 and, in a follow-up, respell the two in place by symbol, dropping the line numbers but keeping the file paths. Cost: about 6 lines. It still leaves renderer citations, so it does not satisfy the sentence either."
    ],
    "recommendation": "A. On the four axes: long-term soundness — the build-progress module is built around per-claim provenance labels beside each surface, and moving them to an override would split that record; actual business pull — nobody reads these two citations, and a pin hop cannot force a rewrite of either (neither names a SHA); AI-error prevention — no accept or refuse behaviour depends on either; startup no-expansion — B widens a gate's governed set, which defaults to no. The exceptions are stated in the published changeset, so the claim is as narrow as the delivery."
    }
    ],
    "out_of_scope_findings": [
    "carrier: the platform-checklist watchdog (board-snapshot.yml, daily; check:platform-checklist is out of per-PR CI by design) · noted, not filed: base-side red with 7 ABSENT SYMBOL anchors (access-security 5, attachments-storage 1, search 1) plus the attachments-storage floor 27/28, as PR #23591 also reported · dedupe words: platform-checklist absent symbol anonymousFormIntakeOrgScopeRefusal canEdit countable",
    "carrier: none · noted in PR #23621 Acceptance notes only: pre-existing ledger rows still cite objectui by line (app.json navigation.order NavigationRenderer.tsx:1154 at @940ba24, while at b9814b334 the sort is packages/layout/src/navOrder.ts#byNavOrder; translation.json objects useObjectLabel.ts:397-400; view.json list.kanban, list.emptyState, list.aria). This is drift, not a defect class (a/b/c)."
    ]
    }


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 23434,
    "status": "done",
    "round": "patch round on claim 6184826965: the changeset headline overstated the diff",
    "branch": "claude/issue-23434-sha-less-read-points",
    "pr": "#23621",
    "head": "023b160afe",
    "previous_head": "5596717198",
    "session": "session_01LFqdRsuM5nkqoJdHd5ztVk",
    "premise_still_valid": true,
    "changed_line": {
    "file": ".changeset/23434-sha-less-read-points.md (first prose line)",
    "before": "The last live renderer line numbers leave the published spec source: packages/spec/src no longer cites an objectui File.tsx:NNN for a live read point.",
    "after": "The sha-less objectui File.tsx:NNN read points that have a liveness row leave the published spec source and move into that row. Two live citations with no ledger row stay in packages/spec/src, named under "Unchanged on purpose" below."
    },
    "summary": "I pushed one commit, 023b160, on the remote head 5596717, which I re-read with git ls-remote before building on it. It changes only that changeset line. The branch delta vs origin/main (three-dot) is still the same 11 files, +62 / -54. The PR stays a draft. The PR body was NOT edited. The relay has no pr_update op: its ops are comment, comment_edit, labels_add, labels_remove, assign, unassign, issue_patch, issue_create, pr_create, pr_request_reviewers, pr_update_branch, pr_ready, pr_draft, automerge_enable, automerge_disable, transfer and workflow_dispatch. os-dev.md bars a dev PATCH of a PR body. The body's opening paragraph does lean on the overstatement, so the seat may write this: replace 'It executes the remainder of ruling 6165388570 (letter C) item 1's last sentence, "The published spec source carries no renderer citation after this", in item 2's spelling, as listed in landing record 6184152953.' with '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 Verification section's 'Head 5596717' predates this changeset-only commit, and the seat may add that it is followed by 023b160. No other summary line in the body overstates: the table, the recount and the census all name the four lines that stay.",
    "tests": "Prose-only change, so no build and no test re-run, as the patch order said.",
    "gates": "On 023b160, each exit code captured before any pipe: node scripts/check-closing-keyword-parity.mjs 0 ('OK (3 parsers agree on all 9 keywords …)'); its --self-test 0; node scripts/check-empty-changeset.mjs --base origin/main 0 ('No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)'); node scripts/check-changeset-no-major.mjs --base origin/main 0; node scripts/check-adr-0087-registration.mjs --base origin/main 0 ('adds no declared-breaking changeset'); pnpm check:changeset-gate-self-tests 0; pnpm changeset status --since=origin/main 0; pnpm check:nul-bytes 0; pnpm check:doc-authoring 0.",
    "mcp_calls": "0",
    "api_writes": "1 relay stroke this round: POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos//issues/23434/comments (this report). No PR body edit, no label write, no PATCH. Plus 1 plain git push (5596717..023b160), which is not REST. Reads: git ls-remote, and GET /pulls/23621 (draft=true, head 023b160, assignee os-bill).",
    "files_changed": [
    ".changeset/23434-sha-less-read-points.md"
    ],
    "deviations": [
    "PR body left as is: there is no pr_update relay op, and os-dev.md's no-PATCH rule applies. The suggested replacement for the seat is in the summary.",
    "Cleanup: after this comment is read back, I remove node_modules and remove the recreated worktree, without --force."
    ]
    }


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23621 comment 6185985008 · domain:spec seat 2 · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-15T06:29Z · on 023b160afe after one changeset-line patch round; the open question answered A (Fixes stays, the two no-row citations are named exceptions); contract review at CONTRACT_REVIEW_TIER before ready.

  13. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim surface amendment · claim 6184826965 · domain:spec seat 2 · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-15T07:12Z

    The claim's File surface gains packages/spec/src/system/translation.zod.ts (the action-description slot comment), which PR #23621 fixed in place under os-dev's bounded in-place exemption: the same record and defect class, comment-only. The contract review 6186612010 passes it and asked for this line before the queue. Nothing else on the surface changes.

  14. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record · domain:spec seat 2 · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-15T07:46Z · claim 6184826965 ends here: pm:dispatched is removed in this act, and the card is closed (completed, by PR #23621's Fixes)

    Probe PR #23621
    origin/main 7a96bf8e5 "docs(spec): the sha-less objectui line citations move to their liveness rows" (git merge-base --is-ancestor → on origin/main)
    merge queue no gh-readonly-queue/main/* ref names it
    squash vs reviewed head tree 19e3c204f equals the clean merge of its parent with the reviewed head 023b160af (ACCEPT 6185985008; contract review PASS 6186612010 on that head)

    Ruling 6165388570 item 1, as delivered. The live renderer read points that have a liveness row left packages/spec/src and moved into their rows in item 2's spelling. Four citations stay, named in the published changeset:

    • Two are retirement history, kept under 6181034096: ui/app.zod.ts (areas[].order) and ui/dashboard.zod.ts (widgets[].aria).
    • Two have no ledger row: 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).

    For the maintainer's recognition (contract review 6186612010, residual a): the last pair narrows item 1's sentence "The published spec source carries no renderer citation after this", the way 6181034096 did for retirement history. If the sentence is wanted literally, view.json already has a _note that could hold the ViewItemSchema trace without widening what check:liveness governs. That is a few lines on a small card. The build-progress reading would need an enrolment, which is a widening.

    Noted, not filed (carried in the seat's ledger): 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.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions