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 |
|---|---|---|
| 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 |
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.
## Approvisionnement
## Supply
| | |
|---|---|
@@ -121,7 +121,7 @@ that case.
## Events over Kafka — built, and one rule about them
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
waiting on. The contract is `classic-models-api/docs/DOMAIN_EVENTS.md` — read it
before writing a consumer.
@@ -173,14 +173,14 @@ on the n8n instance as the source of truth.
## The Kafka credential is created by hand
`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
`N8N_ENCRYPTION_KEY`, and the committed workflow JSON references it by id only.
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
kubectl -n kafka get secret kafka-cluster-ca-cert \
-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_SKILL_ID` | `check_availability` |
| `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
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.
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")
# --- 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_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:
base = dict(
agent_name="approvisionnement",
agent_name="supply",
agent_description="Supply decisions.",
skill_id="check_availability",
skill_name="Check availability",
@@ -80,8 +80,8 @@ class TestAgentCard:
assert len(card.skills[0].examples) == 2
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/"))
assert card.supported_interfaces[0].url == "http://approvisionnement.agents:8080/"
card = build_agent_card(settings(public_url="http://supply-agent.agents:8080/"))
assert card.supported_interfaces[0].url == "http://supply-agent.agents:8080/"
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:
activation has its own endpoint.
## approvisionnement-check-availability
## supply-check-availability
Working. `POST /webhook/check-availability` with the end user's token in
`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
threshold.
## approvisionnement-periodic-reorder
## supply-periodic-reorder
The periodic half. A schedule trigger at 06:00, deliberately periodic rather
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.
## approvisionnement-stock-watch
## supply-stock-watch
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
@@ -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
replay it forever.
- 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 —
so a compromised workflow can raise no event another agent would act on.