Skip to content

docs(liveness): designer previews count as consumers — re-grade four docs-shaped rows and write the principle into the ledger methodology (#7131) - #7425

Merged
os-help merged 1 commit into
mainfrom
claude/issue-7131-liveness-previews-count
Aug 10, 2026
Merged

os-help merged 1 commit into
mainfrom
claude/issue-7131-liveness-previews-count

Conversation

@os-help

@os-help os-help commented Aug 10, 2026 •

Copy link
Copy Markdown
Collaborator

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.json and translation.json recorded "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 objectui origin/main @ aeb8424b:

Row Read point Render point
job.label JobPreview.tsx:257 (d.label, falling back to the job name) :313, the preview card's title
job.description JobPreview.tsx:258 (d.description) :316, beneath the title when non-empty
translation.label TranslationPreview.tsx:67, first choice of the display chain :100, the item's title
translation.name TranslationPreview.tsx:67, the fallback when label is unset :100, same title

In both files d is the metadata body of the exact type the row covers, and the previews are reachable rather than merely present: previews/index.ts:62 / :50 register them against the job / translation type names, and ResourceEditPage.tsx:949 resolves the registration and hands the component the draft being edited.

The ruling

Maintainer ruling (2026-08-10, directed in session session_01BPWqbmEFU8gJepBJTHESXd): previews count as consumers.

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.

What changed

Four rows re-graded dead → live, each with a realm-marked, commit-pinned evidence string, evidenceScope: "cross-repo", verifiedAt: "2026-08-10", and a producer naming the registerMetadataPreview call 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, so sys_job was never the surface that could falsify it. The note says explicitly that live here 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 spot evidenceScope (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: the name column is still the live one on the sync path, and the body copy is still not what authored-translation-sync reads. 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 consumer section 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 as README §preview-renderer.

Verification

pnpm --filter @objectstack/spec check:liveness — green; job 13 live / 2 dead → 15 live / 0 dead, translation 17 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 objectui realm marker from job.label's evidence and re-ran the gate: exactly one MISSING, named job/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/spec liveness script tests (9 files / 166 tests), pnpm --filter @objectstack/spec typecheck, and node scripts/check-nul-bytes.mjs.

Out of scope, deliberately

The README "Current state" table's job and translation rows 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.mts deliberately checks the row set, never the count columns.

Two ledger notes still record the superseded principle as their ground — datasource.json's file-level _note and permission.json's rowLevelSecurity.label row. 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

…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
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 10, 2026 10:44am

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling labels Aug 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

⛔ 7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-help
os-help marked this pull request as ready for review August 10, 2026 11:11
@os-help
os-help added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 354b00f Aug 10, 2026
28 checks passed
@os-help
os-help deleted the claude/issue-7131-liveness-previews-count branch August 10, 2026 11:28
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…nst the previews rule (objectstack-ai#7427) (objectstack-ai#7445)

The 2026-08-10 maintainer ruling on objectstack-ai#7131 asked that "the ledger methodology
note records the principle so the next sweep asks the question mechanically".
This is that sweep, run against the README section PR objectstack-ai#7425 landed.

Eighteen rows and file-level notes whose ground was "no runtime consumer" (or
wording meaning it), written before 2026-08-10, were partitioned display vs
behavioural. Every display hit got the README's two lookup commands run against
objectui origin/main @e9ab52f9. Behavioural hits are untouched: the ruling does
not reopen the 2026-07 corrections.

ZERO verdicts move. That is the finding, not a shortfall — three of the four
display candidates that read like twins of PR objectstack-ai#7425's re-graded rows turn out
to fail on REACHABILITY or on render-vs-count:

  * permission.rowLevelSecurity.label/.description/.tags — PermissionPreview
    reads rowLevelSecurity only as an array and renders `${rls.length} RLS
    rules`. A count is not a render; the 2026-07-30 closure survives intact.
  * view.label — ViewPreview DOES read the container label (:115) and injects
    it as its single listView's label, but neither render path fires: the
    named-view tab bar returns null below two entries, and the
    `renderListView` label path needs a prop the object-view registration
    never passes.
  * view.name — the preview reads the `name` PROP, never the body copy, so it
    is not translation.name's shape after all.
  * validation.label/.description/.tags — ValidationPreview renders all three,
    but the standalone `validation` kind was retired by ADR-0088 (objectstack-ai#4509) and
    the surviving embedded path routes to EmbeddedItemEditor's SchemaForm, so
    the governed path never hands the preview a draft.

Two rows already `live` gained the falsifiable pointer a `live` verdict is
supposed to be: datasource.label/.description, whose prose still claimed "No
runtime consumer by design" while the datasource preview had been rendering
both as card title and subtitle.

Three measured ABSENCES are recorded rather than skipped, per the README's
"an absent preview is a finding to record": app.areas.description (AppPreview
has zero `areas` reads), flow.description (FlowPreview reads no description),
and hook.label/.description (no registered `hook` preview at all).

datasource.json's file-level note is rewritten: its preview clause was stale
on both halves independently. Its ground moved (the ruling), and its facts
moved the OPPOSITE way to the card's expectation — the SideBlocks were never
removed; what went away is the schema half, so three of the five renders now
acknowledge keys `.strict()` rejects. Filed as objectui#4131.

No changeset: verdict-neutral ledger prose plus evidence re-citation, the
PR objectstack-ai#7179 shape (which shipped with skip-changeset and no changeset), not the
PR objectstack-ai#7425 shape (verdict re-grades, patch changeset).


Claude-Session: https://claude.ai/code/session_016R9de1FqP7NvwKvqXi92Gh

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…fact, and eleven drifted rows are reconciled (objectstack-ai#7377) (objectstack-ai#7455)

Closes objectstack-ai#7377.

Two stages, in order — the reconciliation first, because doing the mechanism
first would have made CI red with no path to green.

STAGE 1 — per-row reconciliation. The table declares its own counting method
(`check-liveness.mts --json`, fixed in objectstack-ai#4488) and says the count columns are
never hand-edited. Nobody re-ran the snippet: 9 of 30 rows disagreed with the
gate when objectstack-ai#7377 was filed, and PR objectstack-ai#7425 added two more. Every delta is measured
and explained rather than absorbed:

  - field/action/hook/page/seed/webhook — the ADR-0010 protection envelope
    entered each schema's walked shape as the objectstack-ai#4001 campaign closed it
    (objectstack-ai#4514/objectstack-ai#4530/objectstack-ai#4531/objectstack-ai#4533/objectstack-ai#4974); the gate auto-classifies those keys `live`.
  - flow    — +1 dead: errorHandling.retryDelayMs, tombstoned by objectstack-ai#4964's rename
              to `backoffMs`. The Note said "4 tombstone entries"; it says 5.
  - action  — +1 live beyond the envelope: `description` (objectstack-ai#7367 / PR objectstack-ai#7430).
  - view    — objectstack-ai#4001 batch 6e (objectstack-ai#4534) declared three container-level keys the
              Note never mentioned: `object` live, `name`/`label` dead. The
              hand-enumerated dead set was 4 against a real 6.
  - app     — dead 9 still reconciles exactly; +1 live `_unpublished` (objectstack-ai#4829 /
              PR objectstack-ai#6942) and the type's first `planned`, `navigation.runAction`
              (objectstack-ai#4848 / PR objectstack-ai#7253).
  - job     — zero dead under objectstack-ai#7425. First row in the table where that holds
              WITH the ADR-0033 exemption still in force; the Note says so.
  - translation — zero dead under objectstack-ai#7425. Its cell had published `dead 2` beside
              a sentence naming one key, and that key had already been removed
              in objectstack-ai#4667: the number was right and the prose false, in the same
              cell, on the day it was written. Recorded as measured history.

The other 24 Notes are byte-identical. Five rows carried a SEVENTH cell against
a six-column header, which GFM drops — that prose rendered nowhere, and the
2-column table folds it back into the Notes cell losslessly.

STAGE 2 — the mechanism, on objectstack-ai#5107's precedent. The numbers move to
`packages/spec/liveness/state-counts.md` (`merge=os-regen`, registered in
`scripts/regen-artifacts.mjs` and `.gitattributes`); the Notes prose stays
hand-written, because regenerating a Note manufactures a verdict.
`gen:liveness-counts` spawns the gate rather than re-implementing its walk, and
keeps objectstack-ai#7257's skeleton row. `check:liveness` gains three legs in
`readme-table.mts`: artifact freshness by byte comparison, README-vs-artifact
row sets in both directions, and a count column reappearing in the README —
which the other two cannot see.

Reverse verification (predicted, then run against a mutated `--ledger-root`
copy): artifact deleted => MISSING, red; `view` live skewed 80->81 => STALE
naming that line, red; a count column re-added to the `object` row => red
naming the line; the `qa` row deleted => red on both the objectstack-ai#7257 heading and the
new row-set heading. Verbatim copy green.

Gates: liveness script tests 9 files / 186 tests; check-generated ledger tests
8/8; `check:liveness` green; `check:generated --reconcile-only` green;
`git-merge-regen.mjs --self-test` green (12 paths); scripts typecheck clean;
check-nul-bytes OK.


Claude-Session: https://claude.ai/code/session_01PJn5BD9LY9ZCECPs25oiDb

Co-authored-by: Claude <noreply@anthropic.com>
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/m tooling

Projects

None yet

2 participants