Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -756,10 +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). 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). Implemented - see
[PLAN-0004](plans/0004-milestone-4-xunit-integration.md) for the phase-by-phase
account and its Open Items for one known compile-time gap (an interface/
abstract/delegate-typed `[Compose]`-attributed parameter reports CMP0003
unconditionally).

Owns:

Expand Down
24 changes: 20 additions & 4 deletions docs/mvp.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,15 @@ stage-2 shared-value read-gate change), [ADR-0022](adr/0022-compono-xunit-packag
(`Compono.XunitV3` package: `[Compose]`/`[Compose<TProfile>]`/`[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). 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. 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

Expand All @@ -228,8 +233,19 @@ 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

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
- Shared values flow into composed systems under test
Expand Down
53 changes: 47 additions & 6 deletions docs/plans/0004-milestone-4-xunit-integration.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1036,6 +1036,47 @@ 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.
- **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

- **`ComposeMethodDiscovery` reports CMP0003 for an interface/abstract/
Expand Down
2 changes: 1 addition & 1 deletion docs/plans/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
7 changes: 5 additions & 2 deletions docs/public-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`, not yet
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<TProfile>]` 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
Expand Down