RCCV-handoff Scenario: Reporter + C1 → C2 + Vendor
Overview
The RCCV-handoff scenario exercises coordinator-to-coordinator case-ownership transfer. The Reporter reports to C1. C1 creates and initially owns the case. C1 invites C2, then transfers ownership to C2. C2, now the case owner, invites the Vendor. All participants eventually disclose and close the case.
Participants:
- Reporter — discovers the vulnerability and submits the report; in the case it holds the Reporter role; the protocol has no separate Finder role (ADR-0078).
- C1 (Coordinator 1) — receives the report; validates and engages the case; transfers ownership to C2.
- C2 (Coordinator 2) — joins via C1's invitation; receives case ownership; invites the Vendor.
- Vendor — joins via C2's invitation; develops and ships a fix.
- Case Actor — the actor that holds the CASE_MANAGER role for this case; it writes every canonical ledger entry and fans it out to the participants. In the demo it runs on the dedicated
case-actorcontainer, but its authority comes from the role, not from where it runs; the same Case Actor keeps the role after the ownership handoff.
Protocol narrative
1. Reporter submits a vulnerability report to C1
The Reporter reports to C1's endpoint. No ledger entry is created yet.
Antecedent: Reporter has knowledge of the vulnerability.
2. C1 validates and engages the case
C1 reviews the report and accepts it. validate_report and engage_case
entries appear in the ledger.
Antecedent: Report received from Reporter.
3. Participant status records are created
The Case Actor records the engagement's status as an add_participant_status_to_participant entry; each record seated at case creation was ledgered as a create_case_participant entry.
Antecedent: engage_case is in the ledger.
4. C1 invites C2
C1 sends C2 an invite_actor_to_case entry.
Antecedent: engage_case is in the ledger.
5. C2 accepts the invitation
C2 joins the case. An accept_invite_actor_to_case entry is recorded.
Antecedent: invite_actor_to_case is in the ledger (step 4).
6. C1 offers case ownership to C2
C1 decides to transfer the case to C2 and initiates the ownership-transfer protocol.
C1 proposes the transfer to the Case Actor, not to C2 (ADR-0053, ADR-0148).
The Case Actor makes the offer itself, under its own identity, and records it as an offer_case_ownership_transfer entry, so every participant learns that a transfer is on offer.
Antecedent: C2's accept_invite_actor_to_case entry is in the ledger.
7. C2 accepts case ownership
C2 formally accepts the ownership transfer.
An accept_case_ownership_transfer entry is recorded.
The CASE_OWNER role moves to C2 and the case's attributed_to field is updated to C2, each change recorded as its own update_case_participant or update_case_owner entry.
Antecedent: the Case Actor's ownership offer has reached C2.
8. C2 invites the Vendor
C2, as the new case owner, identifies the Vendor as affected and sends an
invite_actor_to_case entry.
Antecedent: accept_case_ownership_transfer is in the ledger.
9. Vendor accepts the invitation
The Vendor reviews and accepts. An accept_invite_actor_to_case entry is
recorded.
Antecedent: C2's invite_actor_to_case entry is in the ledger.
10. Participants exchange notes
All participants communicate through case notes.
Each note is sent as one Add(Note) carrying the note inline, and recorded as an add_note_to_case entry, which attaches it to the case.
Antecedent: engage_case is in the ledger.
11. Vendor reaches fix-ready
The Vendor advances to VFd (fix-ready) status.
Antecedent: engage_case is in the ledger.
12. Participants publish; embargo terminates
All participants publish. The embargo exits ACTIVE.
Antecedent: Vendor has reached fix-ready.
13. All participants close the case
close_case entries appear for each participant.
C1, the Vendor, and the Reporter leave first; C2, the Case Owner since the handoff, leaves last.
A departure sent after the owner's is not recorded, so every other participant's departure is recorded first.
Antecedent: validate_report and engage_case are in the ledger.
Unobservable edges
| Unobservable step | Why not in ledger |
|---|---|
| Reporter submits report to C1 | Report submission precedes the case. |
The ownership offer is not an unobservable step.
The Case Actor records it as offer_case_ownership_transfer once it sends the offer, and C2's accept_case_ownership_transfer follows it, which is the edge declared above.