Skip to content

feat(automation): declarative screen-flow completion/error messages + action errorMessage#1990

Merged
os-zhuang merged 1 commit into
mainfrom
feat/action-flow-messages
Jun 16, 2026
Merged

feat(automation): declarative screen-flow completion/error messages + action errorMessage#1990
os-zhuang merged 1 commit into
mainfrom
feat/action-flow-messages

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Two action/flow UX improvements surfaced while building the lead-conversion wizard.

1. Declarative screen-flow completion / error messages

A screen flow can now declare successMessage / errorMessage (FlowSchema). The engine attaches them to the terminal AutomationResult (successMessage on success, errorMessage on failure), so the UI flow-runner shows a meaningful toast instead of a generic "Done" / the raw error — no manual terminal "success screen" node required. The CRM convert-lead wizard declares a friendly completion message ("🎉 Lead converted — customer and opportunity created.").

2. Action errorMessage (spec↔runtime gap)

The objectui ActionRunner already honoured action.errorMessage, but it wasn't declarable in the spec. Added to the UI Action schema so authors can set a friendly failure toast instead of surfacing the raw error.

Changes

  • spec: FlowSchema.successMessage / errorMessage; AutomationResult.successMessage / errorMessage; Action.errorMessage.
  • service-automation: engine attaches the flow's messages to the terminal resume result (success + failure paths).
  • app-crm: convert-lead wizard declares completion + error messages.

Verification

Browser E2E (console + app-crm): completing the convert-lead wizard now shows the custom "🎉 Lead converted…" toast (not "Done"). app-crm smoke test (29) passes; spec + service-automation build clean (DTS). Pairs with the objectui companion PR.

Note: a screen flow's terminal message is read from the compiled app artifact — rebuild (objectstack build) + restart after editing flow messages.

🤖 Generated with Claude Code

… action errorMessage

- FlowSchema gains `successMessage` / `errorMessage`; the engine attaches them to
  the terminal AutomationResult (success → successMessage, failure → errorMessage)
  so a screen-flow runner shows a meaningful toast instead of "Done"/raw error.
- AutomationResult contract gains `successMessage` / `errorMessage`.
- UI Action schema gains `errorMessage` (runtime already honoured it — closes a
  spec↔runtime gap).
- CRM convert-lead wizard declares a friendly completion + error message.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Building Building Preview, Comment Jun 16, 2026 10:40pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:ui tooling labels Jun 16, 2026
@os-zhuang
os-zhuang merged commit 134043a into main Jun 16, 2026
12 of 14 checks passed
@os-zhuang
os-zhuang deleted the feat/action-flow-messages branch June 16, 2026 22:40
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

91 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/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/concepts/packages.mdx (via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via packages/services, @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/services, packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.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 added a commit that referenced this pull request Jun 17, 2026
…#1992

Pre-existing red on the spec-liveness gate (not from this branch's timezone
change): #1990 added flow.successMessage/errorMessage + action.errorMessage
and #1992 added action.undoable, none classified in the ledgers.

- flow.successMessage → live (service-automation/src/engine.ts:1292)
- flow.errorMessage   → live (service-automation/src/engine.ts:1348)
- action.errorMessage → live (objectui toast, error counterpart of successMessage)
- action.undoable     → experimental: declared + demoed in #1992 but no runtime
  reader yet in framework or objectui (objectui has an UndoManager but does not
  key off the action's `undoable` flag). Promote to live once a consumer lands.

Greens the liveness gate (was red on main too).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
os-zhuang added a commit that referenced this pull request Jun 17, 2026
)

* feat(runtime): resolve reference timezone onto ExecutionContext (#1978)

ADR-0053 Phase 2 foundation. Adds `ExecutionContext.timezone` (optional IANA
zone) and resolves it once per request in resolveExecutionContext, precedence
user preference -> org default -> UTC:

- user override: sys_user_preference (user_id, key='timezone')
- org default: tenant-scoped sys_setting (namespace='localization',
  key='timezone', scope='tenant') — one org per physical tenant (ADR-0002),
  so no tenant_id filter
- invalid IANA zone ignored, falls through; every read defensive via tryFind,
  never blocks auth

Pure plumbing, no behavior change: nothing reads ctx.timezone yet and an
absent value resolves to UTC (today's behavior). Foundation consumed by the
rest of Phase 2 — tz-aware today()/daysFromNow() (#1980), datetime rendering
(#1981), analytics bucketing (#1982). A discoverable `localization` settings
manifest for the org default is a follow-up; the resolver already reads the
row if present.

Tests: user pref > org default > UTC; invalid zone falls through; anonymous
leaves it unset. Runtime suite green (387), spec kernel green (682).
Closes #1978.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(spec): classify 4 liveness properties left unclassified by #1990/#1992

Pre-existing red on the spec-liveness gate (not from this branch's timezone
change): #1990 added flow.successMessage/errorMessage + action.errorMessage
and #1992 added action.undoable, none classified in the ledgers.

- flow.successMessage → live (service-automation/src/engine.ts:1292)
- flow.errorMessage   → live (service-automation/src/engine.ts:1348)
- action.errorMessage → live (objectui toast, error counterpart of successMessage)
- action.undoable     → experimental: declared + demoed in #1992 but no runtime
  reader yet in framework or objectui (objectui has an UndoManager but does not
  key off the action's `undoable` flag). Promote to live once a consumer lands.

Greens the liveness gate (was red on main too).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
os-zhuang added a commit that referenced this pull request Jun 25, 2026
feat(identity): align client user-context with ADR-0068 (#1990)

objectui@a3a5abff8c75d0629c3abe520dbe448edace3155
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 protocol:ui size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant