Steering: DRAFT 2026-04-28¶
Draft replacement for
system-map/steering.md. Does not overwrite the live file. Review and merge when ready.Rationale: the live file (Apr 14 era) describes a Manager-as-Opus-session role, lists Workers/Monitors as if Manager spawns them, and predates Ava, the Manager output bot, the Notion/Google/Forge stack decision, and the n8n outbound surface.
Steering¶
Routing rules for agents and tasks. Any AI reading this knows how the fleet works.
The Three-System Stack¶
All persistent data lives in exactly one of three places. Pick by feel, see CLAUDE.md routing test ("tap to think → Notion; grep from script → Forge").
| System | Owns | Why |
|---|---|---|
Forge (/home/justinwieb/forge) |
Code, scripts, configs, data, logs, architectural facts, daily working logs, handoffs | Git-tracked, greppable, model-readable |
| Notion (LifeOS workspace) | Vision, narrative, journal, brand strategy, creator notes, long-form drafts, personal/lifestyle | Mobile-first, tappable, human-shaped |
| Google (Drive + Calendar + Gmail) | Docs/contracts/records (Drive), events (Calendar), correspondence (Gmail) | Shareable, archival, official |
TickTick is out as of 2026-04-28. Tasks/reminders go to Notion, Google Calendar/Tasks, or Forge only.
Output Routing: Who Talks to Justin¶
All agent output to Justin flows through @Manager_JForgeBot (Telegram). One unified channel; never a free-for-all.
| Channel | Direction | Use |
|---|---|---|
@Manager_JForgeBot |
agent → Justin | Notifications, completions, alerts. scripts/forge_notify.sh routes all priorities here first. |
@Ava_JForgeBot |
Justin ↔ agent (chat) | LifeOS coordinator / second-brain assistant. Conversational. forge-telegram-ava.service. |
@jw_inbox_bot |
Justin → agent (capture) | Voice/text inbox. Whisper → Sonnet brain → Notion/Calendar/nudges/workers. forge-telegram-inbox.service + forge-inbox-webhook.service. |
@GregTwoPointO_Bot |
Justin ↔ agent (chat, slash commands) | General-purpose Claude shell. /task /opus /haiku /status /context + freeform. forge-telegram-bot.service. |
@jw_updates_bot |
agent → Justin | Lower-priority status pushes (morning brief, etc.). |
notify.sh prunes Discord/Slack from the dispatch path (functions kept, not called), manager bot is the real channel.
Task Routing¶
| Task type | Route to | How |
|---|---|---|
| Code / development | UDev (192.168.86.50) | Forge workspace, Claude Code CLI / VS Code remote, Remote Control sessions |
| Background / scheduled | Task queue | drop JSON in tasks/pending/ → forge-dispatcher.service → ephemeral claude -p --bare worker |
| Long-running interactive | Remote Control session | /spawn [opus\|sonnet\|haiku] [name] [prompt], surfaces claude.ai/code URL |
| Captured to inbox | Telegram inbox bot | voice or text → brain decides Notion / Calendar / nudge / spawn worker |
| Media | media-server (CT 102, .74) | Overseerr → Sonarr/Radarr |
| Smart home | homeassistant (VM, .70) | HA UI / API; wellness pollers feed sensors |
| Business / invoicing | Notion + QuickBooks | Cloud: Forge does not own this |
| DNS / blocking | adguard (CT 105, .75) | AdGuard Home behind Cloudflare Access |
| Hypervisor / VM ops | Finn (.67) | Proxmox host; ssh finn |
| Email triage | n8n (CT 106, .82) | 14 Gmail workflows in infra/n8n/workflows/; called via scripts/forge_n8n_call.sh |
Agent Roles¶
| Role | Implementation | Lifecycle |
|---|---|---|
| Dispatcher | forge-dispatcher.service, bash polling tasks/pending/, runs claude -p --bare workers. |
Always on. Dumb but reliable. Reports completion to manager bot. |
| Workers | Ephemeral claude -p invocations spawned by dispatcher OR named tmux Remote Control sessions spawned via /spawn. |
One task and exit (pipe mode) or long-lived Remote Control (tmux). |
| Monitors | Bash + cron under scripts/monitors/. Check infra/security/business/mounts. |
Zero tokens when healthy. Only create tasks when something is wrong. |
| Ava | forge-telegram-ava.service: Sonnet brain, conversational, LifeOS-aware. |
Always on. Chat surface. |
| Inbox brain | forge-telegram-inbox.service: Sonnet brain, 12 tools, captures voice/text. |
Always on. Capture surface. |
| Greg 2.0 | forge-telegram-bot.service, /task /opus /haiku /status /context + freeform claude -p. |
Always on. Slash command surface. |
| Home Base | forge-tmux-anchor.service, always-listed Remote Control session at claude.ai/code. |
Always on. One-tap UDev shell from phone. |
| Justin | The CEO. | Steers when he wants. Approves big decisions. Receives manager-bot output. |
There is no longer a "Manager Opus session", that role was replaced by the manager output bot + dispatcher + ad-hoc Remote Control sessions Justin spawns when needed.
Decision Principles¶
- One home per fact. Code/data → Forge. Vision/narrative → Notion. Docs/contracts → Google. No duplication; link instead.
- Manager bot is the only output mouth. All
notify.sh info|warning|criticallands there. Other bots are conversational, not alert channels. - Monitors are bash, not AI. AI activates only when a task lands in the queue.
- New agents inherit
system-map/as their brain, write a wrapper, not a new brain. - Memory that matters lives in forge (git-tracked). Daily logs append-only at
memory/daily/YYYY-MM-DD.md. - When in doubt, register the tool. Every reusable script gets a memory entry, invisible otherwise.
- Confirm email actions. Per-batch approval before any Gmail-modifying workflow. No silent batches.
Adding a new workflow¶
- Create the trigger in n8n (webhook, cron, IMAP poll).
- n8n calls UDev via
scripts/forge_n8n_call.shOR drops a task withinfra/n8n/task-creator.sh. - Dispatcher picks it up automatically.
- Worker reports completion → manager bot.
- Register the new tool in MEMORY.md (non-negotiable).
Adding a new agent surface¶
- Decide the role (chat / capture / output / shell). One per row in the Output Routing table.
- Create a new Telegram bot via BotFather; secrets to
~/.forge-secrets/<bot>.env(chmod 600). - Write the bot script under
scripts/integrations/telegram/. - Wrap as a systemd unit in
infra/systemd/<name>.service; install viainfra/systemd/install.sh. - Update
system-map/steering.md(this file) Output Routing + Agent Roles tables. - Register in MEMORY.md.
Diff vs current system-map/steering.md:
- Added: Three-System Stack section (Notion/Google/Forge), replaces unstated assumption
- Added: Output Routing table (5 Telegram bots, manager as primary)
- Removed: "Manager (the brain)" Opus-session role, this role no longer exists
- Updated: Task Routing, added captured/inbox/email rows; expanded Background row to mention
claude -p --bare - Updated: Agent Roles, added Ava, Inbox brain, Greg 2.0, Home Base; reframed dispatcher as the only spawning mechanism
- Added: Decision Principles, one home per fact, manager-bot-only output, register tools, confirm emails
- Expanded: Adding-new-workflow section + new Adding-new-agent-surface section