Skip to content

Commit 23cb18d

Browse files
committed
refactor(spec-liveness): the renderer's ledger evidence is in-repo under 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
1 parent 83f4481 commit 23cb18d

32 files changed

Lines changed: 699 additions & 381 deletions

‎packages/spec/liveness/README.md‎

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ registry to fold it back onto — the override *is* its governance.
7272

7373
| Status | Meaning |
7474
|---|---|
75-
| `live` | Has a runtime consumer. Cite it in `evidence`, preferably anchored to the consuming symbol — `file#symbol` — with `file:line` as an optional convenience; for another repo's path, prefix the realm — `objectui: packages/app-shell/…` (see below). |
75+
| `live` | Has a runtime consumer. Cite it in `evidence`, preferably anchored to the consuming symbol — `file#symbol` — with `file:line` as an optional convenience; the renderer is in this repo, cited `ui/packages/app-shell/…#Symbol`; for another repo's path, prefix the realm — `cloud: packages/…` (see below). |
7676
| `experimental` / `planned` | Declared, intentionally not enforced yet. Also read from a spec `.describe()` marker like `[EXPERIMENTAL — not enforced]`. |
7777
| `dead` | Parsed, no consumer **anywhere the census looked**. Tracked for **enforce-or-remove** (ADR-0049). A key that is dead here but enforced in a sibling repo is NOT `dead` — it is `live-elsewhere`, below. |
7878
| `live-elsewhere` | Dead here by measurement, **genuinely enforced in a sibling repo** (#13483). Not deletable. The template is `manifest.runtime`, "ENFORCED AT THE CLOUD PUBLISH GATE, NOT ENFORCED AT LOAD" — its load side belongs to this repo's loader. A key whose consumer is the closed cloud runtime is `live` with a `cloud`-attributed pointer instead (`agent.json`'s `_note`). Carries its own gate-executable criteria — see the section below. Ledger-entry-only (no `.describe()` marker). |
@@ -116,22 +116,38 @@ enforce-or-remove instead of repointing at a plausible survivor.
116116

117117
**A path in another repo must say so**, or the gate will report it as rot —
118118
attributed paths are counted and never resolved, so they cannot fail this check
119-
(that boundary is deliberate: ~101 entries cite the renderer repo or the closed
120-
cloud runtime, whose files are legitimately absent here):
119+
(that boundary is deliberate: the closed cloud runtime's files are legitimately
120+
absent here):
121121

122122
```jsonc
123-
"evidence": "objectui: packages/app-shell/src/views/RecordDetailView.tsx:573"
124-
"evidence": "registered into ActionEngine (objectui packages/core/…/ActionEngine.ts:150) but no caller"
123+
"evidence": "cloud @cb8ee7ff: packages/service-ai/src/tools/action-tools.ts#buildParametersSchema"
124+
"evidence": "carried onto the tool definition (cloud packages/service-ai/…/action-tools.ts) but no runtime here"
125125
```
126126

127-
A realm marker (`objectui`, `cloud`, `ee`) attributes the paths that follow it,
128-
up to the next clause boundary (`;` or `)`), so a string can cite both repos —
127+
A realm marker (`cloud`, `ee`) attributes the paths that follow it, up to the
128+
next clause boundary (`;` or `)`), so a string can cite both repos —
129129
`framework` switches back explicitly. `packages/services/service-ai/…` is always
130130
treated as foreign: that is the closed cloud runtime, and `packages/services/`
131131
here ships every sibling service except it. A path that is not repo-rooted
132132
(`app-shell/MetadataProvider.tsx`, `action-button/-group`) reads as prose and is
133133
neither resolved nor reported.
134134

135+
**The renderer is not another repo.** objectui merged into this one as `ui/`
136+
(#25677), so its files are cited like any other path — `ui/packages/app-shell/src/views/RecordDetailView.tsx#RecordDetailView`
137+
— and held to the same standard: the file exists, a cited line is inside it, an
138+
anchored symbol is in it, and the file names the key. `objectui` is a **retired**
139+
realm marker (`RETIRED_REALMS` in `scripts/liveness/evidence.mts`): a path still
140+
attributed to it FAILS, with its `ui/` spelling printed as the remedy. It cannot
141+
stay foreign (counted, never resolved, it would never fail) and it cannot be read
142+
as local either: both trees have a `packages/core/`, so `objectui: packages/core/…`
143+
could pass on a file that never was the reader. A path already spelled `ui/…` is
144+
local whatever prose precedes it, so a dated reading may keep naming the old repo —
145+
`ui/packages/layout/src/NavigationRenderer.tsx (:961 at objectui @940ba24)` — and
146+
that is exactly how #25712 re-rooted the 164 renderer rows: a `path:NNN` whose cited
147+
block is byte-identical at one offset of today's file was relocated there; any other
148+
line left the pointer and stayed behind as that dated prose, because a line read at
149+
an old objectui commit is not a line of this checkout.
150+
135151
> This replaces the old advice to write objectui paths "as prose to avoid false
136152
> stale-flags." That was a workaround for a parser bug — the check took
137153
> `evidence.split(':')[0]` as the filename, so any prose made it fail. It flagged
@@ -171,9 +187,11 @@ Two rules, and the asymmetry between them is the point:
171187
loudly instead.
172188

173189
Most entries predate the field and are simply undated; date them as you
174-
re-verify rather than back-filling guesses. **For objectui-side evidence, pin
175-
the commit** (`objectui @732b1bf`) — `action.undoable`'s reader line numbers had
190+
re-verify rather than back-filling guesses. **For cloud-side evidence, pin the
191+
commit** (`cloud @15f55df`) — `action.undoable`'s objectui reader line numbers had
176192
already drifted by 28 lines one day after the issue citing them was filed.
193+
Renderer evidence needs no pin since the merge (#25712): `ui/` is this checkout,
194+
and the gate bounds its lines and anchors on every run.
177195

178196
### `producer` — a consumer is only HALF the call graph (#4837)
179197

@@ -259,7 +277,11 @@ barrel package adds a blind spot, and the renderer repo is all barrels.
259277
| Value | Means |
260278
|---|---|
261279
| `in-repo` | the call graph was closed inside this repo only |
262-
| `cross-repo` | a named foreign realm was walked too — say **which**, in the evidence, and **pin the commit** (`objectui @c2fd1223`): `action.undoable`'s reader line numbers drifted 28 lines in one day (#3714) |
280+
| `cross-repo` | a named foreign realm was walked too — say **which**, in the evidence, and **pin the commit** (`cloud @15f55df`): `action.undoable`'s reader line numbers drifted 28 lines in one day (#3714) |
281+
282+
`in-repo` covers `ui/` — the renderer is this repo since #25712, which moved the
283+
scope of every re-rooted renderer row from `cross-repo` to `in-repo` (a row that
284+
also cites `cloud` kept `cross-repo`; an undeclared scope stayed undeclared).
263285

264286
Absent = scope undeclared, a worklist row rather than a failure; the field is
265287
younger than nearly every entry. A value outside the vocabulary FAILS, the same
@@ -397,16 +419,15 @@ the maintainer settled it directly:
397419
398420
**The mechanical rule, for the next sweep.** Before writing `"no runtime
399421
consumer"` — or any wording that means it — **enumerate the metadata-admin preview
400-
read points** for the type, in objectui, and say what you found. The population is
422+
read points** for the type, under `ui/`, and say what you found. The population is
401423
small, enumerable, and registered by type name, so this is a lookup and not a
402424
search:
403425

404426
```bash
405427
# 1. does this type have a preview at all?
406-
git -C ../objectui grep -n "registerMetadataPreview('<type>'" origin/main
428+
git grep -n "registerMetadataPreview('<type>'" -- ui/
407429
# 2. what does that preview read off the draft?
408-
git -C ../objectui show origin/main:packages/app-shell/src/views/metadata-admin/previews/<X>Preview.tsx \
409-
| grep -n 'd\.<key>'
430+
grep -n 'd\.<key>' ui/packages/app-shell/src/views/metadata-admin/previews/<X>Preview.tsx
410431
```
411432

412433
An absent preview is a finding to record, not a step to skip — "the type has no
@@ -433,10 +454,10 @@ person.
433454
because a human sees it in the designer; the scheduler still stores name/schedule
434455
only, and the row says so. A re-grade is **not** an ADR-0033 change: these four
435456
rows are docs-shaped, deliberately KEPT, and still not `authorWarn`'d — nothing
436-
about enforce-or-remove moves. Cite the preview the way any cross-repo evidence is
437-
cited: realm marker, pinned objectui commit, and a `producer` naming the
438-
`registerMetadataPreview` call plus the surface that resolves it — a preview no
439-
registry hands a draft to is a read point that never runs.
457+
about enforce-or-remove moves. Cite the preview the way any in-repo evidence is
458+
cited — `ui/…#Symbol` — with a `producer` naming the `registerMetadataPreview`
459+
call plus the surface that resolves it: a preview no registry hands a draft to is
460+
a read point that never runs.
440461

441462
### How to verify a claim without fooling yourself
442463

@@ -858,8 +879,8 @@ The governed set is `GOVERNED` at the top of `check-liveness.mts`. To add a type
858879
2. Seed `<type>.json` from that type's liveness audit (file:line evidence) + targeted
859880
greps. **Classify only with evidence** — `live` needs a cited consumer; `dead` needs a
860881
confirmed absence.
861-
3. **Confirmed absence means BOTH repos.** The renderer layer is a legitimate consumer
862-
(`live` with objectui evidence as prose), so grep `../objectui` before writing `dead`.
882+
3. **Confirmed absence includes the renderer.** The renderer layer is a legitimate
883+
consumer (`live` with `ui/…` evidence), so grep `ui/` before writing `dead`.
863884
Precedent: `enable.trackHistory` was misclassified dead for a month while
864885
RecordDetailView had been gating the History tab on it the whole time (#2707).
865886
4. Add the type to `GOVERNED`; confirm the gate is green.

0 commit comments

Comments
 (0)