From ed99334201c4fa7250747fa26f66f0f2abbe043f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Tailland?= Date: Mon, 31 Aug 2026 14:39:25 +0200 Subject: [PATCH] Deploy the adapter fix and document the four outcomes Co-Authored-By: Claude Opus 5 --- adapter/README.md | 19 +++++++++++++++++++ deploy/agents/supply.yaml | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/adapter/README.md b/adapter/README.md index d388667..1fe6ea3 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -42,3 +42,22 @@ completed task is the wrong shape for "a human has to look at this". One skill per instance, deliberately. A second one is a card change, which is the moment to ask whether the agent has quietly become a data proxy. + +## Four outcomes, and only one of them completes + +HTTP 200 from n8n does not mean the workflow answered. It returns 200 with an +**empty body** when a node throws before the Respond node runs — a refused token +exchange is the common way in. The adapter used to read that as a completed task +carrying "(the workflow returned nothing)", which told the caller the task had +succeeded: the one thing certainly false. + +| `Outcome` | A2A task state | +|---|---| +| `ANSWERED` — the contract, `escalate: false` | `completed` | +| `ESCALATED` — the contract, `escalate: true` | `failed` | +| `SILENT` — 200 with an empty body | `failed` | +| `OFF_CONTRACT` — a body that is not `{"answer", "escalate"}` | `failed` | + +Off contract is returned **raw** so a workflow that has drifted is visible — but +never as agreement. Escalation is `failed` for the older reason: an autonomous +agent meeting a rule that needs approval must fail cleanly, never decide. diff --git a/deploy/agents/supply.yaml b/deploy/agents/supply.yaml index 3c7557c..ba88cbb 100644 --- a/deploy/agents/supply.yaml +++ b/deploy/agents/supply.yaml @@ -25,7 +25,7 @@ spec: type: RuntimeDefault containers: - name: adapter - image: gitea.sttlab.eu/stt/a2a-n8n-adapter:v0.1.0 + image: gitea.sttlab.eu/stt/a2a-n8n-adapter:v0.2.0 ports: - name: http containerPort: 8080