From de75b322eab30929fd5f765ffd2d9080ef90daed Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 9 Sep 2026 14:16:50 +0000 Subject: [PATCH] docs(app-shell): the flow canvas draft node becomes a real `notify` node The "Visual flow canvas" jsonc draft taught `{ "id": "email", "type": "action", ... }`. `action` is not a flow node kind: it is absent from `FlowNodeAction` (objectstack `packages/spec/src/automation/flow.zod.ts`, 20 members) and from the canvas's own 18-entry `NODE_PALETTE`, so a reader copying the draft has the node refused when the type is checked against the live action registry at `registerFlow()`. `notify` is the replacement the spec itself names for the retired `email`/`slack` dispatch branches (flow.zod.ts:38-45). `script`, the other candidate, disqualifies itself: its `config.function` is REQUIRED, and this draft node carries no `config` at all. `notify` turns out to have required config too, so the one-word change alone would have swapped one refusal for another: `NotifyConfigSchema` declares `recipients` non-optional (io-node-config.zod.ts:186) and its superRefine (:261, message at :299) refuses a node carrying neither `title` nor `template`. The executor parses `node.config ?? {}` through that contract at execute time (notify-node.ts:250, parse-config.ts:99), so a config-less `notify` node is refused. The draft therefore gains exactly those two keys and nothing else. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01611D6ZaRaMmwTNQmSbk8MH --- packages/app-shell/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app-shell/README.md b/packages/app-shell/README.md index 1304531be8..49538e9956 100644 --- a/packages/app-shell/README.md +++ b/packages/app-shell/README.md @@ -392,7 +392,8 @@ Salesforce Flow Builder) instead of a flat step list. It is **dependency-free** { "id": "start", "type": "start", "label": "Start" }, { "id": "decide", "type": "decision", "label": "Renew?", "ui": { "x": 220, "y": 180 } }, // optional persisted canvas position - { "id": "email", "type": "action", "label": "Send reminder" }, + { "id": "email", "type": "notify", "label": "Send reminder", + "config": { "recipients": "{record.owner}", "title": "Renewal reminder" } }, { "id": "end", "type": "end", "label": "End" } ], "edges": [