The AMQP adapter now honours the full ADR 0047 contract, and handles event failures — not only the happy path.
Wire shape
events published persistent, metadata in headers, body is only the payload
a durable per-consumer queue<node>.<module>.events, prefetch 32
a dead-letter exchangemesh.events.dead (with a retention queue, so poison events are kept for inspection, not silently dropped)
manual ack → at-least-once
Failure paths
a confirm channel: a publish the broker never accepted fails the emit rather than vanishing — at-least-once starts at the emitter
a handler that keeps failing is requeued once, then dead-lettered (never looping)
an undecodable body is dead-lettered at once — it never decodes on redelivery and must not wedge the queue
Tests — binding conformance against a disposable broker (a stand-in for the mesh-hosted broker, ADR 0001): headers-on-the-wire with a pure body, the redelivery-limit dead-letter, and the poison-body dead-letter. Suite 4/4 against a real LavinMQ.
Note: this tests the AMQP adapter in isolation. Real event testing belongs in a lab scenario where the mesh raises the broker as tier-1 substrate — tracked separately.
Part of the ADR-0047 alignment across mesh-sdk / mesh-tools / mesh-catalog.
The AMQP adapter now honours the full ADR 0047 contract, and handles event failures — not only the happy path.
**Wire shape**
- events published **persistent**, metadata in **headers**, body is only the payload
- a **durable per-consumer queue** `<node>.<module>.events`, prefetch 32
- a **dead-letter exchange** `mesh.events.dead` (with a retention queue, so poison events are kept for inspection, not silently dropped)
- **manual ack** → at-least-once
**Failure paths**
- a **confirm channel**: a publish the broker never accepted **fails the emit** rather than vanishing — at-least-once starts at the emitter
- a handler that **keeps failing** is requeued once, then **dead-lettered** (never looping)
- an **undecodable body** is dead-lettered at once — it never decodes on redelivery and must not wedge the queue
**Tests** — binding conformance against a disposable broker (a stand-in for the mesh-hosted broker, ADR 0001): headers-on-the-wire with a pure body, the redelivery-limit dead-letter, and the poison-body dead-letter. Suite 4/4 against a real LavinMQ.
> Note: this tests the AMQP **adapter** in isolation. Real event testing belongs in a lab scenario where the mesh raises the broker as tier-1 substrate — tracked separately.
Part of the ADR-0047 alignment across mesh-sdk / mesh-tools / mesh-catalog.
https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
The AMQP adapter now honours the full contract: events published
persistent with metadata in headers; a durable per-consumer queue
(<node>.<module>.events) with prefetch and a dead-letter exchange
(mesh.events.dead); manual ack for at-least-once.
Failure paths, not just the happy one:
- a confirm channel, so a publish the broker never accepted fails the
emit rather than vanishing — at-least-once starts at the emitter;
- a handler that keeps failing is requeued once, then dead-lettered
(poison set aside, never looping);
- an undecodable body is dead-lettered at once — it never decodes on
redelivery, and must not wedge the queue.
Binding-conformance tests against a disposable broker (a stand-in for the
mesh-hosted broker, ADR 0001): headers on the wire with a pure body, the
redelivery-limit dead-letter, and the poison-body dead-letter.
Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
'mesh-tools emit <type> [json]' connects, emits one ADR 0047 event (awaiting
the publish confirm), and exits. The serve path already runs a module's
on('#') subscription as an import side effect, so the runtime hosts both an
emitter and the audit-logger consumer.
Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The AMQP adapter now honours the full ADR 0047 contract, and handles event failures — not only the happy path.
Wire shape
<node>.<module>.events, prefetch 32mesh.events.dead(with a retention queue, so poison events are kept for inspection, not silently dropped)Failure paths
Tests — binding conformance against a disposable broker (a stand-in for the mesh-hosted broker, ADR 0001): headers-on-the-wire with a pure body, the redelivery-limit dead-letter, and the poison-body dead-letter. Suite 4/4 against a real LavinMQ.
Part of the ADR-0047 alignment across mesh-sdk / mesh-tools / mesh-catalog.
https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
'mesh-tools emit <type> [json]' connects, emits one ADR 0047 event (awaiting the publish confirm), and exits. The serve path already runs a module's on('#') subscription as an import side effect, so the runtime hosts both an emitter and the audit-logger consumer. Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzFPull request closed