feat(fleet): enhancer role + two-agent floor (orchestrator + enhancer) #615

Merged
jason.woltje merged 1 commits from feat/fleet-enhancer-floor into main 2026-06-22 13:16:00 +00:00
Owner

Fleet enhancer role + two-agent floor (closes #614)

Implements Jason's north-star (docs/fleet/north-star.md, #613): every fleet has a two-agent floor — orchestrator + enhancer minimum. Builds directly on my #612 init-R5 work.

Changes

  • Presets (general, coding, research, hybrid): add enhancer — claude, class: enhancer, persistent_persona: true — as a core always-on agent alongside the orchestrator. minimal/local-canary unchanged.
  • fleet.ts:
    • countEnhancers helper.
    • init guarantee extended: non-minimal profiles must yield exactly 1 orchestrator AND ≥1 enhancer (hard-fail otherwise — a corrupted preset can't write a malformed fleet).
    • removeAgentFromRoster refuses to drop the sole enhancer (symmetric with the existing sole-orchestrator guard), so the floor holds at runtime, not just at init.
  • framework/fleet/roles/enhancer.md — the enhancer mandate: monitor → analyze → plan remediation → upgrade tools/skills/harness with the orchestrator → file Mosaic Stack bug reports. Boundaries: does NOT code or review.

Verification

  • 155 fleet tests green. New: countEnhancers; sole-enhancer remove guard; remove-allows-when-another; init two-agent-floor; every-non-minimal-preset-has-enhancer; updated preset-roster assertions. tsc/eslint/prettier/sanitize clean. TDD on the init guarantee + remove protection.

Stacking (for the batch)

This is stacked on #612 (feat/fleet-polish-bundle) — its init code is #612's. The branch currently carries #612's commit too. Merge order: #612 → this. After #612 merges (squash), I'll rebase this onto main (the dup #612 work drops) so the final diff is enhancer-only. Ping me to rebase, or retarget on merge.

🤖 Generated with Claude Code

## Fleet enhancer role + two-agent floor (closes #614) Implements Jason's north-star (`docs/fleet/north-star.md`, #613): every fleet has a **two-agent floor** — orchestrator + **enhancer** minimum. Builds directly on my #612 init-R5 work. ### Changes - **Presets** (general, coding, research, hybrid): add `enhancer` — claude, `class: enhancer`, `persistent_persona: true` — as a **core always-on** agent alongside the orchestrator. `minimal`/`local-canary` unchanged. - **`fleet.ts`**: - `countEnhancers` helper. - **init guarantee extended**: non-minimal profiles must yield **exactly 1 orchestrator AND ≥1 enhancer** (hard-fail otherwise — a corrupted preset can't write a malformed fleet). - **`removeAgentFromRoster` refuses to drop the sole enhancer** (symmetric with the existing sole-orchestrator guard), so the floor holds at runtime, not just at init. - **`framework/fleet/roles/enhancer.md`** — the enhancer mandate: monitor → analyze → plan remediation → upgrade tools/skills/harness **with the orchestrator** → file Mosaic Stack bug reports. Boundaries: **does NOT code or review**. ### Verification - **155 fleet tests** green. New: `countEnhancers`; sole-enhancer remove guard; remove-allows-when-another; init two-agent-floor; every-non-minimal-preset-has-enhancer; updated preset-roster assertions. tsc/eslint/prettier/**sanitize** clean. TDD on the init guarantee + remove protection. ### Stacking (for the batch) This is **stacked on #612** (`feat/fleet-polish-bundle`) — its init code is #612's. The branch currently carries #612's commit too. **Merge order: #612 → this.** After #612 merges (squash), I'll rebase this onto `main` (the dup #612 work drops) so the final diff is enhancer-only. Ping me to rebase, or retarget on merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jason.woltje added 2 commits 2026-06-22 08:03:56 +00:00
fix(fleet): boot-survival symmetry — disable-on-remove + add-enable + init-R5 (#611)
All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/push/ci Pipeline was successful
eb32df6cc5
Codex symmetry-gap finding. Three fixes completing add/remove boot-survival
symmetry:

1. disable-on-remove (BUG, TDD): fleet remove stopped + deleted roster/env/
   heartbeat but never disabled the systemd unit, so a removed-but-enabled
   mosaic-agent@NAME.service could resurrect on reboot pointing at deleted
   config. Add buildSystemdDisableCommand + disable in remove (best-effort,
   gated on !--keep-files).
2. add-enable: fleet add now enables the new agent's unit for boot-survival
   (best-effort, independent of --start).
3. init-R5 guarantee: fleet init --write now fails hard when a non-minimal
   profile lacks exactly one orchestrator (was a soft warning); the sanctioned
   no-orchestrator 'minimal' preset is still allowed.

Verified: 4 new tests (disable builder; remove-invokes-disable; add-invokes-
enable; init general → exactly 1 orchestrator) + 147 existing fleet tests green
(151 total); tsc/eslint/prettier clean.

Refs #611

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
feat(fleet): enhancer role + two-agent floor (orchestrator + enhancer) (#614)
Some checks failed
ci/woodpecker/push/ci Pipeline was canceled
ci/woodpecker/pr/ci Pipeline was canceled
f27371be7a
From Jason's north-star (docs/fleet/north-star.md, #613): every fleet has a
two-agent floor — orchestrator + enhancer minimum. Builds on #612's init-R5.

- Presets (general/coding/research/hybrid): add enhancer (claude, class:
  enhancer, persistent_persona) as a core always-on agent. minimal/local-canary
  unchanged.
- fleet.ts: countEnhancers helper; init guarantee extended — non-minimal
  profiles must yield exactly 1 orchestrator AND >=1 enhancer (hard-fail);
  removeAgentFromRoster refuses to drop the sole enhancer (symmetric with the
  sole-orchestrator guard) so the floor holds at runtime, not just init.
- framework/fleet/roles/enhancer.md: the enhancer mandate (monitor -> analyze ->
  plan -> upgrade tools/skills/harness WITH orchestrator -> file Mosaic Stack
  bug reports) + boundaries (does NOT code or review).

Verified: 155 fleet tests green (countEnhancers; sole-enhancer remove guard;
remove-allows-when-another; init two-agent-floor; every-non-minimal-preset-has-
enhancer; updated preset rosters). tsc/eslint/prettier/sanitize clean. TDD on
the init guarantee + remove protection.

Stacked on #612 (feat/fleet-polish-bundle); rebases clean onto main after #612.

Refs #614, #613

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
jason.woltje force-pushed feat/fleet-enhancer-floor from f27371be7a to 5e73481f0a 2026-06-22 08:14:26 +00:00 Compare
jason.woltje merged commit 2bf66136e4 into main 2026-06-22 13:16:00 +00:00
jason.woltje deleted branch feat/fleet-enhancer-floor 2026-06-22 13:16:01 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#615