fix(ci-build-infra): document NuGet cache fallback safety and suppress System.Reactive packages.config warning (#730) - #747
Merged
Conversation
…ic plan Preparation-mode run for parallel_slug bugs-2026-09-02: promotes issue #730 (NuGet cache restore-keys documentation and RxUseUnsupportedPackagesConfig suppression via a single repository-root Directory.Build.props), completes research and spec.md, and lands an atomic plan cleared through three preflight rounds (PREFLIGHT: ALL CLEAR). Atomic execution is deferred to parallel-orchestrator per the preparation-mode contract. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
…n spec/plan The parallel-scheduling harvester reads every backtick-delimited, whitespace-free, repository-relative-looking path token in spec.md and the plan as a path this item WRITES, with no notion of exclusion vs. write polarity. spec.md and the plan quoted scope-exclusion paths, must-not-touch files, model/context references, and project names inside backticks, falsely making this item appear to write the .claude, .codex, and .agents trees plus the two published config/*.json files, two of which are shared surfaces that would collapse the 13-item bugs-2026-09-02 run into fully sequential cohorts. Adds an explicit "## Write Set" section to spec.md naming exactly the four files this plan's diff creates or modifies (the three workflow comment insertions plus the new root Directory.Build.props), and removes backticks from every scope-exclusion/must-not-touch/model-reference/project-name mention elsewhere in spec.md and the plan, converting each to plain prose while preserving sentence meaning. No task, acceptance-criterion substance, command, or evidence path changed. Cleared atomic-executor preflight (round 3, PREFLIGHT: ALL CLEAR) after two prior rounds: round 1 found inconsistent .csproj backtick treatment in spec.md (fixed), and round 2 found that the new Write Set section shifted spec.md's Acceptance Criteria section down by 7 lines, staling 9 line-number citations in the plan's Framing note and Phase 3 AC-traceability tasks (fixed and re-verified against current tree state). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTjXvNFHVh7Fo7kYGgWsx2
Reconcile before atomic execution; no conflicting files (verified via diff --name-only against no changes to .github/workflows/ or Directory.Build.props). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0195CL93aqgKF19nj9h6trbt
…em.Reactive packages.config warning (#730) Addresses the two findings in issue #730, both static build-infrastructure configuration defects with no application source change. Finding 1 — undocumented NuGet cache bare-prefix fallback. Adds an identical 16-line explanatory comment block immediately above `restore-keys:` in `.github/workflows/_build-analyzers.yml`, `_build-nullable.yml`, and `_mstest-coverage.yml`. The comment records why the bare-prefix fallback is safe against stale package versions: `nuget restore` runs unconditionally afterwards and is idempotent per package for packages.config-style restores, which materialize each package under a version-qualified directory matching every HintPath in this repository. Comment-only; the `key:`, `path:`, `uses:`, `restore-keys:` value, and the subsequent restore step are byte-identical. Finding 2 — missing System.Reactive suppression property. Adds a new root-level `Directory.Build.props` setting `RxUseUnsupportedPackagesConfig` to `true`, the package vendor's own documented switch for the packages.config scenario this repository deliberately retains for its legacy non-SDK VSTO / .NET Framework 4.8.1 projects. An inline XML comment records the accepted-trade-off rationale. Verification (evidence under docs/features/active/2026-09-02-ci-build-infra-debt-730/evidence/): - Baseline vs post-change `msbuild /t:Rebuild` for both the analyzer pass and the TreatWarningsAsErrors pass: System.Reactive.PackagesConfigCheck warnings 5 -> 0, total warnings 5 -> 0, errors 0 -> 0 on both. - `dotnet tool run csharpier check .`: exit 0. - `vstest.console.exe` regression re-run of UtilitiesCS.Test and QuickFiler.Test: 6095/6095 passed, 0 failed, exit 0. - Scope confirmed to exactly four changed files; no .csproj, packages.config, Directory.Build.targets, application source, coverage threshold, Pester job, or coverage gate is touched. - The four raw MSBuild logs were sanitized of both absolute host-path prefixes (worktree root and main-checkout root) before commit; residual host-path match count is 0 and all four line counts are unchanged. All eight acceptance criteria in spec.md are checked off. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0195CL93aqgKF19nj9h6trbt
…on record (remediation cycle 1, round 2) Remove operator account name and absolute host path from research.2026-09-02T09-15.md line 8 and from remediation-plan.2026-09-02T23-56.md, replacing each occurrence with the <repo-root> placeholder / a non-identifying description per repository rule (no committed artifact may embed absolute host paths or the operator account name). Also commit the full feature-review-and-remediation record: plan.2026-09-02T08-57.md checkbox residue, the four feature-review artifacts (code-review, feature-audit, policy-audit, remediation-inputs, all dated 2026-09-02T23-47), this remediation plan, and its sanitization-verification evidence. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0195CL93aqgKF19nj9h6trbt
Residual checklist-metadata edit from the executor marking P0-T4 complete after its own clean-tree verification passed; same pattern already documented for plan.2026-09-02T08-57.md P3-T9. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0195CL93aqgKF19nj9h6trbt
Adds policy-audit, code-review, and feature-audit (2026-09-03T00-33) confirming the remediation commit closed PA-1/CR-1 with zero blocking findings remaining, and refreshes the tracked PR context cache for #730. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0195CL93aqgKF19nj9h6trbt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Suggested title
fix(ci-build-infra): document NuGet cache fallback safety and suppress System.Reactive packages.config warning (#730)
Summary
restore-keysbare-prefix fallback in three CI workflows is already safe, and (2) a new repository-rootDirectory.Build.propsthat suppresses theSystem.Reactivepackages.config "unsupported scenario" warning..cs),.csproj,packages.config, orDirectory.Build.targetsfile is touched by either fix.<repo-root>placeholder.Why
.github/workflows/_build-analyzers.yml,_build-nullable.yml, and_mstest-coverage.ymleach use a bare-prefixrestore-keysfallback (nuget-${{ runner.os }}-) with no lock-file hash and no restore-verification step. Research confirmed this is already safe for this repository'spackages.config+ classicnuget.exe restoremodel: every package is restored into a version-qualified directory (packages/{id}.{version}/) that exactly matches everyHintPath, andnuget restoreruns unconditionally after the cache step in all three workflows. The change documents this invariant rather than fixing a defect, since none exists.packages.configpinsSystem.Reactive 7.0.0, which is unsupported for packages.config-style references and emits an "unsupported scenario" warning (System.Reactive.PackagesConfigCheck.targets) on every build of the five consuming projects. No suppression existed.RxUseUnsupportedPackagesConfig=trueis the package's own documented escape hatch for this exact, intentionally-accepted trade-off (this repository keeps its legacy VSTO / .NET Framework 4.8.1 projects onpackages.configrather than migrating toPackageReference).What Changed
Tooling / CI
.github/workflows/_build-analyzers.yml,_build-nullable.yml,_mstest-coverage.yml: identical 16-line explanatory comment block inserted immediately aboverestore-keys:in each file. Comment-only;key:,path:,uses:(actions/cache@v4),restore-keys:and its value, and the subsequentRestore solutionstep are byte-identical to before.Build configuration
Directory.Build.props(new, repository root): setsRxUseUnsupportedPackagesConfigtotrueinside a<PropertyGroup>, with an inline XML comment documenting the accepted trade-off. Picked up automatically by all fiveSystem.Reactive-consuming projects via MSBuild's standardDirectory.Build.propsauto-import; inert for the other thirteen projects in the solution.Docs / evidence
docs/features/active/2026-09-02-ci-build-infra-debt-730/): issue, spec, research, atomic plan (9 preflight/revision rounds, documented in the plan's own Framing section), and full baseline/post-change evidence (msbuild rebuild logs, csharpier check, vstest regression run, git-scope-boundary diffs).research/research.2026-09-02T09-15.mdline 8, replaced with the<repo-root>placeholder already used elsewhere in this feature's evidence.Architecture / How It Fits Together
Both fixes are additive, independent, and configuration-only:
restore-keys:key; it has zero effect on YAML evaluation, cache key computation, or the cache/restore step's control flow.Directory.Build.propsis picked up by MSBuild'sMicrosoft.Common.propsauto-import chain, the same mechanism already proven live in this repository through the existingDirectory.Build.targetsfile. It supplies exactly one new property that no.csprojcurrently sets, so there is no override or collision risk with any of the eighteen projects in the solution.Verification
Completed (evidence under
docs/features/active/2026-09-02-ci-build-infra-debt-730/evidence/):dotnet tool run csharpier check .— exit 0, no formatting drift.msbuild TaskMaster.sln /t:Rebuild ... /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true— baseline: 5System.Reactive.PackagesConfigCheckwarnings (one per affected project: QuickFiler, TaskMaster, ToDoModel, UtilitiesCS, UtilitiesCS.Test), 0 errors. Post-change: 0 such warnings, 0 errors — genuine recompiles confirmed viacsc.exe/CoreCompileinvocation counts in both logs.msbuild TaskMaster.sln /t:Rebuild ... /p:TreatWarningsAsErrors=true— same baseline-to-zero warning delta, 0 errors in both passes.vstest.console.exeregression run (UtilitiesCS.Test + QuickFiler.Test,/EnableCodeCoverage /InIsolation) — 6095/6095 passed, 0 failed.origin/mainduring feature review).Recommended (not run by this branch, informational only):
System.Reactive.PackagesConfigCheckwarnings no longer appear.Backward Compatibility / Migration Notes
None. Both fixes are fully backward compatible:
Directory.Build.propsintroduces a new, additive property recognized only bySystem.Reactive.PackagesConfigCheck.targets; it is silently ignored by every other project in the solution.Risks and Mitigations
Directory.Build.props. A root-levelDirectory.Build.propsis auto-imported by all eighteen.csprojfiles in the solution, not just the fiveSystem.Reactive-consuming ones. Mitigation: this change adds exactly one property, confirmed inert for the thirteen non-System.Reactiveprojects; any future addition to this file should be re-evaluated for solution-wide impact before merging.System.Reactive.PackagesConfigCheck.targetsXML was not read directly during research (packages were not yet restored in that session), so the property name/effect rests on corroborating evidence rather than a live read of the vendor file. Mitigation: the pre/post rebuild-transcript verification in this PR directly observes the real vendor guard target's behavior at build time (5 warnings → 0), closing this gap empirically.main's history.Review Guide
Suggested order:
Directory.Build.props(new file, 19 lines) — the substantive change.docs/features/active/2026-09-02-ci-build-infra-debt-730/spec.md— acceptance criteria and scope boundaries.evidence/baseline/andevidence/qa-gates/— supporting proof, not required reading for a correctness review of the two fixes themselves.Noisy/mechanical: four raw MSBuild rebuild logs (
evidence/*.log, ~11.7–12k lines each) are committed as evidence; they are sanitized of host-identifying paths and do not need line-by-line review.Follow-ups
docs/features/active/2026-09-02-ci-build-infra-debt-730/...(three workflow comments, oneDirectory.Build.propscomment) will go stale once this feature folder is archived. Not addressed in this PR to keep the change strictly scoped; a follow-up cleanup can drop the path prefix and rely on theissue #730reference already present in each comment.restore-keys:block-scalar value), one level deeper than the siblingkey:/restore-keys:lines at 10 spaces. Confirmed functionally inert (dual-parser verification), but could be dedented for visual consistency in a future pass.GitHub Auto-close