Skip to content

feat(cleanup): plan-0061 phase 1 - pre-1.0 correctness and quality gate - #128

Merged
ncipollina merged 6 commits into
mainfrom
plan-0061-phase-1-cleanup-gate
Sep 3, 2026
Merged

feat(cleanup): plan-0061 phase 1 - pre-1.0 correctness and quality gate#128
ncipollina merged 6 commits into
mainfrom
plan-0061-phase-1-cleanup-gate

Conversation

@ncipollina

@ncipollina ncipollina commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Summary

PLAN-0061 Phase 1 (pre-1.0 cleanup gate) - product correctness and repository quality gate. See docs/plans/0061-pre-1-0-cleanup-and-consolidation.md for the full plan and docs/adr/0041-aot-safe-row-binding-dispatch.md's Amendment 7 / docs/adr/0033-... Amendment 2 for the governing decisions.

  • Fixes negative-seed guard gap in Compono.XunitV3/Compono.MSTest/Compono.NUnit's ComposeAttribute<TProfile> (copy-paste gap predating PR feat(xunitv3): add ComposeAttribute<TProfile, TConfig> for call-site profile configuration #65's fix) + regression tests, using Compono.TUnit's already-correct behavior as the contract.
  • New permanent, CI-blocking Native AOT smoke gate (.github/workflows/aot-validation.yaml) per ADR-0041 Amendment 7 - no trigger-level paths: filter (avoids leaving the required check Pending), selectivity via an internal changed-files job, aot-gate as the always-resolving required check that also fails closed if applicability computation itself fails (Codex review finding, fixed).
  • Consolidates StableHash (3 copies), GeneratorVersion (5 copies), and the Compono.ComposableAttribute metadata-name literal in Compono.Generators.
  • Adds the incremental-caching regression test ADR-0005 required but never had.
  • mkdocs.yml nav fix (MSTest/NUnit reachable), docs.yml stale-count fix, Compono.NSubstitute AOT-limitation doc, Compono.XunitV3.SampleTests CI-filter documentation + stale-comment cleanup.
  • package-validation.yaml's publishable-package list consolidated to one job-level env: (survives across its separate run: steps, unlike a Bash array).
  • release-drafter.yml: reverts ADR-0031's 0.x-preview breaking-change→minor override now that Compono is ready to leave 0.x (ADR-0031 Amendment 5) - breaking-change maps to major again. (Not yet shipped as 1.0 - this only changes what the next breaking-change-labeled merge resolves to.)

Test plan

  • dotnet build Compono.slnx -c Release - 0 errors
  • dotnet test Compono.slnx -c Release - 3478/3478 passed
  • Compono.Generators.Tests - 313/313 passed after StableHash/GeneratorVersion/ComposableAttribute consolidation (generated output unchanged)
  • New negative-seed regression tests (XunitV3/MSTest/NUnit) pass
  • New IncrementalCachingTests empirically observes real IncrementalStepRunReason values (verified it fails for the right reason before correcting the expected reason)
  • Compono.XunitV3.SampleTests filtered invocation from its new README verified locally: 40/40 pass
  • Local dry-run of one AOT smoke leg (Compono.MSTest.AotSmokeTest): real dotnet publish -p:PublishAot=true + run, both rows PASS
  • Real CI run of aot-validation.yaml - all 8 legs + aot-gate pass; deliberate one-leg failure proved the gate fails (aot-gate -> fail, other 7 legs unaffected), reverted before finalizing
  • aot-gate's fail-closed logic (Codex P1 review finding) validated against all 6 required states locally before pushing, then confirmed green on real CI
  • package-validation.yaml green on CI
  • docs.yml green on CI

Review

Both Codex findings addressed:

  • P1 (aot-validation.yaml): aot-gate now checks needs.changes.result before anything else, so a failed/cancelled applicability computation can never be mistaken for a legitimate "zero applicable legs" skip.
  • P2 (docs/plans/README.md): PLAN-0061 index row synced to the plan's current status (In Progress - Phase 1 Done, Phase 2 Not Started).

🤖 Generated with Claude Code

https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA

Fixes the negative-seed guard gap in Compono.XunitV3/MSTest/NUnit's
ComposeAttribute<TProfile> (a copy-paste gap predating PR #65's fix, using
Compono.TUnit's already-correct behavior as the contract), lands a
permanent CI-blocking Native AOT smoke gate for the existing eight
AotSmokeTest projects (ADR-0041 Amendment 7), consolidates StableHash (3
copies)/GeneratorVersion (5 copies)/the ComposableAttribute metadata-name
literal in the generator, adds the incremental-caching regression test
ADR-0005 required, fixes mkdocs navigation and stale docs text, documents
Compono.NSubstitute's AOT limitation and Compono.XunitV3.SampleTests' CI
filter requirement, consolidates package-validation.yaml's publishable-
package list to one job-level declaration, and reverts release-drafter's
0.x-preview breaking-change-to-minor override now that Compono is ready to
leave 0.x (ADR-0031 Amendment 5).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA
@github-actions github-actions Bot added the type: feat New feature label Sep 3, 2026
@ncipollina ncipollina changed the title feat(cleanup): PLAN-0061 Phase 1 - pre-1.0 correctness and quality gate feat(cleanup): plan-0061 phase 1 - pre-1.0 correctness and quality gate Sep 3, 2026
global.json pins a preview 11.0.x SDK for the whole repo checkout - dotnet
CLI resolution fails entirely (not just for net11.0-specific work) if that
SDK isn't installed, exactly as pr-build.yaml/package-validation.yaml
already install all four majors for the same reason.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f12371f5e3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/aot-validation.yaml Outdated
Comment thread docs/plans/README.md Outdated
ncipollina and others added 4 commits September 3, 2026 13:05
… fails

Temporary - PLAN-0061 Phase 1 requires proving the required aot-gate check
actually fails an applicable leg's failure before merging it as a real
gate. Reverted in the next commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA
…ails

Addresses Codex P1 finding on PR #128: aot-gate only inspected
needs.aot-smoke.result, so a failed/cancelled `changes` job (checkout,
git diff, or the applicability script erroring) produced the same
`aot-smoke == skipped` conclusion as a legitimate zero-applicable-legs
run, letting the required check report green without applicability ever
being computed. aot-gate now checks needs.changes.result first, before
anything else, and additionally rejects a skip whose legs output isn't
literally "[]" - closing the gap without adding a job or changing the
valid success/no-op paths. Validated all 6 required states locally.

Also addresses Codex P2 finding: docs/plans/README.md's PLAN-0061 index
row synced to the plan's current status (In Progress, not Codex's
originally-correct-at-the-time Not Started suggestion, since Phase 1
completed since that review).

