Auto Orchestration Config - alexherrero/agentm GitHub Wiki

Auto-orchestration config reference

Two files drive the memory push-surface. You tune the config at <vault>/projects/agentm/desk/auto-orchestration-config.md, where the AgentKV layout move (task 176 step 3, 2026-09-25) put it โ€” the project root is never read for it (task 176 step 4 locked the root to five files, and the config lists aren't among them), and neither is the retired <vault>/memory/ spelling the memory-root trims (agentm-vault plan 05) moved it out of before that. It holds toggles, thresholds, and cooldowns. It auto-seeds with defaults. Re-seeding never clobbers your edits. The system stores runtime state at ~/.local/state/agentm/auto-orchestration-state.json โ€” the engine state directory ($AGENTM_STATE_DIR overrides it; machine state left the vault in filing-v2 part 2a). This state holds last-fire-per-chain timestamps. It also holds the last-shown snapshot for the shifted-since-last-shown check. All keys live in DEFAULT_CONFIG in auto_orchestration.py. See Auto-orchestration for the why. See Tune auto-orchestration to edit the config.

โšก Quick Reference

Question Answer
Where is the operator config? <vault>/projects/agentm/desk/auto-orchestration-config.md โ€” auto-seeded, operator-editable. The project root and the retired <vault>/memory/ spelling are never read (task 176 locked the root to five files).
Where is the runtime state? ~/.local/state/agentm/auto-orchestration-state.json (engine state directory; $AGENTM_STATE_DIR overrides) โ€” last_fire timestamps + last_shown snapshot.
Does a re-seed overwrite my edits? No. seed_config is idempotent and never clobbers an existing file.
What are the four config groups? Emission toggles ยท briefing thresholds ยท nudge thresholds ยท chain cooldowns.
What does the state file gate? Cooldown windows (should_fire(chain, now)) and the shifted-since-last-shown briefing check.
Who writes the state file? auto_orchestration.py alone โ€” via save_state(). No other script in orchestration_*.py may call save_state directly (V5-5 single-writer invariant, LC-2; enforced by verify-v4.sh segment G).
Related pages Auto-orchestration, Tune auto-orchestration

Emission toggles

Each enable_* toggle turns one emission off entirely. A false value short-circuits that chain before any work. You set these with true or false.

Key Controls Default
enable_briefing the SessionStart pending-state briefing true
enable_idle_chain the idle-time orchestration chain true
enable_phase_integration post-/work reflect + post-/release skill refresh true
enable_stale_promotion_nudge the stale-promoted watchlist safety-rail nudge true

Briefing thresholds

These counts decide whether the SessionStart briefing reports a section. A signal surfaces only at or above its threshold.

Key Controls Default
inbox_threshold The _inbox/*.md count that triggers a briefing flag. Filing v2's write path retired _inbox/ as a capture destination, so this still reads that directory and effectively sees nothing โ€” it does not see the low-confidence filings (filing_confidence: low) that now live at their class directories instead 10
watchlist_high_threshold _skill-watchlist/ HIGH + pending-review count to surface 1
incubator_pending_threshold _idea-incubator/<slug>/ dirs pending research to surface 1

Nudge thresholds

This threshold applies inside the one remaining nudge counter before it surfaces. The idea-ledger signal and the "you keep having this idea โ€” promote it?" nudge (idea_ledger_stale_months, promote_mention_threshold, enable_promote_suggest) retired in agentm-vault part 13 with the hand-kept Ideas.md they read โ€” Ideas.md is generated over personal/ideas/ now, and an idea card is never garbage-collected or flagged for recurring. A config file that still carries those three keys is read as before; nothing consults them any more.

Key Controls Default
stale_promotion_days days a _skill-watchlist/ entry can sit status: promoted before the nudge fires 30

Chain cooldowns

This is the minimum window in hours between fires of each chain. The should_fire(chain, now) check honors it. A non-positive value means "always eligible".

Key Controls Default
briefing_cooldown_hours min gap between SessionStart briefing emissions (chain briefing) 8
idle_chain_cooldown_hours min gap between idle-chain runs (chain idle_chain) 24
phase_reflect_cooldown_hours min gap for the phase-integration dispatches (chains phase_reflect + phase_release) 1

Idle-chain steps

The idle chain runs these bounded steps in order. The enable_idle_chain toggle and the idle_chain cooldown gate the whole chain. You cannot toggle steps individually. Each underlying script self-no-ops when you give it empty input.

Step What it runs Bound
reflect-corpus reflect.py corpus --execute โ€” mine unseen session transcripts --batch-size 5 --max-batches 1 (โ‰ค5 sessions/pass)
discover-skills discover_skills.py --cadence-check โ€” refresh discovery sources cadence-check (self-throttled)
adapt-pass1 adapt_skills.py --limit 3 โ€” stage Pass-1 candidate JSONs --limit 3

Note

Pass-2 (the adapt-evaluator sub-agent) is not an idle-chain step. A hook fires outside the agent loop. It cannot dispatch a sub-agent. The chain stages Pass-1 candidates instead. It surfaces the staged count (staged_candidates in the run result). The Pass-2 hand-off lands via phase-dispatch or nudge. You gate dispatch there.

State file shape

auto_orchestration.py:save_state() writes <engine-state-dir>/auto-orchestration-state.json exclusively (default ~/.local/state/agentm/; $AGENTM_STATE_DIR overrides). This enforces the V5-5 LC-2 single-writer invariant. No other script writes this file directly. Sibling orchestration scripts call through ao.save_state() instead. The vault's git never carried it; since filing-v2 part 2a it lives in the engine state directory, its own git repo the runner commits on cadence. It holds JSON with two top-level objects.

Field Type Meaning
last_fire object {<chain>: <ISO-8601 timestamp>} of the most recent fire per chain; read by should_fire. Chains: briefing, idle_chain, phase_reflect, phase_release.
last_shown object {<signal>: <count>} snapshot of the over-threshold signals the briefing last displayed; state_shifted_since_last_shown compares against it to suppress re-firing until a count changes.

Related

โš ๏ธ **GitHub.com Fallback** โš ๏ธ