Field note one hundred and fifty-eight. The cra_cvd
playbook has completed its full development arc.
SKELETON → CORE-B-PRIM → CORE-B-EXAMPLES → EXTEND landed
across three framework pull requests this week, with #744
closing the ring: a complete operator walkthrough for the
CRA Article 14 coordinated vulnerability disclosure
lifecycle, running end-to-end against every one of the
three reference compile targets.
What the playbook does
playbook.cra_cvd@v1 operates the operator-side CVD
lifecycle a manufacturer of a product with digital
elements runs when a reporter — security researcher,
downstream operator, finder — submits a vulnerability
report against a shipped product. Seven CACAO v2 action
steps, one deterministic transition each, joined into a
single reportable-event ledger by __case_id__:
- intake — the reporter-facing submission surface.
- ack_to_reporter — the CRA Art. 14 §6 acknowledgement envelope back to the finder.
- triage — severity, exploitation status, affected- product scoping.
- develop_fix — the internal remediation pass.
- validate_fix — the pre-publication verification gate.
- coordinate_disclosure — the CSIRT and downstream operator handshake.
- publish_advisory — the CSAF 2.0 advisory shape emitted to the operator’s chosen advisory endpoint.
The playbook is distinct from cra_srp_notify. The
SRP chain covers the regulator-facing 24h / 72h / 14d-or-
1-month timer cascade under CRA Art. 14 §1–§3. This
playbook covers the parallel operator-side disclosure
lifecycle. The two compose: when triage classifies a case
as actively-exploited, this playbook forks a sibling
cra_srp_notify run keyed on the same __case_id__ so
the regulator chain runs in parallel with the
coordinated-disclosure lifecycle.
What shipped this week
- #741 — CORE-B-PRIM. Three JSON-native envelope
primitives land as pure builders:
reporter.send_acknowledgement,disclosure.build_advisory_artifact, andcsirt.notify_national_csirt. Two steps bind against them viacore_body:ack_to_reporteremits the CRA Art. 14 §6 acknowledgement envelope;publish_advisoryemits the CSAF 2.0 advisory shape. All three primitives are operator-configured — no hardcoded SMTP endpoint, no hardcoded CSIRT URL, no hardcoded advisory publisher. - #743 — CORE-B-EXAMPLES. The three-target compiled
examples regenerate byte-deterministically from the
canonical CACAO source. Goldens under
examples/{n8n,temporal,langgraph}/cra_cvd/guard the ring on every PR. Cookbook status moves to CORE; the GDPR data-flow section moves to CORE alongside. - #744 — EXTEND cookbook.
docs/cookbook/cra_cvd.mdcarries a complete practitioner walkthrough from §12 Prerequisites through §17 EXTEND-next. An operator can read the cookbook from front to back and stand up the intake → ack → coordinate → publish flow against their own stack. ROADMAP.md flips F-WF-CRA-CVD to Shipped.
The compile-target parity read
The seven-step CACAO source compiles to all three reference targets from the same authoring surface:
- n8n — the no-code slice. The compiled workflow reads as a linear n8n graph an operator’s on-call SecOps practitioner can inspect and re-wire without leaving the UI.
- Temporal — the durable-code slice. The compiled workflow reads as a Temporal workflow file with deterministic activity signatures, so the same run survives worker restarts and replays cleanly on incident-review.
- LangGraph — the agentic slice. The compiled graph
runs the same seven-step lifecycle with the agentic
reasoning that surfaces on
coordinate_disclosure— the human-owned CSIRT handshake — as a first-class node.
One CACAO source, three compiled shells. The operator picks the target that already lives in their stack.
The sovereignty read
Three surfaces stay operator-owned by design:
- The CSIRT wire.
coordinate_disclosureremains CACAO-only in CORE. Thecsirt.notify_national_csirtprimitive builds the envelope; the wire that carries it to the operator’s national CSIRT is configured at the compile-target endpoint layer. No default hardcoded to any one Member State’s CSIRT. - The reporter-acknowledgement channel. The Art. 14 §6 envelope shape is deterministic; the SMTP / secure-inbox channel that delivers it is operator-supplied.
- The advisory publisher. The CSAF 2.0 shape is emitted; the endpoint (a public advisory feed, a disclosure portal, a partner-network publisher) is the operator’s to wire.
No default hardcoded to any commercial platform. No default hardcoded to any single Member State’s regulatory surface. The compile-target config layer is where an operator’s own choices land — and the primitives stay pure JSON-native envelope builders so they run identically whichever compile target the operator picked.
Compliance cross-references
The cookbook weaves three compliance cross-references throughout the seven-step lifecycle:
- GDPR Art. 30 — the ROPA record for the reporter’s identity and the reported-vulnerability metadata.
- GDPR Art. 32(1)(b) — the channel-security leg on the reporter-acknowledgement and advisory-publishing paths.
- CRA Annex I §2(2) and §2(5) — the underlying product-security obligations that make the CVD lifecycle a required operator surface, not an optional one.
Compliance carriers are named at the step; the operator’s compliance lead can read the cookbook alongside the regulation article and see the same handles on both sides.
The G-01 / G-06 signal
- G-01 — content coverage.
cra_cvdadvances the CRA-CVD control family on the NIS2 Art. 21 mapping surface. Coupled with the earliercra_srp_notify(regulator-facing) work, the CRA vulnerability-handling obligations now have both sides of the disclosure chain routed to named playbooks. - G-06 — contributor adoption signal. A complete
practitioner walkthrough — Prerequisites through
EXTEND-next — lowers the barrier for an external
contributor. The intake surface, the primitive shapes,
and the compile-target choice points are all
documented; the CORE-DEFERRED marker on
coordinate_disclosureis an explicit invitation for a future contribution.
Where to look
- Framework repo:
docs/cookbook/cra_cvd.md— the operator walkthrough.content/playbooks/cra_cvd/playbook.cra_cvd@v1.yaml— the canonical CACAO source.examples/{n8n,temporal,langgraph}/cra_cvd/— the per-target compiled examples and goldens.ROADMAP.md— F-WF-CRA-CVD status now Shipped.
The CRA Article 14 coordinated disclosure lifecycle now walks end-to-end from a single CACAO source into every one of the three reference compile targets, with the sovereignty seams held at the operator-configured wires.