Auto Orchestration - alexherrero/agentm GitHub Wiki
Why the memory skills became a push surface instead of a pull one โ and how the SessionStart briefing, the idle chain, and the phase-boundary dispatches surface pending work without ever blocking a session or nagging. For the operator knobs, see Tune auto-orchestration; for every config key, see Auto-orchestration config.
The memory skills โ recall, reflect, discover-skills, adapt-skills, the watchlist โ already did real work, but you had to remember to use them. Pending work piled up unseen: an inbox over threshold, watchlist patterns waiting for review, incubator ideas that never got researched. The skills sat there until you thought to ask.
Auto-orchestration closes that gap on three surfaces, and the posture is the whole point โ it is plumbing and nudges, never an autonomous actor:
- At session start, a briefing tells you what needs attention โ "3 watchlist patterns to review ยท inbox over threshold ยท 2 incubator ideas pending research" โ in one tight block, plus a nudge for watchlist patterns you said you'd author but haven't.
-
During idle time, a bounded discover โ adapt chain runs itself in passes, staging candidates so you stop hand-invoking
adapt-skills. -
At the phase boundaries, a finished
/worksession gets reflected and a finished/releaserefreshes the skill surfaces, without you runningreflectorindex-skillsby hand. The entry point isphase_dispatch()inscripts/harness_memory.py(V5-5 / LC-3); the valid phases are locked in the_BRIDGE_PHASESfrozenset in that same module. Live since 2026-07-25 โ crickets'development-lifecyclecalls in through this bridge (see the Developer plugin note below). On Claude Code, session reflection also happens on every session through the Stop hook; on Antigravity, which has no Stop hook, this phase-dispatch call is the only session-completion reflect.
Every surface is non-blocking and graceful-skips on any failure, so a broken script never fails your session boot or wedges a phase. Cooldowns plus a "only fire when state has shifted since last shown" guard keep the briefing from nagging. And nothing is autonomous: the system proposes and nudges, but every adoption, every fork, every write outside the permeable boundary still waits for you.
Each loop's trigger โ the when โ lives with the owner of that boundary; the memory operations and cadence state stay kernel-resident (single-writer: only auto_orchestration.py writes the state file). Three owners:
- Kernel โ config/state core, the idle chain, and all memory operations (reflect, discover, adapt, index). Always agentm-resident.
-
Developer plugin โ the phase-boundary trigger, calling in through the
phase_dispatch()bridge described above rather than re-implementing the orchestration logic. The plugin that originally called it (crickets/development-lifecycle) was retired, and its replacement (crickets/development-lifecycle) went without a caller for a while โ from the plugin's own retirement untilagentm_bridge.py's sixth verb,phase-dispatch, landed 2026-07-25 (crickets PR #214).work.mdnow firespost-workafter each task's commit;release.mdfirespost-releaseafter the release lands. -
PM plugin (
crickets/github-projects) โ the session-start briefing and nudge trigger. The briefing is currently kernel-resident and working (the kernelmemory-recall-session-starthook); relocating it into thegithub-projectsplugin is a planned optimization, staged as a concrete crickets-side plan (PLAN-relocate-pm-briefing-trigger.md, 2026-07-07) rather than executed. The failure mode there would only be non-relocation, not a broken briefing.
- The mechanism is hook/file-based and cross-host. It extends the existing idle and SessionStart hooks plus file-based state and config โ deliberately not the Anthropic Workflow SDK primitive, which is Claude-tier-gated and would lose Antigravity parity. The Workflow hybrid stays a post-V4 research follow-up.
- Full scope shipped, nothing autonomous deferred. The state + config core, the briefing, the SessionStart wiring, the idle chain, the phase-integration dispatch, and both nudges all landed.
-
Everything is harness-native. The scripts, hooks, and phase wiring all live in
agentmโ there is no crickets crossover and no paired release; the push-surface ships entirely from the harness. - Pass-2 is not a hook step. A hook fires outside the agent loop and cannot dispatch a sub-agent, so the idle chain stops after staging Pass-1 candidates and surfaces the count. The evaluator hand-off happens via phase-dispatch or a nudge, where sub-agent dispatch is legitimate and operator-gated.
- Stays out of the way. Every surface exits clean on any failure, so a broken script never blocks a session or wedges a phase; cooldowns and the shifted-since-last-shown check guard notification fatigue. The idle chain is bounded by construction โ each step no-ops on empty input, reflect caps at five unseen sessions per pass, adapt runs with a hard limit, and a fired chain is launched detached so its results surface on the next briefing rather than stalling the current boot.
- The permeable boundary holds. Every skill adoption, every toolkit fork, and every write outside the contract still waits for an operator gate.
Notification fatigue is the risk that only calibrates under real use. The cooldowns, the shifted-since-last-shown guard, and the operator-tunable thresholds are the mitigations, but the real acceptance gate is dogfooding on the operator's own vault โ deterministic tests alone can't calibrate it. If a step proves too costly to auto-fire, it gets demoted to a SessionStart "you could run X" nudge.
- Tune auto-orchestration โ the operator recipe for thresholds, cooldowns, and chain toggles.
- Auto-orchestration config โ the config-key and state-file reference.
- Use auto-context in harness phases โ the phase-boundary pull surface this push-surface complements.
- Orchestration and auto-detection โ where the memory hooks sit in the architecture.