diff --git a/.claude/agent-memory/atomic-executor/MEMORY.md b/.claude/agent-memory/atomic-executor/MEMORY.md index a69672a0c..989165573 100644 --- a/.claude/agent-memory/atomic-executor/MEMORY.md +++ b/.claude/agent-memory/atomic-executor/MEMORY.md @@ -2,6 +2,7 @@ ## Plan validation & gates - [Self-derived gate thresholds are blind](project_preflight_selfderived_gate_thresholds_are_blind.md) — a "count >= floor" gate whose floor comes from the runs it validates is deflation-blind + scope-incommensurable; use git-enumeration + `/ListTests` existence proofs +- [Merge-base diff gates need a commit cadence](project_preflight_mergebase_diff_gates_need_commit_cadence.md) — `..HEAD` gates are vacuous while HEAD == merge-base and unsatisfiable once HEAD is ahead; on a later cycle scope-audit via `git show --numstat --format= HEAD` - [Inserted plan tasks force renumbering](project_plan_task_ids_digit_only_forces_renumbering.md) — suffixed IDs (`P3-T5a`) fail validation; say "insert + renumber downstream", then verify defs-vs-mentions mechanically - [Plan rationale clauses are evidence](project_418_plan_rationale_clauses_are_evidence.md) — #418 needed 3 preflight passes; all blockers were unmeasured world-state claims in prose, never in the fix - [#418 500-line gate vs mandated plan content](project_418_500line_gate_vs_plan_content.md) — P1-T19 unsatisfiable (193 new lines into 146 headroom); per-block logging clauses block centralizing; delta = extract helpers to a new file @@ -22,11 +23,16 @@ - [Legacy csproj: no transitive compile refs](project_legacy_csproj_no_transitive_compile_refs.md) — non-SDK ProjectReference doesn't flow package types to csc (CS0012 despite copy-local DLL); tests need their own `` + packages.config entry - [sln/csproj edits: preserve CRLF](project_sln_csproj_edit_crlf_preserve.md) — git-bash `sed -i` strips CRLF from TaskMaster.sln (churn + BOM loss); use Edit or `perl -0777` w/ explicit `\r\n` - [Incremental build makes a vacuous baseline](project_incremental_build_vacuous_baseline.md) — Invoke-VSBuild's /t:Build up-to-date check ignores /p: changes → EXIT 0 with 0 CoreCompile; add /t:Rebuild to enumerate diagnostics +- [Nullable /t:Build gate is vacuous](project_nullable_build_gate_is_vacuous_incremental.md) — the standard nullable gate passes without type-checking; isolated `/t:Rebuild ... /p:BuildProjectReferences=false` exposed 223 errors (never add /p:OutputPath — it breaks ProjectReference resolution) +- [CSharpier 1.3.0 formats XML at 100 cols](project_csharpier_formats_xml_print_width.md) — a "reformatting churn" finding on an XML resource can be formatter-mandated; measure line length + run repo-wide `check` before accepting it +- [Evidence collision clobbers committed artifacts](project_evidence_timestamp_collision_clobbers_artifacts.md) — same-day remediation can silently overwrite implementation-cycle evidence; a ` M` under `evidence/` means clobber - [csharpier pipe-files is a non-enforcing gate](project_csharpier_pipefiles_nonenforcing_gate.md) — use `csharpier check`/`format`; tests balloon past 500 lines under genuine format (size new files AFTER format) - [PowerShell new files need UTF-8 BOM](powershell-bom-required.md) — PSScriptAnalyzer enforces PSUseBOMForUnicodeEncodedFile; prepend BOM after Write or restart the format loop - [poshqc Pester MCP exits -1](project_poshqc_pester_mcp_exit_minus1.md) — run_poshqc_test exits -1 (no detail) here; run it for the record, pair with direct Invoke-Pester (pwsh7) for the numeric proof - [BOM breaks grep ^ anchor](project_bom_grep_anchor_false_negative.md) — bash grep `^#nullable` misses BOM-prefixed files; use the Grep tool for opt-in classification, never bash grep +- [Compile-time red needs body-level refs](project_compile_red_needs_body_level_references.md) — a missing type in a method SIGNATURE suppresses body binding, so an `[expect-fail]` task requiring N named CS0246s reports only 1; construct the types inline in test bodies + ## Test execution & isolation - [vstest /InIsolation + FilePathHelper serialization](project_vstest_isolation_and_filepathhelper_serialization.md) — Moq assemblies need /InIsolation (else STTE Setup FileNotFound); FilePathHelper.FilePath is "" default but null after JSON deserialize - [Invoke-MSTest.ps1 dies on a single test assembly](project_418_invoke_mstest_single_assembly_bug.md) — StrictMode + `.Count` on a scalar String throws before vstest runs; call vstest.console.exe directly with the script's arg list diff --git a/.claude/agent-memory/atomic-executor/project_compile_red_needs_body_level_references.md b/.claude/agent-memory/atomic-executor/project_compile_red_needs_body_level_references.md new file mode 100644 index 000000000..08a93b9ab --- /dev/null +++ b/.claude/agent-memory/atomic-executor/project_compile_red_needs_body_level_references.md @@ -0,0 +1,14 @@ +--- +name: compile-red-needs-body-level-references +description: A compile-time [expect-fail] task that must name N missing types will only report the ones bound in the same phase; a missing type in a method SIGNATURE suppresses all body-level diagnostics +metadata: + type: project +--- + +When an `[expect-fail]` task's acceptance criterion requires the fail-before diagnostics to name several not-yet-existing types, put every reference in a **method body**, never in a signature. + +Roslyn binds declarations first. If a private helper is declared `private static EngineReadinessGate CreateGateOver(...)` and `EngineReadinessGate` does not exist, the compiler emits one `CS0246` for that signature and then **does not bind any method body**, so a second missing type referenced only inside bodies never surfaces. Measured on #503 (2026-08-08): first run produced 1 diagnostic naming only `EngineReadinessGate`; after changing the helper's return type to a resolvable `Func` and constructing both types inline in the test bodies, the same command produced 4 diagnostics naming both `EngineReadinessGate` and `EngineGatedCommandRunner`. + +**Why:** the plan's binary outcome was "diagnostics must include CS0246 naming X and Y". Recording a partial diagnostic set as satisfying it would be a false PASS, and re-running the build does not help — the shape of the test file is what determines which errors are reachable. + +**How to apply:** before running the `[expect-fail]` build, check that no not-yet-existing type appears in any `class`/method/field declaration in the new test file. Keep helper signatures built only from types that already compile. Record the restructure in the fail-before artifact so the edit between the two runs is auditable. diff --git a/.claude/agent-memory/atomic-executor/project_csharpier_formats_xml_print_width.md b/.claude/agent-memory/atomic-executor/project_csharpier_formats_xml_print_width.md new file mode 100644 index 000000000..1a21734e7 --- /dev/null +++ b/.claude/agent-memory/atomic-executor/project_csharpier_formats_xml_print_width.md @@ -0,0 +1,17 @@ +--- +name: csharpier-formats-xml-print-width +description: CSharpier 1.3.0 formats XML (not just .cs) and enforces its 100-column print width, so an "avoidable reformatting churn" finding on an XML resource can be formatter-mandated and unsatisfiable +metadata: + type: project +--- + +CSharpier **1.3.0 in this repo formats `*.xml`, not only `*.cs`**, and enforces its default **100-column print width** on them. `.csharpierignore` excludes `**/evidence/**`, `*.cobertura.xml`, `*.coverage`, `*.coveragexml`, `*.trx`, `*.csproj`, `*.props`, `*.targets` — but **not** `*.xml` generally, so `TaskMaster/Ribbon/RibbonExplorer.xml` is formatter-governed. + +**Why:** Issue #503 remediation cycle 1 pinned a finding (F2) asserting that expanding three `