Decisions
This section contains decision records for the Vultron project.
What is an ADR?
An architectural decision record (ADR) is a document that captures an important architectural decision made along with its context and consequences. We're using the expanded concept of an Any Decision Record (ADR) to capture any decision that is important to the project, not just architectural decisions. We use Markdown Any Decision Records (MADR) to document our architectural decisions.
When to write an ADR
The primary signal for an ADR is evaluated alternatives: if you considered more than one option and rejected at least one, document the decision. The record preserves context for future maintainers who might otherwise re-open a settled question.
Concretely, write an ADR when:
- You adopted a structural or architectural approach over one or more alternatives (e.g., hexagonal architecture over layered, SQLModel over TinyDB).
- You made a one-time process or tooling decision with lasting project-wide impact (e.g., CalVer over SemVer, pinning CI action SHAs).
- A decision will be hard or costly to reverse, so the rationale should be preserved explicitly.
ADR vs. spec: an ADR records why a choice was made; a spec entry records
what the system must do going forward. When a significant decision also
generates recurring testable requirements, create both — see
notes/specs-vs-adrs.md for the full delineation guidelines and worked
examples.
You do not need an ADR for:
- Uncontested conventions with no real alternatives (write a spec entry instead).
- Small tactical choices where the rationale is obvious from the code.
If you're unsure, err on the side of writing one — a brief ADR is better than losing context.
Revising vs. amending an ADR
An ADR is a historical record. It answers what we decided and why, given what we knew at the time — a question whose answer cannot go stale, because the past does not change. It is not a description of the current codebase.
That distinction decides most editing questions. When an ADR names a function, a module path, or a class that was later renamed or deleted, the decision still stands and the record is still accurate about the decision; only its description of the code has aged.
A refactor is never responsible for updating an ADR.
Renaming a symbol or splitting a module does not oblige you to touch any ADR that mentions it.
If a decision has consequences that future code must obey, those belong in a spec requirement or a notes/ file, which carry an obligation to stay current that an ADR does not.
Record them there and cite the ADR as provenance — see notes/specs-vs-adrs.md for the delineation and MS-11-004 for the bidirectional citation pattern.
A spec or note MUST NOT resolve its own meaning by pointing into an ADR body; cite the ADR for why, and state the rule where the reader already is.
MS-11-007 makes that normative for any numbered part of a body, whether a detail, rule, step, option, part, invariant or section number, and a test fails any such citation under specs/ or notes/.
An ADR citing a numbered part of another ADR is fine — that is history citing history.
An aged code reference in an ADR body is not a defect.
Per ADR-0127, the existing stale paths and symbols across the corpus are not a backlog and no scrub is owed: a reference in a record's context or validation prose is an accurate account of the code as it then stood.
Enforcement is forward-only — a reference newly written into an ADR should resolve on the day it is written.
The adr-added-reference-check pre-commit hook and its pull-request twin fail a backticked path or code symbol that an edit adds and that resolves nowhere, and never judge a reference already on the merge base (MS-15-006).
A record that deliberately names a removed symbol opts out with lint_suppress: [phantom_symbol_ref], or [phantom_path_ref] for a path (MS-15-007).
How to edit an ADR: follow the edit tiers in ADR-0120, which key off the ADR's epoch: how long ago it was last materially changed, and whether a tested spec requirement depends on it yet.
Editorial fixes and appended annotations are allowed at any time and change neither updated nor revision.
A clarification that does not alter what anything built on the ADR must do is appended as a dated note, rather than written over the original text.
A material change bumps updated and revision; on an accepted-provisional ADR, ask the human whether to edit in place or supersede.
On an accepted ADR, a material change to one detail with the chosen option intact is a dated Amendment that quotes the text it replaces.
A change of the chosen option is a new ADR that supersedes the old one; the old one is restored to its original text, marked superseded, and moved to archived/ (MS-14-004).
Never rewrite an accepted ADR under its own number.
The adr-lifecycle-check pre-commit hook holds one part of this mechanically: on an ADR that is accepted, or was last changed 28 or more days ago, it refuses a changed ## Decision Outcome or ## Considered Options section that adds no new dated Amendment heading (MS-14-009).
It also refuses an updated bump that carries no status_override on an ADR past its first epoch (MS-14-009).
It reads no other section and does not check that an Amendment quotes what it replaces, so the remaining tiers are yours to honour.
What not to write into an ADR body. Implementation detail that drifts independently of the decision costs a future reader — including an agent with a limited context window — attention on claims that were true once and are not checkable now.
- A statement about a completed migration step — "X is deleted", a struck-through progress list, a renaming checklist — is project tracking, not a decision.
Record it in the issue that does the work.
Deleting it is an editorial edit wherever it sits outside
## Decision Outcomeand## Considered Options. Inside either of those, on anacceptedADR, the hook above refuses the deletion on its own, so leave it for the next material change or supersession to carry. - A count, a metric, or a
file.py:linecitation goes stale on the next unrelated edit. State the rule and point at where the live answer lives. MS-16-001 and MS-16-002 inspecs/meta-specifications.yamlset out the same principle for specs, notes and AGENTS.md; extending it to ADR bodies, with a check behind it, is tracked in #4389. - A description of how the code looked when the decision was made is legitimate context, because it is part of why the decision was needed. Write it so it reads as of its time, and annotate anything since removed. ADR-0063 is the house style, noting inline that "that mechanism and that module were deleted in #2940". A reference marked that way is dead but not misleading.
On the former guidance in this section. Until 2026-10-09 this section asked authors to revise an accepted ADR body in place so that a reader would meet only currently-accurate statements (ISSUE-1777), and discouraged appended amendments for the same reason. That pursued the goal above — keeping stale detail out of a reader's way — through the only mechanism available while every ADR body was read as routine context: keeping the bodies current. Keeping implementation detail out of the body in the first place serves the same goal without asking a historical record to change, and without conflicting with the lifecycle rules that ADR-0120 and MS-14-009 now set. Records revised in place under the former guidance, such as ADR-0098, are left as they are.
How to write an ADR
For new ADRs, please use adr-template.md as basis. More information on MADR is available at https://adr.github.io/madr/. General information about architectural decision records is available at https://adr.github.io/.
Accepted ADRs
- ADR-0000 Record architecture decisions
- ADR-0001 Use Markdown Any Decision Records
- ADR-0002 Model Processes with Behavior Trees
- ADR-0003 Build our own Behavior Tree engine in Python — partially superseded by 0008-use-py-trees-for-handler-bt-integration.md
- ADR-0004 Use factory methods for common BT node types
- ADR-0005 Use ActivityStreams Vocabulary as the basis for Vultron Message Formats
- ADR-0006 Vultron Release Versioning
- ADR-0007 Introduce a Behavior Dispatcher Between Inbox Handling and Behavior Execution
- ADR-0008 Use py_trees for Behavior Tree Execution in Handler Integration — partially supersedes 0003-build-custom-python-bt-engine.md
- ADR-0009 Adopt Hexagonal Architecture (Ports and Adapters) for Vultron
- ADR-0010 Standardize Object IDs to URI Form
- ADR-0011 Remove API v1 and consolidate vocabulary examples into API v2
- ADR-0012 Per-Actor DataLayer Isolation — partially superseded by docs/adr/0073-per-actor-storage-isolation.md
- ADR-0013 Unify RM State Tracking into Persisted VultronParticipantStatus Records
- ADR-0014 Pin GitHub Actions to Full Commit SHAs with Version Comments
- ADR-0016 Replace TinyDB with SQLModel/SQLite DataLayer Adapter
- ADR-0018 Canonical Case History Convergence on
CaseLogEntry - ADR-0019 Separate the Case Ledger from the Per-Actor Process Log
- ADR-0020 Move Inbox Orchestration into a Core BT Module with a Typed
process_payloadSeam - ADR-0021 CaseActor Inbox Routing as the Sole Path to Canonical Ledger Entries — partially superseded by 0109-a-container-emits-only-as-actors-it-hosts.md
- ADR-0022 Single BT Execution Per Inbox Delivery for Received-Side CaseActor Routing
- ADR-0023 Introduce
CaseProposalfor Distributed Case Actor Initialization - ADR-0024 Capability Shape Taxonomy — partially superseded by docs/adr/0097-capability-layer-four-shapes-and-core-declared-contracts.md
- ADR-0025 Call-Out Point Abstraction Layer: Factory-Based Injection with Typed Backends
- ADR-0026 CaseActor-Routed Actor Suggestion and Invitation Flow
- ADR-0027 Exploit-Strategy Subtree Collapse: Five Simulator Nodes → EvaluateExploitStrategy
- ADR-0028 Publication-Intent Subtree Collapse: Bypass Leaves → Intent-Record-Driven Arms
- ADR-0029 Notification Loop Collapse: InjectParticipant → suggest-actor-to-case Protocol
- ADR-0030 Publish Leaf Expansion: Single Actuator → Draft-Review-Submit Pipeline
- ADR-0031 Introduce
vultron/enums/as a Bottom-of-Stack Neutral Layer for Cross-Cutting Enumerations - ADR-0032 Validate at the Edge, Promote to Strict Core Types
- ADR-0033 Lifecycle-Staged Domain Types Anchored on Guaranteed-Field Changes
- ADR-0034 DataLayer Port Returns Core Domain Objects
- ADR-0035 Core Activity Representation and Envelope Reconstitution — partially superseded by 0149-the-received-archive-is-the-sealed-received-body-read-through-a-read-only-view.md
- ADR-0036 Per-Machine Dimension Objects for CaseStatus and ParticipantStatus
- ADR-0037 Buffer Out-of-Order
Announce(CaseLedgerEntry)Instead of Dropping - ADR-0038 Replace Six-Kind Spec Taxonomy with Four-Tier Portability Hierarchy — partially superseded by 0134-who-must-obey-a-rule-decides-its-spec-kind.md
- ADR-0039 Resolve Wire Ambiguity Between OFFER_CASE_MANAGER_ROLE and OFFER_CASE_OWNERSHIP_TRANSFER via Dedicated Object Type
- ADR-0040 Introduce UseCaseResult Envelope; Do Not Introduce UseCaseRequest
- ADR-0041 CASE_MANAGER-Authoritative Case Initialization (revision 2) — partially superseded by 0132-the-report-receiver-introduces-the-case-manager-to-the-reporter.md; supersedes 0015-create-case-at-report-receipt.md
- ADR-0042 Deliver All Inter-Actor Communication over HTTP; Retire the In-Process ASGI Delivery Shortcut — partially superseded by 0109-a-container-emits-only-as-actors-it-hosts.md
- ADR-0043 Use the ADR
statusField as the Confidence Signal (Extend Its Vocabulary Rather Than Add a New Field) - ADR-0044 Adopt py_trees Typed Ports for BT Node Blackboard Contracts
- ADR-0045 Correct Field Assignment on
Create(VulnerabilityCase)—contextto Case URI,inReplyToto Accept URI - ADR-0046 Two-Gate Authorization Model for Received-Side CaseStatus Canonicalization
- ADR-0047 Report-to-Others Party Discovery: Sentinel Over Inline BT Loop
- ADR-0048 PEC
NO_EMBARGOMeans Absence of Embargo, Not Pre-Consent — partially superseded by docs/adr/0122-per-embargo-participant-consent.md - ADR-0049 Core Does Not Model Inbound Protocol Error Message Types; No
create_inbound_error_followup_tree - ADR-0050 Leave(VulnerabilityCase) Is the Canonical RM Case Closure Mechanism
- ADR-0051 CaseActor Has Its Own RM Lifecycle Tracked via CaseParticipant
- ADR-0052 Demo CI Job Structure: Accept Barrier + Concurrency Group Over Job Consolidation
- ADR-0053 Route Ownership-Transfer Offer and Accept Through the CaseActor — partially superseded by 0148-an-owner-proposes-an-ownership-transfer-offer-and-the-case-manager-makes-it.md
- ADR-0054 Retain plan/incoming/learnings/ as a File Queue; Do Not Migrate to GitHub Issues
- ADR-0055 CI Failure Alerting via GitHub Issues on Main-Branch and Scheduled Workflows
- ADR-0057 Rename
CVDRole.OTHERtoCVDRole.OBSERVERand Define Observer Participant Semantics - ADR-0058 Gate Demo Scenario Steps on Causal Preconditions, Not Temporal Order
- ADR-0059 Buffer Pre-Genesis
Announce(CaseLedgerEntry)and Drain on Case Seed - ADR-0060 Re-express the Legacy Case-State Invariants and Keep the Hypercube as Reference
- ADR-0063 Render Core Objects to Wire JSON Through a Driven Port; Remove
alias_generatorFrom All Core-Branch Types — partially superseded by 0099-one-object-model-as2-is-a-serialization.md - ADR-0064 Enforce Post-Construction Type Safety on the Core Branch Only, in Three Ratcheted Steps
- ADR-0065 Carry the Embargo Invite RSVP Deadline on
Invite.end_time - ADR-0066 Outbox Terminal State: Per-Activity Attempt Counter, 4xx Classification, and Dead-Letter Store
- ADR-0067 Accept Non-Adjacent Forward RM Jumps and Notify; Refuse Backward Regressions Non-Silently
- ADR-0068 Refuse Misaddressed Activities at the Inbox with a Synchronous 4xx
- ADR-0069 Adopt certcc.github.io/Vultron as the Initial Vultron Vocabulary Namespace Host — partially superseded by 0106-versioning-machine-facing-interfaces.md
- ADR-0071 CVE Eligibility: Reference Baseline over Normative Citation or Implementation-Defined
- ADR-0072 Use a Dedicated
stories:Field for Spec-to-Story Traceability (Notrelationships:) - ADR-0073 Give Each Actor Its Own Store; Delete the Unscoped DataLayer — partially superseded by 0109-a-container-emits-only-as-actors-it-hosts.md; partially supersedes 0012-per-actor-datalayer-isolation.md
- ADR-0074 Treat Wire Activities as Immutable Artifacts; Freeze at Receipt and at Factory Seal — partially superseded by 0099-one-object-model-as2-is-a-serialization.md
- ADR-0075 Split Per-Participant VFD Tracking into Separate Vendor-Path and Deployer-Path Sub-Machines
- ADR-0076 Security-Significant Call-Out Gates Default to
RequireCaseOwnerApproval - ADR-0077 Scope Ledger Replication Mechanics to a Companion Spec; Single-Hub Fan-Out Is Normative
- ADR-0078 Retire
CVDRole.FINDER— Reporter Is the Protocol-Salient Role - ADR-0079 CaseLedger Causal Ordering: CaseActor Observation Order Is the Canonical Causal Order
- ADR-0080 Asking Permission Is a Protocol Message, Not a Suspended Behavior
- ADR-0081 Peer Knowledge Lives in the Hosted Actor's Own Store, Not as a Hosted Actor
- ADR-0083 The Formal Message Set and the AS2 Wire Vocabulary Are Deliberately Different Shapes; the Mapping Is the Reconciling Artifact
- ADR-0085 Owner-Close Is a Hard Write Boundary; RM.CLOSED Is Terminal and Rejoin Is Unsupported
- ADR-0086 Report Every Violation, Reject the Batch — and the Emit/Receive Dispositions Are Postel's Maxim
- ADR-0087 Case-Resolution Disposition for BT Nodes Is Chosen by Role, Not Re-Decided Per Call Site
- ADR-0088 Authority Is the CASE_MANAGER Role; "Case Actor" Names the Prototype Actor That Enacts It, Not the Authority — partially superseded by 0153-one-role-check-per-message-picks-the-received-path.md
- ADR-0089 One
ParticipantStatusWriter, and Pre-Case RM State Belongs toReportCaseLink - ADR-0090 A Blank Required Field Is Absence, and a Recognised Inline Object That Fails Validation Is Refused
- ADR-0091 Rename PEC
NO_EMBARGOtoUNBOUND; DropEM.NO_EMBARGOAlias — partially superseded by docs/adr/0122-per-embargo-participant-consent.md - ADR-0092 Lint Fragments as Source, and Evaluate Page-Scoped Style Rules on the Rendered Page
- ADR-0093
DECLINEIs Legal fromSIGNATORY— Consent Withdrawal Is a First-Class PEC Action — partially superseded by docs/adr/0122-per-embargo-participant-consent.md - ADR-0094 Replace flake8, isort and black with ruff, and declare lint exclusions instead of discovering them
- ADR-0095 Received-Side
HandlerResultCarries a Handler Disposition Across the Dispatcher Boundary - ADR-0096 A Protocol Default Embargo Replaces the Pre-Case Phase (revision 2)
- ADR-0097 The Capability Layer: Four Call-Out Shapes, Core-Declared Typed-Port Contracts, and Sentinel as a Call-In Pattern — partially supersedes 0024-coordination-agent-taxonomy.md
- ADR-0098 Demo scenarios self-register at import time; every scenario table and the CI matrix become derived artifacts
- ADR-0099 One Object Model: AS2 Is a Serialization of the Core Model, Not a Parallel Hierarchy — supersedes 0017-domain-wire-object-separation.md, 0082-wire-core-boundary-pairing-registry.md; partially supersedes 0063-wire-rendering-port-for-core-objects.md, 0074-wire-activity-artifact-immutability.md
- ADR-0100 There Is No Multi-Candidate Embargo Poll; Open Proposals Resolve in Earliest-Expiration Order
- ADR-0101 Spec Item Format Is Field Presence, Not a Class Choice; a Bare Item Cannot Be a
BehavioralSpec - ADR-0102 Organize reader-facing documentation by stakeholder type and invisible prerequisite level — partially superseded by 0136-organize-the-site-top-level-by-subject-and-reader-not-diataxis-type.md
- ADR-0103 An Object's Time Is Carried, Never Minted by the Receiver
- ADR-0104 The Interactive Demo UI Is a React/ReactFlow Operator-Side Ledger Watcher, Fed by a Prototype-Only SSE Stream
- ADR-0105 Two Cases for One Vulnerability Merge by Owner Consent: the Offered Case Freezes and Redirects (provisional)
- ADR-0106 Version Each Machine-Facing Interface Independently of the Release Tag (provisional) — partially supersedes 0069-vultron-namespace-uri.md
- ADR-0107 A Case Ledger Entry Is a Postmark on the Received Envelope; References Resolve by Dereference (provisional) — supersedes 0061-per-dimension-partial-accept.md
- ADR-0108 One Move, One Mover: Case State Flows Through the Case Manager and the Ledger, Whatever Message Carried It
- ADR-0109 A Container Emits Only as Actors It Hosts; a Participant Asks the CaseActor to Act — partially supersedes 0021-caseactor-inbox-routing-canonical-ledger.md, 0042-http-only-inter-actor-delivery.md, 0073-per-actor-storage-isolation.md
- ADR-0110 The Trigger Driving Port Is One
trigger()Method over a Verb Registry, Returning a Typed Result Bound to the Request - ADR-0111 Intake Is the First Stage of a Received-Side Tree: Record What Arrived Before Judging It — partially superseded by 0135-compose-received-trees-never-chain-them.md, 0151-a-received-act-commits-its-own-entry-with-its-consequences.md, 0154-a-received-message-is-one-staged-record-archived-only-when-applied.md
- ADR-0112 Per-Recipient Ordered Outbox Delivery: One Drain per Actor, One In-Flight Row per Recipient
- ADR-0113 Embargo Negotiation Relays Through the CASE_MANAGER; the Ledger Carries State but Never Asks
- ADR-0114 Joining a Case: The Invite Creates an Inert Participant, the Stub Is Its Own Type, and RM Closes from Received (revision 2)
- ADR-0115 Received Handlers Check the Sender's Entitlement, Declared Once per Use Case and Composed by the Receive-Tree Factory (provisional)
- ADR-0117 The Per-Case Genesis Hash Is Anchored to the Case Owner, Not the CaseActor
- ADR-0118 An Expired Invite Is Not a Decline, and a Terminated Embargo Is Not the Start State — partially superseded by docs/adr/0122-per-embargo-participant-consent.md
- ADR-0119 The Case Ledger Records Completed Acts (revision 2) (provisional)
- ADR-0120 ADR Lifecycle: Three Epochs and Tiered Edits (revision 2) (provisional)
- ADR-0121 A Joined Participant Judges the Case by Answering a Full-Case Invite; Status Is Self-Declared and Asserted Only for Existing Participants (provisional) — supersedes 0070-invited-actor-rm-triage-via-ledger-backfill.md, 0084-participant-assertion-authority.md
- ADR-0122 Participant Embargo Consent Is Recorded per (Participant, Embargo), Against an Embargo Register on the Case (revision 7) (provisional) — supersedes 0056-embargo-adherence-computed-field.md; partially supersedes 0048-pec-no-embargo-is-absence-not-pre-consent.md, 0091-rename-pec-no-embargo-to-unbound.md, 0093-signatory-declined-pec-transition.md, 0118-pec-expired-and-unbound-exited-states.md
- ADR-0123 An Embargo Invite May Name Its Terms by URI (provisional)
- ADR-0124 The Case Is a Projection of Its Ledger: Every Change Is an Entry, and Replicas Copy (revision 2) (provisional)
- ADR-0127 Decision Records Leave Routine Agent Context; Specs and Notes Carry the Current State (provisional)
- ADR-0128 Message Vocabulary Docs Are Projections of the Semantic Registry (provisional)
- ADR-0129 A Sender Rule States Every Position on Both Sides, and Is the Source of "Sent By" (provisional)
- ADR-0131 Post-Close Traffic Is Dropped, and Only a Late Leave May Be Answered (provisional)
- ADR-0132 The Report Receiver Introduces the CASE_MANAGER to the Reporter (provisional) — partially supersedes 0041-caseactor-authoritative-case-initialization.md
- ADR-0133 The Report Receiver States Its Case Roles on the Case Proposal (provisional)
- ADR-0134 Who Must Obey a Rule Decides Its Spec Kind (provisional) — partially supersedes 0038-four-tier-specification-taxonomy.md
- ADR-0135 Compose Received Trees, Never Chain Them (revision 3) (provisional) — partially superseded by 0154-a-received-message-is-one-staged-record-archived-only-when-applied.md; partially supersedes 0111-intake-is-the-first-received-side-stage.md
- ADR-0136 Organize the Site's Top Level by Subject and Reader, Not Diátaxis Type (revision 2) (provisional) — partially supersedes 0102-docs-stakeholder-types-and-invisible-prerequisite-levels.md
- ADR-0137 Case Records and Notes Are Attached by One Message, Never Created First (revision 2) (provisional)
- ADR-0140 A Ledger Entry's Semantic Type Is the Registry Label of Its AS2 Payload (revision 4) (provisional) — partially superseded by 0152-a-case-managers-act-shares-the-participants-semantic-type-and-an-observation-is-not-ledgered.md
- ADR-0141 A Refused Assertion Is Answered With a Reject of the Refused Activity (provisional)
- ADR-0142 A Diverged Replica Is Repaired by a Fresh Case Copy That Names Its Ledger Position (revision 2) (provisional)
- ADR-0144 Once a Report Belongs to a Case, Only Its Owner Closes It, by Leave (provisional)
- ADR-0145 A Case Is Left Through the Leave-Case Trigger, Whose Actor Runs Its Pre-Close Step First (provisional)
- ADR-0146 One Atomic Commit per CASE_MANAGER Act (revision 5) (provisional)
- ADR-0147 The Protocol Specification Renders Its Normative Text from the YAML Requirements (provisional)
- ADR-0149 The Received Archive Is the Sealed Received Body, Read Through a Read-Only View Parsed on Load (provisional) — partially supersedes 0035-core-activity-representation-and-envelope-reconstitution.md
- ADR-0152 A Case Manager's Act Shares the Participants' Semantic Type, and an Observation Is Not Ledgered (provisional) — partially supersedes 0140-a-ledger-entrys-semantic-type-is-the-registry-label-of-its-as2-payload.md
Proposed ADRs
- ADR-0116 Removing a Participant Withdraws Entitlement, Not Membership (revision 3)
- ADR-0125 A Case Splits by Its Owner Proposing a Child Case: the Child Links Its Parent and Inherits the Embargo Terms Only
- ADR-0126 CI Is the Full-Suite Authority After a Pull Request's First Push (revision 2) — partially superseded by 0138-a-pushed-pull-request-is-merged-locally-only-on-conflict.md, 0143-a-fix-commits-local-gate-escalates-only-for-shared-test-infrastructure.md
- ADR-0130 EM Is Computed From the Embargo Register Under the EM Transition Table (revision 2)
- ADR-0138 A Pushed Pull Request Is Merged Locally Only on Conflict — partially supersedes 0126-ci-is-the-full-suite-authority-after-the-first-push.md
- ADR-0139 A Fresh Agent Reviews the Branch Before Its First Push
- ADR-0143 A Fix Commit's Local Gate Escalates Only for Shared Test Infrastructure — partially supersedes 0126-ci-is-the-full-suite-authority-after-the-first-push.md
- ADR-0148 An Owner Proposes an Ownership-Transfer Offer and the CASE_MANAGER Makes It — partially supersedes 0053-ownership-transfer-routed-via-caseactor.md
- ADR-0150 A Reading-Path Thread Is Staged Data on Its Start Page, Rendered at Both Ends
- ADR-0151 A Received Act Commits Its Own Entry with Its Consequences (revision 2) — partially superseded by 0154-a-received-message-is-one-staged-record-archived-only-when-applied.md; partially supersedes 0111-intake-is-the-first-received-side-stage.md
- ADR-0153 One Role Check per Message Picks the Received Path — partially supersedes 0088-consolidate-case-authority-determination.md
- ADR-0154 A Received Message Is One Staged Record, Archived Only When Applied — partially supersedes 0111-intake-is-the-first-received-side-stage.md, 0135-compose-received-trees-never-chain-them.md, 0151-a-received-act-commits-its-own-entry-with-its-consequences.md
- ADR-0155 A Participant States Its Ledger Position, and the Case Manager Answers a Lag
- ADR-0156 Every Case Activity States Its Sender's Ledger Position
- ADR-0157 A Case's Creation Is One
Create, Delivered and Ledgered
Rejected ADRs
- none
Superseded / Archived ADRs
Retired ADRs (status: deprecated or superseded) are moved to
docs/adr/archived/ so they stay out of the default docs/adr/ context sweep.
Each is listed here with a forward link to its replacement.
- ADR-0015 Create VulnerabilityCase at Report Receipt (RM.RECEIVED) — superseded by 0041-caseactor-authoritative-case-initialization.md
- ADR-0017 Domain/Wire Object Separation: Shared-Base, Two-Branch Hierarchy — superseded by 0099-one-object-model-as2-is-a-serialization.md
- ADR-0056
embargo_adherenceIs a Computed Property Derived from PEC State — superseded by 0122-per-embargo-participant-consent.md - ADR-0061 Adjudicate Received
ParticipantStatusPer Dimension, Not as a Unit — superseded by 0107-case-ledger-entry-is-a-postmark-on-the-received-envelope.md - ADR-0062 Normalise Wire → Core at Ingress, and Enforce It Again at the Persistence Boundary — superseded by 0082-wire-core-boundary-pairing-registry.md
- ADR-0070 Reuse
validate-reportfor Invited Actors; DeriveVultronOfferRecordfrom Ledger Backfill — superseded by 0121-joined-participant-judges-the-case-by-full-case-invite.md - ADR-0082 Wire/Core Boundary: One Declarative Pairing Registry, One Translator, and Reject Unknown Keys — superseded by 0099-one-object-model-as2-is-a-serialization.md; supersedes 0062-normalise-wire-to-core-at-both-ingress-and-persistence.md
- ADR-0084 Participant Status Is Self-Declaratory, With Narrow Externally-Evidenced On-Behalf Exceptions — superseded by 0121-joined-participant-judges-the-case-by-full-case-invite.md