Skip to content

fix(epic): clear the eight review residuals left by the bugs-2026-09-06 run - #836

Merged
drmoisan merged 103 commits into
mainfrom
epic/review-residuals-2026-09-08-integration
Sep 10, 2026
Merged

drmoisan merged 103 commits into
mainfrom
epic/review-residuals-2026-09-08-integration

Conversation

@drmoisan

Copy link
Copy Markdown
Owner

Suggested title

fix(epic): clear the eight review residuals left by the bugs-2026-09-06 run

Summary

  • Closes out eight known, located, and previously unowned defects that the reviews of the
    bugs-2026-09-06 parallel run filed on 2026-09-08: issues 813, 815, 817, 821, 823, 824, 825
    and 826. Each was deliberately excluded from the item that surfaced it to hold that item's blast
    radius to a bugfix.
  • Fixes two QuickFiler teardown defects: a second Cleanup on QfcHomeController invoked the
    ribbon-release callback again, and ProgressViewer cancellation threw when the shared token
    source was null or already disposed.
  • Fixes an unsynchronised static-initialisation race in ILGlobals.LoadOpcodes.
  • Corrects the first-party coverage aggregation, which double-counted method rows, so the reported
    figure again equals an independent de-duplicated recomputation from the same Cobertura report.
  • Guards an unguarded archive-root read in QfcItemController.FolderHandling, which threw on the
    UI dispatcher when the archive root was unset; it now degrades to no preselection.
  • Tightens ETL deadline mechanics in OlTableExtensions and TimeOutTask, and restores
    Console.Out hygiene across test classes that installed a writer and never restored it.
  • Extends BannedSymbols.txt from seven entries to fifteen. RS0030 deliberately stays at
    suggestion — see Backward Compatibility.

17 production C# files change. The remainder of the diff is tests, evidence, and feature
documentation.

Why

These eight issues were promoted from potential records captured on 2026-09-08 during the reviews
and executions of items 809, 810, 811 and 812. Every one of them was already known and already
located; none had an owner. Left alone they would be rediscovered by every future review of the
QuickFiler teardown, UtilitiesCS concurrency, and coverage-tooling subsystems.

The coverage item is the one with leverage beyond its own defect: while first-party aggregation
double-counted method rows, every quality gate downstream of it was measuring something other than
the quantity it claimed to measure.

All nine promoted records existed only on an unpushed local session branch and were absent from
origin/main; they were restored onto the integration branch so each child could resolve a
promotion source.

What Changed

QuickFiler teardown and UI robustness

  • QuickFiler/Controllers/QfcHomeController.cs, EfcHomeController.cs — parent cleanup no longer
    releases the ribbon twice.
  • UtilitiesCS/Threading/ProgressViewer.cs, ProgressPane.cs — cancellation is safe when the
    shared token source is null or disposed.
  • QuickFiler/Controllers/QfcItemController.FolderHandling.cs — guarded archive-root read.
  • QuickFiler/Viewers/BreadcrumbDropDownHost.Open.cs, BreadcrumbPopupOwnerRegistry.cs,
    QfcFormViewer.cs, and UtilitiesCS/OutlookObjects/Store/StoreWrapper*.cs — teardown residuals.

UtilitiesCS concurrency and ETL

  • UtilitiesCS/NewtonsoftHelpers/SDIL Reader/ILGlobals.cs — synchronised opcode initialisation.
  • UtilitiesCS/OutlookObjects/Table/OlTableExtensions.Etl.cs, .TableAccess.cs,
    UtilitiesCS/Threading/TimeOutTask.cs — deadline and retry mechanics.
  • UtilitiesCS/Extensions/DfDeedle*.cs.

Tooling

  • scripts/vscode/Invoke-MSTestWithCoverage*.ps1 — first-party coverage aggregation no longer
    double-counts method rows, with a new 271-line Pester suite covering the corrected arithmetic.

Policy configuration

  • BannedSymbols.txt — adds CancelAfter (both overloads), both deadline
    CancellationTokenSource constructors, and all four timed WaitOne overloads.
  • .editorconfig — RS0030 documented and held at suggestion.

Tests and documentation

  • 70 .cs files total, including Console.Out restoration across test classes in six test
    projects; 434 Markdown files of specs, plans, audits and gate evidence.

Architecture / How It Fits Together

