From 8169c545262d4de816b2b5fd4ade5026c274ebb2 Mon Sep 17 00:00:00 2001 From: Nick Cipollina Date: Fri, 31 Jul 2026 11:58:21 -0400 Subject: [PATCH 1/2] docs(core): milestone 4 phase 4 - close out xUnit v3 integration docs Phases 0-3 already kept docs/architecture.md and docs/public-api.md current incrementally; this closes the remaining stale status lines (mvp.md's "Phases 3-4 remain", public-api.md's "not yet implemented") now that Phase 3 shipped, marks Milestone 4's exit criteria as verified against Phase 3's real-runner evidence, and flips PLAN-0004/its Phase 4 to Done. Co-Authored-By: Claude Sonnet 5 --- docs/architecture.md | 7 ++-- docs/mvp.md | 12 ++++--- .../0004-milestone-4-xunit-integration.md | 36 +++++++++++++++---- docs/plans/README.md | 2 +- docs/public-api.md | 2 +- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index 3e74f89..e6e3d6e 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -756,10 +756,9 @@ Design: [ADR-0021](adr/0021-row-composition-entry-point-for-test-framework-integ (the `CompositionRow` entry point this package builds on, owned by core `Compono`), [ADR-0022](adr/0022-compono-xunit-package-design.md) (this package itself), [ADR-0023](adr/0023-rename-compono-xunit-to-compono-xunitv3.md) -(the `Compono.Xunit` → `Compono.XunitV3` rename). Phases 0-2 (the -`CompositionRow` entry point, the attribute skeleton, and the binding -algorithm) are implemented - see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md) -for exactly how far along it is. +(the `Compono.Xunit` → `Compono.XunitV3` rename). Fully implemented - see +[PLAN-0004](plans/0004-milestone-4-xunit-integration.md) for the phase-by-phase +account. Owns: diff --git a/docs/mvp.md b/docs/mvp.md index cef3bbb..d15ef58 100644 --- a/docs/mvp.md +++ b/docs/mvp.md @@ -199,10 +199,11 @@ stage-2 shared-value read-gate change), [ADR-0022](adr/0022-compono-xunit-packag (`Compono.XunitV3` package: `[Compose]`/`[Compose]`/`[Shared]` attributes, inline/composed binding, profile selection, seed policy, diagnostics, package dependencies), [ADR-0023](adr/0023-rename-compono-xunit-to-compono-xunitv3.md) -(the `Compono.Xunit` → `Compono.XunitV3` rename). Phases 0-2 (core entry -point, attribute skeleton, binding algorithm) are implemented; Phases 3-4 -(test suites/verification, docs/cleanup) remain — tracked by -[PLAN-0004](plans/0004-milestone-4-xunit-integration.md). +(the `Compono.Xunit` → `Compono.XunitV3` rename). Fully implemented across +Phases 0-4 (core entry point, attribute skeleton, binding algorithm, test +suites/verification, docs/cleanup) — see +[PLAN-0004](plans/0004-milestone-4-xunit-integration.md) for the phase-by-phase +account. ### Scope @@ -230,6 +231,9 @@ public void Creates_service( ### Exit Criteria +All met, verified through `test/Compono.XunitV3.Tests` and a real xUnit v3 +runner against `test/Compono.XunitV3.SampleTests` (PLAN-0004 Phase 3): + - Composed parameters work under xUnit v3 - Inline values take precedence - Shared values flow into composed systems under test diff --git a/docs/plans/0004-milestone-4-xunit-integration.md b/docs/plans/0004-milestone-4-xunit-integration.md index b6d4580..09cbdc4 100644 --- a/docs/plans/0004-milestone-4-xunit-integration.md +++ b/docs/plans/0004-milestone-4-xunit-integration.md @@ -1,6 +1,6 @@ # [PLAN-0004] Milestone 4: xUnit v3 Integration -**Status:** In Progress +**Status:** Done **Implements:** [ADR-0021](../adr/0021-row-composition-entry-point-for-test-framework-integrations.md) (core `CompositionRow`/`CompositionRequestKind.TestParameter`/stage-2 read-gate @@ -400,22 +400,22 @@ the cache built once in Phase 1; everything after is per-row): ### Phase 4: Docs and cleanup -**Status:** Not Started +**Status:** Done -- [ ] `docs/mvp.md` Milestone 4 section: link ADR-0021/ADR-0022/PLAN-0004, +- [x] `docs/mvp.md` Milestone 4 section: link ADR-0021/ADR-0022/PLAN-0004, mark exit criteria met. -- [ ] `docs/architecture.md`: correct the stage-2 pipeline table entry +- [x] `docs/architecture.md`: correct the stage-2 pipeline table entry (read gate removed, write gate unchanged) and the `CompositionScope`/Recursion Detection sections' now-outdated "only a request the caller marked IsShared reads from scope" framing; add `CompositionRow`/`TestParameter` to Composition Requests and Package Boundaries (`Compono.XunitV3`). -- [ ] `docs/public-api.md`: replace the `[InlineComposeData(...)]` sketch +- [x] `docs/public-api.md`: replace the `[InlineComposeData(...)]` sketch with the unified `[Compose(...)]` shape; resolve the "Questions still to resolve" under Shared Values per ADR-0022; fill in the xUnit v3 Experience section's settled attribute names. `[Compose(Seed = ...)]` example already matches ADR-0022; no change needed there. -- [ ] `docs/adr/README.md`/`docs/plans/README.md` index rows (already +- [x] `docs/adr/README.md`/`docs/plans/README.md` index rows (already added alongside the ADRs/this plan). ## Critical Files @@ -1036,6 +1036,30 @@ exercised indirectly through `Compono.XunitV3.Tests`. 6 passed/1 deliberately failed (a genuine composition failure) on both net10.0 and net11.0. +**Phase 4 (Done):** + +- Most of this phase's `docs/architecture.md`/`docs/public-api.md` scope + had already landed incrementally during Phases 0-3 (each phase updated + its own affected sections as it shipped, per `documentation.md`'s + same-PR rule) - the stage-2 pipeline table entry, the `CompositionScope`/ + Recursion Detection framing, `CompositionRow`/`TestParameter` in + Composition Requests and Package Boundaries, and the settled + `[Compose]`/`[Shared]` attribute shapes in `docs/public-api.md` were all + already current. What Phase 4 actually closed out was the handful of + now-stale "not yet implemented" / "Phases 0-2 implemented, Phases 3-4 + remain" status lines left over from when those sections were written + mid-milestone (`docs/mvp.md`, `docs/architecture.md`'s Package + Boundaries section, `docs/public-api.md`'s xUnit v3 Experience section) + and marked `docs/mvp.md`'s Milestone 4 exit criteria as verified, with a + pointer to the Phase 3 evidence (`Compono.XunitV3.Tests` + + `Compono.XunitV3.SampleTests`) rather than restating it. +- `docs/adr/README.md`/`docs/plans/README.md` index rows for ADR-0021/ + 0022/0023 and PLAN-0004 were already present (added alongside each ADR/ + the plan itself as they were written) - this phase only flipped + `docs/plans/README.md`'s PLAN-0004 status column from `Not Started` to + `Done` to match this plan's own header. +- No code changes in this phase - docs only, per its own scope. + ## Open Items - **`ComposeMethodDiscovery` reports CMP0003 for an interface/abstract/ diff --git a/docs/plans/README.md b/docs/plans/README.md index fa72d7d..3956177 100644 --- a/docs/plans/README.md +++ b/docs/plans/README.md @@ -46,4 +46,4 @@ one. This file is just the mechanics: numbering, status, and the index. | [0001](0001-milestone-1-source-generation-foundation.md) | Milestone 1: Source-Generation Foundation | Done | | [0002](0002-milestone-2-core-composition-engine.md) | Milestone 2: Core Composition Engine | Done | | [0003](0003-milestone-3-profiles-and-configuration.md) | Milestone 3: Profiles and Configuration | Done | -| [0004](0004-milestone-4-xunit-integration.md) | Milestone 4: xUnit v3 Integration | Not Started | +| [0004](0004-milestone-4-xunit-integration.md) | Milestone 4: xUnit v3 Integration | Done | diff --git a/docs/public-api.md b/docs/public-api.md index dad363c..57753f6 100644 --- a/docs/public-api.md +++ b/docs/public-api.md @@ -185,7 +185,7 @@ directly. ## xUnit v3 Experience Resolved by [ADR-0021](adr/0021-row-composition-entry-point-for-test-framework-integrations.md)/ -[ADR-0022](adr/0022-compono-xunit-package-design.md) (`Accepted`, not yet +[ADR-0022](adr/0022-compono-xunit-package-design.md) (`Accepted`, fully implemented — see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md)). `[Compose]`/`[Compose]` implement `Xunit.v3.DataAttribute` directly; composition happens once per theory row, at execution time (not From 63a88e6e57e3ff27e54c438c024092c49b6901d7 Mon Sep 17 00:00:00 2001 From: Nick Cipollina Date: Fri, 31 Jul 2026 12:06:33 -0400 Subject: [PATCH 2/2] docs(core): qualify milestone 4 completion claim (PR #27 review) "Fully implemented" overstated scope: an interface/abstract/delegate- typed [Compose]-attributed parameter still reports CMP0003 and fails to compile (tracked Open Item), which affects the exact [Shared] IRepository shape shown in this milestone's own Goal/Example. Soften the wording and point at the Open Item everywhere the claim was made. Co-Authored-By: Claude Sonnet 5 --- docs/architecture.md | 6 ++++-- docs/mvp.md | 20 +++++++++++++++---- .../0004-milestone-4-xunit-integration.md | 17 ++++++++++++++++ docs/public-api.md | 7 +++++-- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index e6e3d6e..ff54e9d 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -756,9 +756,11 @@ Design: [ADR-0021](adr/0021-row-composition-entry-point-for-test-framework-integ (the `CompositionRow` entry point this package builds on, owned by core `Compono`), [ADR-0022](adr/0022-compono-xunit-package-design.md) (this package itself), [ADR-0023](adr/0023-rename-compono-xunit-to-compono-xunitv3.md) -(the `Compono.Xunit` → `Compono.XunitV3` rename). Fully implemented - see +(the `Compono.Xunit` → `Compono.XunitV3` rename). Implemented - see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md) for the phase-by-phase -account. +account and its Open Items for one known compile-time gap (an interface/ +abstract/delegate-typed `[Compose]`-attributed parameter reports CMP0003 +unconditionally). Owns: diff --git a/docs/mvp.md b/docs/mvp.md index d15ef58..8e7d059 100644 --- a/docs/mvp.md +++ b/docs/mvp.md @@ -199,11 +199,15 @@ stage-2 shared-value read-gate change), [ADR-0022](adr/0022-compono-xunit-packag (`Compono.XunitV3` package: `[Compose]`/`[Compose]`/`[Shared]` attributes, inline/composed binding, profile selection, seed policy, diagnostics, package dependencies), [ADR-0023](adr/0023-rename-compono-xunit-to-compono-xunitv3.md) -(the `Compono.Xunit` → `Compono.XunitV3` rename). Fully implemented across +(the `Compono.Xunit` → `Compono.XunitV3` rename). Implemented across Phases 0-4 (core entry point, attribute skeleton, binding algorithm, test suites/verification, docs/cleanup) — see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md) for the phase-by-phase -account. +account. One known gap remains open past Phase 4: an interface/abstract/ +delegate-typed `[Compose]`-attributed parameter (including the `IRepository` +shape in the Example below) reports CMP0003 and fails to compile even when a +profile registration or an inline value would satisfy it at runtime — see +PLAN-0004's Open Items. ### Scope @@ -229,10 +233,18 @@ public void Creates_service( } ``` +This is the target shape; `IRepository` being interface-typed currently hits +the CMP0003 gap noted above — `test/Compono.XunitV3.SampleTests` uses a +concrete `Repository` type for its own `[Shared]` theory to route around it +until that gap is resolved. + ### Exit Criteria -All met, verified through `test/Compono.XunitV3.Tests` and a real xUnit v3 -runner against `test/Compono.XunitV3.SampleTests` (PLAN-0004 Phase 3): +Met for the parameter shapes `Compono.XunitV3` currently supports, verified +through `test/Compono.XunitV3.Tests` and a real xUnit v3 runner against +`test/Compono.XunitV3.SampleTests` (PLAN-0004 Phase 3); the CMP0003 gap above +means "composed parameters work under xUnit v3" doesn't yet extend to a bare +interface/abstract/delegate-typed `[Compose]` parameter: - Composed parameters work under xUnit v3 - Inline values take precedence diff --git a/docs/plans/0004-milestone-4-xunit-integration.md b/docs/plans/0004-milestone-4-xunit-integration.md index 09cbdc4..e87aae1 100644 --- a/docs/plans/0004-milestone-4-xunit-integration.md +++ b/docs/plans/0004-milestone-4-xunit-integration.md @@ -1059,6 +1059,23 @@ exercised indirectly through `Compono.XunitV3.Tests`. `docs/plans/README.md`'s PLAN-0004 status column from `Not Started` to `Done` to match this plan's own header. - No code changes in this phase - docs only, per its own scope. +- **PR #27 review (Codex, P2) caught an overstated completion claim** - + the first draft of this phase's `docs/mvp.md`/`docs/architecture.md`/ + `docs/public-api.md` edits said Milestone 4 was "fully implemented," + which reads as unqualified even though the Open Items entry below (an + interface/abstract/delegate-typed `[Compose]`-attributed parameter + reports CMP0003 unconditionally) was already tracked and still open - + and directly affects the `[Shared] IRepository repository` shape shown + in this plan's own Goal and in `docs/mvp.md`'s Milestone 4 Example, + which doesn't actually compile as written today (confirmed against + `test/Compono.XunitV3.SampleTests`, whose own `[Shared]` theory uses a + concrete `Repository` type specifically to route around this gap). + Fixed by softening "fully implemented" to "implemented" plus an + explicit pointer to this Open Item in all three docs, and adding a note + under `docs/mvp.md`'s Example/Exit Criteria clarifying the gap - no + code change, since the underlying CMP0003 behavior is unchanged and + still correctly scoped as a follow-up design dive per the Open Item's + own reasoning, not a Phase 4 fix. ## Open Items diff --git a/docs/public-api.md b/docs/public-api.md index 57753f6..26d4e5a 100644 --- a/docs/public-api.md +++ b/docs/public-api.md @@ -185,8 +185,11 @@ directly. ## xUnit v3 Experience Resolved by [ADR-0021](adr/0021-row-composition-entry-point-for-test-framework-integrations.md)/ -[ADR-0022](adr/0022-compono-xunit-package-design.md) (`Accepted`, fully -implemented — see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md)). +[ADR-0022](adr/0022-compono-xunit-package-design.md) (`Accepted`, implemented — +see [PLAN-0004](plans/0004-milestone-4-xunit-integration.md); one gap remains +open past Phase 4, see that plan's Open Items — an interface/abstract/ +delegate-typed `[Compose]`-attributed parameter reports CMP0003 unconditionally, +even when a profile registration or inline value would satisfy it). `[Compose]`/`[Compose]` implement `Xunit.v3.DataAttribute` directly; composition happens once per theory row, at execution time (not discovery time — composed values, especially a future substitute or any