event-driven-architect — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited event-driven-architect (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Patterns for services that communicate via asynchronous events. Broker-agnostic at the conceptual level; defaults inline per use case (NATS for lightweight, Kafka for log-based replay, RabbitMQ for command queues). Protobuf schemas for events (protobuf-architect) so contracts get the same buf breaking discipline as gRPC. Outbox pattern is mandatory for any write that emits an event. Schemas, SQL, and tooling shapes in RECIPES.md; pinned brokers and client libs in STACK.md.
| Shape | Direction | Semantics | Example |
|---|---|---|---|
| Event | Past-tense, broadcast | "Something happened" — fact about the past, anyone can listen | OrderPlaced, PaymentCaptured |
| Command | Imperative, point-to-point | "Do this" — request to one specific handler | CancelOrder, SendEmail |
| Message | Generic envelope | Container for either — used when the distinction doesn't matter | (mostly an implementation detail) |
OrderPlaced was placed; nothing changes that. Subscribers react however they want.<Noun><PastVerb> (OrderPlaced, ShipmentDispatched); commands are <Verb><Noun> (PlaceOrder, SendShipment).Per protobuf-architect: events are .proto messages, code-generated, validated by protovalidate, and protected from breaking changes by buf breaking in CI.
Envelope contract (every event):
event_id — UUID v7, sortable + unique. Subscribers dedupe on it.occurred_at — RFC 3339 timestamp. Replay tools sort by this.aggregate_id — the entity the event is about. Drives partitioning.schema_version — integer; bump on additive changes inside a topic version.Payload discipline:
orders/v1/events.proto holds every event the orders context emits.Canonical schema in RECIPES §1.
Hierarchical, snake_case, versioned. Pick a convention and enforce it.
<org>.<context>.<resource>.<version>.<event_name>events.md in the repo.Examples in RECIPES §5.
The dual-write problem: an HTTP handler writes a row and publishes an event. If the DB commits but the broker rejects, the event is lost — silent inconsistency. If the broker accepts but the DB rolls back, subscribers process a phantom event.
Outbox fixes this with a single transactional write.
BEGIN TX → INSERT INTO aggregate → INSERT INTO outbox → COMMIT.Schema + publisher shapes in RECIPES §2.
Event ordering is the single hardest part of event-driven systems. Order is per-key, not global.
order_id=abc land on the same partition, processed in order by one consumer. Different orders process in parallel.Brokers deliver at least once. Consumers see the same event more than once under network failure, restart, or rebalance.
processed_events table) of recently-seen IDs. Reject duplicates.INSERT ... ON CONFLICT DO NOTHING, UPDATE ... WHERE version = ? (with optimistic concurrency).Concrete handler + dedupe table in RECIPES §3.
Some events can't be processed — schema mismatch, downstream service down too long, business invariant violation. Don't let them block the partition.
<original>.dlq receives messages the consumer gave up on.<svc>_dlq_messages_total with an alert on any non-zero value. A DLQ that quietly fills is a silent outage.Retry policy + tool CLI shape in RECIPES §4.
When the consumer can't keep up with the producer, the system needs to slow down — gracefully.
503 Service Unavailable with Retry-After per rest-api-architect §3. Better than building a backlog you can't drain.Per-broker tuning knobs in RECIPES §6.
Per protobuf-architect §4 — additive changes stay in the version; breaking changes go to a new vN.
<topic>.v2; both run side-by-side until consumers migrate.For multi-step workflows that span services. Two opposing patterns — comparison table in RECIPES § 6.
OrderCancelled undoes PaymentCaptured via RefundIssued. Domain-level, not technical rollback.The pattern in §1–10 works on any modern broker. Full strengths/best-for table in RECIPES § 7. Defaults:
Pick once per system; switching mid-flight is expensive.
buf breaking discipline.Idempotency-Key discipline is the same idea consumers need internally.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.