docs(liveness): designer previews count as consumers — re-grade four docs-shaped rows and write the principle into the ledger methodology (#7131) - #7425
Conversation
…docs-shaped rows (#7131) 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. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016R9de1FqP7NvwKvqXi92Gh
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Fixes #7131
Executes the maintainer ruling of 2026-08-10 (quoted verbatim below and in the ledger README): previews count as consumers.
What was wrong
packages/spec/liveness/job.jsonandtranslation.jsonrecorded "no runtime consumer" for four docs-shaped keys. objectui's metadata-admin previews had been rendering all four to a human the whole time — measured at objectuiorigin/main@aeb8424b:job.labelJobPreview.tsx:257(d.label, falling back to the jobname):313, the preview card's titlejob.descriptionJobPreview.tsx:258(d.description):316, beneath the title when non-emptytranslation.labelTranslationPreview.tsx:67, first choice of the display chain:100, the item's titletranslation.nameTranslationPreview.tsx:67, the fallback whenlabelis unset:100, same titleIn both files
dis the metadata body of the exact type the row covers, and the previews are reachable rather than merely present:previews/index.ts:62/:50register them against thejob/translationtype names, andResourceEditPage.tsx:949resolves the registration and hands the component the draft being edited.The ruling
What changed
Four rows re-graded
dead→live, each with a realm-marked, commit-pinnedevidencestring,evidenceScope: "cross-repo",verifiedAt: "2026-08-10", and aproducernaming theregisterMetadataPreviewcall plus the surface that resolves it — a preview no registry ever hands a draft to is a read point that never runs.Each note records what the re-grade supersedes and what it does not:
job.label— the old 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, sosys_jobwas never the surface that could falsify it. The note says explicitly thatlivehere does not mean the scheduler acquired a use for it.translation.label— the superseded wording hedged, "no runtime consumer in this repo", and that hedge was never false. What changed is that the cross-repo look was finally taken, which is exactly the blind spotevidenceScope(audit: #4667 liveness 判定的跨仓覆盖核查——两个方向各有一个实锤反例;顺带更正 homePageId 墓碑文案 #4895) exists to expose.translation.name— the re-grade supersedes one clause ("dead as a BODY key — the honest reading of a copy nobody reads"). The row's substantive door/row-column analysis is preserved verbatim and called out as the substance: thenamecolumn is still the live one on the sync path, and the body copy is still not whatauthored-translation-syncreads. The preview reads it; the sync does not.Nothing about enforce-or-remove moves. All four keys remain docs-shaped, deliberately KEPT under the ADR-0033 exemption, and still not
authorWarn'd.Methodology note — a new README section,
Designer previews count as consumers, quoting the ruling verbatim and giving the sweep a mechanical step: enumerate a type's registered preview read points before writing "no runtime consumer", and record their absence when there are none. Two commands make it a lookup rather than a search.It divides against the pre-existing
An authoring/preview renderer is NOT a runtime consumersection on what the property claims, not on what the surface is — for a display key the render is the whole of the declared effect; for a behavioural key a panel echoing the value back still proves nothing. The 2026-07 sweep's ten corrections are explicitly not reopened, and that section gains a short scope pointer so a reader landing there first is not misled. Its heading is unchanged, because several ledger notes cite it by name asREADME §preview-renderer.Verification
pnpm --filter @objectstack/spec check:liveness— green;job13 live / 2 dead → 15 live / 0 dead,translation17 live / 2 dead → 19 live / 0 dead. Repo-local evidence paths stayed at 353/353 resolved and the foreign bucket moved 131 → 135, i.e. all four new citations landed in the cross-repo bucket and none leaked into the local one.Reverse verification — dropped the
objectuirealm marker fromjob.label's evidence and re-ran the gate: exactly one MISSING, namedjob/label, with the local count rising 353 → 354 and the foreign count falling 135 → 134. Restored, green again. The realm marker is load-bearing, as expected.Also green:
packages/specliveness script tests (9 files / 166 tests),pnpm --filter @objectstack/spec typecheck, andnode scripts/check-nul-bytes.mjs.Out of scope, deliberately
The README "Current state" table's
jobandtranslationrows now carry stale counts (13/2 and 17/2) and Notes prose that enumerates the old dead sets. That table's count columns are the subject of unassigned #7377, whose stated method — "for each drifted row read the Note beside it and reconcile the prose with the new numbers" — is exactly what these two rows need. Left untouched to avoid colliding with that lane; commented on #7377 with the delta instead of filing a twin. Nothing fails:readme-table.mtsdeliberately checks the row set, never the count columns.Two ledger notes still record the superseded principle as their ground —
datasource.json's file-level_noteandpermission.json'srowLevelSecurity.labelrow. Flagged in the report on #7131 rather than fixed here; they need re-measurement under the new principle, not a text edit.Generated by Claude Code