Repository navigation
Commit f79b9d5
refactor(spec-liveness): the renderer's ledger evidence is in-repo under ui/; objectui becomes a retired realm that fails (#26150)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoAqVfFyhsxKuFcEP9YTBj25)_
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 已并入本仓(#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:
- #25987 moved `ListView.tsx` by 9 lines; `view.list.hiddenFields` now
cites `:2020`, `:3812-3815` and `:3830`;
- #26103 moved `NavigationRenderer.tsx` by 28 lines;
`app.navigation.runAction`'s producer now cites `:850`, `:870-875`,
`:963` and `:968`.
- **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. #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)
- **F23 (new).** Find the current reader of `field.externalId`, or
re-classify it. Its only cited reader was a dead module.
- **F24 (new, optional).** The 65 relocated `ui/` line citations are now
in-repo `path:N` pointers, and they rot in range the way #12516
describes: the two base moves above shifted seven of them in two hours.
Converting them to `#symbol` anchors is the durable form.
- **F25 (new, noted).** `docs/qa/platform-checklist/areas/*.json` still
write `objectui: packages/…` refs. That surface is not the ledger and is
outside this card item.
- **F26 (new, reported to the dispatch seat).** After this PR, the gate
and `evidence.test.ts` read 113 `ui/` files through the ledger. A
`ui/`-only PR schedules neither:
- Spec Liveness Check's PR `paths:` do not list `ui/**`, and it is not a
required context;
- Test Core does not start, and `@objectstack/spec#test:repo` does not
hash `ui/**`, so in the merge queue it is a cache hit.
So a `ui/` PR that renames a cited file or symbol lands green, and the
next spec PR goes red (#7802's shape). `packages/**` citations do not
have this gap, because spec declares those roots. Closing it means
declaring the `ui/` sources in `scripts/cross-package-test-inputs.mjs`
and `turbo.json`, and covering them in root `ci.yml` `crosspkg`, which
`check:ci-filter-parity` requires. That is Tier H, and every `ui/` PR
would then start Test Core for spec. Left to the dispatch seat; not
widened here.
## 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.com/claude-code)
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 83a26c3 commit f79b9d5
33 files changed
Lines changed: 703 additions & 385 deletions
File tree
- packages/spec
- liveness
- scripts/liveness
- ui/scripts/__tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
119 | | - | |
120 | | - | |
| 119 | + | |
| 120 | + | |
121 | 121 | | |
122 | 122 | | |
123 | | - | |
124 | | - | |
| 123 | + | |
| 124 | + | |
125 | 125 | | |
126 | 126 | | |
127 | | - | |
128 | | - | |
| 127 | + | |
| 128 | + | |
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
135 | 151 | | |
136 | 152 | | |
137 | 153 | | |
| |||
171 | 187 | | |
172 | 188 | | |
173 | 189 | | |
174 | | - | |
175 | | - | |
| 190 | + | |
| 191 | + | |
176 | 192 | | |
| 193 | + | |
| 194 | + | |
177 | 195 | | |
178 | 196 | | |
179 | 197 | | |
| |||
259 | 277 | | |
260 | 278 | | |
261 | 279 | | |
262 | | - | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
263 | 285 | | |
264 | 286 | | |
265 | 287 | | |
| |||
397 | 419 | | |
398 | 420 | | |
399 | 421 | | |
400 | | - | |
| 422 | + | |
401 | 423 | | |
402 | 424 | | |
403 | 425 | | |
404 | 426 | | |
405 | 427 | | |
406 | | - | |
| 428 | + | |
407 | 429 | | |
408 | | - | |
409 | | - | |
| 430 | + | |
410 | 431 | | |
411 | 432 | | |
412 | 433 | | |
| |||
433 | 454 | | |
434 | 455 | | |
435 | 456 | | |
436 | | - | |
437 | | - | |
438 | | - | |
439 | | - | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
440 | 461 | | |
441 | 462 | | |
442 | 463 | | |
| |||
858 | 879 | | |
859 | 880 | | |
860 | 881 | | |
861 | | - | |
862 | | - | |
| 882 | + | |
| 883 | + | |
863 | 884 | | |
864 | 885 | | |
865 | 886 | | |
| |||
0 commit comments