diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index be391c9..7d7de3e 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -588,3 +588,4 @@ rules: - model-router W1-C adaptive tiers landed (d0fa100): plan r1→r4 through 3 lenses (all FATAL: 4 BLOCKER + 20 MAJOR) + 2 confirmations (1 BLOCKER each, in my own r2 then r3) → deviation from the one-confirmation cap, stated. Design: absolute tiers, StopFailure-kind breaker + PostModelSwitch auto, fallback chain, main upgrade under a 200k cap (fails closed), sticky turnModel, derived orchestrate (background dispatches), prompt default rules with skip rules; classifier deferred. feater DONE → 2 gap rounds (texts) → hardening (leaveDown gates, cap fail-closed, one-way prefix, log key) → verifier CONFORME, security PASS (LOW only). 58 tests. Lesson: I sent iteration history in a security brief; the auditor contract forbids it (blind scan) — scope only next time. Live checks pending after /reload-plugins (R16/T8). Next: user reload, live test, wave 2. - W1-C live checks after the user's /reload-plugins (skills-dir copy, 12 hooks): derived orchestrate real (main high→medium during a background Explore→high after), Explore sonnet/medium, route plan → xhigh, Skill(effort-low) bridge → low, both confirmed in engine records; /route show resolves 10 phases to full ids, down none; steps carry bare ids (no [1m]) → suffix carry inert here. Breaker/auto/StopFailure order wait for a real incident. Branch feature/model-router-mod: 22 commits ahead, unpushed (manual), merge = human signal. Wave 2 queued. - User go 'ok merge': full make test green (except env red design-tool-gate), shellcheck clean → gitflow finish feature model-router-mod → develop abbdf79 (22 commits: waves 0, 1-A, 1-B1, 1-B2, 1-C + docs + registries). Manual mode: develop NOT pushed, the user publishes by hand from the terminal. Branch removed locally. User will /clear before wave 2. +- /hotfix make-test-names-red-suites (user: '9 min pour un merge?'): measured from transcript timestamps, the merge took <20 s; 454 s went to make test run TWICE (full + per-suite sweep to name the red suite, because the aggregate rc is silent). Fix: Makefile test prints FAIL + summary, rc unchanged (GNU make returns 2 on a failed recipe; my first oracle expected 1). hotfixer DONE, GATE 0 MET 2/2, security PASS. Branch bugfix/make-test-names-red-suites UNMERGED (human signal). Method note: a mods/-only diff needs only the mods suite + doctrine census, the full run once before merge. diff --git a/.claude/tasks/contracts/2026-10-09-make-test-names-red-suites-1528.md b/.claude/tasks/contracts/2026-10-09-make-test-names-red-suites-1528.md new file mode 100644 index 0000000..b9d93f1 --- /dev/null +++ b/.claude/tasks/contracts/2026-10-09-make-test-names-red-suites-1528.md @@ -0,0 +1,24 @@ +# CONTRACT — make-test-names-red-suites +- date: 2026-10-09 | flow: hotfix | branch: bugfix/make-test-names-red-suites +- status: active + +## REQUEST (verbatim — IMMUTABLE) +Skill args: "Makefile `test` target: print `FAIL ` for every red suite and a final summary line (` suite(s) red: ` or `all suites green`) so a full `make test` names the failing suites itself; exit code unchanged (1 on any red). Today only `== ` headers print and the aggregate rc forces a second per-suite run to find the red one." +User (fr): "c'est quand meme long 9 min pour faire un merge non ? … ou est le bottlneck ?" → measured: the pre-merge `make test` (454 s) was a full run PLUS a per-suite re-run to name the red suite; "oui vas y fait le maintenant". + +## CLARIFICATIONS +Q: wording / A: given by the request: `FAIL ` per red suite right after it runs, then one summary line ` suite(s) red: ` or `all suites green`. [user] +Q: exit code / A: unchanged: 1 when any suite is red, 0 otherwise. [user] + +## ACCEPTANCE CRITERIA +1. Symptom gone: a run with one red suite prints `FAIL ` and `1 suite(s) red: ` and exits non-zero (GNU make reports a failed recipe as 2); a run with only green suites prints `all suites green` and exits 0. Checked on a two-suite fixture through `make test suite=" "`-style invocations (the `suite` variable already accepts a list). + CHECK: cd /Users/b.chanot/Documents/claude && W=$(mktemp -d) && printf '#!/usr/bin/env bash\nexit 0\n' > "$W/green.test.sh" && printf '#!/usr/bin/env bash\nexit 1\n' > "$W/red.test.sh" && out=$(make test suite="$W/green.test.sh $W/red.test.sh" 2>&1); rc=$?; [ $rc -ne 0 ] && echo "$out" | grep -q "^FAIL $W/red.test.sh" && echo "$out" | grep -q "1 suite(s) red: $W/red.test.sh" && out2=$(make test suite="$W/green.test.sh" 2>&1); rc2=$?; [ $rc2 -eq 0 ] && echo "$out2" | grep -q "all suites green" && echo SUMMARY-OK + EXPECT: SUMMARY-OK + EVIDENCE: MET exit=0 marker-found :: SUMMARY-OK +2. Build/tests green: the Makefile still runs the real suites (`make test suite=lib/tests/mods.test.sh` exits 0 and prints `all suites green`); `make -n test` parses. + CHECK: cd /Users/b.chanot/Documents/claude && make -n test >/dev/null && out=$(make test suite=lib/tests/mods.test.sh 2>&1); rc=$?; [ $rc -eq 0 ] && echo "$out" | grep -q "all suites green" && echo REAL-SUITE-OK + EXPECT: REAL-SUITE-OK + EVIDENCE: MET exit=0 marker-found :: REAL-SUITE-OK + +## FILE SCOPE +Makefile