Skip to content

idle-warm: run cmux's UI fuzzer in idle gaps with nothing left to warm (opt-in) - #1343

Merged
teamleaderleo merged 4 commits into
mainfrom
idle-warm-fuzz
Sep 28, 2026
Merged

teamleaderleo merged 4 commits into
mainfrom
idle-warm-fuzz

Conversation

@teamleaderleo

Copy link
Copy Markdown
Owner

Opt-in idle UI fuzzing for cmux minis, as a preemptible gap fill inside glaeda-idle-warm.

With ~/.config/glaeda/idle-fuzz.enabled, an idle spell with nothing left to warm runs cmux's scripts/fuzz (manaflow-ai/cmux#15297) from the kept main checkout instead of skipping. It clones (APFS cp -Rc) the newest main build a root keeps into fuzz/builds/<sha> while holding that root's token, then fuzzes it for up to 12 minutes and minimizes up to two failures into fuzz/runs/.

It never delays a job: same gates as a catch-up, plus an unlocked console owned by this user, the gui token free and no Xcode test process. It holds one capacity unit through capacity/idle-warm.json, so the hook's existing yield covers it with no hook change: every admission SIGTERMs it, the gate counts what it holds as free, and the app dies with the process group because the fuzzer starts it as its own child. It never takes the gui token, which would stop a gui runner's listener. No runner is pinned. --apply --fuzz runs it now for an operator.

Tests: four new cases in scripts/test-glaeda-idle-warm.py (off unless enabled; stages and fuzzes the main build and releases; refuses beside a gui job or without an engine or a main build; a job's SIGTERM ends the fuzzer and its app within the 5 s yield). The file passes locally (20 tests).

Icicle g1 ⚙️ (run_worker_20260927_686a3a99)

🤖 Generated with Claude Code

teamleaderleo and others added 4 commits September 28, 2026 05:39
…m (opt-in per mini)

With ~/.config/glaeda/idle-fuzz.enabled, an idle spell whose roots are all near main's
head runs cmux's scripts/fuzz against a staged APFS clone of the newest main build a root
keeps, instead of skipping. Same gates and yield as a catch-up, plus an unlocked console
owned by this user, no gui token held and no Xcode test running. It holds one capacity
unit (and the root's token while it copies) through capacity/idle-warm.json and never the
gui token, so every job's admission stops it and no listener is held off; the app is the
fuzzer's child in the catch-up's process group and dies with it. --apply --fuzz runs it now.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…oor, bounded runs)

- Starts only when every capacity unit is free: a gui-step job takes the gui token later with
  take-gui, which does not stop a yielding holder, so any admitted job rules the fuzzer out.
- Stages without a root token (which would stop a gui runner's listener): clone, then check
  the root's stamp is unchanged. Partial copies (dot directories, no build.json) never count
  and are removed.
- Refuses under 90 GiB free; keeps at most 30 runs with findings and 10 without.
- Uses the hook's console_state (screen lock included); closes a crash dialog it caused.
- Run at most 24 minutes (10 fuzzing, 5 per minimized finding); errors return a record.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…t run

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@teamleaderleo
teamleaderleo merged commit 171141b into main Sep 28, 2026
14 checks passed
@teamleaderleo
teamleaderleo deleted the idle-warm-fuzz branch September 28, 2026 10:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant