@mu-crew/mu 3.13.0 → 3.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,11 +28,12 @@ panel's findings will be fixed by agents. Both modes are in
28
28
  | correctness | logic errors, edge cases, error paths, races |
29
29
  | security | injection, auth and permission checks, secrets, unsafe input |
30
30
  | simplicity | duplication, dead code, needless abstraction, an existing helper not reused |
31
- | tests | changed behaviour without a test, tests that cannot fail |
31
+ | tests | risky coverage gaps, ineffective tests, level/duplication/wait/cost findings ([test-health](test-health.md#adding-or-changing-tests)) |
32
32
  | rules | the repo's written rules (see [rules-audit](rules-audit.md)) |
33
33
 
34
34
  Each reviewer gets the range, its angle, and the [brief](brief.md)
35
- rules; it edits nothing. A clean result (`FINDINGS: none` plus the
35
+ rules and available gate records ([test-health](test-health.md#gate-contract));
36
+ coordinate targeted checks across angles. It edits nothing. A clean result (`FINDINGS: none` plus the
36
37
  commands it ran) is a valid result.
37
38
  3. **Record findings** by mode:
38
39
  - delegate: each reviewer ends its answer with `FINDING:` lines;
@@ -60,5 +61,5 @@ triage and the umbrella closes with `--if-ready` (workstream mode).
60
61
  author's tier or higher ([models](models.md#checkers)); one model's
61
62
  blind spot repeated five times is still one blind spot. Pass `model`
62
63
  to `mu_delegate`.
63
- - **The panel is not the gate command.** Merge verification still runs on the
64
+ - **The panel is not the slow gate.** Merge verification still runs on the
64
65
  merged tree ([orchestrator-loop](orchestrator-loop.md#merging)).
@@ -0,0 +1,84 @@
1
+ # Test health
2
+
3
+ Read when defining gates, choosing worker/reviewer verification, adding tests,
4
+ or doing upkeep at a milestone, a budget crossing, or the user's request.
5
+ Testing stays encouraged; upkeep protects coverage and the iteration loop.
6
+
7
+ ## Gate contract
8
+
9
+ Use the repo's `## Gates` in AGENTS.md or README: fast and slow commands,
10
+ slow-gate budget (default 5 min), and a targeted slow-test command. Plan notes
11
+ point there. Until a split is approved, keep the existing repo gate intact;
12
+ recipe guidance does not waive project checks. Fast means iteration checks,
13
+ not a universal seconds promise: measure cold and warm costs.
14
+
15
+ - **Worker:** run the fast gate while iterating; before closing, run slow
16
+ tests for the changed area once, then fast on the final commit. Record
17
+ both, or why a scope is inapplicable/unavailable. Changes invalidate records.
18
+ - **Reviewer:** inspect the diff and reuse equivalent worker records. Run
19
+ uncovered tests for the diff and reproduce claimed failures, rather than
20
+ repeating the full suite or building the parent for every new test.
21
+ - **Orchestrator:** verify one pinned merged tree per batch with the full
22
+ slow gate, plus fast if slow does not include it. All required integration,
23
+ auth, release and packaging checks still pass before push. Bisect a failed
24
+ batch; record the corrected tree's pass. See [merging](orchestrator-loop.md#merging).
25
+
26
+ Gate records are task-note text, not a mu command or stored result cache:
27
+
28
+ ```text
29
+ GATE: commit=<sha> tree=<hash>; command=<exact command + filters>; scope=<full/area>
30
+ RESULT: exit=<code>; duration=<wall time>; counts=<tests/assertions>; skips=<none or reasons>
31
+ CONDITIONS: <toolchain, host/platform, privileges, relevant env/features, cache state>
32
+ ```
33
+
34
+ Reuse requires the same tree, command/scope and equivalent execution
35
+ conditions. Record uncommitted inputs too; a dirty tree hash alone is not
36
+ an identity. A targeted pass, zero selected cases, or a skipped privileged
37
+ check is not a full pass. Clear/reject inherited selectors for full runs;
38
+ report skips explicitly and resolve required missing checks before push.
39
+
40
+ ## Adding or changing tests
41
+
42
+ Use the lowest level that catches the failure, covering behaviour not
43
+ already guarded. A new slow case states what only it can see in a comment
44
+ or commit message. For a bug with a cheap, obvious local target, the worker
45
+ shows red on the base and green on the fix; feature work and integration-heavy
46
+ paths need no mandatory red-green ceremony. Use direct executable evidence
47
+ when stronger, recording the reason.
48
+
49
+ Poll readiness/completion with a bound and useful failure output. Retain
50
+ necessary temporal sampling, negative-observation windows and deliberately
51
+ sleeping process fixtures; explain their timing contract.
52
+
53
+ Reviewer findings identify risky untested/broken behaviour, a wrong test
54
+ level, duplication of a named test, avoidable readiness padding, or measured
55
+ gate slowdown—not every conceivable edge case without a test.
56
+
57
+ ## Upkeep loop
58
+
59
+ Queue ordinary upkeep work at each phase/milestone end or when a merged slow
60
+ gate exceeds budget. Prioritise it before new features; continue independent
61
+ work. A budget is a scheduling trigger, not an indefinite crew-wide stop.
62
+
63
+ 1. **Profile.** Time each gate step and test, including setup/teardown.
64
+ List up to 20 slowest tests per level; inspect waits and repeated builds,
65
+ cold caches and profiles. BEFORE records wall time, counts, skips and
66
+ conditions. Use inspected execution logs, not commands merely mentioning
67
+ a gate or compound-command durations attributed entirely to tests.
68
+ 2. **Classify.** Parallel [delegate calls](tasks-or-calls.md#delegate-call),
69
+ one per area, give slow/overlapping tests an evidenced verdict:
70
+ KEEP; SPEED-UP (poll or share setup with isolation); MOVE-DOWN;
71
+ MERGE into a named test; DELETE as covered by a named test.
72
+ 3. **Refute.** Send every MERGE/DELETE verdict to a refuter: which failure
73
+ would no longer be caught? A refuted or unresolved verdict becomes KEEP.
74
+ 4. **Do.** Dispatch surviving changes as normal test-only tasks. Review
75
+ coverage preservation, isolation and correctness of the harness changes.
76
+ Preserve auth lanes, privilege checks and release scans; measure safe
77
+ [build reuse](orchestrator-loop.md#build-cache) separately.
78
+ 5. **Measure.** Run the merged gates and record AFTER under comparable
79
+ conditions, including coverage/count changes. If neither faster nor
80
+ smaller, say so and why; smaller alone does not prove preserved coverage.
81
+
82
+ Done when AFTER records the outcome and the slow gate is within budget, or
83
+ names the remaining bottleneck and prioritised follow-up. Keep unmet required
84
+ checks distinct from a time-budget overrun.
@@ -10,12 +10,12 @@ runs in its own `--workspace`; this recipe decides what each one gets.
10
10
  the shared files. A blanket freeze idled four of five workers for a
11
11
  day.
12
12
  3. **Pipeline the merge.** Cherry-pick each task as it closes and
13
- verify the merged tree ([orchestrator-loop § Merging](orchestrator-loop.md#merging));
14
- never wait for the whole wave.
13
+ verify pinned merge batches ([orchestrator-loop § Merging](orchestrator-loop.md#merging));
14
+ batching gates does not mean waiting for the whole wave.
15
15
  4. **Refresh before each dispatch.** `mu workspace refresh <agent>`
16
16
  rebases onto the tracked main (git: `origin/HEAD`, so unpushed local
17
17
  merges are missed; pass `--from <local-branch>` to include them) and
18
18
  keeps the agent's context; run it before every `--fresh` send.
19
19
 
20
20
  Done when every task in the wave is `CLOSED/done`, merged, and the
21
- merged tree passes the gate command.
21
+ merged tree passes the slow gate and fast if needed, per the repo contract.
@@ -17,11 +17,15 @@ mu task note <id> "FILES: ...\nCOMMANDS: ... (exit codes)\nDECISION: ...\nVERIFI
17
17
  mu task close <id> --evidence "tests pass: ..." # LAST action
18
18
  ```
19
19
 
20
+ Follow [test-health](test-health.md) for fast iteration checks, targeted slow
21
+ checks before close, gate records, and cheap bug red-green. Include the gate
22
+ records in your final note; adding tests uses its test-level and timing rules.
23
+
20
24
  The note follows the task note contract in SKILL.md. Keep each tool
21
25
  call to minutes (short batches, waits with a timeout): steering reaches
22
26
  you only between tool calls. Commit before you close: the orchestrator cherry-picks your commits, not your tree. A
23
27
  review or audit task records each problem per
24
28
  [findings § Record](findings.md#record).
25
29
 
26
- Done when your changes are committed in the workspace, the task note holds FILES, COMMANDS (with exit codes) and VERIFIED, and `mu task close` succeeded as your last action. Skipping close makes the orchestrator's
30
+ Done when your changes are committed in the workspace, the task note holds FILES, COMMANDS (with exit codes), VERIFIED and applicable gate records, and `mu task close` succeeded as your last action. Skipping close makes the orchestrator's
27
31
  wait hang. Won't do it: `close --as wontfix --why "..."`.