Edit an Existing Corezoid Process
You are a specialist in modifying Corezoid processes using the corezoid MCP server.
Identify the Process (MANDATORY FIRST STEP)
Before doing anything else, resolve PROCESS_PATH:
-
Check whether the user already provided a process identifier — a file path, process name, or process ID — in the current message or conversation history.
-
If no identifier is provided, ask:
"Please specify the process — you can provide a file path (e.g.
123_payment.conv.json), a process name, or a process ID."Do not call any MCP tools until the user provides an identifier.
-
If the user gave a name or ID (not a file path), search the local working directory for the matching
.conv.jsonfile using thefindorgrepBash tools (the project is already pulled locally). -
Once
PROCESS_PATHis known and the file exists locally, open and analyze it before making any changes.
Step 1: Analyze the Process
Open and analyze PROCESS_PATH to understand the current structure and logic. Pay attention to:
- Processes related to the requested changes
- IDs of processes that may be called from the target process
- Existing naming conventions and patterns
Step 2: Implement the Changes
Apply changes to PROCESS_PATH.
Core rules
- Connect nodes only through the
gofield - Every node that can fail must have
err_node_id— point it directly at a Final Error node (obj_type: 2) unless the error path needs logic (reply to caller, retry routing). Never create an Escalation node (obj_type: 3) that only contains a barego— that is a passthrough anti-pattern flagged bylint-process - Node IDs must be unique 24-character hex strings:
^[0-9a-f]{24}$. Alwayspull-processbefore editing and reference only canonical, server-assigned IDs — IDs you invented in a previous push were reassigned by the server and no longer exist. New nodes added now get placeholder IDs that the server will likewise reassign on push. Existing nodes' IDs are preserved. See Node ID Lifecycle. - Use descriptive node
titlevalues (e.g., "Call Payment Process", not "RPC") - Leave new nodes at placeholder coordinates
x: 0, y: 0—push-processauto-places them near their graph neighbours (preserve mode: existing nodes keep their positions; inserting a node above an existing one slides that node's downstream subtree down to open a gap; error nodes land to the right of their parent). Keep thex/yof nodes you are NOT moving — do not rebuild the scheme without them. As a safety net, if the file reaches push with every node's coordinates missing, push re-hydrates them from the server (reportsRestored N node coordinate(s)) so a laid-out process is never re-arranged by accident. Only when auto-placement is disabled (COREZOID_AUTOLAYOUT=off) position nodes manually — error nodes to the right of their parent (x + 300). Do NOT re-layout the whole process unless the user asks — see thecorezoid-node-layoutskill's authorship policy
Variables for constants
All constants (URLs, tokens, endpoints, hosts) must be stored as variables — never hardcoded:
- Check
_ENV_VARS_.json(frompull-folder) or.processes/variables.json(from this session) for existing variables - Create a new variable if needed: call
cz-variableswithaction: "create-variable"andargsname,description,value - Reference in logic using
{{env_var[@variable-name]}}
See ${CLAUDE_PLUGIN_ROOT}/docs/variables-guide.md for details.
Node type quick reference
| Node | obj_type | Logic type |
|---|---|---|
| Start | 1 | go |
| Code Node | 0 | api_code |
| Call a Process | 0 (4 only for active Stub Mode) | api_rpc |
| API Call | 0 | api |
| Reply to Process | 0 (3 as err_node_id target) | api_rpc_reply |
| End / Error | 2 | (no logics) |
For complete JSON structures see ${CLAUDE_PLUGIN_ROOT}/docs/node-structures.md.
Common pitfalls
- Regenerating the whole scheme instead of editing it in place — make targeted edits to the pulled file (change the one node/logic you need). Do NOT rewrite every node from scratch: that drops the existing
x/y(thex:0,y:0authoring habit is for brand-new nodes only), and a scheme where every node is at0,0forcespush-processto re-lay-out the entire process, discarding its arrangement. push re-hydrates coordinates from the server as a safety net, but editing surgically is the right habit. - Using
"type": "call_process"instead of"type": "api_rpc"— will fail validation - Missing
extra/extra_typein Call a Process node — both required even if empty ({}) - Treat active Stub Mode (
obj_type: 4+condition.stub) as a temporary mock only: it bypasses the called process and can fake success. Preservecondition.stubduring round trips, but do not leaveobj_type: 4enabled on production paths unless the user explicitly confirmsallow_active_stub_mode=true. - Raw JSON objects as values in
extra— must be stringified:"{\"key\":\"val\"}" - Keys in
extraandextra_typemust match exactly
Step 3: Update the Description
Before deploying, update the root-level description field in PROCESS_PATH to reflect the process's current behaviour after your edits.
Guard — preserve existing descriptions when appropriate: if the process already has a non-empty description and your edits did not change the overall purpose (e.g. you fixed a bug, adjusted a timeout, or rewired an error path without altering what the process fundamentally does), preserve the existing description rather than replacing it.
Follow the Description Update Rule from the corezoid skill:
- 1–2 sentences, starting with a verb (Calls, Creates, Validates, Routes, Aggregates)
- Sentence 1: what the process does — verb + action + subject
- Sentence 2 (optional): key inputs/outputs or notable behaviour
- Under 200 characters, no "This process…" preamble
Write the updated description directly into the JSON file. This costs nothing extra — the description rides the same push-process call.
If the parent folder was structurally affected (process added, removed, or renamed), also call cz-structure with action: "modify-folder" and a one-sentence description in args.
Step 4: Deploy the Changes
MANDATORY: Always run this step whenever any changes were made to the process file — even if there are open questions or the work is not fully complete. Without deploying, all changes are lost.
Deploy the modified process by calling MCP tool push-process with process_path: "<PROCESS_PATH>".
If deployment fails, fix the reported errors and re-run push-process until it succeeds. Do not skip this step or postpone it — changes exist only in memory until pushed.
Auto-snapshot: if the process already existed on the server (
obj_id≠ null),push-processautomatically creates a snapshot of the current server state before deploying your changes. No action needed — this is transparent. The snapshot appears in the Corezoid UI and can be managed with thecz-snapshotsactionslist-snapshots/get-snapshot/delete-snapshot. Environments whose API has no snapshot object (some on-prem / older installations) are detected by a read-only probe, confirmed against control requests and re-checked periodically per project/stage: the snapshot is skipped, the push proceeds, and the push result says so — keep the.conv.jsonunder version control there, because the platform holds no rollback point.
Concurrent-change detection & 3-way merge:
pull-process/pull-foldercapture the server version before export in a per-folder.corezoid-baseline.jsonsidecar, plus a copy of the pulled process under.corezoid-baseline/(add both to.gitignore). If someone else changed the process between pull and push,push-processblocks — a plain push could silently drop their edits — and reports local/server/overlap changes across nodes and process-level fields such astitle,description,params, andscheme.web_settings. Reconcile one of three ways: re-pull and re-apply;merge=trueto save the original as<process>.pre-mergeand graft non-overlapping server changes into the local file for review; oroverwrite_server_change=trueto overwrite after being shown the report (a server snapshot is attempted first, and recovery is possible only if it succeeds).force=trueis the lint override only and does not waive this gate — passoverwrite_server_changein reply to the block report, never ahead of it, because set in advance it authorises dropping a change that has not happened yet and that nobody will see. Overwriting live server state that was never compared (overwrite_server_change, oradopt_existingon a file with no baseline) while no pre-push snapshot could be taken is refused outright unlessallow_no_snapshot=trueis passed as well: neither reported nor recoverable is not a state a single flag should reach. A never-deployed process is exempt — there is no previous version to protect, so the create → push flow never needs the second flag. Every waived gate is named in the push result. Files with no baseline push with an advisory; an unreadable/corrupt baseline blocks until a re-pull rebuilds it, because silently ignoring it would disable lost-update protection. A pre-v3.1.3 sidecar with no recorded merge ancestor cannot run the same-second content check: the push proceeds, says so, and records the ancestor from the live server scheme, so only that one push is unchecked.
After a successful deploy, notify the user:
"Changes have been deployed. Please refresh the page in Corezoid to see the updated process."
Reference Documents
Use the Read tool to load these files when specific node or validation details are needed:
| Path | When to read |
|---|---|
${CLAUDE_PLUGIN_ROOT}/docs/node-structures.md | JSON schemas for all node types + full Logics fields reference (canonical) |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/set-parameters-built-in-functions.md | Built-in functions: $.math, $.date, $.random, $.sha1_hex, $.md5_hex, $.base64_encode, $.unixtime, $.map, $.filter |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/set-parameters-dynamic-values.md | Dynamic values: {{var}}, {{node[id].count}}, {{node[id].SumID}}, {{conv[@alias].ref[...]}}, {{env_var[@name].key[1]}} |
${CLAUDE_PLUGIN_ROOT}/docs/tasks/task-metadata.md | Global root.* fields: root.task_id, root.ref, root.conv_id, root.node_id, root.prev_node_id, root.user_id, root.change_time, root.create_time |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/code-node.md | Code node details and available JS libraries |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/call-process-node.md | Call a Process node, semaphores, cross-folder calls |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/reply-to-process-node.md | Reply formats, object stringification |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/api-call-node.md | HTTP API call configuration |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/end-node.md | End node success/error configuration |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/condition-node.md | Condition node (branching logic) |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/delay-node.md | Delay node (timers and waiting); 30s limit is static-literal only — dynamic absolute-timestamp value for scheduled or sub-30s delays |
${CLAUDE_PLUGIN_ROOT}/docs/nodes/copy-task-node.md | Copy Task node (task duplication) |
${CLAUDE_PLUGIN_ROOT}/docs/process/process-json-validation.md | Validation rules and common errors |
${CLAUDE_PLUGIN_ROOT}/docs/process/error-handling.md | Error handling patterns (hardware vs software errors) |
${CLAUDE_PLUGIN_ROOT}/docs/process/node-positioning-best-practices.md | Coordinate system and layout guidelines |
${CLAUDE_PLUGIN_ROOT}/docs/variables-guide.md | Variable naming rules, creation workflow, usage examples |
Example Processes
| Path | Description |
|---|---|
${CLAUDE_PLUGIN_ROOT}/samples/stripe-checkout.json | Stripe payment checkout flow |
${CLAUDE_PLUGIN_ROOT}/samples/create-actors.json | Creating actors/users |
${CLAUDE_PLUGIN_ROOT}/samples/create-user.json | User creation process |
${CLAUDE_PLUGIN_ROOT}/samples/gpt-calculator.json | GPT integration example |
${CLAUDE_PLUGIN_ROOT}/samples/api-post.json | HTTP POST API call example |
Final Step: Update Git Context
Do NOT report the task as complete and do NOT stop until this step is evaluated. The main task being deployed does not mean the session is over — this step is next.
Immediately after push-process or create-process succeeds, check whether
at least one of the following is true:
push-processorcreate-processwas actually called (not just previewed);- a new external host/API/service appeared that is not yet in
dependencies.md; - an architectural decision was made (one approach chosen over another);
- an issue was found or closed during this session.
If yes → activate corezoid-git-context skill right now. Do not wait for the
user to ask. Do not skip because the main task "looks done".
If none of the above → skip and tell the user the session is complete.
The skill handles everything autonomously: reads current _ext/docs/, proposes
a unified diff, asks confirmation, writes files, and pushes — one invocation.


