Skip to content

refactor(spec-liveness): the renderer's ledger evidence is in-repo under ui/; objectui becomes a retired realm that fails - #26150

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-6qe56u
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-6qe56u

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Part of #25712 (4b PR 2e: the liveness ledger, card item 1; Tier S).
Part of objectstack#25677.

Clause-②: no
Metadata-protocol: none

维护者速读(草稿)

  • 改了什么:
    • liveness 账本里写成「objectui @某提交: 路径」的 374 个证据指针(164 行)改为仓内路径 ui/<路径>,去掉 objectui 标记和钉的提交。verifiedAt 一律不动。
    • 107 行的 evidenceScope 由 cross-repo 改为 in-repo。同时引用 cloud 的那 1 行保持 cross-repo,原本没声明 scope 的 56 行仍不声明。
    • 读取器把 ui 当作本仓根目录,ui/ 路径和其他路径一样必须存在、行号在文件内、锚点符号存在、文件里出现该键名。
    • objectui 改为「已退役的 realm」:仍标成 objectui 的路径单独列出并判红,同时打印对应的 ui/ 写法。
  • 为什么改: objectui 已并入本仓(objectui 并入 objectstack 为 ui/ workspace:D1 裁定(A+)的执行父单 — 一个 PR 同时改 spec 与渲染器,删除两仓互钉,@object-ui 保留包名并与 @objectstack 同一版本组,objectui 仓归档为迁移说明 #25677),这些证据不再是跨仓的。
  • 行号怎么处理(PM 已裁定): objectui 的 133 个 路径:行号 是在旧提交上读的。对照今天的 ui/:6 个行号未变,66 个代码挪了位置,58 个无法核对,3 个所在文件已删除。规则如下:
    • 只有当整段引文在旧提交和今天的文件里都恰好出现一次、逐字节相同时,才改到新行号。
    • 其余去掉指针上的行号,保留路径和锚点,旧读数留作文字 (:N at objectui @sha)。
    • 同一句里的行号要么一起改,要么一起保留。
  • 读者已消失的 5 行: 删去失效的那一句,加一条带日期的 note,不猜新路径。其中 field.externalId 唯一的读者已被删除,记为后续 F23。
  • 新增 13 条 key-mention 豁免: 这些 ui/ 文件读的是改名后的键(如 inlineEdit → editable)或委托给已锚定的兄弟文件,每条都写明文件实际用的名字。
  • 风险与代价(含回滚): 只改账本、读取器、测试和 README,不影响运行时。回滚 = revert 本 PR。
  • 你要做的: 无(Tier S)。

席位核对

(left for the dispatch seat)

Why

objectui merged into this repo as ui/ (#25677). The liveness ledger still cited the renderer as another repository: objectui @<sha>: packages/… pointers, counted foreign, never resolved. Card #25712 item 1 asks for:

  • the pointers rewritten in-repo (ui/<path>#<symbol>);
  • the scope set to in-repo;
  • the reader to resolve them exist-or-fail.

PM ruling A (#25712 comment 6415397254) sets done-when to 0 objectui-attributed pointers, enforced by the reader. Note history stays. Unresolved rows go to the worklist, and no path is guessed.

What changes

Reader: scripts/liveness/evidence.mts, check-liveness.mts

  • ui joins REPO_ROOTS. A ui/… pointer is local, so it gets the existence, line-bound, symbol-anchor and key-mention checks.
  • objectui leaves FOREIGN_REALMS (now cloud, ee) and becomes the one entry of RETIRED_REALMS (objectui → ui). scanEvidence returns a third bucket, retired.
    • The gate fails on a path in it, at any status and in evidence or producer.
    • The message prints the ui/ spelling: query/limit → objectui: packages/core/src/index.ts (now ui/packages/core/src/index.ts).
    • Neither existing bucket would do. Counted foreign, the path never fails. Read as local, objectui: packages/core/… could pass against this repo's own packages/core/, a file that never was the reader.
  • A path already spelled ui/… is local whatever prose precedes it, so a dated reading can still name the old repo.
  • empty-state.mts and the key-mention.mts remedy text say cloud: where they said objectui:.

Ledger: 24 files

Count
Rows with an objectui-attributed pointer in evidence or producer 164
Pointers re-rooted under ui/ 374
objectui [@sha]: markers in front of a pointer, dropped 347
objectui words left as prose (no path directly after) 50
evidenceScope cross-repo → in-repo 107
Stays cross-repo (also cites cloud) 1
Scope undeclared, left undeclared 56
verifiedAt changed 0

Untouched:

  • note history, including the "read at objectui @sha" readings and _note fields;
  • 13 evidence strings that name objectui in prose with no repo-rooted path (objectui action renderers + runtime dispatcher);
  • every cloud row.

Line citations: the 133-citation breakdown

Each objectui path:N was read at a pinned objectui commit. A clone of objectui (unshallowed) was compared with today's ui/ at this PR's base:

Measured per line Count
Same lines today 6
Moved: the cited block is byte-identical at exactly one other offset 66
Unverifiable: the pin is not in objectui main's history (e.g. 940ba24, 33 lines), or the cited lines changed 58
In a deleted file 3

Rule applied (PM-accepted):

  • Exact relocation only. A block must occur exactly once in the file at the cited commit and exactly once in today's file.
  • One clause, one reading. A pointer moves together with its bare :N follow-ons (…ListView.tsx:763 seeds … and :1491-1494 filters …), or none of them moves.
Pointer lines, as applied Count
Kept (same) 7
Relocated 58
Line dropped from the pointer; reading kept as prose ui/p (:N at objectui @sha) 65
In a deleted file: clause dropped or turned to prose, see below 3
  • Follow-ons. There are 50 follow-on :N refs: 18 relocated with their clause, and 32 stay at the dated reading.
  • Prose line numbers. Numbers written as prose inside a relocated clause were relocated by the same rule, in 8 rows:
    • sibling action-icon.tsx:N refs in action.bodyShape and bodyExtra;
    • :N/:N pairs in action.method and view.form.subforms;
    • "line N" in email_template.label/description and webhook.label/description.
  • Rebases. Each time main moved, the relocation was regenerated from main's ledger by the same script, not hand-edited:
  • Exact matches only. Nothing was relocated by similarity.

Rows whose objectui reader is gone

Each row below gets no repoint and a dated note line saying what left and when:

Row Dropped clause Why
app.navigation.id UnifiedSidebar.tsx#useNavOrder objectui#12059 made the sidebar menu non-reorderable; the other three readers stay
view.list.hiddenFields spec-bridge list-view.ts:123 objectui#6632 retired the spec-bridge; the ListView reader stays
view.form.groups spec-bridge form-view.ts:169 objectui#6632; the producer fold in view.zod.ts and the ObjectForm reading stay
field.widget plugin-detail/src/index.tsx:563 (permission-facet-link registration) objectui#12998 removed the widget; found by the key-mention check once the path was in-repo
field.externalId its only pointer, console metadataConverters.ts:125 deleted in objectui dc14bcb ("zero importers"); the pointer is now prose, F23

Key mention: 13 exemptions

Once in-repo, these citations met the key-mention check for the first time. Each cited file reads a renamed key, or names the parent key and delegates to the entry's other, anchored citation. Each row in key-mention.baseline.json names the spelling the file actually uses:

Entry File Name used
page/print.{paperSize, orientation, margins.right, margins.bottom, pageNumbers, repeatTableHeaders, avoidBreakInside} (7) layout/page.tsx print (isPagePrintDeclaration(schema.print))
dashboard/widgets.chartConfig.{showDataLabels, annotations, interaction} (3) plugin-dashboard/src/DatasetWidget.tsx chartConfigPresentation
view/list.inlineEdit plugin-grid/src/ObjectGrid.tsx editable
view/form.subforms plugin-form/src/MasterDetailForm.tsx details
translation/flows.screens app-shell/src/views/ScreenView.tsx label / placeholder / inlineHelpText

The baseline stays shrink-only. A row fails once its pair anchors.

Tests and README

  • evidence.test.ts: the realm cases move from objectui to cloud/ee, and a new block pins the retired realm. Its ui/ paths are synthetic (ui/packages/layout/src/x.tsx): the scanner never opens them, and a real path there would be an undeclared cross-package input to check:cross-package-test-inputs.
  • check-liveness.test.ts:
    • the realm cases move from objectui to cloud/ee;
    • two subprocess cases fail on a retired-realm pointer in evidence, in producer, and on a dead row;
    • the summary-line pin reads (cloud / ee — not resolvable here).
  • Restored. The path:NNN contract test and the line-citation floor come back. [finding] field.conditionalRequired is ledgered live citing a .transform that protocol 17 removed — and the rule-validator fallback its note relies on is gone too #13043 retired both when that population reached zero, with the instruction to restore them when a citation was written again.
  • README.md updates the realm-marker section, the commit-pin advice, evidenceScope, the preview lookup (git grep -- ui/ instead of git -C ../objectui) and "confirmed absence".

The first commit is the governed-queue-guard comment fix held from #26058, accepted by the PM to ride here.

Follow-ups (sub-issue 4)

Verification

Head 23cb18d2b9, on main 1bbb7bf490. 33 files, +703 / −385. Tier S: no governed path, under 3000 lines.

  • pnpm --filter @objectstack/spec check:liveness, exit 0:

    • evidence paths: 1036 repo-local paths declared, 1036 resolved; 41 attributed to another repo (cloud / ee).
    • line citations: 65 written path:NNN, 65 inside the cited file.
    • symbol anchors: 1220 written path#symbol, 1220 named.
    • key-mention anchoring: 1036 pairs, 1022 anchored, 14 exempt.
    • Retired-realm pointers: 0.
  • vitest run scripts/liveness/: 12 files, 358 tests passed.

  • Gate sweep: node scripts/pm/dispatch-gates.mjs --commands derives 68 gates for this diff. All 68 ran on 23cb18d2b9 and exited 0. --ran reconciles 68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN.

    • The first pass found check:cross-package-test-inputs red on four real ui/ paths in evidence.test.ts. Those unit cases now use synthetic paths (see Tests).
  • Push battery (GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs) on 23cb18d2b9: 2182 cases pass, 0 fail (fast 1917, slow 265; 1800 s).

🤖 Generated with Claude Code

https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS

…aintainer's ruling

The maintainer kept objectui's `.github/workflows/**` row on objectstack#25712
(option b): it stays in the register and is read through the root register.
The comment above the moved-row case said the call was pending; it now
records the ruling, and leaves the register's own retirement to sub-issue 4.
Comment only.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…der ui/; objectui becomes a retired realm that fails

objectui merged into this repo as ui/ (#25677), so the liveness ledger's
renderer evidence stops being cross-repo (objectstack#25712 item 1).

Reader (scripts/liveness/evidence.mts):
- `ui` joins REPO_ROOTS, so `ui/packages/...` pointers resolve like any
  path: the file exists, a cited line is inside it, an anchored symbol is in
  it, and the file names the key.
- `objectui` leaves FOREIGN_REALMS and becomes RETIRED_REALMS (objectui -> ui).
  A path still attributed to it lands in a bucket of its own that the gate
  fails on, whatever the row's status, printing the ui/ spelling as the
  remedy. Counted as foreign, it would never fail. Read as local, it could
  resolve against the wrong root, because both trees have packages/core/.
  A path already spelled ui/ is local whatever prose precedes it.

Ledger (24 files): 374 objectui-attributed pointers in 164 rows are
re-rooted under ui/, and the `objectui [@sha]:` marker in front of each one
is dropped. verifiedAt is unchanged everywhere. 107 cross-repo rows become
in-repo. The one row that also cites cloud stays cross-repo, and the 56
undeclared scopes stay undeclared.

Line citations: of the 133 objectui `path:N` pointers, 6 named the same
lines in ui/, 66 named code that moved, 58 could not be checked against
today's file, and 3 were in deleted files. A clause is relocated only when
every line it cites (the pointer plus its bare `:N` follow-ons) is
byte-identical at exactly one offset, both at the cited objectui commit and
in today's file, so one clause never mixes old and new numbering. That gives
7 kept, 58 relocated, and 65 that drop the line from the pointer and keep
the reading as prose (`ui/p (:N at objectui @sha)`). Line numbers written
as prose inside a relocated clause (sibling `file.tsx:N` refs and "line N"
in eight rows) were relocated by the same rule.

Rows whose objectui reader is gone get no repoint and a dated note line:
- app.navigation.id: the useNavOrder clause (objectui#12059).
- view.list.hiddenFields and view.form.groups: the spec-bridge clauses
  (objectui#6632).
- field.widget: the permission-facet-link registration (objectui#12998).
- field.externalId: the only pointer was deleted in objectui dc14bcb, so it
  is now prose, and follow-up F23 owns finding the reader.

Key mention: 13 newly in-repo citations read a renamed key or delegate to
an anchored sibling: list.inlineEdit -> `editable`,
form.subforms -> `details`, page print members -> `print`,
chartConfig -> `chartConfigPresentation`, and flows.screens -> the
localized field keys. Each is a key-mention.baseline.json row that names the
spelling the file uses.

Tests: evidence and gate cases are retargeted from objectui to cloud/ee,
with new cases for the retired realm. The `path:NNN` contract test and the
line-citation floor are restored, as their own guard comments instruct once
that population is non-zero again. The README sections on the realm marker,
the commit pin, evidenceScope and the preview lookup now cite ui/.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tests tooling labels Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 25 changed file(s) yielded no anchor (packages/spec/liveness/README.md, packages/spec/liveness/action.json, packages/spec/liveness/app.json, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 25 changed file(s) yielded no anchor (packages/spec/liveness/README.md, packages/spec/liveness/action.json, packages/spec/liveness/app.json, …) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 145 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 a335f1defbea57ffe552d2e9efc5ad8d56a2e76a → packageMentionDocs.

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

Labels

documentation Improvements or additions to documentation size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants