How to Revise or Terminate an Embargo
Use this guide once a case already has an active embargo.
A revision runs the same propose, accept, or reject cycle that established the embargo; a termination removes it outright.
You finish with the case at Embargo Management (EM) state EM.ACTIVE under new terms, or at EM.EXITED.
A participant that no longer wants to be bound by the embargo can also withdraw from it, which leaves the case's EM state where it is.
Prerequisites
- A running Vultron instance you can drive. The demo containers are the quickest route — see Tutorial: Run the Receive-Report Demo for the two steps that get you a container shell.
- An actor identity on that instance, holding the role each step names.
- Working knowledge of the ActivityStreams verb, object, and target shape, summarized in Vultron and ActivityPub.
-
Working knowledge of the case model: the objects a case is made of, in The Case Model, and who is allowed to change them, in The CASE_MANAGER and the Case Ledger. Where a guide's messages are case-scoped, they route through the CASE_MANAGER and their results appear on the case ledger.
-
A case at
EM.ACTIVE. See How to Establish an Embargo. - The Case Owner role, for activating a revision or terminating the embargo. Any participant can propose a revision.
Embargo Management is a model of its own
The Vultron protocol carries considerable detail about Embargo Management and how participants are expected to interact with embargoes. Read that section before designing embargo behavior.
The exchange
The flowchart below extends the establishment flow with the moves available once an embargo is active.
The Terminate? branch is where an active embargo ends; the Propose? branch is where it changes.
---
title: Revising or Terminating an Active Embargo
---
flowchart TB
subgraph as:Invite
EmProposeEmbargo["Embargo Proposal (EP) / Embargo Revision Proposal (EV)<br/>Invite(Event)"]
end
subgraph participant answers
EmAcceptEmbargo["Embargo Proposal Acceptance (EA) / Embargo Revision Acceptance (EC)<br/>Accept(Invite(Event))"]
EmRejectEmbargo["Embargo Proposal Rejection (ER) / Embargo Revision Rejection (EJ)<br/>Reject(Invite(Event))"]
end
subgraph Case Owner decides
ActivateEmbargo["Activate the revision<br/>Accept(Event), target: VulnerabilityCase"]
RejectEmbargoProposal["Keep the current terms<br/>Reject(Event), target: VulnerabilityCase"]
end
subgraph as:Remove
RemoveEmbargoFromCase["Embargo Termination (ET)<br/>Remove(Event)"]
end
subgraph as:Announce
AnnounceEmbargo["Announce the embargo terms<br/>Announce(Event)"]
end
start([Start]) --> t{Terminate?}
t -->|n| p{Propose?}
p -->|y| EmProposeEmbargo
p -->|n| t
EmProposeEmbargo --> EmAcceptEmbargo
EmProposeEmbargo --> EmRejectEmbargo
EmAcceptEmbargo --> d{Owner activates?}
EmRejectEmbargo --> d
d -->|y| ActivateEmbargo
d -->|n| RejectEmbargoProposal
ActivateEmbargo --> t
RejectEmbargoProposal --> t
t -->|y| RemoveEmbargoFromCase
RemoveEmbargoFromCase --> AnnounceEmbargo
AnnounceEmbargo --> exited([EM.EXITED])
Revise the terms
Embargo Revision Proposal (EV) is implemented in ActivityStreams as Invite(Event) — the same activity as an initial proposal, Embargo Proposal (EP).
-
Send
Invite(Event)with the revisedEmbargoEvent. The case moves toEM.REVISE.Embargo Revision Proposal (EV)
Proposes a revision to the terms of the active embargo. The wire form is the same as a first proposal; the receiver's EM state makes it a revision.
- When… a Participant proposes revised terms for the active embargo
- Send:
Invite(Event)[context=VulnerabilityCase] - Send to: the case manager
- Sent by: the case manager or an active participant
- Distinguished by: EM state
ACTIVEorREVISE - Reference: Embargo Revision Proposal (EV)
Example activity
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Invite", "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_proposals/2", "name": "https://vultron.example/organizations/vendorco Invite Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "summary": "We propose to extend the embargo on case 1 to 120 days.", "actor": "https://vultron.example/organizations/vendorco", "object": { "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-09-29T00:00:00+00:00", "type": "EmbargoEvent", "name": "Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "startTime": "2026-06-01T19:12:00+00:00", "endTime": "2026-09-29T00:00:00+00:00", "published": "2026-06-01T19:12:00+00:00", "updated": "2026-06-01T19:12:00+00:00", "content": "We propose to embargo VendorCo Case #70930046 for 120 days.", "@context": "https://certcc.github.io/Vultron/ns/context.jsonld" } } -
Each participant answers with Embargo Revision Acceptance (EC),
Accept(Invite(Event)), or Embargo Revision Rejection (EJ),Reject(Invite(Event)). Either answer records only that participant's own consent to the revision, the Case Owner's included; the active embargo is unchanged.Embargo Revision Acceptance (EC)
Records the sender's own consent to the revision. The revision replaces the active embargo only when the Case Owner sends its decision.
- When… a Participant agrees to a proposed embargo revision
- Send:
Accept(Invite(Event)[context=VulnerabilityCase]) - Send to: the case manager
- Sent by: the invitee
- Distinguished by: EM state
REVISE - Reference: Embargo Revision Acceptance (EC)
Example activity
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Accept", "id": "urn:uuid:52395444-f726-45d5-b8d8-93984520a752", "name": "https://vultron.example/organizations/vendorco Accept https://vultron.example/organizations/vendorco Invite Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "to": "https://vultron.example/cases/1/participants", "actor": "https://vultron.example/organizations/vendorco", "object": { "@context": "https://www.w3.org/ns/activitystreams", "type": "Invite", "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_proposals/2", "name": "https://vultron.example/organizations/vendorco Invite Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "published": "2026-10-23T20:17:07+00:00", "updated": "2026-10-23T20:17:07+00:00", "summary": "We propose to extend the embargo on case 1 to 120 days.", "actor": "https://vultron.example/organizations/vendorco", "object": { "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-09-29T00:00:00+00:00", "type": "EmbargoEvent", "name": "Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "startTime": "2026-06-01T19:12:00+00:00", "endTime": "2026-09-29T00:00:00+00:00", "published": "2026-06-01T19:12:00+00:00", "updated": "2026-06-01T19:12:00+00:00", "content": "We propose to embargo VendorCo Case #70930046 for 120 days.", "@context": "https://certcc.github.io/Vultron/ns/context.jsonld" } } }Embargo Revision Rejection (EJ)
Records the sender's own refusal of the revision. The Case Owner keeps the prior terms by sending its decision.
- When… a Participant refuses a proposed embargo revision
- Send:
Reject(Invite(Event)[context=VulnerabilityCase]) - Send to: the case manager
- Sent by: the invitee
- Distinguished by: EM state
REVISE - Reference: Embargo Revision Rejection (EJ)
Example activity
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Reject", "id": "urn:uuid:70582571-7a9a-451a-bb95-d237f2d82ceb", "name": "https://vultron.example/organizations/vendorco Reject https://vultron.example/organizations/vendorco Invite Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "to": "https://vultron.example/cases/1/participants", "actor": "https://vultron.example/organizations/vendorco", "object": { "@context": "https://www.w3.org/ns/activitystreams", "type": "Invite", "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_proposals/2", "name": "https://vultron.example/organizations/vendorco Invite Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "published": "2026-10-23T20:17:07+00:00", "updated": "2026-10-23T20:17:07+00:00", "summary": "We propose to extend the embargo on case 1 to 120 days.", "actor": "https://vultron.example/organizations/vendorco", "object": { "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-09-29T00:00:00+00:00", "type": "EmbargoEvent", "name": "Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "startTime": "2026-06-01T19:12:00+00:00", "endTime": "2026-09-29T00:00:00+00:00", "published": "2026-06-01T19:12:00+00:00", "updated": "2026-06-01T19:12:00+00:00", "content": "We propose to embargo VendorCo Case #70930046 for 120 days.", "@context": "https://certcc.github.io/Vultron/ns/context.jsonld" } } } -
As Case Owner, send
Accept(Event)with the revisedEmbargoEventas itsobjectand the case as itstarget, once you judge the revision has carried, thenAnnounce(Event). The revision replaces the active embargo and your own consent to it is recorded. If the revision ends no later than the embargo it replaces, every participant that agreed to the old terms is bound by the new ones too.Activate embargo
Activates the proposal for the case. If an embargo is already active, the proposal replaces it.
- When… the Case Owner decides to activate a proposed embargo
- Send:
Accept(Event)[target=VulnerabilityCase] - Send to: the case manager
- Sent by: the case owner
- Reference: Activate embargo
Example activity
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Accept", "id": "urn:uuid:4ab9ab2c-2588-4c84-9564-d30c5f8f52a1", "name": "https://vultron.example/organizations/vendorco Accept Embargo for VendorCo Case #70930046 to urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "actor": "https://vultron.example/organizations/vendorco", "target": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "object": { "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00", "type": "EmbargoEvent", "name": "Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "startTime": "2026-06-01T19:12:00+00:00", "endTime": "2026-08-30T00:00:00+00:00", "published": "2026-06-01T19:12:00+00:00", "updated": "2026-06-01T19:12:00+00:00", "content": "We propose to embargo VendorCo Case #70930046 for 90 days.", "@context": "https://certcc.github.io/Vultron/ns/context.jsonld" } }Announce embargo
Tells participants the terms of the active embargo. It proposes nothing.
- When… the Case Manager states the terms of the embargo in force
- Send:
Announce(Event)[context=VulnerabilityCase] - Send to: a participant
- Sent by: the case manager
- Distinguished by: register status of the named embargo
ACTIVE - Reference: Announce embargo
Example activity
{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", "id": "urn:uuid:6e5f6600-ef6b-4e4b-b79e-b3a7713d461f", "name": "https://vultron.example/organizations/vendorco Announce Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "to": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/participants", "actor": "https://vultron.example/organizations/vendorco", "object": { "id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00", "type": "EmbargoEvent", "name": "Embargo for VendorCo Case #70930046", "context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0", "startTime": "2026-06-01T19:12:00+00:00", "endTime": "2026-08-30T00:00:00+00:00", "published": "2026-06-01T19:12:00+00:00", "updated": "2026-06-01T19:12:00+00:00", "content": "We propose to embargo VendorCo Case #70930046 for 90 days.", "@context": "https://certcc.github.io/Vultron/ns/context.jsonld" } }
A revision uses the same activities as an initial proposal. The receiver tells the two apart from the case's EM state: a proposal that arrives while the embargo is active is a revision (MSM-02).
To keep the current terms, send Reject(Event) with the same object and target as Case Owner instead.
The case returns to EM.ACTIVE under the original terms, and no participant's consent changes.
The embargo does not lapse because a revision failed.
Reject embargo proposal
Rejects the proposal for the case. An active embargo stays in force on its current terms.
- When… the Case Owner decides to reject a proposed embargo
- Send:
Reject(Event)[target=VulnerabilityCase] - Send to: the case manager
- Sent by: the case owner
- Reference: Reject embargo proposal
Example activity
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Reject",
"id": "urn:uuid:dfa08e2f-40bb-4c0f-9d21-6b921a8f10eb",
"name": "https://vultron.example/organizations/vendorco Reject Embargo for VendorCo Case #70930046 to urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"actor": "https://vultron.example/organizations/vendorco",
"target": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"object": {
"id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00",
"type": "EmbargoEvent",
"name": "Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"startTime": "2026-06-01T19:12:00+00:00",
"endTime": "2026-08-30T00:00:00+00:00",
"published": "2026-06-01T19:12:00+00:00",
"updated": "2026-06-01T19:12:00+00:00",
"content": "We propose to embargo VendorCo Case #70930046 for 90 days.",
"@context": "https://certcc.github.io/Vultron/ns/context.jsonld"
}
}
Terminate the embargo
Embargo Termination (ET) is implemented in ActivityStreams as Remove(Event).
Send Remove(Event).
The case moves to EM.EXITED, with immediate effect.
Set content to the reason the embargo ends: EARLY to end it before its end time, or END_TIME_REACHED once its end time has passed.
A receiver refuses a Remove(Event) whose content is anything else, and refuses END_TIME_REACHED sent before the end time.
Put a human-readable account in summary if you want one; the protocol does not read it.
With EARLY, you may also say why the embargo ends, in terminationCause.
Set its kind to one of these:
FIX_READY, withvendorslisting the actor IDs of the Vendors whose readiness made the quorum, each once.FIX_DEPLOYED, with no detail.OTHER, with no detail; give the account insummary.
The CASE_MANAGER records the cause as you give it.
If you end the embargo with the terminate-embargo trigger, give the cause as cause in the request body, with the same kind and detail.
An EARLY request with no cause is sent with an OTHER cause.
The trigger refuses a THREAT_SIGNAL cause, and any cause with END_TIME_REACHED.
Do not send terminationCause with END_TIME_REACHED.
A receiver refuses a Remove(Event) with an unknown kind, a missing or malformed detail, or a cause on END_TIME_REACHED.
Do not use THREAT_SIGNAL: the CASE_MANAGER refuses it on any Remove(Event) but its own.
To end the embargo because the vulnerability is public, an exploit is public or attacks are observed, send a case status update setting P, X or A instead.
The CASE_MANAGER then ends the embargo itself, with a THREAT_SIGNAL cause naming the signals the case carries.
Embargo Termination (ET)
Terminates the embargo with immediate effect.
- When… the Case Owner terminates the active embargo
- Send:
Remove(Event) - Send to: the case manager
- Sent by: the case manager or the case owner
- Reference: Embargo Termination (ET)
Example activity
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Remove",
"id": "urn:uuid:9beb248a-04b7-43f2-9407-acc3aec75398",
"name": "https://vultron.example/organizations/vendorco Remove Embargo for VendorCo Case #70930046 from urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"content": "EARLY",
"summary": "The embargo ended before its end time.",
"actor": "https://vultron.example/organizations/vendorco",
"origin": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"object": {
"id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00",
"type": "EmbargoEvent",
"name": "Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"startTime": "2026-06-01T19:12:00+00:00",
"endTime": "2026-08-30T00:00:00+00:00",
"published": "2026-06-01T19:12:00+00:00",
"updated": "2026-06-01T19:12:00+00:00",
"content": "We propose to embargo VendorCo Case #70930046 for 90 days.",
"@context": "https://certcc.github.io/Vultron/ns/context.jsonld"
},
"terminationCause": {
"kind": "FIX_DEPLOYED"
}
}
Only the CASE_MANAGER changes the case's EM state (EP-09-008).
If you are not the CASE_MANAGER, address Remove(Event) to the CASE_MANAGER.
If you are the CASE_MANAGER, address Remove(Event) to every other participant and never to yourself (EMB-19-001).
Tell a participant the embargo has ended
Tells one participant that the embargo has ended, with immediate effect. The Case Manager sends one to each participant other than itself, naming the Case Owner in attributedTo when the Case Owner asked for the termination.
- When… the Case Manager ends the active embargo, on its own decision or on the Case Owner's
- Send:
Remove(Event) - Send to: a participant
- Sent by: the case manager
- Reference: Tell a participant the embargo has ended
Example activity
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Remove",
"id": "urn:uuid:d8b43779-8ab4-4dca-85a7-39d191e7e068",
"name": "https://vultron.example/case-actors/vendorco-case-actor Remove Embargo for VendorCo Case #70930046 from urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"content": "EARLY",
"summary": "The embargo ended before its end time.",
"to": [
"https://vultron.example/organizations/coordinator"
],
"attributedTo": "https://vultron.example/organizations/vendorco",
"actor": "https://vultron.example/case-actors/vendorco-case-actor",
"origin": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"object": {
"id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00",
"type": "EmbargoEvent",
"name": "Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"startTime": "2026-06-01T19:12:00+00:00",
"endTime": "2026-08-30T00:00:00+00:00",
"published": "2026-06-01T19:12:00+00:00",
"updated": "2026-06-01T19:12:00+00:00",
"content": "We propose to embargo VendorCo Case #70930046 for 90 days.",
"@context": "https://certcc.github.io/Vultron/ns/context.jsonld"
}
}
The CASE_MANAGER commits the termination to the case ledger and fans the entry out to every participant.
Your own copy of the case moves to EM.EXITED when the CASE_MANAGER's ledger entry for the termination reaches you, not when you send.
When the CASE_MANAGER applies a Case Owner's termination that arrives before the end time, it then sends Announce(Event) naming the terminated embargo to every other active participant except a Closed Participant, the Case Owner included (EMB-19-001, CM-23-004).
A termination the CASE_MANAGER starts itself sends no Announce(Event).
Neither does a Case Owner's termination that arrives after the end time: the CASE_MANAGER's own end-time check has already ended the embargo when that Remove(Event) arrives.
Announce embargo termination
Tells the active participants other than the Case Manager and any Closed Participant that the embargo it names is terminated. It proposes nothing.
- When… the Case Manager has applied an Embargo Termination a Case Owner sent before the end time
- Send:
Announce(Event)[context=VulnerabilityCase] - Send to: a participant
- Sent by: the case manager
- Distinguished by: register status of the named embargo
TERMINATED - Reference: Announce embargo termination
Example activity
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Announce",
"id": "urn:uuid:5e8eeed8-0579-4900-84a1-ebe17af57136",
"name": "https://vultron.example/case-actors/vendorco-case-actor Announce Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"to": [
"https://vultron.example/organizations/vendorco",
"https://vultron.example/organizations/coordinator",
"https://vultron.example/users/finndervul"
],
"actor": "https://vultron.example/case-actors/vendorco-case-actor",
"object": {
"id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00",
"type": "EmbargoEvent",
"name": "Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"startTime": "2026-06-01T19:12:00+00:00",
"endTime": "2026-08-30T00:00:00+00:00",
"published": "2026-06-01T19:12:00+00:00",
"updated": "2026-06-01T19:12:00+00:00",
"content": "We propose to embargo VendorCo Case #70930046 for 90 days.",
"@context": "https://certcc.github.io/Vultron/ns/context.jsonld"
}
}
Termination is not a revision
Remove(Event) ends the embargo now, rather than proposing a shorter one.
If you want the embargo to end sooner but still exist, propose a revision with an earlier end time.
An embargo also terminates when the case reaches public awareness. See Early Termination.
End the embargo at its end time
You do not need to send anything when the end time passes.
The CASE_MANAGER ends the embargo with END_TIME_REACHED the next time it handles the case.
To end it on time without waiting for that, have the CASE_MANAGER call the terminate-embargo trigger with reason set to END_TIME_REACHED, for example from a Sentinel that watches embargo timers.
If the embargo has already ended, the trigger answers with no activity and commits nothing.
Withdraw from the embargo
A participant bound by the active embargo can stop complying with it at any time (VP-13-017).
Withdrawal is implemented in ActivityStreams as Leave(Event), with the embargo in force as its object and the case as its context (MSM-07-010).
It is not an answer to an Invite, so you need no Invite(Event) to withdraw: a Reporter whose consent was recorded when the case was created can withdraw too.
- Call
withdraw-embargowith the case's ID. The trigger reads the embargo in force from your copy of the case. - The trigger sends
Leave(Event)to the CASE_MANAGER. The CASE_MANAGER marks your consent row for the embargo in forceDECLINED, and also every row you had markedAGREEDfor an open revision, because each open revision replaces the embargo you left. It commits the withdrawal to the case ledger, then each consent row it declines as an entry of its own. Your own copy of the case changes when those entries reach you.
Withdraw from embargo
Ends the sender's own consent to the embargo in force, and to any revision it had agreed to. The embargo stays in force for every other participant.
- When… a Participant bound by the active embargo stops complying with it
- Send:
Leave(Event)[context=VulnerabilityCase] - Send to: the case manager
- Sent by: a participant
- Reference: Withdraw from embargo
Example activity
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Leave",
"id": "urn:uuid:f8df63a6-ce70-49e0-b34e-14d7b5850214",
"name": "https://vultron.example/users/finndervul Leave Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"to": "https://vultron.example/case-actors/vendorco-case-actor",
"actor": "https://vultron.example/users/finndervul",
"object": {
"id": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0/embargo_events/2026-08-30T00:00:00+00:00",
"type": "EmbargoEvent",
"name": "Embargo for VendorCo Case #70930046",
"context": "urn:uuid:d483d06d-400e-47fd-9b8a-9a2643e3a4b0",
"startTime": "2026-06-01T19:12:00+00:00",
"endTime": "2026-08-30T00:00:00+00:00",
"published": "2026-06-01T19:12:00+00:00",
"updated": "2026-06-01T19:12:00+00:00",
"content": "We propose to embargo VendorCo Case #70930046 for 90 days.",
"@context": "https://certcc.github.io/Vultron/ns/context.jsonld"
}
}
The embargo stays in force for every other participant, and the case's EM state does not move. Because you are no longer bound by the embargo, the CASE_MANAGER stops sending you case content until the embargo ends, or until you are invited to it again and agree (CM-10-005).
The trigger refuses the withdrawal in three cases:
- No embargo is in force.
- Your consent row for the embargo in force is not
AGREED; to refuse terms you never agreed to, reject the Invite instead (see How to Establish an Embargo). - You are the Case Owner, which ends an embargo by terminating it, as in the previous section.
A Reject never withdraws
Reject(Invite(Event)) refuses terms; it is not a way to leave an embargo you agreed to.
A Reject of the embargo in force from an AGREED row is refused, and reject-embargo with no proposal_id rejects an open revision while your consent to the embargo in force stays AGREED (MSM-07-004).
Verify
| What you sent | What to confirm |
|---|---|
Invite(Event) on an active embargo |
The case em_state is REVISE. |
Accept(Event) with the case as target, as Case Owner |
The case em_state is ACTIVE and the active embargo carries the new terms. |
Reject(Event) with the case as target, as Case Owner |
The case em_state is ACTIVE and the terms are unchanged. |
Reject(Invite(Event)) on a revision |
Your consent row for the revision is DECLINED; the case em_state is still REVISE. |
Remove(Event) |
Once the CASE_MANAGER's ledger entry arrives, the case em_state is EXITED and no embargo is active. |
Leave(Event) |
Once the CASE_MANAGER's ledger entry arrives, your consent row for the embargo in force is DECLINED; the case em_state is unchanged. |
See it end to end
Try it: vultron-demo manage-embargo
vultron-demo manage-embargo
Or with Docker Compose:
DEMO=manage-embargo docker compose -f docker/docker-compose.yml run --rm demo
The scenario runs an activate-then-terminate path and a reject-then-repropose path.
Further reading
- Embargo Management (EM) Messages — the wire format and a rendered example for each activity above, and the state-context rule that distinguishes a revision from a proposal
- Embargo Management — the state machine these activities drive
- Participant Embargo Consent (§9 Participant Embargo Consent (PEC) State Machine in the specification) — how each participant's own commitment is tracked alongside the case EM state
- Trigger API Reference — request schema and endpoint details for
propose-embargo-revision,terminate-embargoandwithdraw-embargo