Finish the rename in the prose

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Stéphane Tailland
2026-08-31 15:06:42 +02:00
parent 7ec4ffad37
commit bc83df3ed0
7 changed files with 15 additions and 15 deletions
+5 -5
View File
@@ -4,7 +4,7 @@
| Agent | Client id | Trigger | | Agent | Client id | Trigger |
|---|---|---| |---|---|---|
| Approvisionnement | `classic-models-agent-approvisionnement` | event-driven, plus a periodic ordering run | | the supply agent | `classic-models-agent-supply` | event-driven, plus a periodic ordering run |
| Recouvrement | `classic-models-agent-recouvrement` | weekly, Monday | | Recouvrement | `classic-models-agent-recouvrement` | weekly, Monday |
They share a repo because they are not code: n8n workflow exports, same tool, They share a repo because they are not code: n8n workflow exports, same tool,
@@ -19,7 +19,7 @@ conversational agents.
They remain full A2A agents: they publish an Agent Card, accept tasks, answer. They remain full A2A agents: they publish an Agent Card, accept tasks, answer.
## Approvisionnement ## Supply
| | | | | |
|---|---| |---|---|
@@ -121,7 +121,7 @@ that case.
## Events over Kafka — built, and one rule about them ## Events over Kafka — built, and one rule about them
Built 2026-08-31. `classic-models-api` emits domain events through a Built 2026-08-31. `classic-models-api` emits domain events through a
transactional outbox; a relay publishes them; `approvisionnement-stock-watch` transactional outbox; a relay publishes them; `supply-stock-watch`
consumes `product.stock_changed` and is the reactive half this repo had been consumes `product.stock_changed` and is the reactive half this repo had been
waiting on. The contract is `classic-models-api/docs/DOMAIN_EVENTS.md` — read it waiting on. The contract is `classic-models-api/docs/DOMAIN_EVENTS.md` — read it
before writing a consumer. before writing a consumer.
@@ -173,14 +173,14 @@ on the n8n instance as the source of truth.
## The Kafka credential is created by hand ## The Kafka credential is created by hand
`kafka-classic-models` in n8n holds the SCRAM password of the `kafka-classic-models` in n8n holds the SCRAM password of the
`classic-models-agent-approvisionnement` KafkaUser and the Strimzi cluster CA. `classic-models-agent-supply` KafkaUser and the Strimzi cluster CA.
It is not in this repo and must not be: n8n encrypts stored credentials with It is not in this repo and must not be: n8n encrypts stored credentials with
`N8N_ENCRYPTION_KEY`, and the committed workflow JSON references it by id only. `N8N_ENCRYPTION_KEY`, and the committed workflow JSON references it by id only.
To recreate it after a rebuild: To recreate it after a rebuild:
``` ```
kubectl -n kafka get secret classic-models-agent-approvisionnement \ kubectl -n kafka get secret classic-models-agent-supply \
-o jsonpath='{.data.password}' | base64 -d -o jsonpath='{.data.password}' | base64 -d
kubectl -n kafka get secret kafka-cluster-ca-cert \ kubectl -n kafka get secret kafka-cluster-ca-cert \
-o jsonpath='{.data.ca\.crt}' | base64 -d -o jsonpath='{.data.ca\.crt}' | base64 -d
+1 -1
View File
@@ -32,7 +32,7 @@ completed task is the wrong shape for "a human has to look at this".
| | | | | |
|---|---| |---|---|
| `ADAPTER_AGENT_NAME` | `approvisionnement` | | `ADAPTER_AGENT_NAME` | `supply` |
| `ADAPTER_AGENT_DESCRIPTION` | what the card says it is | | `ADAPTER_AGENT_DESCRIPTION` | what the card says it is |
| `ADAPTER_SKILL_ID` | `check_availability` | | `ADAPTER_SKILL_ID` | `check_availability` |
| `ADAPTER_SKILL_NAME`, `_DESCRIPTION`, `_EXAMPLES` | the card's one skill; examples are newline-separated | | `ADAPTER_SKILL_NAME`, `_DESCRIPTION`, `_EXAMPLES` | the card's one skill; examples are newline-separated |
+2 -2
View File
@@ -2,7 +2,7 @@
Both n8n agents get the same image and differ only by environment. That is the Both n8n agents get the same image and differ only by environment. That is the
point: the A2A surface is identical for every agent in the estate, and what point: the A2A surface is identical for every agent in the estate, and what
distinguishes Approvisionnement from Recouvrement is the workflow behind the distinguishes the supply agent from the collections agent is the workflow behind the
webhook, not the protocol in front of it. webhook, not the protocol in front of it.
Nothing here is a secret. The adapter forwards the end user's token and holds Nothing here is a secret. The adapter forwards the end user's token and holds
@@ -21,7 +21,7 @@ class Settings(BaseSettings):
model_config = SettingsConfigDict(env_prefix="ADAPTER_", env_file=".env") model_config = SettingsConfigDict(env_prefix="ADAPTER_", env_file=".env")
# --- who this instance is ------------------------------------------------ # --- who this instance is ------------------------------------------------
agent_name: str = Field(..., description="e.g. approvisionnement") agent_name: str = Field(..., description="e.g. supply")
agent_description: str = Field(...) agent_description: str = Field(...)
agent_version: str = "0.1.0" agent_version: str = "0.1.0"
+3 -3
View File
@@ -16,7 +16,7 @@ from a2a_n8n_adapter.server import Outcome, _read, build_agent_card
def settings(**over) -> Settings: def settings(**over) -> Settings:
base = dict( base = dict(
agent_name="approvisionnement", agent_name="supply",
agent_description="Supply decisions.", agent_description="Supply decisions.",
skill_id="check_availability", skill_id="check_availability",
skill_name="Check availability", skill_name="Check availability",
@@ -80,8 +80,8 @@ class TestAgentCard:
assert len(card.skills[0].examples) == 2 assert len(card.skills[0].examples) == 2
def test_the_card_advertises_the_public_url_not_the_bind_address(self) -> None: def test_the_card_advertises_the_public_url_not_the_bind_address(self) -> None:
card = build_agent_card(settings(public_url="http://approvisionnement.agents:8080/")) card = build_agent_card(settings(public_url="http://supply-agent.agents:8080/"))
assert card.supported_interfaces[0].url == "http://approvisionnement.agents:8080/" assert card.supported_interfaces[0].url == "http://supply-agent.agents:8080/"
class TestSubjectToken: class TestSubjectToken:
+4 -4
View File
@@ -21,7 +21,7 @@ POST /rest/workflows/<id>/activate {"versionId": "<current>"}
`PATCH {"active": true}` returns 200 and leaves the workflow inactive, silently: `PATCH {"active": true}` returns 200 and leaves the workflow inactive, silently:
activation has its own endpoint. activation has its own endpoint.
## approvisionnement-check-availability ## supply-check-availability
Working. `POST /webhook/check-availability` with the end user's token in Working. `POST /webhook/check-availability` with the end user's token in
`X-Subject-Token`: `X-Subject-Token`:
@@ -156,7 +156,7 @@ threshold, from 68" reads as a contradiction even though both halves are true,
so the context is appended only while the reference is actually below the so the context is appended only while the reference is actually below the
threshold. threshold.
## approvisionnement-periodic-reorder ## supply-periodic-reorder
The periodic half. A schedule trigger at 06:00, deliberately periodic rather The periodic half. A schedule trigger at 06:00, deliberately periodic rather
than a batch standing in for events: grouping references into a purchase than a batch standing in for events: grouping references into a purchase
@@ -215,7 +215,7 @@ the output. A catalog that outgrows one page needs a paging loop **and** the
read-volume cap this repo already lists as mandatory for autonomous agents. read-volume cap this repo already lists as mandatory for autonomous agents.
## approvisionnement-stock-watch ## supply-stock-watch
The reactive half, and the one the design had been waiting on. It is woken by The reactive half, and the one the design had been waiting on. It is woken by
`product.stock_changed` on `classic-models.catalog` rather than by a clock, so a `product.stock_changed` on `classic-models.catalog` rather than by a clock, so a
@@ -274,7 +274,7 @@ better answer when it knows X crossed the threshold at 14:32.
explicitly and succeeds. A workflow that threw on an uninteresting event would explicitly and succeeds. A workflow that threw on an uninteresting event would
replay it forever. replay it forever.
- The consumer has its **own** SCRAM account, - The consumer has its **own** SCRAM account,
`classic-models-agent-approvisionnement`: Read on that one topic and that one `classic-models-agent-supply`: Read on that one topic and that one
consumer-group prefix. It cannot read sales or payments, and it cannot write — consumer-group prefix. It cannot read sales or payments, and it cannot write —
so a compromised workflow can raise no event another agent would act on. so a compromised workflow can raise no event another agent would act on.