Skip to content

docs(liveness): sweep the pre-ruling "no runtime consumer" notes against the previews rule (#7427) - #7445

Merged
os-help merged 1 commit into
mainfrom
claude/issue-7427-previews-sweep
Aug 10, 2026
Merged

docs(liveness): sweep the pre-ruling "no runtime consumer" notes against the previews rule (#7427)#7445
os-help merged 1 commit into
mainfrom
claude/issue-7427-previews-sweep

Conversation

@os-help

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

Copy link
Copy Markdown
Collaborator

Fixes #7427

The mechanical sweep the 2026-08-10 maintainer ruling asked for, run against the README section PR #7425 landed:

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.

Headline: zero verdicts move, and that is the finding

Not a shortfall. Three of the four display candidates that read like structural twins of PR #7425's re-graded rows fail on the half of the README rule that is easy to skip — reachability, or render vs. count. The sweep's value is that those three are now measured and written down with the line anchors, so the next reader does not re-derive them.

premise_still_valid: true for the card as a whole; the datasource half's stated cause was wrong in an instructive direction — see below.

Measurement provenance

The two known rows

1. datasource.json file-level _note — rewritten, stale on both halves independently

The card predicted the note was stale twice over. It is, but the second half is stale in the opposite direction to the prediction.

2. permission.rowLevelSecurity.label — verdict STANDS, exactly as the card's warning anticipated

PermissionPreview is registered (previews/index.ts:71) and reachable (ResourceEditPage.tsx:949), so the lookup runs — but PermissionPreview.tsx:111 reads rowLevelSecurity only as an array and :164 renders the policy COUNT (rls.length, as "N RLS rules"). It never indexes a policy. The 2026-07-30 wording "PermissionPreview counts them" was exact, and counting is not rendering: the ruling turns on the value reaching a person, which is what a length does not do.

The other measured surface, PermissionAdvancedFacets.tsx:192-193 (read) / :264 (write-back), is an authoring form — the "authoring surface echoing input" the 2026-07 correction rejected, and the ruling names previews, not edit forms. .description and .tags close the same way.

The mechanical pass

18 hits in packages/spec/liveness/*.json (rows and file-level notes whose ground is "no runtime consumer" or wording meaning it, written before 2026-08-10).

Disposition Count Rows
Re-graded dead → live 0
Display, verdict re-tested and upheld, note rewritten with the measurement 8 permission.rowLevelSecurity.label/.description/.tags, view.name, view.label, validation.label/.description/.tags
Already live, prose reconciled + evidence added 2 datasource.label, datasource.description
Measured absence recorded (README: "an absent preview is a finding to record") 3 app.areas.description, flow.description, hook.label+.description (one file-level clause)
File-level note rewritten 1 datasource.json _note
Behavioural — untouched, the ruling does not reopen them 30 app.homePageId, app.version/aria/objects/apis/sharing/embed/mobileNavigation, book.groups.translations, dashboard.widgets.actionUrl/actionType/actionIcon/responsive/aria, dashboard.aria/performance, object.externalSharingModel, permission.rowLevelSecurity.priority, action.shortcut/bulkEnabled, agent.knowledge, flow.nodes.outputSchema/errorHandling.retryDelayMs/errorHandling.fallbackNodeId/active/template, skill.triggerPhrases, query.cursor/joins/aggregations.distinct/windowFunctions/distinct, view.list.responsive/list.performance/form.defaultSort/form.aria

The three display "twins" that did not re-grade — with the line that decides it

  • view.label — ViewPreview genuinely READS it (ViewPreview.tsx:115 injects the container label as its single named listView's label, behind the body's own label). The render is unreachable: plugin-view/src/ObjectView.tsx:1119 renders the named view's label as a tab, but :1112 returns null at one entry or fewer and the preview always injects exactly one; :993 passes the label into the renderListView schema, but plugin-view/src/index.tsx:58-64 registers a bare ObjectViewRenderer that passes only schema and dataSource, so that prop is undefined here. Read point present, render cannot fire.
  • view.name — not translation.name's shape at all: ViewPreview.tsx:110 reads the name prop (the saved identity the registry passes in), and never draft.name.
  • validation.label/.description/.tags — ValidationPreview renders all three (:101:131, :102:136, :110:167-175). But the standalone validation kind was retired by ADR-0088 (#4488 审计发现的四个"授权门断连":email_template / job / validation 的元数据条目到不了执行点,action 导航项点不动 #4509) — absent from both METADATA_TYPE_SCHEMAS and UNREGISTERED_KIND_SCHEMAS — and the surviving embedded path routes to EmbeddedItemEditor's SchemaForm (anchors.ts:79, MetadataDetailDrawer.tsx:129), never ResourceEditPage's preview tab. objectui still registers a standalone create affordance (anchors.ts:347-366) whose route WOULD mount the preview; granting live on a door ADR-0088 closed is the "shipped false signpost" this ledger exists to catch. Filed as objectui#4132 — if that lands as "wire ValidationPreview into the embedded editor", these three re-grade and should.

Nice contrast the sweep produced for free: validation.tags is rendered as chips while permission.rowLevelSecurity.tags is only counted. The criterion is the render, not the key name.

Constraints honoured

Verification

packages/spec has no workspace dependencies, so the build closure is empty (--filter '@objectstack/spec^...' build matched no projects). Everything serialized under the shared verification lock.

check:liveness — green, and the arithmetic is the real check

Baseline measured first with --ledger-root against a pristine copy of liveness/, so the delta is attributable:

baseline: 355 repo-local declared, 355 resolved, 0 MISSING; 141 foreign
after   : 355 repo-local declared, 355 resolved, 0 MISSING; 143 foreign

Local unchanged (no objectui path leaked into the local bucket). Foreign +2, matching the two new evidence citations exactly — datasource.label and datasource.description. Each cites its file at two line anchors and checkEvidence dedupes them to one path, which is why the delta is +2 and not +4.

Side counters moved consistently: verifiedAt 302 → 304, producers 9 → 11, cross-repo scope 21 → 31 (the ten rows that gained a declared scope).

Reverse verification — predicted red, went red, for the predicted single cause

New realm marker, dropped on a scratch copy via --ledger-root (never the tracked file, never git stash). The edit strips only the leading objectui token from datasource.label's evidence string:

BEFORE: objectui @e9ab52f9: packages/app-shell/src/views/metadata-admin/previews/DatasourcePreview…
AFTER : @e9ab52f9: packages/app-shell/src/views/metadata-admin/previews/DatasourcePreview.tsx:96 t…

$ npx tsx scripts/liveness/check-liveness.mts --ledger-root=SCRATCH_COPY
evidence paths: 356 repo-local path(s) declared by 'live' entries, 355 resolved against this checkout, 1 MISSING; 142 attributed to another repo
✗ 1 'live' entr(ies) cite a file that is missing from THIS repo:
    datasource/label → packages/app-shell/src/views/metadata-admin/previews/DatasourcePreview.tsx
exit=1

Exactly one MISSING, naming the row I touched, and the local/foreign buckets moved by exactly one in opposite directions — so the new marker is machine-read, not decorative prose. It also confirms the dedupe claim from the other side: two line anchors of one path produced one missing entry, not two. Tracked tree re-run: exit=0, green.

Rest of the local pass

  • npx vitest run --maxWorkers=2 scripts/liveness/9 files, 166 tests passed (includes verification.test.ts, "every verifiedAt in packages/spec/liveness/*.json parses" — relevant, since six rows were re-stamped to 2026-08-10).
  • pnpm --filter @objectstack/spec typecheck — green (tsc --noEmit + check:scripts-typecheck + check:test-typecheck).
  • node scripts/check-nul-bytes.mjs — OK, 6817 files; plus a direct control-byte self-scan of packages/spec/liveness/*.json, clean.

Changeset decision — measured, not assumed

No changeset + skip-changeset. The diff is verdict-neutral: zero status lines change; what changes is note prose plus two evidence/producer citations. That is the PR #7179 shape — 11 rows re-cited, every verdict stayed live, shipped with skip-changeset and no changeset — not the PR #7425 shape, where four verdicts actually moved and a patch changeset for @objectstack/spec was correct.

Out-of-scope findings (filed, not fixed)

Both searched for duplicates first (zero open hits on DatasourcePreview, ValidationPreview, and the keyword forms), both filed unassigned.


Generated by Claude Code

…nst the previews rule (#7427)

The 2026-08-10 maintainer ruling on #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 #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 #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 (#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 #7179 shape (which shipped with skip-changeset and no changeset), not the
PR #7425 shape (verdict re-grades, patch changeset).

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 12:10pm

Request Review

@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 added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 10, 2026 — with Claude
@os-help
os-help marked this pull request as ready for review August 10, 2026 13:01
@os-help
os-help added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit e86cbf6 Aug 10, 2026
31 checks passed
@os-help
os-help deleted the claude/issue-7427-previews-sweep branch August 10, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant