Skip to content

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|critical lands 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

  1. Create the trigger in n8n (webhook, cron, IMAP poll).
  2. n8n calls UDev via scripts/forge_n8n_call.sh OR drops a task with infra/n8n/task-creator.sh.
  3. Dispatcher picks it up automatically.
  4. Worker reports completion → manager bot.
  5. Register the new tool in MEMORY.md (non-negotiable).

Adding a new agent surface

  1. Decide the role (chat / capture / output / shell). One per row in the Output Routing table.
  2. Create a new Telegram bot via BotFather; secrets to ~/.forge-secrets/<bot>.env (chmod 600).
  3. Write the bot script under scripts/integrations/telegram/.
  4. Wrap as a systemd unit in infra/systemd/<name>.service; install via infra/systemd/install.sh.
  5. Update system-map/steering.md (this file) Output Routing + Agent Roles tables.
  6. 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