Finish the rename in the prose
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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
@@ -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 |
|
||||||
|
|||||||
Binary file not shown.
@@ -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"
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user