Housekeeping: release-drafter.yml's comment corrected to not claim
Compono has already left 0.x (it hasn't shipped 1.0 yet - the policy
change only takes effect on the next breaking-change-labeled merge);
resolver behavior itself unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA
@ncipollina
ncipollina merged commit 237061f into main Sep 3, 2026
21 checks passed
@ncipollina
ncipollina deleted the plan-0061-phase-1-cleanup-gate branch September 3, 2026 17:37
ncipollina added a commit that referenced this pull request Sep 3, 2026
package-validation.yaml: 2m58s post-fix vs 3m0s baseline (PR #128's last
run) - the redundant CS1591 rebuild's removal and Compono.Logging's added
pack+inspect roughly offset; no meaningful net change, no regression.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA
ncipollina added a commit that referenced this pull request Sep 3, 2026
* fix(ci): PLAN-0062 - package-validation gap fixes

Closes two real gaps RESEARCH-0021 found in package-validation.yaml and
its scripts:

- inspect-packed-nupkgs.sh's package loop was missing Compono.Logging
  entirely (10 of 11 packages checked) - added, with its actual
  package-specific invariants: build/+buildTransitive/ Compono.Logging.props
  in the file listing (no analyzer, unlike core Compono - generation lives
  in the shared Compono.Generators), and a new
  assert_dependency_range_per_tfm function for
  Microsoft.Extensions.Logging.Abstractions, the only third-party
  dependency in the package set whose Directory.Packages.props range is
  conditioned per TargetFramework (and is absent entirely for net11.0,
  satisfied by that TFM's own shared framework) - the existing
  assert_dependency_range's single-value lookup can't see this shape.
  New regression coverage added for the new function (pass, per-TFM
  mismatch, unexpected-net11.0-presence).

- CS1591 was enforced via a redundant second full rebuild of all 11
  packages in package-validation.yaml, even though
  Directory.Build.props already makes it an ordinary build warning for
  every project (GenerateDocumentationFile=true unconditionally).
  Directory.Build.targets now promotes it to an error scoped to
  $(IsPackable) != 'false' - the same 11 packages, verified against
  every non-packable project in the repo (all set IsPackable=false
  directly). The redundant workflow step is removed; dotnet pack itself
  now also fails on a missing doc comment, so no coverage is lost.

Both changes independently validated: a full local pack+inspect of all
11 packages, a full solution build/test (3478/3478, 0 regressions), a
positive CS1591 enforcement proof (temporarily undocumented member in
Compono.Http failed an ordinary build/pack, reverted), and a
non-packable-boundary proof (same in Compono.Samples.AspNetApi built
clean with CS1591 remaining a warning, reverted).

The NUnit compatibility-matrix applicability scoping RESEARCH-0021 also
flagged is explicitly deferred, not included here - no demonstrated
CI-duration problem justifies adding new change-detection machinery
(package-validation.yaml's job is already ~3 minutes total, and removing
the redundant CS1591 rebuild may shrink that further).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA

* docs(plan): mark PLAN-0062 Done - confirmed green on real CI

package-validation.yaml: 2m58s post-fix vs 3m0s baseline (PR #128's last
run) - the redundant CS1591 rebuild's removal and Compono.Logging's added
pack+inspect roughly offset; no meaningful net change, no regression.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA

* docs(contributing): correct CS1591 enforcement guidance for PLAN-0062

Addresses Codex P1 finding on PR #129: docs/contributing.md still told
contributors to run `dotnet build -p:WarningsAsErrors=CS1591` separately
and described it as "the same gate that runs in CI" - stale since
PLAN-0062 moved enforcement into Directory.Build.targets. An ordinary
`dotnet build Compono.slnx` now enforces it directly for publishable
packages; no extra flag needed, and the dedicated package-validation
rebuild step no longer exists. Verified no other current-facing doc,
skill, or contributor instruction (root CONTRIBUTING.md, the
engineering-workflow skill's own contributing.md reference) still
describes the old invocation - only historical, already-Done plan
records and the RESEARCH-0021 record itself mention it, correctly, as
past-tense history.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GMQEjFrUVGYkctE3ECfRuA

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: feat New feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant