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:

Property Was Reality Now
skill.permissions live (preview) the cloud SkillRegistry reads only active/triggerConditions/tools — nothing gates invocation by this list dead + authorWarn
agent.knowledge live (preview) search_knowledge takes sourceIds from the LLM's tool-call args, never from the agent record — a declared scope constrains nothing dead + authorWarn
action.disabled live (preview) genuinely enforced — on one of six rendering surfaces. Right verdict, wrong reason, and it hid a five-surface silent no-op live, 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

vercel Bot commented Jul 27, 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 Jul 27, 2026 2:26pm

Request Review

@github-actions github-actions Bot 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 main Jul 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant