From c83b6a965d9283cb28a03d74fc8c2e40b4908de0 Mon Sep 17 00:00:00 2001 From: Dan Moisan Date: Fri, 9 Oct 2026 14:35:06 -0400 Subject: [PATCH 1/5] fix(deps): declare borrowed test packages and sync transitive binding redirects (#985) Declare Microsoft.Web.WebView2 and ObjectListView.Official in the test manifests that borrowed them, remove the duplicate WebView2.Core reference group from QuickFiler.Test, add an unconditional solution-wide binding-redirect sync pass (BindingRedirectSync.psm1) wired into Repair-PackageManifestConsistency.ps1, and add a Pester gate that fails when a project hint-paths a package its own manifest does not declare. Evidence under the feature folder. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Gw2R64FrQkj5f88mFAe3KA --- .../agent-memory/atomic-executor/MEMORY.md | 171 +---- .../atomic-executor/index_overflow_entries.md | 173 +++++ ..._absent_on_failure_voids_flaky_carveout.md | 21 + .claude/agent-memory/atomic-planner/MEMORY.md | 118 +--- .../index_preflight_seams_900_to_973.md | 82 +++ ...hearsal_fidelity_and_hygiene_path_seams.md | 17 + .../agent-memory/task-researcher/MEMORY.md | 357 +--------- .../index_epic136_percoverage_children.md | 44 ++ .../index_quickfiler_efc_defects.md | 49 ++ ...t_repair_workflow_run_script_source_985.md | 12 + QuickFiler.Test/QuickFiler.Test.csproj | 5 - QuickFiler.Test/packages.config | 2 + TaskTree.Test/packages.config | 1 + UtilitiesCS.Test/packages.config | 1 + .../baseline/cs-analyzers.2026-10-09T14-04.md | 15 + .../baseline/cs-format.2026-10-09T14-04.md | 10 + .../baseline/cs-nullable.2026-10-09T14-04.md | 14 + .../baseline/cs-restore.2026-10-09T14-04.md | 9 + .../baseline/cs-test.2026-10-09T14-11.md | 19 + .../git-and-tools.2026-10-09T14-04.md | 47 ++ .../helper-scripts.2026-10-09T14-04.md | 20 + ...erage-baseline.2026-10-09T14-11.jacoco.xml | 38 ++ ...rage-baseline.2026-10-09T14-11.summary.txt | 5 + .../baseline/phase0-instructions-read.md | 25 + ...ost-baseline-porcelain.2026-10-09T14-13.md | 27 + .../baseline/ps-analyze.2026-10-09T14-04.md | 10 + .../baseline/ps-coverage.2026-10-09T14-04.md | 57 ++ .../baseline/ps-format.2026-10-09T14-04.md | 12 + .../baseline/ps-test-mcp.2026-10-09T14-04.md | 19 + .../baseline/tree-facts.2026-10-09T14-04.md | 26 + .../line-counts-post-impl.2026-10-09T14-20.md | 27 + .../manifest-edit-facts.2026-10-09T14-17.md | 50 ++ .../whatif-live-tree.2026-10-09T14-21.md | 49 ++ ...rage-comparison-csharp.2026-10-09T14-31.md | 13 + ...-comparison-powershell.2026-10-09T14-26.md | 14 + .../qa-gates/cs-analyzers.2026-10-09T14-30.md | 14 + .../qa-gates/cs-format.2026-10-09T14-30.md | 11 + .../qa-gates/cs-nullable.2026-10-09T14-30.md | 14 + .../qa-gates/cs-restore.2026-10-09T14-30.md | 10 + .../qa-gates/cs-test.2026-10-09T14-31.md | 20 + ...coverage-final.2026-10-09T14-31.jacoco.xml | 38 ++ ...overage-final.2026-10-09T14-31.summary.txt | 5 + .../qa-gates/ps-analyze.2026-10-09T14-25.md | 13 + .../qa-gates/ps-analyze.2026-10-09T14-26.md | 11 + .../qa-gates/ps-coverage.2026-10-09T14-26.md | 39 ++ .../qa-gates/ps-format.2026-10-09T14-25.md | 16 + .../qa-gates/ps-format.2026-10-09T14-26.md | 16 + .../ps-line-counts.2026-10-09T14-26.md | 12 + .../ps-temp-file-audit.2026-10-09T14-26.md | 12 + .../qa-gates/ps-test-mcp.2026-10-09T14-26.md | 22 + .../workflows-untouched.2026-10-09T14-31.md | 10 + ...fore-orphaned-hintpath.2026-10-09T14-15.md | 30 + ...l-before-redirect-sync.2026-10-09T14-15.md | 27 + ...fter-orphaned-hintpath.2026-10-09T14-17.md | 11 + ...ss-after-redirect-sync.2026-10-09T14-21.md | 14 + .../issue.md | 68 ++ .../plan.2026-10-09T13-06.md | 643 ++++++++++++++++++ .../research/research.2026-10-09T14-10.md | 324 +++++++++ .../spec.md | 217 ++++++ scripts/dependencies/BindingRedirectSync.psm1 | 306 +++++++++ .../Repair-PackageManifestConsistency.ps1 | 22 +- .../BindingRedirectSync.Tests.ps1 | 358 ++++++++++ ...ManifestConsistency.RedirectSync.Tests.ps1 | 187 +++++ .../RepositoryTreeConsistency.Tests.ps1 | 26 + 64 files changed, 3446 insertions(+), 609 deletions(-) create mode 100644 .claude/agent-memory/atomic-executor/index_overflow_entries.md create mode 100644 .claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md create mode 100644 .claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md create mode 100644 .claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md create mode 100644 .claude/agent-memory/task-researcher/index_epic136_percoverage_children.md create mode 100644 .claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md create mode 100644 .claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-analyzers.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-format.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-nullable.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-restore.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-test.2026-10-09T14-11.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/git-and-tools.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/helper-scripts.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.jacoco.xml create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.summary.txt create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/phase0-instructions-read.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/post-baseline-porcelain.2026-10-09T14-13.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-analyze.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-coverage.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-format.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-test-mcp.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/tree-facts.2026-10-09T14-04.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/line-counts-post-impl.2026-10-09T14-20.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/manifest-edit-facts.2026-10-09T14-17.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/whatif-live-tree.2026-10-09T14-21.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-csharp.2026-10-09T14-31.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-powershell.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-analyzers.2026-10-09T14-30.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-format.2026-10-09T14-30.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-nullable.2026-10-09T14-30.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-restore.2026-10-09T14-30.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-test.2026-10-09T14-31.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.jacoco.xml create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.summary.txt create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-25.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-coverage.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-25.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-line-counts.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-temp-file-audit.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-test-mcp.2026-10-09T14-26.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/workflows-untouched.2026-10-09T14-31.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-orphaned-hintpath.2026-10-09T14-15.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-redirect-sync.2026-10-09T14-15.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-orphaned-hintpath.2026-10-09T14-17.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-redirect-sync.2026-10-09T14-21.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/issue.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/plan.2026-10-09T13-06.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/research/research.2026-10-09T14-10.md create mode 100644 docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/spec.md create mode 100644 scripts/dependencies/BindingRedirectSync.psm1 create mode 100644 tests/scripts/dependencies/BindingRedirectSync.Tests.ps1 create mode 100644 tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 diff --git a/.claude/agent-memory/atomic-executor/MEMORY.md b/.claude/agent-memory/atomic-executor/MEMORY.md index 886714bad..43e2febdf 100644 --- a/.claude/agent-memory/atomic-executor/MEMORY.md +++ b/.claude/agent-memory/atomic-executor/MEMORY.md @@ -33,6 +33,7 @@ - [Restart re-enters pre-commit census; closed class lists](project_restart_loop_reenters_precommit_census_and_closed_classification_lists.md) (follow restart arrows post-commit and into pass 2; map every census line) - [gh/CI-log traps](project_gh_ci_log_and_download_gotchas.md) (createdAt trips pr-author hook; ANSI in Pester log; gh download never overwrites) · [Abbreviated caller facts](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) +- [MSTest summary absent on failure](project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md) (flaky carve-out keyed on summary never fires; read the trx) - [Generic seam over embedded interop = CS1769](project_generic_seam_over_embedded_interop_type_cs1769.md) (Func seams compile in UtilitiesCS, fail at every test call site) ## Sub-indexes (open when the topic is in scope) - [Test isolation + C# coverage](index_test_isolation_and_coverage.md) — vstest/MSTest hangs, flakiness, Cobertura/dotnet-coverage/Koverage @@ -44,172 +45,4 @@ Four sections live in sub-index files to keep this file under its read limit. Op - [Test execution, isolation and coverage](index_test_execution_and_coverage.md) — long runs, flaky classes, dotnet-coverage and Cobertura mechanics - [Nullable / C# and component gotchas](index_csharp_and_components.md) — pragma gates, CS06xx/CS8xxx, WinForms/WebView2/QFC specifics - [Artifact hygiene and misc](index_artifact_hygiene_and_misc.md) — host-path leaks, TRX/msbuild sanitisation, hunk/numstat traps, PoshQC -- [Mid-plan commit sanitisation gate](project_midplan_commit_needs_capture_time_sanitisation_gate.md) · [Sanitisation can't sweep its own record](project_sanitisation_task_cannot_sweep_its_own_record.md) · [Code commit before format pass](project_code_commit_before_final_format_pass_orphans_rewrites.md) -- [Blocked Bash drops chained check-off](project_blocked_bash_command_silently_drops_chained_checkoff.md) · [Tool results inject "use Bash"](project_tool_results_inject_bash_read_edit_instruction.md) -- [CSharpier chain-wrap defeats line gates](project_csharpier_chain_wrap_defeats_singleline_search_gates.md) · [Verify citations with numbered output](feedback_verify_line_citations_with_numbered_output.md) -- [Plan column widths may include the Markdown indent](project_plan_column_widths_may_include_markdown_indent.md) — re-measure in-file; cite Race.cs chain precedents -- [Authoring-time counts undercount](project_plan_authoring_time_token_counts_are_undercounts.md) · [Planner/executor see different worktrees](project_planner_and_executor_observe_different_worktrees.md) · [Caller-stated count drifts](project_caller_stated_preflight_count_drifts_before_execution.md) -- [Extract gate literals, never re-type](project_preflight_gate_literal_extract_from_plan_not_retype.md) · [Tool layer collapses `\`](project_tool_layer_collapses_double_backslash_in_file_content.md) -- [Self-derived thresholds are blind](project_preflight_selfderived_gate_thresholds_are_blind.md) · [Exact-count gate vs remediation loop](project_exact_count_gate_vs_remediation_loop.md) -- [Inline-dispatch harness citation](project_inline_dispatch_harness_citation_makes_execution_time_test_vacuous.md) · ["Skip the pointless drain"](project_preflight_drain_scope_optimization_note_makes_test_vacuous.md) -- [Multi-pattern gates detach qualifiers](project_multipattern_gate_shared_qualifier_detachment.md) · [Zero-hit gate hits doc comments](project_banned_api_zero_hit_gate_hits_doc_comments.md) -- [Follow-up promotion is unexecutable](project_followup_promotion_task_is_unexecutable_by_executor.md) · [Supersede leaves a routing residual](project_supersede_clause_leaves_hard_routing_residual.md) -- [Delegation with no dispatch tool](project_plan_delegation_to_typed_engineer_without_dispatch_tool.md) -- [Check-off fixpoint breaks clean-tree gates](project_plan_checkoff_fixpoint_breaks_terminal_clean_tree_gate.md) · [Tracked agent-memory breaks unscoped gates](project_agent_memory_tracked_breaks_unscoped_git_gates.md) -- [Merge-base diffs need a commit cadence](project_preflight_mergebase_diff_gates_need_commit_cadence.md) · [BASELINE_SHA conflates the merged base](project_baseline_sha_diff_conflates_merged_base.md) -- [Epic child branch: inherited commits](project_epic_child_branch_anchored_diff_lists_inherited_commits.md) · [Moving-base two-dot diff inertness](project_preflight_moving_base_two_dot_diff_inertness_test.md) -- [Inserted tasks force renumbering](project_plan_task_ids_digit_only_forces_renumbering.md) · [Rationale clauses are evidence](project_418_plan_rationale_clauses_are_evidence.md) -- [Bugfix phase grows the file](project_bugfix_phase_grows_the_file_despite_dead_code_removal.md) · [#418 500-line gate vs plan content](project_418_500line_gate_vs_plan_content.md) -- [AC check-off + tool-output paths](project_preflight_ac_checkoff_and_tooloutput_paths.md) · [Orchestrator override ≠ an AC](project_orchestrator_override_does_not_satisfy_an_ac.md) -- [Output Summary breaks its count gate](project_artifact_output_summary_breaks_its_own_exact_count_gate.md) · [Scope gate can't list later artifacts](project_scope_gate_cannot_list_artifacts_written_after_it.md) -- [Zero gate on a sibling-owned assembly](project_preflight_absolute_zero_gate_on_sibling_owned_assembly.md) · [Directory-scoped format breaks ownership](project_directory_scoped_format_breaks_ownership_gates.md) -- [#207 Hook() breaks AppEventsTests](project_207_hook_redesign_breaks_appeventstests.md) · [C2 capacity budget drifts](project_c2_capacity_budget_drifts_mid_plan.md) -- [AppGlobalsTests at the 500-line ceiling](project_appglobalstests_at_500_line_ceiling.md) · [#376 scope-expansion layers](project_376_capstone_scope_expansion_layers.md) -- [Swordfish F5 misclassification](project_swordfish_f5_test_misclassification.md) · [Confirmatory preflight: proportionate bar](feedback_confirmatory_preflight_proportionate_bar.md) -- [Four recurring C# defect classes](project_preflight_recurring_csharp_plan_defect_classes.md) · [msbuild-log grep hits the csc line](project_msbuild_log_token_search_matches_csc_command_line.md) -- [Epic base invalidates line counts](project_epic_integration_base_invalidates_research_line_counts.md) · ["Make the citation exist" spreads false facts](project_preflight_citation_match_propagates_false_fact.md) -- [Check-off cites a LATER artifact](project_preflight_checkoff_cites_later_task_artifact.md) · [Pre-edit gate cites the post-edit table](project_preedit_gate_cites_postedit_replacement_table.md) -- [Conjunctive criteria break one-artifact citation](project_preflight_conjunctive_criterion_citation_gap.md) · [Delta gate cites an unrecorded baseline count](project_gate_cites_a_baseline_count_the_baseline_task_never_records.md) -- [Blanket assertions + forward deps](project_preflight_blanket_assertion_and_forward_dependency.md) · [pwsh -Command quoting boundary](project_pwsh_command_quoting_boundary.md) -- [Locators stale after a doc edit](project_plan_line_locators_stale_after_doc_edit.md) · [csproj ranges shift during execution](project_plan_csproj_line_ranges_shift_during_execution.md) -- [Probe C# shapes with csc](project_preflight_csc_probe_for_mandated_csharp_shapes.md) · [Evidence fields need a token scan](project_preflight_evidence_field_token_scan.md) -- [Literals inherit research arithmetic](project_plan_literal_assertions_inherit_research_arithmetic.md) · [Fix tasks inherit the round's rules](project_preflight_fix_tasks_inherit_decomposition_rules.md) -- [Conditional split = three tasks](project_conditional_split_three_task_shape.md) · [Round-over-round plan diff unavailable](project_preflight_round_over_round_diff_unavailable.md) -- [Flaky carve-out added to one task only](project_flaky_test_carveout_added_to_one_task_only.md) · [Revision bullet negates an earlier clause](project_revision_bullet_negates_earlier_clause_left_standing.md) -- [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) · [Hygiene scan: comma precedence + d:\s hits](project_hygiene_pattern_array_comma_precedence_and_regex_token_hits.md) -- [Loop re-runs vs one-artifact glob + hash anchors](project_loop_iteration_vs_single_artifact_glob_and_hash_anchor.md) -- [Route-keyed branches miss derived-flag cases](project_outcome_branch_sets_keyed_on_route_miss_derived_flag_cases.md) · [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) - -## Build / toolchain environment -- [pwsh/git/gh gotchas](project_pwsh_git_gh_cli_gotchas.md) · [Build/Test env](project_build_test_env.md) · [VS18 paths](project_vs18_build_toolchain_paths.md) · [SDK + nullable Rebuild](project_repo_sdk_and_nullable_rebuild.md) -- [Fresh worktree restore](project_fresh_worktree_needs_sdk_and_packages_config_restore.md) · [Start-Process quoting](project_startprocess_arglist_array_strips_quoting.md) · [Relative pwsh paths](project_relative_path_in_pwsh_dotnet_io_hits_wrong_worktree.md) -- [QuickFiler.Test hang](project_quickfiler_test_coverage_hang_and_build_flags.md) · [$CoverageOutput clobber](project_dotsourcing_invoke_mstest_clobbers_coverageoutput_param.md) · [TestCaseFilter OR](project_vstest_testcasefilter_or_operator_and_env_setup.md) -- [File vs partial class](project_test_file_name_vs_partial_class_name.md) · [HintPath skew](project_analyzer_hintpath_skew_breaks_all_four_gates.md) · [Analyzer skew fresh](project_analyzer_version_skew_fresh_worktree.md) · [SecurityCodeScan](project_securitycodescan_roslyn56_incompat.md) -- [VSTO runtime](project_missing_vsto_runtime_breaks_baseline_gates.md) · [MSB3277](project_new_sln_member_surfaces_msb3277_pin_divergence.md) · [No transitive refs](project_legacy_csproj_no_transitive_compile_refs.md) · [CRLF](project_sln_csproj_edit_crlf_preserve.md) -- [Incremental vacuous](project_incremental_build_vacuous_baseline.md) · [Nullable /t:Build](project_nullable_build_gate_is_vacuous_incremental.md) · [Designer.cs skip](project_csharpier_skips_designer_cs_by_filename.md) · [*.log ignore](project_gitignore_star_log_blocks_committed_msbuild_log_evidence.md) -- [pipe-files](project_csharpier_pipefiles_nonenforcing_gate.md) · [Count idioms](project_count_idiom_pitfalls_csharpier_and_measureobject.md) · [New .cs restart](project_new_cs_files_guarantee_a_format_loop_restart.md) · [PS BOM](powershell-bom-required.md) -- [BOM grep ^](project_bom_grep_anchor_false_negative.md) · [StrictMode XML attr](project_pester_strictmode_xml_attribute_property_access.md) · [Pester helper BeforeAll](project_pester5_helper_function_must_live_in_beforeall.md) -- [-NoExecute premise](project_noexecute_early_return_premise_hides_reachable_entry_point_tests.md) · [poshqc test no verdict](project_poshqc_pester_mcp_exit_minus1.md) · [analyze exit 1](project_poshqc_analyze_exit1_on_warning.md) -- [Pester 5 result shape](project_pester5_result_shape_container_tests_and_ci_codecoverage.md) · [Heredoc \\](project_bash_heredoc_collapses_doubled_backslashes.md) · [Unquoted backslash](project_unquoted_backslash_in_bash_arg_silently_redirects_output.md) -- [Doubled backslash](project_doubled_backslash_dedoubles_bash_to_native_exe.md) · [Recursive delete](project_recursive_delete_idioms_blocked_use_dotnet_api.md) · [pwsh -Command quoting](project_pwsh_command_quoting_from_bash.md) -- [pwsh -File list](project_pwsh_file_array_param_from_bash.md) · [Compile-red refs](project_compile_red_needs_body_level_references.md) · [Splat gates](project_cross_task_shell_variable_splat_gate.md) -- [ collision](project_evidence_timestamp_collision_clobbers_artifacts.md) · [Floating ](project_shared_evidence_artifact_floating_ts.md) - -## Test execution & isolation -- [Detached long runs](project_long_runs_need_detached_process.md) · [Mock GUI](feedback_tests_must_mock_gui_no_visible_window.md) · [Suite hangs](project_full_suite_run_hangs_while_earlier_runs_idle.md) -- [PumpHost flaky](project_winformspumphost_tests_load_flaky.md) · [/InIsolation](project_vstest_isolation_and_filepathhelper_serialization.md) -- [Timed-out runner](project_timedout_mstest_leaves_detached_runner.md) · [Sibling tooling](project_sibling_worktree_shared_tooling_hazard.md) · [Concurrent executor](project_concurrent_executor_same_worktree.md) -- [coverage deadlock](project_concurrent_dotnet_coverage_deadlock_and_doccomment_retention_gate.md) · [UtilitiesCS parallel](project_utilitiescs_test_parallelism_flakiness.md) · [DoNotParallelize](project_mstest_donotparallelize_overlaps_parallel_bucket.md) -- [MemoryAppender per TYPE](project_log4net_memoryappender_shared_per_type_across_parallel_classes.md) · [Dispatcher swap race](project_uithread_dispatcher_static_swap_race.md) · [DataCollector default](project_runsettings_datacollector_default_enabled.md) -- [Deedle/FSharp](project_dotnet_coverage_deedle_fsharp_instrumentation.md) · [DispatcherDelay hangs](project_dispatcherdelay_hangs_unit_tests.md) · [ConfigController STA](project_configcontroller_sta_pump_deadlock.md) - -## Coverage measurement -- C# coverage mechanics (Cobertura, Koverage, denominators): see the sub-index at the top -- [Package-rate not-lower gate vs variance](project_package_rate_not_lower_gate_trips_on_unrelated_file_variance.md) — unrelated-file variance fails package/repo not-lower gates on small-delta items -- [Cobertura hits are binary](project_dotnet_coverage_cobertura_hits_are_binary.md) — dotnet-coverage hits are 0/1; "guard hits > record hits" can never hold; use the guard line's condition-coverage - -## Nullable / C# language -- [Pragma gate](project_nullable_pragma_gate_mechanics.md) · [net481 pragma](project_nullable_pragma_gate_net481_mechanics.md) · [Epic pragma](project_nullable_epic_pragma_gate_and_analyzer_restore.md) -- [CLAUDE.md != CI](project_507_nullconditional_return_triggers_cs8603_under_genuine_nullable_check.md) · [Annotations](project_nullable_remediation_annotation_patterns.md) · [CS8632](project_nullable_annotation_cs8632_scoping.md) · [CS8714](project_nullable_cs8714_not_on_net481.md) -- [CS0518](project_record_struct_isexternalinit_netfx.md) · Closed issues and component gotchas: see the sub-index at the top - -## Artifact hygiene & misc mechanics -- [No host paths](../_shared_no_absolute_host_paths.md) · [Never predict](feedback_never_predict_an_observation_into_an_artifact.md) · [ drift](project_evidence_timestamp_labels_drift_ahead_of_write_time.md) · [Probe literal](project_selftest_probe_literal_trips_the_next_sweep_pass.md) -- [TRX case](project_trx_sanitisation_must_be_case_insensitive.md) · [TRX/msbuild sanitise](project_vstest_trx_evidence_needs_sanitisation_task.md) · [msbuild 2 roots](project_msbuild_log_has_two_absolute_path_leak_classes.md) · [Deploy_ leaks](project_mstest_deploy_dir_leaks_tokens_on_failing_runs.md) -- [Two .coverage](project_vstest_emits_two_coverage_files_per_run.md) · [No Failed line](project_vstest_success_run_prints_no_failed_or_skipped_line.md) · [Scratch .ps1](project_powershell_scratch_script_budget_hook_blocks_helpers.md) · [Mandated .ps1](project_plan_mandated_ps1_helpers_collide_with_budget_cap_and_frozen_porcelain_gate.md) -- [2nd pass fields](project_appending_a_second_pass_must_not_qualify_schema_fields.md) · [env -C](project_bash_cwd_resets_use_env_dash_c.md) · [global.json cwd](project_dotnet_global_json_cwd_search_vs_bash_discipline.md) · [pwsh -File root](project_pwsh_file_starts_in_session_root_needs_workingdirectory.md) -- [pwsh stdin REPL](project_pwsh_stdin_repl_mode_and_nonascii_mangling.md) · [Isolation guard](project_worktree_isolation_guard_refuses_pwsh_from_bash.md) · [Branch gate fix](project_changed_line_coverage_branch_gate_invalidated_by_the_fix.md) -- [ExpectedExitCode](project_expectedexitcode_declared_from_baseline_not_observed_run.md) · [Blank before comment](project_csharpier_requires_blank_line_before_comment_breaking_numstat_bounds.md) · [this-lambdas](project_excludefromcodecoverage_misses_this_capturing_lambdas.md) -- [Koverage separators](project_koverage_reporoot_needs_native_separators.md) · [FakeTimeProvider zero](project_faketimeprovider_zero_duetime_fires_at_creation.md) · [Reflective read](project_reflective_property_read_escapes_member_expression_grep.md) -- [Preparation mode](project_preparation_mode_flips_anchored_diff_gate_membership.md) · [git grep -c oracle](project_git_grep_c_empty_is_the_allowlisted_line_count_oracle.md) · [Fallback orphans](project_contingency_fallback_orphans_downstream_hardcoded_paths.md) -- [Per-comment literal](project_stale_citation_gate_literal_must_match_the_comments_legitimate_citations.md) · [TimeoutAfter race](project_timeoutafter_iscompleted_shortcircuit_loses_to_taskrun_race.md) · [Cobertura class nodes](project_cobertura_filename_maps_to_several_class_nodes.md) -- [Logger double-counts](project_msbuild_filelogger_double_counts_each_warning.md) · [Reconciliation merge](project_orchestrator_reconciliation_merge_tracks_feature_docs.md) · [Seam sentences](project_preflight_seam_sentences_outlive_a_removed_member.md) -- [Compile items](project_explicit_compile_items_decide_membership_not_file_presence.md) · [git add -N](project_intent_to_add_span_defeats_do_not_stage_invariant.md) · [Hunk header](project_git_hunk_header_literal_slides_past_blank_line.md) -- [Budget hook out-of-root](project_batch_budget_hook_discards_out_of_root_powershell_writes.md) · [BOM .cs numstat](project_bom_bearing_cs_files_and_prerestore_numstat_head_gates.md) · [CLAUDE.md per worktree](project_claude_md_differs_between_worktrees_read_execution_copy.md) -- [Token kill own shells](project_commandline_match_on_results_dir_token_kills_own_tool_shells.md) · [No .vsto](project_commandline_rebuild_omits_vsto_manifests_addin_cannot_load.md) · [git show ibm437](project_conservation_gate_git_show_decodes_ibm437_and_keeps_bom.md) -- [$LASTEXITCODE StrictMode](project_coverage_helpers_dotsource_strictmode_lastexitcode_throws.md) · [Exactly-once literal](project_exactly_once_literal_clause_conflicts_with_pattern_containment_clause.md) · [Sibling test file](project_fixed_run_path_coverage_gate_blind_to_sibling_test_file.md) -- [Promotion rename](project_footprint_inventory_clause_omits_inherited_promotion_rename.md) · [AC count claim](project_handoff_stated_ac_count_contradicts_the_ac_source_file.md) · [Kill by PID](project_killing_a_build_lock_waiter_by_script_name_hits_every_sibling.md) -- [Malformed payload](project_malformed_pwsh_payload_surfaces_as_unrelated_hook_block.md) · [Blank line binding](project_mandatory_string_array_param_rejects_blank_line_turning_red_into_binding_error.md) · [Whole-file hunk](project_mergebase_diff_over_branch_created_file_is_whole_file_hunk.md) -- [Mid-plan commit spans](project_midplan_commit_breaks_deletion_staging_and_porcelain_spans.md) · [Minute timestamps](project_minute_resolution_timestamp_cannot_be_strictly_increasing.md) · [/m N> prefix](project_msbuild_parallel_log_node_prefix_defeats_anchored_target_counts.md) -- [Import-Module -Force](project_nested_import_module_force_unloads_session_wide.md) · [Hold-commits](project_parent_orchestrator_hold_commits_your_branch_midrun.md) · [Pester NotRun](project_pester_filtered_total_counts_notrun.md) -- [Auto-property guard](project_plan_mandated_autoproperty_with_setter_guard_is_not_expressible.md) · [PoshQC format rules](project_poshqc_format_rewrites_differ_from_invoke_formatter_defaults.md) · [PoshQC BOM/CRLF](project_poshqc_format_strips_bom_and_crlf_only_when_it_rewrites.md) -- [PS double-quote \\](project_powershell_double_quoted_backslash_defeats_msbuild_nonvacuity_grep.md) · [PSSA traps](project_psscriptanalyzer_traps_in_new_powershell_modules.md) · [$args param](project_pwsh_function_param_named_args_makes_msbuild_gate_vacuous.md) -- [Nested quotes $( )](project_pwsh_nested_quotes_in_subexpression_fail_to_parse.md) · [$Log/$log](project_pwsh_param_name_case_collision_flattens_log_array.md) · [Reference rewrite](project_reference_version_rewrite_when_assemblyversion_omitted.md) -- [Numstat elides](project_replacement_span_numstat_elides_identical_boundary_lines.md) · [Finding description](project_review_finding_line_number_right_description_wrong.md) · [Splatting lines](project_splatting_is_the_line_budget_lever_for_ceiling_bound_test_files.md) -- [-WhatIf module scope](project_whatif_does_not_reach_module_session_state.md) · [Removal hook: git + "remove"](project_worktree_removal_hooks_match_git_plus_remove_substring.md) -- [FluentAssertions truncates string diffs](project_fluentassertions_truncates_string_diff_breaks_message_substring_gates.md) — "…59Sandbox\origin": full-path MESSAGE substring gates cannot match -- [Cited-tree gate vs main; span enumeration](project_preflight_cited_tree_gate_and_span_enumeration.md) — intersect cited paths with the files main changed; every stop string needs a task that detects it -- [Field gate `Contains("EXIT_CODE:")` matches FORMAT_EXIT_CODE:](project_schema_field_contains_check_matches_prefixed_labels.md) — anchor the field match to the line start -- [Worktree-gate hook: git + "remove" in any identifier](project_worktree_removal_hook_matches_git_plus_remove_in_variable_names.md) — read-only payloads with `$removed` halt the run; flag at preflight -## Component-specific gotchas -- [WebView2 EndInit creates child handles](project_webview2_endinit_creates_handles.md) · [#349 breadcrumb WebView2](project_349_breadcrumb_webview2_gotchas.md) -- QFC #227: [cycle-4 ToggleFocus](project_qfc227_cycle4_toggle_focus_genuine_test_gotchas.md) · [cycle-3 seam](project_theme_folderpredictor_seam_retrofit_gotchas.md) -- [ObjectListView headless selection](project_objectlistview_treelistview_headless_selection.md) · [BackgroundWorker async-void race](project_qfc_backgroundworker_async_void_race.md) -- [QfcItemController needs SaveParameters](project_qfcitemcontroller_pump_harness_needs_saveparameters.md) · [TaskController (#297)](project_taskvisualization_taskcontroller_test_gotchas.md) -- [ProjectEntry setter raw MessageBox](project_projectentry_setter_raw_messagebox.md) · [IApplicationGlobals member forces implementers](project_iapplicationglobals_member_forces_implementers.md) -- [TimeProvider seam gotchas](project_timeprovider_seam_gotchas.md) · [GetOrLoad discards setter injection](project_initializer_getorload_discards_injection_when_dependency_null.md) -- [ScoDictionaryNew needs TryAdd](project_scodictionarynew_tryadd_not_add.md) · [Equal(params) has no because](project_fluentassertions_equal_params_no_because.md) · [BeEmpty names only the first item](project_fluentassertions_beempty_names_only_first_item.md) -## Artifact hygiene -- [Never embed absolute host paths](../_shared_no_absolute_host_paths.md) · [Never predict an observation](feedback_never_predict_an_observation_into_an_artifact.md) -- [ drifts ahead of write time](project_evidence_timestamp_labels_drift_ahead_of_write_time.md) · [Probe literal trips the NEXT sweep](project_selftest_probe_literal_trips_the_next_sweep_pass.md) -- [TRX sanitisation is case-insensitive](project_trx_sanitisation_must_be_case_insensitive.md) · [TRX/msbuild need a sanitisation micro-action](project_vstest_trx_evidence_needs_sanitisation_task.md) -- [MSBuild logs leak TWO roots](project_msbuild_log_has_two_absolute_path_leak_classes.md) · [Deploy_ leaks tokens on FAILING runs](project_mstest_deploy_dir_leaks_tokens_on_failing_runs.md) -- [vstest leaves TWO .coverage files](project_vstest_emits_two_coverage_files_per_run.md) · [Green run prints no Failed/Skipped line](project_vstest_success_run_prints_no_failed_or_skipped_line.md) -- [PS budget hook blocks scratch .ps1](project_powershell_scratch_script_budget_hook_blocks_helpers.md) · [Plan-mandated .ps1 + frozen porcelain gate](project_plan_mandated_ps1_helpers_collide_with_budget_cap_and_frozen_porcelain_gate.md) -- [2nd pass must not qualify schema fields](project_appending_a_second_pass_must_not_qualify_schema_fields.md) · [Bash resets cwd; use `env -C`](project_bash_cwd_resets_use_env_dash_c.md) -- [global.json cwd-search vs no-cd discipline](project_dotnet_global_json_cwd_search_vs_bash_discipline.md) · [pwsh -File starts in the SESSION root](project_pwsh_file_starts_in_session_root_needs_workingdirectory.md) -- [pwsh stdin is a REPL](project_pwsh_stdin_repl_mode_and_nonascii_mangling.md) · [Isolation guard refuses pwsh from Bash](project_worktree_isolation_guard_refuses_pwsh_from_bash.md) -- [ExpectedExitCode keyed off the baseline](project_expectedexitcode_declared_from_baseline_not_observed_run.md) · [Koverage -RepoRoot needs native separators](project_koverage_reporoot_needs_native_separators.md) -- [CSharpier forces a blank line before a comment](project_csharpier_requires_blank_line_before_comment_breaking_numstat_bounds.md) · [ExcludeFromCodeCoverage misses `this`-capturing lambdas](project_excludefromcodecoverage_misses_this_capturing_lambdas.md) -- [Koverage -RepoRoot needs native separators](project_koverage_reporoot_needs_native_separators.md) · [FakeTimeProvider zero due time fires at creation](project_faketimeprovider_zero_duetime_fires_at_creation.md) -- [Reflective property read escapes a member grep](project_reflective_property_read_escapes_member_expression_grep.md) · [Preparation mode flips anchored-diff membership](project_preparation_mode_flips_anchored_diff_gate_membership.md) -- [git grep -c with an empty pattern is the line-count oracle](project_git_grep_c_empty_is_the_allowlisted_line_count_oracle.md) - Read renders a phantom trailing line -- [Contingency fallback orphans downstream paths](project_contingency_fallback_orphans_downstream_hardcoded_paths.md) · [Stale-citation gate literal is per-comment](project_stale_citation_gate_literal_must_match_the_comments_legitimate_citations.md) -- [TimeoutAfter IsCompleted loses to the Task.Run race](project_timeoutafter_iscompleted_shortcircuit_loses_to_taskrun_race.md) · [One Cobertura filename, several class nodes](project_cobertura_filename_maps_to_several_class_nodes.md) -- [msbuild file logger double-counts warnings](project_msbuild_filelogger_double_counts_each_warning.md) · [Reconciliation merge already tracks the feature docs](project_orchestrator_reconciliation_merge_tracks_feature_docs.md) -- [Seam sentences outlive a removed member](project_preflight_seam_sentences_outlive_a_removed_member.md) — after a decision removes an interface member, grep the spec for "Moq double of the .* interface"/"injectable"; keyword sweeps miss them -- [Explicit Compile items decide membership, not file presence](project_explicit_compile_items_decide_membership_not_file_presence.md) — a grep hit can be uncompiled -- [`git add -N -- .` defeats a "do not stage X" invariant](project_intent_to_add_span_defeats_do_not_stage_invariant.md) — it reads as diff plumbing, so a staging audit skips it -- [Hunk-header literal slides past a blank line](project_git_hunk_header_literal_slides_past_blank_line.md) — measured; assert numstat deleted=0, never `@@ -N,0 +M,` -- [Batch-budget hook discards out-of-root .ps1 writes](project_batch_budget_hook_discards_out_of_root_powershell_writes.md) — hook roots at session worktree; plan gates reading its state become unsatisfiable -- [BOM-bearing .cs files + pre-restore numstat gates](project_bom_bearing_cs_files_and_prerestore_numstat_head_gates.md) -- [CLAUDE.md differs per worktree; read the execution copy](project_claude_md_differs_between_worktrees_read_execution_copy.md) -- [CommandLine token kill hits own bash/pwsh shells](project_commandline_match_on_results_dir_token_kills_own_tool_shells.md) -- [CLI Rebuild omits .vsto/.manifest](project_commandline_rebuild_omits_vsto_manifests_addin_cannot_load.md) -- [git show in pwsh decodes ibm437 + keeps BOM](project_conservation_gate_git_show_decodes_ibm437_and_keeps_bom.md) -- [Dot-sourced coverage helpers: StrictMode $LASTEXITCODE throws](project_coverage_helpers_dotsource_strictmode_lastexitcode_throws.md) -- [Exactly-once literal vs pattern-containment clause](project_exactly_once_literal_clause_conflicts_with_pattern_containment_clause.md) -- [Fixed run-path coverage gate blind to sibling test file](project_fixed_run_path_coverage_gate_blind_to_sibling_test_file.md) -- [Inventory clause omits inherited promotion rename](project_footprint_inventory_clause_omits_inherited_promotion_rename.md) -- [Handoff AC count is a claim; measure the AC file](project_handoff_stated_ac_count_contradicts_the_ac_source_file.md) -- [Kill build-lock waiter by PID, not script name](project_killing_a_build_lock_waiter_by_script_name_hits_every_sibling.md) -- [Malformed pwsh payload surfaces as unrelated hook block](project_malformed_pwsh_payload_surfaces_as_unrelated_hook_block.md) -- [Mandatory [string[]] rejects a blank line](project_mandatory_string_array_param_rejects_blank_line_turning_red_into_binding_error.md) -- [Merge-base diff over branch-created file = one whole-file hunk](project_mergebase_diff_over_branch_created_file_is_whole_file_hunk.md) -- [Mid-plan commit breaks deletion staging/porcelain spans](project_midplan_commit_breaks_deletion_staging_and_porcelain_spans.md) -- [Minute-resolution timestamps can't be strictly increasing](project_minute_resolution_timestamp_cannot_be_strictly_increasing.md) -- [/m "N>" prefix zeroes anchored target counts](project_msbuild_parallel_log_node_prefix_defeats_anchored_target_counts.md) -- [Nested Import-Module -Force unloads session-wide](project_nested_import_module_force_unloads_session_wide.md) -- [Parent orchestrator hold-commits your branch mid-run](project_parent_orchestrator_hold_commits_your_branch_midrun.md) -- [Pester TotalCount includes filtered NotRun](project_pester_filtered_total_counts_notrun.md) -- [Auto-property with setter guard is not expressible](project_plan_mandated_autoproperty_with_setter_guard_is_not_expressible.md) -- [PoshQC format != Invoke-Formatter defaults](project_poshqc_format_rewrites_differ_from_invoke_formatter_defaults.md) -- [PoshQC strips BOM/CRLF only on rewrite](project_poshqc_format_strips_bom_and_crlf_only_when_it_rewrites.md) -- [PS double quotes keep both backslashes](project_powershell_double_quoted_backslash_defeats_msbuild_nonvacuity_grep.md) -- [4 PSScriptAnalyzer traps in new modules](project_psscriptanalyzer_traps_in_new_powershell_modules.md) -- [Param named $args makes msbuild gate vacuous](project_pwsh_function_param_named_args_makes_msbuild_gate_vacuous.md) -- [Nested quotes in "$( )" fail to parse](project_pwsh_nested_quotes_in_subexpression_fail_to_parse.md) -- [$Log/$log case collision flattens array](project_pwsh_param_name_case_collision_flattens_log_array.md) -- [pwsh @(a + x, b + y) is ONE string](project_pwsh_array_literal_comma_binds_before_plus.md) -- [Pre-impl gate reads the SESSION-root checkpoint](project_preimplementation_gate_reads_session_root_checkpoint_not_item_worktree.md) -- [Invoke-VersionReconciliation rewrites Reference version](project_reference_version_rewrite_when_assemblyversion_omitted.md) -- [Replaced-span numstat elides identical boundary lines](project_replacement_span_numstat_elides_identical_boundary_lines.md) -- [Finding's line right, description wrong](project_review_finding_line_number_right_description_wrong.md) -- [Splatting frees lines in ceiling-bound test files](project_splatting_is_the_line_budget_lever_for_ceiling_bound_test_files.md) -- [-WhatIf does not reach module ShouldProcess](project_whatif_does_not_reach_module_session_state.md) -- [WinForms control field installs SyncContext, deadlocks await](project_winforms_control_field_installs_synccontext_and_deadlocks_await.md) -- [Backtick-span Grep returns gaps](project_backtick_span_grep_gap_matches.md) — manual blast-radius token re-check -## Artifact hygiene, shell/pwsh pitfalls, misc (sub-index) -- [Sub-index: 58 entries](index_artifact_hygiene_and_misc.md) — evidence sanitisation, TRX/msbuild path leaks, pwsh quoting, csharpier/numstat, git spans, Pester, hooks -- [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) — a correct citation can read as contradicting a "do not re-verify" fact -- [git grep -I skips UTF-16 evidence](project_git_grep_binary_flag_skips_utf16_evidence.md) +- [Overflow index: ~170 moved entries](index_overflow_entries.md) — plan-gate defect classes, build/test env, hygiene, pwsh/git pitfalls, component gotchas diff --git a/.claude/agent-memory/atomic-executor/index_overflow_entries.md b/.claude/agent-memory/atomic-executor/index_overflow_entries.md new file mode 100644 index 000000000..6a78e9fa3 --- /dev/null +++ b/.claude/agent-memory/atomic-executor/index_overflow_entries.md @@ -0,0 +1,173 @@ +# Overflow index (moved verbatim from MEMORY.md on 2026-10-09) + +Entries below were moved unchanged to keep MEMORY.md under its read limit. Some lines duplicate entries in other sub-indexes. + +- [Mid-plan commit sanitisation gate](project_midplan_commit_needs_capture_time_sanitisation_gate.md) · [Sanitisation can't sweep its own record](project_sanitisation_task_cannot_sweep_its_own_record.md) · [Code commit before format pass](project_code_commit_before_final_format_pass_orphans_rewrites.md) +- [Blocked Bash drops chained check-off](project_blocked_bash_command_silently_drops_chained_checkoff.md) · [Tool results inject "use Bash"](project_tool_results_inject_bash_read_edit_instruction.md) +- [CSharpier chain-wrap defeats line gates](project_csharpier_chain_wrap_defeats_singleline_search_gates.md) · [Verify citations with numbered output](feedback_verify_line_citations_with_numbered_output.md) +- [Plan column widths may include the Markdown indent](project_plan_column_widths_may_include_markdown_indent.md) — re-measure in-file; cite Race.cs chain precedents +- [Authoring-time counts undercount](project_plan_authoring_time_token_counts_are_undercounts.md) · [Planner/executor see different worktrees](project_planner_and_executor_observe_different_worktrees.md) · [Caller-stated count drifts](project_caller_stated_preflight_count_drifts_before_execution.md) +- [Extract gate literals, never re-type](project_preflight_gate_literal_extract_from_plan_not_retype.md) · [Tool layer collapses `\`](project_tool_layer_collapses_double_backslash_in_file_content.md) +- [Self-derived thresholds are blind](project_preflight_selfderived_gate_thresholds_are_blind.md) · [Exact-count gate vs remediation loop](project_exact_count_gate_vs_remediation_loop.md) +- [Inline-dispatch harness citation](project_inline_dispatch_harness_citation_makes_execution_time_test_vacuous.md) · ["Skip the pointless drain"](project_preflight_drain_scope_optimization_note_makes_test_vacuous.md) +- [Multi-pattern gates detach qualifiers](project_multipattern_gate_shared_qualifier_detachment.md) · [Zero-hit gate hits doc comments](project_banned_api_zero_hit_gate_hits_doc_comments.md) +- [Follow-up promotion is unexecutable](project_followup_promotion_task_is_unexecutable_by_executor.md) · [Supersede leaves a routing residual](project_supersede_clause_leaves_hard_routing_residual.md) +- [Delegation with no dispatch tool](project_plan_delegation_to_typed_engineer_without_dispatch_tool.md) +- [Check-off fixpoint breaks clean-tree gates](project_plan_checkoff_fixpoint_breaks_terminal_clean_tree_gate.md) · [Tracked agent-memory breaks unscoped gates](project_agent_memory_tracked_breaks_unscoped_git_gates.md) +- [Merge-base diffs need a commit cadence](project_preflight_mergebase_diff_gates_need_commit_cadence.md) · [BASELINE_SHA conflates the merged base](project_baseline_sha_diff_conflates_merged_base.md) +- [Epic child branch: inherited commits](project_epic_child_branch_anchored_diff_lists_inherited_commits.md) · [Moving-base two-dot diff inertness](project_preflight_moving_base_two_dot_diff_inertness_test.md) +- [Inserted tasks force renumbering](project_plan_task_ids_digit_only_forces_renumbering.md) · [Rationale clauses are evidence](project_418_plan_rationale_clauses_are_evidence.md) +- [Bugfix phase grows the file](project_bugfix_phase_grows_the_file_despite_dead_code_removal.md) · [#418 500-line gate vs plan content](project_418_500line_gate_vs_plan_content.md) +- [AC check-off + tool-output paths](project_preflight_ac_checkoff_and_tooloutput_paths.md) · [Orchestrator override ≠ an AC](project_orchestrator_override_does_not_satisfy_an_ac.md) +- [Output Summary breaks its count gate](project_artifact_output_summary_breaks_its_own_exact_count_gate.md) · [Scope gate can't list later artifacts](project_scope_gate_cannot_list_artifacts_written_after_it.md) +- [Zero gate on a sibling-owned assembly](project_preflight_absolute_zero_gate_on_sibling_owned_assembly.md) · [Directory-scoped format breaks ownership](project_directory_scoped_format_breaks_ownership_gates.md) +- [#207 Hook() breaks AppEventsTests](project_207_hook_redesign_breaks_appeventstests.md) · [C2 capacity budget drifts](project_c2_capacity_budget_drifts_mid_plan.md) +- [AppGlobalsTests at the 500-line ceiling](project_appglobalstests_at_500_line_ceiling.md) · [#376 scope-expansion layers](project_376_capstone_scope_expansion_layers.md) +- [Swordfish F5 misclassification](project_swordfish_f5_test_misclassification.md) · [Confirmatory preflight: proportionate bar](feedback_confirmatory_preflight_proportionate_bar.md) +- [Four recurring C# defect classes](project_preflight_recurring_csharp_plan_defect_classes.md) · [msbuild-log grep hits the csc line](project_msbuild_log_token_search_matches_csc_command_line.md) +- [Epic base invalidates line counts](project_epic_integration_base_invalidates_research_line_counts.md) · ["Make the citation exist" spreads false facts](project_preflight_citation_match_propagates_false_fact.md) +- [Check-off cites a LATER artifact](project_preflight_checkoff_cites_later_task_artifact.md) · [Pre-edit gate cites the post-edit table](project_preedit_gate_cites_postedit_replacement_table.md) +- [Conjunctive criteria break one-artifact citation](project_preflight_conjunctive_criterion_citation_gap.md) · [Delta gate cites an unrecorded baseline count](project_gate_cites_a_baseline_count_the_baseline_task_never_records.md) +- [Blanket assertions + forward deps](project_preflight_blanket_assertion_and_forward_dependency.md) · [pwsh -Command quoting boundary](project_pwsh_command_quoting_boundary.md) +- [Locators stale after a doc edit](project_plan_line_locators_stale_after_doc_edit.md) · [csproj ranges shift during execution](project_plan_csproj_line_ranges_shift_during_execution.md) +- [Probe C# shapes with csc](project_preflight_csc_probe_for_mandated_csharp_shapes.md) · [Evidence fields need a token scan](project_preflight_evidence_field_token_scan.md) +- [Literals inherit research arithmetic](project_plan_literal_assertions_inherit_research_arithmetic.md) · [Fix tasks inherit the round's rules](project_preflight_fix_tasks_inherit_decomposition_rules.md) +- [Conditional split = three tasks](project_conditional_split_three_task_shape.md) · [Round-over-round plan diff unavailable](project_preflight_round_over_round_diff_unavailable.md) +- [Flaky carve-out added to one task only](project_flaky_test_carveout_added_to_one_task_only.md) · [Revision bullet negates an earlier clause](project_revision_bullet_negates_earlier_clause_left_standing.md) +- [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) · [Hygiene scan: comma precedence + d:\s hits](project_hygiene_pattern_array_comma_precedence_and_regex_token_hits.md) +- [Loop re-runs vs one-artifact glob + hash anchors](project_loop_iteration_vs_single_artifact_glob_and_hash_anchor.md) +- [Route-keyed branches miss derived-flag cases](project_outcome_branch_sets_keyed_on_route_miss_derived_flag_cases.md) · [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) + +## Build / toolchain environment +- [pwsh/git/gh gotchas](project_pwsh_git_gh_cli_gotchas.md) · [Build/Test env](project_build_test_env.md) · [VS18 paths](project_vs18_build_toolchain_paths.md) · [SDK + nullable Rebuild](project_repo_sdk_and_nullable_rebuild.md) +- [Fresh worktree restore](project_fresh_worktree_needs_sdk_and_packages_config_restore.md) · [Start-Process quoting](project_startprocess_arglist_array_strips_quoting.md) · [Relative pwsh paths](project_relative_path_in_pwsh_dotnet_io_hits_wrong_worktree.md) +- [QuickFiler.Test hang](project_quickfiler_test_coverage_hang_and_build_flags.md) · [$CoverageOutput clobber](project_dotsourcing_invoke_mstest_clobbers_coverageoutput_param.md) · [TestCaseFilter OR](project_vstest_testcasefilter_or_operator_and_env_setup.md) +- [File vs partial class](project_test_file_name_vs_partial_class_name.md) · [HintPath skew](project_analyzer_hintpath_skew_breaks_all_four_gates.md) · [Analyzer skew fresh](project_analyzer_version_skew_fresh_worktree.md) · [SecurityCodeScan](project_securitycodescan_roslyn56_incompat.md) +- [VSTO runtime](project_missing_vsto_runtime_breaks_baseline_gates.md) · [MSB3277](project_new_sln_member_surfaces_msb3277_pin_divergence.md) · [No transitive refs](project_legacy_csproj_no_transitive_compile_refs.md) · [CRLF](project_sln_csproj_edit_crlf_preserve.md) +- [Incremental vacuous](project_incremental_build_vacuous_baseline.md) · [Nullable /t:Build](project_nullable_build_gate_is_vacuous_incremental.md) · [Designer.cs skip](project_csharpier_skips_designer_cs_by_filename.md) · [*.log ignore](project_gitignore_star_log_blocks_committed_msbuild_log_evidence.md) +- [pipe-files](project_csharpier_pipefiles_nonenforcing_gate.md) · [Count idioms](project_count_idiom_pitfalls_csharpier_and_measureobject.md) · [New .cs restart](project_new_cs_files_guarantee_a_format_loop_restart.md) · [PS BOM](powershell-bom-required.md) +- [BOM grep ^](project_bom_grep_anchor_false_negative.md) · [StrictMode XML attr](project_pester_strictmode_xml_attribute_property_access.md) · [Pester helper BeforeAll](project_pester5_helper_function_must_live_in_beforeall.md) +- [-NoExecute premise](project_noexecute_early_return_premise_hides_reachable_entry_point_tests.md) · [poshqc test no verdict](project_poshqc_pester_mcp_exit_minus1.md) · [analyze exit 1](project_poshqc_analyze_exit1_on_warning.md) +- [Pester 5 result shape](project_pester5_result_shape_container_tests_and_ci_codecoverage.md) · [Heredoc \\](project_bash_heredoc_collapses_doubled_backslashes.md) · [Unquoted backslash](project_unquoted_backslash_in_bash_arg_silently_redirects_output.md) +- [Doubled backslash](project_doubled_backslash_dedoubles_bash_to_native_exe.md) · [Recursive delete](project_recursive_delete_idioms_blocked_use_dotnet_api.md) · [pwsh -Command quoting](project_pwsh_command_quoting_from_bash.md) +- [pwsh -File list](project_pwsh_file_array_param_from_bash.md) · [Compile-red refs](project_compile_red_needs_body_level_references.md) · [Splat gates](project_cross_task_shell_variable_splat_gate.md) +- [ collision](project_evidence_timestamp_collision_clobbers_artifacts.md) · [Floating ](project_shared_evidence_artifact_floating_ts.md) + +## Test execution & isolation +- [Detached long runs](project_long_runs_need_detached_process.md) · [Mock GUI](feedback_tests_must_mock_gui_no_visible_window.md) · [Suite hangs](project_full_suite_run_hangs_while_earlier_runs_idle.md) +- [PumpHost flaky](project_winformspumphost_tests_load_flaky.md) · [/InIsolation](project_vstest_isolation_and_filepathhelper_serialization.md) +- [Timed-out runner](project_timedout_mstest_leaves_detached_runner.md) · [Sibling tooling](project_sibling_worktree_shared_tooling_hazard.md) · [Concurrent executor](project_concurrent_executor_same_worktree.md) +- [coverage deadlock](project_concurrent_dotnet_coverage_deadlock_and_doccomment_retention_gate.md) · [UtilitiesCS parallel](project_utilitiescs_test_parallelism_flakiness.md) · [DoNotParallelize](project_mstest_donotparallelize_overlaps_parallel_bucket.md) +- [MemoryAppender per TYPE](project_log4net_memoryappender_shared_per_type_across_parallel_classes.md) · [Dispatcher swap race](project_uithread_dispatcher_static_swap_race.md) · [DataCollector default](project_runsettings_datacollector_default_enabled.md) +- [Deedle/FSharp](project_dotnet_coverage_deedle_fsharp_instrumentation.md) · [DispatcherDelay hangs](project_dispatcherdelay_hangs_unit_tests.md) · [ConfigController STA](project_configcontroller_sta_pump_deadlock.md) + +## Coverage measurement +- C# coverage mechanics (Cobertura, Koverage, denominators): see the sub-index at the top +- [Package-rate not-lower gate vs variance](project_package_rate_not_lower_gate_trips_on_unrelated_file_variance.md) — unrelated-file variance fails package/repo not-lower gates on small-delta items +- [Cobertura hits are binary](project_dotnet_coverage_cobertura_hits_are_binary.md) — dotnet-coverage hits are 0/1; "guard hits > record hits" can never hold; use the guard line's condition-coverage + +## Nullable / C# language +- [Pragma gate](project_nullable_pragma_gate_mechanics.md) · [net481 pragma](project_nullable_pragma_gate_net481_mechanics.md) · [Epic pragma](project_nullable_epic_pragma_gate_and_analyzer_restore.md) +- [CLAUDE.md != CI](project_507_nullconditional_return_triggers_cs8603_under_genuine_nullable_check.md) · [Annotations](project_nullable_remediation_annotation_patterns.md) · [CS8632](project_nullable_annotation_cs8632_scoping.md) · [CS8714](project_nullable_cs8714_not_on_net481.md) +- [CS0518](project_record_struct_isexternalinit_netfx.md) · Closed issues and component gotchas: see the sub-index at the top + +## Artifact hygiene & misc mechanics +- [No host paths](../_shared_no_absolute_host_paths.md) · [Never predict](feedback_never_predict_an_observation_into_an_artifact.md) · [ drift](project_evidence_timestamp_labels_drift_ahead_of_write_time.md) · [Probe literal](project_selftest_probe_literal_trips_the_next_sweep_pass.md) +- [TRX case](project_trx_sanitisation_must_be_case_insensitive.md) · [TRX/msbuild sanitise](project_vstest_trx_evidence_needs_sanitisation_task.md) · [msbuild 2 roots](project_msbuild_log_has_two_absolute_path_leak_classes.md) · [Deploy_ leaks](project_mstest_deploy_dir_leaks_tokens_on_failing_runs.md) +- [Two .coverage](project_vstest_emits_two_coverage_files_per_run.md) · [No Failed line](project_vstest_success_run_prints_no_failed_or_skipped_line.md) · [Scratch .ps1](project_powershell_scratch_script_budget_hook_blocks_helpers.md) · [Mandated .ps1](project_plan_mandated_ps1_helpers_collide_with_budget_cap_and_frozen_porcelain_gate.md) +- [2nd pass fields](project_appending_a_second_pass_must_not_qualify_schema_fields.md) · [env -C](project_bash_cwd_resets_use_env_dash_c.md) · [global.json cwd](project_dotnet_global_json_cwd_search_vs_bash_discipline.md) · [pwsh -File root](project_pwsh_file_starts_in_session_root_needs_workingdirectory.md) +- [pwsh stdin REPL](project_pwsh_stdin_repl_mode_and_nonascii_mangling.md) · [Isolation guard](project_worktree_isolation_guard_refuses_pwsh_from_bash.md) · [Branch gate fix](project_changed_line_coverage_branch_gate_invalidated_by_the_fix.md) +- [ExpectedExitCode](project_expectedexitcode_declared_from_baseline_not_observed_run.md) · [Blank before comment](project_csharpier_requires_blank_line_before_comment_breaking_numstat_bounds.md) · [this-lambdas](project_excludefromcodecoverage_misses_this_capturing_lambdas.md) +- [Koverage separators](project_koverage_reporoot_needs_native_separators.md) · [FakeTimeProvider zero](project_faketimeprovider_zero_duetime_fires_at_creation.md) · [Reflective read](project_reflective_property_read_escapes_member_expression_grep.md) +- [Preparation mode](project_preparation_mode_flips_anchored_diff_gate_membership.md) · [git grep -c oracle](project_git_grep_c_empty_is_the_allowlisted_line_count_oracle.md) · [Fallback orphans](project_contingency_fallback_orphans_downstream_hardcoded_paths.md) +- [Per-comment literal](project_stale_citation_gate_literal_must_match_the_comments_legitimate_citations.md) · [TimeoutAfter race](project_timeoutafter_iscompleted_shortcircuit_loses_to_taskrun_race.md) · [Cobertura class nodes](project_cobertura_filename_maps_to_several_class_nodes.md) +- [Logger double-counts](project_msbuild_filelogger_double_counts_each_warning.md) · [Reconciliation merge](project_orchestrator_reconciliation_merge_tracks_feature_docs.md) · [Seam sentences](project_preflight_seam_sentences_outlive_a_removed_member.md) +- [Compile items](project_explicit_compile_items_decide_membership_not_file_presence.md) · [git add -N](project_intent_to_add_span_defeats_do_not_stage_invariant.md) · [Hunk header](project_git_hunk_header_literal_slides_past_blank_line.md) +- [Budget hook out-of-root](project_batch_budget_hook_discards_out_of_root_powershell_writes.md) · [BOM .cs numstat](project_bom_bearing_cs_files_and_prerestore_numstat_head_gates.md) · [CLAUDE.md per worktree](project_claude_md_differs_between_worktrees_read_execution_copy.md) +- [Token kill own shells](project_commandline_match_on_results_dir_token_kills_own_tool_shells.md) · [No .vsto](project_commandline_rebuild_omits_vsto_manifests_addin_cannot_load.md) · [git show ibm437](project_conservation_gate_git_show_decodes_ibm437_and_keeps_bom.md) +- [$LASTEXITCODE StrictMode](project_coverage_helpers_dotsource_strictmode_lastexitcode_throws.md) · [Exactly-once literal](project_exactly_once_literal_clause_conflicts_with_pattern_containment_clause.md) · [Sibling test file](project_fixed_run_path_coverage_gate_blind_to_sibling_test_file.md) +- [Promotion rename](project_footprint_inventory_clause_omits_inherited_promotion_rename.md) · [AC count claim](project_handoff_stated_ac_count_contradicts_the_ac_source_file.md) · [Kill by PID](project_killing_a_build_lock_waiter_by_script_name_hits_every_sibling.md) +- [Malformed payload](project_malformed_pwsh_payload_surfaces_as_unrelated_hook_block.md) · [Blank line binding](project_mandatory_string_array_param_rejects_blank_line_turning_red_into_binding_error.md) · [Whole-file hunk](project_mergebase_diff_over_branch_created_file_is_whole_file_hunk.md) +- [Mid-plan commit spans](project_midplan_commit_breaks_deletion_staging_and_porcelain_spans.md) · [Minute timestamps](project_minute_resolution_timestamp_cannot_be_strictly_increasing.md) · [/m N> prefix](project_msbuild_parallel_log_node_prefix_defeats_anchored_target_counts.md) +- [Import-Module -Force](project_nested_import_module_force_unloads_session_wide.md) · [Hold-commits](project_parent_orchestrator_hold_commits_your_branch_midrun.md) · [Pester NotRun](project_pester_filtered_total_counts_notrun.md) +- [Auto-property guard](project_plan_mandated_autoproperty_with_setter_guard_is_not_expressible.md) · [PoshQC format rules](project_poshqc_format_rewrites_differ_from_invoke_formatter_defaults.md) · [PoshQC BOM/CRLF](project_poshqc_format_strips_bom_and_crlf_only_when_it_rewrites.md) +- [PS double-quote \\](project_powershell_double_quoted_backslash_defeats_msbuild_nonvacuity_grep.md) · [PSSA traps](project_psscriptanalyzer_traps_in_new_powershell_modules.md) · [$args param](project_pwsh_function_param_named_args_makes_msbuild_gate_vacuous.md) +- [Nested quotes $( )](project_pwsh_nested_quotes_in_subexpression_fail_to_parse.md) · [$Log/$log](project_pwsh_param_name_case_collision_flattens_log_array.md) · [Reference rewrite](project_reference_version_rewrite_when_assemblyversion_omitted.md) +- [Numstat elides](project_replacement_span_numstat_elides_identical_boundary_lines.md) · [Finding description](project_review_finding_line_number_right_description_wrong.md) · [Splatting lines](project_splatting_is_the_line_budget_lever_for_ceiling_bound_test_files.md) +- [-WhatIf module scope](project_whatif_does_not_reach_module_session_state.md) · [Removal hook: git + "remove"](project_worktree_removal_hooks_match_git_plus_remove_substring.md) +- [FluentAssertions truncates string diffs](project_fluentassertions_truncates_string_diff_breaks_message_substring_gates.md) — "…59Sandbox\origin": full-path MESSAGE substring gates cannot match +- [Cited-tree gate vs main; span enumeration](project_preflight_cited_tree_gate_and_span_enumeration.md) — intersect cited paths with the files main changed; every stop string needs a task that detects it +- [Field gate `Contains("EXIT_CODE:")` matches FORMAT_EXIT_CODE:](project_schema_field_contains_check_matches_prefixed_labels.md) — anchor the field match to the line start +- [Worktree-gate hook: git + "remove" in any identifier](project_worktree_removal_hook_matches_git_plus_remove_in_variable_names.md) — read-only payloads with `$removed` halt the run; flag at preflight +## Component-specific gotchas +- [WebView2 EndInit creates child handles](project_webview2_endinit_creates_handles.md) · [#349 breadcrumb WebView2](project_349_breadcrumb_webview2_gotchas.md) +- QFC #227: [cycle-4 ToggleFocus](project_qfc227_cycle4_toggle_focus_genuine_test_gotchas.md) · [cycle-3 seam](project_theme_folderpredictor_seam_retrofit_gotchas.md) +- [ObjectListView headless selection](project_objectlistview_treelistview_headless_selection.md) · [BackgroundWorker async-void race](project_qfc_backgroundworker_async_void_race.md) +- [QfcItemController needs SaveParameters](project_qfcitemcontroller_pump_harness_needs_saveparameters.md) · [TaskController (#297)](project_taskvisualization_taskcontroller_test_gotchas.md) +- [ProjectEntry setter raw MessageBox](project_projectentry_setter_raw_messagebox.md) · [IApplicationGlobals member forces implementers](project_iapplicationglobals_member_forces_implementers.md) +- [TimeProvider seam gotchas](project_timeprovider_seam_gotchas.md) · [GetOrLoad discards setter injection](project_initializer_getorload_discards_injection_when_dependency_null.md) +- [ScoDictionaryNew needs TryAdd](project_scodictionarynew_tryadd_not_add.md) · [Equal(params) has no because](project_fluentassertions_equal_params_no_because.md) · [BeEmpty names only the first item](project_fluentassertions_beempty_names_only_first_item.md) +## Artifact hygiene +- [Never embed absolute host paths](../_shared_no_absolute_host_paths.md) · [Never predict an observation](feedback_never_predict_an_observation_into_an_artifact.md) +- [ drifts ahead of write time](project_evidence_timestamp_labels_drift_ahead_of_write_time.md) · [Probe literal trips the NEXT sweep](project_selftest_probe_literal_trips_the_next_sweep_pass.md) +- [TRX sanitisation is case-insensitive](project_trx_sanitisation_must_be_case_insensitive.md) · [TRX/msbuild need a sanitisation micro-action](project_vstest_trx_evidence_needs_sanitisation_task.md) +- [MSBuild logs leak TWO roots](project_msbuild_log_has_two_absolute_path_leak_classes.md) · [Deploy_ leaks tokens on FAILING runs](project_mstest_deploy_dir_leaks_tokens_on_failing_runs.md) +- [vstest leaves TWO .coverage files](project_vstest_emits_two_coverage_files_per_run.md) · [Green run prints no Failed/Skipped line](project_vstest_success_run_prints_no_failed_or_skipped_line.md) +- [PS budget hook blocks scratch .ps1](project_powershell_scratch_script_budget_hook_blocks_helpers.md) · [Plan-mandated .ps1 + frozen porcelain gate](project_plan_mandated_ps1_helpers_collide_with_budget_cap_and_frozen_porcelain_gate.md) +- [2nd pass must not qualify schema fields](project_appending_a_second_pass_must_not_qualify_schema_fields.md) · [Bash resets cwd; use `env -C`](project_bash_cwd_resets_use_env_dash_c.md) +- [global.json cwd-search vs no-cd discipline](project_dotnet_global_json_cwd_search_vs_bash_discipline.md) · [pwsh -File starts in the SESSION root](project_pwsh_file_starts_in_session_root_needs_workingdirectory.md) +- [pwsh stdin is a REPL](project_pwsh_stdin_repl_mode_and_nonascii_mangling.md) · [Isolation guard refuses pwsh from Bash](project_worktree_isolation_guard_refuses_pwsh_from_bash.md) +- [ExpectedExitCode keyed off the baseline](project_expectedexitcode_declared_from_baseline_not_observed_run.md) · [Koverage -RepoRoot needs native separators](project_koverage_reporoot_needs_native_separators.md) +- [CSharpier forces a blank line before a comment](project_csharpier_requires_blank_line_before_comment_breaking_numstat_bounds.md) · [ExcludeFromCodeCoverage misses `this`-capturing lambdas](project_excludefromcodecoverage_misses_this_capturing_lambdas.md) +- [Koverage -RepoRoot needs native separators](project_koverage_reporoot_needs_native_separators.md) · [FakeTimeProvider zero due time fires at creation](project_faketimeprovider_zero_duetime_fires_at_creation.md) +- [Reflective property read escapes a member grep](project_reflective_property_read_escapes_member_expression_grep.md) · [Preparation mode flips anchored-diff membership](project_preparation_mode_flips_anchored_diff_gate_membership.md) +- [git grep -c with an empty pattern is the line-count oracle](project_git_grep_c_empty_is_the_allowlisted_line_count_oracle.md) - Read renders a phantom trailing line +- [Contingency fallback orphans downstream paths](project_contingency_fallback_orphans_downstream_hardcoded_paths.md) · [Stale-citation gate literal is per-comment](project_stale_citation_gate_literal_must_match_the_comments_legitimate_citations.md) +- [TimeoutAfter IsCompleted loses to the Task.Run race](project_timeoutafter_iscompleted_shortcircuit_loses_to_taskrun_race.md) · [One Cobertura filename, several class nodes](project_cobertura_filename_maps_to_several_class_nodes.md) +- [msbuild file logger double-counts warnings](project_msbuild_filelogger_double_counts_each_warning.md) · [Reconciliation merge already tracks the feature docs](project_orchestrator_reconciliation_merge_tracks_feature_docs.md) +- [Seam sentences outlive a removed member](project_preflight_seam_sentences_outlive_a_removed_member.md) — after a decision removes an interface member, grep the spec for "Moq double of the .* interface"/"injectable"; keyword sweeps miss them +- [Explicit Compile items decide membership, not file presence](project_explicit_compile_items_decide_membership_not_file_presence.md) — a grep hit can be uncompiled +- [`git add -N -- .` defeats a "do not stage X" invariant](project_intent_to_add_span_defeats_do_not_stage_invariant.md) — it reads as diff plumbing, so a staging audit skips it +- [Hunk-header literal slides past a blank line](project_git_hunk_header_literal_slides_past_blank_line.md) — measured; assert numstat deleted=0, never `@@ -N,0 +M,` +- [Batch-budget hook discards out-of-root .ps1 writes](project_batch_budget_hook_discards_out_of_root_powershell_writes.md) — hook roots at session worktree; plan gates reading its state become unsatisfiable +- [BOM-bearing .cs files + pre-restore numstat gates](project_bom_bearing_cs_files_and_prerestore_numstat_head_gates.md) +- [CLAUDE.md differs per worktree; read the execution copy](project_claude_md_differs_between_worktrees_read_execution_copy.md) +- [CommandLine token kill hits own bash/pwsh shells](project_commandline_match_on_results_dir_token_kills_own_tool_shells.md) +- [CLI Rebuild omits .vsto/.manifest](project_commandline_rebuild_omits_vsto_manifests_addin_cannot_load.md) +- [git show in pwsh decodes ibm437 + keeps BOM](project_conservation_gate_git_show_decodes_ibm437_and_keeps_bom.md) +- [Dot-sourced coverage helpers: StrictMode $LASTEXITCODE throws](project_coverage_helpers_dotsource_strictmode_lastexitcode_throws.md) +- [Exactly-once literal vs pattern-containment clause](project_exactly_once_literal_clause_conflicts_with_pattern_containment_clause.md) +- [Fixed run-path coverage gate blind to sibling test file](project_fixed_run_path_coverage_gate_blind_to_sibling_test_file.md) +- [Inventory clause omits inherited promotion rename](project_footprint_inventory_clause_omits_inherited_promotion_rename.md) +- [Handoff AC count is a claim; measure the AC file](project_handoff_stated_ac_count_contradicts_the_ac_source_file.md) +- [Kill build-lock waiter by PID, not script name](project_killing_a_build_lock_waiter_by_script_name_hits_every_sibling.md) +- [Malformed pwsh payload surfaces as unrelated hook block](project_malformed_pwsh_payload_surfaces_as_unrelated_hook_block.md) +- [Mandatory [string[]] rejects a blank line](project_mandatory_string_array_param_rejects_blank_line_turning_red_into_binding_error.md) +- [Merge-base diff over branch-created file = one whole-file hunk](project_mergebase_diff_over_branch_created_file_is_whole_file_hunk.md) +- [Mid-plan commit breaks deletion staging/porcelain spans](project_midplan_commit_breaks_deletion_staging_and_porcelain_spans.md) +- [Minute-resolution timestamps can't be strictly increasing](project_minute_resolution_timestamp_cannot_be_strictly_increasing.md) +- [/m "N>" prefix zeroes anchored target counts](project_msbuild_parallel_log_node_prefix_defeats_anchored_target_counts.md) +- [Nested Import-Module -Force unloads session-wide](project_nested_import_module_force_unloads_session_wide.md) +- [Parent orchestrator hold-commits your branch mid-run](project_parent_orchestrator_hold_commits_your_branch_midrun.md) +- [Pester TotalCount includes filtered NotRun](project_pester_filtered_total_counts_notrun.md) +- [Auto-property with setter guard is not expressible](project_plan_mandated_autoproperty_with_setter_guard_is_not_expressible.md) +- [PoshQC format != Invoke-Formatter defaults](project_poshqc_format_rewrites_differ_from_invoke_formatter_defaults.md) +- [PoshQC strips BOM/CRLF only on rewrite](project_poshqc_format_strips_bom_and_crlf_only_when_it_rewrites.md) +- [PS double quotes keep both backslashes](project_powershell_double_quoted_backslash_defeats_msbuild_nonvacuity_grep.md) +- [4 PSScriptAnalyzer traps in new modules](project_psscriptanalyzer_traps_in_new_powershell_modules.md) +- [Param named $args makes msbuild gate vacuous](project_pwsh_function_param_named_args_makes_msbuild_gate_vacuous.md) +- [Nested quotes in "$( )" fail to parse](project_pwsh_nested_quotes_in_subexpression_fail_to_parse.md) +- [$Log/$log case collision flattens array](project_pwsh_param_name_case_collision_flattens_log_array.md) +- [pwsh @(a + x, b + y) is ONE string](project_pwsh_array_literal_comma_binds_before_plus.md) +- [Pre-impl gate reads the SESSION-root checkpoint](project_preimplementation_gate_reads_session_root_checkpoint_not_item_worktree.md) +- [Invoke-VersionReconciliation rewrites Reference version](project_reference_version_rewrite_when_assemblyversion_omitted.md) +- [Replaced-span numstat elides identical boundary lines](project_replacement_span_numstat_elides_identical_boundary_lines.md) +- [Finding's line right, description wrong](project_review_finding_line_number_right_description_wrong.md) +- [Splatting frees lines in ceiling-bound test files](project_splatting_is_the_line_budget_lever_for_ceiling_bound_test_files.md) +- [-WhatIf does not reach module ShouldProcess](project_whatif_does_not_reach_module_session_state.md) +- [WinForms control field installs SyncContext, deadlocks await](project_winforms_control_field_installs_synccontext_and_deadlocks_await.md) +- [Backtick-span Grep returns gaps](project_backtick_span_grep_gap_matches.md) — manual blast-radius token re-check +## Artifact hygiene, shell/pwsh pitfalls, misc (sub-index) +- [Sub-index: 58 entries](index_artifact_hygiene_and_misc.md) — evidence sanitisation, TRX/msbuild path leaks, pwsh quoting, csharpier/numstat, git spans, Pester, hooks +- [Caller fact list can be abbreviated](project_caller_supplied_fact_list_can_be_abbreviated_and_look_like_a_plan_defect.md) — a correct citation can read as contradicting a "do not re-verify" fact +- [git grep -I skips UTF-16 evidence](project_git_grep_binary_flag_skips_utf16_evidence.md) diff --git a/.claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md b/.claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md new file mode 100644 index 000000000..effd9a07c --- /dev/null +++ b/.claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md @@ -0,0 +1,21 @@ +--- +name: mstest-runner-summary-absent-on-failure-voids-flaky-carveout +description: Invoke-MSTestWithCoverageMain writes mstest-coverage-run.summary.txt only after a zero collector exit, so a flaky-test carve-out keyed on its "Failed tests:" line can never fire; key it on the raw trx instead +metadata: + type: project +--- + +`scripts/vscode/Invoke-MSTestWithCoverage.ps1` throws `MSTest with coverage failed with exit code N` +inside `Invoke-DotnetCoverageCollection` (line 262 as of 2026-10-09) before post-processing, the +projection, and the summary file are produced. The `.summary.txt` holding +`Failed tests: ` therefore exists only on a green run, and it always reads `Failed tests: none`. + +**Why:** plan #985 r0 C7 allowed one re-measurement when `RUNNER_RESULT=THREW` and the +`TRX-SUMMARY: Failed tests:` line named only the known flaky test (#780). On a red run that line is +never printed (the wrapper deletes the stale summary first), so the rule was unreachable and a +single flaky failure would have become a hard STOP. + +**How to apply:** at preflight, a flaky carve-out over this runner must read failed names from +the raw `coverage\test-results\mstest-coverage-run.trx` (still present after the throw), e.g. +`//*[local-name()='UnitTestResult'][@outcome='Failed']` -> `testName`, printed as +`TRX-FAILED-TEST:` lines (names only, no paths). Related: [[flaky-test-carveout-added-to-one-task-only]]. diff --git a/.claude/agent-memory/atomic-planner/MEMORY.md b/.claude/agent-memory/atomic-planner/MEMORY.md index 2625834e8..886729a0e 100644 --- a/.claude/agent-memory/atomic-planner/MEMORY.md +++ b/.claude/agent-memory/atomic-planner/MEMORY.md @@ -2,97 +2,12 @@ ## Preflight revision seams (per issue; newest first) -- [#973 R1](project_973_r1_last_task_artifact_only_commit_and_measured_line_length_seams.md) — last task commits its artifact alone (plan is clean until its flip); dossier cites no later result; flip then transcribe; measure line length with `^.{N,}` (CR +1); Glob zero-gate needs a positive-control Glob; loop-fix commit needs `` -- [#973 cycle 1](project_973_cycle1_premise_correction_refscan_and_tautology_fold_seams.md) — false-premise AC fixed by a metadata refscan + positive control; a "tautology" may be an analyzer workaround (fold the read into the real assertion, amend the AC operand); hunk header omits `,1`; commit-per-task flip-then-commit -- [#964 cycle 1](project_964_cycle1_test_only_coverage_gap_remediation_seams.md) — test-only coverage-gap plan: dossier not fail-before, data-row trx prefix match, commit-task check-off circularity, no-Bash gitdir reads - -- [#968 R5](project_968_r5_multi_pass_format_exemption_and_no_bash_cr_check_seams.md) — a format exemption keyed to "rewritten this pass" fails on any restart: add PRIOR-PASS-REWRITTEN + RESTART-CORRECTED (union of ALL corrections); no Bash means Grep `\r` for the CR check -- [#968 R4](project_968_r4_restart_path_reanchor_and_recorded_not_gated_exemption_seams.md) — restart into a pre-commit census needs BASE ref + membership porcelain; exempt recorded-not-gated values (HUNK_COUNT, SPAN) from "as last recorded"; #region hits need a category -- [#968 R3](project_968_r3_last_recorded_value_rule_and_merged_payload_hook_seams.md) — post-format census must say "as last recorded for its file"; classification stop-rules must cover method-group assignments; merged pwsh payloads trip the gh+issue+new hook; re-count spec facts after amendments -- [#964 R4](project_964_r4_post_merge_footprint_reanchor_with_negative_controls.md) — mid-plan merge: move only the whole-tree footprint gate to MERGE-SHA, add two committed-range negative controls; no Bash means no hash-object -- [#964 R3](project_964_r3_glob_backslash_and_hit_attribution_seams.md) — Glob paths are backslash (rev-parse HEAD: needs `/`); totals-only sweep can't decide per-file branch -- [#964 R2](project_964_r2_preparation_record_closed_evidence_set.md) — preparation commits preflight-clearance.*.md before execution; closed evidence sets must admit + blob-pin it -- [#964 R0-R1](project_964_partial_split_sink_guard_plan_seams.md) — Grep tokens are regex; ordinal multiset split census; pre-existing-failure rule compares trx FQNs; last-task hygiene sweep -- [#950 R2](project_950_r2_self_matching_process_probe_and_bom_numstat_seams.md) — CommandLine process probe counts itself; BOM drop adds +1/-1 numstat; failed set hides aborted tests -- [#950 R1](project_950_r1_inline_continuation_and_reindent_width_seams.md) — default TCS continues inline so Drain() is vacuous; using() re-indent breaks width -- [#950 v1.0](project_950_hygiene_blocks_absolute_prefix_and_always_failing_probe_seams.md) — absolute prefix breaks hygiene rule B; always-failing probe; commit task's own artifact in porcelain -- [#956 R1.2](project_956_r12_rethrow_brace_exemptions_and_indent_keyed_catch_rule.md) — lifting EFCC exposes braces after `throw;`; construct-identified exemptions; catch rule keyed to indent -- [#956 R1](project_956_r1_spec_self_hit_and_raw_doc_name_seams.md) — spec-wording counts self-hit the AC line; anchor `cobertura[^/]*\.xml$`; amended AC needs a P0 literal check -- [#953 R3](project_953_r3_grep_gitignore_directory_path_and_measured_line_lengths.md) — Grep honours .gitignore for a DIRECTORY path, Glob does not; measure line lengths with `^.{N,}` -- [#953 R2](project_953_r2_grep_long_line_omission_and_cr_anchor_seams.md) — Grep omits lines over ~500 chars; `$` fails before CR (`\r?$`); expect-fail needs a wrong-reason branch -- [#953 R1](project_953_r1_pwsh_refused_and_count_recheck_seams.md) — Bash guard refuses pwsh; re-count blocks per file; `-Force` count-0 self-hits -- [#953 R0](project_953_fizzler_redirect_sweep_and_ratchet_plan_seams.md) — ripgrep strips the BOM; text=auto hides CRLF loss (gate `git ls-files --eol`) -- [#952 R3](project_952_r3_shared_origin_main_ancestry_gate_seam.md) — origin/main is shared by all worktrees: a no-fetch plan still needs a P0 `merge-base == BASE-SHA` gate -- [#952 R2](project_952_r2_label_counts_helper_enumeration_and_hex_backslash_seams.md) — recount `all N required` labels; directory-enumerating helper reads every file; backslash as `\x5C` -- [#952 R1](project_952_r1_read_phantom_row_and_frozen_clause_a_seams.md) — Read trailing empty row is inconsistent (count with Grep `^`); freeze footprint Clause A from P0 -- [#952 R0](project_952_runbook_and_workflow_comment_plan_seams.md) — `.yml` edits are pre-impl-gated; CRLF adds 1 to line length; actionlint silent on success -- [#948 v0.3](project_948_sibling_first_shape_reconciliation_seams.md) — sibling lands first: named shapes with content anchors, baseline-relative try/catch gate, re-budget 500-line ceiling -- [#947 pass A](project_947_passA_second_call_site_consolidation_seams.md) — mid-plan second call site: nested catch end keyed to header indent; re-derive "N catch clauses" -- [#945 R0](project_945_sortemail_trysave_directory_seam_plan_seams.md) — whitespace-stripped token census; compile-red fail-before; uncommitted-fix control via backup copy -- [#940 R3](project_940_r3_per_file_coverage_rule_and_post_merge_reanchor_seams.md) — aggregate not-lower gates trip on variance; per-file lines+branches rule; ANCHOR-SHA-2 = `^2` -- [#929 R5](project_929_r5_text_auto_terminator_only_formatter_rewrite_seam.md) — `* text=auto` makes a terminator-only rewrite uncommittable; key the commit on numstat non-empty -- [#929 R4](project_929_r4_wrapper_led_hook_containment_and_actions_log_seams.md) — pr-author hook matches gh+pr+create substrings in any pwsh payload; strip SGR from Actions logs -- [#929 R3](project_929_r3_post_merge_ci_sourced_gates_seams.md) — feature push starts NO ci.yml run; red-by-design needs ExpectedExitCode 1; no-shell git facts from .git/worktrees -- [#927 v1.15](project_927_r12_three_dot_anchor_and_control_ref_ancestry_seams.md) — after a mid-plan merge use `origin/main...HEAD`; read the reflog before adopting a control ref -- [#927 v1.14](project_927_r11_ci_sourced_coverage_and_multiset_fidelity_seams.md) — PoshQC returns only an ok flag: counts from JUnit, coverage from CI; blob-level multiset -- [#927 v1.13](project_927_v113_checkoff_must_read_the_pre_record_seams.md) — after a gate becomes pre/post, sweep consumers; Tee-Object -Append is a write -- [#927 v1.12](project_927_v112_two_point_census_and_ac_amendment_seams.md) — post-cleanup zero needs a pre-cleanup 1; ripgrep transcodes UTF-16; AC-amendment placement -- [#927 R10](project_927_r10_ci_session_state_and_folder_level_mcp_seams.md) — payload mirroring CI needs StrictMode + Stop; QA-loop commits break "every commit at a boundary" -- [#927 R9](project_927_r9_pwsh_process_directory_and_backslash_collapse_seams.md) — Set-Location does not move the .NET process dir; Git Bash collapses `\\` -- [#927 R8](project_927_r8_powershell_batch_phases_and_post_merge_reanchor_seams.md) — PS batch-budget hook is per session; a mid-run main merge voids BASE-SHA diffs -- [#928 R1-R2](project_928_r1_part_file_credit_diagnostic_seams.md) — a "part file 5/5" diagnostic cannot fail; Pester mocks beat re-dot-source -- [Legacy seams #136–#900](index_legacy_preflight_seams_pre_900.md) — sub-index of every per-issue seam note for #839 and earlier (#900, #895, #873, #871, #839 … #136) -- [#882 R0](project_882_transactiongate_bounded_acquisition_plan_seams.md) — spec's own token pre-falsifies repo-wide absence; analyzer skew back (3.0.235/4.4.0 vs 3.0.290/4.4.1), copy from primary checkout; runner emits projections only after its asserts, compose them in a helper; `[char]96` fences -- [#927 R16](project_927_r16_ledger_phrase_census_and_transcription_attribution_seams.md) — a ledger phrase census must include the summary UNMET parenthetical (three lines, not two); a figure an acceptance requires in an artifact needs a reading step or a "transcribed, read by preflight round N" label; a count-only file reference ("two part files") is a placeholder preflight fills with names; a deferred check-off task's own acceptance must carry the guard reading its host task states -- [#927 R15](project_927_r15_pull_request_merge_ref_and_ledger_recount_seams.md) — a pull_request CI run checks out the PR head merged with main's TIP, so a merge-base CI baseline needs a MAIN-TIP-NOW/MAIN-MOVED guard read after a fetch (NOT MET with BASELINE-SCOPE, not a stop); a ledger phrase matches two lines (Items-remaining + per-criterion): say which is removed/replaced and recount every derived count; appended post-commit tasks need their own confirming guard run; attribute main's movement CI-to-CI in plain prose -- [#927 R14](project_927_r14_premerge_local_baseline_reanchored_to_merge_base_ci_seams.md) — a pre-merge local coverage baseline is voided by the mid-plan merge (main moved 0.01 itself): re-anchor to main's CI run at the merge base, compare CI vs CI, control = local vs stale local through the same parser; vstest green run prints Total tests/Passed only (case-sensitive filters, artifacts carry BASELINE-PASSED:); a pwsh function that prints then returns leaks the prints into the return; coordinator "and pushes" / "don't add to C12" clauses conflicted with C9 and "no other task stops" -- [#927 R13](project_927_r13_delta_text_violates_own_check_and_quoted_phrase_residue.md) — run a returned delta's own check over the delta text before pasting (D1 spelled the contiguous segment it forbade); never quote a replaced phrase in the plan's record (absence search finds it); Edit preserves CRLF on multi-line inserts; Bash may be fully disabled, read reflogs with Read -- [#927 R6-R7](project_927_evidence_hygiene_sweep_plan_seams.md) — blast-radius extractor harvests multi-word INLINE spans; fence non-written payloads; colon-bang exclusions and directory tokens never harvested; R7: a final gate compared against a baseline figure the baseline task never recorded (log overwritten by the QA run) — record a labelled row and name it; "as P0-Tn" inheritance must be re-derived aloud -- [#928 R5](project_928_backtick_descoping_blast_radius_seams.md) — every inline span is a WRITE claim to the parallel scheduler; a "Glob pattern **/*.xml" span serializes the item; accepted vs dropped token shapes; fenced blocks unharvested; context paths in plain prose only -- [#929 R0-R2](project_929_manifest_residuals_plan_seams.md) — PS comma binds tighter than + (parenthesise pattern elements, gate PATTERNS=N); bare `[A-Za-z]:\\` matches `client-id:\s` (guard + SELFTEST_NEG); relative hit paths; restart on Write Set rewrite only; csharpier check can't rewrite; analyzer tuples drop line numbers for edited files; repair script verifies repaired text (DISAGREE may be 0); list-sdks prints [path]; no preflight signal strings in plan body; Import rule already exists; Meziantou 3.0.235 vs 3.0.290 CS0006; promotion commit breaks BASE-SHA footprint; `\\` de-doubled Bash->pwsh -- [#930 R0-R4](project_930_uithread_ilglobals_comments_plan_seams.md) — enumerate gated names in check-off citations, never count them; runner writes `.cobertura.jacoco.xml` + trx summary; dot-source + redefine Get-DotnetCoverageArgumentList; Bash collapses `''`, misbinds `""` inside `$( )`, halves `\\` (use [char]39/34/92); processed Cobertura filenames are backslash-separated; Grep-tool literals need regex escaping note; config/blast-radius.json `"modules"` key in source scope; no /t:Build for intermediate compiles -- [#931 R0-R4](project_931_uncontrolled_environment_tests_plan_seams.md) — R4: loop re-runs need per-iteration `ITERATION:` artifacts + highest-value selection; gate on "every iteration recorded REWRITTEN: 0", never "task X recorded"; core.autocrlf IS readable from a worktree (system config) — the R3 claim was wrong; re-grep occurrence claims after writing the round record. R3: autocrlf=true breaks revert SHA anchors (checkout writes CRLF, Write tool writes LF, diff --exit-code still 0): delete-then-checkout EOL restore in the fix-commit task, anchors AFTER it; .editorconfig [*.{cs,vb}] end_of_line=crlf; stale-output removal must include the runner's summary.txt; never backtick w/crlf-style tokens. R2: POST prints floor lines every run (route-independent gates); clear runner fixed-name outputs + stage copies before each run; (d0)/(d) aborted-run branches decided before POST; per-test admissibility; CMD-ADDED-LINES payload with positive control. R0-R1: runner asserts floors FIRST and throws raw on a failed test; comment literals inflate the census; alignment-dependent added-line counts; moved remarks carry `Workers=0`; Tee-Object no parent dir; MSBUILDDISABLENODEREUSE for child scripts; AC16 "zero failed" bars the #780 flake post-fix; post-control Write Set edits are a stop; backslash out-of-Write-Set pathspecs -- [#942 R0-R2](project_942_prime_fault_report_then_clear_plan_seams.md) — runner DELETES raw Cobertura outside coverage\ (transcribe .jacoco.xml/.summary.txt, never copy); [DataTestMethod] lacks [TestMethod]; R1: format BEFORE the code commit then P3 format must rewrite 0; two-window hunk rule on single-occurrence anchors; reflog at .git/worktrees//logs/HEAD readable without Bash; amend AC13 to name the inherited promotion record; R2: count columns of every gated single-line token (a 101-col BeEmpty call breaks into a chain and counts 0), gate reason strings by same-line FIRST-LINE equality, name the numstat command, cite POST-FORMAT sections, never pin a commit count -- [#944 R0-R2](project_944_prime_marker_registration_plan_seams.md) — UTF-8 git show decoding; re-derive "partition" line by line; STAGED-NEW; -C operand never double-quoted backslash; pass-2 rewrites first EXIT_CODE -- [#927](project_927_evidence_identity_hygiene_sweep_plan_seams.md) — AC per-file arithmetic fixes the guard's counting unit; git-grep-I-equivalent binary skip; pure Assert-GitExitCode seam (never invoke git); removal list from the guard's own lines; cobertura ignore pattern hits the runner's projection name; CITATION paths need a slash; backticked non-path slash tokens are harvested -- [#928](project_928_scoped_threshold_mcp_only_plan_seams.md) — MCP-only executor cannot measure scripts/vscode coverage (three-route task + work order); PoshQC format rewrote 0 of 46 so the issue's drift claim was Invoke-Formatter-default; verbose-mode regexes and multi-word spans keep slash tokens out of the harvest; RED for the right reason -- [#839](project_839_createcancellationtoken_init_plan_seams.md) — lone dead-comment deletion not CSharpier-stable; post-commit porcelain must admit the plan's own check-off; never record a porcelain COUNT; Phase 0 diff sentences prospective; exempt commit form `-m ... -- path` -- [#838 R1–R2](project_838_gettableinviewasync_null_contract_plan_seams.md) — timed CTS ctors DO exist (13 lines); porcelain gates assert SCOPE only; folder-wide commit task names NO artifact; repeatable literals at-least-one; ExpectedExitCode = observed value -- [#871](project_871_qfcqueue_enqueue_seams_plan_seams.md) — relocated-vs-new must be diff-derived (whitespace-stripped +/- match); a PS try/catch can't catch an external process (use 2>&1 + $LASTEXITCODE); a projected repo-wide rate over 65k lines can't fail (gate the delta); scope-lock needs an anchor carve-out -- [#602 R1-R3](project_602_host_identifier_sweep_plan_seams.md) — literal-free counts = ONE pwsh segment; never `git add -A`; backticked prose glob = harvested path; exit-1 baselines need ExpectedExitCode (every Pester baseline too); SELF-REVIEW anchors on task IDs never plan line numbers -- [#873 R2](project_873_evidence_projection_plan_seams.md) — It-level mock overrides beyond the BeforeEach; [int]GetAttribute('hits') throws when the attribute is absent -- [#792 R2](project_792_breadcrumb_webview2_init_plan_seams.md) - a bare token gate is pre-falsified by a sibling member name; no-arg CoreWebView2EnvironmentOptions leaves AdditionalBrowserArguments null; the -o backtick scan spans between tokens; moving a Write Set path leaves prose residuals in sibling sentences -- [#900 R2](project_900_r2_channel_gate_and_hash_placement_seams.md) — isolation refuses pwsh -Command and -File alike; #539 exemption models only -m (never -F) and exempt trees; probe channel + read checkpoint in Phase 0 with stop branches; hash spans after the probe; relative ASSEMBLY line can't carry the worktree segment; copy XML to artifacts/ only after the last clean format -- [#900 R1](project_900_dedicated_thread_mutation_placement_seams.md) — mutation placed before the precondition tests the wrong assertion; injected-ops overload throws at `:80` not `:364`; potential entries are MCP-only (executor hands off); `\"` corrupts `-Command` payloads; wrapped spec markers break count gates -- [#895 R0](project_895_fsharp_core_hintpath_plan_seams.md) — spec's "no 879 folder" false; AC5 token occurs twice; DataRow DisplayName bracket token; Rebuild keeps copied-ref timestamps; Meziantou 3.0.203 nuget bootstrap; runner state from console literals; hook path check hit 8/48 first lines -- [#816 R1-R3](project_816_iscompleted_branch2_ac5_plan_seams.md) — re-derive recovered figures; `coverage/.gitkeep` tracked; porcelain vacuous (hash instead); HangDumpType=None; green vstest prints no Failed:/Skipped: line; brace has no Cobertura line element; every delta clause needs a baseline count -- [#826 factory](project_826_factory_outside_try_reachability_seams.md) · [#826 R2-R5](project_826_console_out_banned_symbol_plan_seams.md) — seam outside `try`; `0 Error(s)` substring of `10 Error(s)`; uncompiled control emits nothing -- [#825 R1-R6](project_825_etl_deadline_mechanics_plan_seams.md) — latch encodes fixed timer order; Csc line names no project; runner excludes test dll; a comment above a cited range shifts it -- [#824 R1-R5](project_824_ilglobals_static_publication_plan_seams.md) — gate the installer's FS marker; "move" must state deletion; `--amend` hits the preceding task's commit; sort TRX by LastWriteTime -- [#823](project_823_self_anchor_diff_base_seams.md) — self-anchor at P0; check-off can complete with AC unmet; never key ExpectedExitCode to a baseline count -- [#821 R1](project_821_parentcleanup_double_release_plan_seams.md) — Read over-counts one line; Select-String is case-insensitive; untested pre-existing catch voids member gate -- [#815](project_815_coverage_aggregation_exposure_plan_seams.md) — zero baseline needs a positive control; pinned allowlist zeroes the helper; 500 legal, 501 not -- [#810 R1-R2](project_810_teardown_dropdown_residuals_plan_seams.md) — inherited paths as a RULE; never upper-bound a csharpier delta; TokenSource null before Cleanup -- [#798 R1](project_798_qfc_column_timeout_plan_seams.md) — frozen write set vs 882-line member; unwired seam observes 0; paren anchor misses generics -- [#797](project_797_folder_settings_persistence_plan_seams.md) — runner TestCaseFilter hard-coded; generic logger has no attach point; admitted red baseline voids exit-0 demands -- [#791](project_791_hc_deadline_cancel_teardown_plan_seams.md) · [#781](project_781_excludefromcodecoverage_guard_plan_seams.md) — QfcDatamodel excluded; no shell var survives; ExcludeFromCodeCoverage unmeasurable -- [#752](project_752_relative_path_anchor_plan_seams.md) · [#751 R3](project_751_r3_detached_launch_seams.md) · [#751 R2](project_751_sync_barrier_revision_seams.md) — `(^|\\)` anchor; detached launch sentinels; `nuget restore` -- [#736 R1-R5](project_736_efc_archiveroot_boundary_sink_plan_seams.md) · [#735 R1](project_735_evidence_content_sanitization_seams.md) — 485-line test file voids Write Set; name-only sanitization can't fail -- [#731 R1-R5](project_731_lifecycle_disposal_plan_seams.md) · [#731 R6-R12](project_731_r6_coverage_runner_bypass_seams.md) — near-limit forces partial; runner self-blocks in agent worktree -- [#680](project_680_menu_mode_plan_seams.md) · [#678](project_678_carry_folder_predictor_plan_seams.md) · [#677 R1-R8](project_677_keyboard_focus_leak_plan_seams.md) — HostTests 499; runner throws twice; ctor param REJECTED -- [#670 fault](project_670_webview_fault_boundary_plan_seams.md) · [#670 sanitisation](project_670_capture_time_sanitisation_seams.md) · [#663](project_663_qfc_alt_chord_plan_seams.md) — awaiter breaks "no pump"; indirect vswhere leak; compile-red to runtime red -- [#662](project_662_banner_prefix_arity_plan_seams.md) · [R2](project_662_banner_prefix_revision_round_seams.md) · [R3](project_662_round3_trx_hygiene_and_verbatim_seams.md) — `AC5` prefixes `AC5b`; `*.trx` NOT gitignored -- [#656](project_656_closecompleted_guard_plan_seams.md) · [#648](project_648_ungated_static_swap_plan_seams.md) · [#647 R1-R2](project_647_fileio2_retry_plan_seams.md) — no TestCaseFilter override; 5% tolerance; explicit `/Settings:` -- [#644](project_644_ac16_referral_revision_seams.md) · [c2](project_644_cycle2_sweep_gate_evasion_seams.md) · [PA-7](project_644_pa7_redaction_plan_seams.md) — named instrument prints no figure; rewording is evasion -- [#637 R6](project_637_r6_superseded_spec_claim_seams.md) · [R2-R5](project_637_selectrow_rooted_path_plan_seams.md) · [#635](project_635_reflective_caller_audit_plan_seams.md) · [#633](project_633_undo_handoff_plan_seams.md) -- [#614](project_614_store_root_leak_plan_seams.md) · [#553](project_553_ci_parallel_split_plan_seams.md) · [#512](project_512_toolchain_gate_fidelity_plan_seams.md) · [#511 R1](project_511_r1_preflight_delta_seams.md) -- [#505](project_505_toggle_state_guards_plan_seams.md) · [#503](project_503_ribbon_readiness_plan_seams.md) · [#501 R1](untracked-file-and-linecount-gate-seams.md) · [#501 R3](project_501_r3_preflight_seams.md) -- [#498](conditional-ladder-and-unowned-class-gates.md) · [#497 F16](project_497_f16_capstone_plan_seams.md) · [#494](project_494_threshold_reconciliation_plan_seams.md) · [#493](project_493_uithread_dispatcher_plan_seams.md) -- [#489](project_489_partn_reroute_amendment_seams.md) · [#484](project_484_qfc_revision_seams.md) · [capacity squeeze](project_qfcitemcontroller_test_capacity_squeeze.md) · [#469](project_469_comment_accuracy_plan_seams.md) -- [#468 preflight](project_468_preflight_revision_seams.md) · [#468 QFC](project_468_qfc_collection_controller_plan_seams.md) · [#464](project_464_efc_controller_plan_seams.md) · [#457](project_457_closure_filter_plan_seams.md) -- [#456 F14](project_456_f14_itemviewer_plan_seams.md) · [#455 F13](project_455_f13_breadcrumb_webview_plan_seams.md) · [#453](project_453_qfcitemcontroller_plan_seams.md) · [#452 F9](project_452_efc_form_item_viewer_plan_seams.md) -- [#442](project_442_quickfiler_metrics_plan_seams.md) · [#441](project_441_cobertura_arithmetic_plan_seams.md) · [#440](project_440_breadcrumb_left_arrow_plan_seams.md) · [#437](project_437_efc_home_controller_plan_seams.md) -- [#433 F7](project_433_f7_qfchomecontroller_plan_seams.md) · [#432](project_432_coverage_ledger_plan_seams.md) · [#430](project_430_quickfiler_keyboard_plan_seams.md) · [#400](project_400_partial_class_headroom_placement.md) · [#136](project_136_wave1_nonhalting_f1_dependency.md) +- [#985 R0](project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md) — merge-into-Dependabot rehearsal needs a simulated nuget update; hygiene guard flags Users paths in tracked plans; Invoke-VSBuild rewrites csproj +- [#973 R1](project_973_r1_last_task_artifact_only_commit_and_measured_line_length_seams.md) — last task commits its artifact alone; dossier cites no later result; measure line length with `^.{N,}`; Glob zero-gate needs a positive control +- [#973 cycle 1](project_973_cycle1_premise_correction_refscan_and_tautology_fold_seams.md) — false-premise AC fixed by a refscan + positive control; a "tautology" may be an analyzer workaround; commit-per-task flip-then-commit +- [#964 cycle 1](project_964_cycle1_test_only_coverage_gap_remediation_seams.md) — test-only coverage-gap plan: dossier not fail-before, data-row trx prefix match, commit-task check-off circularity +- [Seams #882–#973](index_preflight_seams_900_to_973.md) — sub-index: #968, #964 R0-R4, #959, #956, #953, #952, #950, #948, #947, #945, #940, #931, #930, #929, #928, #927, #944, #942, #882, #973 R0-R6 +- [Legacy seams #136–#900](index_legacy_preflight_seams_pre_900.md) — sub-index of every per-issue seam note for #900 and earlier (#900, #895, #873, #871, #839 … #136) ## Plan structure and revision mechanics @@ -153,23 +68,4 @@ ## Artifact hygiene -- [No absolute host paths](../_shared_no_absolute_host_paths.md) — use `` / `` / `` -- [#973 R6](project_973_r6_fold_governing_clarification_into_dictated_sentence_seam.md) — an accepted planner clarification replaces the dictated sentence as ONE rule (delete the superseded wording and the "planner clarification, revision N" label; sweep both to 0); quote and re-verify the following-line literal (count 1) in the same pass; re-stamp the drifted "Revision N applied" note under the bounded record -- [#973 R5](project_973_r5_positional_restore_rule_and_enumeration_self_hit_recurrence_seams.md) — a dictated restore rule phrased by line POSITION picks the wrong line after the deletion shifted lines and is silent on an adjacent pair's order (clarify by text identity, flag the addition); enumeration self-hit recurred (re-run the superseded-literal and digit Greps after writing section 14); re-measure dictated figures with the delta's own pattern -- [#973 R4](project_973_r4_member_multiset_formatter_blank_lines_and_optional_trailer_seams.md) — a declaration census is a MULTISET (two identical overload lines, 195/224); formatter-forced blank lines beside a moved block need a spec amendment backed by multiline-Grep zeros; attribution may omit Claude-Session (`TRAILER-2: none`); `\bCS(...)\b` on every code pattern; `hash-object --no-filters` under text=auto; a restore branch cascades into numstat/name-list expectations; Bash can be disabled outright -- [#973 R3](project_973_r3_scope_fold_scripted_region_move_and_renumbered_tail_seams.md) — move a region by marker-anchored pwsh copy (not transcription) and cut the blank lines above the `#region`; a fallback `git checkout -- csproj` discards later Compile Includes; insert check-offs before the status/commit tail; format-sensitive Write Set files need a loop-fix commit; `\x60` = backtick in Grep; .NET file APIs ignore Set-Location -- [#973 R2](project_973_r2_log_entry_self_hit_pester_unroll_and_figure_carrying_artifact_seams.md) — a revision-log entry quoting the OLD self-matching literal re-creates the self-hit (describe it in prose; re-measure the folder count after every log edit); Pester 5 unrolls a one-element expected array (`Expected 'x', because ..., but got @('x', 'y')`); a check-off must cite the artifact that RECORDS the figure (P3-T13 SLAE line), not an earlier task -- [#973 R1](project_973_r1_current_census_union_string_should_message_and_self_hit_pattern_seams.md) — post-sweep file list = stale UNION already-corrected (measure the corrected-version census in P0); `-BeExactly` on strings prints `but they were different`, not `, but got`; `/c/Users/` quoted in a host-path gate self-hits the plan (write `/c/Users[\\/]`); commit trailers are session facts (placeholders + hook char rule); no absolute WORKTREE line even as a placeholder definition; _pester.yml floors a 3-folder union; TRX summary line 2 ends `, failed N.` -- [#973 R0](project_973_r0_range_guard_vacuous_before_and_coverage_tolerance_seams.md) — a range-only redirect guard is never red before a sweep (stale entries read `0.0.0.0-X`/`X`; pin via the csproj Reference map); strict first-party coverage `>=` baseline fails on identical-tree noise (0.10 pp tolerance when denominators equal); no Bash: read `.git/worktrees//HEAD` + refs; `\r$` vs `^` counts show csproj/packages.config lack a trailing newline -- [#959 R13](project_959_r13_two_sided_path_census_and_recorded_not_gated_rate_comparison_seams.md) — fan-in additions-only gate must compute the two-sided path set mechanically (SHARED-WITH-LOSS + a `0 1` control), not name "the one overlap"; same-tree two-decimal rate comparison is recorded not gated, family rows are the gate; FILES floors must equal their breakdown sums -- [#959 R10](project_959_r10_append_phases_review_residuals_and_pr_time_merge_seams.md) — append phases to an executed plan: Cobertura condition-coverage as the discriminator for a coverage-only test; pwsh payload hook rule (git + worktree path + remove); post-merge fan-in anchored at the fetched origin/main SHA with committed-range controls; fixed-name artifacts rewritten with ITERATION/SUPERSEDES; main-side csproj hunk read from a sibling worktree -- [#959 R9](project_959_r9_mid_phase_insertion_renumber_and_iteration2_rerun_seams.md) — insert tasks into an executed final phase: two-step `P6-Tx` renumbering, orphan stop record under the old number, ITERATION-2 re-run keeps the earlier artifact name, doc-comment widening gated by diff-identity labels not a test -- [#959 R8](project_959_r8_fluentassertions_string_diff_truncation_message_gate_seam.md) — FluentAssertions string Be() prints only a window after an ellipsis around the first differing index: gate the assertion-subject text + string tails (`GetDirectoryName(helper.FilePathSaveAlt)`, `origin"`), never a path literal; count/integer messages are not truncated; a fixed-name stop record is rewritten in full by the re-run -- [#959 R7](project_959_r7_ac_by_reference_spec_correction_and_delta_backtick_seams.md) — an AC that says "exact types in Technical specifications" incorporates them: a seam-type change must correct those spec lines in place and gate them in the check-off task; reviewer deltas use double backticks as delimiters; "0 lines" self-review claims self-hit -- [#959 R6](project_959_r6_cs1769_embedded_interop_generic_seam_and_per_task_commit_gates.md) — CS1769: `Func` cannot cross UtilitiesCS (EmbedInteropTypes True) to its test project; use a nested non-generic delegate, add a census state column instead of editing executed columns; per-task commits: own-edit gates keep the working-tree `MERGE-BASE` form, earlier-task gates use `MERGE-BASE HEAD`, porcelain is pre-commit only -- [#959 R5](project_959_r5_bash_dedoubles_backslashes_in_pwsh_command_payloads.md) — Bash de-doubles `\\` in a pwsh -Command payload (`[\\/]` becomes `[\/]`, zero-count gate over backslash paths unsatisfiable); normalize with `[char]92` + forward-slash pattern, add True/False controls, whole-plan `\\` sweep classifying payload vs Listing vs prose -- [#959 R4](project_959_r4_shared_anchor_controls_native_exit_labels_and_schema_rows_first_seams.md) — a control must share the predicate's `$anchor` variable and have a positive twin; every native call needs its own `$LASTEXITCODE` label (not-found leaves 0); schema rows first (first occurrence wins); loop-rule "edit only spec.md" must name the repair branch -- [#959 R3](project_959_r3_checkoff_evidence_precedes_edit_and_line_anchored_field_check_seams.md) — a check-off must run its gate before the Edit and forward-record it; `Contains("EXIT_CODE:")` matches `FORMAT_EXIT_CODE:` (anchor `(?m)^[^\w\r\n]*` + printed False control); task row enumerations drop the plain `EXIT_CODE:` row -- [#959 R2](project_959_r2_pre_existing_evidence_ordering_and_no_git_channel_seams.md) — "unless PRE-EXISTING-EVIDENCE names it" is always true for an earlier task's artifact; evidence-field INHERITED = Clause A minus own P0 artifacts, run twice; no Bash: record caller git claims as statements, cite .gitignore by content -- [#959 R1](project_959_r1_census_initializer_displayname_and_worktree_claude_filter_seams.md) — census tokens match field initializers; DisplayName rows inflate method-name counts; `*\.claude\*` absolute filter excludes an item worktree entirely; AC26 allows only three evidence subfolders; flaky-branch ACs need conditional check-off; declare compile-red spans -- [#959 R0](project_959_r0_resume_append_point_and_nonexempt_hash_seams.md) — resume banner repeats the APPEND-POINT marker; AC lines are `- [ ] ACn (`; post-format Edits "indentation as found"; AC25 gate = hash of `::` non-exempt uncovered set; rule (3) needs both shapes once the outer catch goes +- [No absolute host paths](../_shared_no_absolute_host_paths.md) — use `` / `` / ``; the CI hygiene guard flags drive-rooted Users paths in any tracked file (see #985 R0) diff --git a/.claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md b/.claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md new file mode 100644 index 000000000..c34786d3a --- /dev/null +++ b/.claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md @@ -0,0 +1,82 @@ +--- +name: index-preflight-seams-900-to-973 +description: Sub-index of per-issue preflight revision seam notes for issues #882 through #973 (moved out of MEMORY.md on 2026-10-09 to keep the main index under its size limit); open this when a plan touches one of those issues' files or components, or before planning PowerShell/C# QA gates, coverage runners, hygiene sweeps or commit-per-task mechanics +metadata: + type: reference +--- + +Per-issue preflight seam notes for #882 to #973, newest first within each group. Each link is a sibling file in this directory. Older notes: [[index-legacy-preflight-seams-pre-900]]. + +## #968 to #882 + +- [#968 R5](project_968_r5_multi_pass_format_exemption_and_no_bash_cr_check_seams.md) — a format exemption keyed to "rewritten this pass" fails on any restart: add PRIOR-PASS-REWRITTEN + RESTART-CORRECTED (union of ALL corrections); no Bash means Grep `\r` for the CR check +- [#968 R4](project_968_r4_restart_path_reanchor_and_recorded_not_gated_exemption_seams.md) — restart into a pre-commit census needs BASE ref + membership porcelain; exempt recorded-not-gated values (HUNK_COUNT, SPAN) from "as last recorded"; #region hits need a category +- [#968 R3](project_968_r3_last_recorded_value_rule_and_merged_payload_hook_seams.md) — post-format census must say "as last recorded for its file"; classification stop-rules must cover method-group assignments; merged pwsh payloads trip the gh+issue+new hook; re-count spec facts after amendments +- [#964 R4](project_964_r4_post_merge_footprint_reanchor_with_negative_controls.md) — mid-plan merge: move only the whole-tree footprint gate to MERGE-SHA, add two committed-range negative controls; no Bash means no hash-object +- [#964 R3](project_964_r3_glob_backslash_and_hit_attribution_seams.md) — Glob paths are backslash (rev-parse HEAD: needs `/`); totals-only sweep can't decide per-file branch +- [#964 R2](project_964_r2_preparation_record_closed_evidence_set.md) — preparation commits preflight-clearance.*.md before execution; closed evidence sets must admit + blob-pin it +- [#964 R0-R1](project_964_partial_split_sink_guard_plan_seams.md) — Grep tokens are regex; ordinal multiset split census; pre-existing-failure rule compares trx FQNs; last-task hygiene sweep +- [#950 R2](project_950_r2_self_matching_process_probe_and_bom_numstat_seams.md) — CommandLine process probe counts itself; BOM drop adds +1/-1 numstat; failed set hides aborted tests +- [#950 R1](project_950_r1_inline_continuation_and_reindent_width_seams.md) — default TCS continues inline so Drain() is vacuous; using() re-indent breaks width +- [#950 v1.0](project_950_hygiene_blocks_absolute_prefix_and_always_failing_probe_seams.md) — absolute prefix breaks hygiene rule B; always-failing probe; commit task's own artifact in porcelain +- [#956 R1.2](project_956_r12_rethrow_brace_exemptions_and_indent_keyed_catch_rule.md) — lifting EFCC exposes braces after `throw;`; construct-identified exemptions; catch rule keyed to indent +- [#956 R1](project_956_r1_spec_self_hit_and_raw_doc_name_seams.md) — spec-wording counts self-hit the AC line; anchor `cobertura[^/]*\.xml$`; amended AC needs a P0 literal check +- [#953 R3](project_953_r3_grep_gitignore_directory_path_and_measured_line_lengths.md) — Grep honours .gitignore for a DIRECTORY path, Glob does not; measure line lengths with `^.{N,}` +- [#953 R2](project_953_r2_grep_long_line_omission_and_cr_anchor_seams.md) — Grep omits lines over ~500 chars; `$` fails before CR (`\r?$`); expect-fail needs a wrong-reason branch +- [#953 R1](project_953_r1_pwsh_refused_and_count_recheck_seams.md) — Bash guard refuses pwsh; re-count blocks per file; `-Force` count-0 self-hits +- [#953 R0](project_953_fizzler_redirect_sweep_and_ratchet_plan_seams.md) — ripgrep strips the BOM; text=auto hides CRLF loss (gate `git ls-files --eol`) +- [#952 R3](project_952_r3_shared_origin_main_ancestry_gate_seam.md) — origin/main is shared by all worktrees: a no-fetch plan still needs a P0 `merge-base == BASE-SHA` gate +- [#952 R2](project_952_r2_label_counts_helper_enumeration_and_hex_backslash_seams.md) — recount `all N required` labels; directory-enumerating helper reads every file; backslash as `\x5C` +- [#952 R1](project_952_r1_read_phantom_row_and_frozen_clause_a_seams.md) — Read trailing empty row is inconsistent (count with Grep `^`); freeze footprint Clause A from P0 +- [#952 R0](project_952_runbook_and_workflow_comment_plan_seams.md) — `.yml` edits are pre-impl-gated; CRLF adds 1 to line length; actionlint silent on success +- [#948 v0.3](project_948_sibling_first_shape_reconciliation_seams.md) — sibling lands first: named shapes with content anchors, baseline-relative try/catch gate, re-budget 500-line ceiling +- [#947 pass A](project_947_passA_second_call_site_consolidation_seams.md) — mid-plan second call site: nested catch end keyed to header indent; re-derive "N catch clauses" +- [#945 R0](project_945_sortemail_trysave_directory_seam_plan_seams.md) — whitespace-stripped token census; compile-red fail-before; uncommitted-fix control via backup copy +- [#940 R3](project_940_r3_per_file_coverage_rule_and_post_merge_reanchor_seams.md) — aggregate not-lower gates trip on variance; per-file lines+branches rule; ANCHOR-SHA-2 = `^2` +- [#929 R5](project_929_r5_text_auto_terminator_only_formatter_rewrite_seam.md) — `* text=auto` makes a terminator-only rewrite uncommittable; key the commit on numstat non-empty +- [#929 R4](project_929_r4_wrapper_led_hook_containment_and_actions_log_seams.md) — pr-author hook matches gh+pr+create substrings in any pwsh payload; strip SGR from Actions logs +- [#929 R3](project_929_r3_post_merge_ci_sourced_gates_seams.md) — feature push starts NO ci.yml run; red-by-design needs ExpectedExitCode 1; no-shell git facts from .git/worktrees +- [#927 v1.15](project_927_r12_three_dot_anchor_and_control_ref_ancestry_seams.md) — after a mid-plan merge use `origin/main...HEAD`; read the reflog before adopting a control ref +- [#927 v1.14](project_927_r11_ci_sourced_coverage_and_multiset_fidelity_seams.md) — PoshQC returns only an ok flag: counts from JUnit, coverage from CI; blob-level multiset +- [#927 v1.13](project_927_v113_checkoff_must_read_the_pre_record_seams.md) — after a gate becomes pre/post, sweep consumers; Tee-Object -Append is a write +- [#927 v1.12](project_927_v112_two_point_census_and_ac_amendment_seams.md) — post-cleanup zero needs a pre-cleanup 1; ripgrep transcodes UTF-16; AC-amendment placement +- [#927 R10](project_927_r10_ci_session_state_and_folder_level_mcp_seams.md) — payload mirroring CI needs StrictMode + Stop; QA-loop commits break "every commit at a boundary" +- [#927 R9](project_927_r9_pwsh_process_directory_and_backslash_collapse_seams.md) — Set-Location does not move the .NET process dir; Git Bash collapses `\\` +- [#927 R8](project_927_r8_powershell_batch_phases_and_post_merge_reanchor_seams.md) — PS batch-budget hook is per session; a mid-run main merge voids BASE-SHA diffs +- [#928 R1-R2](project_928_r1_part_file_credit_diagnostic_seams.md) — a "part file 5/5" diagnostic cannot fail; Pester mocks beat re-dot-source +- [#882 R0](project_882_transactiongate_bounded_acquisition_plan_seams.md) — spec's own token pre-falsifies repo-wide absence; analyzer skew back (3.0.235/4.4.0 vs 3.0.290/4.4.1), copy from primary checkout; runner emits projections only after its asserts, compose them in a helper; `[char]96` fences +- [#927 R16](project_927_r16_ledger_phrase_census_and_transcription_attribution_seams.md) — a ledger phrase census must include the summary UNMET parenthetical (three lines, not two); a figure an acceptance requires in an artifact needs a reading step or a "transcribed, read by preflight round N" label; a count-only file reference ("two part files") is a placeholder preflight fills with names; a deferred check-off task's own acceptance must carry the guard reading its host task states +- [#927 R15](project_927_r15_pull_request_merge_ref_and_ledger_recount_seams.md) — a pull_request CI run checks out the PR head merged with main's TIP, so a merge-base CI baseline needs a MAIN-TIP-NOW/MAIN-MOVED guard read after a fetch (NOT MET with BASELINE-SCOPE, not a stop); a ledger phrase matches two lines (Items-remaining + per-criterion): say which is removed/replaced and recount every derived count; appended post-commit tasks need their own confirming guard run; attribute main's movement CI-to-CI in plain prose +- [#927 R14](project_927_r14_premerge_local_baseline_reanchored_to_merge_base_ci_seams.md) — a pre-merge local coverage baseline is voided by the mid-plan merge (main moved 0.01 itself): re-anchor to main's CI run at the merge base, compare CI vs CI, control = local vs stale local through the same parser; vstest green run prints Total tests/Passed only (case-sensitive filters, artifacts carry BASELINE-PASSED:); a pwsh function that prints then returns leaks the prints into the return; coordinator "and pushes" / "don't add to C12" clauses conflicted with C9 and "no other task stops" +- [#927 R13](project_927_r13_delta_text_violates_own_check_and_quoted_phrase_residue.md) — run a returned delta's own check over the delta text before pasting (D1 spelled the contiguous segment it forbade); never quote a replaced phrase in the plan's record (absence search finds it); Edit preserves CRLF on multi-line inserts; Bash may be fully disabled, read reflogs with Read +- [#927 R6-R7](project_927_evidence_hygiene_sweep_plan_seams.md) — blast-radius extractor harvests multi-word INLINE spans; fence non-written payloads; colon-bang exclusions and directory tokens never harvested; R7: a final gate compared against a baseline figure the baseline task never recorded (log overwritten by the QA run) — record a labelled row and name it; "as P0-Tn" inheritance must be re-derived aloud +- [#928 R5](project_928_backtick_descoping_blast_radius_seams.md) — every inline span is a WRITE claim to the parallel scheduler; a "Glob pattern **/*.xml" span serializes the item; accepted vs dropped token shapes; fenced blocks unharvested; context paths in plain prose only +- [#929 R0-R2](project_929_manifest_residuals_plan_seams.md) — PS comma binds tighter than + (parenthesise pattern elements, gate PATTERNS=N); bare `[A-Za-z]:\\` matches `client-id:\s` (guard + SELFTEST_NEG); relative hit paths; restart on Write Set rewrite only; csharpier check can't rewrite; analyzer tuples drop line numbers for edited files; repair script verifies repaired text (DISAGREE may be 0); list-sdks prints [path]; no preflight signal strings in plan body; Import rule already exists; Meziantou 3.0.235 vs 3.0.290 CS0006; promotion commit breaks BASE-SHA footprint; `\\` de-doubled Bash->pwsh +- [#930 R0-R4](project_930_uithread_ilglobals_comments_plan_seams.md) — enumerate gated names in check-off citations, never count them; runner writes `.cobertura.jacoco.xml` + trx summary; dot-source + redefine Get-DotnetCoverageArgumentList; Bash collapses `''`, misbinds `""` inside `$( )`, halves `\\` (use [char]39/34/92); processed Cobertura filenames are backslash-separated; Grep-tool literals need regex escaping note; config/blast-radius.json `"modules"` key in source scope; no /t:Build for intermediate compiles +- [#931 R0-R4](project_931_uncontrolled_environment_tests_plan_seams.md) — per-iteration `ITERATION:` artifacts; core.autocrlf readable from a worktree; autocrlf=true breaks revert SHA anchors (delete-then-checkout EOL restore); stale-output removal includes the runner's summary.txt; runner asserts floors FIRST and throws raw on a failed test; MSBUILDDISABLENODEREUSE for child scripts; AC16 "zero failed" bars the #780 flake post-fix +- [#942 R0-R2](project_942_prime_fault_report_then_clear_plan_seams.md) — runner DELETES raw Cobertura outside coverage\ (transcribe .jacoco.xml/.summary.txt); [DataTestMethod] lacks [TestMethod]; format BEFORE the code commit; two-window hunk rule; reflog readable without Bash; count columns of gated single-line tokens; gate reason strings by FIRST-LINE equality; never pin a commit count +- [#944 R0-R2](project_944_prime_marker_registration_plan_seams.md) — UTF-8 git show decoding; re-derive "partition" line by line; STAGED-NEW; -C operand never double-quoted backslash; pass-2 rewrites first EXIT_CODE +- [#927](project_927_evidence_identity_hygiene_sweep_plan_seams.md) — AC per-file arithmetic fixes the guard's counting unit; git-grep-I-equivalent binary skip; pure Assert-GitExitCode seam; removal list from the guard's own lines; cobertura ignore pattern hits the runner's projection name; CITATION paths need a slash +- [#928](project_928_scoped_threshold_mcp_only_plan_seams.md) — MCP-only executor cannot measure scripts/vscode coverage (three-route task + work order); PoshQC format rewrote 0 of 46; verbose-mode regexes keep slash tokens out of the harvest; RED for the right reason + +## #973 R0-R6 and #959 R0-R13 + +- [#973 R6](project_973_r6_fold_governing_clarification_into_dictated_sentence_seam.md) — an accepted planner clarification replaces the dictated sentence as ONE rule; quote and re-verify the following-line literal; re-stamp the drifted "Revision N applied" note +- [#973 R5](project_973_r5_positional_restore_rule_and_enumeration_self_hit_recurrence_seams.md) — a restore rule phrased by line POSITION picks the wrong line after a deletion; enumeration self-hit recurred; re-measure dictated figures with the delta's own pattern +- [#973 R4](project_973_r4_member_multiset_formatter_blank_lines_and_optional_trailer_seams.md) — a declaration census is a MULTISET; formatter-forced blank lines need a spec amendment; attribution may omit Claude-Session; `hash-object --no-filters` under text=auto; Bash can be disabled outright +- [#973 R3](project_973_r3_scope_fold_scripted_region_move_and_renumbered_tail_seams.md) — move a region by marker-anchored pwsh copy; a fallback `git checkout -- csproj` discards later Compile Includes; format-sensitive Write Set files need a loop-fix commit; .NET file APIs ignore Set-Location +- [#973 R2](project_973_r2_log_entry_self_hit_pester_unroll_and_figure_carrying_artifact_seams.md) — a revision-log entry quoting the OLD literal re-creates the self-hit; Pester 5 unrolls a one-element expected array; a check-off must cite the artifact that RECORDS the figure +- [#973 R1](project_973_r1_current_census_union_string_should_message_and_self_hit_pattern_seams.md) — post-sweep file list = stale UNION already-corrected; `-BeExactly` prints `but they were different`; host-path gate literal self-hits the plan; _pester.yml floors a 3-folder union; TRX summary line 2 ends `, failed N.` +- [#973 R0](project_973_r0_range_guard_vacuous_before_and_coverage_tolerance_seams.md) — a range-only redirect guard is never red before a sweep (pin via the csproj Reference map); strict first-party coverage `>=` baseline fails on noise (0.10 pp tolerance); csproj/packages.config lack a trailing newline +- [#959 R13](project_959_r13_two_sided_path_census_and_recorded_not_gated_rate_comparison_seams.md) — fan-in additions-only gate needs a mechanical two-sided path set; same-tree two-decimal rate comparison is recorded not gated +- [#959 R10](project_959_r10_append_phases_review_residuals_and_pr_time_merge_seams.md) — append phases to an executed plan; Cobertura condition-coverage discriminator; post-merge fan-in anchored at the fetched origin/main SHA +- [#959 R9](project_959_r9_mid_phase_insertion_renumber_and_iteration2_rerun_seams.md) — two-step task renumbering, orphan stop record, ITERATION-2 re-run keeps the earlier artifact name +- [#959 R8](project_959_r8_fluentassertions_string_diff_truncation_message_gate_seam.md) — FluentAssertions string Be() prints only a window around the first difference; gate subject text + tails, never a path literal +- [#959 R7](project_959_r7_ac_by_reference_spec_correction_and_delta_backtick_seams.md) — an AC that incorporates spec sections by reference needs those spec lines corrected and gated +- [#959 R6](project_959_r6_cs1769_embedded_interop_generic_seam_and_per_task_commit_gates.md) — CS1769 across EmbedInteropTypes; per-task commit gate forms +- [#959 R5](project_959_r5_bash_dedoubles_backslashes_in_pwsh_command_payloads.md) — Bash de-doubles `\\` in pwsh -Command payloads; normalize with `[char]92` +- [#959 R4](project_959_r4_shared_anchor_controls_native_exit_labels_and_schema_rows_first_seams.md) — controls share the predicate's anchor; every native call needs its own `$LASTEXITCODE` label; schema rows first +- [#959 R3](project_959_r3_checkoff_evidence_precedes_edit_and_line_anchored_field_check_seams.md) — a check-off runs its gate before the Edit; `Contains("EXIT_CODE:")` matches `FORMAT_EXIT_CODE:` +- [#959 R2](project_959_r2_pre_existing_evidence_ordering_and_no_git_channel_seams.md) — "unless PRE-EXISTING-EVIDENCE names it" is always true for an earlier artifact; no Bash: record caller git claims as statements +- [#959 R1](project_959_r1_census_initializer_displayname_and_worktree_claude_filter_seams.md) — census tokens match field initializers; DisplayName rows inflate counts; `*\.claude\*` filter excludes an item worktree +- [#959 R0](project_959_r0_resume_append_point_and_nonexempt_hash_seams.md) — resume banner repeats the APPEND-POINT marker; AC lines are `- [ ] ACn (`; non-exempt uncovered-set hash gate diff --git a/.claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md b/.claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md new file mode 100644 index 000000000..84e35693f --- /dev/null +++ b/.claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md @@ -0,0 +1,17 @@ +--- +name: project-985-r0-rehearsal-fidelity-and-hygiene-path-seams +description: "#985 round 0 plan seams - a merge-the-fix-into-the-Dependabot-branch rehearsal is unfaithful when the fix adds package declarations (the test projects stay pinned to the old version; simulate Dependabot's bump with nuget update per new pair); the hygiene guard fails CI on any drive-rooted Users path in a tracked file, including the plan itself and caller-supplied scratchpad paths; Invoke-VSBuild runs Sync-PackageReferences which rewrites csproj HintPaths; rehearsal merges need -X ours plus content re-apply" +metadata: + type: project +--- + +Planning #985 (2026-10-09; Dependabot repair: borrowed test packages + transitive binding redirects) surfaced four seams. + +**Why:** each would have produced a false rehearsal failure or a red hygiene CI job unrelated to the fix. + +**How to apply:** +- A rehearsal that merges a fix adding `packages.config` declarations into an existing Dependabot branch leaves the newly declaring projects at the pre-bump version while their production references are bumped; the post-merge `@dependabot recreate` would bump them too. Insert a simulated Dependabot step (`nuget update \packages.config -Id -Version -RepositoryPath`) for each new pair whose production sibling differs, leave redirects to the repair script, and flag the decision to the caller (the AC text did not mention it). +- `scripts/hygiene/Test-RepositoryHygiene.Rules.ps1` line 21 flags `[a-z]:[\\/]+users[\\/]+...` in every tracked file. A caller-supplied scratchpad path (C-drive Users temp dir) must be written as `$env:LOCALAPPDATA\Temp\...` in the plan, and every helper script must replace roots and profile paths before printing. Positive control for a zero-count scan: the linked worktree's `.git` pointer file matches once. +- `scripts/vscode/Invoke-VSBuild.ps1` lines 247-253 run `Sync-PackageReferences.ps1` before building, which can rewrite csproj HintPaths; for manifest-defect work resolve MSBuild via vswhere and run the CLAUDE.md arguments directly. +- Long helper payloads go into scratch `.ps1` files outside the repo (the PS batch-budget hook ignores paths outside the root, line 288), which also removes Bash-to-pwsh quoting hazards. +- Related: [[project-930-uithread-ilglobals-comments-plan-seams]] (runner dot-source + redefine for the shell-icon filter), [[poshqc-mcp-and-msbuild-invocation-facts]]. diff --git a/.claude/agent-memory/task-researcher/MEMORY.md b/.claude/agent-memory/task-researcher/MEMORY.md index 8c65c2e8c..f0798a91b 100644 --- a/.claude/agent-memory/task-researcher/MEMORY.md +++ b/.claude/agent-memory/task-researcher/MEMORY.md @@ -1,19 +1,36 @@ # Task Researcher Memory Index +## Sub-indexes +- [epic136-percoverage-children](index_epic136_percoverage_children.md) — 35 QuickFiler/EFC per-file coverage child notes (430-495, 227) +- [quickfiler-efc-defects](index_quickfiler_efc_defects.md) — 40 QuickFiler/EFC/SortEmail defect and behaviour notes + ## Hygiene, feedback, references - [no-absolute-host-paths](../_shared_no_absolute_host_paths.md) — use ``/``/``; rename TRX before citing -- [no-absolute-host-paths](../_shared_no_absolute_host_paths.md) — use ``/``; rename TRX before citing -- [exemption-audit-proven-techniques](feedback_exemption_audit_check_proven_techniques.md) — grep proven techniques before IRREDUCIBLE -- [measure-item-worktree](feedback_measure_item_worktree_not_session_worktree.md) — measure the item worktree, not the session one -- [committed-cobertura-baselines](reference_committed_cobertura_baselines.md) — per-line coverage in docs/features/*/evidence -- [net481-timeprovider](reference_net481_timeprovider_available.md) — FakeTimeProvider usable on net481 +- [exemption-audit-proven-techniques](feedback_exemption_audit_check_proven_techniques.md) — grep proven techniques + sibling consistency before IRREDUCIBLE +- [measure-item-worktree](feedback_measure_item_worktree_not_session_worktree.md) — read facts from the ITEM worktree; uniform off-by-N = stale tree +- [committed-cobertura-baselines](reference_committed_cobertura_baselines.md) — per-line coverage in docs/features/*/evidence/*.cobertura.xml +- [net481-timeprovider](reference_net481_timeprovider_available.md) — FakeTimeProvider usable on net481; reject "net8+ only" - [github-issue-search-without-gh](reference_github_issue_search_without_gh.md) — WebFetch issues?q=...; mark [V-web] -- [nuget-flatcontainer-nuspec-webfetch](reference_nuget_flatcontainer_nuspec_webfetch.md) — packages/ has no .nuspec; fetch api.nuget.org flat-container nuspec +- [nuget-flatcontainer-nuspec](reference_nuget_flatcontainer_nuspec_webfetch.md) — packages/ has no .nuspec; fetch api.nuget.org flat-container nuspec + +## Dependencies / Dependabot / packages.config +- [dependabot-repair-script-source-985](project_dependabot_repair_workflow_run_script_source_985.md) — repair runs branch's script; YAML edits can't green-run; redirect invariant is a union +- [binding-redirect-drift-973](project_binding_redirect_drift_and_missing_asyncenumerable_973.md) — NuGet rewrites only installer's config; AsyncEnumerable aliased +- [graph-usings-973](project_graph_usings_removable_and_models_name_collisions_973.md) — all 6 Graph usings removable; Models name collisions +- [ixnet-v7-lib-ref-clash](project_ixnet_v7_lib_ref_clash_packages_config.md) — lib/net48 public AsyncEnumerable; global BCL ref = CS0121; use `` +- [fsharp-hintpath-skew-895](project_fsharp_core_hintpath_skew_895.md) — 15 output dirs; ns2.1>2.0 ranking; ToDoModel.Test gap +- [dependabot-net481-340](project_dependabot_net481_340.md) — semver-major ignore, no fabricated ceilings +- [svgcontrol-test-418](project_svgcontrol_test_unwired_418.md) — STALE (in .sln since 2026-08-14) ## Threading / test determinism -- [taskrun-getresult-inlines-900](project_taskrun_getresult_inlines_on_pool_thread_900.md) — Task.Run+GetResult INLINES on pool thread +- [taskrun-getresult-inlines-900](project_taskrun_getresult_inlines_on_pool_thread_900.md) — Task.Run+GetResult on a pool thread INLINES +- [taskrun-triage-931](project_taskrun_triage_931.md) — 2/22 Task.Run sites thread-dependent; OpenRead returns FileStream +- [prime-marker-944](project_prime_marker_register_before_start_944.md) — ContinueWith(None) never inlines; TCS marker before start +- [engine-toggle-prime-log-order-942](project_engine_toggle_prime_fault_log_order_942.md) — CompletePrime removes marker BEFORE log +- [engine-toggle-fault-suppression-948](project_engine_toggle_fault_suppression_948.md) — pressed cache never clears; first fault can be NRE +- [transactiongate-probe-882](project_transactiongate_parallel_safe_probe_882.md) — zero-bound probes assert only failure while holding - [pump-timeout-743](project_pump_timeout_743.md) — dispatcher-gate lead stale; TRX timestamps as instrument -- [uithread-dispatcher-restore-493](project_uithread_dispatcher_restore_scope_493.md) — never one semaphore for helper+fixture +- [uithread-restore-493](project_uithread_dispatcher_restore_scope_493.md) — never one semaphore for helper+fixture - [winforms-pump-seam-230](project_winforms_pump_seam_230.md) — WinFormsPumpHost; CreateAsync factory gap - [onedrive-timeout-253](project_onedrive_timeout_test_determinism_253.md) — catches TimeoutException not TCE - [unobserved-task-fault-670](project_unobserved_task_fault_670.md) — ViewerSetup.cs 499/500; raw WPF Dispatcher @@ -22,38 +39,6 @@ - [analyzer-severity-runsettings](project_analyzer_severity_ceiling_and_runsettings_split.md) — MSTEST0032 only rule above suggestion - [lock-recursion-317](project_lock_recursion_coverage_317.md) — deleted LockRecursionTests.cs is a restoration - [gettableinviewasync-838](project_gettableinviewasync_null_contract_838.md) — `maxAttempts:1` = TWO attempts; OCE is not TCE -- [engine-toggle-fault-suppression-948](project_engine_toggle_fault_suppression_948.md) — pressed cache never clears; first fault can be NRE -- [no-absolute-host-paths](../_shared_no_absolute_host_paths.md) — use ``/``/``; rename vstest TRX before citing -- [measure-item-worktree](feedback_measure_item_worktree_not_session_worktree.md) — measure the item worktree, not the session worktree -- [exemption-audit-check-proven-techniques](feedback_exemption_audit_check_proven_techniques.md) — grep proven techniques + sibling consistency before IRREDUCIBLE -- [committed-cobertura-baselines](reference_committed_cobertura_baselines.md) — per-line coverage in docs/features/*/evidence/*.cobertura.xml; read, don't infer -- [net481-timeprovider-available](reference_net481_timeprovider_available.md) — FakeTimeProvider usable on net481; reject "net8+ only" -- [github-issue-search-without-gh](reference_github_issue_search_without_gh.md) — WebFetch github issues?q=... when gh absent; mark [V-web] -- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — PQ setting no var substitution; rg-vs-git deltas; basename gotcha -- [push-down-claude-dir-149](project_push_down_claude_dir.md) — pushDownClaudeDir research (2026-04-16) -- [taskrun-getresult-inlines-900](project_taskrun_getresult_inlines_on_pool_thread_900.md) — Task.Run+GetResult on a pool thread INLINES; MSTest 4.4 bodies run inside Task.Run; CheckAccess = Thread identity -- [pump-timeout-743](project_pump_timeout_743.md) — dispatcher-gate lead stale (#493); 9/19 pump tests skip the gate; TRX timestamps as instrument; finally runs LATE not never -- [transactiongate-parallel-safe-probe-882](project_transactiongate_parallel_safe_probe_882.md) — zero-bound probes assert only failure while holding; success via production entry; no DoNotParallelize; SemaphoreFullException surfaces at holder's Dispose -- [taskrun-triage-931](project_taskrun_triage_931.md) — 2/22 Task.Run sites thread-dependent; DispatchValue never reads _ownerThreadId; IFileInfo.OpenRead returns FileStream (no MemoryStream) -- [exemption-audit-proven-techniques](feedback_exemption_audit_check_proven_techniques.md) — grep proven techniques + sibling consistency before IRREDUCIBLE -- [engine-toggle-prime-fault-log-order-942](project_engine_toggle_prime_fault_log_order_942.md) — CompletePrime removes marker BEFORE log; H1 false; probe handle from inside the sink; NB-2 unpromoted -- [measure-item-worktree](feedback_measure_item_worktree_not_session_worktree.md) — read facts from the ITEM worktree; uniform off-by-N = stale tree -- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — rg-vs-git one-file deltas; `basename $USERPROFILE` wrong in Git Bash; PQ setting no var substitution -- [evidence-identity-hygiene-sweep-927](project_evidence_identity_hygiene_sweep_927.md) — classify raw evidence by XML root (243/23/27/18); _pester.yml paths explicit; `:` placeholders -- [push-down-claude-dir-149](project_push_down_claude_dir.md) — #149 pushDownClaudeDir research (2026-04-16) -- [taskrun-getresult-inlines-900](project_taskrun_getresult_inlines_on_pool_thread_900.md) — Task.Run+GetResult on a pool thread INLINES; MSTest 4.4 bodies run inside Task.Run -- [pump-timeout-743](project_pump_timeout_743.md) — dispatcher-gate lead stale (#493); 9/19 pump tests skip the gate; TRX timestamps as instrument -- [uithread-dispatcher-restore-scope-493](project_uithread_dispatcher_restore_scope_493.md) — 2-lock split; never one semaphore for helper+fixture; CI runs QuickFiler.Test serially -- [winforms-pump-seam-230](project_winforms_pump_seam_230.md) — WinFormsPumpHost design; CreateAsync factory-seam gap -- [onedrive-timeout-test-determinism-253](project_onedrive_timeout_test_determinism_253.md) — TimeOutTask overload catches TimeoutException not TCE; DI-seam fix -- [onedrive-timeout-test-determinism-253](project_onedrive_timeout_test_determinism_253.md) — TimeOutTask overload catches TimeoutException not TaskCanceled -- [unobserved-task-fault-670](project_unobserved_task_fault_670.md) — ViewerSetup.cs 499/500; IItemViewer.UiDispatcher is raw WPF Dispatcher -- [filerqueue-consumer-unsound-633](project_filerqueue_consumer_unsound_633.md) — Consumer orphaned-item race; BackGroundMove tests vacuous -- [terminal-hook-barrier-751](project_terminal_hook_barrier_751.md) — notify runs after terminal TrySet; `run.Terminal` is the barrier -- [gettableinviewasync-null-contract-838](project_gettableinviewasync_null_contract_838.md) — `maxAttempts:1` = TWO attempts; OCE is not TCE -- [analyzer-severity-and-runsettings-split](project_analyzer_severity_ceiling_and_runsettings_split.md) — MSTEST0032 only rule above suggestion; no .globalconfig -- [lock-recursion-coverage-317](project_lock_recursion_coverage_317.md) — deleted LockRecursionTests.cs is a restoration -- [gettableinviewasync-null-contract-838](project_gettableinviewasync_null_contract_838.md) — `maxAttempts:1` = TWO attempts; OCE is not TCE ## Coverage / Cobertura mechanics - [cobertura-closure-exemption-457](project_cobertura_closure_exemption_457.md) — exempt members emit NO ``; async `d__` trap @@ -76,210 +61,6 @@ - [capstone-f16](project_quickfiler_capstone_f16_measurement.md) — `` discriminates raw vs post-processed - [f9-measurement-441](project_qfc_f9_measurement_441_and_designer_inheritance.md) — #441 corrupts per-file line-rate -## Epic #136 per-file coverage children -- [qfc-helper-classes-434](project_qfc_helper_classes_f4_434.md) — EmailMoveMonitor seam; explicit Compile Includes -- [qfc-theme-cluster-434](project_qfc_theme_cluster_f4_434.md) — theme+layout tests-only -- [qfc-viewerqueue-434](project_qfc_perfile_coverage_viewerqueue_434.md) — method-group sites forbid optional params -- [qfc-keyboard-coverage-430](project_qfc_keyboard_coverage_430.md) — no IVT UtilitiesCS->QuickFiler.Test -- [qfc-keyboard-actions-430](project_qfc_keyboard_actions_430.md) — KaStringAsync has no async/timer -- [qfc-datamodel-436](project_qfc_datamodel_coverage_436.md) — type-scoped exclude hides 3 partials -- [efcdatamodel-436](project_efcdatamodel_coverage_436.md) — EmailFiler Sort/Open non-virtual -- [qfc-queueprocessing-436](project_qfc_queueprocessing_436.md) — missing FakeTimeProvider fails silently -- [qfc-framebuilding-436](project_qfc_framebuilding_436.md) — Deedle not WinForms -- [qfc-explorer-controller-435](project_qfc_explorer_controller_435.md) — DynamicProxyGenAssembly2 IVT location -- [qfc-form-controller-435](project_qfc_form_controller_coverage_435.md) — UndoConsumer busy-spins; re-verify -- [qfc-form-setup-disposal-435](project_qfc_form_controller_setup_disposal_435.md) — Cleanup idempotent -- [duplicate-iqfcformcontroller-435](project_quickfiler_duplicate_iqfcformcontroller_435.md) — Interfaces copy is dead -- [qfc-home-metrics-433](project_qfc_home_controller_metrics_433.md) — metrics consumer never runs -- [qfc-home-iteration-433](project_qfc_home_controller_iteration_433.md) — #424 deadline leaked; Iterate dead -- [qfc-home-coverage-433](project_qfc_home_controller_coverage_433.md) — LaunchAsync 0% structurally -- [efc-home-deps-437](project_efc_home_controller_deps_437.md) — Production* statics vs ClassLevel hazard -- [efc-home-coverage-437](project_efc_home_controller_coverage_437.md) — Timing.cs reads no clock -- [efc-item-controller-452](project_efc_item_controller_452.md) — IItemViewer covers ~70% of viewer -- [efc-form-controller-452](project_efc_form_controller_452.md) — ViewerQueueCore does NOT pool -- [qfc-item-230-pump-seam](project_qfc_item_controller_230_pump_seam.md) — #230 root of 4 exemptions -- [qfc-item-f10-453](project_qfc_item_controller_f10_coverage_453.md) — test files at 497/498 of 500 -- [qfc-item-f10-init-453](project_excludefromcodecoverage_lambda_leak.md) — 3/7 exemptions on DEAD members -- [qfc-conversation-seam-453](project_qfc_conversation_seam_ratified_453.md) — exemption #227-ratified -- [qfc-collection-controller-454](project_qfc_collection_controller_454.md) — `async public` defeats greps -- [quickfiler-test-sta-ivt](project_quickfiler_test_sta_and_ivt.md) — manual STA infra exists -- [qfc-dropdown-f13-455](project_qfc_breadcrumb_dropdown_f13_455.md) — async `throw;` brace unreachable -- [qfc455-reentrant-dispose](project_qfc455_reentrant_dispose_seam.md) — disposal reentrancy opens async window -- [qfc-itemviewer-456](project_qfc_itemviewer_coverage_456.md) — line-rate corrupt, branch-rate sound -- [qfc-breadcrumb-lifecycle-495](project_qfc_breadcrumb_lifecycle_f12_495.md) — `0/2` on `?? throw` = factory threw -- [qfc-bridge-router-495](project_qfc_breadcrumb_bridge_router_495.md) — wrong router's rate matches to 6 dp -- [breadcrumb-messenger-hub-495](project_breadcrumb_messenger_hub_495.md) — finalizer makes branch GC-dependent -- [qfc-upgrade-lifetime-495](project_qfc_upgrade_lifetime_495.md) — `` can name secondary type -- [qfc-item-227-r2-denial](project_qfc_item_controller_227_r2_denial.md) — blanket exemption denied -- [qfc227-headless-itemviewer](project_qfc227_headless_itemviewer_and_tlpcellsnapshot.md) — headless ItemViewer safe -- [qfc-datamodel-coverage-436](project_qfc_datamodel_coverage_436.md) — type-scoped exclude hides 3 partials; remove last -- [efcdatamodel-coverage-436](project_efcdatamodel_coverage_436.md) — EmailFiler Sort/Open non-virtual; PackageItems(bool) dead -- [qfc-queueprocessing-436](project_qfc_queueprocessing_436.md) — zero COM deref; missing FakeTimeProvider fails silently -- [qfc-framebuilding-436](project_qfc_framebuilding_436.md) — Deedle not WinForms; DfDeedle dialogs behind IVT wall -- [qfc-explorer-controller-435](project_qfc_explorer_controller_435.md) — DynamicProxyGenAssembly2 IVT in QfcHighConfidencePreFilter.cs -- [qfc-form-controller-coverage-435](project_qfc_form_controller_coverage_435.md) — UndoConsumer `|| exit` busy-spins; RECONSTRUCTED, re-verify -- [qfc-form-controller-setup-disposal-435](project_qfc_form_controller_setup_disposal_435.md) — no new seams; Cleanup idempotent -- [duplicate-iqfcformcontroller-435](project_quickfiler_duplicate_iqfcformcontroller_435.md) — QuickFiler.Interfaces.IQfcFormController is dead code -- [qfc-home-controller-metrics-433](project_qfc_home_controller_metrics_433.md) — metrics consumer never runs; BlockingCollection OCE needs token -- [qfc-home-controller-iteration-433](project_qfc_home_controller_iteration_433.md) — #424 deadline leaked into 2-arg dequeue; Iterate dead -- [qfc-home-controller-coverage-433](project_qfc_home_controller_coverage_433.md) — LaunchAsync 0% structurally; check both halves before splitting -- [efc-home-controller-deps-437](project_efc_home_controller_deps_437.md) — deps ~86-93%; Production* statics vs ClassLevel hazard -- [efc-home-controller-coverage-437](project_efc_home_controller_coverage_437.md) — Timing.cs reads no clock; dual default lambdas order-dependent -- [efc-item-controller-452](project_efc_item_controller_452.md) — IItemViewer covers ~70% of viewer; WpfUiDispatcher ctor internal -- [efc-form-controller-452](project_efc_form_controller_452.md) — ViewerQueueCore does NOT pool; #439 = namespace mismatch -- [qfc-item-controller-230-pump-seam](project_qfc_item_controller_230_pump_seam.md) — #230 root of 4 exemptions; 3/19 on DEAD members -- [qfc-item-controller-f10-coverage-453](project_qfc_item_controller_f10_coverage_453.md) — test files at 497/498 of 500 -- [qfc-item-controller-f10-init-453](project_excludefromcodecoverage_lambda_leak.md) — 3/7 Initialization exemptions on DEAD members -- [qfc-conversation-seam-ratified-453](project_qfc_conversation_seam_ratified_453.md) — DoLoadConversationResolverCoreAsync exemption #227-ratified -- [qfc-collection-controller-454](project_qfc_collection_controller_454.md) — 12 unreachable members; `async public` defeats greps -- [quickfiler-test-sta-and-ivt](project_quickfiler_test_sta_and_ivt.md) — QuickFiler grants internals to QuickFiler.Test; manual STA infra exists -- [qfc-breadcrumb-dropdown-f13-455](project_qfc_breadcrumb_dropdown_f13_455.md) — async `throw;` makes catch brace unreachable -- [qfc455-reentrant-dispose-seam](project_qfc455_reentrant_dispose_seam.md) — disposal-callback reentrancy opens the async window -- [qfc-itemviewer-coverage-456](project_qfc_itemviewer_coverage_456.md) — class line-rate corrupt, branch-rate sound; STA attrs in MSTest 4.3.3 -- [qfc-breadcrumb-lifecycle-f12-495](project_qfc_breadcrumb_lifecycle_f12_495.md) — `0/2` on `factory() ?? throw` means factory threw -- [qfc-breadcrumb-bridge-router-495](project_qfc_breadcrumb_bridge_router_495.md) — wrong router's branch-rate matches to 6 digits -- [breadcrumb-messenger-hub-495](project_breadcrumb_messenger_hub_495.md) — Component finalizer makes a branch GC-dependent -- [qfc-upgrade-lifetime-495](project_qfc_upgrade_lifetime_495.md) — `` can name a secondary type -- [qfc-item-controller-227-r2-denial](project_qfc_item_controller_227_r2_denial.md) — maintainer denied blanket exemption; per-member precedent -- [qfc227-headless-itemviewer](project_qfc227_headless_itemviewer_and_tlpcellsnapshot.md) — headless ItemViewer safe; target 24 -> 19 -- [issue-search-without-gh](reference_github_issue_search_without_gh.md) — WebFetch issues?q=...; mark [V-web] -- [taskrun-getresult-inlines-900](project_taskrun_getresult_inlines_on_pool_thread_900.md) — Task.Run+GetResult on pool thread INLINES -- [prime-marker-944](project_prime_marker_register_before_start_944.md) — ContinueWith(None) never inlines; TCS marker before start -- [uithread-restore-493](project_uithread_dispatcher_restore_scope_493.md) — never one semaphore for helper+fixture -- [filerqueue-consumer-633](project_filerqueue_consumer_unsound_633.md) — orphaned-item race; vacuous tests -- [gettableinviewasync-838](project_gettableinviewasync_null_contract_838.md) — `maxAttempts:1` = TWO attempts -- [closure-exemption-457](project_cobertura_closure_exemption_457.md) — exempt members emit no ``; `d__` trap -- [root-attrs-raw-vs-post](project_cobertura_root_attrs_raw_vs_postprocessed.md) — never compare raw vs Koverage totals -- [double-count-815](project_cobertura_double_count_moves_counts_not_rates_815.md) — doubles counters, pct <=0.46pp -- [threshold-reconciliation-494](project_coverage_threshold_reconciliation_494.md) — 85/75 foreign leakage; gate evadable -- [perfile-attribution](project_cobertura_perfile_attribution_contract.md) — recompute from `` -- [line-double-count](project_cobertura_line_double_count.md) — lines-valid ~2x actual -- [exemption-branchrate-gotchas](project_cobertura_exemption_and_branchrate_gotchas.md) — method exclude leaks lambdas -- [qfc455-lambda-leak](project_qfc455_exclude_attribute_lambda_leak.md) — #441 inflation = per-method `` -- [webview2-exemption-asymmetry](project_webview2_exemption_and_coverage_asymmetry.md) — class-level hides lambdas -- [partial-type-exclusion-456](project_partial_type_coverage_exclusion_456.md) — de-exempting designer RAISES coverage -- [designer-coverage](project_winforms_designer_coverage_mechanics.md) — one construction covers ~99% Designer -- [itemviewer-partial-coupling](project_itemviewer_partial_exemption_coupling.md) — one attr hides 6 partials -- [iqfcdatamodel-436](project_iqfcdatamodel_contract_436.md) — no class element for interfaces/enums -- [interface-only-files-433](project_quickfiler_interface_only_files_433.md) — IQfcHomeController.cs exists twice -- [percoverage-epic-136](project_quickfiler_percoverage_epic_136.md) — read per-file rate from Cobertura -- [coverage-ledger-432](project_quickfiler_coverage_ledger_432.md) — 40 usages/21 files, not 33 -- [capstone-f16](project_quickfiler_capstone_f16_measurement.md) — `` discriminates raw vs post -- [f9-441-designer](project_qfc_f9_measurement_441_and_designer_inheritance.md) — 6dp vs 16dp tell -- [helper-classes-434](project_qfc_helper_classes_f4_434.md) — EmailMoveMonitor seam exists -- [theme-cluster-434](project_qfc_theme_cluster_f4_434.md) — no colour getters -- [viewerqueue-434](project_qfc_perfile_coverage_viewerqueue_434.md) — method-group sites forbid optional params -- [keyboard-430](project_qfc_keyboard_coverage_430.md) — no IVT to QuickFiler.Test; headless ItemViewer OK -- [keyboard-actions-430](project_qfc_keyboard_actions_430.md) — KaStringAsync has no async/timer -- [datamodel-436](project_qfc_datamodel_coverage_436.md) — type exclude hides 3 partials -- [efcdatamodel-436](project_efcdatamodel_coverage_436.md) — Sort/Open non-virtual -- [queueprocessing-436](project_qfc_queueprocessing_436.md) — missing FakeTimeProvider fails silently -- [framebuilding-436](project_qfc_framebuilding_436.md) — Deedle; dialogs behind IVT wall -- [explorer-controller-435](project_qfc_explorer_controller_435.md) — DynamicProxy IVT in QfcHighConfidencePreFilter.cs -- [form-controller-435](project_qfc_form_controller_coverage_435.md) — UndoConsumer busy-spins; re-verify -- [form-controller-disposal-435](project_qfc_form_controller_setup_disposal_435.md) — Cleanup idempotent -- [duplicate-iqfcformcontroller-435](project_quickfiler_duplicate_iqfcformcontroller_435.md) — Interfaces copy dead -- [home-metrics-433](project_qfc_home_controller_metrics_433.md) — metrics consumer never runs -- [home-iteration-433](project_qfc_home_controller_iteration_433.md) — Iterate dead; deadline leak -- [home-coverage-433](project_qfc_home_controller_coverage_433.md) — LaunchAsync 0% structurally -- [efc-home-deps-437](project_efc_home_controller_deps_437.md) — Production* statics vs ClassLevel -- [efc-item-controller-452](project_efc_item_controller_452.md) — IItemViewer covers ~70% -- [item-controller-230-seam](project_qfc_item_controller_230_pump_seam.md) — #230 root of 4 exemptions -- [item-controller-f10-453](project_qfc_item_controller_f10_coverage_453.md) — test files at 497/498 -- [f10-init-453](project_excludefromcodecoverage_lambda_leak.md) — 3/7 exemptions on DEAD members -- [conversation-seam-453](project_qfc_conversation_seam_ratified_453.md) — #227-ratified exemption -- [collection-controller-454](project_qfc_collection_controller_454.md) — `async public` defeats greps -- [test-sta-and-ivt](project_quickfiler_test_sta_and_ivt.md) — manual STA infra exists -- [breadcrumb-dropdown-455](project_qfc_breadcrumb_dropdown_f13_455.md) — async `throw;` brace unreachable -- [reentrant-dispose-455](project_qfc455_reentrant_dispose_seam.md) — reentrancy opens async window -- [itemviewer-456](project_qfc_itemviewer_coverage_456.md) — line-rate corrupt, branch-rate sound -- [breadcrumb-lifecycle-495](project_qfc_breadcrumb_lifecycle_f12_495.md) — `0/2` on `?? throw` = factory threw -- [bridge-router-495](project_qfc_breadcrumb_bridge_router_495.md) — wrong router matches 6 digits -- [messenger-hub-495](project_breadcrumb_messenger_hub_495.md) — finalizer makes branch GC-dependent -- [upgrade-lifetime-495](project_qfc_upgrade_lifetime_495.md) — `` can name secondary type -- [item-controller-227-denial](project_qfc_item_controller_227_r2_denial.md) — per-member precedent -- [headless-itemviewer-227](project_qfc227_headless_itemviewer_and_tlpcellsnapshot.md) — target 24 -> 19 - -## QuickFiler / EFC / SortEmail defects and behaviour -- [sortemail-split-prompt-seam-956](project_sortemail_split_and_prompt_seam_956.md) — per-call prompt session; AsyncLocal breaks stickiness -- [sortemail-966-consolidation-959](project_sortemail_966_consolidation_959.md) — live path builds helpers with FOLDER NAME; A 235 re-roots one path; ToDoModel copy uncompiled -- [sortemail-latent-defects-959](project_sortemail_latent_defects_959.md) — callers discard the bool: only rethrow surfaces; L4 has a 3rd (null-array) defect -- [qfc-high-confidence-pipelines](project_qfc_high_confidence_dual_pipeline.md) — THREE pipelines; #233 gate LIVE -- [qfc424-startup-stall](project_qfc424_high_confidence_startup_stall.md) — serial scoring; async-void worker -- [qfc678-predictor-carry](project_qfc678_predictor_carry.md) — named producer DORMANT -- [qfc791-deadline-teardown](project_qfc791_deadline_and_cancel_teardown.md) — superseded by #424/#608 ACs -- [qfc810-teardown-dropdown](project_qfc810_teardown_dropdown_residuals.md) — method-group blocks optional param -- [qfc823-review-residuals](project_qfc823_review_residuals.md) — R2 follow-up is #813 -- [teardown-guard-821](project_teardown_guard_enumeration_821.md) — 4th sharer is 4th Cancel() site -- [qfc-lifecycle-disposal-731](project_qfc_lifecycle_disposal_731.md) — sharing EmailMoveMonitor drops actions -- [qfc254-darkmode-labels](project_qfc254_darkmode_stale_labels.md) — labels themed only in MailRead branch -- [qfc254-residual](project_qfc254_residual_after_comexception_fix.md) — #269 cause = fore/back swap -- [qfc254-ambient-inheritance](project_qfc254_ambient_inheritance_mechanism.md) — SUPERSEDED; ambient notes accurate -- [qfc438-focus-steal](project_qfc438_search_focus_steal.md) — TWO focus-steal mechanisms -- [qfc677-webview2-focus](project_qfc677_webview2_focus_hold_outlook_keyboard.md) — WV2 focus hold + anchor steal -- [qfc680-menu-mode](project_qfc680_menu_mode_keyboard_capture.md) — ModalMenuFilter; AutoClose=false pre-Show -- [qfc663-alt-chord](project_qfc663_alt_chord_no_altf.md) — only Alt+M swallowed -- [qfc-keyboard-defects-444](project_qfc_keyboard_action_defects_444.md) — trigger Right/Down/Right -- [breadcrumb-nav-439-440](project_breadcrumb_navigation_defects_439_440_498_499.md) — #439 fix regresses join -- [issue-440-via-498](project_issue_440_already_landed_via_498.md) — Efc/Qfc do NOT share BreadcrumbRow -- [qfc-item-defects-484](project_qfc_item_controller_defects_484.md) — all 5 Suspected Fix sections wrong -- [webview2-initializer-476](project_webview2_host_initializer_defects_476.md) — EfcViewerQueue not a pool -- [qfc-efc-metrics-442](project_qfc_efc_metrics_442.md) — stopwatch race unfixable in owned files -- [qfc-collection-defects-468](project_qfc_collection_defects_468.md) — MovedMails param redundant -- [qfc-collection-controller-468](project_qfc_collection_controller_defects_468.md) — "unrelated interfaces" FALSE -- [issue-469-residual-629](project_issue_469_already_fixed_residual_is_629.md) — `Initialized` never memoizes -- [reflective-caller-635](project_reflective_caller_closure_635.md) — `GetField(` is the reaching mechanism -- [selectrow-families-637](project_selectrow_two_families_637.md) — TWO SelectRow families -- [issue-656-no-bypass](project_issue_656_bypass_path_does_not_exist.md) — premise FALSE -- [efc614-stem-leak](project_efc614_store_root_stem_leak.md) — FolderConverterTests.cs:329 codifies a bug -- [efc736-archiveroot-sink](project_efc736_archiveroot_boundary_sink.md) — 6 sink sites not 4 -- [banner-prefix-arity-662](project_banner_prefix_arity_662.md) — `/Tests:` vs `/TestCaseFilter:` exclusive -- [qfc-folder-tree-325](project_qfc_folder_tree_percentage_325.md) — 1 live viewer, 9 dead CboFolders -- [qfc-breadcrumb-webview2-351](project_qfc_breadcrumb_webview2_351.md) — bridge greenfield -- [folder-hierarchy-provider-350](project_folder_hierarchy_provider_350.md) — reuse snapshot infra -- [efcviewer-breadcrumb-349](project_efcviewer_breadcrumb_webview2_349.md) — unscaled ColumnHeader widths -- [folder-settings-797](project_folder_settings_persistence_797.md) — ThisAddIn_Shutdown never raised -- [ilglobals-static-824](project_ilglobals_static_publication_824.md) — BeSameAs only order-independent RED gate -- [etl-deadline-825](project_etl_deadline_followups_825.md) — read shipped package .xml to verify API -## QuickFiler / EFC defects and behaviour -- [qfc-high-confidence-dual-pipeline](project_qfc_high_confidence_dual_pipeline.md) — THREE pipelines; #233 gate LIVE, #169/#171 dormant -- [qfc424-startup-stall](project_qfc424_high_confidence_startup_stall.md) — gate scores serially; async-void BackgroundWorker; STA blocks parallel COM -- [qfc678-predictor-carry](project_qfc678_predictor_carry.md) — named producer DORMANT; PreScored never read -- [qfc791-deadline-cancel-teardown](project_qfc791_deadline_and_cancel_teardown.md) — empty-at-deadline superseded by #424/#608 ACs -- [qfc810-teardown-dropdown-residuals](project_qfc810_teardown_dropdown_residuals.md) — method-group blocks optional param (CS0123); files at 496/500 -- [qfc823-review-residuals](project_qfc823_review_residuals.md) — R3 null-tolerance doc FALSE; R2 follow-up is #813 -- [teardown-guard-enumeration-821](project_teardown_guard_enumeration_821.md) — 4th sharer is the 4th Cancel() SITE; enabler is SetCancellationTokenSource -- [qfc-lifecycle-disposal-731](project_qfc_lifecycle_disposal_731.md) — sharing EmailMoveMonitor DROPS actions; `volatile` = CS0420 -- [qfc254-darkmode-stale-labels](project_qfc254_darkmode_stale_labels.md) — labels themed only in MailRead()-guarded branch -- [qfc254-residual-after-comexception-fix](project_qfc254_residual_after_comexception_fix.md) — historical; #269 real cause = Light-theme fore/back swap -- [qfc254-ambient-inheritance](project_qfc254_ambient_inheritance_mechanism.md) — SUPERSEDED for #269; WinForms ambient inheritance notes still accurate -- [qfc438-search-focus-steal](project_qfc438_search_focus_steal.md) — TWO focus-steal mechanisms; CancelSelector emits no SelectionChanged -- [qfc677-webview2-focus-hold](project_qfc677_webview2_focus_hold_outlook_keyboard.md) — WebView2 focus hold + _focusAnchor steal; fix = focus predicate -- [qfc680-menu-mode-keyboard-capture](project_qfc680_menu_mode_keyboard_capture.md) — ModalMenuFilter; AutoClose=false pre-Show only opt-out -- [qfc663-alt-chord-no-altf](project_qfc663_alt_chord_no_altf.md) — only Alt+M swallowed; Alt+F is EFC-only -- [qfc-keyboard-action-defects-444](project_qfc_keyboard_action_defects_444.md) — #468 removes duplicate registration; trigger Right/Down/Right -- [breadcrumb-navigation-defects-439-440](project_breadcrumb_navigation_defects_439_440_498_499.md) — fixing #439 regresses percentage join -- [issue-440-already-landed-via-498](project_issue_440_already_landed_via_498.md) — Efc/Qfc do NOT share BreadcrumbRow -- [qfc-item-controller-defects-484](project_qfc_item_controller_defects_484.md) — all 5 "Suspected Fix" sections wrong; verify callers first -- [webview2-host-initializer-defects-476](project_webview2_host_initializer_defects_476.md) — EfcViewerQueue not a pool; real WebView2 built in tests -- [qfc-efc-metrics-442](project_qfc_efc_metrics_442.md) — MoveAndIterate stopwatch race unfixable in owned files -- [qfc-collection-defects-468](project_qfc_collection_defects_468.md) — MovedMails param redundant; no log4net in QuickFiler.Test -- [qfc-collection-controller-defects-468](project_qfc_collection_controller_defects_468.md) — #474 "unrelated interfaces" FALSE -- [issue-469-already-fixed-residual-629](project_issue_469_already_fixed_residual_is_629.md) — `Initialized` never memoizes -- [reflective-caller-closure-635](project_reflective_caller_closure_635.md) — removal was 13 members; `GetField(` is the reaching mechanism -- [selectrow-two-families-637](project_selectrow_two_families_637.md) — TWO SelectRow families; ButtonOK_Click does NOT rethrow -- [issue-656-bypass-path-does-not-exist](project_issue_656_bypass_path_does_not_exist.md) — premise FALSE; owner files at cap -- [efc614-store-root-stem-leak](project_efc614_store_root_stem_leak.md) — FolderConverterTests.cs:329 codifies a bug -- [efc736-archiveroot-boundary-sink](project_efc736_archiveroot_boundary_sink.md) — finding 6 cause FALSE; 6 sink sites not 4 -- [banner-prefix-arity-662](project_banner_prefix_arity_662.md) — `/Tests:` and `/TestCaseFilter:` mutually exclusive -- [qfc-folder-tree-percentage-325](project_qfc_folder_tree_percentage_325.md) — 1 live viewer despite 9 dead CboFolders -- [qfc-breadcrumb-webview2-351](project_qfc_breadcrumb_webview2_351.md) — 9101 provider absent; bridge greenfield -- [folder-hierarchy-provider-350](project_folder_hierarchy_provider_350.md) — reuse snapshot infra; no new COM seam -- [efcviewer-breadcrumb-webview2-349](project_efcviewer_breadcrumb_webview2_349.md) — EfcViewer3 dead; unscaled ColumnHeader widths -- [folder-settings-persistence-797](project_folder_settings_persistence_797.md) — ThisAddIn_Shutdown never raised; a test asserts the AC8 bug -- [ilglobals-static-publication-824](project_ilglobals_static_publication_824.md) — BeSameAs only order-independent RED gate; CA2211 never fires -- [etl-deadline-followups-825](project_etl_deadline_followups_825.md) — read shipped package .xml to verify API - ## Stores / watchdog / add-in lifecycle - [store-runtime-reenable-263](project_store_runtime_reenable_263.md) — no per-store hookup seam - [store-lockup-f4](project_store_lockup_resilience_f4_research.md) — AsyncLocal rejected; MyBox no modeless @@ -287,84 +68,16 @@ - [storewrapper-dialog-287](project_storewrapper_dialog_287_state_inversion.md) — issue inverts the two states ## Ribbon, CI, toolchain, repo structure -- [ribbon-readiness-503](project_ribbon_engine_readiness_503.md) — Ribbon coverage-excluded; 5 orphan callbacks +- [ribbon-readiness-503](project_ribbon_engine_readiness_503.md) — Ribbon coverage-excluded; 5 orphan onAction callbacks - [ribbon-toggle-guards-505](project_ribbon_toggle_state_guards_505.md) — toggle vs command guard asymmetry -- [ribbon-toggle-defects-735](project_ribbon_engine_toggle_defects_735.md) — 84 callbacks (5 dead) -- [ci-parallel-split-553](project_ci_parallel_split_553.md) — check names "caller / callee" -- [toolchain-gate-fidelity-512](project_toolchain_gate_fidelity_512.md) — ~1.2s vs ~17s = vacuity -- [console-out-rs0030-826](project_console_out_and_rs0030_promotion_826.md) — no GenerateDocumentationFile: IDE0005 silent -- [fsharp-hintpath-skew-895](project_fsharp_core_hintpath_skew_895.md) — 15 output dirs; packages.config gap -- [binding-redirect-drift-973](project_binding_redirect_drift_and_missing_asyncenumerable_973.md) — NuGet rewrites only installer's config; AsyncEnumerable install ruled in scope (aliased) -- [graph-usings-removable-973](project_graph_usings_removable_and_models_name_collisions_973.md) — all 6 Graph usings removable; Models exports List/Application/OutlookItem; reflog = clock fallback -- [ixnet-v7-lib-ref-clash](project_ixnet_v7_lib_ref_clash_packages_config.md) — lib/net48 keeps public AsyncEnumerable; global BCL ref = CS0121; use ``; Directory.Build.props exists -- [dependabot-net481-340](project_dependabot_net481_340.md) — semver-major ignore, no ceilings -- [svgcontrol-test-418](project_svgcontrol_test_unwired_418.md) — STALE; in .sln since 2026-08-14 -- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — PQ setting no var substitution -- [push-down-claude-dir-149](project_push_down_claude_dir.md) — pushDownClaudeDir research -- [winforms-testability-298](project_winforms_testability_epic_298.md) — #298 depends on #297 -- [tagcontroller-293](project_tagcontroller_refactor_293.md) — PrefixItem NotImplemented -- [swordfish-removal-306](project_swordfish_removal_epic_306.md) — legacy JSON via ScoDictionaryNew -- [legacy-scodictionary-315](project_legacy_scodictionary_removal_315.md) — delete SCODictionary_Tests -- [ribbon-engine-readiness-503](project_ribbon_engine_readiness_503.md) — Ribbon layer coverage-excluded; 5 orphan onAction callbacks -- [ribbon-toggle-state-guards-505](project_ribbon_toggle_state_guards_505.md) — toggle vs command guard asymmetry -- [ribbon-engine-toggle-defects-735](project_ribbon_engine_toggle_defects_735.md) — 84 callback names (5 dead); ManagerAsyncLazy constructible -- [fsharp-core-hintpath-skew-895](project_fsharp_core_hintpath_skew_895.md) — 15 output dirs; Sync-PackageReferences ranks ns2.1>2.0; ToDoModel.Test packages.config gap -- [fsharp-core-hintpath-skew-895](project_fsharp_core_hintpath_skew_895.md) — 15 output dirs; Sync-PackageReferences ranks ns2.1>2.0; ToDoModel.Test gap +- [ribbon-toggle-defects-735](project_ribbon_engine_toggle_defects_735.md) — 84 callbacks (5 dead); ManagerAsyncLazy constructible - [ci-parallel-split-553](project_ci_parallel_split_553.md) — 4 independent jobs; check names "caller / callee" -- [toolchain-gate-fidelity-512](project_toolchain_gate_fidelity_512.md) — AGENTS.md externally owned; ~1.2s vs ~17s = vacuity -- [console-out-and-rs0030-826](project_console_out_and_rs0030_promotion_826.md) — Directory.Build.props exists; CS0169/CS0414 is the hazard -- [dependabot-net481-340](project_dependabot_net481_340.md) — semver-major ignore, no fabricated ceilings -- [svgcontrol-test-unwired-418](project_svgcontrol_test_unwired_418.md) — STALE (in .sln since 2026-08-14); redirect topology historical -- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — PQ setting no var substitution; rg-vs-git deltas; basename gotcha -- [push-down-claude-dir-149](project_push_down_claude_dir.md) — #149 pushDownClaudeDir research (2026-04-16) -- [winforms-testability-epic-298](project_winforms_testability_epic_298.md) — #298 depends on #297; inverts #197 exemptions -- [tagcontroller-refactor-293](project_tagcontroller_refactor_293.md) — ITagViewer/IForm gaps; PrefixItem NotImplemented -- [swordfish-removal-epic-306](project_swordfish_removal_epic_306.md) — legacy flat JSON round-trips via ScoDictionaryNew -- [legacy-scodictionary-removal-315](project_legacy_scodictionary_removal_315.md) — delete SCODictionary_Tests, retarget 3 files +- [toolchain-gate-fidelity-512](project_toolchain_gate_fidelity_512.md) — ~1.2s vs ~17s = vacuity +- [console-out-rs0030-826](project_console_out_and_rs0030_promotion_826.md) — CS0169/CS0414 hazard; IDE0005 silent +- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — PQ setting no var substitution; rg-vs-git deltas +- [evidence-identity-sweep-927](project_evidence_identity_hygiene_sweep_927.md) — classify raw evidence by XML root - [push-down-claude-dir-149](project_push_down_claude_dir.md) — #149 pushDownClaudeDir research (2026-04-16) -- [high-confidence-pipelines](project_qfc_high_confidence_dual_pipeline.md) — THREE pipelines; #233 gate LIVE -- [startup-stall-424](project_qfc424_high_confidence_startup_stall.md) — serial scoring; async-void worker -- [predictor-carry-678](project_qfc678_predictor_carry.md) — PreScored never read -- [deadline-teardown-791](project_qfc791_deadline_and_cancel_teardown.md) — superseded by #424/#608 ACs -- [teardown-dropdown-810](project_qfc810_teardown_dropdown_residuals.md) — CS0123; files at 496/500 -- [review-residuals-823](project_qfc823_review_residuals.md) — follow-up is #813 -- [lifecycle-disposal-731](project_qfc_lifecycle_disposal_731.md) — sharing monitor DROPS actions -- [darkmode-labels-254](project_qfc254_darkmode_stale_labels.md) — themed only in MailRead() branch -- [qfc254-residual](project_qfc254_residual_after_comexception_fix.md) — #269 = Light-theme swap -- [qfc254-ambient](project_qfc254_ambient_inheritance_mechanism.md) — SUPERSEDED; ambient notes accurate -- [search-focus-438](project_qfc438_search_focus_steal.md) — TWO focus-steal mechanisms -- [webview2-focus-677](project_qfc677_webview2_focus_hold_outlook_keyboard.md) — fix = focus predicate -- [menu-mode-680](project_qfc680_menu_mode_keyboard_capture.md) — AutoClose=false pre-Show only -- [alt-chord-663](project_qfc663_alt_chord_no_altf.md) — only Alt+M swallowed -- [keyboard-defects-444](project_qfc_keyboard_action_defects_444.md) — trigger Right/Down/Right -- [issue-440-via-498](project_issue_440_already_landed_via_498.md) — Efc/Qfc don't share BreadcrumbRow -- [item-controller-484](project_qfc_item_controller_defects_484.md) — all 5 Suspected Fix wrong -- [webview2-init-476](project_webview2_host_initializer_defects_476.md) — EfcViewerQueue not a pool -- [metrics-442](project_qfc_efc_metrics_442.md) — stopwatch race unfixable in owned files -- [collection-defects-468](project_qfc_collection_defects_468.md) — no log4net in QuickFiler.Test -- [collection-controller-468](project_qfc_collection_controller_defects_468.md) — #474 premise FALSE -- [issue-469-fixed-629](project_issue_469_already_fixed_residual_is_629.md) — `Initialized` never memoizes -- [reflective-closure-635](project_reflective_caller_closure_635.md) — `GetField(` reaches 13 members -- [selectrow-637](project_selectrow_two_families_637.md) — TWO SelectRow families -- [store-root-stem-614](project_efc614_store_root_stem_leak.md) — test codifies a bug -- [archiveroot-sink-736](project_efc736_archiveroot_boundary_sink.md) — 6 sink sites not 4 -- [banner-prefix-662](project_banner_prefix_arity_662.md) — `/Tests:` vs `/TestCaseFilter:` exclusive -- [folder-tree-pct-325](project_qfc_folder_tree_percentage_325.md) — 1 live viewer -- [breadcrumb-wv2-351](project_qfc_breadcrumb_webview2_351.md) — bridge greenfield -- [folder-hierarchy-350](project_folder_hierarchy_provider_350.md) — reuse snapshot infra -- [efcviewer-breadcrumb-349](project_efcviewer_breadcrumb_webview2_349.md) — EfcViewer3 dead -- [ilglobals-824](project_ilglobals_static_publication_824.md) — BeSameAs only RED gate -- [etl-deadline-825](project_etl_deadline_followups_825.md) — read package .xml to verify API -- [store-reenable-263](project_store_runtime_reenable_263.md) — no per-store hookup seam -- [store-lockup-f4](project_store_lockup_resilience_f4_research.md) — AsyncLocal rejected -- [storewrapper-dialog-287](project_storewrapper_dialog_287_state_inversion.md) — state inversion -- [ribbon-readiness-503](project_ribbon_engine_readiness_503.md) — 5 orphan onAction callbacks -- [ribbon-toggle-guards-505](project_ribbon_toggle_state_guards_505.md) — toggle vs command asymmetry -- [toolchain-fidelity-512](project_toolchain_gate_fidelity_512.md) — ~1.2s vs ~17s = vacuity -- [console-out-rs0030-826](project_console_out_and_rs0030_promotion_826.md) — CS0169/CS0414 hazard -- [fsharp-hintpath-895](project_fsharp_core_hintpath_skew_895.md) — 15 output dirs; ns2.1>2.0 ranking -- [dependabot-340](project_dependabot_net481_340.md) — semver-major ignore -- [winforms-epic-298](project_winforms_testability_epic_298.md) — depends on #297 -- [swordfish-306](project_swordfish_removal_epic_306.md) — round-trips via ScoDictionaryNew -- [scodictionary-315](project_legacy_scodictionary_removal_315.md) — delete tests, retarget 3 files -- [host-identifier-sweep-602](project_host_identifier_sweep_602.md) — rg-vs-git deltas +- [winforms-testability-298](project_winforms_testability_epic_298.md) — #298 depends on #297; inverts #197 exemptions +- [tagcontroller-293](project_tagcontroller_refactor_293.md) — ITagViewer/IForm gaps; PrefixItem NotImplemented +- [swordfish-removal-306](project_swordfish_removal_epic_306.md) — legacy JSON round-trips via ScoDictionaryNew +- [legacy-scodictionary-315](project_legacy_scodictionary_removal_315.md) — delete SCODictionary_Tests, retarget 3 files diff --git a/.claude/agent-memory/task-researcher/index_epic136_percoverage_children.md b/.claude/agent-memory/task-researcher/index_epic136_percoverage_children.md new file mode 100644 index 000000000..89dc7263b --- /dev/null +++ b/.claude/agent-memory/task-researcher/index_epic136_percoverage_children.md @@ -0,0 +1,44 @@ +--- +name: index-epic136-percoverage-children +description: Sub-index of task-researcher memories for QuickFiler/EFC per-file coverage epic #136 child items (430-495, 227); open when researching coverage of a QuickFiler or EFC class +metadata: + type: reference +--- + +Sub-index split out of MEMORY.md (2026-10-09) to keep the root index under its read limit. One line per memory file. + +- [qfc-helper-classes-434](project_qfc_helper_classes_f4_434.md) — EmailMoveMonitor seam; explicit Compile Includes +- [qfc-theme-cluster-434](project_qfc_theme_cluster_f4_434.md) — theme+layout tests-only; no colour getters +- [qfc-viewerqueue-434](project_qfc_perfile_coverage_viewerqueue_434.md) — method-group sites forbid optional params +- [qfc-keyboard-coverage-430](project_qfc_keyboard_coverage_430.md) — no IVT UtilitiesCS->QuickFiler.Test; headless ItemViewer OK +- [qfc-keyboard-actions-430](project_qfc_keyboard_actions_430.md) — KaStringAsync has no async/timer +- [qfc-datamodel-436](project_qfc_datamodel_coverage_436.md) — type-scoped exclude hides 3 partials; remove last +- [efcdatamodel-436](project_efcdatamodel_coverage_436.md) — EmailFiler Sort/Open non-virtual; PackageItems(bool) dead +- [qfc-queueprocessing-436](project_qfc_queueprocessing_436.md) — zero COM deref; missing FakeTimeProvider fails silently +- [qfc-framebuilding-436](project_qfc_framebuilding_436.md) — Deedle not WinForms; DfDeedle dialogs behind IVT wall +- [qfc-explorer-controller-435](project_qfc_explorer_controller_435.md) — DynamicProxyGenAssembly2 IVT in QfcHighConfidencePreFilter.cs +- [qfc-form-controller-435](project_qfc_form_controller_coverage_435.md) — UndoConsumer busy-spins; RECONSTRUCTED, re-verify +- [qfc-form-setup-disposal-435](project_qfc_form_controller_setup_disposal_435.md) — no new seams; Cleanup idempotent +- [duplicate-iqfcformcontroller-435](project_quickfiler_duplicate_iqfcformcontroller_435.md) — QuickFiler.Interfaces copy is dead code +- [qfc-home-metrics-433](project_qfc_home_controller_metrics_433.md) — metrics consumer never runs; OCE needs token +- [qfc-home-iteration-433](project_qfc_home_controller_iteration_433.md) — #424 deadline leaked into 2-arg dequeue; Iterate dead +- [qfc-home-coverage-433](project_qfc_home_controller_coverage_433.md) — LaunchAsync 0% structurally +- [efc-home-deps-437](project_efc_home_controller_deps_437.md) — Production* statics vs ClassLevel hazard +- [efc-home-coverage-437](project_efc_home_controller_coverage_437.md) — Timing.cs reads no clock; default lambdas order-dependent +- [efc-item-controller-452](project_efc_item_controller_452.md) — IItemViewer covers ~70% of viewer; WpfUiDispatcher ctor internal +- [efc-form-controller-452](project_efc_form_controller_452.md) — ViewerQueueCore does NOT pool; #439 = namespace mismatch +- [qfc-item-230-pump-seam](project_qfc_item_controller_230_pump_seam.md) — #230 root of 4 exemptions; 3/19 on DEAD members +- [qfc-item-f10-453](project_qfc_item_controller_f10_coverage_453.md) — test files at 497/498 of 500 +- [qfc-item-f10-init-453](project_excludefromcodecoverage_lambda_leak.md) — 3/7 Initialization exemptions on DEAD members +- [qfc-conversation-seam-453](project_qfc_conversation_seam_ratified_453.md) — exemption #227-ratified +- [qfc-collection-controller-454](project_qfc_collection_controller_454.md) — 12 unreachable members; `async public` defeats greps +- [quickfiler-test-sta-ivt](project_quickfiler_test_sta_and_ivt.md) — QuickFiler grants internals to QuickFiler.Test; manual STA infra +- [qfc-dropdown-f13-455](project_qfc_breadcrumb_dropdown_f13_455.md) — async `throw;` makes catch brace unreachable +- [qfc455-reentrant-dispose](project_qfc455_reentrant_dispose_seam.md) — disposal-callback reentrancy opens async window +- [qfc-itemviewer-456](project_qfc_itemviewer_coverage_456.md) — line-rate corrupt, branch-rate sound; STA attrs in MSTest 4.3.3 +- [qfc-breadcrumb-lifecycle-495](project_qfc_breadcrumb_lifecycle_f12_495.md) — `0/2` on `factory() ?? throw` = factory threw +- [qfc-bridge-router-495](project_qfc_breadcrumb_bridge_router_495.md) — wrong router's branch-rate matches to 6 digits +- [breadcrumb-messenger-hub-495](project_breadcrumb_messenger_hub_495.md) — Component finalizer makes a branch GC-dependent +- [qfc-upgrade-lifetime-495](project_qfc_upgrade_lifetime_495.md) — `` can name a secondary type +- [qfc-item-227-r2-denial](project_qfc_item_controller_227_r2_denial.md) — maintainer denied blanket exemption; per-member precedent +- [qfc227-headless-itemviewer](project_qfc227_headless_itemviewer_and_tlpcellsnapshot.md) — headless ItemViewer safe; target 24 -> 19 diff --git a/.claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md b/.claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md new file mode 100644 index 000000000..5a2cae72e --- /dev/null +++ b/.claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md @@ -0,0 +1,49 @@ +--- +name: index-quickfiler-efc-defects +description: Sub-index of task-researcher memories on QuickFiler/EFC/SortEmail defect and behaviour research (focus, keyboard, breadcrumb, teardown, high-confidence pipelines); open when researching a QuickFiler or EFC bug +metadata: + type: reference +--- + +Sub-index split out of MEMORY.md (2026-10-09) to keep the root index under its read limit. One line per memory file. + +- [sortemail-split-prompt-seam-956](project_sortemail_split_and_prompt_seam_956.md) — per-call prompt session; AsyncLocal breaks stickiness +- [sortemail-966-consolidation-959](project_sortemail_966_consolidation_959.md) — live path builds helpers with FOLDER NAME; ToDoModel copy uncompiled +- [sortemail-latent-defects-959](project_sortemail_latent_defects_959.md) — callers discard the bool; L4 has a null-array defect +- [qfc-high-confidence-pipelines](project_qfc_high_confidence_dual_pipeline.md) — THREE pipelines; #233 gate LIVE, #169/#171 dormant +- [qfc424-startup-stall](project_qfc424_high_confidence_startup_stall.md) — serial scoring; async-void worker; STA blocks parallel COM +- [qfc678-predictor-carry](project_qfc678_predictor_carry.md) — named producer DORMANT; PreScored never read +- [qfc791-deadline-teardown](project_qfc791_deadline_and_cancel_teardown.md) — superseded by #424/#608 ACs +- [qfc810-teardown-dropdown](project_qfc810_teardown_dropdown_residuals.md) — method-group blocks optional param (CS0123); files at 496/500 +- [qfc823-review-residuals](project_qfc823_review_residuals.md) — R3 null-tolerance doc FALSE; R2 follow-up is #813 +- [teardown-guard-821](project_teardown_guard_enumeration_821.md) — 4th sharer is the 4th Cancel() site +- [qfc-lifecycle-disposal-731](project_qfc_lifecycle_disposal_731.md) — sharing EmailMoveMonitor DROPS actions; `volatile` = CS0420 +- [qfc254-darkmode-labels](project_qfc254_darkmode_stale_labels.md) — labels themed only in MailRead()-guarded branch +- [qfc254-residual](project_qfc254_residual_after_comexception_fix.md) — historical; #269 cause = Light-theme fore/back swap +- [qfc254-ambient-inheritance](project_qfc254_ambient_inheritance_mechanism.md) — SUPERSEDED for #269; ambient notes accurate +- [qfc438-focus-steal](project_qfc438_search_focus_steal.md) — TWO focus-steal mechanisms +- [qfc677-webview2-focus](project_qfc677_webview2_focus_hold_outlook_keyboard.md) — WV2 focus hold + anchor steal; fix = focus predicate +- [qfc680-menu-mode](project_qfc680_menu_mode_keyboard_capture.md) — ModalMenuFilter; AutoClose=false pre-Show only opt-out +- [qfc663-alt-chord](project_qfc663_alt_chord_no_altf.md) — only Alt+M swallowed; Alt+F is EFC-only +- [qfc-keyboard-defects-444](project_qfc_keyboard_action_defects_444.md) — trigger Right/Down/Right +- [breadcrumb-nav-439-440](project_breadcrumb_navigation_defects_439_440_498_499.md) — fixing #439 regresses percentage join +- [issue-440-via-498](project_issue_440_already_landed_via_498.md) — Efc/Qfc do NOT share BreadcrumbRow +- [qfc-item-defects-484](project_qfc_item_controller_defects_484.md) — all 5 Suspected Fix sections wrong +- [webview2-initializer-476](project_webview2_host_initializer_defects_476.md) — EfcViewerQueue not a pool +- [qfc-efc-metrics-442](project_qfc_efc_metrics_442.md) — stopwatch race unfixable in owned files +- [qfc-collection-defects-468](project_qfc_collection_defects_468.md) — MovedMails param redundant; no log4net in QuickFiler.Test +- [qfc-collection-controller-468](project_qfc_collection_controller_defects_468.md) — #474 "unrelated interfaces" FALSE +- [issue-469-residual-629](project_issue_469_already_fixed_residual_is_629.md) — `Initialized` never memoizes +- [reflective-caller-635](project_reflective_caller_closure_635.md) — `GetField(` is the reaching mechanism (13 members) +- [selectrow-families-637](project_selectrow_two_families_637.md) — TWO SelectRow families +- [issue-656-no-bypass](project_issue_656_bypass_path_does_not_exist.md) — premise FALSE; owner files at cap +- [efc614-stem-leak](project_efc614_store_root_stem_leak.md) — FolderConverterTests.cs:329 codifies a bug +- [efc736-archiveroot-sink](project_efc736_archiveroot_boundary_sink.md) — 6 sink sites not 4 +- [banner-prefix-arity-662](project_banner_prefix_arity_662.md) — `/Tests:` vs `/TestCaseFilter:` mutually exclusive +- [qfc-folder-tree-325](project_qfc_folder_tree_percentage_325.md) — 1 live viewer, 9 dead CboFolders +- [qfc-breadcrumb-webview2-351](project_qfc_breadcrumb_webview2_351.md) — bridge greenfield +- [folder-hierarchy-provider-350](project_folder_hierarchy_provider_350.md) — reuse snapshot infra; no new COM seam +- [efcviewer-breadcrumb-349](project_efcviewer_breadcrumb_webview2_349.md) — EfcViewer3 dead; unscaled ColumnHeader widths +- [folder-settings-797](project_folder_settings_persistence_797.md) — ThisAddIn_Shutdown never raised +- [ilglobals-static-824](project_ilglobals_static_publication_824.md) — BeSameAs only order-independent RED gate +- [etl-deadline-825](project_etl_deadline_followups_825.md) — read shipped package .xml to verify API diff --git a/.claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md b/.claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md new file mode 100644 index 000000000..8ea18e6e8 --- /dev/null +++ b/.claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md @@ -0,0 +1,12 @@ +--- +name: dependabot-repair-workflow-run-script-source-985 +description: dependabot-repair runs default-branch YAML but the Dependabot branch's script; YAML edits (incl. workflows/README.md) can't be green-run pre-merge; redirect invariant is a union +metadata: + type: project +--- + +`.github/workflows/dependabot-repair.yml` (workflow_run on CI) executes the default-branch YAML but checks out `head_branch` and runs THAT branch's `scripts/dependencies/Repair-PackageManifestConsistency.ps1`. A script fix reaches an existing Dependabot PR only after `@dependabot recreate` (`rebase` is refused once the repair bot has pushed a commit). + +**Why:** Any diff under `.github/workflows/**` (README.md included) trips `modified-workflow-needs-green-run`, and this workflow can never run green against a feature branch (dependabot/ filter, no workflow_dispatch). Issue #985 research therefore put the new redirect-sync pass inside the script, made it unconditional, and kept its records out of `Verification[].Report.Repair` so the `beyond-known-weak` filter and the YAML stay untouched. + +**How to apply:** For any repair-behaviour change, prefer script/module changes over YAML. Note also that `BindingRedirectVerification.Tests.ps1` checks `newVersion` membership in a UNION of all csproj Reference versions, so a stale Reference in one test csproj masks a stale redirect. Packages.config/app.config/csproj are in `.csharpierignore`, so format-check never sees them. Related: [[measure-item-worktree]]. diff --git a/QuickFiler.Test/QuickFiler.Test.csproj b/QuickFiler.Test/QuickFiler.Test.csproj index 6206c5b6c..ea6697ba8 100644 --- a/QuickFiler.Test/QuickFiler.Test.csproj +++ b/QuickFiler.Test/QuickFiler.Test.csproj @@ -525,11 +525,6 @@ TaskVisualization - - - ..\packages\Microsoft.Web.WebView2.1.0.4191.47\lib\net462\Microsoft.Web.WebView2.Core.dll - - diff --git a/QuickFiler.Test/packages.config b/QuickFiler.Test/packages.config index df2a75e8e..10eb5fd36 100644 --- a/QuickFiler.Test/packages.config +++ b/QuickFiler.Test/packages.config @@ -39,10 +39,12 @@ + + diff --git a/TaskTree.Test/packages.config b/TaskTree.Test/packages.config index 0c4b89781..cbe4c2c11 100644 --- a/TaskTree.Test/packages.config +++ b/TaskTree.Test/packages.config @@ -38,6 +38,7 @@ + diff --git a/UtilitiesCS.Test/packages.config b/UtilitiesCS.Test/packages.config index b1d44e24e..cdea2476a 100644 --- a/UtilitiesCS.Test/packages.config +++ b/UtilitiesCS.Test/packages.config @@ -61,6 +61,7 @@ + diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-analyzers.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-analyzers.2026-10-09T14-04.md new file mode 100644 index 000000000..7cb2d20d0 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-analyzers.2026-10-09T14-04.md @@ -0,0 +1,15 @@ +# C# Baseline Analyzers (P0-T11) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File CMDDIR\985-msbuild.ps1 -WorkspaceRoot WORKSPACE-ROOT -Gate Analyzers -LogName 985-baseline-analyzers.log (msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true) +EXIT_CODE: 0 +Output Summary: +- EXIT_CODE: 0 +- OUTPUT-ASSEMBLIES: 18 +- SUMMARY: 0 Warning(s) +- SUMMARY: 0 Error(s) +- ERROR-LINE-COUNT: 0 +- PATH-LENGTH-SIGNATURE-LINES: 0 +- BASELINE-OUTPUT-ASSEMBLIES: 18 +- Log kept at coverage/985-baseline-analyzers.log (ignored directory). +- Result: analyzer baseline green; no CS-BASELINE-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-format.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-format.2026-10-09T14-04.md new file mode 100644 index 000000000..d5fefa3c8 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-format.2026-10-09T14-04.md @@ -0,0 +1,10 @@ +# C# Baseline Format (P0-T9) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File WORKSPACE-ROOT\scripts\vscode\Install-RepoDotNetSdk.ps1; pwsh -NoProfile -File CMDDIR\985-csharpier.ps1 -WorkspaceRoot WORKSPACE-ROOT -Mode restore; pwsh -NoProfile -File CMDDIR\985-csharpier.ps1 -WorkspaceRoot WORKSPACE-ROOT -Mode check +EXIT_CODE: 0 +Output Summary: +- SDK-INSTALL-EXIT_CODE: 0 (Installed repo-local .NET SDK 8.0.205 to WORKSPACE-ROOT\.dotnet-sdk, ignored by .gitignore `.dotnet*/`) +- restore: COMMAND dotnet tool restore; EXIT_CODE 0; Tool 'csharpier' (version '1.2.6') was restored; Restore was successful. +- check: COMMAND dotnet tool run csharpier check .; EXIT_CODE 0; Checked 1650 files in 4288ms. +- Result: C# format baseline green (read-only check); no CS-BASELINE-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-nullable.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-nullable.2026-10-09T14-04.md new file mode 100644 index 000000000..c24823522 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-nullable.2026-10-09T14-04.md @@ -0,0 +1,14 @@ +# C# Baseline Type-check (P0-T12) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File CMDDIR\985-msbuild.ps1 -WorkspaceRoot WORKSPACE-ROOT -Gate Nullable -LogName 985-baseline-nullable.log (msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true) +EXIT_CODE: 0 +Output Summary: +- EXIT_CODE: 0 +- OUTPUT-ASSEMBLIES: 18 (equal to BASELINE-OUTPUT-ASSEMBLIES 18) +- SUMMARY: 0 Warning(s) +- SUMMARY: 0 Error(s) +- ERROR-LINE-COUNT: 0 +- PATH-LENGTH-SIGNATURE-LINES: 0 +- Log kept at coverage/985-baseline-nullable.log (ignored directory). +- Result: nullable baseline green; no CS-BASELINE-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-restore.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-restore.2026-10-09T14-04.md new file mode 100644 index 000000000..c939afbdf --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-restore.2026-10-09T14-04.md @@ -0,0 +1,9 @@ +# C# Baseline Restore (P0-T10) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File CMDDIR\985-restore.ps1 -WorkspaceRoot WORKSPACE-ROOT (runs nuget restore TaskMaster.sln -NonInteractive) +EXIT_CODE: 0 +Output Summary: +- EXIT_CODE: 0; LINE-COUNT: 539 +- TAIL: Installed: 173 package(s) to packages.config projects +- Result: restore succeeded; no CS-BASELINE-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-test.2026-10-09T14-11.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-test.2026-10-09T14-11.md new file mode 100644 index 000000000..6eb3da14e --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/cs-test.2026-10-09T14-11.md @@ -0,0 +1,19 @@ +# C# Baseline Tests with Coverage (P0-T13) + +Timestamp: 2026-10-09T14-11 +Command: pwsh -NoProfile -File CMDDIR\985-mstest.ps1 -WorkspaceRoot WORKSPACE-ROOT -EvidencePrefix WORKSPACE-ROOT\FEATURE\evidence\baseline\mstest-coverage-baseline.2026-10-09T14-11 +EXIT_CODE: 0 +Output Summary: +- SHELL-ICON-EXCLUSION: APPLIED ShellUtilities_Tests ShellUtilitiesStatic_Tests SysImageListHelperTests OSBrowser_Tests (route D3; CI runs the full set) +- Discovered 9 test assemblies. +- First-party coverage: lines 56496/66143 (85.41%), branches 13709/17173 (79.83%) +- RUNNER_RESULT=COMPLETED (C7 flaky rule did not apply) +- TRX-SUMMARY: Test run outcome: Completed +- TRX-SUMMARY: Total 7427, executed 7427, passed 7427, failed 0. +- TRX-SUMMARY: Skipped 0, derived as total minus executed rather than reported by the test platform. +- TRX-SUMMARY: Figures reported verbatim by the test platform: error 0, timeout 0, aborted 0, notExecuted 0, inconclusive 0. +- TRX-SUMMARY: Failed tests: none +- PROJECTION-COPIED; copies present: mstest-coverage-baseline.2026-10-09T14-11.summary.txt and mstest-coverage-baseline.2026-10-09T14-11.jacoco.xml (beside this file) +- BASELINE-CS-LINE: 85.41 +- BASELINE-CS-BRANCH: 79.83 +- Result: baseline green; no BASELINE-TEST-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/git-and-tools.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/git-and-tools.2026-10-09T14-04.md new file mode 100644 index 000000000..8354b804b --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/git-and-tools.2026-10-09T14-04.md @@ -0,0 +1,47 @@ +# Git State and Tool Availability (P0-T2) + +Timestamp: 2026-10-09T14-04 +Command: git rev-parse --abbrev-ref HEAD; git rev-parse HEAD; git merge-base HEAD origin/main; git diff --name-only BASE-SHA HEAD; git status --porcelain; pwsh -NoProfile -File CMDDIR\985-probe.ps1 -RehearsalRoot REHEARSAL +EXIT_CODE: 0 +Output Summary: +- BRANCH: bug/dependabot-repair-borrowed-packages-and-transitive-redirects-985 (equals FIX-BRANCH) +- HEAD: 9911fe138952e2b93476850582847c2831e1cbbd +- BASE-SHA: 9911fe138952e2b93476850582847c2831e1cbbd +- Committed diff BASE-SHA..HEAD: empty (no committed path outside the permitted set) +- Probe: PWSH-VERSION 7.6.6; PESTER-AVAILABLE 5.6.1; NUGET FOUND (NuGet Version: 7.6.0.59); VSWHERE True; MSBUILD FOUND; DOTNET-COVERAGE FOUND; LONG-PATHS-ENABLED 1; REHEARSAL-ROOT-LENGTH 162 +- Result: all required tools present; no STOP condition. + +## git diff --name-only BASE-SHA HEAD + +(empty) + +## PreExistingWorktreePaths: + +``` + M .claude/agent-memory/atomic-executor/MEMORY.md + M .claude/agent-memory/atomic-planner/MEMORY.md + M .claude/agent-memory/task-researcher/MEMORY.md +?? .claude/agent-memory/atomic-executor/index_overflow_entries.md +?? .claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md +?? .claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md +?? .claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md +?? .claude/agent-memory/task-researcher/index_epic136_percoverage_children.md +?? .claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md +?? .claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md +?? docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/ +?? docs/features/potential/promoted/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects.md +``` + +## Probe output (985-probe.ps1) + +``` +PWSH-VERSION: 7.6.6 +PESTER-AVAILABLE: 5.6.1 +NUGET: FOUND +NUGET-VERSION: NuGet Version: 7.6.0.59 +VSWHERE: True +MSBUILD: FOUND +DOTNET-COVERAGE: FOUND +LONG-PATHS-ENABLED: 1 +REHEARSAL-ROOT-LENGTH: 162 +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/helper-scripts.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/helper-scripts.2026-10-09T14-04.md new file mode 100644 index 000000000..b8189a64c --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/helper-scripts.2026-10-09T14-04.md @@ -0,0 +1,20 @@ +# Helper Scripts (P0-T3) + +Timestamp: 2026-10-09T14-04 +Command: git hash-object --no-filters CMDDIR\985-probe.ps1 CMDDIR\985-restore.ps1 CMDDIR\985-csharpier.ps1 CMDDIR\985-msbuild.ps1 CMDDIR\985-mstest.ps1 CMDDIR\985-pester.ps1 CMDDIR\985-junit.ps1 CMDDIR\985-repair.ps1 CMDDIR\985-nuget-update.ps1 +EXIT_CODE: 0 +Output Summary: +- Nine helper scripts written verbatim from plan section 5 into CMDDIR (outside the repository), each with Format-SafeLine pasted after its param block. +- Nine hashes recorded below; P8-T1 re-checks them. + +| Script | git hash-object --no-filters | +|---|---| +| 985-probe.ps1 | fd56601d907546ef6b0f2d4b374d22cca441eb56 | +| 985-restore.ps1 | 96658345a6001e5c22b5e5b4174404edbff12127 | +| 985-csharpier.ps1 | 4436583817876b8c12d968489805c1655f46ddfb | +| 985-msbuild.ps1 | 7b80d637d6f7abccbf4df86877ac561fc0a0c6dc | +| 985-mstest.ps1 | f45cc585940fd1efe2c0b409573b5c815e2fe7d8 | +| 985-pester.ps1 | 74ddc15e1a935c4b5dbd0efa4a72b63d9fcc0913 | +| 985-junit.ps1 | 4df03fc0b964ac2d337c37141a5266f89b5c96a3 | +| 985-repair.ps1 | 5cc7c5caaa7f90e37076de4ead07ce66332fe948 | +| 985-nuget-update.ps1 | cb461c5cfd131c592f587cc6b583d468239280ea | diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.jacoco.xml b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.jacoco.xml new file mode 100644 index 000000000..aa3a94835 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.jacoco.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.summary.txt b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.summary.txt new file mode 100644 index 000000000..100bb2604 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/mstest-coverage-baseline.2026-10-09T14-11.summary.txt @@ -0,0 +1,5 @@ +Test run outcome: Completed +Total 7427, executed 7427, passed 7427, failed 0. +Skipped 0, derived as total minus executed rather than reported by the test platform. +Figures reported verbatim by the test platform: error 0, timeout 0, aborted 0, notExecuted 0, inconclusive 0. +Failed tests: none diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/phase0-instructions-read.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/phase0-instructions-read.md new file mode 100644 index 000000000..f5414b05b --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/phase0-instructions-read.md @@ -0,0 +1,25 @@ +# Phase 0 Instructions Read (Issue #985) + +Timestamp: 2026-10-09T14-04 + +Policy Order: CLAUDE.md, then .claude/rules/general-code-change.md, then .claude/rules/general-unit-test.md, then the domain rules (.claude/rules/quality-tiers.md, .claude/rules/powershell.md, .claude/rules/csharp.md, .claude/rules/tonality.md, .claude/rules/plan-acceptance-gates.md), then the skills (atomic-plan-contract, evidence-and-timestamp-conventions, acceptance-criteria-tracking), then the feature documents (issue.md, spec.md, research). + +Files Read: +1. CLAUDE.md +2. .claude/rules/general-code-change.md +3. .claude/rules/general-unit-test.md +4. .claude/rules/quality-tiers.md +5. .claude/rules/powershell.md +6. .claude/rules/csharp.md +7. .claude/rules/tonality.md +8. .claude/rules/plan-acceptance-gates.md +9. .claude/skills/atomic-plan-contract/SKILL.md +10. .claude/skills/evidence-and-timestamp-conventions/SKILL.md +11. .claude/skills/acceptance-criteria-tracking/SKILL.md +12. docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/issue.md +13. docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/spec.md +14. docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/research/research.2026-10-09T14-10.md + +Notes: +- Work Mode (issue.md): full-bug; AC source is spec.md only (AC1 to AC7). +- Coverage floors applied per plan D6: CLAUDE.md UT2 (line 80, new code 90) takes precedence over the 85 figure in quality-tiers.md, which is recorded as an observation. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/post-baseline-porcelain.2026-10-09T14-13.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/post-baseline-porcelain.2026-10-09T14-13.md new file mode 100644 index 000000000..c74051808 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/post-baseline-porcelain.2026-10-09T14-13.md @@ -0,0 +1,27 @@ +# Post-baseline Porcelain Check (P0-T14) + +Timestamp: 2026-10-09T14-13 +Command: git status --porcelain +EXIT_CODE: 0 +Output Summary: +- 12 porcelain lines; identical to PreExistingWorktreePaths recorded in git-and-tools.2026-10-09T14-04.md. +- AGENT-MEMORY-LINES: 10 (3 modified MEMORY.md files, 7 untracked memory files; listed below) +- Non-agent-memory lines: the FEATURE folder (untracked, holds the new evidence) and docs/features/potential/promoted/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects.md; both pre-existing. +- No tracked file modified by the baseline build, restore or test steps (QuickFiler.Test/QuickFiler.Test.csproj unchanged); nothing reverted. + +## Porcelain + +``` + M .claude/agent-memory/atomic-executor/MEMORY.md + M .claude/agent-memory/atomic-planner/MEMORY.md + M .claude/agent-memory/task-researcher/MEMORY.md +?? .claude/agent-memory/atomic-executor/index_overflow_entries.md +?? .claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md +?? .claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md +?? .claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md +?? .claude/agent-memory/task-researcher/index_epic136_percoverage_children.md +?? .claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md +?? .claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md +?? docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/ +?? docs/features/potential/promoted/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects.md +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-analyze.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-analyze.2026-10-09T14-04.md new file mode 100644 index 000000000..d7bfbfc7d --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-analyze.2026-10-09T14-04.md @@ -0,0 +1,10 @@ +# PowerShell Baseline Lint (P0-T6) + +Timestamp: 2026-10-09T14-04 +Command: mcp__drm-copilot__run_poshqc_analyze workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 0 +Output Summary: +- MCP ok: true +- MCP summary: Ran bundled PoshQC analyze against 'WORKSPACE-ROOT' with 2 selected scan folder(s). +- Type checking: not applicable to PowerShell (.claude/rules/powershell.md toolchain step 3). +- Result: baseline lint green; no ANALYZE-BASELINE-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-coverage.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-coverage.2026-10-09T14-04.md new file mode 100644 index 000000000..e03386c4f --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-coverage.2026-10-09T14-04.md @@ -0,0 +1,57 @@ +# PowerShell Baseline Direct Coverage (P0-T8) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies,tests/scripts/hygiene,tests/scripts/vscode -CoveragePath scripts/dependencies,scripts/hygiene,scripts/vscode -CoverageOutput coverage/985-pester-baseline.xml +EXIT_CODE: 0 +Output Summary: +- TEST-PATH-COUNT: 3; COVERAGE-PATH-COUNT: 3; PESTER-VERSION: 5.6.1 +- PESTER Passed=413 Failed=0 Skipped=0 NotRun=0 Total=413 +- COVERAGE LinePercent=94.64 Covered=1765 Total=1865 +- FILE-COVERAGE scripts/dependencies/dependencies/Repair-PackageManifestConsistency.ps1 LinePercent=93.83 Covered=213 Total=227 +- BASELINE-PS-AGGREGATE: 94.64 +- BASELINE-REPAIR-SCRIPT-LINE: 93.83 +- Raw JaCoCo document kept at coverage/985-pester-baseline.xml (ignored directory); not copied into the feature folder. +- Result: baseline green; no BASELINE-TEST-RED. + +## FILE-TESTS lines + +``` +FILE-TESTS AnalyzerItemRepair.Tests.ps1 Passed=13 Failed=0 Total=13 +FILE-TESTS BindingRedirectVerification.Tests.ps1 Passed=16 Failed=0 Total=16 +FILE-TESTS ConsistencyVerifier.Tests.ps1 Passed=14 Failed=0 Total=14 +FILE-TESTS DependabotConfig.Tests.ps1 Passed=17 Failed=0 Total=17 +FILE-TESTS Install-RepoDotNetSdk.Tests.ps1 Passed=6 Failed=0 Total=6 +FILE-TESTS Invoke-MSTest.AssemblyDiscovery.Tests.ps1 Passed=5 Failed=0 Total=5 +FILE-TESTS Invoke-MSTest.Main.Tests.ps1 Passed=12 Failed=0 Total=12 +FILE-TESTS Invoke-MSTest.ResultsDirectory.Tests.ps1 Passed=3 Failed=0 Total=3 +FILE-TESTS Invoke-MSTest.RunSettings.Tests.ps1 Passed=28 Failed=0 Total=28 +FILE-TESTS Invoke-MSTest.TrxSummary.Tests.ps1 Passed=7 Failed=0 Total=7 +FILE-TESTS Invoke-MSTestWithCoverage.AssemblyDiscovery.Tests.ps1 Passed=5 Failed=0 Total=5 +FILE-TESTS Invoke-MSTestWithCoverage.ClosureFilter.Tests.ps1 Passed=12 Failed=0 Total=12 +FILE-TESTS Invoke-MSTestWithCoverage.FirstParty.Tests.ps1 Passed=7 Failed=0 Total=7 +FILE-TESTS Invoke-MSTestWithCoverage.Helpers.Tests.ps1 Passed=20 Failed=0 Total=20 +FILE-TESTS Invoke-MSTestWithCoverage.Merge.Tests.ps1 Passed=6 Failed=0 Total=6 +FILE-TESTS Invoke-MSTestWithCoverage.PackageRate.Tests.ps1 Passed=2 Failed=0 Total=2 +FILE-TESTS Invoke-MSTestWithCoverage.Projection.Tests.ps1 Passed=11 Failed=0 Total=11 +FILE-TESTS Invoke-MSTestWithCoverage.ResultsDirectory.Tests.ps1 Passed=9 Failed=0 Total=9 +FILE-TESTS Invoke-MSTestWithCoverage.Scope.Tests.ps1 Passed=22 Failed=0 Total=22 +FILE-TESTS Invoke-MSTestWithCoverage.Threshold.Tests.ps1 Passed=13 Failed=0 Total=13 +FILE-TESTS Invoke-Restore.Tests.ps1 Passed=7 Failed=0 Total=7 +FILE-TESTS Invoke-VSBuild.Tests.ps1 Passed=16 Failed=0 Total=16 +FILE-TESTS PackageCompatibility.Tests.ps1 Passed=8 Failed=0 Total=8 +FILE-TESTS PackageGraph.Tests.ps1 Passed=32 Failed=0 Total=32 +FILE-TESTS ProjectConsistency.Tests.ps1 Passed=18 Failed=0 Total=18 +FILE-TESTS Repair-PackageManifestConsistency.Tests.ps1 Passed=31 Failed=0 Total=31 +FILE-TESTS RepositoryTreeConsistency.Tests.ps1 Passed=4 Failed=0 Total=4 +FILE-TESTS Sync-PackageReferences.Tests.ps1 Passed=15 Failed=0 Total=15 +FILE-TESTS Test-RepositoryHygiene.Git.Tests.ps1 Passed=5 Failed=0 Total=5 +FILE-TESTS Test-RepositoryHygiene.Rules.Tests.ps1 Passed=29 Failed=0 Total=29 +FILE-TESTS Test-RepositoryHygiene.Tests.ps1 Passed=15 Failed=0 Total=15 +FILE-TESTS TestProcessCleanup.Tests.ps1 Passed=5 Failed=0 Total=5 +``` + +## FILE-COVERAGE (Repair script) + +``` +FILE-COVERAGE scripts/dependencies/dependencies/Repair-PackageManifestConsistency.ps1 LinePercent=93.83 Covered=213 Total=227 +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-format.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-format.2026-10-09T14-04.md new file mode 100644 index 000000000..d2272205b --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-format.2026-10-09T14-04.md @@ -0,0 +1,12 @@ +# PowerShell Baseline Format (P0-T5) + +Timestamp: 2026-10-09T14-04 +Command: mcp__drm-copilot__run_poshqc_format workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 0 +Output Summary: +- MCP ok: true +- MCP summary: Ran bundled PoshQC format against 'WORKSPACE-ROOT' with 2 selected scan folder(s). +- Porcelain before and after: identical (12 lines, all pre-existing; listed in git-and-tools.2026-10-09T14-04.md). +- scripts/dependencies/Repair-PackageManifestConsistency.ps1 hash before e3029f6ba072f6198c40fe985ebfe0e29c261889, after e3029f6ba072f6198c40fe985ebfe0e29c261889 (identical) +- tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 hash before 1167a0be9a5c30f8a13ec44331b7c06bdcd9369f, after 1167a0be9a5c30f8a13ec44331b7c06bdcd9369f (identical) +- Result: no rewrite; no BASELINE-FORMAT-DRIFT. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-test-mcp.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-test-mcp.2026-10-09T14-04.md new file mode 100644 index 000000000..b65924c7f --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/ps-test-mcp.2026-10-09T14-04.md @@ -0,0 +1,19 @@ +# PowerShell Baseline MCP Test (P0-T7) + +Timestamp: 2026-10-09T14-04 +Command: pwsh -NoProfile -File CMDDIR\985-junit.ps1 -WorkspaceRoot WORKSPACE-ROOT -Clear; mcp__drm-copilot__run_poshqc_test workspace_root = WORKSPACE-ROOT, scan_folders = [tests/scripts/dependencies]; pwsh -NoProfile -File CMDDIR\985-junit.ps1 -WorkspaceRoot WORKSPACE-ROOT +EXIT_CODE: 0 +Output Summary: +- JUNIT-CLEARED: True +- MCP ok: true; summary: Ran bundled PoshQC test against 'WORKSPACE-ROOT' with 1 selected scan folder(s). +- JUNIT tests=153 failures=0 errors=0 disabled=0 +- JUNIT-SUITE AnalyzerItemRepair.Tests.ps1 tests=13 failures=0 +- JUNIT-SUITE BindingRedirectVerification.Tests.ps1 tests=16 failures=0 +- JUNIT-SUITE ConsistencyVerifier.Tests.ps1 tests=14 failures=0 +- JUNIT-SUITE DependabotConfig.Tests.ps1 tests=17 failures=0 +- JUNIT-SUITE PackageCompatibility.Tests.ps1 tests=8 failures=0 +- JUNIT-SUITE PackageGraph.Tests.ps1 tests=32 failures=0 +- JUNIT-SUITE ProjectConsistency.Tests.ps1 tests=18 failures=0 +- JUNIT-SUITE Repair-PackageManifestConsistency.Tests.ps1 tests=31 failures=0 +- JUNIT-SUITE RepositoryTreeConsistency.Tests.ps1 tests=4 failures=0 +- Result: baseline green; no BASELINE-TEST-RED. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/tree-facts.2026-10-09T14-04.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/tree-facts.2026-10-09T14-04.md new file mode 100644 index 000000000..b91abd5ed --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/baseline/tree-facts.2026-10-09T14-04.md @@ -0,0 +1,26 @@ +# Pre-change Tree Facts (P0-T4) + +Timestamp: 2026-10-09T14-04 +Command: Grep tool (count mode) with patterns `^`, `\r$`, `id="Microsoft\.Web\.WebView2"|id="ObjectListView\.Official"`, `Include="Microsoft\.Web\.WebView2\.Core,`; Glob for the three new files +EXIT_CODE: 0 +Output Summary: +- Every observed value equals the plan's expected value; no anchor re-derivation needed. + +| Fact | Expected | Observed | +|---|---|---| +| QuickFiler.Test/packages.config lines | 74 | 74 | +| UtilitiesCS.Test/packages.config lines | 110 | 110 | +| TaskTree.Test/packages.config lines | 69 | 69 | +| QuickFiler.Test/QuickFiler.Test.csproj lines | 572 | 572 | +| scripts/dependencies/Repair-PackageManifestConsistency.ps1 lines | 475 | 475 | +| tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 lines | 152 | 152 | +| QuickFiler.Test/packages.config CR count | 73 | 73 | +| UtilitiesCS.Test/packages.config CR count | 109 | 109 | +| TaskTree.Test/packages.config CR count | 68 | 68 | +| WebView2/ObjectListView declarations: QuickFiler.Test | 0 | 0 | +| WebView2/ObjectListView declarations: UtilitiesCS.Test | 1 (line 70 ObjectListView.Official) | 1 (line 70 ObjectListView.Official 2.9.1) | +| WebView2/ObjectListView declarations: TaskTree.Test | 0 | 0 | +| `Include="Microsoft.Web.WebView2.Core,` in QuickFiler.Test.csproj | 2 | 2 (lines 388, 529) | +| scripts/dependencies/BindingRedirectSync.psm1 | absent | absent (Glob none; control Glob for BindingRedirect*.psm1 returned BindingRedirectVerification.psm1) | +| tests/scripts/dependencies/BindingRedirectSync.Tests.ps1 | absent | absent | +| tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 | absent | absent | diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/line-counts-post-impl.2026-10-09T14-20.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/line-counts-post-impl.2026-10-09T14-20.md new file mode 100644 index 000000000..26580a971 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/line-counts-post-impl.2026-10-09T14-20.md @@ -0,0 +1,27 @@ +# Post-implementation Line Counts (P3-T3) + +Timestamp: 2026-10-09T14-20 +Command: Grep tool, pattern `^`, output mode count, over scripts/dependencies/BindingRedirectSync.psm1 and scripts/dependencies/Repair-PackageManifestConsistency.ps1 +EXIT_CODE: 0 +Output Summary: +- scripts/dependencies/BindingRedirectSync.psm1: 307 lines (at most 500) +- scripts/dependencies/Repair-PackageManifestConsistency.ps1: 493 lines (at most 500; above the 475 baseline) +- Result: both within the 500-line limit; no SIZE-LIMIT. + +## P3-T1 static checks (BindingRedirectSync.psm1) + +- `^Export-ModuleMember` count 1 (line 303) +- `function` lines: Invoke-BindingRedirectSync (75), Invoke-SolutionBindingRedirectSync (170), Format-BindingRedirectSyncReport (276), one each +- `Import-Module .*-Force` count 0 +- `[^\x00-\x7F]` count 0 + +## P3-T2 static checks (Repair-PackageManifestConsistency.ps1) + +- `BindingRedirectSync\.psm1` 1 (line 73) +- `Invoke-SolutionBindingRedirectSync` 1 (line 449) +- `-WhatIf:\$WhatIfPreference` 2 (lines 450 and 456) +- `RedirectSync\s+=` 1 (line 487) +- `Format-BindingRedirectSyncReport` 1 (line 464) +- `\$projectTextOverride\[` 1 (line 421) +- The new call sits after the manifest loop and before normalisation, with no `-CandidateUpgrade` condition. +- Carriage-return count equals line count (493), so CRLF line endings are preserved. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/manifest-edit-facts.2026-10-09T14-17.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/manifest-edit-facts.2026-10-09T14-17.md new file mode 100644 index 000000000..08b4b8385 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/manifest-edit-facts.2026-10-09T14-17.md @@ -0,0 +1,50 @@ +# Manifest Edit Facts (P2-T6) + +Timestamp: 2026-10-09T14-17 +Command: Grep tool counts (`^`, `\r$`, declaration patterns); git diff --numstat BASE-SHA -- QuickFiler.Test/packages.config UtilitiesCS.Test/packages.config TaskTree.Test/packages.config QuickFiler.Test/QuickFiler.Test.csproj; git status --porcelain -- (same four paths) +EXIT_CODE: 0 +Output Summary: +- Line counts: QuickFiler.Test 76, UtilitiesCS.Test 111, TaskTree.Test 70 (expected 76, 111, 70) +- Carriage-return counts: QuickFiler.Test 75, UtilitiesCS.Test 110, TaskTree.Test 69 (expected 75, 110, 69; every inserted line kept CRLF) +- numstat: QuickFiler.Test/packages.config 2 0; UtilitiesCS.Test/packages.config 1 0; TaskTree.Test/packages.config 1 0; QuickFiler.Test/QuickFiler.Test.csproj 0 5 (expected 2 0, 1 0, 1 0, 0 5) +- porcelain: ` M` for all four paths +- QuickFiler.Test.csproj: `Include="Microsoft.Web.WebView2.Core,` count 1 (line 388); 567 lines; `Microsoft.Web.WebView2.1.0.4191.47` folder count 2 (lines 389, 392) +- Result: every value equals the expectation. + +## Inserted lines + +| File | Line | Text | +|---|---|---| +| QuickFiler.Test/packages.config | 42 | ` ` | +| QuickFiler.Test/packages.config | 47 | ` ` | +| UtilitiesCS.Test/packages.config | 64 | ` ` | +| TaskTree.Test/packages.config | 41 | ` ` | + +## Production sibling declarations (re-read in this task) + +| Sibling | Line | Text | +|---|---|---| +| QuickFiler/packages.config | 19 | ` ` | +| QuickFiler/packages.config | 22 | ` ` | +| UtilitiesCS/packages.config | 57 | ` ` | +| TaskTree/packages.config | 8 | ` ` | + +Each inserted declaration matches its production sibling's id, version and targetFramework, and the folder the existing HintPaths name (`Microsoft.Web.WebView2.1.0.4191.47`, `ObjectListView.Official.2.9.1`). + +## numstat + +``` +0 5 QuickFiler.Test/QuickFiler.Test.csproj +2 0 QuickFiler.Test/packages.config +1 0 TaskTree.Test/packages.config +1 0 UtilitiesCS.Test/packages.config +``` + +## porcelain + +``` + M QuickFiler.Test/QuickFiler.Test.csproj + M QuickFiler.Test/packages.config + M TaskTree.Test/packages.config + M UtilitiesCS.Test/packages.config +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/whatif-live-tree.2026-10-09T14-21.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/whatif-live-tree.2026-10-09T14-21.md new file mode 100644 index 000000000..8ea3d9791 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/other/whatif-live-tree.2026-10-09T14-21.md @@ -0,0 +1,49 @@ +# Live-tree WhatIf Repair Run (P3-T6) + +Timestamp: 2026-10-09T14-21 +Command: pwsh -NoProfile -File CMDDIR\985-repair.ps1 -WorkspaceRoot WORKSPACE-ROOT -WhatIfRun (runs & WORKSPACE-ROOT\scripts\dependencies\Repair-PackageManifestConsistency.ps1 -WhatIf); git status --porcelain immediately before and after +EXIT_CODE: 0 +Output Summary: +- IS-SUCCESS: True (recorded, not gated) +- WRITTEN-COUNT: 0 +- REPAIR-COUNT: 0; BEYOND-KNOWN-WEAK: 0; REPORT-REPAIR-KINDS: (empty); SKIP-COUNT: 0 +- REDIRECTSYNC-REPAIR-COUNT: 0 (the working tree's redirects already satisfy the BindingRedirectVerification invariant) +- REDIRECTSYNC-UNVERIFIABLE: netstandard +- REDIRECTSYNC-UNRESOLVABLE: (empty) +- Sync information line: Binding redirect sync: examined 17 application configuration file(s), synchronised 0 redirect(s), unverifiable 1, unresolvable 0 +- Porcelain before and after the run: identical (21 lines each; listed below). +- Observation (not gated, pre-existing behaviour of the normalisation pass): the run printed 17 `What if: Performing the operation "Rewrite in canonical inline form"` lines for packages.config files (QuickFiler.Test, QuickFiler, SVGControl.Test, Tags.Test, Tags, TaskMaster.Test, TaskMaster, TaskTree.Test, TaskTree, TaskVisualization.Test, TaskVisualization, ToDoModel.Test, ToDoModel, UtilitiesCS.Test, UtilitiesCS, VBFunctions.Test, VBFunctions); -WhatIf suppressed every write. +- Result: no STOP: LIVE-TREE-SYNC-NONZERO. + +## Body + +``` +## Repairs applied +No repairs were applied. +``` + +## Porcelain (before and after, identical) + +``` + M .claude/agent-memory/atomic-executor/MEMORY.md + M .claude/agent-memory/atomic-planner/MEMORY.md + M .claude/agent-memory/task-researcher/MEMORY.md + M QuickFiler.Test/QuickFiler.Test.csproj + M QuickFiler.Test/packages.config + M TaskTree.Test/packages.config + M UtilitiesCS.Test/packages.config + M scripts/dependencies/Repair-PackageManifestConsistency.ps1 + M tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 +?? .claude/agent-memory/atomic-executor/index_overflow_entries.md +?? .claude/agent-memory/atomic-executor/project_mstest_runner_summary_absent_on_failure_voids_flaky_carveout.md +?? .claude/agent-memory/atomic-planner/index_preflight_seams_900_to_973.md +?? .claude/agent-memory/atomic-planner/project_985_r0_rehearsal_fidelity_and_hygiene_path_seams.md +?? .claude/agent-memory/task-researcher/index_epic136_percoverage_children.md +?? .claude/agent-memory/task-researcher/index_quickfiler_efc_defects.md +?? .claude/agent-memory/task-researcher/project_dependabot_repair_workflow_run_script_source_985.md +?? docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/ +?? docs/features/potential/promoted/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects.md +?? scripts/dependencies/BindingRedirectSync.psm1 +?? tests/scripts/dependencies/BindingRedirectSync.Tests.ps1 +?? tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-csharp.2026-10-09T14-31.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-csharp.2026-10-09T14-31.md new file mode 100644 index 000000000..757ad8c9e --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-csharp.2026-10-09T14-31.md @@ -0,0 +1,13 @@ +# C# Coverage Comparison (P5-T6) + +Timestamp: 2026-10-09T14-31 +Command: comparison of FEATURE/evidence/baseline/cs-test.2026-10-09T14-11.md (P0-T13) and FEATURE/evidence/qa-gates/cs-test.2026-10-09T14-31.md (P5-T5); git diff --numstat BASE-SHA -- '*.cs'; git status --porcelain -- '*.cs' +EXIT_CODE: 0 +Output Summary: +- Baseline line coverage: 85.41 (56496/66143); final line coverage: 85.41 (56495/66143); delta 0.00 percentage points (one covered line fewer, within run-to-run variation; no C# source changed) +- Baseline branch coverage: 79.83 (13709/17173); final branch coverage: 79.83 (13709/17173); delta 0.00 +- Runner floors (line 80, branch 75) met on both runs. +- `git diff --numstat BASE-SHA -- '*.cs'`: empty +- `git status --porcelain -- '*.cs'`: empty +- New or changed C# code coverage: not applicable (no C# source line changed, proved by the two empty outputs above). +- Result: PASS; no scope violation. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-powershell.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-powershell.2026-10-09T14-26.md new file mode 100644 index 000000000..3d661acf2 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/coverage-comparison-powershell.2026-10-09T14-26.md @@ -0,0 +1,14 @@ +# PowerShell Coverage Comparison (P4-T7) + +Timestamp: 2026-10-09T14-26 +Command: comparison of FEATURE/evidence/baseline/ps-coverage.2026-10-09T14-04.md (P0-T8) and FEATURE/evidence/qa-gates/ps-coverage.2026-10-09T14-26.md (P4-T4, iteration 2) +EXIT_CODE: 0 +Output Summary: +- Baseline aggregate line coverage (scripts/dependencies, scripts/hygiene, scripts/vscode): 94.64 (1765/1865) +- Final aggregate line coverage: 94.98 (1891/1991) +- Delta: +0.34 percentage points (gate: final at or above 80.00; PASS) +- BindingRedirectSync.psm1 (new code) final line coverage: 100.00 (114/114) (gate: at or above 90.00; PASS) +- Repair-PackageManifestConsistency.ps1 (changed file) baseline 93.83 (213/227), final 94.14 (225/239) (gate: final not lower than baseline; PASS) +- POLICY-85-OBSERVATION: MET (94.98) +- PowerShell branch coverage: not measured by Pester; no branch gate applies (.claude/rules/powershell.md). +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-analyzers.2026-10-09T14-30.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-analyzers.2026-10-09T14-30.md new file mode 100644 index 000000000..240ff1c00 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-analyzers.2026-10-09T14-30.md @@ -0,0 +1,14 @@ +# C# Analyzer Gate (P5-T3) + +Timestamp: 2026-10-09T14-30 +Command: pwsh -NoProfile -File CMDDIR\985-msbuild.ps1 -WorkspaceRoot WORKSPACE-ROOT -Gate Analyzers -LogName 985-final-analyzers.log (msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true) +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- EXIT_CODE: 0 +- OUTPUT-ASSEMBLIES: 18 (equal to BASELINE-OUTPUT-ASSEMBLIES 18) +- SUMMARY: 0 Warning(s) +- SUMMARY: 0 Error(s) +- ERROR-LINE-COUNT: 0 +- PATH-LENGTH-SIGNATURE-LINES: 0 +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-format.2026-10-09T14-30.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-format.2026-10-09T14-30.md new file mode 100644 index 000000000..086f2a2b5 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-format.2026-10-09T14-30.md @@ -0,0 +1,11 @@ +# C# Format Gate (P5-T1) + +Timestamp: 2026-10-09T14-30 +Command: git status --porcelain; pwsh -NoProfile -File CMDDIR\985-csharpier.ps1 -WorkspaceRoot WORKSPACE-ROOT -Mode format (dotnet tool run csharpier format .); git status --porcelain; pwsh -NoProfile -File CMDDIR\985-csharpier.ps1 -WorkspaceRoot WORKSPACE-ROOT -Mode check (dotnet tool run csharpier check .) +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- format: EXIT_CODE 0; Formatted 1650 files in 4650ms. +- Porcelain before and after format: identical (21 lines); `git diff --numstat BASE-SHA` for the Write Set unchanged (QuickFiler.Test.csproj 0 5; the three manifests 2 0, 1 0, 1 0). +- check: EXIT_CODE 0; Checked 1650 files in 4582ms. +- Result: PASS (no rewrite; no loop restart). diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-nullable.2026-10-09T14-30.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-nullable.2026-10-09T14-30.md new file mode 100644 index 000000000..dc925032d --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-nullable.2026-10-09T14-30.md @@ -0,0 +1,14 @@ +# C# Type-check Gate (P5-T4) + +Timestamp: 2026-10-09T14-30 +Command: pwsh -NoProfile -File CMDDIR\985-msbuild.ps1 -WorkspaceRoot WORKSPACE-ROOT -Gate Nullable -LogName 985-final-nullable.log (msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true) +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- EXIT_CODE: 0 +- OUTPUT-ASSEMBLIES: 18 (equal to the baseline 18) +- SUMMARY: 0 Warning(s) +- SUMMARY: 0 Error(s) +- ERROR-LINE-COUNT: 0 +- PATH-LENGTH-SIGNATURE-LINES: 0 +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-restore.2026-10-09T14-30.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-restore.2026-10-09T14-30.md new file mode 100644 index 000000000..73da22d3f --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-restore.2026-10-09T14-30.md @@ -0,0 +1,10 @@ +# C# Restore Gate (P5-T2) + +Timestamp: 2026-10-09T14-30 +Command: pwsh -NoProfile -File CMDDIR\985-restore.ps1 -WorkspaceRoot WORKSPACE-ROOT (nuget restore TaskMaster.sln -NonInteractive) +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- EXIT_CODE: 0; LINE-COUNT: 5 +- TAIL: All packages listed in packages.config are already installed. (the new declarations Microsoft.Web.WebView2 1.0.4191.47 and ObjectListView.Official 2.9.1 resolve to folders the production siblings already restored) +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-test.2026-10-09T14-31.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-test.2026-10-09T14-31.md new file mode 100644 index 000000000..80786b2f5 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/cs-test.2026-10-09T14-31.md @@ -0,0 +1,20 @@ +# C# Test Gate with Coverage (P5-T5) + +Timestamp: 2026-10-09T14-31 +Command: pwsh -NoProfile -File CMDDIR\985-mstest.ps1 -WorkspaceRoot WORKSPACE-ROOT -EvidencePrefix WORKSPACE-ROOT\FEATURE\evidence\qa-gates\mstest-coverage-final.2026-10-09T14-31 +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- SHELL-ICON-EXCLUSION: APPLIED ShellUtilities_Tests ShellUtilitiesStatic_Tests SysImageListHelperTests OSBrowser_Tests (route D3; CI runs the full set) +- Discovered 9 test assemblies. +- First-party coverage: lines 56495/66143 (85.41%), branches 13709/17173 (79.83%) +- RUNNER_RESULT=COMPLETED (runner floors line 80 and branch 75 enforced inside the runner; C7 flaky rule did not apply) +- TRX-SUMMARY: Test run outcome: Completed +- TRX-SUMMARY: Total 7427, executed 7427, passed 7427, failed 0. +- TRX-SUMMARY: Skipped 0, derived as total minus executed rather than reported by the test platform. +- TRX-SUMMARY: Figures reported verbatim by the test platform: error 0, timeout 0, aborted 0, notExecuted 0, inconclusive 0. +- TRX-SUMMARY: Failed tests: none +- PROJECTION-COPIED; copies present: mstest-coverage-final.2026-10-09T14-31.summary.txt and mstest-coverage-final.2026-10-09T14-31.jacoco.xml (beside this file) +- FINAL-CS-LINE: 85.41 +- FINAL-CS-BRANCH: 79.83 +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.jacoco.xml b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.jacoco.xml new file mode 100644 index 000000000..3265e9d05 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.jacoco.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.summary.txt b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.summary.txt new file mode 100644 index 000000000..100bb2604 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/mstest-coverage-final.2026-10-09T14-31.summary.txt @@ -0,0 +1,5 @@ +Test run outcome: Completed +Total 7427, executed 7427, passed 7427, failed 0. +Skipped 0, derived as total minus executed rather than reported by the test platform. +Figures reported verbatim by the test platform: error 0, timeout 0, aborted 0, notExecuted 0, inconclusive 0. +Failed tests: none diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-25.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-25.md new file mode 100644 index 000000000..9484bdf72 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-25.md @@ -0,0 +1,13 @@ +# PowerShell Lint Gate (P4-T2) + +Timestamp: 2026-10-09T14-25 +Command: mcp__drm-copilot__run_poshqc_analyze workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 1 +ITERATION: 1 +Output Summary: +- MCP ok: false; summary: Command exited with code 1; stderr: PSScriptAnalyzer reported 7 issue(s). +- Diagnosis (Invoke-ScriptAnalyzer default rules over the five Write Set files): + - scripts/dependencies/BindingRedirectSync.psm1:52 and :55 PSUseOutputTypeCorrectly (Get-ProviderVersion returns Object[] not declared in OutputType) + - tests/scripts/dependencies/BindingRedirectSync.Tests.ps1:11, :31, :42, :56, :72 PSUseShouldProcessForStateChangingFunctions (helper functions named with the New verb) +- Type checking: not applicable to PowerShell (.claude/rules/powershell.md toolchain step 3). +- Result: FAIL. Loop restart per C7: Get-ProviderVersion returns its values unwrapped with OutputType([string]) and callers wrap with @(); the five test helpers are renamed to the Get verb. Iteration 2 restarts at P4-T1. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-26.md new file mode 100644 index 000000000..81c81dd07 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-analyze.2026-10-09T14-26.md @@ -0,0 +1,11 @@ +# PowerShell Lint Gate (P4-T2) + +Timestamp: 2026-10-09T14-26 +Command: mcp__drm-copilot__run_poshqc_analyze workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 0 +ITERATION: 2 +Output Summary: +- MCP ok: true; summary: Ran bundled PoshQC analyze against 'WORKSPACE-ROOT' with 2 selected scan folder(s). +- The seven iteration-1 findings (PSUseOutputTypeCorrectly x2, PSUseShouldProcessForStateChangingFunctions x5) are resolved; a cross-check with Invoke-ScriptAnalyzer default rules over the five Write Set files reported 0 issues. +- Type checking: not applicable to PowerShell (.claude/rules/powershell.md toolchain step 3). +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-coverage.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-coverage.2026-10-09T14-26.md new file mode 100644 index 000000000..a45183af2 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-coverage.2026-10-09T14-26.md @@ -0,0 +1,39 @@ +# PowerShell Direct Coverage Gate (P4-T4) + +Timestamp: 2026-10-09T14-26 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies,tests/scripts/hygiene,tests/scripts/vscode -CoveragePath scripts/dependencies,scripts/hygiene,scripts/vscode -CoverageOutput coverage/985-pester-final.xml +EXIT_CODE: 0 +ITERATION: 2 +Output Summary: +- TEST-PATH-COUNT: 3; COVERAGE-PATH-COUNT: 3 +- PESTER Passed=438 Failed=0 Skipped=0 NotRun=0 Total=438 (baseline 413; +25 new tests) +- COVERAGE LinePercent=94.98 Covered=1891 Total=1991 (gate: at or above 80.00; PASS) +- FILE-COVERAGE scripts/dependencies/dependencies/BindingRedirectSync.psm1 LinePercent=100.00 Covered=114 Total=114 (gate: at or above 90.00; PASS) +- FILE-COVERAGE scripts/dependencies/dependencies/Repair-PackageManifestConsistency.ps1 LinePercent=94.14 Covered=225 Total=239 (gate: at or above BASELINE-REPAIR-SCRIPT-LINE 93.83; PASS) +- POLICY-85-OBSERVATION: MET (aggregate 94.98 is at or above the 85 figure in .claude/rules/quality-tiers.md; recorded as an observation per plan D6) +- Raw JaCoCo document kept at coverage/985-pester-final.xml (ignored directory); not copied into the feature folder. +- Result: PASS. + +## FILE-TESTS (new and changed files) + +``` +FILE-TESTS BindingRedirectSync.Tests.ps1 Passed=18 Failed=0 Total=18 +FILE-TESTS Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 Passed=6 Failed=0 Total=6 +FILE-TESTS Repair-PackageManifestConsistency.Tests.ps1 Passed=31 Failed=0 Total=31 +FILE-TESTS RepositoryTreeConsistency.Tests.ps1 Passed=5 Failed=0 Total=5 +``` + +All other 28 FILE-TESTS lines report Failed=0 with totals equal to the P0-T8 baseline. + +## FILE-COVERAGE scripts/dependencies + +``` +FILE-COVERAGE scripts/dependencies/dependencies/AnalyzerItemRepair.psm1 LinePercent=100.00 Covered=106 Total=106 +FILE-COVERAGE scripts/dependencies/dependencies/BindingRedirectSync.psm1 LinePercent=100.00 Covered=114 Total=114 +FILE-COVERAGE scripts/dependencies/dependencies/BindingRedirectVerification.psm1 LinePercent=100.00 Covered=41 Total=41 +FILE-COVERAGE scripts/dependencies/dependencies/ConsistencyVerifier.psm1 LinePercent=98.75 Covered=158 Total=160 +FILE-COVERAGE scripts/dependencies/dependencies/PackageCompatibility.psm1 LinePercent=100.00 Covered=33 Total=33 +FILE-COVERAGE scripts/dependencies/dependencies/PackageGraph.psm1 LinePercent=100.00 Covered=164 Total=164 +FILE-COVERAGE scripts/dependencies/dependencies/ProjectConsistency.psm1 LinePercent=100.00 Covered=103 Total=103 +FILE-COVERAGE scripts/dependencies/dependencies/Repair-PackageManifestConsistency.ps1 LinePercent=94.14 Covered=225 Total=239 +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-25.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-25.md new file mode 100644 index 000000000..6c3dd429e --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-25.md @@ -0,0 +1,16 @@ +# PowerShell Format Gate (P4-T1) + +Timestamp: 2026-10-09T14-25 +Command: mcp__drm-copilot__run_poshqc_format workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 0 +ITERATION: 1 +Output Summary: +- MCP ok: true; summary: Ran bundled PoshQC format against 'WORKSPACE-ROOT' with 2 selected scan folder(s). +- Porcelain before and after: identical (21 lines). +- Hashes before = after (no rewrite): + - scripts/dependencies/BindingRedirectSync.psm1 3542973912c539fc8ff63e38f68145d35a49274b + - scripts/dependencies/Repair-PackageManifestConsistency.ps1 2b845c5aad4952f581e26e66284e1901217c0198 + - tests/scripts/dependencies/BindingRedirectSync.Tests.ps1 fb37b258e3b7c755c20268d8c04fc106068beced + - tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 d82cfd5c6de703e82425c7be5cf2d078b071c990 + - tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 a8c706095157d3a69ab21c79d93896e6588164d3 +- Result: PASS (no file rewritten; no loop restart). diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-26.md new file mode 100644 index 000000000..603f8b234 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-format.2026-10-09T14-26.md @@ -0,0 +1,16 @@ +# PowerShell Format Gate (P4-T1) + +Timestamp: 2026-10-09T14-26 +Command: mcp__drm-copilot__run_poshqc_format workspace_root = WORKSPACE-ROOT, scan_folders = [scripts/dependencies, tests/scripts/dependencies] +EXIT_CODE: 0 +ITERATION: 2 +Output Summary: +- MCP ok: true; summary: Ran bundled PoshQC format against 'WORKSPACE-ROOT' with 2 selected scan folder(s). +- Porcelain before and after: identical (21 lines, same set as iteration 1). +- Hashes before = after (no rewrite): + - scripts/dependencies/BindingRedirectSync.psm1 ef8eee178ce3296a872281467320860f759ffd27 + - scripts/dependencies/Repair-PackageManifestConsistency.ps1 2b845c5aad4952f581e26e66284e1901217c0198 + - tests/scripts/dependencies/BindingRedirectSync.Tests.ps1 61b018e7270d5ca11d849a0300fe8514457c6533 + - tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 d82cfd5c6de703e82425c7be5cf2d078b071c990 + - tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 a8c706095157d3a69ab21c79d93896e6588164d3 +- Result: PASS (no file rewritten). diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-line-counts.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-line-counts.2026-10-09T14-26.md new file mode 100644 index 000000000..f18df9b61 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-line-counts.2026-10-09T14-26.md @@ -0,0 +1,12 @@ +# PowerShell Write Set Line Counts (P4-T6) + +Timestamp: 2026-10-09T14-26 +Command: Grep tool, pattern `^`, output mode count, over the five PowerShell Write Set files +EXIT_CODE: 0 +Output Summary: +- scripts/dependencies/BindingRedirectSync.psm1: 306 +- scripts/dependencies/Repair-PackageManifestConsistency.ps1: 493 +- tests/scripts/dependencies/BindingRedirectSync.Tests.ps1: 358 +- tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1: 187 +- tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1: 178 +- Result: every count at most 500; no SIZE-LIMIT. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-temp-file-audit.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-temp-file-audit.2026-10-09T14-26.md new file mode 100644 index 000000000..83f2818d0 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-temp-file-audit.2026-10-09T14-26.md @@ -0,0 +1,12 @@ +# Temporary-file Audit (P4-T5) + +Timestamp: 2026-10-09T14-26 +Command: Grep tool, pattern `New-TemporaryFile|GetTempPath|GetTempFileName|TestDrive|WriteAllText|Set-Content|Out-File|New-Item`, output mode count, over the three test files and the positive control +EXIT_CODE: 0 +ITERATION: 2 +Output Summary: +- tests/scripts/dependencies/BindingRedirectSync.Tests.ps1: 0 +- tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1: 0 +- tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1: 0 +- Positive control scripts/dependencies/Repair-PackageManifestConsistency.ps1: 1 (the default writer's WriteAllText), so the search tool reads the files. +- Result: PASS; every new and changed test uses in-memory fixtures only; no SANITIZE-BLIND. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-test-mcp.2026-10-09T14-26.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-test-mcp.2026-10-09T14-26.md new file mode 100644 index 000000000..1bba9f6f1 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/ps-test-mcp.2026-10-09T14-26.md @@ -0,0 +1,22 @@ +# PowerShell MCP Test Gate (P4-T3) + +Timestamp: 2026-10-09T14-26 +Command: pwsh -NoProfile -File CMDDIR\985-junit.ps1 -WorkspaceRoot WORKSPACE-ROOT -Clear; mcp__drm-copilot__run_poshqc_test workspace_root = WORKSPACE-ROOT, scan_folders = [tests/scripts/dependencies]; pwsh -NoProfile -File CMDDIR\985-junit.ps1 -WorkspaceRoot WORKSPACE-ROOT +EXIT_CODE: 0 +ITERATION: 2 +Output Summary: +- JUNIT-CLEARED: True +- MCP ok: true; summary: Ran bundled PoshQC test against 'WORKSPACE-ROOT' with 1 selected scan folder(s). +- JUNIT tests=178 failures=0 errors=0 disabled=0 (baseline 153; +18 BindingRedirectSync, +6 RedirectSync, +1 RepositoryTreeConsistency) +- JUNIT-SUITE AnalyzerItemRepair.Tests.ps1 tests=13 failures=0 +- JUNIT-SUITE BindingRedirectSync.Tests.ps1 tests=18 failures=0 +- JUNIT-SUITE BindingRedirectVerification.Tests.ps1 tests=16 failures=0 +- JUNIT-SUITE ConsistencyVerifier.Tests.ps1 tests=14 failures=0 +- JUNIT-SUITE DependabotConfig.Tests.ps1 tests=17 failures=0 +- JUNIT-SUITE PackageCompatibility.Tests.ps1 tests=8 failures=0 +- JUNIT-SUITE PackageGraph.Tests.ps1 tests=32 failures=0 +- JUNIT-SUITE ProjectConsistency.Tests.ps1 tests=18 failures=0 +- JUNIT-SUITE Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 tests=6 failures=0 +- JUNIT-SUITE Repair-PackageManifestConsistency.Tests.ps1 tests=31 failures=0 +- JUNIT-SUITE RepositoryTreeConsistency.Tests.ps1 tests=5 failures=0 +- Result: PASS. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/workflows-untouched.2026-10-09T14-31.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/workflows-untouched.2026-10-09T14-31.md new file mode 100644 index 000000000..129002305 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/qa-gates/workflows-untouched.2026-10-09T14-31.md @@ -0,0 +1,10 @@ +# Workflows Untouched (P5-T7, AC4) + +Timestamp: 2026-10-09T14-31 +Command: git diff --name-only BASE-SHA -- .github/workflows; git status --porcelain -- .github/workflows +EXIT_CODE: 0 +Output Summary: +- BASE-SHA: 9911fe138952e2b93476850582847c2831e1cbbd +- `git diff --name-only BASE-SHA -- .github/workflows`: empty +- `git status --porcelain -- .github/workflows`: empty (covers untracked files the name-only diff cannot list) +- Result: PASS; no file under .github/workflows is modified or added. P8-T2 repeats the committed-range form after the last commit. diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-orphaned-hintpath.2026-10-09T14-15.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-orphaned-hintpath.2026-10-09T14-15.md new file mode 100644 index 000000000..e77db2d12 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-orphaned-hintpath.2026-10-09T14-15.md @@ -0,0 +1,30 @@ +# Fail-before: Orphaned HintPath Gate (P1-T3) [expect-fail] + +Timestamp: 2026-10-09T14-15 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 +EXIT_CODE: 1 +ExpectedExitCode: 1 +Output Summary: +- TEST-PATH-COUNT: 1; COVERAGE-PATH-COUNT: 0 +- PESTER Passed=4 Failed=1 Skipped=0 NotRun=0 Total=5 +- FILE-TESTS RepositoryTreeConsistency.Tests.ps1 Passed=4 Failed=1 Total=5 +- FAILED-TEST: Repository tree consistency (issue 929).reports no HintPath whose package folder the sibling manifest does not declare, for every project directory that carries a manifest +- FAILED-MESSAGE contains `QuickFiler.Test.csproj: line`, `UtilitiesCS.Test.csproj: line` and `TaskTree.Test.csproj: line` (right reason: borrowed packages before the manifest edits) +- Finding count: 7 (research predicted 7; recorded, not gated) +- P1-T1 static checks: Grep `It 'reports no HintPath whose package folder the sibling manifest does not declare` count 1; `Find-OrphanedHintPath -ProjectText` count 1; `AC[0-9]` in Describe/Context/It lines 0; file 178 lines, 178 CRLF. + +## Findings list (from FAILED-MESSAGE) + +1. QuickFiler.Test.csproj: line 389 Microsoft.Web.WebView2.1.0.4191.47 +2. QuickFiler.Test.csproj: line 392 Microsoft.Web.WebView2.1.0.4191.47 +3. QuickFiler.Test.csproj: line 407 ObjectListView.Official.2.9.1 +4. QuickFiler.Test.csproj: line 530 Microsoft.Web.WebView2.1.0.4191.47 +5. TaskTree.Test.csproj: line 178 ObjectListView.Official.2.9.1 +6. UtilitiesCS.Test.csproj: line 815 Microsoft.Web.WebView2.1.0.4191.47 +7. UtilitiesCS.Test.csproj: line 818 Microsoft.Web.WebView2.1.0.4191.47 + +## FAILED-MESSAGE (verbatim) + +``` +FAILED-MESSAGE: Expected 0, because these HintPath elements name a package folder the sibling manifest does not declare: QuickFiler.Test.csproj: line 389 Microsoft.Web.WebView2.1.0.4191.47; QuickFiler.Test.csproj: line 392 Microsoft.Web.WebView2.1.0.4191.47; QuickFiler.Test.csproj: line 407 ObjectListView.Official.2.9.1; QuickFiler.Test.csproj: line 530 Microsoft.Web.WebView2.1.0.4191.47; TaskTree.Test.csproj: line 178 ObjectListView.Official.2.9.1; UtilitiesCS.Test.csproj: line 815 Microsoft.Web.WebView2.1.0.4191.47; UtilitiesCS.Test.csproj: line 818 Microsoft.Web.WebView2.1.0.4191.47, but got 7. +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-redirect-sync.2026-10-09T14-15.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-redirect-sync.2026-10-09T14-15.md new file mode 100644 index 000000000..d5e4d56d6 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/fail-before-redirect-sync.2026-10-09T14-15.md @@ -0,0 +1,27 @@ +# Fail-before: Composition-root Redirect Sync (P1-T4) [expect-fail] + +Timestamp: 2026-10-09T14-15 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 +EXIT_CODE: 1 +ExpectedExitCode: 1 +Output Summary: +- TEST-PATH-COUNT: 1; COVERAGE-PATH-COUNT: 0 +- PESTER Passed=2 Failed=4 Skipped=0 NotRun=0 Total=6 +- Failed set: exactly R1 (rewrites the transitive redirect in both positions), R2 (reports the rewritten application configuration in the written paths), R3 (carries the synchronised-redirect block in the body), R4 (exposes the synchronisation in the RedirectSync field and not in the per-project repair records) +- R5 (writes nothing on a second run over the repaired store) and R6 (leaves the stale redirect unchanged and writes nothing) passed +- R1 FAILED-MESSAGE contains `newVersion` (the store still carries newVersion="3.4.0.0") +- Right reason: the pre-change script has no unconditional sync pass and no RedirectSync result field. +- P1-T2 static checks: Grep `^\s+It '` count 6; temporary-file pattern count 0; `RedirectSync` appears only inside It blocks (lines 161-170), 0 inside the BeforeAll blocks. + +## FAILED-TEST / FAILED-MESSAGE lines + +``` +FAILED-TEST: Repair-PackageManifestConsistency redirect synchronisation (issue 985).A transitive redirect left stale by an upgrade elsewhere, with no candidate upgrade supplied.rewrites the transitive redirect in both positions +FAILED-MESSAGE: Expected regular expression 'oldVersion="0\.0\.0\.0-3\.5\.0\.0"' to match '... ... ...', but it did not match. +FAILED-TEST: Repair-PackageManifestConsistency redirect synchronisation (issue 985).A transitive redirect left stale by an upgrade elsewhere, with no candidate upgrade supplied.reports the rewritten application configuration in the written paths +FAILED-MESSAGE: Expected 'X:\fixture\Test\app.config' to be found in collection $null, but it was not found. +FAILED-TEST: Repair-PackageManifestConsistency redirect synchronisation (issue 985).A transitive redirect left stale by an upgrade elsewhere, with no candidate upgrade supplied.carries the synchronised-redirect block in the body +FAILED-MESSAGE: Expected regular expression '## Binding redirects synchronised' to match '## Repairs applied No repairs were applied.', but it did not match. +FAILED-TEST: Repair-PackageManifestConsistency redirect synchronisation (issue 985).A transitive redirect left stale by an upgrade elsewhere, with no candidate upgrade supplied.exposes the synchronisation in the RedirectSync field and not in the per-project repair records +FAILED-MESSAGE: The property 'RedirectSync' cannot be found on this object. Verify that the property exists. +``` diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-orphaned-hintpath.2026-10-09T14-17.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-orphaned-hintpath.2026-10-09T14-17.md new file mode 100644 index 000000000..cb2b45b5e --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-orphaned-hintpath.2026-10-09T14-17.md @@ -0,0 +1,11 @@ +# Pass-after: Orphaned HintPath Gate (P2-T7) + +Timestamp: 2026-10-09T14-17 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1 +EXIT_CODE: 0 +Output Summary: +- TEST-PATH-COUNT: 1; COVERAGE-PATH-COUNT: 0 +- PESTER Passed=5 Failed=0 Skipped=0 NotRun=0 Total=5 +- FILE-TESTS RepositoryTreeConsistency.Tests.ps1 Passed=5 Failed=0 Total=5 +- No FAILED-TEST line. +- Result: after the four manifest declarations and the duplicate WebView2.Core removal, the gate reports zero orphaned HintPath findings (fail-before: 7, see fail-before-orphaned-hintpath.2026-10-09T14-15.md). diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-redirect-sync.2026-10-09T14-21.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-redirect-sync.2026-10-09T14-21.md new file mode 100644 index 000000000..b3a4663f5 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/evidence/regression-testing/pass-after-redirect-sync.2026-10-09T14-21.md @@ -0,0 +1,14 @@ +# Pass-after: Redirect Sync Module and Wiring (P3-T5) + +Timestamp: 2026-10-09T14-21 +Command: pwsh -NoProfile -File CMDDIR\985-pester.ps1 -WorkspaceRoot WORKSPACE-ROOT -TestPath tests/scripts/dependencies/BindingRedirectSync.Tests.ps1,tests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1,tests/scripts/dependencies/Repair-PackageManifestConsistency.Tests.ps1 +EXIT_CODE: 0 +Output Summary: +- TEST-PATH-COUNT: 3; COVERAGE-PATH-COUNT: 0 +- PESTER Passed=55 Failed=0 Skipped=0 NotRun=0 Total=55 +- FILE-TESTS BindingRedirectSync.Tests.ps1 Passed=18 Failed=0 Total=18 +- FILE-TESTS Repair-PackageManifestConsistency.RedirectSync.Tests.ps1 Passed=6 Failed=0 Total=6 +- FILE-TESTS Repair-PackageManifestConsistency.Tests.ps1 Passed=31 Failed=0 Total=31 (equal to the P0-T8 baseline Total=31; existing contexts unchanged and green) +- R1 to R4 now pass (fail-before: fail-before-redirect-sync.2026-10-09T14-15.md); R5 and R6 still pass. +- P3-T4 static checks: `^\s+It '` count 18; temporary-file pattern count 0. +- Behaviours pinned (AC2): stale-only rewrite (S3), own-reference preference (S5), highest by [System.Version] (S6, S7), unverifiable (S4), unresolvable (S8), idempotent second run with no repairs and no writes (S3, R5), -WhatIf writes nothing (S15, R6), unconditional invocation without -CandidateUpgrade (R1 to R4), RedirectSync field separate from Verification[].Report.Repair (R4). diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/issue.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/issue.md new file mode 100644 index 000000000..541cfc1b0 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/issue.md @@ -0,0 +1,68 @@ +# dependabot-repair-borrowed-packages-and-transitive-redirects (Issue #985) + +- Date captured: 2026-10-09 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/dependabot-repair-borrowed-packages-and-transitive-redirects/ (Issue #985) + +> Automation note: Keep the section headings below unchanged; the promotion tooling maps each of them into the GitHub bug issue template. + +- Issue: #985 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/985 +- Last Updated: 2026-10-09 +- Work Mode: full-bug + +## Summary + +Grouped NuGet Dependabot pull requests (PR #984) still fail CI after the `dependabot-repair` workflow (issue #911) runs successfully, because two classes of manifest inconsistency are invisible to both Dependabot and the repair script: (1) test projects that hint-path a package they do not declare in their own `packages.config` (borrowed from a sibling production project), and (2) `app.config` binding redirects for assemblies that a project receives only transitively (no `packages.config` entry and no direct ``). All failures must be remediated automatically, with no manual step on any future Dependabot PR. + +## Environment + +- OS/version: GitHub Actions `windows-latest` (CI) and Windows 11 (local) +- Python version: n/a (PowerShell 7 repair scripts, .NET Framework 4.8.1 / packages.config projects) +- Command/flags used: CI workflow `ci.yml` on branch `dependabot/nuget/QuickFiler.Test/all-nuget-updates-2542c001c9`; repair workflow `.github/workflows/dependabot-repair.yml` (workflow_run trigger) invoking `scripts/dependencies/Repair-PackageManifestConsistency.ps1` without `-CandidateUpgrade` +- Data source or fixture: PR #984 (AngleSharp, log4net 3.4.0 -> 3.5.0, Microsoft.Web.WebView2 1.0.4191.47 -> 1.0.4258.31, analyzer bumps); CI run #1059 (id 37959420911) on repair commit fff92fe83 + +## Steps to Reproduce + +1. Let Dependabot open a grouped NuGet update that bumps Microsoft.Web.WebView2 and log4net (PR #984). +2. Let `dependabot-repair` run after CI; it repairs `` paths and pushes commit fff92fe83 as `taskmaster-dependabot-repair[bot]`. +3. Observe CI run #1059 on that commit. + +## Expected Behavior + +After the repair workflow runs, every required CI check (build-analyzers, build-nullable, mstest-coverage, pester, format-check, actionlint, hygiene) passes on the Dependabot branch with no human edit. Every project that compiles against a package declares that package in its own `packages.config`, and every `bindingRedirect newVersion` equals an assembly version actually referenced in the solution. + +## Actual Behavior + +- build-analyzers, build-nullable, mstest-coverage fail: `UtilitiesCS.Test` and `QuickFiler.Test` hint-path `packages\Microsoft.Web.WebView2.1.0.4191.47\...` without declaring WebView2 in their own `packages.config`; after the production projects move to 1.0.4258.31 nothing restores 4191.47, producing `CS0012` / `CS0234` / `CS0246` (for example `UtilitiesCS.Test\HelperClasses\ThemeHelpers\ThemeTests.cs(284,29): error CS0012: The type 'WebView2' is defined in an assembly that is not referenced`). +- The same latent pattern exists on main for `ObjectListView.Official 2.9.1` in `QuickFiler.Test` and `TaskTree.Test`. +- pester fails: `BindingRedirectVerification.Tests.ps1` reports `log4net|3.4.0.0` because Tags.Test, TaskTree.Test, TaskVisualization.Test, ToDoModel.Test and VBFunctions.Test keep `newVersion="3.4.0.0"` while every other project moved to 3.5.0.0; those five projects have no log4net `packages.config` entry or ``, so neither Dependabot nor the repair script edits them, and the repair's redirect pass does not run from the workflow_run trigger because `-CandidateUpgrade` is not supplied (see `dependabot-repair.yml` lines 87-94). + +## Logs / Screenshots + +- [x] Attached minimal logs or screenshot +- Snippet: `Expected 0, because every bindingRedirect newVersion must equal a csproj Reference version (issue 973 emptied the recorded known-debt set; a new stale pair is fixed, not recorded); observed: log4net|3.4.0.0, but got 1.` + +## Impact / Severity + +- [x] Blocker +- [ ] High +- [ ] Medium +- [ ] Low + +## Suspected Cause / Notes + +Dependabot's packages.config updater and `Repair-PackageManifestConsistency.ps1` both act only on packages a project declares in its own `packages.config`. Borrowed hint paths and transitive binding redirects fall outside that set. The verifier (`ConsistencyVerifier.psm1` `Find-OrphanedHintPath`) already detects borrowed hint paths but is not a failing gate on main. + +## Proposed Fix / Validation Ideas + +- [ ] Declare Microsoft.Web.WebView2 in QuickFiler.Test and UtilitiesCS.Test `packages.config`, and ObjectListView.Official in QuickFiler.Test and TaskTree.Test `packages.config`, at the versions their production siblings declare. +- [ ] Add a redirect-sync pass to the repair script that sets every `bindingRedirect newVersion` (and the upper bound of `oldVersion`) to the assembly version referenced elsewhere in the solution, covering transitive redirects; run it from the workflow_run trigger. +- [ ] Make orphaned (borrowed) hint paths a failing check on main (Pester gate) so the pattern cannot recur. +- [ ] Pester coverage for the new pass with in-memory fixtures (no temp files). +- [ ] After merge, `@dependabot recreate` on PR #984 and confirm all required checks pass with no human edit. + +## Next Step + +- [ ] Promote to GitHub issue (bug-report template) +- [ ] Move to active fix folder / branch diff --git a/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/plan.2026-10-09T13-06.md b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/plan.2026-10-09T13-06.md new file mode 100644 index 000000000..43c143947 --- /dev/null +++ b/docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/plan.2026-10-09T13-06.md @@ -0,0 +1,643 @@ +# 2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects (Plan) + +- **Issue:** #985 +- **Parent (optional):** none +- **Owner:** drmoisan +- **Last Updated:** 2026-10-09 +- **Status:** Draft (planner round 1; preflight round 1 deltas 1-9 and the background-run note applied; awaiting confirming preflight) +- **Version:** 1.1 +- **Work Mode:** full-bug (AC source: `spec.md` only, per `issue.md` metadata `- Work Mode: full-bug`) + +**Fail-closed evidence rule:** Every baseline, final-QA and coverage-comparison artifact named below is required. If any required artifact is missing or carries a placeholder where a number is required, the audit verdict is BLOCKED or INCOMPLETE, never PASS. + +**Evidence accounting rule:** Every evidence-producing task names its artifact path. No task is checked off without its artifact on disk. + +## 1. Objective + +Make every grouped NuGet Dependabot pull request pass CI after the `dependabot-repair` workflow runs, with no human edit, by (a) declaring the four borrowed (project, package) pairs in the owning test projects' `packages.config` and removing the duplicate `Microsoft.Web.WebView2.Core` reference in `QuickFiler.Test/QuickFiler.Test.csproj`, (b) adding an unconditional, solution-wide binding-redirect sync pass (`scripts/dependencies/BindingRedirectSync.psm1`) wired into `scripts/dependencies/Repair-PackageManifestConsistency.ps1`, and (c) adding a main-branch Pester gate that fails when any project hint-paths a package its own manifest does not declare. Requirements: `spec.md` (Acceptance Criteria AC1 to AC7), `issue.md`, `research/research.2026-10-09T14-10.md`. + +Out of scope (spec "Scope & Non-Goals"): any file under `.github/workflows/**` (including its README), `ConsistencyVerifier.psm1`, `ProjectConsistency.psm1`, `BindingRedirectVerification.psm1`, production C# source, Dependabot configuration. + +## 2. Conventions + +**C1. Symbols.** +- `FEATURE` = `docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985`. +- `WORKTREE` = the executor's worktree root (the checkout of branch `bug/dependabot-repair-borrowed-packages-and-transitive-redirects-985`). Every repository path in this plan is relative to `WORKTREE`. +- `SCRATCH` = the directory `$env:LOCALAPPDATA\Temp\claude\C--Users-DanMoisan-repos-TaskMaster-wt-2026-10-09T12-47\a87f8bd5-b2ae-46b5-8bba-6b4ed90e8d09\scratchpad` (the caller-supplied session scratchpad, written through the environment variable so no drive-rooted profile path appears in this tracked file). Resolve it once with `pwsh -NoProfile -Command "Join-Path $env:LOCALAPPDATA 'Temp\claude\C--Users-DanMoisan-repos-TaskMaster-wt-2026-10-09T12-47\a87f8bd5-b2ae-46b5-8bba-6b4ed90e8d09\scratchpad'"`. +- `CMDDIR` = `SCRATCH\985-cmd` (helper scripts, outside the repository). +- `REHEARSAL` = `SCRATCH\rehearsal-985` (the throwaway rehearsal worktree, outside the repository). +- `FIX-BRANCH` = `bug/dependabot-repair-borrowed-packages-and-transitive-redirects-985`. `REHEARSAL-BRANCH` = `rehearsal-985-throwaway`. `DEPENDABOT-REF` = `origin/dependabot/nuget/QuickFiler.Test/all-nuget-updates-2542c001c9`. +- `` = the local timestamp read from the host clock when the task runs: `pwsh -NoProfile -Command "Get-Date -Format yyyy-MM-ddTHH-mm"`. Never composed or estimated. + +**C2. Evidence schema.** Every command-step artifact carries, in this order, `Timestamp:`, `Command:`, `EXIT_CODE:`, optional `ExpectedExitCode:` (only on `[expect-fail]` artifacts), and `Output Summary:` (1 to 20 lines carrying the essential result signal, including every gate value the task names). Evidence lives only under `FEATURE/evidence//` with kind `baseline`, `regression-testing`, `qa-gates` or `other`. No caller-supplied non-canonical evidence path was received, so no `EVIDENCE_LOCATION_OVERRIDE_REJECTED` record applies. + +**C3. Hygiene (tracked-file content).** The repository hygiene guard (`scripts/hygiene/Test-RepositoryHygiene.Rules.ps1` lines 5-55) fails CI on any tracked line matching a drive-letter user-profile path, and lines 57-123 reject a raw JaCoCo document (one carrying `sourcefile`/`class`/`line` elements), a Cobertura document and a trx document. Therefore: (a) evidence text never carries an absolute path; write `WORKSPACE-ROOT` for a worktree root and `USER-PROFILE` for a profile path (every helper script below already performs that substitution on every line it prints); `Command:` fields write `workspace_root = WORKSPACE-ROOT`; (b) raw Pester JaCoCo documents are written only under the ignored `coverage/` directory and never copied into `FEATURE`; (c) the only coverage files copied into `FEATURE` are the MSTest runner's package-level projection (`*.jacoco.xml`) and its trx-derived `*.summary.txt`, which CLAUDE.md "Committed Test Evidence Format" permits. + +**C4. CMD-SANITIZE (run before every commit).** With the Grep tool, pattern `(?i)[a-z]:[\\/]+users[\\/]+[a-z0-9_.~-]`, output mode count: (1) path `FEATURE` must return 0; (2) positive control, path `.git` (the worktree's gitdir pointer file, which names a profile path) must return 1. A control of 0 is STOP: SANITIZE-BLIND. A non-zero count in (1) is fixed by replacing the matched path with the C3 token and re-running C4. + +**C5. Shell discipline.** Bash permits only `git *` and `pwsh *` segments: never `cd`, use `git -C ` and absolute script paths (`pwsh -NoProfile -File \