v1.7.4 — Round-5 Falsification Convergence
Round-5 falsified v1.7.3. Process audit caught the same R3-CRIT defect class alive in yet another sibling code path — `run --no-build`'s flash phase. Round-4 patched build phase + flash command; round-5 found the back door round-4's fix didn't cover.
Critical
- `esp-harness run --no-build` from Git Bash silently no-op'd. `idf.py` exits 0 with the MSys/Mingw refusal; `wrote_bytes:0`, `verified:false`, but composite-command JSON reports `ok:true`. Now mirrors flash.py's two-tier defence in run.py's flash phase.
Blocking
- `run.py` lost build.py's `patches.apply_all()` retry — AI agent calling `run` on a fresh checkout hit qmi8658 build failure that `build` would auto-patch. Now run has full parity.
- `smoke.ps1` triple-trap case hardcoded the maintainer's D:\ path — bypassed the checked-out tree. Now uses `$RepoRoot`.
- `smoke.ps1` pytest gate insisted on "3 passed" — broke fresh-clone gates that legitimately skip sim diff. Now accepts "2 passed, 1 skipped".
Smoke gate
7/7 host cases green. Triple-trap case now exercises four invocation forms: `build`, `flash`, `run` (with build), `run --no-build`.
Convergence trajectory
| Round | Mode | Critical | Released |
|---|---|---|---|
| Author E2E | — | 5 | v1.7.1 |
| Subagent 1 | verify | 3 | v1.7.1.x |
| Subagent 2 | verify | 3 | v1.7.1.x |
| Subagent 3 | verify | 1 | v1.7.2 |
| Subagent 4 | falsify | 2 | v1.7.3 |
| Subagent 5 | falsify + process audit | 1 (R3-regression in run --no-build) | v1.7.4 |
Critical dropped 5→3→3→1→2→1. Lesson 15 (defence covers ALL entry points) reinforced — every adversarial round so far has caught the previous round's defence missing a sibling code path. v1.7.4 explicitly enumerates all four idf_runner entry points in smoke. If round-6 falsifies and finds zero critical, we've converged.
🤖 Generated with Claude Code