Architecture Decision Records¶
This directory is the permanent, numbered record of every design decision made in this repo — see .agents/skills/engineering-workflow/references/design-decisions.md for the full process of when and how to write one. This file is just the mechanics: numbering, status, and the index.
Numbering and immutability¶
- Files are
NNNN-kebab-case-title.md, zero-padded to 4 digits, sequential (0001-...,0002-..., ...).0000-adr-template.mdis the template, not a real decision — the first real ADR is0001. - An ADR is immutable once its status leaves
Proposed. Don't edit anAcceptedADR's Decision/Context/Considered Options to reflect a change of mind later — write a new ADR that changesStatustoSuperseded by ADR-XXXXon the old one and references it from the new one's Context or Links section. The old ADR stays exactly as it was when accepted; that's the point of it being a record, not a living doc. - Copy
0000-adr-template.mdfor every new ADR rather than writing one from a blank file, so the section shape stays consistent across every decision in this repo.
Status lifecycle¶
Proposed → Accepted → (Deprecated | Superseded by ADR-XXXX)
- Proposed: still being discussed — the deep-dive brainstorm phase described in
design-decisions.mdproduces aProposedADR before anything gets built against it. - Accepted: the decision this repo is actually operating under. Code should match an
AcceptedADR; if it doesn't, that's drift — fix the code or supersede the ADR, the same "code and docs disagree" rule that governs the rest of this repo's documentation. - Deprecated: no longer the guidance, but nothing formally replaced it (rare — most decisions that stop applying get superseded by whatever replaced them instead).
- Superseded by ADR-XXXX: a later ADR explicitly replaced this one. Follow the chain forward to the current answer rather than trusting a superseded ADR's Decision section.
How this relates to other docs¶
docs/*.md(architecture, public-api, mvp, manifesto, design-principles) describe current or intended state — what the system does or is meant to do. When a topic doc describes a decision, it should link to the ADR that made it rather than re-deriving the rationale inline. Several of these docs predate this ADR system and still carry open questions or decisions inline (the "Open Architectural Decisions"/"Open Decisions Before Implementation" lists) — resolving one of those into an ADR should also update the doc to link back here rather than leave the answer duplicated in both places.docs/research/*.md, if this repo ever needs one for a longer external-reference write-up, should capture what was looked at and why, with a## Decisionssection pointing at the ADR(s) the research fed into — the research doc itself is never the system of record for what was decided.README.mdstays the vision/intent document; an ADR that changes product-level direction gets referenced fromREADME.md, not duplicated into it.
Index¶
| ADR | Title | Status |
|---|---|---|
| 0001 | Source Generation First | Accepted |
| 0002 | Constructor Selection Algorithm | Accepted |
| 0003 | Generator Package Distribution | Accepted |
| 0004 | Composition Plan Discovery and Dispatch | Accepted |
| 0005 | Source Generator Implementation Conventions | Accepted |
| 0006 | Required Members and Nullability Metadata | Accepted |
| 0007 | Composition Request and Provider Pipeline | Superseded by ADR-0010 |
| 0008 | Composition Scope, Shared Values, and Recursion Detection | Superseded by ADR-0011 |
| 0009 | Deterministic Seed and Forkable Random Source | Superseded by ADR-0012 |
| 0010 | Composition Request, Provider Pipeline, Failure Semantics, and Diagnostics Tracing | Accepted |
| 0011 | Composition Scope, Shared Values, and Recursion Detection | Accepted |
| 0012 | Composition Path Identity, Deterministic Random Forking, and CreateMany Seed Derivation | Accepted |
| 0013 | Collection Generation Semantics | Accepted |
| 0014 | Generator-Emitted Collection Plans Replace the Reflection-Based Dispatch Bridge | Accepted |
| 0015 | Provider Identity Deferred in ProviderAttempt | Superseded by ADR-0016 |
| 0016 | Provider Identity Restored in ProviderAttempt | Accepted |
| 0017 | Immutable Composer Configuration and Builder Model | Accepted |
| 0018 | Composition Profiles | Accepted |
| 0019 | Registrations and Service Provider Injection | Accepted |
| 0020 | Composition Configuration Rules | Accepted |
| 0021 | Row Composition Entry Point for Test-Framework Integrations | Accepted |
| 0022 | Compono.Xunit Package Design | Accepted |
| 0023 | Rename Compono.Xunit to Compono.XunitV3 | Accepted |
| 0024 | Public Provider Extensibility Model | Accepted |
| 0025 | Compono.NSubstitute Package Design | Accepted |
| 0026 | Deterministic Seed Derivation for Providers and Registration Factories | Accepted |
| 0027 | Compono.Bogus Package Design | Accepted |
| 0028 | Configurable Bogus Member-Name Conventions | Accepted |
| 0029 | Milestone 7 Dogfooding Strategy and Capability-Gap Decision Framework | Accepted |
| 0030 | Compono Documentation Architecture | Accepted |
| 0031 | Public Preview Release and Versioning Policy | Accepted |
| 0032 | API Reference Documentation Toolchain | Accepted |
| 0033 | Public Preview Samples Strategy | Accepted |
| 0034 | Benchmark Suite Strategy and Redesign | Accepted |
| 0035 | Compono Agent Skill Pack | Accepted |
| 0036 | Call-Site Values Influencing Nested Composition | Accepted |
| 0037 | netstandard2.1 Compatibility Floor | Superseded by ADR-0038 |
| 0038 | net8.0/net9.0 Explicit Multi-Target | Accepted |
| 0039 | Future Extension Package Admission Gate and Release Sequence | Accepted |
| 0040 | Compono.TUnit Package Design | Accepted |
| 0041 | AOT-Safe Row-Binding Dispatch | Accepted |
| 0042 | Compono-Owned Source-Generated Test Doubles | Accepted |
| 0043 | Compono-Generated Test Doubles: Design | Accepted |
| 0044 | Compono.TestDoubles v2: Overloaded Members, Generic Methods, Minimal Call Verification | Accepted |
| 0045 | Compono.TestDoubles: Configuration-Required Members for Non-Deterministic-Default Returns | Accepted |
| 0046 | Effective Interface Contract for Inherited Static Abstract Members | Accepted |
| 0047 | Compono.DependencyInjection: Configured-Resolution IServiceProvider Bridge | Accepted |
| 0048 | Compono.TestDoubles: Argument Matching and Argument-Aware Call Verification | Accepted |
| 0049 | Compono.TestDoubles: Per-Closed-Instantiation Configuration for Generic Methods Whose Return Type Depends on Their Own Type Parameter | Accepted |
| 0050 | Compono.TestDoubles: Multi-Entry, Argument-Distinguished Response Configuration | Accepted |
| 0051 | Compono.Http: Handler-Based HTTP Client Testing Package | Accepted |
| 0052 | Compile-Time Composition-Discovery Boundary for Registered and Nested-Resolved Types | Partially Accepted (Part B shipped; Part A Proposed) |
| 0053 | Compono.TestDoubles: Invocation-Aware Callback Responses | Accepted |
| 0054 | Compono.TestDoubles: Sequential/Call-Count-Based Responses | Accepted |
| 0055 | Compono.Logging: First-Class Microsoft.Extensions.Logging Testing Support | Accepted |
| 0056 | CompositionBuilder.Share<T>(): Graph-Wide Sharing as a Core Composition Concept | Accepted |
| 0057 | Compono.MSTest Package Design | Accepted |
| 0058 | Public Generator-Facing Runtime Infrastructure | Accepted |
| 0059 | Compono.NUnit Package Design | Accepted |
| 0060 | Compono.TestDoubles: ReceivedCalls() Retrospective Inspection and ClearCalls() | Accepted |
| 0061 | Compono.Options: First-Class .NET Configuration/Options Testing Support | Accepted |
| 0062 | Compono.Http: Body and Header Request Matching | Accepted |
| 0066 | Compono.XunitV3.Aot: A Separate Package for xUnit v3 Native AOT Support | Accepted |
| 0067 | Compono.XunitV3.Aot: Profile-Based Composition ([Compose<TProfile>]/[Compose<TProfile, TConfig>]) | Accepted |
| 0068 | Generator-Wide Per-Item Emission Failure Isolation | Accepted |