Skip to content

Commit 354b00f

Browse files
os-helpclaude
andauthored
docs(liveness): designer previews count as consumers — re-grade four docs-shaped rows (#7131) (#7425)
The ledger recorded "no runtime consumer" for job.label, job.description, translation.label and translation.name. objectui's metadata-admin previews had been rendering all four to a human the whole time. Per the maintainer ruling of 2026-08-10, a designer preview that renders a key to a human is a runtime consumer. The four rows re-grade dead -> live with realm-marked, commit-pinned objectui evidence (@aeb8424b) and a `producer` naming the registerMetadataPreview call plus the surface that resolves it — a preview no registry hands a draft to is a read point that never runs. Nothing about enforce-or-remove moves: all four remain docs-shaped, deliberately KEPT under ADR-0033, and still not authorWarn'd. The README gains the methodology section the ruling asked for, dividing against the existing "an authoring/preview renderer is NOT a runtime consumer" section on what the property CLAIMS rather than on what the surface is. The 2026-07 sweep's ten corrections are not reopened. Claude-Session: https://claude.ai/code/session_016R9de1FqP7NvwKvqXi92Gh Co-authored-by: Claude <noreply@anthropic.com>
1 parent c842043 commit 354b00f

4 files changed

Lines changed: 118 additions & 12 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
"@objectstack/spec": patch
3+
---
4+
5+
docs(liveness): designer previews count as consumers — re-grade four docs-shaped rows dead → live and write the principle into the ledger methodology (#7131)
6+
7+
The ledger said `job.label`, `job.description`, `translation.label` and
8+
`translation.name` had **no runtime consumer**. objectui's metadata-admin
9+
previews had been rendering all four to a human the whole time:
10+
`JobPreview.tsx` takes `label`/`description` off the job draft and renders them
11+
as the preview card's title and subtitle, and `TranslationPreview.tsx` takes
12+
`label` — falling back to the body `name` — and renders it as the item's title.
13+
14+
Per the maintainer ruling of 2026-08-10, a designer preview that renders a key
15+
to a human **is** a runtime consumer, so the four rows re-grade to `live` with
16+
realm-marked, commit-pinned objectui evidence, and each carries a `producer`
17+
naming the `registerMetadataPreview` call and the surface that resolves it — a
18+
preview no registry ever hands a draft to is a read point that never runs.
19+
20+
Nothing about enforce-or-remove moves: all four keys remain docs-shaped,
21+
deliberately KEPT under the ADR-0033 exemption, and still not `authorWarn`'d.
22+
`job.label` is `live` because a human sees it in the designer; the scheduler
23+
still stores name and schedule only, and the row now says so explicitly.
24+
25+
The README gains the methodology section the ruling asked for, so the next sweep
26+
asks the question mechanically instead of rediscovering it: enumerate a type's
27+
registered preview read points **before** writing "no runtime consumer", and
28+
record their absence when there are none. It divides against the existing
29+
"an authoring/preview renderer is NOT a runtime consumer" section on what the
30+
property claims rather than on what the surface is — for a **display** key the
31+
render is the whole of the declared effect, while for a **behavioural** key a
32+
panel echoing the value back still proves nothing. The 2026-07 sweep's ten
33+
corrections are explicitly not reopened.
34+
35+
Ledger and documentation only; no schema, no runtime behaviour.

packages/spec/liveness/README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,13 @@ means "the realms named in the evidence", never "everywhere".
240240

241241
### ⚠️ An authoring/preview renderer is NOT a runtime consumer
242242

243+
> **Scope narrowed 2026-08-10 (#7131) — read the next section with this one.** What
244+
> follows holds for a property that claims to **do** something: gate, bind, route,
245+
> filter, enforce. It does *not* settle a property whose declared effect is simply
246+
> to **be shown**, where the render is not a stand-in for the behaviour but *is* the
247+
> behaviour. None of the thirteen re-verifications below is reopened by that split —
248+
> all thirteen are behavioural keys.
249+
243250
`live` means **authoring the property changes runtime behaviour**. A Studio
244251
`*.form.ts` input or a `metadata-admin/previews/*Preview.tsx` panel merely
245252
*echoes back what the author typed* — it proves the property round-trips, never
@@ -281,6 +288,58 @@ enforced" warning for a month while it worked, which is an invitation to skip a
281288
shipped feature. Erring toward `dead` is the right default *and* a debt to
282289
re-verify.
283290

291+
### Designer previews count as consumers (maintainer ruling, 2026-08-10, #7131)
292+
293+
The section above is the *over-claim* guard. It also produced an under-claim, and
294+
the maintainer settled it directly:
295+
296+
> **Maintainer ruling (2026-08-10, directed in session `session_01BPWqbmEFU8gJepBJTHESXd`): previews count as consumers.**
297+
>
298+
> A designer preview that renders a key to a human is a runtime consumer — the ledger's "no runtime consumer" verdict must include metadata-admin preview read points. The affected docs-shaped rows (`job.label`/`job.description`, `translation.label`/`.name`) re-grade from dead to live, and the ledger methodology note records the principle so the next sweep asks the question mechanically.
299+
300+
**The mechanical rule, for the next sweep.** Before writing `"no runtime
301+
consumer"` — or any wording that means it — **enumerate the metadata-admin preview
302+
read points** for the type, in objectui, and say what you found. The population is
303+
small, enumerable, and registered by type name, so this is a lookup and not a
304+
search:
305+
306+
```bash
307+
# 1. does this type have a preview at all?
308+
git -C ../objectui grep -n "registerMetadataPreview('<type>'" origin/main
309+
# 2. what does that preview read off the draft?
310+
git -C ../objectui show origin/main:packages/app-shell/src/views/metadata-admin/previews/<X>Preview.tsx \
311+
| grep -n 'd\.<key>'
312+
```
313+
314+
An absent preview is a finding to record, not a step to skip — "the type has no
315+
registered preview" is exactly the sentence a later sweep needs, and it is the one
316+
`translation.label`'s superseded *"no runtime consumer **in this repo**"* was
317+
missing. That hedge was never false; the cross-repo look simply was not taken,
318+
which is the blind spot `evidenceScope` (#4895) exists to expose.
319+
320+
**Why this does not contradict the section above.** The two rules divide on what
321+
the property claims, not on what the surface is:
322+
323+
| The property's declared effect | Does a preview render settle it? |
324+
|---|---|
325+
| **Display** — docs-shaped annotation, `label` / `description` / a title fallback | **Yes.** Being shown to a human is the whole of the claimed effect. There is no second layer where the "real" consumer would live, so the preview is not standing in for anything. |
326+
| **Behaviour** — gates, bindings, routes, filters, permissions | **No.** The 2026-07 sweep's verdict stands unchanged: 10 of 13 preview-cited entries were wrong. A panel echoing `shortcut` back is not a keybinding, and echoing `permissions` back is not a gate. |
327+
328+
So the failure the section above records — a preview citation used as evidence
329+
that *something acts on* the value — is untouched. What is corrected is the
330+
opposite move: taking a preview's **absence from the search** as proof that
331+
*nothing reads* the value, for a key whose only job was ever to be read by a
332+
person.
333+
334+
**What `live` does and does not mean on a re-graded row.** `job.label` is `live`
335+
because a human sees it in the designer; the scheduler still stores name/schedule
336+
only, and the row says so. A re-grade is **not** an ADR-0033 change: these four
337+
rows are docs-shaped, deliberately KEPT, and still not `authorWarn`'d — nothing
338+
about enforce-or-remove moves. Cite the preview the way any cross-repo evidence is
339+
cited: realm marker, pinned objectui commit, and a `producer` naming the
340+
`registerMetadataPreview` call plus the surface that resolves it — a preview no
341+
registry hands a draft to is a read point that never runs.
342+
284343
### How to verify a claim without fooling yourself
285344

286345
Three false conclusions were published during this sweep, all from the same

packages/spec/liveness/job.json

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@
99
"note": "scheduling identity; a job without one is skipped loudly."
1010
},
1111
"label": {
12-
"status": "dead",
13-
"verifiedAt": "2026-08-02",
14-
"note": "display metadata; no runtime consumer (sys_job stores name/schedule only). Docs-shaped annotation, deliberately KEPT and not authorWarn'd — the hook.label/description precedent, exempt from enforce-or-remove (ADR-0033)."
12+
"status": "live",
13+
"verifiedAt": "2026-08-10",
14+
"evidenceScope": "cross-repo",
15+
"evidence": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/JobPreview.tsx:257 takes `label` off the job draft with the job's own `name` as fallback, and packages/app-shell/src/views/metadata-admin/previews/JobPreview.tsx:313 renders it as the preview card's title",
16+
"producer": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/index.ts:62 registers JobPreview against the `job` metadata type, and packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:949 resolves that registration and hands the component the draft being edited — the read point is reachable, not merely present",
17+
"note": "display metadata, and it IS displayed: the metadata-admin job preview shows it as the card title, falling back to the job `name` when unset. RE-GRADED dead → live 2026-08-10 (#7131) under the maintainer ruling that a designer preview rendering a key to a human is a runtime consumer — see README, 'Designer previews count as consumers'. The superseded wording, 'no runtime consumer (sys_job stores name/schedule only)', was true about the SCHEDULER and false as a whole-system claim: for a docs-shaped key the display IS the runtime effect, so sys_job was never the surface that could falsify it. UNCHANGED by the re-grade: still docs-shaped annotation, deliberately KEPT and not authorWarn'd — the hook.label/description precedent, exempt from enforce-or-remove (ADR-0033). `live` here does not mean the scheduler acquired a use for it."
1518
},
1619
"description": {
17-
"status": "dead",
18-
"verifiedAt": "2026-08-02",
19-
"note": "same as `label`: docs-shaped, deliberately kept, no warning."
20+
"status": "live",
21+
"verifiedAt": "2026-08-10",
22+
"evidenceScope": "cross-repo",
23+
"evidence": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/JobPreview.tsx:258 takes `description` off the job draft, and packages/app-shell/src/views/metadata-admin/previews/JobPreview.tsx:316 renders it beneath the title whenever it is non-empty",
24+
"producer": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/index.ts:62 registers JobPreview against the `job` metadata type, and packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:949 resolves that registration and hands the component the draft being edited",
25+
"note": "same as `label`: docs-shaped, deliberately kept, no warning — and displayed under the title in the same preview card. Re-graded dead → live with `label` on 2026-08-10 (#7131), same ruling, same ADR-0033 KEPT status."
2026
},
2127
"schedule": {
2228
"status": "live",

packages/spec/liveness/translation.json

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
"_note": "TranslationItemSchema (#3778 — one locale's translations, the SAME groups the file-authored bundles use). NO LONGER A PIPE: the schema was a z.preprocess wrapping the retired object-first-dialect guard, which the gate's walker could not see through until #4488 fixed unwrap() to take the OUT side of a transform-input pipe — `translation` was literally unwalkable before this ledger. #4001 closed the shape with `.strict()` and folded the guard's ten prescriptions into the unknown-key `guidance`, so the preprocess is gone and the registered schema is a plain strict object. Consumer chain: runtime-authored items sync into the i18n adapter's authored layer (packages/core/src/fallbacks/authored-translation-sync.ts — at kernel:ready, on metadata:reloaded, and on translation mutations; #2591 closed the publish dead-end), file bundles load via service-i18n; both merge into ONE tree read by the spec resolvers (packages/spec/src/system/i18n-resolver.ts), the REST localization layer (translateMetaItem/translateMetaTypes), objectui's client resolvers (useObjectLabel/useSettingsLabel), and plugin-audit's summary localizer. WALK BOUNDARY: every group is a z.record keyed by target names — the drill sees each record's VALUE shape one level; the deeper per-key conventions (objects.<n>.fields.<f>.label, settings.<ns>.keys.<k>.options.<v>, …) are governed by the resolvers cited per row, not by ledger rows. Note also the sync merges the RAW stored payload (authored-translation-sync.ts:155, not a schema re-parse), so the declared groups below are the CONTRACT while undeclared keys technically flow through on rows already stored — the resolvers read only the declared conventions. Since #4001 no NEW row can acquire one: the metadata door rejects an undeclared key instead of stripping it, so that residue is a finite set that only shrinks. 10 of 11 groups live; the one dead group (`validationMessages`) is pointed at by #3778's own legacy-key migration table, making it a shipped false signpost. Seeded 2026-08-01 (#4488).",
44
"props": {
55
"name": {
6-
"status": "dead",
7-
"verifiedAt": "2026-08-01",
8-
"note": "Item identity, declared in #4001 and dead as a BODY key — which is the honest reading of a copy nobody reads. The row's `name` column is the live one: the metadata door takes it from the URL (`saveMetaItem({ name })`, rest-server.ts:3903), and `authored-translation-sync` reads `row.name` as the locale fallback for pre-#3778 rows (:140-148) while explicitly destructuring the body copy back out before merging (:154-159). Declared anyway, and deliberately not authorWarn'd, for two reasons: the platform's own create seed sends it (`metadata-create-seeds.ts`, whose stated contract is that EVERY seed carries placeholder identity), so a warning would fire on our own shape; and `translation` being the one registered type of 25 without a `name` is exactly the irregularity an AI author trips on. Undeclared it was silently stripped, which is how the seed gate — the canonical 'designer create shape ≠ spec' guard — passed for years while two thirds of the seed it validated was being thrown away."
6+
"status": "live",
7+
"verifiedAt": "2026-08-10",
8+
"evidenceScope": "cross-repo",
9+
"evidence": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx:67 falls back to the draft's BODY `name` when `label` is unset, and packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx:100 renders the result as the preview card's title",
10+
"producer": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/index.ts:50 registers TranslationPreview against the `translation` metadata type, and packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:949 resolves that registration and hands the component the draft being edited",
11+
"note": "Item identity, declared in #4001. RE-GRADED dead → live 2026-08-10 (#7131), and the re-grade supersedes exactly ONE clause of the old note: 'dead as a BODY key — the honest reading of a copy nobody reads'. The body copy has a measured reader — objectui's metadata-admin translation preview uses it as the display fallback when `label` is unset — so under the maintainer ruling that a designer preview rendering a key to a human is a runtime consumer (see README, 'Designer previews count as consumers') the copy is read. THE REST OF THIS ROW STANDS UNCHANGED AND IS THE SUBSTANCE, including its door/row-column analysis: the row's `name` column is the live one on the SYNC path, and the body copy is still not what the sync reads — the preview reads it, the sync does not. The metadata door takes it from the URL (`saveMetaItem({ name })`, rest-server.ts:3903), and `authored-translation-sync` reads `row.name` as the locale fallback for pre-#3778 rows (:140-148) while explicitly destructuring the body copy back out before merging (:154-159). Declared anyway, and deliberately not authorWarn'd, for two reasons: the platform's own create seed sends it (`metadata-create-seeds.ts`, whose stated contract is that EVERY seed carries placeholder identity), so a warning would fire on our own shape; and `translation` being the one registered type of 25 without a `name` is exactly the irregularity an AI author trips on. Undeclared it was silently stripped, which is how the seed gate — the canonical 'designer create shape ≠ spec' guard — passed for years while two thirds of the seed it validated was being thrown away."
912
},
1013
"label": {
11-
"status": "dead",
12-
"verifiedAt": "2026-08-01",
13-
"note": "Display metadata with no runtime consumer in this repo. Not authorWarn'd: the README's rule is that pure display annotation (`description`, `tags`, `icon`) must not warn, and the `job.label` precedent is exactly this — docs-shaped, deliberately kept, ADR-0033 exempt from enforce-or-remove. Shipped with `name` in the create seed for the same reason."
14+
"status": "live",
15+
"verifiedAt": "2026-08-10",
16+
"evidenceScope": "cross-repo",
17+
"evidence": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx:67 takes `label` off the translation draft as the first choice of the display chain, and packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx:100 renders the result as the preview card's title",
18+
"producer": "objectui @aeb8424b: packages/app-shell/src/views/metadata-admin/previews/index.ts:50 registers TranslationPreview against the `translation` metadata type, and packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:949 resolves that registration and hands the component the draft being edited",
19+
"note": "Display metadata — and the display exists, one repo over: the metadata-admin translation preview renders it as the item's title. RE-GRADED dead → live 2026-08-10 (#7131) under the maintainer ruling that a designer preview rendering a key to a human is a runtime consumer — see README, 'Designer previews count as consumers'. Read the superseded wording carefully: 'no runtime consumer IN THIS REPO' was literally accurate and remains so — what changed is that the cross-repo look was finally taken, which is exactly the blind spot `evidenceScope` exists to make visible (#4895). UNCHANGED: not authorWarn'd — the README's rule is that pure display annotation (`description`, `tags`, `icon`) must not warn, and the `job.label` precedent is exactly this — docs-shaped, deliberately kept, ADR-0033 exempt from enforce-or-remove. Shipped with `name` in the create seed for the same reason."
1420
},
1521
"locale": {
1622
"status": "live",

0 commit comments

Comments
 (0)