Auto Orchestration Config - alexherrero/agentm GitHub Wiki
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.
| 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 |
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 |
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 |
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 |
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 |
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.
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. |
- Auto-orchestration explains what these knobs change. It shows why the surface never nags.
- Tune auto-orchestration provides the recipe for editing the config.
-
AgentMemory context payload details the vault folder map. These files reference the
_inbox/,_idea-incubator/,_meta/, andmemory/paths.