Delivered as an epic across two waves on a shared integration branch, one independently mergeable
child feature per issue. Wave 0 carried seven features with no dependency edges. Wave 1 carried
issue 826 alone, which depends on 825 because both edit GetTableInViewAsync in
OlTableExtensions.TableAccess.cs.

That single edge is load-bearing at execution time rather than merely declarative: 826's [P1-T1]
re-measures Console.WriteLine reachability against the post-825 tree and records a branch
selection from that measurement, so 826 could not correctly start before 825 had merged.

Verification

Completed

  • Every child ran the full four-step C# toolchain in its own worktree in the mandated order —
    CSharpier, MSBuild analyzers, MSBuild nullable, then vstest — using /t:Rebuild throughout,
    because a warm /t:Build returns exit 0 having skipped every compile.
  • The integrated tree was gated by dispatched CI runs after each fan-in, not only per child. Seven
    runs concluded, all successful. The authoritative final run
    (34420821429) targeted
    86caef4a, the exact head this pull request carries, and concluded success.
  • Feature 825's test gate was independently re-run at its unchanged head: 7213 tests, 7213 passed,
    85.67% line and 79.84% branch coverage, clearing the repository floors of 85% and 75%.
  • Every fan-in was checked with git diff --diff-filter=D against the previous integration tip and
    was additions-only, so no merge silently dropped work the branch had gained.
  • Each child merge was confirmed from gh pr view state and from the remote tip, not from the
    child's own report.

A gap worth stating plainly: .github/workflows/ci.yml triggers pull_request only on
[main, development]. Every child pull request here was based on the integration branch and
therefore received zero CI runs. Merge-on-green would have silently become merge-on-nothing.
The dispatched integration runs above are the compensating gate. No workflow file was edited to
obtain a trigger. This pull request, targeting main, is the first in the epic to receive CI
automatically.

Recommended

  • dotnet tool run csharpier check .
  • msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true
  • msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true
  • vstest.console.exe <test-assembly-paths> /EnableCodeCoverage

Backward Compatibility / Migration Notes

No public API is removed or renamed. The behavioural changes are all defect corrections in the
direction of not throwing and not double-releasing.

RS0030 is deliberately NOT promoted, and issue #181 stays open. Feature 826 was authorized to
promote dotnet_diagnostic.RS0030.severity from suggestion to warning, but that authorization
explicitly did not extend to breaking the build to obtain it. Toolchain step 3 promotes every
warning to a build error, so promotion remains blocked until the pre-existing call sites are
cleared. The feature delivered the reachable subset — the BannedSymbols.txt extension — and
recorded the blocking precondition in .editorconfig.

That comment also corrects a figure carried in the epic manifest. The manifest cited roughly 143
pre-existing usages. Re-measured at implementation time the surface is 153 textual hits
(DateTime.Now 53, DateTime.UtcNow 20, Random.Shared 5, Thread.Sleep 15, Task.Delay 60).
Textual hits are not diagnostics and the earlier figure was a diagnostic count, so the two numbers
are not comparable.

Because the new BannedSymbols.txt entries are analysed at suggestion, they surface as
suggestions rather than build breaks.

Risks and Mitigations

  • Teardown and cancellation paths are hard to exercise headlessly. Mitigated by regression
    tests added per feature, with fail-before evidence recorded before each fix.
  • An intermittent test, Transaction_SecondCallerCannotInstallUntilTheFirstRestores, is known
    to fail roughly one run in four. It was deliberately not stabilised with a sleep, a retry, or
    a timing tolerance, which the epic lists as a prohibited remedy; it is recorded as a flake watch.
  • The corrected coverage figure may move reported numbers. By design: the arithmetic was wrong
    before. No threshold was lowered to accommodate the corrected denominator, and no production file
    was added to a coverage exclusion list.
  • Rollback is a single revert of this merge commit; each child is independently revertible on
    the integration branch.

Review Guide

  1. The 17 production .cs files listed under What Changed — the actual behavioural surface.
  2. scripts/vscode/Invoke-MSTestWithCoverage*.ps1 and its new Pester suite — the corrected
    coverage arithmetic.
  3. .editorconfig and BannedSymbols.txt — the two authorized configuration edits.
  4. Everything else is tests, gate evidence, and feature documentation, and is mechanical bulk: 434
    of the 536 changed files are Markdown.

Follow-ups

Four defects were surfaced during preparation but fall outside this epic's blast radius, and are to
be filed through the promotion lifecycle once this merges:

  1. GetTableInViewAsync silently returns null on timeout instead of throwing. It calls
    TimeOutTask.RunWithTimeout with maxAttempts: 1 and strict: false; on the ordinary timeout
    path RunWithTimeout absorbs the TaskCanceledException, exhausts its internal retry, and
    returns default(TResult), so neither catch block is entered and the method returns table! as
    null to its caller.
  2. QfcHomeController.CreateCancellationToken() has no production caller, so the synchronous
    Init() path passes a null _tokenSource to QfcFormControllerLoader and LoadItems /
    LoadItemsAsync silently do nothing.
  3. Cancellation token sources constructed at SubjectMapSco.Orchestration.cs:228 and
    ProgressPackage.cs:25 are never disposed by any holder.
  4. ProgressTrackerAsync is dormant production code with no construction site outside its own
    tests.

Also outstanding:

  • Issue Feature: csharp-analyzer-stack-hardening #181 remains open, as described above.
  • Eight epic child worktrees under C:/Users/DanMoisan/repos/TaskMaster-wt/rr0908-* could not be
    removed: the parallel worktree-removal gate requires a parallel checkpoint items[] record,
    which an epic run does not maintain, so it has no jurisdiction here yet fails closed. They are
    clean and fully merged; reclaim with scripts/bash/cleanup-worktrees.sh.
  • docs/features/epics/review-residuals-2026-09-08/epic-status.md records the final state, but its
    closing entry for this merge necessarily lands in a follow-up commit, since a document cannot
    record the merge commit of the pull request that carries it.

GitHub Auto-close

None. The PR-context bundle reports GitHub CLI validation unavailable and no verified closing
issues, so no Closes keyword is emitted here.

This is the safe outcome rather than merely a procedural one. The bundle's author-asserted list
over-collects by scraping issue numbers from commit messages and feature documentation, and
includes #181 — which this work explicitly does not resolve. Close issues 813, 815, 817, 821,
823, 824, 825 and 826 manually after merge, and leave the rest open.

drmoisan and others added 30 commits September 8, 2026 23:42
… review-residuals epic

The promoted potential records for issues 813, 815, 817, 821, 822, 823, 824, 825
and 826 exist only on the unpushed session branch TaskMaster-wt-2026-09-06T17-16
and are absent from origin/main, so a preparation child branched from this
integration branch cannot resolve a promotion source. Restore all nine.

Issues 824, 825 and 826 additionally still carried an unpromoted duplicate under
docs/features/potential/ on main; the promoted copy supersedes it byte-for-byte
apart from the promotion metadata block, so the duplicate is removed here and git
records the pair as a rename. No record content is lost.

Attribution note: the orchestration-bookkeeping staging exemption in
enforce-orchestration-preimplementation-gate-helpers.ps1 denies any git commit
whose command text contains an angle bracket, so the Co-Authored-By trailer for
Claude Opus 5 cannot be expressed on this commit path.
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Eight open bug issues filed on 2026-09-08 from the reviews of items 809, 810, 811
and 812, decomposed one feature per issue. The dependency graph carries exactly one
edge: issue 826 depends on issue 825, because both edit the GetTableInViewAsync
method of OlTableExtensions.TableAccess.cs. Waves are 0 for the other seven and 1
for 826.

The manifest records the in-flight branch check, the csproj contention that must
not become a dependency edge, and the execution-authorization note for the two
build-configuration files feature 826 edits. issue_num values are final; the
feature_folder values are placeholders and are back-filled from each preparation
child's promotion receipt.

Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…ation double-count

Promotes issue #815 into an active full-bug feature folder as child F815 of the
review-residuals-2026-09-08 epic. The potential record and the GitHub issue both
already existed, so only the active folder was created; no duplicate issue was filed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…down review residuals

Creates the full-bug active folder for issue 823 as child F823 of the
review-residuals-2026-09-08 epic. Promotion of the potential entry and the
GitHub issue were both performed by an earlier run; only the active folder is
created here, so no duplicate issue is filed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…symbol residuals

Seeds issue.md, the spec template and the canonical plan path for feature
F826 of the review-residuals-2026-09-08 epic. Issue #826 and its promoted
potential record already existed on the integration branch, so no new
potential entry or issue was filed for this preparation run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
… memory

Commits the spec.md and plan scaffolds that the active-folder tooling generated but
did not report in its receipt, so the later authored versions read as a diff against
a known baseline.

Corrects the orchestrator memory on the PowerShell batch budget. The hook now
worktree-scopes its state file and drops out-of-root entries on load, so the stale
paths in the tracked default state file no longer exhaust a fresh worktree cap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…defect

Establishes that the defective aggregation is inline prose in delivered atomic plan
documents rather than committed script code, and that the de-duplicated arithmetic in
Get-CoberturaClassLineSummary is already correct.

Refutes the issue's headline magnitude claim. Measured on two committed Cobertura
documents, the all-descendant selection inflates all four counts by roughly two times
while moving the derived percentages by 0.0000 and 0.3239 percentage points on branches,
so it cannot have produced the reported 2.35 point swing. The provenance of the 77.03
figure is recorded as unknown because the underlying report is not committed.

Recommends exposing a de-duplicated, allowlist-scoped aggregation as a tested function
so plan authors call it by name instead of pasting a snippet, and supplies a falsifiable
fixture with computed pre-fix and post-fix figures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…t rates

Captures the reconciled measurement behind issue 815 so a future reader does not
re-accept the refuted magnitude claim, and records the depth-anchored counting
technique that substitutes for a PowerShell run when the shell is unavailable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Corrects three facts the issue body carries: the item-1 population is 33
files carrying 34 live statements rather than roughly 24 classes, the two
production diagnostics sit at lines 79 and 97 rather than 78 and 96, and
five test projects are affected rather than six.

Establishes that RS0030 severity promotion is unreachable without bulk
suppression, that TimeoutAfter is the repository-local determinism seam
rather than a bannable BCL member, and that the two TreeNode test files
carry a CS0169/CS0414 hazard under the nullable gate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Records the completed research for the six batched residual entries and the
specification that dispositions them: R1, R3 and R4 as code changes, R2 as a
decision deferring the relocated throw to issue 813, R5 as an observation-only
flake watch, and R6 as deferred upstream because everything under the agent
configuration tree is pushed down from a separate governance repository.

Every diff-based acceptance criterion is anchored to the integration branch head
rather than to the origin/main commit that branch was cut from. The latter is an
ancestor of this branch, so a three-dot diff against it degenerates to two-dot
and bills the epic manifest and nine sibling promoted records to this feature.
Measured on this branch: 11 paths under the wrong anchor, 1 under the right one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
… criteria

States the root cause as the absence of a committed, tested, callable de-duplicated
first-party aggregation rather than broken arithmetic in the existing helpers, and
traces one duplicated row from the document through the unkeyed descendant-axis
selection to the gate figure it corrupts.

Records three corrections to the issue text: the raw Cobertura report it cites as
committed evidence does not exist in the tree, the defect moves counts rather than
rates, and the reported 2.35 point branch swing cannot be produced by this mechanism.
No criterion is gated on reproducing either disputed percentage.

Writes the analyzer criterion against a recorded baseline rather than a zero count,
and routes the coverage criterion to a direct Pester JaCoCo run because the bundled
artifact measures no path under the scripts tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…duals

Records the corrected item-1 population of 33 files carrying 34 live
statements, anchors the item-2 edit on literal statement text because
feature 825 owns the surrounding timeout mechanics, and scopes item 3 to
eight banned-symbol additions at unchanged RS0030 severity.

Documents why severity promotion is unreachable without bulk suppression,
why TimeoutAfter and the parameterless WaitOne overload are excluded, and
carries sixteen acceptance criteria including a positive-observation
requirement with a mandatory control for the analyzer diagnostics.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…om 826

Separated from the feature commits so it can be dropped independently if a
parallel sibling conflicts on the shared memory index.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…a second isolating-child data point

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
… hygiene residuals

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…ive-root guard

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
AC20 requires every file under docs/features/** other than this feature's
own documents to be absent from the diff. AC35 required the
GetTableInViewAsync reachability observation to be filed through the
promotion lifecycle, which writes a record under
docs/features/potential/promoted/. The two could not both hold on this
branch.

AC35 is now discharged by an evidence artifact under this feature's own
evidence/other/ folder plus a follow-up handoff for the epic to file
after this feature merges, with no on-branch promotion. The Assumptions
reachability note and the Rollout follow-up preamble are amended to match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…obals static race

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…split plan

Corrects a stale cross-worktree CLAUDE.md path in P0-T1, adds the
required evidence-schema fields to P0-T6, and scopes P0-T17's git diff
to the evidence/ subtree so it is not falsified by the prior committed
docs-restoration commit. Confirmed PREFLIGHT: ALL CLEAR on the
following round; plan validator reports ok:true.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Complete the seven-phase plan the interrupted planner left as a draft, and
replace its fixed c713d2a diff anchor with an execution-time self-anchor
recorded by [P0-T2]. The fixed literal had gone stale: the epic-planner fanned
sibling preparation for issues 815 and 826 into the integration branch after
the anchor was chosen, so a three-dot diff against it listed 21 paths rather
than 1 and billed sibling-owned and agent-memory paths to this feature's
footprint criteria. A recorded HEAD cannot degenerate under any later
integration-branch state.

Amend the eight diff-anchored acceptance criteria in spec.md to match; the
AC1..AC29 inventory is unchanged.

Also repair six defects found by the planner's adversarial self-review,
including a vacuous absence gate that searched BreadcrumbPopupOwnerRegistry.cs
for a token only QfcFormViewer.cs carries.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…tomic plan

The planner measured a conflict between AC6, AC20 and the spec Non-goals:
threading the caller TimeProvider into GetTableInViewAsync makes the
table-acquisition deadline create a timer on the ArmingBarrierTimeProvider
that DfDeedleEtlTimeoutTests.cs line 135 consumes in a fixed order, so that
test's Advance(250) would run before the ETL timer exists and the call would
never complete. The barrier latch drops a signal when two timers arm inside
one await window, so the ordering cannot be recovered by adding awaits alone.

Adjudicated in favour of threading the provider and updating the one affected
test. AC6, AC20, the Non-goals bullet, the Test Strategy bullet, the Write Set
and the files-to-change summary are amended accordingly. The alternative, not
forwarding the provider from DfDeedle.cs line 148, was rejected because it
falsifies the AC34 invariant and leaves the production deadline on the system
clock, which is the defect item 2 exists to close.

The amendments are applied during preparation rather than by the executor,
because acceptance criteria are authored by planning agents and an executor
that can rewrite its own gates is not gated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Rounds 2-5 of atomic-executor preflight (resumed session) found and
fixed: an unsatisfiable whole-file broader-catch grep in P6-T1, a
wrong AssignFolderComboBox line span in that same fix, a minor
line-count mislabel in P1-T1, and a false claim that no SDIL reader
file exists in the tree (three production files do, and are now
named explicitly in P6-T3's scope-boundary gate). Round 5 returned
PREFLIGHT: ALL CLEAR.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Close six blocking defects, all instances of an acceptance condition that
could not fail or that would have been marked satisfied on evidence not
establishing it:

- separate the committed-diff, untracked-addition and modified-tracked
  .claude/ path sets, so the AC26 gate tests what AC26 actually forbids;
- scope the AC28 subtraction to the paths AC28 ranges over and surface the
  untracked residual instead of absorbing it;
- require CONFIRMING-FAILED: 0 for AC25, which its text demands;
- replace AC7's repo-wide search, unsatisfiable because the token is quoted
  in six documents including three the D22 fence freezes, with a source-scoped
  form plus a classified repo-wide record;
- reserve a site-unique literal for the [P2-T6] Arrange rewrite that an
  earlier task could otherwise pre-satisfy;
- stop mandating TOTAL: 29 of 29, which forced the summary to claim full
  satisfaction even when a criterion was legitimately left unchecked.

Also apply five advisories and four coherence repairs for sibling
invalidation the deltas themselves introduced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Removes the three executor-side spec-amendment tasks, since the AC6, AC20
and AC35 amendments were applied during preparation by the orchestrator;
acceptance criteria are authored by planning agents, and an executor that
can rewrite the criterion it is judged against is not gated by it. Phase 3
is renumbered contiguously and every cross-reference reconciled.

Also: adds a read-only Phase 3 guard that the executor is working against
the amended spec; pins the pre-change FakeTimeProvider count so the later
assertion is a transition rather than an absolute; requires the missing-using
and unrestored-packages causes of CS1061 to be ruled out before that
diagnostic may be read as refuting the TimeProvider extension member; and
adds explicit staging or porcelain-status spans to the three name-listing
diffs the plan gate flagged.

The plan validator now passes with zero warnings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
drmoisan and others added 19 commits September 9, 2026 15:42
Records the policy audit, code review and feature audit for the ILGlobals
static-publication fix. Zero blocking findings; all twelve acceptance
criteria evaluated PASS against the committed evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…chronised-static-race-824-exec

fix(824): publish ILGlobals opcode tables from an explicit static constructor
… gate

Feature 824 merged as PR #833 (merge commit 96fd3dd), verified against
gh pr view and the remote integration tip; the fan-in introduced zero
deletions. The integration CI run dispatched after 823's merge concluded
success, and a sixth run is dispatched against 96fd3dd.

Feature 825 is the last of wave 0 and the load-bearing dependency for the
single wave-1 feature, so wave 1 does not open until its merge is durably
confirmed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Six residual items from issue #825, none a regression introduced by #811.

Item 1 records why the 250 ms per-row ETL budget is unchanged. A comment at the
expression states that the value rests on no recorded measurement, that no
measurement is obtainable in this environment, and names the live-Outlook capture
route by LogTableTiming payload and log4net root level. The value itself is
untouched.

Item 2 puts the table-acquisition deadline under caller control.
GetTableInViewAsync gains a trailing optional TimeProvider parameter, resolves its
deadline source once so an explicitly supplied timeoutSourceFactory still wins, and
DfDeedle.GetEmailDataInViewAsync now forwards its provider. The TimeoutException
retry propagates the caller's timeoutMs instead of the literal 2000, so both
attempts are governed by the same caller-visible value on the same caller-supplied
clock. Proven at build time rather than assumed: a settling call site was compiled
and produced no CS1061, so
TimeProviderTaskExtensions.CreateCancellationTokenSource is available.

Item 3 changes EtlAsync's declared return type so its first tuple element is
object[,]?, and deletes the null-forgiving suppression on the return. The
TimeoutException swallow, the tokenSource.Cancel call and the DfDeedle null guard
are all unchanged, so no consumer observes a behavioural difference.

Item 4 deletes the two inert (int, int) TimeoutAfter overloads, EtlAsyncOld, and
their three tests. All three exits of the inner provider overload return a Task and
none throws synchronously, so the catch clauses in the deleted overloads could
never execute. This takes TimeOutTask.cs from 1011 lines to 966. That is a
reduction of the 500-line cap violation, not a resolution of it; the file remains
466 lines above the cap and reducing it further is a separate change.

Item 5 corrects the stale DfDeedle.QfcColumns.cs doc comment, which named a
TableEtlInvoker seam that no longer exists, to name DefaultTableEtl. The CS1769
rationale sentence is retained.

Item 6 removes [DoNotParallelize] from OlTableExtensions_Tests and replaces its
class comment, which had claimed a population of tests the class does not contain.
The justification is the item 2 change rather than observed repeated runs: the one
test that armed a real timed CancellationTokenSource now supplies a
FakeTimeProvider, so no wall-clock deadline governs the class. TimeOutTask_Tests
keeps its attribute and gains the verified reason it lacked, naming the two real
wall-clock races in that class.

Four regression tests are added in a new file with one compile item added to the
test project. DfDeedleEtlTimeoutTests.cs receives a bounded timer-ordering update,
permitted by the 2026-09-09 AC6 amendment: threading the provider inserts the
acquisition timer as the first arming signal on a latch-based barrier, so each
timer now arms inside its own await window. No assertion in that class was added or
removed.

Toolchain: csharpier format and check clean at 1623 files; both MSBuild gates pass
with /t:Rebuild at 0 warnings and 0 errors, with zero CoreCompile skips and four
csc invocations for the Write Set projects; 7213 tests pass with coverage.
Repository first-party line coverage moves from 85.62% to 85.67%, and changed-line
coverage is 90.9%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Two artifacts that could not be inside the preceding commit, because each records
the state that commit produced.

evidence/qa-gates/ac18-commit-language.md records the commit sha, the zero-line
porcelain result, the commit-language checks, both directions of the Write Set
accounting, and the confirming check that none of the five committed MSBuild logs
contains the host account name.

evidence/other/review-handoff.md indexes every artifact this plan produced with a
one-line purpose, and names the adjudicated design conflict section of the plan as
the first item a reviewer must read. It also states, for sibling feature 826, the
end state of the exception that escapes TimeOutTask.RunWithTimeout.

The plan checklist is updated to reflect the tasks these two artifacts complete.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Records the policy audit, code review and feature audit for the ETL
deadline mechanics follow-ups. blocking_count is 0 and all 35 acceptance
criteria in spec.md evaluate PASS, so no remediation cycle is opened.

Also carries the P9-T6 plan check-off, which the plan itself records as
the single permitted residual because it is written after the commit the
task makes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…ow-ups-825-exec

fix(825): close the residual ETL deadline mechanics left by #811
Feature 825 merged as PR #834 (merge commit 049c142), verified against
gh pr view and the remote integration tip; the fan-in introduced zero
deletions. That completes wave 0: 813, 815, 817, 821, 823, 824 and 825 are
all merged and durably confirmed. Six dispatched integration CI runs, six
successes.

Also records a redundant resume of feature 825. The first orchestrator for
that feature notified with a narrative progress report rather than the agreed
bounded return shape, and the parent's idleness probes -- no live test process,
a coverage file identical across two samples -- measured the workload rather
than the agent. The original merged twenty-three seconds after that read. The
double-delegation is bounded because a merge cannot be repeated, and wave 1 was
held until the redundant agent exited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Twenty-four memory files written by the wave-0 children and by the epic
parent, left uncommitted in the session worktree because a child must not
commit in the epic parent's fan-in home. They cover, among other things,
CS1769 forcing reflection for Outlook-returning APIs, an epic child branch
anchoring its diff on origin/main, Cobertura post-processing exiting zero
independently of the test result, and two parent-side traps: a trailing
parenthesis on a feature-folder path token defeating the delegation hooks,
and a completed task-notification not proving a child has finished.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Wave 1 was held until dependency 825 was confirmed merged from gh pr view and
from ancestry of the wave-1 worktree HEAD, not from a completion notification.
The epic checkpoint validation, which reported the expected wave-barrier line
for 826 throughout wave 0, now returns ok with no findings.

Records that feature 825's fourth gate, unresolved at merge time, was later
confirmed green on evidence by an independent re-run at the same head: 7213
tests, 7213 passed, 85.67% line and 79.84% branch coverage, clearing the 85%
and 75% floors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…agnostics through log4net, extend BannedSymbols

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…d-symbol residuals

Adds the policy-audit, code-review and feature-audit artifacts for issue #826.
Verdict: 0 blocking findings, 16 of 16 acceptance criteria PASS.

The review records one gap the feature itself did not close: no plan task or
evidence artifact captured a branch-coverage figure, though C# is branch-capable
and the uniform floor is 75 percent. It was closed during review by parsing both
Cobertura roots. The raw merged root reports 66.49 percent branch across 23
packages because it includes the test assemblies and five vendor packages, while
the post-processed first-party denominator reports 79.87 percent across 9. The
first-party figure is the policy-conformant one and is what the repository's own
threshold assert uses, so both floors clear and no verdict changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
…banned-symbol-promotion-826-exec

fix(826): remove Console output aggressors and promote four timing primitives to banned symbols
Eight memory files from the wave-1 child and its delegates, left uncommitted
in the session worktree because a child must not commit in the epic parent's
fan-in home. They cover feature 826's factory-outside-try reachability seams,
a branch-coverage denominator trap in raw Cobertura, and a note that an epic
manifest's ALL CLEAR table is a claim rather than evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
Feature 826 merged as PR #835 (merge commit 219804e), verified against
gh pr view and the remote integration tip; the fan-in introduced zero
deletions. All eight features in the epic are now merged.

Records what this epic does NOT close. collect_pr_context emits a long
author-asserted auto-close list scraped from commit messages and feature
documentation; those are prose references, not deliveries. In particular #181
remains open by design: feature 826 was authorized to promote RS0030 to
warning but not to break the build to obtain it, so it delivered the reachable
subset by extending BannedSymbols.txt from seven entries to fifteen and left
the severity at suggestion with the blocking precondition documented in-file.
That comment also corrects the manifest's figure, re-measuring 153 textual
hits and noting they are not comparable to the earlier diagnostic count.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01URyGon15RvDXcUEo96tvyh
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