Help us improve
Share bugs, ideas, or general feedback.
From corezoid
Audits Corezoid BPM processes for structural issues, hardcoded values, and optimization opportunities. Use when analyzing or reviewing `.conv.json` process definitions.
npx claudepluginhub corezoid/corezoid-ai-plugin --plugin corezoidHow this skill is triggered — by the user, by Claude, or both
Slash command
/corezoid:corezoid-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a specialist in auditing and analyzing Corezoid BPM processes using the `corezoid` MCP server.
Reviews and audits entire Corezoid projects or folders with per-process linting, cross-process dependency analysis, and aggregated reporting.
Provides proven architectural patterns for n8n workflows covering webhook processing, HTTP API integration, database operations, AI agents, batch processing, and scheduled tasks. Use when building or designing automations.
Generates downloadable PDF process briefing from detected patterns or workflows: visual flowchart, steps with apps/actions, stats, and automation suggestions. Useful for documenting real team processes.
Share bugs, ideas, or general feedback.
You are a specialist in auditing and analyzing Corezoid BPM processes using the corezoid MCP server.
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.
1278273_Business.folder/2778176_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.json file using the find or grep Bash tools (the project is already pulled locally).
Once PROCESS_PATH is known, begin the audit below.
Run the linter to detect structural issues automatically:
Call MCP tool lint-process with process_path: "<PROCESS_PATH>".
This checks for:
Record all findings. They will be included in the final report.
Read the .conv.json file and extract nodes:
ops[0]['scheme'] is a list — always index [0]node['condition'] is a dict with keys logics (list) and semaphors (list)node['extra'] is a string (escaped JSON) — not a dictgo_if_const logics live in lg['conditions'], NOT in lg['extra']Collect node groups for analysis:
code_nodes = [n for n in nodes for lg in n['condition']['logics'] if lg['type'] == 'code']
api_nodes = [n for n in nodes for lg in n['condition']['logics'] if lg['type'] == 'api']
rpc_nodes = [n for n in nodes for lg in n['condition']['logics'] if lg['type'] == 'api_rpc']
copy_nodes = [n for n in nodes for lg in n['condition']['logics'] if lg['type'] == 'api_copy']
cond_nodes = [n for n in nodes for lg in n['condition']['logics'] if lg['type'] == 'go_if_const']
code nodes — look for hardcoded IDs, URLs, tokensapi nodes — check URLs; must use {{env_var_name}} or {{variable}}, not literalsapi_rpc / api_copy — check conv_id values; numeric IDs instead of @alias are a flagapi_rpc extra fields — check for hardcoded values that should be variablesFlag each hardcoded value for extraction to env_var (see ${CLAUDE_PLUGIN_ROOT}/docs/variables-guide.md).
The .conv.json file has top-level fields that are process metadata assigned by the platform. Do not report them as hardcoded values:
| Field | Description |
|---|---|
conv_id | The ID of this process itself |
user_id | Owner/author user ID |
company_id | Company/tenant identifier |
folder_id | Folder identifier |
project_id | Project identifier |
stage_id | Stage/environment identifier |
These are read-only platform metadata, not configuration that should be extracted to env_vars.
CREATE ACTOR, MANAGE ACCESS RULES)semaphors of type time or go_if_const that create loopstitleAction_Object_Context (e.g. Create_Stream_Active)try/catch wrapping all external callsparseInt, Number)if (!data.var) { ... })eval usagecatch or case for invalid dataCode nodes that only do simple assignments should be replaced with set_param. Flag these patterns:
| Pattern in code node | Replace with set_param |
|---|---|
data.x = data.y; | "x": "{{y}}" |
data.x = data.a + "_" + data.b; | "x": "{{a}}_{{b}}" |
data.x = data.a + data.b; (numeric) | "x": "$.math({{a}}+{{b}})" |
data.x = data.a * data.b; | "x": "$.math({{a}}*{{b}})" |
data.x = "constant"; | "x": "constant" |
data.x = data.x; | remove entirely (self-assignment, no-op) |
$.math() takes exactly two operands. For 3+, nest: $.math($.math({{a}}+{{b}})+{{c}}). Supported operators: +, -, *, /. Use extra_type: "number" when the result should be numeric.
Operations that genuinely require a code node: str.length, regex, JSON.parse/stringify, array .map/.filter, complex if/else, object key iteration.
Check for missing semaphors by severity:
api_callback — MUST have a time semaphor. Without one tasks hang forever if the user abandons the session.api (outbound HTTP) — Should have a time semaphor as safety net against unresponsive endpoints.api_rpc — Lower severity; target process handles its own timeouts. Still recommended.api_copy with is_sync: true — Informational; target process manages its own lifecycle.throw_exception: truethrow_exception: falseerrorTextScan all nodes and collect every outbound reference:
conv_id valuesconv_id valuesconv[@alias] references inside set_param extra values or condition parametersFlag:
conv_id without @alias — suggest creating an alias:
short_name: lowercase, spaces/underscores → hyphens, strip special charscreate-alias with process_path and short_nameconv[@alias] state reads — implicit dependencies that break if the referenced process changes schemaTo manually verify unused set_param findings, search for each variable name across the .conv.json file — check all logics, extras, conditions, and semaphors.
Perform a 1-level deep review of all unique outbound dependencies. Review each direct dependency but do NOT recurse into their sub-dependencies — only list them.
For each dependency:
conv_id values from the main processpull-process with process_id set to the conv_id value, then read the resulting .conv.jsontry/catch, hardcoded valuesReport format:
## Dependency Process Reviews
### @alias-name (conv_id=XXXXX) — "Process Title"
NN nodes. MM/NN untitled.
- [ ] ⚠️ X API nodes missing semaphors
- [ ] ⚠️ JS code without try/catch in node "Y"
- [ ] Sub-dependencies: @a, @b, 12345
- [ ] **Needs own dedicated review** (200+ nodes)
## Dependency Health Summary
| Dependency | Nodes | Untitled | Missing Semaphors | Hardcoded conv_ids | JS no try/catch | Needs Own Review |
|-----------|-------|----------|-------------------|-------------------|-----------------|--------------------|
| @alias | 154 | 74 | 6 | 0 | 10 | — |
Based on the dependency data collected in Steps 10–11, produce a Mermaid diagram of direct process-to-process dependencies:
```mermaid
graph TD
MainProcess["Process Name"] --> Dep1["@alias-name (conv_id=XXXXX)"]
MainProcess --> Dep2["@alias2 (conv_id=YYYYY)"]
Dep1 --> SubDep1["@sub-alias"]
```
Include in the report:
## 12. Dependency Graph
\`\`\`mermaid
graph TD
...
\`\`\`
N direct dependencies, N total processes mapped.
Produce a Markdown report:
# Process Review: <process name>
## 1. Structural Issues (lint-process)
- [ ] 🔴 N orphaned nodes — list each: (id, title, type)
- [ ] ⚠️ No-op condition in node "X" (id) — all branches route to same node "Y"
- [ ] ⚠️ Unused set_param in node "Z" (id) — variable `{{var}}` not referenced downstream
## 2. Hardcode
- [ ] Node X: API key hardcoded → move to env_var
## 3. Repeated Logic
- [ ] Nodes Y, Z: identical structure → extract into subprocess
## 4. Cycles
- [ ] Node W: no exit condition → add iteration limit
## 5. Naming
- [ ] Node without title → rename to "Validate Token"
- [ ] Duplicate titles "error manage access rules" → make unique
## 6. Code Review
- [ ] JS: Node "Code_123" has no try/catch → add error handling
- [ ] Erlang: Node "Code_456" has recursion without termination condition
## 7. Code Node Optimization (set_param migration)
- [ ] ⚠️ Node "X": `data.a = data.b + "__" + data.c` → set_param: `"a": "{{b}}__{{c}}"`
- [ ] ⚠️ Node "Y": `data.total = data.x + data.y` → set_param: `"total": "$.math({{x}}+{{y}})"`
- [ ] ⚠️ Node "Z": `data.x = data.x` → remove (self-assignment, no-op)
## 8. Semaphor Coverage
- [ ] 🔴 api_callback node "X" — missing time semaphor (tasks will hang)
- [ ] 🟡 api node "Y" — missing time semaphor (risk on unresponsive endpoint)
## 9. Error Handling
- [ ] Missing err_node_id on set_param in node "X"
- [ ] Duplicated error messages across nodes "Y", "Z"
- [ ] Node "Z" reply node missing throw_exception: true
## 10. External Dependencies
| # | Alias / conv_id | Call Type | Count | Usage Summary | Notes |
|---|----------------|-----------|-------|---------------|-------|
| 1 | @send-message | api_rpc | 10 | OTP prompt, errors, success | — |
| 2 | 21123 | api_copy | 2 | Send report | ⚠️ hardcoded numeric |
### State Store References
- `conv[@user-profile]` — reads language, registration_ban
## 11. Dependency Process Reviews
### @alias-name (conv_id=XXXXX) — "Process Title"
NN nodes. MM/NN untitled.
- [ ] ⚠️ X API nodes missing semaphors
- [ ] Sub-dependencies: @a, @b
## Dependency Health Summary
| Dependency | Nodes | Untitled | Missing Semaphors | Hardcoded conv_ids | JS no try/catch | Needs Own Review |
|-----------|-------|----------|-------------------|-------------------|-----------------|--------------------|
| @alias | 154 | 74 | 6 | 0 | 10 | — |
## 12. Dependency Graph
```mermaid
graph TD
...
N direct dependencies, N total processes mapped.
---
## 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/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 |
| `${CLAUDE_PLUGIN_ROOT}/docs/nodes/api-call-node.md` | HTTP API call configuration |
| `${CLAUDE_PLUGIN_ROOT}/docs/process/error-handling.md` | Error handling patterns |
| `${CLAUDE_PLUGIN_ROOT}/docs/process/process-json-validation.md` | Validation rules and common errors |