# Workflows Exported as JSON and committed. The n8n instance is not the source of truth. ## Deploying a change **n8n does not re-register an active workflow when you PATCH it.** The running webhook keeps executing the definition it was activated with, so an edit appears to have no effect — and the failure it keeps producing is the *old* one, which is a very good way to spend an afternoon debugging something already fixed. Deactivate, apply, reactivate, in that order: ``` POST /rest/workflows//deactivate {"versionId": ""} PATCH /rest/workflows/ {"nodes":…, "connections":…, "versionId": ""} POST /rest/workflows//activate {"versionId": ""} ``` `versionId` changes at every step, so re-read it each time. And note `PATCH {"active": true}` returns 200 and leaves the workflow inactive, silently: activation has its own endpoint. ## approvisionnement-check-availability Working. `POST /webhook/check-availability` with the end user's token in `X-Subject-Token`: ``` "Peut-on promettre S10_1949 ?" → {"answer":"Yes — 1952 Alpine Renault 1300 (S10_1949) can be promised: 7305 in stock, above the reorder threshold of 50.","escalate":false} "Peut-on promettre la Vespa ?" → {"answer":"No product reference in the question…","escalate":true} ``` It exchanges the token itself, using the agent's client secret from the pod environment so the committed JSON holds no secret, then talks MCP in two calls: `initialize` to obtain the session id from a **response header**, then `tools/call`. No `notifications/initialized` is needed. MCP rather than the REST route, which would have been one call instead of two: the per-tool ACL by consumer group lives on the MCP route only. Going through REST would give an autonomous agent broader access than a conversational one, which is exactly backwards. The product code is read with a regex, not a model. This agent's critical path is rules; a question naming no product escalates rather than being guessed at. The regex is loose after the underscore on purpose — a reference that looks valid but does not exist must reach the catalog and come back as "no such product", because answering "you named no product" would be false. ### Known gap A product code that does not exist returns an **empty body** rather than that message. The run completes, every node executes including the one that composes the answer, and the response is still empty — so the fault is between the composing node and the webhook response, not in the decision logic. `alwaysOutputData` on the read node did not change it. For an autonomous agent, silence is the worst possible answer. Not shipped as acceptable — recorded as unfinished.