Skip to content

fix(spec): action.undoable is live, not experimental — two objectui readers gate it (#3714) - #3829

Merged
os-zhuang merged 1 commit into
mainfrom
claude/action-undoable-experimental-j8g24i
Jul 28, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/action-undoable-experimental-j8g24i

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #3714.

The claim vs the code

The liveness ledger marked action.undoable experimental on a #1992-era note — "no runtime reader yet: neither service-automation nor objectui consume the action's undoable flag (objectui has an UndoManager but does not key off this field)." That was true when written, and has since been falsified: objectui wired two readers, both gating real behaviour.

Reader What the flag gates
app-shell useConsoleActionRuntime.tsx:409 builds the undo operation the success toast's Undo button invokes (:147)
app-shell RecordDetailView.tsx:545 restores the record's prior field values (:404)

components action/action-button.tsx:113 forwards the flag for exactly that reason, per its own comment: "without this the flag is dropped and the handler never builds the undo operation." Authoring side: ActionDefaultInspector.tsx "Offer undo" checkbox.

Why it mattered: the CLI liveness lint warns on experimental as well as dead, so authoring a working property emitted liveness-experimental-property — "declared but NOT enforced at runtime". An author, or an AI consulting the ledger, concludes undoable is aspirational and skips a shipped feature.

Changes

  • packages/spec/liveness/action.json — experimental → live, evidence = the two readers plus the plumbing site; note records that the feat(action): conditional visibility + undoable actions (CRM demo) #1992 claim was true when written and what falsified it.
  • packages/spec/liveness/README.md — action row 33 | 1 | 2 → 34 | 0 | 2. undoable joins flow.status as the second understatement in the narrative, and the "when in doubt, err toward dead" guidance now says what understating costs: the ledger is read as a capability catalogue, so a stale warning is an invitation to skip working surface. Erring toward dead stays the right default and a debt to re-verify.
  • content/docs/protocol/objectui/actions.mdx — dropped the "no runtime consumer keys off it yet … currently has no effect" claim (it contradicted this repo's own skills/objectstack-ui/SKILL.md and the action.zod.ts comment); describes the snapshot/restore behaviour instead.
  • packages/cli/src/utils/lint-liveness-properties.test.ts — the experimental-path assertion repoints to agent.memory (action.json now has zero experimental entries) and asserts the rule is liveness-experimental-property, plus a new regression guard that undoable is silent.
  • Changeset — patch on @objectstack/spec + @objectstack/cli.

Schema, parsed shape and runtime are unchanged — only the classification of what they already do.

Verification

  • pnpm --filter @objectstack/spec check:liveness — exits 0; action/undoable is not in the stale-evidence list (the objectui evidence is prose-prefixed per this ledger's convention, so the path-existence check doesn't false-flag it).
  • pnpm vitest run src/utils/lint-liveness-properties.test.ts (cli) — 15 passed.
  • pnpm vitest run scripts/liveness/proof-registry.test.ts src/ui/action.test.ts (spec) — 128 passed. action/undoable is not bound to a high-risk proof class, so live needs no proof ref.

One caveat worth a reviewer's eye: objectui is not in this session's repo scope, so the two reader line numbers are carried over from the issue rather than re-verified against objectui HEAD. Three in-repo sources corroborate the behaviour independently — action.zod.ts:511-513 ("the runtime captures the record's prior field values and offers an 'Undo' affordance on the success toast (backed by the client UndoManager)"), skills/objectstack-ui/SKILL.md:1669, and the quoted action-button.tsx comment — but per this ledger's own methodology section, the decisive check is authoring the property and booting the app. Worth doing before un-drafting if objectui has moved.


Generated by Claude Code

…eaders gate it (#3714)

The liveness ledger marked `action.undoable` `experimental` on a #1992-era note
("no runtime reader yet ... objectui has an UndoManager but does not key off
this field"). True when written, falsified since: objectui wired two readers,
both gating real behaviour — app-shell useConsoleActionRuntime.tsx:409 builds
the undo operation the success toast's Undo button invokes (:147), and
RecordDetailView.tsx:545 restores the record's prior field values (:404).
components action/action-button.tsx:113 forwards the flag for exactly that
reason, per its own comment.

Because the CLI liveness lint warns on `experimental` as well as `dead`,
authoring a *working* property produced a "declared but NOT enforced at runtime"
warning — telling authors and AI to skip a shipped feature.

- ledger: `experimental` -> `live` with the two readers as evidence; note
  records that the #1992 claim was true when written
- README: action row 33|1|2 -> 34|0|2; `undoable` joins `flow.status` as the
  second understatement, with the cost of understating spelled out
- protocol docs: drop the "no runtime consumer keys off it yet ... currently has
  no effect" claim, describe the snapshot/restore behaviour instead
- CLI lint test: the experimental-path assertion repoints to agent.memory, plus
  a regression guard that `undoable` is now silent

Schema, parsed shape and runtime are unchanged — only the classification.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ajwvrmd1hDC9RBofYBhGuR
@vercel

vercel Bot commented Jul 28, 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 28, 2026 8:46am

Request Review

@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tests tooling labels Jul 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/cli, @objectstack/spec.

110 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 packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @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/cli, 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/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • 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/cli, @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/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, 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/authentication.mdx (via @objectstack/cli)
  • 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/cli, @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/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • 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/cli, @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/cli, @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.

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 tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P3] liveness: action.undoable is marked experimental but has two real runtime readers

2 participants