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
Conversation
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
…ard against live forms (#491)
…rification and final plan checklist state (#491)
…locking the live-form guard (#491)
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
quickfiler-suite-determinism-foundationepic integration branch intomain, delivering three of four planned children: Bug: quickfiler-keyboard-action-contract-defects #445 (keyboard-action contract defects), Bug: quickfiler-explorer-controller-latent-defects #449 (explorer-controller latent defects), and Bug: quickfiler-test-form1-live-form #491 (live form in the test assembly).QuickFiler.Testassembly and adds a structural guard so no form-derived type can be reintroduced there. A unit-test run no longer constructs a window from this assembly.DelegateTypereportedtypeof(Action<Keys>)on a type that stores anAction<char>.QfcExplorerController, with a new test harness where none existed.epic-status.mdprojection, all three children's evidence and audit artifacts, and the agent-memory learnings recorded during preparation.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
QuickFiler.Test/Form1.cs,Form1.Designer.cs, andForm1.resx.QuickFiler.Test/NoLiveFormInTestAssemblyTests.cswith the structural guardExecutingAssembly_ContainsNoFormDerivedType.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.KeyEqualsgated branches 1 and 2 onActivatedbut 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 aSubstringcall with a start index of-1and threw, or silently matched every registered action. It now rejectsnulland empty explicitly from a guard above theContainstest.KaChar.DelegateTypereturnedtypeof(Action<Keys>)while storing anAction<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 deadUpdateproperty is likewise removed fromKaChar,KaCharAsync,KaKey, andKaKeyAsync, and retained onKaStringAsync, which reads it. Both commented-out members are deleted fromIKbdAction; its four live members are byte-identical, so no implementer signature moves.Core: #449 — explorer-controller latent defects
QuickFiler/Controllers/QfcExplorerController.cs, plus removal of a block of dead duplicated code.QfcExplorerControllerTests.csandQfcExplorerController.ConversationViewTests.cs, with the corresponding<Compile Include>entries appended to theControllersitem group.Shared surface
QuickFiler.Test/QuickFiler.Test.csprojis a legacy non-SDK project with explicit compile entries, so two children had to edit it concurrently. Regions were partitioned in advance: #491 owned theForm1compile and embedded-resource entries, #449 owned appendedControllersentries. Verified after fan-in: zeroForm1references remain and both explorer test files are registered.Docs and evidence
The epic manifest, the generated
epic-status.mdprojection, each child's spec, research, approved plan, evidence artifacts, andfeature-reviewaudit artifacts (policy-audit, code-review, feature-audit).Architecture / How It Fits Together
No architectural change.
IKbdActionis narrowed by deleting two commented-out members and removing orphaned public API from its implementers; the live contract surface is unchanged.IQfcExplorerControlleris 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, thenvstestwith coverage. Each child then passedfeature-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:
#491's acceptance criterion for coverage is the one criterion left unchecked across all three children.
feature-reviewre-derived the figure directly from the committed Cobertura XML and found zero own-effect: noQuickFiler.Testclass 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.ymltriggerspull_requestonly 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
vstestrequires/InIsolation:Omitting
/InIsolationcauses each assembly'sapp.configbinding redirects to be ignored and fabricates roughly 1,695 phantom failures with empty messages, surfacing as a MoqTypeInitializationException. 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.RunPumpThreadcallsApplication.Run(new ApplicationContext())without ever adding a form or control, so no window handle exists whenControl.Invokeis reached.That premise is false.
ItemViewer's constructor callsInitializeComponent, which runs((ISupportInitialize)…).BeginInit()/.EndInit()on both WebView2 children (QuickFiler/Viewers/ItemViewer.Designer.cs:89-90and:6166-6167).EndInitcreates 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 barenew QuickFiler.ItemViewer()on the pump thread — no harness, noSaveParameters, no.Handleread — already reports both children handle-created. The proposed remedy forces a handle that already exists.The real failure is a 60,000 ms
PumpTimeoutMsexpiry 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-execat commit53a2a08f, 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
IKbdActionnarrows. Two commented-out members are deleted. Its four live members are byte-identical, so no implementer signature moves.DelegateTypeandUpdateare removed fromKaChar,KaCharAsync,KaKey, andKaKeyAsync. Both were orphaned public API with no caller; a repository-wide search over*.csreturns zero hits forDelegateType.Updateis retained onKaStringAsync, which reads it.KeyEqualsnow throws onnulland empty input where it previously threwArgumentOutOfRangeExceptionor silently matched everything. Any caller relying on the silent-match behaviour changes.QuickFiler.Test.Form1andQfcHomeControllerTests+QfcFormViewerDerivedare deleted. Both were dead; neither had callers.Risks and Mitigations
packages.configpins 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.ymldeclares arestore-keys: nuget-<os>-fallback that restores an older cache still holding them.origin/maincarries the identical skew, so this pull request is no worse thanmain, but it fails witherror CS0006the first time GitHub evicts that cache entry. If this pull request goes red onbuild-analyzersorbuild-nullablewith 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.docs/features/archivealready carries individual coverage XML files of 30 to 44 MB — but a repository-wide policy on raw test-result artifacts is worth deciding separately.collect_pr_contextwrites 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
QuickFiler/Interfaces/IKbdAction.csand the fourKa*controllers — the only public-contract change.QuickFiler/Controllers/KaStringAsync.cs— theActivatedgating and the empty-probe guard carry the behavioural decisions.QuickFiler/Controllers/QfcExplorerController.csandQuickFiler/Interfaces/IQfcExplorerController.cs.QuickFiler.Test/QuickFiler.Test.csproj— confirm the two partitioned regions merged cleanly.QuickFiler.Test/NoLiveFormInTestAssemblyTests.cs— the structural guard.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.docs/is evidence and audit artifacts; skim rather than read.Follow-ups
Open and deliberately not closed by this pull request:
QfcItemControllertests expire at the 60sPumpTimeoutMsunder CPU contention. The real defect.KaStringAsync.KeyEqualsbranch 1 computes a prefix-onlySubstringoffset under aContainsguard.UiThread.Dispatchernull race.UtilitiesCS.Test/ResourceTests.csconstructsUtilitiesCS.Test/Form1. Same hazard class as Bug: quickfiler-test-form1-live-form #491, different assembly, out of scope here.collect_pr_contextwrites to a shared path and races across concurrent children.blocked_reasonenum cannot express a premise-falsified halt.UtilitiesCS.Testflakes block any suite-wide zero-failure gate.Known and accepted in this pull request: two unused
usingdirectives at the top ofQuickFiler.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