Skip to main content

Zoid + SO1 Automations — Deployment Checklist

Speed-run guide. Do steps in order — each unlocks the next.

Phase 0: External Services (~30 min)

These are pre-requisites. Do them first so IDs/URLs are ready when you need them.

0A. Discord Webhooks

  1. Create #council-decisions channel
  2. Channel Settings > Integrations > Webhooks > New Webhook
  3. Copy URL → save as DISCORD_WEBHOOK_COUNCIL
  4. Create #agent-optimisation channel, repeat
  5. Copy URL → save as DISCORD_WEBHOOK_OPTIM

0B. Airtable — Council Base

Go to airtable.com > Create base: “OpenClaw Council” Table 1: “Council Decisions”
FieldType
TypeSingle select: New Project, Priority Conflict, Crisis, Financial, Shipping
VerdictSingle select: GO, NO-GO, DEFER, RESOLVED
ConfidenceNumber (0.00–1.00)
SummaryLong text
Compass_ScoreNumber
Vault_ScoreNumber
Cortex_ScoreNumber
Anvil_ScoreNumber
Tempo_ScoreNumber
DateDate
Session_IDSingle line text
30_Day_ReviewCheckbox
Review_OutcomeLong text
Table 2: “Council Handoff Log”
FieldType
From_AgentSingle select: anvil, bard, vault, cortex, tempo, compass, sentinel, atlas
To_AgentSingle select (same 8)
TypeSingle select: assessment, estimation, feasibility, approval, information
QuestionLong text
ResponseLong text
Quality_ScoreNumber
DateDate
Table 3: “Emergency Protocol Log”
FieldType
DateDate
Signals_ActiveNumber
Triggered_SignalsLong text
Recovery_Duration_DaysNumber
Post_Recovery_OutcomeLong text
Copy the base ID from the URL (https://airtable.com/appXXXXXXXXX/...) → save as AIRTABLE_COUNCIL_BASE_ID.

0C. Airtable — Optimisation Base

Create base: “OpenClaw Optimisation” Table 1: “Optimisation Runs”
FieldType
AgentSingle line text
TemplateSingle line text (e.g. U-01, G-01)
Run DateDate
ScoreNumber (0.00–1.00)
StatusSingle select: OK, WARNING, ACTION_REQUIRED, SKIPPED
RecommendationsLong text
Cost USDCurrency
Tokens UsedNumber
Table 2: “Drift History”
FieldType
AgentSingle line text
DimensionSingle select: tone, scope, protocol, consistency
ScoreNumber
DateDate
TrendSingle select: improving, stable, worsening
Table 3: “ADHD Protocol Scores”
FieldType
AgentSingle line text
ProtocolSingle select (8 protocols)
Week OfDate
Activation RatePercent
Success RatePercent
EffectivenessPercent
StatusSingle select: effective, underused, ineffective, critical
Table 4: “Rate Limiter Log”
FieldType
DateDate
Total CallsNumber
Total Cost USDCurrency
Skipped RunsNumber
Skip ReasonSingle select: hourly_limit, daily_limit, cost_cap
Copy base ID → save as AIRTABLE_OPTIM_BASE_ID.

0D. Airtable API Token

airtable.com/create/tokens > Create personal access token with scopes:
  • data.records:read
  • data.records:write
  • Access to both bases above
Save token for n8n credential setup.

Phase 1: BFF → hab.so1.io Connectivity (~5 min)

1A. Get n8n API Key

  1. Go to hab.so1.io
  2. Settings (gear icon) > API
  3. Enable API if not already enabled
  4. Create new API key → copy it

1B. Set Railway Env Vars

In Railway dashboard for the control.so1.io service, add:
N8N_API_URL=https://hab.so1.io
N8N_API_KEY=<key from step 1A>
Railway will auto-redeploy. Wait ~60 seconds.

1C. Verify

# Health check (no auth needed)
curl https://control.so1.io/health
# → { "status": "ok", ... }

# Workflow listing (needs Clerk token)
# Quick way: open console.so1.io/workflows in browser — should load without error
# (Empty list is fine — no workflows imported yet)

Phase 2: n8n Credentials & Variables (~10 min)

2A. Credentials (hab.so1.io > Settings > Credentials)

Create two credentials:
  1. anthropic-api — Type: “Header Auth”
    • Name: x-api-key
    • Value: your Anthropic API key (sk-ant-...)
  2. airtable-api — Type: “Header Auth”
    • Name: Authorization
    • Value: Bearer <airtable_pat_from_0D>

2B. Variables (hab.so1.io > Settings > Variables)

Add all of these:
DISCORD_WEBHOOK_COUNCIL    = <from 0A>
DISCORD_WEBHOOK_OPTIM      = <from 0A>
AIRTABLE_COUNCIL_BASE_ID   = <from 0B>
AIRTABLE_OPTIM_BASE_ID     = <from 0C>
AGENT_FILES_BASE_PATH      = https://github.com/so1-io/so1-io/tree/main/standalone/zoid/agents
COUNCIL_LLM_MODEL          = claude-sonnet-4-20250514
COUNCIL_LLM_TEMPERATURE    = 0.2
COUNCIL_MAX_TOKENS_PER_CONSULTATION = 1000
COUNCIL_THROTTLE_SECONDS   = 2
OPTIM_LLM_MODEL            = claude-sonnet-4-20250514
OPTIM_LLM_TEMPERATURE      = 0.2
OPTIM_DAILY_COST_CAP       = 5.00
OPTIM_HOURLY_RATE_LIMIT    = 50
OPTIM_DAILY_RATE_LIMIT     = 200
OPTIM_PER_AGENT_COST_CAP   = 1.00
OPTIM_MIN_CALL_INTERVAL_MS = 2000
OPTIM_ENABLED              = true

Phase 3: Import Council Workflows (~15 min)

Source file: standalone/zoid/agents/COUNCIL-WORKFLOWS.md

3A. Import Workflow JSON

For each workflow (CW-01 through CW-07):
  1. Go to hab.so1.io > Workflows > + Add Workflow > Import from JSON
  2. Copy the JSON block from COUNCIL-WORKFLOWS.md for that workflow
  3. Paste and import
  4. Verify tags — each workflow should already have tags in the JSON. Confirm they appear in the workflow settings. These tags are critical for the console to link agents to workflows.
WorkflowTags (must match exactly)
CW-01: New Project Evaluationopenclaw, council, cw-01, compass, vault, cortex, anvil, tempo, atlas
CW-02: Priority Conflict Resolutionopenclaw, council, cw-02, atlas, compass
CW-03: Weekly Strategy Syncopenclaw, council, cw-03, atlas, compass, sentinel, strategy
CW-04: Financial Decision Gateopenclaw, council, cw-04, vault, compass, atlas, strategy
CW-05: Shipping Decisionopenclaw, council, cw-05, anvil, sentinel, atlas, builder
CW-06: Content Calendar Planningopenclaw, council, cw-06, bard, cortex, atlas, voice
CW-07: ADHD Emergency Protocolopenclaw, council, cw-07, adhd, atlas, tempo, compass, bard, human
  1. Do NOT activate yet — test first (Phase 5).

3B. Quick Smoke Test

Pick CW-01. Click “Test workflow” in the n8n editor. It should:
  • Hit the webhook trigger (or use manual trigger for testing)
  • Fail at the LLM node if credential isn’t wired — that’s expected
  • Wire the anthropic-api credential to each LLM node, then re-test

Phase 4: Import Optimisation Workflows (~20 min)

Source files:
  • Skeleton: standalone/zoid/agents/OPTIM-N8N-SUITE.md (section 4.3)
  • Prompts: standalone/zoid/agents/OPTIM-HANDBOOK.md

4A. Import Skeleton

  1. Import the skeleton JSON from OPTIM-N8N-SUITE.md section 4.3
  2. Save as optim-skeleton (don’t activate)

4B. Create Template Workflows

For each of the 17 templates, duplicate the skeleton and customise: Start with these 3 (they have ready-made JSON in OPTIM-N8N-SUITE.md):
TemplateSectionCron
U-01: Prompt Driftsection “Template-Specific: U-01”0 2 * * 0 (Sun 02:00)
U-05: ADHD Protocolsection “Template-Specific: U-05”0 3 * * 0 (Sun 03:00)
G-01: Shipping Velocitysection “Template-Specific: G-01”0 18 * * 5 (Fri 18:00)
For each:
  1. Duplicate optim-skeleton
  2. Rename to optim-u01-prompt-drift (etc.)
  3. Replace the “Build Analysis Prompt” node with the template-specific version from OPTIM-N8N-SUITE.md
  4. Update the Schedule Trigger cron
  5. Update Agent Iterator filter (if group/individual template)
  6. Tag with optim + agent-specific tags
Then do the remaining 14 using prompts from OPTIM-HANDBOOK.md:
IDNameCronAgents
U-02Memory Hygiene0 2 * * * (daily)all
U-03Voice Consistency0 4 1,15 * * (fortnightly)all
U-04Context Budget0 5 1 * * (monthly)all
U-06Council Handoff0 4 * * 0 (Sun)all (runs once)
U-07Tool Relevance0 5 15 * * (monthly)all
U-08Regression Testing0 6 1 * * (monthly)all
U-09Personality Entropy0 7 1 * * (monthly)all
U-10Config Drift0 5 1 1,4,7,10 * (quarterly)all
G-02Decision Quality0 18 * * 5 (Fri)compass, atlas, vault
G-03Growth & Wellbeing0 4 30 * * 0 (Sun)tempo, cortex
G-04Content Qualityevent-drivenbard, cortex
I-01Debt/Shipping Ratio0 5 1,15 * * (fortnightly)anvil
I-02Authenticity0 6 30 * * 1 (Mon)bard
I-03Priority Accuracy0 6 * * 1 (Mon)atlas

4C. Wire Credentials

For every imported workflow, ensure:
  • LLM nodes use the anthropic-api credential
  • Airtable HTTP nodes use the airtable-api credential

Phase 5: Import Life Hacks (~10 min)

Source: automation-workflows/life-hacks/workflows/ Each has a JSON file ready to import:
WorkflowJSON FileExtra Credentials Needed
Daily Compassdaily-compass/daily-compass.jsonGoogle OAuth2, GitHub PAT, Starling API, OpenWeatherMap
Inbox Pilotinbox-pilot/inbox-zero-autopilot.jsonGoogle OAuth2, Anthropic
Money Pilotmoney-pilot/money-pilot.jsonStarling API, Anthropic
Health Pulsehealth-pulse/health-pulse.jsonApple Health (via webhook), Anthropic
Decision Journaldecision-journal/decision-journal.jsonAirtable, Anthropic
Plus Swim Coach (5 workflows):
  • swim-coach-weekly-scheduler.json
  • swim-coach-session-briefs.json
  • swim-coach-log-webhook.json
  • swim-coach-adaptation.json
  • swim-coach-afternoon-swimdown.json
Each workflow directory has a SETUP.md with specific credential requirements. Read those for per-workflow setup. Tip: Start with Daily Compass only — it’s the most useful day-one. Add others later.

Phase 6: Verify End-to-End (~10 min)

6A. Console Shows Workflows

  1. Visit console.so1.io/workflows
  2. Should list all imported workflows with active/inactive status
  3. If empty: check Railway logs for BFF → n8n connection errors
  1. Visit console.so1.io/agents
  2. Each agent card should show a workflow count
  3. Click into an agent (e.g. Anvil) → “Linked Workflows” section should list CW-01, CW-05, G-01, etc.
  4. If counts are 0: verify workflow tags in n8n match agent workflowTags in config

6C. Console Shows Runbooks

  1. Click into any agent with runbooks (e.g. Sentinel)
  2. “Runbooks” section should show entries like “Automation Operations”, “DevOps Operations”

6D. Test Workflow Execution

  1. In the console, click into an agent with a linked workflow
  2. Click “Run” on one of the workflows
  3. Check console.so1.io/jobs — should show a running/completed execution
  4. Check Discord channels for notifications

6E. Smoke Test Council Workflow

# Trigger CW-07 (ADHD Emergency) manually via n8n webhook
curl -X POST https://hab.so1.io/webhook/council-adhd-emergency \
  -H "Content-Type: application/json" \
  -d '{"test": true, "signals": ["missed_deadlines", "context_switching"]}'

# Expected: Discord embed in #council-decisions with agent assessments
# Expected: Airtable record in Emergency Protocol Log

Activation Order

Once everything tests clean, activate workflows in this order:
  1. Council workflows (CW-01 through CW-07) — these are webhook-triggered, so activating just enables the endpoints
  2. U-02 Memory Hygiene — daily, low cost, validates the skeleton pattern works
  3. U-01 Prompt Drift — weekly, core health metric
  4. Daily Compass — morning briefing, immediate personal value
  5. Remaining optimisation workflows — one per day, monitoring cost in Rate Limiter Log
  6. Life hacks — as you set up the per-workflow credentials

Troubleshooting

SymptomLikely CauseFix
Console workflows page shows errorN8N_API_URL / N8N_API_KEY not set on RailwaySet env vars, redeploy
Agent workflow count is 0Workflow tags in n8n don’t match workflowTags in agent configCheck tag names are lowercase and match exactly
LLM node fails in n8nanthropic-api credential not wired to nodeEdit workflow, select credential on each LLM node
Airtable logging failsWrong base ID or PAT scopeVerify AIRTABLE_*_BASE_ID variables, check PAT has both bases in scope
Discord notification missingWebhook URL wrong or channel deletedTest webhook URL with curl directly
Rate limiter blocks all runsDaily cost cap hitCheck “Rate Limiter Log” table; increase OPTIM_DAILY_COST_CAP if needed
Console shows “no runbooks”Agent runbooks array empty in configCheck config/agents.ts — vault and tempo intentionally have none yet