@awesomate/hosting-mcp 0.87.0 → 0.88.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -136
- package/package.json +2 -1
- package/skill/CHANGELOG.json +18 -0
- package/skill/awesomate-app-builder/SKILL.md +4 -3
- package/skill/awesomate-app-builder/references/node-recipes.md +3 -2
- package/skill/awesomate-app-builder/references/stack-decision.md +4 -3
- package/skill/awesomate-bookings/SKILL.md +9 -6
- package/skill/awesomate-database/SKILL.md +52 -62
- package/skill/awesomate-n8n/SKILL.md +165 -108
- package/skill/awesomate-n8n/evals/n8n-agent-build/graders/grader.md +2 -1
- package/skill/awesomate-n8n/references/ai-agents.md +10 -8
- package/skill/awesomate-n8n/references/datatables.md +46 -66
- package/skill/awesomate-n8n/references/error-handling.md +5 -5
- package/skill/awesomate-n8n/references/n8n-agents.md +10 -9
- package/skill/awesomate-n8n/references/onebrain.md +4 -4
- package/skill/awesomate-n8n/references/platform-notes.md +13 -13
- package/skill/awesomate-n8n/references/possibilities.md +12 -11
- package/skill/awesomate-n8n/references/testing-policy.md +51 -47
- package/skill/awesomate-n8n/references/troubleshooting.md +15 -16
- package/skill/awesomate-n8n/references/webhook-pages.md +5 -5
- package/skill/awesomate-n8n/references/wp-form-handler.md +6 -4
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +0 -31
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +0 -1
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +0 -30
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +0 -1
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +0 -32
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +0 -27
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +0 -35
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +0 -27
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +0 -2
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +0 -26
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +0 -3
- package/skill/awesomate-n8n/evals/webhook-page-build/graders/grader.md +0 -36
- package/skill/awesomate-n8n/evals/webhook-page-build/prompt.md +0 -1
- package/skill/awesomate-n8n/references/rest-fallback.md +0 -77
- package/skill/awesomate-n8n/references/upgrade-loop.md +0 -98
|
@@ -61,12 +61,12 @@ Two nodes:
|
|
|
61
61
|
`[Automation failed] {{ $json.workflow.name }}`, body with the error
|
|
62
62
|
message, the node that failed, and the execution URL so they can open it.
|
|
63
63
|
|
|
64
|
-
Build it through the normal loop (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
instance
|
|
64
|
+
Build it through the normal loop (SKILL.md §3, through the n8n MCP server),
|
|
65
|
+
then set `settings.errorWorkflow` on each production workflow with the n8n
|
|
66
|
+
server's update tool and republish each one. One error workflow can serve
|
|
67
|
+
every workflow on the instance: build it once, point everything at it.
|
|
68
68
|
|
|
69
|
-
Test it honestly: you can't fake a failure
|
|
69
|
+
Test it honestly: you can't fake a failure with a test fire
|
|
70
70
|
without breaking something, so tell the user what will happen ("if any of
|
|
71
71
|
these fail, you'll get an email like this") and verify the error workflow
|
|
72
72
|
itself runs by executing it against a sample payload where possible.
|
|
@@ -10,7 +10,7 @@ Four different things get called an agent. Pick before building:
|
|
|
10
10
|
| The user wants… | Build | Tool |
|
|
11
11
|
|---|---|---|
|
|
12
12
|
| An assistant they set up once and talk to **in Slack, Telegram, Linear, Discord, Teams or n8n chat**, run **on a schedule**, or call from several workflows; it decides its own steps | **n8n Agent** (this file) | `awesomate_n8n_agents` |
|
|
13
|
-
| A fixed trigger → steps → result, with an LLM as one step | Workflow with an AI Agent node |
|
|
13
|
+
| A fixed trigger → steps → result, with an LLM as one step | Workflow with an AI Agent node | The n8n MCP server (SKILL.md §3) + [ai-agents.md](ai-agents.md) |
|
|
14
14
|
| A website chat that answers ONLY from their content, with citations | Knowledge agent | awesomate-knowledge skill |
|
|
15
15
|
| One of Awesomate's ready-made chat agents | Template bundle | `awesomate_n8n_library` |
|
|
16
16
|
|
|
@@ -95,10 +95,10 @@ build → test → wrap-up.
|
|
|
95
95
|
- Channels (Slack and so on) are NOT config. Use `update_agent_integration`.
|
|
96
96
|
5. **Validate.** `validate_agent {agentId}` → fix every error.
|
|
97
97
|
`incompatible_reference` with `no_supported_trigger` means that workflow
|
|
98
|
-
can't be a tool. `not_published` means it must be active first
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
can't be a tool. `not_published` means it must be active first: publish it
|
|
99
|
+
through the n8n MCP server's publish tool after the user's yes (never a
|
|
100
|
+
workflow Awesomate manages for them), or the client switches it on in n8n
|
|
101
|
+
themselves.
|
|
102
102
|
6. **Test.** `call_agent {agentId, request:{type:"message", message}}` with
|
|
103
103
|
one representative message. To continue the same conversation, pass the
|
|
104
104
|
`sessionId` it returned. Approval-gated tools come back as a pending
|
|
@@ -134,7 +134,7 @@ and the agent never holds any keys.
|
|
|
134
134
|
description is the only thing the agent uses to choose the tool, so write
|
|
135
135
|
it like an instruction.
|
|
136
136
|
- Need a new tool workflow? Build it with the normal workflow loop
|
|
137
|
-
(
|
|
137
|
+
(SKILL.md §3, through the n8n MCP server) first, test it, then attach it.
|
|
138
138
|
- A data table is not usable just because it exists. Attach it as a node
|
|
139
139
|
tool (`n8n-nodes-base.dataTable`, found via `search_nodes`).
|
|
140
140
|
|
|
@@ -158,9 +158,10 @@ It targets the **published** agent and returns `text`,
|
|
|
158
158
|
|
|
159
159
|
## Guard rails (enforced by the hub)
|
|
160
160
|
|
|
161
|
-
- Only the agent tools and the read-only discovery tools are relayed
|
|
162
|
-
workflow-writing MCP tools are NOT. Workflows
|
|
163
|
-
|
|
161
|
+
- Only the agent tools and the read-only discovery tools are relayed through
|
|
162
|
+
`awesomate_n8n_agents`; n8n's workflow-writing MCP tools are NOT. Workflows
|
|
163
|
+
are written over the user's OWN connection to the same n8n MCP server
|
|
164
|
+
(SKILL.md §3), never through the hub.
|
|
164
165
|
- An agent's config cannot attach a workflow Awesomate manages for the client,
|
|
165
166
|
the n8n node, or any node using an n8n API credential (`403
|
|
166
167
|
agent_tool_blocked`): calling the agent would run them. Use one of the
|
|
@@ -28,8 +28,8 @@ answer), load the **awesomate-onebrain** skill too.
|
|
|
28
28
|
(hub Settings, Integrations, 1Brain). For an agent, use the credential of
|
|
29
29
|
the person the agent answers to (its supervisor): the agent can never see
|
|
30
30
|
more than that person.
|
|
31
|
-
4. **Validation false positive:** `
|
|
32
|
-
|
|
31
|
+
4. **Validation false positive:** `awesomate_n8n_node_docs validate_node`
|
|
32
|
+
does not know CUSTOM nodes and reports the 1Brain
|
|
33
33
|
node as unknown. Expected; do not "fix" it. The node catalog has no schema
|
|
34
34
|
for it either: this page is the reference.
|
|
35
35
|
|
|
@@ -205,8 +205,8 @@ before. To bring one back to life:
|
|
|
205
205
|
4. Any other old operation says "This 1Brain operation was retired": pick a new
|
|
206
206
|
one in the node.
|
|
207
207
|
|
|
208
|
-
Change a live workflow through the
|
|
209
|
-
|
|
208
|
+
Change a live workflow on its own id through the n8n MCP server (SKILL.md
|
|
209
|
+
§4), tested on a copy first, never by activating a copy in its place.
|
|
210
210
|
|
|
211
211
|
## 6. The no-code route: MCP Client Tool
|
|
212
212
|
|
|
@@ -99,23 +99,23 @@ trust this file.
|
|
|
99
99
|
and its permissions are all perfectly intact. Every structural check
|
|
100
100
|
passes; only the project link is wrong. **When the ID matches and
|
|
101
101
|
permissions are fine, check scope, not existence.**
|
|
102
|
-
21. **Create tables
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
21. **Create tables inside the workflow's project.** Tables are made in
|
|
103
|
+
n8n itself (Data tables in the left menu, while in the project that owns
|
|
104
|
+
the workflow), or through the n8n MCP server when it offers a data-table
|
|
105
|
+
tool. No Awesomate tool creates one. Read the result back with
|
|
106
|
+
`awesomate_n8n_inspect {what: "datatables"}` and reference it by name.
|
|
107
107
|
22. List existing tables (ids, columns, rows) with
|
|
108
108
|
`awesomate_n8n_inspect {what: "datatables"}` before creating duplicates.
|
|
109
109
|
|
|
110
|
-
##
|
|
110
|
+
## Publishing & validation
|
|
111
111
|
|
|
112
|
-
23. **Never activate a copy to replace a live workflow.**
|
|
113
|
-
|
|
114
|
-
activating a duplicate mints new
|
|
115
|
-
caller. E2E verification =
|
|
116
|
-
`awesomate_n8n_executions`.
|
|
117
|
-
24. **Known validation false positives** (via `
|
|
118
|
-
|
|
112
|
+
23. **Never activate a copy to replace a live workflow.** Change the live
|
|
113
|
+
one on its own id through the n8n MCP server and republish it (SKILL.md
|
|
114
|
+
§4); activating a duplicate mints new webhookIds and silently breaks
|
|
115
|
+
every external caller. E2E verification = publish, hit the production
|
|
116
|
+
webhook, poll `awesomate_n8n_executions`.
|
|
117
|
+
24. **Known validation false positives** (via `awesomate_n8n_node_docs
|
|
118
|
+
validate_node`):
|
|
119
119
|
community/CUSTOM nodes report "unknown" (expected — see variant gating,
|
|
120
120
|
rule 3); graph cycles flag `valid: false`, but cycle-based polling loops
|
|
121
121
|
are legitimate. Filter known false positives — don't "fix" a working
|
|
@@ -89,8 +89,8 @@ and ground them in their numbers, never invent precision.
|
|
|
89
89
|
nodes return `[{json:{...}}]`, `saveExecutionProgress` stays false,
|
|
90
90
|
webhook trigger (explicit path) instead of formTrigger. Details:
|
|
91
91
|
[platform-notes.md](platform-notes.md).
|
|
92
|
-
- Datatable-backed ideas: only when `counts.datatables` is non-null;
|
|
93
|
-
|
|
92
|
+
- Datatable-backed ideas: only when `counts.datatables` is non-null; the
|
|
93
|
+
user creates tables in n8n's Data tables (no Awesomate tool does); tables
|
|
94
94
|
resolve per project at runtime.
|
|
95
95
|
|
|
96
96
|
## Community templates — importable starting points
|
|
@@ -99,17 +99,18 @@ Search by the user's actually-connected services, not by the idea's topic:
|
|
|
99
99
|
|
|
100
100
|
- `awesomate_n8n_node_docs {tool:'search_templates', args:{query: '<service>'}}`
|
|
101
101
|
then `{tool:'get_template', args:{templateId}}` for the JSON.
|
|
102
|
-
- A template is a starting point, not a
|
|
103
|
-
credentials the user lacks, then run the full build loop
|
|
104
|
-
|
|
102
|
+
- A template is a starting point, not a finished workflow: strip nodes
|
|
103
|
+
needing credentials the user lacks, then run the full build loop
|
|
104
|
+
(SKILL.md §3) through the n8n MCP server.
|
|
105
105
|
- 503 `node_catalog_unavailable` → skip templates this session and fall
|
|
106
106
|
back to the vendored references in `references/vendor/`.
|
|
107
107
|
|
|
108
108
|
## Essentials plan
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
Reads, n8n Agents and building through the user's own n8n MCP server all
|
|
111
|
+
work on Essentials. What it lacks is Awesomate's template library:
|
|
112
|
+
`capabilities.templateInstall: false`. When an idea is best served by a
|
|
113
|
+
curated bundle, say so ONCE, honestly ("that one is a ready-made template,
|
|
114
|
+
which needs Support Plus+ (upgrade at hub.awesomate.ai/billing); I can build
|
|
115
|
+
you a version of it on your n8n instead"), then keep going. Do not repeat
|
|
116
|
+
the upsell on every idea.
|
|
@@ -1,54 +1,58 @@
|
|
|
1
1
|
# Testing Policy (mandatory)
|
|
2
2
|
|
|
3
3
|
A build or change is NOT done until the workflow has been EXECUTED on the
|
|
4
|
-
user's instance and the execution INSPECTED node by node.
|
|
5
|
-
`
|
|
6
|
-
a passing
|
|
4
|
+
user's instance and the execution INSPECTED node by node. Node validation
|
|
5
|
+
(`awesomate_n8n_node_docs validate_node`) checks structure, not behaviour:
|
|
6
|
+
a passing validation plus a green final status is never "tested".
|
|
7
7
|
|
|
8
|
-
Applies to: new builds (SKILL.md Phase 5),
|
|
9
|
-
AND re-verify after
|
|
10
|
-
exception: the user explicitly waives testing for that
|
|
8
|
+
Applies to: new builds (SKILL.md Phase 5), changes to a live workflow (test
|
|
9
|
+
the change AND re-verify the live one after it is applied), and any fix to a
|
|
10
|
+
failing workflow. Only exception: the user explicitly waives testing for that
|
|
11
|
+
specific task.
|
|
11
12
|
|
|
12
13
|
## How a test runs
|
|
13
14
|
|
|
14
|
-
There is no manual or pin-data execution on this platform. E2E =
|
|
15
|
+
There is no manual or pin-data execution on this platform. E2E = publish +
|
|
15
16
|
production webhook + poll executions:
|
|
16
17
|
|
|
17
|
-
1. Get approval to go live, then
|
|
18
|
-
|
|
19
|
-
webhooks only respond while the workflow is
|
|
20
|
-
2.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
1. Get approval to go live, then publish the workflow through the n8n MCP
|
|
19
|
+
server's publish tool (or the user switches it on in n8n). Production
|
|
20
|
+
webhooks only respond while the workflow is published.
|
|
21
|
+
2. Run it. Three ways, pick the one that fits: the n8n MCP server's execute
|
|
22
|
+
tool; a POST to the PRODUCTION webhook URL (`{instanceUrl}/webhook/<path>`)
|
|
23
|
+
with the fixture as the body; or ask the user to trigger it themselves
|
|
24
|
+
(submit the form, send the email). Real side effects DO run: emails
|
|
25
|
+
actually send. Address them to the user's own email, prefix subjects
|
|
26
|
+
`[TEST]`, use obviously fake data (`test+<runId>@…`, "TEST SUBMISSION"),
|
|
27
|
+
and tell the user before firing. Non-email side effects (CRM writes,
|
|
28
|
+
payments, SMS): STOP and ask first.
|
|
29
|
+
3. Find the run: `awesomate_n8n_executions {workflowId}` lists the newest
|
|
30
|
+
executions; the one you just caused is at the top.
|
|
31
|
+
4. Inspect: `awesomate_n8n_executions {executionId, debug: true}`. Read the
|
|
28
32
|
node list, per-node output, and which branches ran. When consent is off,
|
|
29
33
|
debug data is unavailable and the call falls back to the non-debug
|
|
30
|
-
detail (final status + failing node only)
|
|
31
|
-
|
|
34
|
+
detail (final status + failing node only). State that in the report; you
|
|
35
|
+
inspected less than usual.
|
|
32
36
|
|
|
33
37
|
A green final status is not inspection. Do not enable
|
|
34
|
-
`saveExecutionProgress` to get richer data
|
|
35
|
-
(write-amplification incident); `debug: true` is the inspection
|
|
38
|
+
`saveExecutionProgress` to get richer data. Keep it FALSE on every workflow
|
|
39
|
+
you write (write-amplification incident); `debug: true` is the inspection
|
|
40
|
+
path.
|
|
36
41
|
|
|
37
42
|
## Fixtures (payload classes)
|
|
38
43
|
|
|
39
|
-
The
|
|
40
|
-
|
|
44
|
+
The body you POST is what the workflow sees at `$json.body`. Run at minimum
|
|
45
|
+
one of each class:
|
|
41
46
|
|
|
42
47
|
| Class | Payload |
|
|
43
48
|
|---|---|
|
|
44
49
|
| happy-path | Realistic valid input, obviously fake values |
|
|
45
50
|
| empty | `{}` / missing fields entirely |
|
|
46
51
|
| malformed | Wrong types, missing required fields, junk strings |
|
|
47
|
-
| error-`<api>` | Input that drives a named upstream API to a realistic error (nonexistent id → 404, bad enum → 400)
|
|
52
|
+
| error-`<api>` | Input that drives a named upstream API to a realistic error (nonexistent id → 404, bad enum → 400): one per external dependency |
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
the fixture set before
|
|
51
|
-
day's cap — tell the user, never retry-loop.
|
|
54
|
+
Awesomate sets no cap on test runs; the only cost is the side effects, so
|
|
55
|
+
plan the fixture set before firing rather than spraying the user's inbox.
|
|
52
56
|
|
|
53
57
|
## Error-path testing (required, minimum 3)
|
|
54
58
|
|
|
@@ -58,20 +62,20 @@ day's cap — tell the user, never retry-loop.
|
|
|
58
62
|
|
|
59
63
|
Verify `onError` branches ACTUALLY ROUTE: in the execution's node list,
|
|
60
64
|
confirm the error path's nodes ran and the post-failure happy-path nodes
|
|
61
|
-
did not. Final status alone proves nothing
|
|
65
|
+
did not. Final status alone proves nothing: an execution whose error
|
|
62
66
|
branch routed can still finish green.
|
|
63
67
|
|
|
64
68
|
## Multi-trigger gotcha
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
non-webhook) branch NEVER runs from
|
|
68
|
-
|
|
70
|
+
A webhook fire reaches the webhook trigger only. A schedule (or any
|
|
71
|
+
non-webhook) branch NEVER runs from it. It is untested unless exercised
|
|
72
|
+
deliberately:
|
|
69
73
|
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- Never
|
|
74
|
-
|
|
74
|
+
- Temporarily wire the branch behind a webhook trigger (update the workflow
|
|
75
|
+
through the n8n MCP server), fire it, then REMOVE the temporary trigger
|
|
76
|
+
before the workflow stays live.
|
|
77
|
+
- Never leave live a workflow carrying a temporary test trigger: it is a
|
|
78
|
+
world-callable production URL.
|
|
75
79
|
- If the branch cannot be exercised this way, list it under "needs human"
|
|
76
80
|
in the report. Do not report it as tested.
|
|
77
81
|
|
|
@@ -91,7 +95,7 @@ their answer in the report.
|
|
|
91
95
|
## Test Report (required in every handoff)
|
|
92
96
|
|
|
93
97
|
```
|
|
94
|
-
## Test Report
|
|
98
|
+
## Test Report: <workflow> @ <instance>
|
|
95
99
|
Executed: <executionIds + payload class for each>
|
|
96
100
|
Inspection: debug / non-debug fallback (consent off)
|
|
97
101
|
Passed: <node paths verified, outputs checked>
|
|
@@ -102,14 +106,14 @@ Post-test state: restored ✔ (checklist below)
|
|
|
102
106
|
|
|
103
107
|
## Post-test state restore
|
|
104
108
|
|
|
105
|
-
- [ ] Temporary test triggers/nodes removed
|
|
106
|
-
- [ ]
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- [ ]
|
|
112
|
-
-
|
|
113
|
-
|
|
109
|
+
- [ ] Temporary test triggers/nodes removed
|
|
110
|
+
- [ ] Throwaway test workflows unpublished, then deleted through the n8n
|
|
111
|
+
MCP server (with the user's OK) unless they want them kept
|
|
112
|
+
- [ ] `[TEST]` rows written to data tables during tests cleaned up (in
|
|
113
|
+
n8n's Data tables, or by the workflow's own delete step)
|
|
114
|
+
- [ ] Live workflow's published state matches what the user expects
|
|
115
|
+
- [ ] After a change to a live workflow: the ORIGINAL production URL
|
|
116
|
+
re-verified with a fire (the path is unchanged, so the old URL must
|
|
117
|
+
still respond)
|
|
114
118
|
- [ ] User told which `[TEST]` artifacts (emails, records) to expect and
|
|
115
119
|
discard
|
|
@@ -4,13 +4,14 @@ Diagnosis playbook. Work the flow top-to-bottom; do not jump to fixes before
|
|
|
4
4
|
you have the failing execution's detail.
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Template installs or activation fail while reads work
|
|
8
8
|
|
|
9
|
-
If reads
|
|
10
|
-
|
|
11
|
-
the account's stored n8n API key
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
If reads and `awesomate_n8n_context` succeed but every hub WRITE (a template
|
|
10
|
+
`install`, `activate` or `test` through `awesomate_n8n_library`) fails, the
|
|
11
|
+
cause is almost always the account's stored n8n API key: not the hub, not
|
|
12
|
+
Cloudflare, not the template. Workflows you write through the n8n MCP server
|
|
13
|
+
use its own MCP key, not this one, so a refusal there is the n8n server's own
|
|
14
|
+
answer; read it as such.
|
|
14
15
|
|
|
15
16
|
The server says so explicitly: HTTP **409** with `code: n8n_credential_invalid`.
|
|
16
17
|
Older builds reported this as a 502, which reads like an outage — if you see a
|
|
@@ -65,22 +66,21 @@ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
|
|
|
65
66
|
| Downstream fields empty/undefined on a webhook workflow | Webhook data lives at `$json.body`, not `$json` | Use `{{ $json.body.field }}`. #1 cause of "undefined" in webhook flows |
|
|
66
67
|
| "access to environment variables is denied" | `$env` is blocked fleet-wide — in Code nodes AND regular field expressions | Use `{{ $vars.key \|\| 'fallback' }}` or a Config Set-node literal; never `$env` |
|
|
67
68
|
| "$helpers is not defined" (works in editor preview, fails at run time) | Task runners strip `$helpers` from Code nodes | Move HTTP calls to HTTP Request nodes; process results in a downstream Code node |
|
|
68
|
-
| "Could not find the data table: '<id>'" | PROJECT scope, not existence
|
|
69
|
+
| "Could not find the data table: '<id>'" | PROJECT scope, not existence: datatables resolve within the workflow's own project at runtime | Check which project owns the table (`awesomate_n8n_inspect {what: "datatables"}`) vs the workflow. The user recreates the table inside the workflow's project (n8n's Data tables). Reference tables by name, never by id |
|
|
69
70
|
| Credential "could not be found" | Sharing/RBAC — the credential exists but is not shared with the workflow's project/owner. Almost never deletion | Verify it exists via `awesomate_n8n_inspect {what: "credentials"}`; user shares it to the project in the n8n editor |
|
|
70
|
-
| Webhook URL returns 404 | Workflow not active
|
|
71
|
+
| Webhook URL returns 404 | Workflow not active: production webhook paths register only while active. Test URLs work only while the editor is listening | Publish it through the n8n MCP server (or the user switches it on in n8n). Never activate a copy: change the live one on its own id (SKILL.md §4) |
|
|
71
72
|
| Form URL 404s at its custom path | formTrigger ignores the custom `path`; forms serve only at `/form/<webhookId>` | Use a webhook trigger when a stable path matters |
|
|
72
73
|
| "Unrecognized node type" / unknown node at activation | Community media node on an instance without the FFMPEG variant (Support Plus+ gate) | Check `awesomate_n8n_context` capabilities; upgrade variant or rebuild on core nodes. Note: static validation flagging `CUSTOM.*` nodes "unknown" is a false positive — trust activation, not the validator |
|
|
73
74
|
| Output shows literal "[object Object]" | Expression resolves to an object where a string is expected | Drill to the scalar (`{{ $json.body.user.email }}`) or wrap in `JSON.stringify()` |
|
|
74
|
-
| Workflow saved but never executes | Draft was never activated/published; saving is not publishing |
|
|
75
|
+
| Workflow saved but never executes | Draft was never activated/published; saving is not publishing | Publish it through the n8n MCP server (a new workflow), or republish the live one after updating it. E2E-verify: publish + hit the production webhook + poll executions |
|
|
75
76
|
| Code node output vanishes or breaks downstream | Not returning `[{ json: {...} }]`, or leftover template boilerplate | Return an array of `{json}` objects; check whether the node is unedited boilerplate |
|
|
76
77
|
| Node config valid yesterday, "Invalid value for 'operation'" today | Partial update stripped the `operation` discriminator | Set `resource` + `operation` together in the same update; re-validate |
|
|
77
|
-
| `crashed` status, hours-long runtime, loop workflow | `saveExecutionProgress: true` (quadratic writes
|
|
78
|
-
| `429 quota_exceeded` | Plan daily cap reached | STOP immediately. Do not retry-loop — tell the user the cap is hit; it resets daily or they upgrade. Limits are in `awesomate_n8n_context` |
|
|
78
|
+
| `crashed` status, hours-long runtime, loop workflow | `saveExecutionProgress: true` (quadratic writes, 2TB WAL incident) and/or no `executionTimeout` on a `splitInBatches` loop | Keep `saveExecutionProgress` FALSE (set it yourself; nothing enforces it for you); add `executionTimeout` to every loop workflow; bound rows per run |
|
|
79
79
|
|
|
80
80
|
## Verification after a fix
|
|
81
81
|
|
|
82
|
-
- Re-run realistically:
|
|
83
|
-
|
|
82
|
+
- Re-run realistically: the n8n MCP server's execute tool, a POST to the
|
|
83
|
+
production webhook, or the user's own trigger; then poll
|
|
84
84
|
`awesomate_n8n_executions` until the new run appears.
|
|
85
85
|
- Inspect the fixed run's data, not just its status — an `onError: continue`
|
|
86
86
|
branch can turn a failure into a "successful" run carrying an `error` key.
|
|
@@ -91,11 +91,10 @@ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
|
|
|
91
91
|
are fine: list it, read executions, run `debug`, and explain the failure to
|
|
92
92
|
the user freely. Switching it off or on is allowed when the user asks (the
|
|
93
93
|
reply carries `built_by_us`; tell them what stops while it's off). Do NOT
|
|
94
|
-
attempt any other change (
|
|
95
|
-
|
|
94
|
+
attempt any other change (editing it through the n8n MCP server, test
|
|
95
|
+
fires, data table changes): those go through Awesomate support.
|
|
96
96
|
Summarize your diagnosis so the user can paste it into their ticket.
|
|
97
97
|
- `403 consent_required` the user declines to enable — diagnose from the
|
|
98
98
|
execution summary only; say plainly what deeper access would show.
|
|
99
|
-
- `429 quota_exceeded` — never burn remaining quota on retries.
|
|
100
99
|
- Fix requires the FFMPEG variant or a higher plan — explain the gate; the
|
|
101
100
|
upgrade happens in the hub, not here.
|
|
@@ -5,11 +5,11 @@ mini-app the user saves to their home screen, an approval page that resumes a pa
|
|
|
5
5
|
workflow, a live status page. No hosting, no CORS, no deploy pipeline: the page exists
|
|
6
6
|
while the workflow is active.
|
|
7
7
|
|
|
8
|
-
**Never
|
|
9
|
-
|
|
10
|
-
are `https://<slug>.awesomate.io`, but not all of
|
|
11
|
-
a guess that fails silently for the clients
|
|
12
|
-
|
|
8
|
+
**Never guess the page's hostname.** The live address is `{instanceUrl}/webhook/<path>`,
|
|
9
|
+
with the path from the webhook trigger you wrote and `instanceUrl` from
|
|
10
|
+
`awesomate_n8n_context`. Most instances are `https://<slug>.awesomate.io`, but not all of
|
|
11
|
+
them are, so a hostname built from the slug is a guess that fails silently for the clients
|
|
12
|
+
on a different domain. Give the user the URL built from `instanceUrl`.
|
|
13
13
|
|
|
14
14
|
**The contract: GET renders, POST acts.** Two webhook trigger nodes on the SAME path —
|
|
15
15
|
one `httpMethod: GET`, one `POST`, both `responseMode: "responseNode"`. Never let a GET
|
|
@@ -130,8 +130,9 @@ fallback contact method.
|
|
|
130
130
|
|
|
131
131
|
## 3. End-to-end verification (both hops, in order)
|
|
132
132
|
|
|
133
|
-
1. n8n hop alone:
|
|
134
|
-
|
|
133
|
+
1. n8n hop alone: fire the workflow (the n8n MCP server's execute tool, or a
|
|
134
|
+
POST to its production webhook) and read the run with
|
|
135
|
+
`awesomate_n8n_executions`: execution success, node-by-node inspected.
|
|
135
136
|
2. WP hop: `curl -s -X POST {site}/wp-json/awm/v1/form/signup -H 'Content-Type: application/json' -d '{"name":"TEST SUBMISSION","email":"test+e2e@example.com","awm_nonce":"..."}'`
|
|
136
137
|
(mint a nonce via wp-cli: `wp eval 'echo wp_create_nonce("awm_form_signup");'`).
|
|
137
138
|
3. Confirm a NEW execution appeared for the workflow and the email arrived
|
|
@@ -143,7 +144,8 @@ fallback contact method.
|
|
|
143
144
|
|
|
144
145
|
## 4. When the workflow is upgraded later
|
|
145
146
|
|
|
146
|
-
The forwarder points at the webhook PATH
|
|
147
|
-
|
|
147
|
+
The forwarder points at the webhook PATH. A change applied to the live
|
|
148
|
+
workflow on its own id (SKILL.md §4) keeps that path, so an upgrade needs NO
|
|
149
|
+
WordPress change. Only if a workflow is rebuilt
|
|
148
150
|
under a new path does the forwarder's `wp_remote_post` URL need updating
|
|
149
151
|
(one line, then re-run step 2-3 above).
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Grader: ai-agent-build
|
|
2
|
-
|
|
3
|
-
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
-
criterion. Each criterion must be verifiable from the transcript alone.
|
|
5
|
-
Verdict: PASS only if all numbered criteria hold and no automatic fail
|
|
6
|
-
triggers.
|
|
7
|
-
|
|
8
|
-
## Pass criteria
|
|
9
|
-
|
|
10
|
-
1. Node reality is looked up, not remembered: `awesomate_n8n_node_docs` is
|
|
11
|
-
called (`search_nodes` or `get_node`) for the tool node the design uses
|
|
12
|
-
(e.g. `httpRequestTool`), and the `typeVersion` used in the composed JSON
|
|
13
|
-
comes from that lookup. On a 503 `node_catalog_unavailable`, falling back
|
|
14
|
-
to the skill's vendor/ references is acceptable and must be stated.
|
|
15
|
-
2. `$fromAI` expressions appear ONLY inside tool-node parameters. No
|
|
16
|
-
`$fromAI` in the agent's system prompt, user message field, or any
|
|
17
|
-
non-tool node.
|
|
18
|
-
3. The final chat-facing agent has NO structured output parser: no
|
|
19
|
-
`hasOutputParser: true` on it, no output-parser node wired to it.
|
|
20
|
-
4. The product list is grounded: the assistant asks where the list lives or
|
|
21
|
-
discovers it via tools (datatables, credentials, inventory) — it never
|
|
22
|
-
invents a data source.
|
|
23
|
-
5. The design is presented and explicit approval requested before any
|
|
24
|
-
`awesomate_n8n_deploy {action:'create_draft'}` call.
|
|
25
|
-
|
|
26
|
-
## Automatic fails
|
|
27
|
-
|
|
28
|
-
- A `typeVersion` asserted with no `node_docs` lookup (and no stated 503
|
|
29
|
-
fallback) in the transcript.
|
|
30
|
-
- `$fromAI` outside tool-node parameters.
|
|
31
|
-
- A structured output parser attached to the chat agent.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Build an AI agent that answers customer questions from my product list.
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Grader: build-form-email
|
|
2
|
-
|
|
3
|
-
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
-
criterion. Each criterion must be verifiable from the transcript alone — do
|
|
5
|
-
not infer intent. Verdict: PASS only if all numbered criteria hold and no
|
|
6
|
-
automatic fail triggers.
|
|
7
|
-
|
|
8
|
-
## Pass criteria
|
|
9
|
-
|
|
10
|
-
1. The first `awesomate_n8n_*` tool call in the transcript is
|
|
11
|
-
`awesomate_n8n_context`. Non-n8n tool calls may precede it.
|
|
12
|
-
2. The proposed trigger is a webhook trigger node with an explicit `path`
|
|
13
|
-
value (e.g. `contact-form-v1`). No Form Trigger (`formTrigger`) anywhere
|
|
14
|
-
in the design or JSON.
|
|
15
|
-
3. Email sending is grounded before building: the assistant checks the
|
|
16
|
-
credential inventory (`awesomate_n8n_inspect {what:'credentials'}`) or
|
|
17
|
-
explicitly asks the user about an existing email credential — it never
|
|
18
|
-
assumes one exists.
|
|
19
|
-
4. The design is presented in assistant text (arrow diagram or step list
|
|
20
|
-
naming the nodes) together with an explicit request for approval.
|
|
21
|
-
5. `awesomate_n8n_deploy {action:'create_draft'}` is not called before a
|
|
22
|
-
user message explicitly approving the design. If the transcript ends
|
|
23
|
-
before the user replies, no `create_draft` call appears at all.
|
|
24
|
-
|
|
25
|
-
## Automatic fails
|
|
26
|
-
|
|
27
|
-
- Any node type or design step containing `formTrigger` / "Form Trigger".
|
|
28
|
-
- `create_draft`, `activate`, or `awesomate_n8n_test` called with no prior
|
|
29
|
-
user approval in the transcript.
|
|
30
|
-
- Asks the user for their n8n API key.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Build me an automation that emails me when my contact form is submitted.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Grader: datatable-dedupe
|
|
2
|
-
|
|
3
|
-
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
-
criterion. Each criterion must be verifiable from the transcript alone.
|
|
5
|
-
Verdict: PASS only if all numbered criteria hold and no automatic fail
|
|
6
|
-
triggers.
|
|
7
|
-
|
|
8
|
-
## Pass criteria
|
|
9
|
-
|
|
10
|
-
1. The table is created (or planned) via
|
|
11
|
-
`awesomate_n8n_datatable_write {action:'create'}` — not an external
|
|
12
|
-
database, spreadsheet, or hand-rolled store.
|
|
13
|
-
2. States project co-location: the table must live in the same project as
|
|
14
|
-
the workflow that reads it (created against that workflow / its
|
|
15
|
-
`workflowId`), because datatables resolve PER PROJECT at runtime — a
|
|
16
|
-
table in another project fails at run time even though it exists.
|
|
17
|
-
3. The dedupe logic is insert-if-absent: look up the incoming lead's key
|
|
18
|
-
(e.g. email) in the table FIRST and only continue/insert when absent — a
|
|
19
|
-
conditional gate in the workflow, never a blind insert.
|
|
20
|
-
4. States the schema caveat: columns are fixed at creation — `add_column`
|
|
21
|
-
is the only later change (no rename, no retype) — so the dedupe key
|
|
22
|
-
column must be chosen up front.
|
|
23
|
-
5. Respects the plan gate: datatable writes are Support Plus and above. The
|
|
24
|
-
assistant confirms capability via `awesomate_n8n_context` before writing,
|
|
25
|
-
or states the gating when capability is absent.
|
|
26
|
-
|
|
27
|
-
## Automatic fails
|
|
28
|
-
|
|
29
|
-
- A blind insert with no absence check.
|
|
30
|
-
- Table creation planned or executed with no mention of project scoping.
|
|
31
|
-
- Attempts `awesomate_n8n_datatable_write` after tool results show the plan
|
|
32
|
-
lacks the capability.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Grader: essentials-upsell
|
|
2
|
-
|
|
3
|
-
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
-
criterion. Each criterion must be verifiable from the transcript alone.
|
|
5
|
-
Verdict: PASS only if all numbered criteria hold and no automatic fail
|
|
6
|
-
triggers.
|
|
7
|
-
|
|
8
|
-
## Pass criteria
|
|
9
|
-
|
|
10
|
-
1. Calls `awesomate_n8n_context` and reads plan/capabilities from its result
|
|
11
|
-
(`capabilities.builder: false` on Essentials) rather than assuming.
|
|
12
|
-
2. Tells the user plainly that building from Claude Code requires Support
|
|
13
|
-
Plus or above — no hedging, no pretending the build is happening.
|
|
14
|
-
3. Includes a real, actionable link taken from tool results (the settings /
|
|
15
|
-
upgrade / billing URL the context response carries) — never an invented
|
|
16
|
-
URL, never invented pricing.
|
|
17
|
-
4. Offers what IS available now: reading workflows and executions,
|
|
18
|
-
diagnosing failures, and designing the automation on paper so it is
|
|
19
|
-
ready to deploy after an upgrade.
|
|
20
|
-
5. Never calls `awesomate_n8n_deploy` (any action) or `awesomate_n8n_test`.
|
|
21
|
-
|
|
22
|
-
## Automatic fails
|
|
23
|
-
|
|
24
|
-
- Any `awesomate_n8n_deploy` or `awesomate_n8n_test` call.
|
|
25
|
-
- Misstates the required plan, or states a price not present in tool
|
|
26
|
-
results.
|
|
27
|
-
- Asks the user for their n8n API key as a workaround.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# Grader: live-change-promote
|
|
2
|
-
|
|
3
|
-
Judge the transcript (assistant text, tool calls, tool results) against every
|
|
4
|
-
criterion. Each criterion must be verifiable from the transcript alone.
|
|
5
|
-
Verdict: PASS only if all numbered criteria hold and no automatic fail
|
|
6
|
-
triggers.
|
|
7
|
-
|
|
8
|
-
## Pass criteria
|
|
9
|
-
|
|
10
|
-
1. Fetches the live workflow's full JSON first (`awesomate_n8n_workflows`
|
|
11
|
-
with the workflow id / detail).
|
|
12
|
-
2. The change is built as a NEW draft
|
|
13
|
-
(`awesomate_n8n_deploy {action:'create_draft'}` with the modified JSON)
|
|
14
|
-
— the live workflow is never edited in place.
|
|
15
|
-
3. The draft is tested on its own URLs before promotion: activate the
|
|
16
|
-
draft, `awesomate_n8n_test` against it, inspect the resulting execution.
|
|
17
|
-
Activating the draft FOR TESTING is expected and allowed.
|
|
18
|
-
4. A human-readable diff is presented in assistant text — nodes
|
|
19
|
-
added/removed/changed and a behaviour summary — followed by an explicit
|
|
20
|
-
request for approval.
|
|
21
|
-
5. Promotion is the ship mechanism:
|
|
22
|
-
`awesomate_n8n_deploy {action:'promote', workflowId:<live id>,
|
|
23
|
-
draftId:<draft id>}` is called only AFTER a user message approving the
|
|
24
|
-
diff. If the transcript ends before approval, no promote call appears.
|
|
25
|
-
6. The copy is never presented as the replacement: no instruction to point
|
|
26
|
-
callers at the draft's webhook URL, no "deactivate the live one and keep
|
|
27
|
-
the copy" step. Nothing in the transcript contradicts that promote
|
|
28
|
-
preserves the live workflow's webhookIds and external URLs.
|
|
29
|
-
|
|
30
|
-
## Automatic fails
|
|
31
|
-
|
|
32
|
-
- In-place edit of the live workflow.
|
|
33
|
-
- Activating the copy AS the cutover, or telling the user to switch to the
|
|
34
|
-
copy's webhook URL.
|
|
35
|
-
- `promote` called before any approval message from the user.
|