Final validation checklist before activating a company's agents on MCM Forge. Verifies CLI auth, budget guards, dry runs, and runs the first real issue. Triggers on: go live, activate company, start agents, launch company, company ready.
This is the FINAL gate before agents start running autonomously. Every check must pass. One unchecked item = agents burning budget on broken infrastructure.
/company-onboarding completed)/agent-onboarding completed for CEO)Run every check. Mark PASS or FAIL. ALL must pass.
| # | Check | Command | Expected | Status |
|---|---|---|---|---|
| 1 | Orchestrator running | ssh mini 'pm2 status forge-orchestrator' | online | |
| 2 | Orchestrator .env has company | Check SUPABASE_URL, SUPABASE_SERVICE_KEY in .env |
| Set |
| 3 | Dashboard loads company | Visit mcmforge.com, switch to company | Shows 0 issues, agents listed |
| # | Check | Command | Expected | Status |
|---|---|---|---|---|
| 4 | Claude CLI auth | ssh mini 'claude --version && claude auth status' | Authenticated | |
| 5 | Gemini CLI auth | ssh mini 'gemini --version && gemini auth status' | Authenticated | |
| 6 | Codex CLI auth | ssh mini 'codex --version && codex auth status' | Authenticated |
Only check the CLIs your agents actually use. If all agents use Claude, skip Gemini/Codex.
If auth fails: Steve must use Screen Sharing (VNC to Mini) to run auth login in Terminal.app. Claude CLI OAuth requires a local browser — cannot be done via SSH.
| # | Check | How to verify | Expected | Status |
|---|---|---|---|---|
| 7 | CEO has 4 files | ls companies/<slug>/agents/ceo/ | AGENTS.md, HEARTBEAT.md, SOUL.md, TOOLS.md | |
| 8 | All agents have 4 files | find companies/<slug>/agents/ -name AGENTS.md | One per agent in DB | |
| 9 | Agent DB records match files | Compare forge.agents rows to filesystem dirs | 1:1 match | |
| 10 | Org hierarchy valid | Every agent has reports_to set (except CEO) | No orphans | |
| 11 | No duplicate file assignments | Review TOOLS.md across agents | No 2 agents on same file |
| # | Check | Query | Expected | Status |
|---|---|---|---|---|
| 12 | Company budget set | SELECT budget_monthly_cents FROM forge.companies WHERE id = '<id>' | > 0 | |
| 13 | Agent budgets set | SELECT name, budget_monthly_cents FROM forge.agents WHERE company_id = '<id>' | All > 0 | |
| 14 | No runaway risk | Max agent budget < company budget | True |
| # | Check | Query | Expected | Status |
|---|---|---|---|---|
| 15 | Company goal exists | SELECT * FROM forge.goals WHERE company_id = '<id>' AND level = 'company' | 1+ active | |
| 16 | Project exists | SELECT * FROM forge.projects WHERE company_id = '<id>' | 1+ active | |
| 17 | Issue counter correct | SELECT issue_prefix, issue_counter FROM forge.companies WHERE id = '<id>' | Prefix set, counter correct | |
| 18 | Vision doc exists | cat companies/<slug>/vision/NORTH-STAR.md | Non-empty, all sections |
| # | Check | How | Expected | Status |
|---|---|---|---|---|
| 19 | Orchestrator picks up agent | Set agent to idle, create test issue | Run appears in forge.runs | |
| 20 | Correct prompt injected | Check run logs for 4-file content | All 4 files present | |
| 21 | Agent produces output | Check run stdout_excerpt | Meaningful work product | |
| 22 | Cost within budget | Check cost_usd on the run | < $2 for first run | |
| 23 | Clean exit | Check exit_code and error | exit_code=0, no error |
Only after ALL 23 checks pass:
UPDATE forge.agents SET status = 'idle'
WHERE company_id = '<company-id>' AND role = 'ceo';
INSERT INTO forge.issues (
id, company_id, project_id, identifier, title, description,
status, priority, assignee_agent_id, origin_kind
) VALUES (
gen_random_uuid(),
'<company-id>',
'<project-id>',
'<PREFIX>-1',
'<first real task title>',
'<clear description with acceptance criteria>',
'todo',
'medium',
'<ceo-agent-id>',
'manual'
);
-- Increment counter
UPDATE forge.companies
SET issue_counter = issue_counter + 1
WHERE id = '<company-id>';
The first issue should be SMALL and SAFE:
Watch the dashboard:
Steve verifies the output. This is the FINAL gate.
Company Go-Live: <Company Name>
- Pre-flight: 23/23 checks PASS
- CEO: active, first heartbeat completed
- First issue: <PREFIX>-1 — <title>
- First run: <status>, cost $<amount>
- Steve's verdict: PASS/FAIL
- Status: LIVE / NEEDS RETRY
If things go wrong after go-live:
UPDATE forge.agents SET status = 'paused' WHERE company_id = '<id>'UPDATE forge.routines SET status = 'paused' WHERE company_id = '<id>'