Skip to content

docs(liveness): re-verify the last ten preview-only live claims — 8 of 10 were wrong (#3686) - #3711

Merged
os-zhuang merged 1 commit into
mainfrom
fix/liveness-ledger-ten-preview-claims
Jul 27, 2026
Merged

docs(liveness): re-verify the last ten preview-only live claims — 8 of 10 were wrong (#3686)#3711
os-zhuang merged 1 commit into
mainfrom
fix/liveness-ledger-ten-preview-claims

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes the preview-claim sweep opened in #3685. Ledger-only; releases nothing.

Final tally: the preview-renderer standard was wrong 77% of the time

Of the 13 properties a 2026-06 pass marked live citing only a metadata-admin/previews/*Preview.tsx panel, 10 were wrong.

Corrected → dead + authorWarn

Property Why it isn't live
action.shortcut registered into ActionEngine.shortcuts[], but getShortcuts()/handleShortcut() have no non-test caller and no keydown listener feeds them; objectui's real keyboard stack never touches ActionEngine
action.bulkEnabled same shape — getBulkActions()/executeBulk() uncalled. The multi-select toolbar is driven by the list view's bulkActions/bulkActionDefs
flow.active deprecated no-op. Sharper than inert: 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; tools reach the LLM as name/description/parameters only. tool.active is the sharp one — agent.active and skill.active are enforced, so the inconsistency is invisible to an author
tool.requiresConfirmation safety-shaped and unenforced on every path — see below

Kept live, evidence corrected to the real reader

  • action.executeActionRunner.ts:704 + the spec's execute → target transform. ⚠️ Records a live divergence: the transform prefers target when both are set, ActionRunner does execute || target. An action declaring both runs different code client- vs server-side.
  • flow.statusengine.ts:1374-1382 gates binding and execution. The file-level _note claiming "status/active gate nothing" was true when written and falsified a month later by 497bda853; rewritten.

⚠️ tool.requiresConfirmation deserves its own note

Nothing pauses for confirmation on this flag — not the LLM tool set (vercel-adapter.ts:263-272), not ToolRegistry.execute, not POST /ai/tools/:name/execute, not the MCP bridge (which uses a hardcoded destructive-name list). Every real requiresConfirmation read in all three repos is action.ai.requiresConfirmation — a different, genuinely live property.

What makes it worse than inert: the authoring surface teaches reliance on it. tool.form.ts:36-42 puts it in a section titled "Access & safety" with helpText "Ask user to approve before executing (for destructive actions)", and skills/objectstack-ai/SKILL.md:547 tells authors to use it for destructive operations.

ADR-0033 already resolved this (:31, :60): it records the flag as never-enforced and states "We delete the unenforced requiresConfirmation placeholder" — the draft/publish workspace is the real approval gate. That deletion was never executed. This PR marks it honestly; the prune is proposed as a follow-up (same disposition the owner just chose for skill.permissions in #3704).

Also in this PR

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 and both failure directions — most entries overstated liveness, but flow.status was understated, because code moved under a correct-at-the-time note;
  • the three search traps that produced false negatives during this work, including that macOS git grep -E silently ignores \b (git grep -cE "\.active\b" returns nothing on a file with three .active hits);
  • the rule that fell out of it: a grep proves presence only — to prove absence, close the call graph by hand, or author the property and watch the running app.

check:liveness green.

Refs #3686, #3685, #1878.

🤖 Generated with Claude Code

@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 3:46pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling size/m and removed documentation Improvements or additions to documentation tooling 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.

…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>
@xuyushun441-sys
xuyushun441-sys force-pushed the fix/liveness-ledger-ten-preview-claims branch from 0112d33 to 829d837 Compare July 27, 2026 15:46
@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Jul 27, 2026
@os-zhuang
os-zhuang merged commit 9d43fd3 into main Jul 27, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the fix/liveness-ledger-ten-preview-claims branch July 27, 2026 15:58
os-zhuang added a commit that referenced this pull request Jul 28, 2026
… provide (#3715) (#3740)

The flag is read by no execution path (LLM tool set, ToolRegistry.execute, the
REST execute route, the MCP bridge — verified in #3711), while the authoring
surface actively taught reliance on it: a form section titled "Access & safety"
with helpText "Ask user to approve before executing (for destructive actions)",
plus SKILL.md / MCP_GUIDE / README all recommending it for destructive work.

Owner call: DEFER the prune-or-wire decision (#3715), stop the false promise
now. The shape is likely needed once side-effect tools exist — ToolCategory
already anticipates `action` (send email / create record), `integration`
(external API) and `flow`, none of which the ADR-0033 draft/publish gate
covers; that ADR's "the draft is the approval gate" reasoning held when the
only tools were metadata mutators.

- spec describe: [EXPERIMENTAL — not enforced] + pointer to the real gate
- form: section renamed "Declarative metadata (not enforced)"; both fields
  (this + the already-dead `permissions`) name the enforced alternative
- SKILL.md / MCP_GUIDE.md / README.md: point at action-level
  ai.requiresConfirmation + the approval queue, and note that AI metadata
  edits are already gated by draft/publish
- ledger note records the deferral
- regenerated docs + the four i18n bundles (diff verified: only the tool form's
  label/description/helpText keys moved)

No behaviour change. 6710 spec tests; liveness/docs/api-surface/skill-docs/
skill-examples/i18n/role-word all 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/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant