Skip to content

ci(nullable-gate): use /t:Rebuild so the nullable gate is actually enforced#361

Open
drmoisan wants to merge 1 commit into
mainfrom
fix/ci-nullable-gate-masking
Open

ci(nullable-gate): use /t:Rebuild so the nullable gate is actually enforced#361
drmoisan wants to merge 1 commit into
mainfrom
fix/ci-nullable-gate-masking

Conversation

@drmoisan

Copy link
Copy Markdown
Owner

Summary

Fixes a masking bug in the CI "Build with nullable warnings treated as errors" step: it ran /t:Build right after the preceding "Build with analyzers" step had already compiled everything, so MSBuild's incremental up-to-date check silently skipped recompilation and the nullable gate never actually ran a real check. Switches that step to /t:Rebuild so it performs a genuine full recompile under /p:Nullable=enable every run.

Why

Discovered while rebuilding PR #347 (log4net 3.3.1->3.3.2): that bump changes a referenced assembly path for every first-party project, which forced a genuine recompile and exposed ~2131 pre-existing nullable errors in UtilitiesCS that this gate should have been catching all along but wasn't. Confirmed via a local /t:Rebuild on main itself (pre-log4net-bump) that the same ~2131 errors already exist there, unrelated to any pending PR change.

Consequence (important)

Once merged, this makes the nullable-build CI step genuinely enforce for the first time. Every current/future PR based on main will fail this check until the exposed pre-existing debt is remediated separately. This PR does not attempt that remediation -- it only makes the gate report the true state instead of silently passing.

Verification

  • Locally confirmed: /t:Rebuild with /p:Nullable=enable /p:TreatWarningsAsErrors=true on main produces the same 2131 errors as on the log4net branch, all in UtilitiesCS (and SVGControl, depending on the exact rebuild path), none introduced by this change.
  • CI run on this PR itself will demonstrate the fix (expected: nullable step now fails, since main's existing debt is unaddressed -- this is intentional and expected until the debt is separately remediated).

…ntly no-op'ing

The "Build with nullable warnings treated as errors" step ran /t:Build
immediately after "Build with analyzers" had already compiled everything
under the projects' own Nullable settings. MSBuild's incremental
up-to-date check does not invalidate on a changed -p:Nullable command-line
property alone, so this step was silently skipping recompilation and
never actually enforcing the gate -- it reliably passed in a few seconds
regardless of the code's real nullable-safety state.

Switching to /t:Rebuild forces a genuine full recompile under
/p:Nullable=enable every run. This is expected to surface a large body of
pre-existing nullable debt across UtilitiesCS (confirmed locally: ~2131
errors on main itself, unrelated to any pending PR's changes) that this
gate was never actually catching. Remediating that debt is tracked
separately; this change only makes the gate report the true state.
drmoisan added a commit that referenced this pull request Jul 19, 2026
…route

Scaffold the utilitiescs-nullable-remediation epic on the integration branch:
- docs/features/epics/utilitiescs-nullable-remediation/epic.md: 12-feature manifest
  (6 wave-0, 5 wave-1, 1 wave-2 capstone), per-file #nullable opt-in architecture,
  SVGControl included, cycle-free DAG. Based on PR #361 head (20d163a), not origin/main,
  so children validate against the repaired /t:Rebuild nullable gate.
- config/orchestration-routing.json: add the "preparation" route (task-researcher,
  prd-feature, atomic-planner, atomic-executor; requires_pr_gate/requires_ci_gate false)
  so preparation-mode child orchestrator runs satisfy their completion gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
drmoisan added a commit that referenced this pull request Jul 19, 2026
Records the /epic-run invocation prompt, the 13-child feature summary (waves
0/1/2 with plan-paths and complexity bands), the integration base-branch note
(based on PR #361 head, not plain main), and the accumulated execution-time
gates and flags epic-orchestrator must carry into atomic execution:
reusabletypes #366 P6-T2 maintainer STOP, dialogs-misc #374 Phase-0 gate on
extensions Batch D, folder-store #365 checkpoint-enum deviation, residuals #375
37-file effective set + maintainer decisions, capstone #376 optional-<Nullable>
and csharp.md-conflict maintainer items, and the epic-wide exclusions.

All 13 children are prepared and fanned in. Planning is complete; execution has
not started.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UXCu1xPtNbJs2HwKxgS9Bv
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant