Skip to content

fix(quickfiler): suite-determinism foundation epic — remove live test form, repair keyboard-action and explorer-controller contract defects (#445, #449, #491) - #595

Open
drmoisan wants to merge 52 commits into
mainfrom
epic/quickfiler-suite-determinism-foundation-integration
Open

fix(quickfiler): suite-determinism foundation epic — remove live test form, repair keyboard-action and explorer-controller contract defects (#445, #449, #491)#595
drmoisan wants to merge 52 commits into
mainfrom
epic/quickfiler-suite-determinism-foundation-integration

Conversation

@drmoisan

Copy link
Copy Markdown
Owner

Summary

Why

The QuickFiler test suite fails on some runs and passes on others. Until its red is trustworthy, the remaining QuickFiler defect backlog cannot be certified against evidence. This epic is the first and least entangled of a planned sequence: it removes one source of nondeterminism (a live form in a unit-test assembly) and settles three isolated contract defects that later QuickFiler work builds on.

The epic was prepared in advance by epic-planner — every child's spec, approved atomic plan, and preflight clearance were committed to the integration branch before execution began — and executed as four concurrent children in isolated worktrees, each fanning in to the integration branch on green.

What Changed

Core: #491 — live form removed from the test assembly

  • Deleted QuickFiler.Test/Form1.cs, Form1.Designer.cs, and Form1.resx.
  • Added QuickFiler.Test/NoLiveFormInTestAssemblyTests.cs with the structural guard ExecutingAssembly_ContainsNoFormDerivedType.
  • That guard immediately caught a second, previously unknown dead type, QfcHomeControllerTests+QfcFormViewerDerived, verified to have zero callers repository-wide. It was removed through a full remediation cycle (plan, preflight, execute, re-audit) rather than waived.

Core: #445 — keyboard-action contract defects

  • KaStringAsync.KeyEquals gated branches 1 and 2 on Activated but not branch 3, so a non-matching multi-character probe fired its side effect on every LINQ re-enumeration within one keystroke. All three branches now gate consistently.
  • KeyEquals("") had no defined contract: Key.Contains("") is true for every receiver, so an empty probe reached a Substring call with a start index of -1 and threw, or silently matched every registered action. It now rejects null and empty explicitly from a guard above the Contains test.
  • KaChar.DelegateType returned typeof(Action<Keys>) while storing an Action<char>. Because the corresponding interface member was commented out, the property was orphaned public API with no caller, so it is removed rather than corrected. The dead Update property is likewise removed from KaChar, KaCharAsync, KaKey, and KaKeyAsync, and retained on KaStringAsync, which reads it. Both commented-out members are deleted from IKbdAction; its four live members are byte-identical, so no implementer signature moves.

Core: #449 — explorer-controller latent defects

  • Two latent defects repaired in QuickFiler/Controllers/QfcExplorerController.cs, plus removal of a block of dead duplicated code.
  • New test files QfcExplorerControllerTests.cs and QfcExplorerController.ConversationViewTests.cs, with the corresponding <Compile Include> entries appended to the Controllers item group.

Shared surface

QuickFiler.Test/QuickFiler.Test.csproj is a legacy non-SDK project with explicit compile entries, so two children had to edit it concurrently. Regions were partitioned in advance: #491 owned the Form1 compile and embedded-resource entries, #449 owned appended Controllers entries. Verified after fan-in: zero Form1 references remain and both explorer test files are registered.

Docs and evidence

The epic manifest, the generated epic-status.md projection, each child's spec, research, approved plan, evidence artifacts, and feature-review audit artifacts (policy-audit, code-review, feature-audit).

Architecture / How It Fits Together

No architectural change. IKbdAction is narrowed by deleting two commented-out members and removing orphaned public API from its implementers; the live contract surface is unchanged. IQfcExplorerController is touched only where the explorer-controller defects required it. Everything else is defect repair, dead-code removal, and test infrastructure.

Verification

Completed

Each child ran the full C# toolchain to a clean pass in its own worktree, in order: dotnet tool run csharpier check ., then the analyzer rebuild, then the nullable rebuild, then vstest with coverage. Each child then passed feature-review, producing policy-audit, code-review, and feature-audit artifacts. All three children finished with zero unresolved Blocking findings.

Coverage per child, on each child's own measured scope:

childbeforeafternote
#44570.5971%70.6037%new lines 12/12
#44980.9163%80.9898%QuickFiler scope
#49185.5788%85.5627%see below

#491's acceptance criterion for coverage is the one criterion left unchecked across all three children. feature-review re-derived the figure directly from the committed Cobertura XML and found zero own-effect: no QuickFiler.Test class appears in either coverage file, and the 0.0161pp movement is fully attributable to two unrelated, untouched production files. Both readings clear the repository floor. It is recorded as unchecked rather than waived silently.

Child pull requests received no CI..github/workflows/ci.yml triggers pull_request only on [main, development], so a pull request based on an epic integration branch matches no trigger and runs zero checks. This was identified before wave 0 launched and each child was told that its local toolchain, not CI, was its gate, and to record that reasoning. The workflow was deliberately not modified. This pull request is the first full CI gate the integrated tree receives.

Recommended

Run the full toolchain against the merged result, and note that vstest requires /InIsolation:

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 <assemblies> /EnableCodeCoverage /InIsolation /TestCaseFilter:"TestCategory!=LiveOutlook"

Omitting /InIsolation causes each assembly's app.config binding redirects to be ignored and fabricates roughly 1,695 phantom failures with empty messages, surfacing as a Moq TypeInitializationException. That is a load failure, not a regression.

The Descoped Child: #511 / #571

The fourth child halted rather than ship. Its premise was that WinFormsPumpHost.RunPumpThread calls Application.Run(new ApplicationContext()) without ever adding a form or control, so no window handle exists when Control.Invoke is reached.

That premise is false. ItemViewer's constructor calls InitializeComponent, which runs ((ISupportInitialize)…).BeginInit() / .EndInit() on both WebView2 children (QuickFiler/Viewers/ItemViewer.Designer.cs:89-90 and :6166-6167). EndInit creates the child window handles, and WinForms creates a parent's handle when a child's is created, so the viewer's handle exists the instant construction returns. A bare new QuickFiler.ItemViewer() on the pump thread — no harness, no SaveParameters, no .Handle read — already reports both children handle-created. The proposed remedy forces a handle that already exists.

The real failure is a 60,000 ms PumpTimeoutMs expiry under CPU contention, not a missing handle: a missing handle throws immediately rather than hanging for a minute. Nor did the post-fix evidence demonstrate efficacy — against a pre-fix failure rate of roughly 1 in 21, thirty consecutive clean runs has probability about 0.23 under the null hypothesis of no effect, and under induced 17-node contention a supplementary pass was only 8 of 10 green.

Landing that change would have put a false claim in repository history and closed two issues that are not fixed. The work is preserved unmerged on bug/winformspumphost-suite-determinism-511-exec at commit 53a2a08f, the correction is recorded on both issues, and the real defect is tracked as #592. No production file was modified by that child, and both coverage-bearing production files hash to their exact merge-base blobs, so #571's coverage is untouched.

Backward Compatibility / Migration Notes

  • IKbdAction narrows. Two commented-out members are deleted. Its four live members are byte-identical, so no implementer signature moves.
  • DelegateType and Update are removed from KaChar, KaCharAsync, KaKey, and KaKeyAsync. Both were orphaned public API with no caller; a repository-wide search over *.cs returns zero hits for DelegateType. Update is retained on KaStringAsync, which reads it.
  • KeyEquals now throws on null and empty input where it previously threw ArgumentOutOfRangeException or silently matched everything. Any caller relying on the silent-match behaviour changes.
  • QuickFiler.Test.Form1 and QfcHomeControllerTests+QfcFormViewerDerived are deleted. Both were dead; neither had callers.

Risks and Mitigations

  • Analyzer version skew is a live, pre-existing hazard on a cold runner.packages.config pins Meziantou.Analyzer 3.0.174 and Roslynator.Analyzers 4.16.1, while 16 and 64 csproj <Analyzer Include> paths respectively still point at 3.0.156 and 4.16.0 — directories a clean restore never creates. CI is green today only because _build-analyzers.yml declares a restore-keys: nuget-<os>- fallback that restores an older cache still holding them. origin/main carries the identical skew, so this pull request is no worse than main, but it fails with error CS0006 the first time GitHub evicts that cache entry. If this pull request goes red on build-analyzers or build-nullable with CS0006, that is this pre-existing defect and not a regression from any child here. Mitigation: the workflow is deliberately unmodified; the fix belongs in its own change.
  • Diff size. 198 files and roughly 393,000 insertions, of which about 375,600 are two Cobertura XML evidence files from Bug: quickfiler-test-form1-live-form #491. Committing large evidence artifacts is an existing repository norm — docs/features/archive already carries individual coverage XML files of 30 to 44 MB — but a repository-wide policy on raw test-result artifacts is worth deciding separately.
  • Concurrent-worktree tooling hazard.collect_pr_context writes into the shared primary checkout regardless of the workspace root it is given, so one child overwrote a sibling's context mid-flight. Filed as Bug: collect-pr-context-shared-path-race-across-concurrent-children #589. Mitigation applied here: the head SHA in the context bundle was checked against this branch's HEAD before the body was written.

Review Guide

  1. QuickFiler/Interfaces/IKbdAction.cs and the four Ka* controllers — the only public-contract change.
  2. QuickFiler/Controllers/KaStringAsync.cs — the Activated gating and the empty-probe guard carry the behavioural decisions.
  3. QuickFiler/Controllers/QfcExplorerController.cs and QuickFiler/Interfaces/IQfcExplorerController.cs.
  4. QuickFiler.Test/QuickFiler.Test.csproj — confirm the two partitioned regions merged cleanly.
  5. QuickFiler.Test/NoLiveFormInTestAssemblyTests.cs — the structural guard.
  6. docs/features/epics/quickfiler-suite-determinism-foundation/epic-status.md — the epic-level record, including the Bug: winformspumphost-tests-load-flaky-visible-window #511 halt.
  7. Everything else under docs/ is evidence and audit artifacts; skim rather than read.

Follow-ups

Open and deliberately not closed by this pull request:

Known and accepted in this pull request: two unused using directives at the top of QuickFiler.Test/Controllers/QfcExplorerControllerTests.cs, stranded by the test-file split. No gate fires on them (CS8019 is hidden, IDE0005 is unwired); removing them would have required a full toolchain re-run invalidating audit artifacts pinned to the audited diff.

GitHub Auto-close

drmoisanand others added 30 commits August 21, 2026 17:58
Scopes the first of three planned epics over the QuickFiler defect corpus:
four children covering issues 511+571, 445, 491, and 449.
Also restores three promoted potential documents that existed only on the
stale epic/quickfiler-per-file-coverage-integration branch and never reached
main. They are the authoritative requirements source for these children; the
GitHub issue bodies for 445, 449, and 491 read "(not provided in potential
file)" in every section below the summary.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…r-epic preconditions
Adds three sections to the quickfiler-suite-determinism-foundation manifest:
- Known-stale potential-document references. Six measured drifts; children must
re-derive line numbers rather than trust a file:line citation.
- Hard constraints for children: no .claude edits, mandatory vstest /InIsolation,
the directive that #511 must not delete #571's coverage, Python-absent
reporting, and the canonical evidence path scheme.
- Recorded preconditions for later epics: QfcCollectionController at 4.7x the
line cap, missing quality-tiers.yml, the in-flight 61-file potential-doc
restoration, and the zero-collision result across 20 quickfiler branches.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
epic-planner preserved this work after the preparation orchestrator was
terminated by an infrastructure error (API 529 Overloaded), not by a task
failure. Preparation did NOT complete: no atomic-executor preflight clearance
was obtained for this item.
Present: issue.md, spec.md, research artifact, and an atomic plan that passes
the MCP plan validator. Absent: PREFLIGHT: ALL CLEAR.
Committed so a relaunched child resumes from this commit instead of losing an
uncommitted worktree.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
epic-planner preserved this work after the preparation orchestrator was
terminated by an infrastructure error (API 529 Overloaded), not by a task
failure. Preparation did NOT complete: no atomic-executor preflight clearance
was obtained for this item.
Present: issue.md, spec.md, research artifact, and an atomic plan that passes
the MCP plan validator. Absent: PREFLIGHT: ALL CLEAR.
Committed so a relaunched child resumes from this commit instead of losing an
uncommitted worktree.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
epic-planner preserved this work after the preparation orchestrator was
terminated by an infrastructure error (API 529 Overloaded), not by a task
failure. Preparation did NOT complete: no atomic-executor preflight clearance
was obtained for this item.
Present: issue.md, spec.md, research artifact, and an atomic plan that passes
the MCP plan validator. Absent: PREFLIGHT: ALL CLEAR.
Committed so a relaunched child resumes from this commit instead of losing an
uncommitted worktree.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
epic-planner preserved this work after the preparation orchestrator was
terminated by an infrastructure error (API 529 Overloaded), not by a task
failure. Preparation did NOT complete: the atomic-executor preflight was
delegated but its signal never returned, so no PREFLIGHT: ALL CLEAR exists.
Present: issue.md, spec.md, research artifact, and an atomic plan.
Absent: preflight clearance.
Committed so a relaunched child resumes from this commit instead of losing an
uncommitted worktree.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…ceipts
All four manifest feature_folder values were authoring-time guesses of the
form 2026-08-21-<slug>-<issue> and all four were wrong. Replaced with the
paths new_active_feature_folder actually created, each verified to resolve to
a 4-file folder on its child branch.
Note the tool's naming is not uniform: three folders carry the potential
document's capture date (2026-08-07-...), while #511's carries no date prefix
at all. The date is not today's date in any case, so feature_folder cannot be
predicted at manifest-authoring time and must always be back-filled from the
promotion receipt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
main advanced past this branch's fork point when PR #582 merged, restoring 61
promoted potential records that existed only on the unmerged branch
epic/quickfiler-per-file-coverage-integration.
This branch was cut from b9a9b92, before that restore. Left un-merged, any
fan-in from this branch family to main would have deleted 58 of those 61
records - 58 rather than 61 because three were already restored here for the
Epic 1 children.
Merging main in also brings the requirements documents for the planned epics
2 through 4 into the tree the children work from.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…mspumphost-suite-determinism-511
Brings PR #582's restore of 61 promoted potential records, plus the epic
manifest's back-filled feature_folder values, onto this preservation branch.
Without it, fan-in from this branch would have deleted 58 of those records.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…iler-keyboard-action-contract-defects-445
Brings PR #582's restore of 61 promoted potential records, plus the epic
manifest's back-filled feature_folder values, onto this preservation branch.
Without it, fan-in from this branch would have deleted 58 of those records.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…iler-test-form1-live-form-491
Brings PR #582's restore of 61 promoted potential records, plus the epic
manifest's back-filled feature_folder values, onto this preservation branch.
Without it, fan-in from this branch would have deleted 58 of those records.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…iler-explorer-controller-latent-defects-449
Brings PR #582's restore of 61 promoted potential records, plus the epic
manifest's back-filled feature_folder values, onto this preservation branch.
Without it, fan-in from this branch would have deleted 58 of those records.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
Resume the preparation run for issue #491 that was interrupted by an
infrastructure error after its first plan revision but before revalidation.
Re-preflight the already-revised plan and apply a second revision round.
Round 2 preflight returned REVISIONS REQUIRED with three blocking findings,
none of which was a recurrence: the round-1 remediation had genuinely landed,
and one of the new defects was introduced by that revision.
Blocking findings resolved:
- P0-T17 assigned $kept while P0-T18 and P3-T6 expanded @ASSEMBLIES, which was
never defined. vstest would have run against zero assemblies and still
reported a zero failure count. The enumeration now emits $assemblies, and
both consumers run it inside the same pwsh payload as the vstest call, with
acceptance requiring the command-line assembly count to equal the recorded
KEPT count and be at least 1.
- P5-T5 gated the branch-wide range 025b350..HEAD, which is unsatisfiable at
this head: 63 changed paths, 58 of them under docs/features/potential/,
restored by a merge of main. The gate now covers the executor's own commit
via git show, and the branch-wide list is a recorded observation only.
- P1-T5 and P3-T7 omitted /EnableCodeCoverage, violating the epic binding
constraint and spec acceptance criterion 8.
Non-blocking corrections: three tasks asserted as fact that
.claude/agent-memory/ was already dirty at branch head, which was false; a
line citation drifted by one; no branch existed for a pre-existing sub-80%
coverage baseline; and the superseded early-draft acceptance-criteria block in
issue.md is now recorded as such.
Round 3 preflight returned PREFLIGHT: ALL CLEAR. The plan passes the MCP plan
validator with no acceptance-gate warnings. Plan-path continuity was honoured:
the single existing plan file was revised in place and no timestamped sibling
was created.
Preparation only. Atomic execution, PR authoring, and CI monitoring remain out
of scope and are deferred to epic-orchestrator.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…n findings
The #491 row claimed the change touches 'one dependent test file'. It does
not: nothing under QuickFiler.Test/ references Form1 outside its own two
files, so the removal is self-contained and the plan adds a guard test rather
than editing a dependent one. Found by the #491 preparation child and verified
by direct read.
Also records two findings that would otherwise be lost at archive time: a
second live WinForms form in UtilitiesCS.Test that survives #491 and needs its
own bug, and the rationale for leaving subagent agent-memory writes
uncommitted.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
PREFLIGHT: ALL CLEAR, verified by epic-planner against the child's own on-disk
checkpoint rather than its summary: next_step S5_atomic_execution,
completed_steps includes S4b_preflight_validation, blocked_reason none.
Plan re-validated by the MCP plan validator after the child's edits.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…ct defects
Preparation-mode resume for epic child #445 of
quickfiler-suite-determinism-foundation. The prior preparation run
completed research, spec, and atomic planning before an infrastructure
error killed it short of preflight clearance. This commit records the
plan revisions that cleared preflight.
Two blocking findings from preflight iteration 1, both now resolved:
BF-1: the plan's "Resolved Environment" block pinned the workspace root
to the planning run's worktree, which no longer exists, under a header
reading "do not re-derive". Because epic-orchestrator executes this plan
in a third worktree, no absolute literal can be correct. WS is now
resolved at execution time from `git rev-parse --show-toplevel`.
BF-2: P4-T5 and P5-T6 demanded an absolute `Failed 0` across the whole
QuickFiler.Test assembly, which also contains the two intermittently
failing pump tests owned by wave-0 sibling child #511/#571 and #491's
live Form1. All four children sit in wave 0 with no dependency edges, so
the gate could fail for a reason this child cannot fix. Both gates now
use the plan's own baseline-subset condition while retaining absolute
zero on the five test classes this child owns. Preflight confirmed the
subset condition alone still catches a new failure introduced outside
those classes, because it compares test-name sets.
Three smaller corrections: the "dotnet is not on PATH" claim was
measured false; the Literal Register preamble misdescribed its own eight
retention gates; and P1-T3 could have broken the Be("b" retention gate
via a per-element assertion.
Plan passes the MCP plan validator. Atomic execution, PR authoring, and
CI monitoring remain out of scope and are deferred to epic-orchestrator.
Refs #445
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…-defects)
PREFLIGHT: ALL CLEAR, verified by epic-planner against the child's own on-disk
checkpoint rather than its summary: next_step S5_atomic_execution,
completed_steps includes S4a_preflight, blocked_reason none. Plan re-validated
by the MCP plan validator.
Merges commit 0dc8c14, the last feature-only commit, rather than the branch
tip 3b20bfa. The two commits above it (b0fdc91, 3b20bfa) contain only
.claude/agent-memory/ writes by the child's own subagents. Those are not
feature deliverables, the sibling #491 child left its equivalents uncommitted,
and fanning in one child's agent memory but not another's would be arbitrary.
They remain intact on the pushed branch and are recoverable.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
Preparation-mode resume for the quickfiler-explorer-controller-latent-defects
child of the quickfiler-suite-determinism-foundation epic. The prior preparation
run and its preflight grandchild were killed by an infrastructure error before
any preflight signal returned; research, spec, and the plan were already
preserved on this branch at cd2f078.
Preflight took three iterations and produced seven blocking findings across two
revision cycles. The plan was revised in place; no timestamped sibling was
created and no phase or task was added, removed, or renumbered.
Cycle 1 (six blocking, four clarifications):
- Header WORKTREE literal named a worktree that does not exist; it is the
operand of twelve tasks.
- [P0-T8] was unrunnable: .dotnet-sdk absent against a global.json pin of
8.0.205, and packages/ absent with packages.config HintPaths, so no NuGet
restore preceded the msbuild tasks. Replaced with a three-step bootstrap.
- [P4-T1] deleted literal lines 183-321 after [P3-T2] had already shifted the
region to 177-315, which would have destroyed the closing braces. Now
re-derives both endpoints; predicted post-state corrected 184 -> 178.
- [P7-T11] used git grep against a file untracked until the later [P7-T12]
commit, so the AC-13 determinism gate could not fail. Added --untracked.
- [P7-T13] admitted no Markdown exemption while the merge-base diff
necessarily carries spec.md (1136) and the research document (1039).
- [P6-T14]'s conditional second Compile Include contradicted AC-12 and AC-16,
which [P7-T27] and [P7-T31] check off unconditionally.
- Plus: [P3-T7] hit count five -> six, [P5-T12]/[P6-T15] TestCaseFilter
operator, [P7-T9] delta-based coverage caveat, and a premise correction.
Cycle 2 (one blocking, three notes):
- [P7-T31] consumed [P7-T13]'s artifact but retained the unqualified
under-500-lines claim, leaving AC-16 uncheckable.
- Plus: [P0-T14] wc -l undercount (483 vs a true 484), [P7-T30] five -> six,
and BOM preservation in [P4-T2].
Final state: PREFLIGHT: ALL CLEAR. Plan passes the MCP plan validator with no
warnings at 8 phases and 98 tasks. Atomic execution, PR authoring, and CI
monitoring remain out of scope and are deferred to epic-orchestrator.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nt-defects)
PREFLIGHT: ALL CLEAR, verified by epic-planner against the child's own on-disk
checkpoint: preflight.final_status clear, 3 iterations, zero blocking findings,
next_step S5_atomic_execution. Plan holds at 8 phases and 98 tasks, all
unchecked, and passes the MCP plan validator.
Merges eae0ffa, the feature-only commit, not the branch tip c71004b, which
contains only .claude/agent-memory/ writes. Same treatment as #445 and #491.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
… fix
Preparation-mode revisions bringing plan.2026-08-21T18-10.md from validator-clean to PREFLIGHT: ALL CLEAR over four preflight iterations.
Phase 0 environment bootstrap (previously unreachable acceptance): P0-T8 provisions the worktree-local .NET SDK pinned by global.json (8.0.205); P0-T9 restores NuGet packages, without which EnsureNuGetPackageBuildImports fails every msbuild task; P0-T10 back-fills Meziantou.Analyzer 3.0.156 and Roslynator.Analyzers 4.16.0 into the untracked packages tree, because the hand-authored Analyzer items still name versions packages.config no longer pins and a missing analyzer path is error CS0006.
Evidence integrity: every /Logger:trx invocation now carries a per-task /ResultsDirectory: under its own evidence kind, so P4-T2's zero-failure gate is no longer evaluated against TRX files left by the expect-fail Phase 1 runs.
Phase 6 closure: P6-T20 files the repo-wide analyzer-skew follow-up issue and mirrors it under evidence/issue-updates/; P6-T21 commits the post-P6-T18 artifacts so the plan terminates with a clean worktree. P6-T11's false plan-versus-spec deviation claim was corrected to a spec-alignment note.
The #511/#571 reconciliation is unchanged: the real WinForms message pump is retained and #571's coverage justifications are preserved.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…erminism)
PREFLIGHT: ALL CLEAR, verified by epic-planner against the child's own on-disk
checkpoint: preflight.final_status clear, 4 iterations, next_step
S5_atomic_execution. Plan holds at 7 phases and 74 tasks, all unchecked, and
passes the MCP plan validator.
Merges 846d37d, the feature-only commit, not the branch tip bbab60a, whose
two commits contain only .claude/agent-memory/ writes. Same treatment as the
three sibling children.
This is the fourth and final child of the epic.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
All four children prepared and preflight-cleared. Validated with the
epic-kickoff artifact type before committing; this copy is byte-identical to
artifacts/orchestration/epic-kickoff-quickfiler-suite-determinism-foundation.md,
which is gitignored and therefore does not travel with the branch.
Execution has NOT started.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016LdWAA7aMkzJ27NUW7WzaT
…ation
Two learnings from the #445 preflight loop:
- atomic-executor: an absolute "Failed 0" gate on a whole test assembly
is a defect when that assembly carries failures owned by a concurrent
sibling child. Scope the absolute-zero condition to the classes the
child owns and use a baseline-subset condition for the rest.
- atomic-planner: seams and constraints specific to the QuickFiler
keyboard-action types.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit b0fdc91)
Two learnings from the preparation-mode preflight loop on epic child #445:
- A stale planning-worktree path must be fixed in the PLAN during
preparation mode, not overridden at execution time. There is no
execution worktree yet, so no absolute literal is correct; the plan
should resolve the workspace root from git rev-parse --show-toplevel.
A stale path under a do-not-re-derive header is blocking rather than
advisory, because the header forbids the repair.
- A child must not assert an absolute Failed 0 over a test assembly that
also carries a concurrent wave sibling's known failures. Scope absolute
zero to the classes the child owns and use a baseline-subset condition
elsewhere, which stays falsifiable against the child's own regression.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 3b20bfa)
…ight
- The MCP plan validator does NOT universally reject CRLF. A 198-line CRLF
plan passed cleanly four times across two revision cycles. Recorded as a
counter-observation against the existing LF memory so a future run reads
the actual validator result instead of normalizing pre-emptively.
- Agent(atomic-planner) has no mcp__drm-copilot__* tool in its surface and
cannot run the mandatory plan-validator gate. The orchestrator must run it
after every planning delegation and should tell the planner not to
fabricate a result.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit c71004b)
…light
Three memories from the atomic-planner during the winformspumphost-suite-determinism preflight cycle: agent worktrees need SDK + NuGet + analyzer back-fill bootstrap before any C# gate; /Logger:trx needs a per-task /ResultsDirectory: or the TRX-under-evidence acceptance is unsatisfiable and ambiguous; and terminal-phase plan traps (unowned follow-up obligations, artifacts written after the clean-tree commit task, false spec-deviation claims).
Separated from the plan commit so it can be dropped independently. .claude/agent-memory/** is listed as safe to edit by epic hard constraint 1 and carved out by spec AC 9.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 29c9f78)
Orchestrator memory for the three bootstrap steps a fresh agent worktree needs before any C# gate, including the repo-wide analyzer version skew that yields error CS0006 and the reason green CI does not disconfirm it (prefix restore-keys cache fallback).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit bbab60a)
Generated from the epic checkpoint. Records the four wave-0 children at
not_started, the empty dependency graph, and the six execution conditions
established at kickoff -- most consequentially that ci.yml triggers
pull_request only on [main, development], so a child pull request based on
the integration branch runs zero checks and each child's gate is its own
local C# toolchain.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHj7wjLweuwfAP8NDA4iiP
All four children created their isolated worktrees and -exec branches off
origin/epic/quickfiler-suite-determinism-foundation-integration, confirmed
from git worktree list --porcelain and git branch rather than from
completion notifications. Adds the execution-branch table, since the
canonical bug/* names remain checked out in framework-locked preparation
worktrees and could not be reused.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHj7wjLweuwfAP8NDA4iiP
drmoisanand others added 22 commits August 22, 2026 09:50
…emediation-plan (#491)
Post-commit checklist update recording that the cycle-1 remediation commit
and its scope-lock verification both completed successfully.
Closes#445.
Defect 1 - inconsistent `Activated` gating. `KaStringAsync.KeyEquals`
branch 3 (`other.Length > 1`) invoked `Update` without the `Activated`
guard that branches 1 and 2 apply, so a non-matching multi-character
probe fired its side effect on every LINQ re-enumeration within one
keystroke. The guard is now `if (Activated && Update is not null)` in
all three branches. Branch 1's early return is deliberately preserved:
`KeyboardHandler` re-arms the latch only at filter length 1 and then
makes three passes per keystroke, so clearing the latch on a match
would stop the item-number label advancing. A new test pins that
behavior.
Defect 2 - `KeyEquals("")` had no defined contract. `Key.Contains("")`
is true for every receiver, so an empty probe entered branch 1 and,
with `Activated` true and a non-null `Update`, evaluated a substring
offset of -1 and threw `ArgumentOutOfRangeException`; with the guard
false it silently returned true, matching every registered action.
`KeyEquals` now rejects null with `ArgumentNullException` and empty
with `ArgumentException` from a guard clause above the `Contains` test,
so the negative start index is unreachable. The `KbdActions` string
methods inherit this precondition, which is documented in-code.
Defect 3 - `KaChar.DelegateType` returned `typeof(Action<Keys>)` while
the type stores an `Action<char>`. `DelegateType` was orphaned public
API on `KaChar` and `KaKey` with its interface member commented out, so
it is removed rather than corrected; a repository-wide search over
`*.cs` now returns zero hits. The dead `Update` property is removed
from `KaChar`, `KaCharAsync`, `KaKey`, and `KaKeyAsync` and retained on
`KaStringAsync`, which reads it. Both commented-out members are deleted
from `IKbdAction`, whose four live members are unchanged, so no
implementer signature moves.
The non-prefix `Substring` offset in branch 1 is a fourth, distinct
defect whose fix is a keyboard-filtering behavior change. It is out of
scope here and filed as #583.
Verification: csharpier 1517 files, 0 needing format; msbuild analyzer
and nullable gates both exit 0 with 0 errors and 5 pre-existing
third-party advisories, `Skipping target "CoreCompile"` count 0 in
both; vstest 6441 passed, 0 failed, 0 skipped across 9 assemblies
(baseline 6437, delta is the 4 new tests). New production line coverage
12/12. `KaChar.cs` and `KaKey.cs` rise to 100% by shedding the removed
dead lines. No file exceeds 500 lines. `QuickFiler.Test.csproj` is
untouched; all new tests land in files that already carry compile
entries.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
)
Addresses issue #449, epic child of quickfiler-suite-determinism-foundation.
Defect 2 (behavioural, regression-tested):
NavigateToOutlookFolder re-resolved _globals.Ol.App.ActiveExplorer() at call
time instead of using the explorer captured in the constructor, so when the
active explorer changed between construction and the call the wrong window was
navigated. Fixed by assigning through _activeExplorer. A failing-before test
was observed (EXIT 1, Moq VerifySet 0 times) and passes after.
Defect 1 (contract):
Removed the unimplemented ExplConvView_Cleanup member from
IQfcExplorerController and its throwing implementation. It had zero compiled
callers; the compiler enforces the paired edit on the single implementer.
Defect 3 (dead code):
Deleted the 139-line "Email Sorting To Rewrite" region, six unreachable
private/internal statics duplicated from SortEmail.cs / EmailFiler.cs /
SortItemsToExistingFolder.cs. Two latent defects inside it (transposed
Path.Combine arguments, a write into a null ref string[]) are deleted rather
than fixed, since unreachable code has no observable behaviour.
Coverage seam (D5):
Removed the class-level [ExcludeFromCodeCoverage] and added the injectable
NotInViewDialogInvoker seam so both OpenQFItem branches are testable headlessly.
The seam is declared as a fully-qualified System.Func<...> so it does not
resurrect the orphaned "using System;" directive. Ten orphaned using directives
removed; the analyzer build confirms none was required.
Tests: 15 new MSTest cases (Moq + FluentAssertions), split across two files to
respect the 500-line cap. Suite 6437 -> 6452 passed, 0 failed, 0 skipped, with a
byte-identical pass set across two consecutive runs.
Coverage: repo-wide 85.3290% -> 85.3571%; QuickFiler package 80.9163% ->
80.9898% (epic NFR met); QfcExplorerController absent-from-report -> 87.8261%;
changed-line coverage 100% (3/3).
Toolchain (single uninterrupted pass, all green): dotnet tool restore; csharpier
format/check (0 files needing formatting); msbuild /t:Rebuild with analyzers
(0 errors, 5 pre-existing System.Reactive warnings); msbuild /t:Rebuild with
TreatWarningsAsErrors (0 errors); vstest with /InIsolation and coverage.
Completes issue #449. Marks all sixteen acceptance criteria in spec.md as
delivered and adds the three remaining Phase 7 evidence artifacts:
- ac12-csproj-diff shared-surface project-file diff; the Form1 regions
owned by sibling child #491 are untouched
- ac16-file-size-cap every non-Markdown file in the diff under 500 lines;
SortEmail.cs and Legacy/QuickFileController.cs are
pre-existing over-cap files absent from the diff
- ac-status-summary 16/16 criteria PASS, 0 remaining
Two reconciliations are recorded rather than silently absorbed:
- AC-12's "exactly one appended line" is superseded by two, and AC-16's
project-file figure of 485 by 486, because the [P6-T14] 500-line cap split
required a second test file (569 lines -> 387 + 205).
- AC-8's prose says "nine directives" while enumerating ten line numbers. The
D4 table is authoritative: nine were removed in Phase 4 and the tenth in
Phase 5. No directive was restored.
The plan checklist is fully checked off: 98 of 98 tasks across Phases 0-7.
Adds the three feature-review artifacts produced for issue #449:
policy-audit, code-review, and feature-audit (all 2026-08-22T10-58).
Verdict: 0 Blocking findings. All 16 spec.md acceptance criteria PASS,
independently re-verified by the reviewer against the raw Cobertura
reports rather than accepted from the executor's evidence.
Three non-blocking findings are recorded rather than remediated:
- NB-1 two unused using directives stranded by the [P6-T14] test-file
split; no gate fires (CS8019 is hidden, IDE0005 is not wired into
these non-SDK projects), so this is fixed on next touch instead of
spinning a remediation cycle for it.
- NB-2 residual bookkeeping for the flaky-test promotion, resolved by
the orchestrator: the promoted document could not ride this branch
under the epic's docs/features/potential/** prohibition, and
potential_to_issue had copied only its Summary section, so the full
analysis was posted to issue #584 as a comment and the untracked
local copy removed. Issue #584 is the durable record.
- NB-3 traceability note for the AC-12/AC-16 supersession (one appended
csproj line to two, 485 to 486), pre-authorized by the spec's split
provision and evidenced in evidence/other/test-file-size.
Also records two orchestrator memories learned on this run: that
potential_to_issue retains only the Summary section, and that an epic
kickoff's measured facts require independent verification.
Refs #449, #584
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds the three review artifacts for issue #445 produced against
commit 1292b4c: policy-audit, code-review, and feature-audit, all
timestamped 2026-08-22T11-30.
Outcome: 0 Blocking and 0 blocking-PARTIAL findings, all 21 acceptance
criteria PASS, ready to merge. Four advisory findings are recorded and
dispositioned non-blocking: the coverage-delta flipped lines are not
localized, AC18's literal text diverges from the agent-memory carve-out
the plan grants at P4-T3, two pre-existing unused usings survive in
KaChar.cs and IKbdAction.cs, and the repository-wide coverage shortfall
predates this change.
The review independently traced the blast radius of the new empty-probe
precondition and found no production path that reaches the throw:
keyboard filter probes are always length 1 or greater because the
append precedes the probe, indexer probes use registered non-empty
keys, and Remove and Add route through StoredKeyEquals rather than
KeyEquals.
No remediation-inputs artifact was produced because no cycle was
required.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ler-latent-defects-449-exec
fix(quickfiler): repair three QfcExplorerController latent defects and remove its coverage exclusion (#449)
…contract-defects-445-exec
fix(quickfiler): repair three keyboard-action contract defects (#445)
…form-491-exec
fix(quickfiler-test): remove dead live-Form types from QuickFiler.Test and add a permanent structural guard (#491)
…ion (#589)
During epic child #449's PR authoring, mcp__drm-copilot__collect_pr_context
returned ok:true with worktree artifact paths, wrote nothing there, and
wrote instead into the main checkout -- a location shared by every
concurrently running epic child. Sibling child #491 overwrote the file in
the interval between collection and use, so the copied context described
#491's branch, commits, and evidence folder.
The contamination was caught by comparing the summary's resolved head SHA
against HEAD before authoring. Presence and mtime checks both pass on a
sibling's file, so ownership verification is the only reliable guard.
Also records two further defects confirmed in the same bundle: a false
"GitHub CLI is not installed" report while gh was working in the same
session, and an author-asserted autoclose list containing AC-1..AC-16
scraped as issue numbers alongside issues not owned by the child.
The tool defect itself is tracked as issue #589.
Refs #449, #589
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ler-latent-defects-449-exec
chore(agent-memory): record collect_pr_context cross-child contamination (#589)
…_pr_context defects
Two durable findings from epic child #445, both correcting earlier
memory that was pessimistic or incomplete.
The routing-contract completion gate's receipt shape is no longer
undiscoverable. Get-CheckpointAcknowledgedName in
.claude/lib/orchestrator-state/OrchestratorStateRoutingContract.psm1
reads a hard-coded 'evidence' member, so a skill or MCP receipt counts
only when its name is a non-blank string, its flag is boolean true, and
it carries a non-blank evidence string. Earlier runs guessed at alias
key names and never supplied evidence, which is why the gate kept
reporting the same receipts missing.
Get-ResolvedRequiredMcpTool swaps new_potential_entry for
new_potential_bug_entry on a bug route, and the MCP TypeScript surface
does not. Because required_mcp_tools is compared by exact list
equality, no single list satisfies both validators on a bug route. The
hook is authoritative, so conform to it and expect two residual MCP
errors.
Together these supersede the earlier conclusion that --require-complete
is simply unsatisfiable for a resumed-at-execution epic child: the real
termination gate now returns EXIT_CODE 0.
The collect_pr_context entry is expanded with two defects beyond
misplacement: it reports gh unavailable when gh is authenticated, and
the primary checkout it writes into sits on a different branch, so its
diff is not the branch under review. The remedy is to author the PR
body from real git data rather than to copy the artifact.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Children 449 (PR #585, follow-up #590), 445 (PR #587), and 491 (PR #588)
are merged; each merge commit was confirmed reachable from the fetched
integration head rather than taken from a completion notification. Child
511 remains in atomic execution.
Records seven carried findings, two of which correct this epic's own
inputs: epic.md misattributed QuickFiler/Legacy/QuickFileController.cs's
1,065 lines to QuickFiler/Controllers/QfcExplorerController.cs (182 lines
after change, and the legacy file has zero compile references), and
collect_pr_context writes into the shared main checkout, letting one
child overwrite a sibling's PR context (issue #589).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHj7wjLweuwfAP8NDA4iiP
…m-foundation-integration' into bug/quickfiler-keyboard-action-contract-defects-445-exec
# Conflicts:
#	.claude/agent-memory/orchestrator/collect-pr-context-lands-in-main-checkout.md
…contract-defects-445-exec
chore(agent-memory): record completion-gate receipt shape and collect_pr_context defects (#445 follow-up)
…nism
Confirms PR #591 (agent-memory only) reachable from the integration head
and issue #583 filed. Replaces the analyzer-skew finding with the measured
mechanism: packages.config pins Meziantou 3.0.174 / Roslynator 4.16.1 while
16 and 64 csproj Analyzer Include paths respectively still point at 3.0.156
and 4.16.0. CI is green only because _build-analyzers.yml declares
restore-keys fallback nuget-<os>-, which restores an older cache still
holding those directories. origin/main carries the identical skew, so the
final integration pull request is no worse than main, but it fails with
CS0006 the first time that cache entry is evicted.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHj7wjLweuwfAP8NDA4iiP
Child #511/#571 halted with its premise falsified: ItemViewer's constructor
runs ISupportInitialize BeginInit/EndInit on both WebView2 children, EndInit
creates their handles, and WinForms creates the parent's handle when a
child's is created -- so the viewer's handle exists before any harness code
runs and the proposed handle-forcing remedy is a measured no-op. Verified
independently against ItemViewer.Designer.cs:89-90 and :6166-6167.
The real failure is a 60,000 ms PumpTimeoutMs expiry under CPU contention,
filed as #592. The epic forbade every remedy that plausibly addresses it,
because those constraints were chosen against the misdiagnosed cause.
Decision recorded: deliver the three merged children and descope #511. The
final integration pull request closes 445, 449 and 491 only; 511 and 571
stay open. Epic completion requirement 1 is therefore not satisfied by
design, and the epic is reported as delivered-with-one-child-descoped.
Also files #593 (blocked_reason enum cannot express a premise-falsified
halt, which the merge_status enum shares) and #594 (three pre-existing
UtilitiesCS.Test flakes).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UHj7wjLweuwfAP8NDA4iiP
Sign up for freeto 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.

Bug: quickfiler-test-form1-live-form Bug: quickfiler-explorer-controller-latent-defects Bug: quickfiler-keyboard-action-contract-defects

1 participant

@drmoisan