Skip to content

docs(liveness): stop counting authoring/preview renderers as runtime consumers (#1878) - #3685

Merged
os-zhuang merged 1 commit into
mainfrom
fix/liveness-ledger-ai-scope
Jul 27, 2026
Merged

docs(liveness): stop counting authoring/preview renderers as runtime consumers (#1878)#3685
os-zhuang merged 1 commit into
mainfrom
fix/liveness-ledger-ai-scope

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Follow-through of the §3 naming-drift recheck (#3677). Ledger-only; releases nothing.

The calibration bug

live is supposed to mean authoring the property changes runtime behaviour. But a 2026-06 sweep that "missed objectui" over-corrected and marked 13 properties live citing only a metadata-admin/previews/*Preview.tsx panel — a surface that echoes back what the author typed. It proves the property round-trips; it proves nothing about enforcement.

Three of those 13 were re-verified during the recheck. All three were wrong or misleading:

PropertyWasRealityNow
skill.permissionslive (preview)the cloud SkillRegistry reads only active/triggerConditions/tools — nothing gates invocation by this listdead + authorWarn
agent.knowledgelive (preview)search_knowledge takes sourceIds from the LLM's tool-call args, never from the agent record — a declared scope constrains nothingdead + authorWarn
action.disabledlive (preview)genuinely enforced — on one of six rendering surfaces. Right verdict, wrong reason, and it hid a five-surface silent no-oplive, evidence corrected

That last row is the sharpest evidence: the preview-based verdict was technically "live" while a spec-authored disabled did nothing on five of six surfaces (fixed in objectui#2863, dogfooded by #3643).

Changes

  • skill.json / agent.json — corrected to dead + authorWarn + an actionable authorHint (gate at the agent / restrict at the knowledge service). skill.permissions now mirrors the identical tool.permissions entry, which was already dead + authorWarn — the two were giving authors opposite signals for the same non-enforcement.
  • action.json — evidence updated to the six real rendering surfaces, with the history recorded.
  • liveness/README.md — count table synced (hand-maintained: agent 14/5/013/5/1, skill 10/–/–9/–/1) and a new "an authoring/preview renderer is NOT a runtime consumer" section that names the ten still-unverified preview-only claims (action.execute/shortcut/bulkEnabled, flow.status/active, skill.triggerPhrases, tool.category/requiresConfirmation/active/builtIn) and states the tie-break rule: when in doubt prefer dead + authorWarn — a warning on a property that works costs nothing; silence on a property that does nothing ships a bug.

What this does NOT do

It does not decide whether skill-level permissions or agent knowledge-scoping should be enforced — both runtimes live in the closed cloud repo, and cloud even documents the skill-permission intent in a comment without implementing it. That enforce-or-prune decision is filed separately; this PR only stops the ledger from telling authors a security-shaped field is live when it isn't.

Refs #1878, #3677.

🤖 Generated with Claude Code

…consumers (#1878)
A 2026-06 sweep that "missed objectui" over-corrected and marked 13 properties
`live` on the evidence of a metadata-admin previews/*Preview.tsx panel — a
surface that only echoes what the author typed. `live` is supposed to mean
"authoring this changes runtime behaviour".
Three of the 13 were re-verified in the §3 naming-drift recheck; all three
were wrong or misleading:
- skill.permissions -> dead + authorWarn. The cloud SkillRegistry reads only
active/triggerConditions/tools; nothing gates invocation by this list.
Mirrors the identical tool.permissions entry. (Cloud documents the intent
in a comment without implementing it.)
- agent.knowledge -> dead + authorWarn. search_knowledge takes sourceIds from
the LLM's tool-call arguments, never from the agent record, so a declared
knowledge scope constrains nothing (and an agent can search sources it was
never scoped to).
- action.disabled: verdict kept (it IS live now) but evidence corrected to the
six rendering surfaces. At ledger-writing time it was enforced on ONE of
six, so the preview-based verdict hid a real five-surface silent no-op —
fixed in objectui#2863.
Also: sync the hand-maintained count table (agent 14/5/0 -> 13/5/1, skill
10/-/- -> 9/-/1) and add a "an authoring/preview renderer is NOT a runtime
consumer" section naming the ten still-unverified preview-only claims, with
the tie-break rule: when in doubt prefer dead + authorWarn — a warning on a
property that works costs nothing; silence on a property that does nothing
ships a bug.
check:liveness green (exit 0); the 13 unregistered-proof warnings are
pre-existing on main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 27, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 27, 2026 2:26pm

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tooling size/s labels Jul 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

104 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 packages/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 packages/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/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 packages/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/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 packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/kernel/services-checklist.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/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/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/kernel/runtime-capabilities.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/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/v9.mdx(via @objectstack/spec)
  • content/docs/ui/actions.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/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)

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-zhuang
os-zhuang merged commit 3177d51 into mainJul 27, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the fix/liveness-ledger-ai-scope branch July 27, 2026 14:48
xuyushun441-sys pushed a commit that referenced this pull request Jul 27, 2026
…f 10 were wrong (#3686)
Closes the sweep opened in #3685. Final tally across all 13 properties the
2026-06 pass marked `live` on preview-renderer evidence: 3 stand, 10 were
wrong — a 77% error rate for that standard.
Corrected to dead + authorWarn (with actionable hints):
- action.shortcut / action.bulkEnabled — registered into ActionEngine, but
getShortcuts()/handleShortcut()/getBulkActions()/executeBulk() have no
non-test caller and no keydown listener feeds them. Bulk toolbars are
driven by the LIST VIEW's bulkActions/bulkActionDefs instead.
- flow.active — deprecated no-op; `status` is what gates binding/execution.
Sharper than inert: the spec default is false while an unset flow runs, so
the key reads as if it disabled the flow.
- skill.triggerPhrases — a runtime path reads it, but only to hand it back to
API clients. Phrases are never matched against user messages; activation is
triggerConditions + the agent's skills[] + explicit /skill-name pinning.
- tool.category / active / builtIn — not part of AIToolDefinition; the tool
set reaches the LLM as name/description/parameters only. Contrast
agent.active and skill.active, which ARE enforced.
- tool.requiresConfirmation — SAFETY-shaped and unenforced on every path
(LLM tool set, ToolRegistry.execute, the REST execute route, the MCP
bridge). Every real requiresConfirmation read is action.ai.* — a different,
live property. ADR-0033 already resolved to delete this placeholder.
Kept live, evidence corrected to the real reader:
- action.execute — ActionRunner.ts:704 + the spec's execute->target transform.
Records a live divergence: the transform prefers `target`, ActionRunner
prefers `execute`, so an action declaring both runs different code on the
two sides.
- flow.status — engine.ts:1374-1382 gates binding AND execution since
497bda8. The file-level _note claiming "status/active gate nothing" was
true when written and became false a month later; rewritten.
README: count tables synced (action 33/1/2, flow 26/-/5, skill 8/-/2,
tool 5/1/5) and the methodology section extended with the final tally, the
two failure directions (over- AND under-stating liveness), and the three
search traps that produced false negatives during this work — including that
macOS `git grep -E` silently ignores `\b`.
check:liveness green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
os-zhuang added a commit that referenced this pull request Jul 27, 2026
…f 10 were wrong (#3686) (#3711)
Closes the sweep opened in #3685. Final tally across all 13 properties the
2026-06 pass marked `live` on preview-renderer evidence: 3 stand, 10 were
wrong — a 77% error rate for that standard.
Corrected to dead + authorWarn (with actionable hints):
- action.shortcut / action.bulkEnabled — registered into ActionEngine, but
getShortcuts()/handleShortcut()/getBulkActions()/executeBulk() have no
non-test caller and no keydown listener feeds them. Bulk toolbars are
driven by the LIST VIEW's bulkActions/bulkActionDefs instead.
- flow.active — deprecated no-op; `status` is what gates binding/execution.
Sharper than inert: the spec default is false while an unset flow runs, so
the key reads as if it disabled the flow.
- skill.triggerPhrases — a runtime path reads it, but only to hand it back to
API clients. Phrases are never matched against user messages; activation is
triggerConditions + the agent's skills[] + explicit /skill-name pinning.
- tool.category / active / builtIn — not part of AIToolDefinition; the tool
set reaches the LLM as name/description/parameters only. Contrast
agent.active and skill.active, which ARE enforced.
- tool.requiresConfirmation — SAFETY-shaped and unenforced on every path
(LLM tool set, ToolRegistry.execute, the REST execute route, the MCP
bridge). Every real requiresConfirmation read is action.ai.* — a different,
live property. ADR-0033 already resolved to delete this placeholder.
Kept live, evidence corrected to the real reader:
- action.execute — ActionRunner.ts:704 + the spec's execute->target transform.
Records a live divergence: the transform prefers `target`, ActionRunner
prefers `execute`, so an action declaring both runs different code on the
two sides.
- flow.status — engine.ts:1374-1382 gates binding AND execution since
497bda8. The file-level _note claiming "status/active gate nothing" was
true when written and became false a month later; rewritten.
README: count tables synced (action 33/1/2, flow 26/-/5, skill 8/-/2,
tool 5/1/5) and the methodology section extended with the final tally, the
two failure directions (over- AND under-stating liveness), and the three
search traps that produced false negatives during this work — including that
macOS `git grep -E` silently ignores `\b`.
check:liveness green.
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/stooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang