πŸ›‘οΈ BSP Bulletproof-First Operator Manual

v2 council with 5 defense layers + 14 components. Bulletproof is the default β€” never the fast option. Apr 26 update.
v1 Β· 2026-04-25 Β· Replaces the Desktop ↔ Terminal ↔ Robert relay loop Β· BSP-internal, generalizes later

πŸ“‘ Quick Jump

TL;DR Why this exists The new flow 5 agents 3 modes 4 autonomy tiers How to run a dispatch How you decide ship/hold When things fail Cheat sheet
πŸ›‘οΈ

The 5 defense layers (v2 bulletproof β€” every dispatch passes all 5)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Robert: dispatch question β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό ╔═══════════════════════════════════════════════════════════╗ β•‘ LAYER 1 β€” SCOPE-BOUNDARY REFEREE β•‘ β•‘ referee.py β†’ Terminal | Bricks UI | Ambiguous β•‘ β•‘ Bricks UI scope = REJECT at intake (sys.exit 3) β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β–Ό ╔═══════════════════════════════════════════════════════════╗ β•‘ LAYER 2 β€” PROTOCOL GATES PRE-LOAD β•‘ β•‘ protocol_gates.md β†’ 12 KB canonical IDs/limits/scope β•‘ β•‘ Loaded into every agent's prompt β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β–Ό ╔═══════════════════════════════════════════════════════════╗ β•‘ LAYER 3 β€” PER-AGENT ZEUS RAG RETRIEVAL β•‘ β•‘ STRATEGIST: broad k=15 CRITIC: failure-mode focused β•‘ β•‘ RESEARCHER: external web only (Perplexity native) β•‘ β•‘ AUDITOR: identifier-cross-check vs Strategist draft β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β–Ό ╔═══════════════════════════════════════════════════════════╗ β•‘ LAYER 4 β€” AUDITOR EMPIRICAL-GREP TOOLS β•‘ β•‘ auditor_tools.py β†’ live HTML grep + snippet census + β•‘ β•‘ REST registry + post canonical list. Pre-LLM check. β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β–Ό ╔═══════════════════════════════════════════════════════════╗ β•‘ LAYER 5 β€” VALIDATION SCORE β•‘ β•‘ validation_score.py β†’ binary + count + scope checks β•‘ β•‘ PASS / FAIL / FAIL_HIGH verdict surfaces in dispatch β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Robert: SHIP / AMEND / β”‚ β”‚ HOLD β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
πŸ“ˆ Net result: A dispatch reaching you has passed 5 verification gates. Your time goes to ship/hold/amend, not proofreading.
🚫

Rule 9: Bulletproof Default β€” never the fast option

Robert, Apr 25: "for the record we never want the fast option we always want the best in practice bulletproof option" β€” codified as CLAUDE.md Rule 9.

What bulletproof requires (from memory/feedback_bulletproof_default.md + CLAUDE.md Rule 9):

Architectural enforcement β€” can't be bypassed accidentally

πŸ“Œ The whole SOP in 60 seconds:

You give me a strategic ask. I author a dispatch (Phase X with steps + abort gates + rollback) using a council of 4 specialized AI agents instead of relying on Claude Desktop. The dispatch saves to disk + Master History. You ship/amend/hold from a single review. I execute. No copy-paste relay between you, Desktop, and Terminal anymore.

One command to invoke:
python3 /opt/nexus/nexus/scripts/council_runtime.py --mode solo --question "your strategic ask here" --tier 1
πŸ”₯

Why we built this

⏰
Desktop maxes out
4-day threads + 393 attachments + Robert pasting both sides of the loop = 420K-token context blow-up. Repeats forever.
πŸ”
You were the bus
Desktop drafts β†’ Robert pastes to Terminal β†’ Terminal executes β†’ Robert pastes back to Desktop. 3 nodes, 2 copy-pastes per cycle.
🎯
One model = blind spots
Desktop alone misses what 4 specialized agents catch in parallel. Especially failure modes + factual claims needing citations.
🌊

The new flow

Old way (broken)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” drafts β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” pastes β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Claude β”‚ ────────▢│ Robert β”‚ ────────▢│ Claude β”‚ β”‚ Desktop β”‚ β”‚ (relay) β”‚ β”‚ Code β”‚ β”‚ (strategist) β”‚ ◀─────── β”‚ β”‚ ◀─────── β”‚ (executor)β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ pastes β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ outputs β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ └──── 4-day context window fills up β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

New way

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ STRATEGIC COUNCIL (parallel) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”β”‚ β”‚ β”‚STRAT β”‚ β”‚CRITICβ”‚ β”‚RESRCHβ”‚ β”‚AUDIT β”‚β”‚ β”‚ β”‚Opus β”‚ β”‚GPT-4oβ”‚ β”‚PPLX β”‚ β”‚Geminiβ”‚β”‚ β”‚ β”‚ 4.6 β”‚ β”‚ β”‚ β”‚SonarPβ”‚ β”‚ 2.5P β”‚β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Claude Code (executor + interface)β”‚ β”‚ Saves dispatch to disk + MH log β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Robert: SHIP / AMEND / HOLD β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό Execute via VM SSH Receipts to MH Zeus RAG indexes
πŸ“ˆ Net win: 1 node instead of 3. No copy-paste relay. Dispatch authoring + execution + audit trail in a single conversation. Persistent memory across sessions via disk + MH + RAG.
πŸ€–

The 5 agents

🧠
STRATEGIST β€” Claude Opus 4.6
Extended thinking. Authors Phase X dispatches in BSP house style. Default voice β€” every dispatch starts here. Replaces what Desktop did.
βš”οΈ
CRITIC β€” GPT-4o
Devil's advocate. Reads the Strategist's draft, surfaces failure modes the Strategist missed. Numbered risk list with severity. Votes APPROVE / AMEND / REJECT.
πŸ“š
RESEARCHER β€” Perplexity Sonar Pro
Citation-first. Verifies factual claims in the dispatch with real 2024-2025 sources. Returns URLs + sample sizes. Reject opinion-only sources.
πŸ”
AUDITOR β€” Gemini 2.5 Pro grounded
Cross-checks dispatch against Master History + Project Ledger. Flags contradictions with prior decisions. Confirms file paths / IDs / backup locations are accurate.
πŸ› οΈ
EXECUTOR β€” Claude Code (me)
VM SSH + Hostinger MCP + file ops + native-save / install-child / cache purge / Playwright verify. I run the dispatch end-to-end after you ship it. I am the integration.
⚑

3 modes β€” pick by stakes

ModeWho runsWhen to useCost
SOLO 🟒 Strategist only Tactical work β€” swap a CSS selector, update a text-link href, run a Playwright verify, log to MH Cheapest, ~30s
COUNCIL 🟑 Strategist + Critic + Researcher + Auditor (parallel) High-stakes β€” URL migration, schema overhaul, launch cutover, 13-city clone pattern lock, Bricks template rebuild ~2 min, 4 API calls
SPECIALIST πŸ”΅ Single agent for single job Just citations (Researcher only). Just adversarial read (Critic only). Just integrity check (Auditor only). One API call, ~30s
Rule of thumb: If it's a write to staging that has rollback β†’ SOLO. If it touches production or a strategic decision β†’ COUNCIL. If you just need one specific lens β†’ SPECIALIST.
🚦

4 autonomy tiers

Each dispatch is tagged with a tier. Tier governs whether you have to approve it before execution.

TierWhatExamplesApproval
TIER 0 Read-only / docs / MH log SEO research, project ledger refresh, doc draft, MH section None β€” auto-execute
TIER 1 Staging writes with rollback Template 105 native-save, snippet activate/deactivate, child theme install, op258 content patches Robert sees + can roll back, but auto-executes by default
TIER 2 Production writes / content tree change / schema Production cutover, callbrightside.com (live) edits, sitemap regen, GMB updates, Google Ads landing page swap Robert approval required
TIER 3 Destructive / irreversible Drop a snippet permanently, delete a Bricks template, force-push to main, drop a database table Robert approval + signed receipt
🎯

How to run a dispatch (4 ways)

Method 1: Just tell Claude Code in chat

Simplest. You say "I need a dispatch for X" β†’ I author it β†’ I save to disk β†’ I show you for ship/hold.

Example: "I need a Tier 1 council dispatch for retiring snippet #115 since the child theme owns the CSS now."

Method 2: Direct command on the VM

Solo mode (cheap, fast)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode solo --question 'Retire snippet #115 since child theme owns CSS β€” staging only' --tier 1 --slug retire-115"

Council mode (high-stakes)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode council --question 'Production cutover plan β€” Bricks β†’ callbrightside.com on Fri 5/1 8AM CT' --tier 2 --slug cutover-plan"

Method 3: With Project Ledger context (recommended)

Council reads the live ledger β†’ drift baselines + recent decisions + open items β†’ produces a dispatch grounded in current state.

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/project_ledger.py && python3 /opt/nexus/nexus/scripts/council_runtime.py --mode council --question 'X' --tier 1 --ledger /tmp/project_ledger_excerpt.md"

Method 4: Future β€” Streamlit cockpit on :8506

Phase 2 build. Single-pane-of-glass for review queue + ledger + audit trail. DEFERRED

βš–οΈ

How you decide ship / hold / amend

Every dispatch is saved to /opt/nexus/nexus/scripts/output/dispatches/phase_<ts>_<slug>.md and logged to MH. You see the dispatch + the council reviews. Then:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Read the dispatch markdown β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Council unanimous APPROVE? β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ YES β”‚ NO β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ βœ… SHIP β”‚ β”‚ Read dissent log β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Risks acceptable? β”‚ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ YES β”‚ NO β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ βœ… SHIP β”‚ β”‚ AMEND or β”‚ β”‚ anyway β”‚ β”‚ REJECT β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Three responses you can give Claude Code

🚒
SHIP
"Ship the dispatch" or just "go" β€” I run it end-to-end and report receipts.
πŸ”§
AMEND
"Amend step 4 β€” add a sha256 readback before native-save" β€” I update the dispatch and re-surface for ship.
⏸️
HOLD
"Hold β€” I need to think about this" or "Hold pending Stephanie call" β€” dispatch sits in queue, no execution.
🚨

When things fail (graceful degradation)

FailureWhat happensMitigation
One agent API rate-limited or down Council continues with remaining agents. Dispatch flagged as "partial council." None needed β€” proceed if 3 of 4 agreed. Wait + retry only if dissent matters.
Strategist (Claude Opus) errors out No dispatch produced β€” the runtime aborts. Check ANTHROPIC_API_KEY. Retry. If persistent, fall back to Solo using Gemini-2.5-Pro as Strategist.
Council outputs contradict (3-1 split or worse) Dispatch surfaces with explicit dissent log. Robert decides. Read the minority position carefully β€” that's where the value is.
Execution fails mid-dispatch Abort gate fires per the dispatch's Step N ABORT condition. Rollback runs automatically. I report what aborted + why + current state. You decide retry / amend / abandon.
Two-Failure Stop fires After 2 failed attempts at the same step, runtime stops + surfaces. Don't let me try a third approach without you weighing in. (Apr 24 truncation rule.)
πŸ›‘ Hard rule: Council never auto-executes Tier 2 or Tier 3. Even if all 4 agents APPROVE, Robert greenlights production writes. Period.
πŸ“‚

Where everything lives

PathWhat
/opt/nexus/nexus/scripts/council_runtime.pyThe orchestrator. Runs the council.
/opt/nexus/nexus/scripts/project_ledger.pyGenerates the live state snapshot.
/opt/nexus/nexus/scripts/output/dispatches/All dispatch markdown files (ready to ship).
/opt/nexus/nexus/scripts/output/council/Raw per-agent JSON outputs (audit trail).
/opt/nexus/nexus/scripts/output/playbooks/BSP_Project_Ledger.htmlVisual ledger Robert reads.
/opt/nexus/nexus/scripts/output/playbooks/BSP_Master_Session_History.htmlThe paper trail. Every dispatch = one section.
/tmp/project_ledger_excerpt.mdCouncil reads this on every dispatch (drift + recent decisions).
🎴

Cheat sheet β€” copy-paste these

Refresh the project ledger (do this first thing each session)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/project_ledger.py"

Solo dispatch β€” tactical

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode solo --question 'YOUR ASK' --tier 1 --slug short-name --ledger /tmp/project_ledger_excerpt.md"

Council dispatch β€” high-stakes

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode council --question 'YOUR ASK' --tier 2 --slug short-name --ledger /tmp/project_ledger_excerpt.md"

Read the most-recent dispatch

ssh dovew@34.55.179.122 "ls -lat /opt/nexus/nexus/scripts/output/dispatches/ | head -3 && cat \$(ls -t /opt/nexus/nexus/scripts/output/dispatches/*.md | head -1)"

Pull the most-recent dispatch to Windows for review

scp -i ~/.ssh/google_compute_engine "dovew@34.55.179.122:\$(ssh dovew@34.55.179.122 'ls -t /opt/nexus/nexus/scripts/output/dispatches/*.md | head -1')" C:/Users/dovew/Downloads/
🎯

10 dispatches you'll run in the next 2 weeks

#ModeTierQuestion to feed the council
1soloT1Add hover state on Template 105 nav text-links via functions.php (cyan #30C5FF on hover, navy #1D1760 default)
2councilT2Friday 5/1 production cutover plan β€” Bricks β†’ callbrightside.com, including 301 redirects, GMB ad landing-page swap, 72-hr watch window
3soloT1Wire 4 nav hrefs in Template 105 β€” Services β†’ /plumbing-services/, Service Areas β†’ /map/ (Fix 7), Learning Center β†’ /learning-center/, About Us β†’ /about-us/
4councilT2Fix 7 implementation β€” create /map/ hub page + 301 from /plumber-in-overland-park/ + update CITY_URL_PATTERN
5soloT1Retire snippet #115 β€” child theme now owns the CSS, snippet is redundant
6soloT1Remove op024m duplicate trust-chip row from content tree (cleaner than the CSS-hide hack)
7councilT213-city clone pattern lock β€” replicate OP 258 template across Olathe / Leawood / Shawnee / etc., URL pattern /map/plumber-in-{city}-{state}/
8soloT0Publish Β§40 / Β§41 / Β§42 codebase doc sections to BSP_Bricks_Codebase_Documentation.html
9specialistT0Researcher only β€” pull updated AIO citation rate data for Q2 2026 to update the SEO playbook
10soloT1Wire dateModified schema + Person author byline to first 5 blog articles for AIO citation optimization
🧬

Codebase Plug-in (v1.1) β€” granular line-level requirement

🚨 Mandatory rule baked into all 4 council agents: Every Strategist / Critic / Researcher / Auditor must read the BSP Bricks Codebase Brief before authoring or reviewing a dispatch. Generic familiarity is REJECTED. Auditor flags any dispatch that doesn't cite specific identifiers (file paths, snippet IDs like #115/#163, element IDs like f5a4a5/aa1001, post IDs like 105/106/258).

How it works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ BSP_Bricks_Codebase_Documentation.html β”‚ β”‚ 1.27 MB / 205 headings / 30 sections β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ codebase_brief.py extracts ~16 KB β”‚ β”‚ (~4K tokens) of priority sections: β”‚ β”‚ β€’ intent + architecture overview β”‚ β”‚ β€’ child-theme annotated source β”‚ β”‚ β€’ snippet inventory β”‚ β”‚ β€’ Template 105 / 106 element trees β”‚ β”‚ β€’ failure modes + workarounds β”‚ β”‚ β€’ Apr 21 Canonical Build SOP β”‚ β”‚ β€’ Doc outline + section-ID list β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ /tmp/codebase_brief.md (auto-generated β”‚ β”‚ alongside the project ledger) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ council_runtime.py auto-loads brief β”‚ β”‚ into EVERY agent's prompt: β”‚ β”‚ β€’ STRATEGIST authoring β”‚ β”‚ β€’ CRITIC review β”‚ β”‚ β€’ RESEARCHER fact-check β”‚ β”‚ β€’ AUDITOR cross-check β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What the agents now MUST do

  1. Read the brief in full before authoring or reviewing.
  2. Cite specific identifiers in every dispatch β€” exact file paths, snippet IDs (e.g. #115, #163, #167), element IDs (e.g. f5a4a5 section, aa1001 nav-nested, 3ba269 Call Now button), post IDs (105 header, 106 footer, 258 OP, 157 homepage), schema markup keys, child-theme add_action hooks with priorities.
  3. Confirm which codebase sections were read (by section ID β€” the brief lists all 30 available IDs).
  4. Cross-check against failure-modes never-do list β€” if proposed action is on the list (regex string-replace on production files, force-render Bricks templates without DOM relocation, etc.), REJECT or AMEND.
  5. If brief doesn't cover a code path, name the section ID needed and proceed with explicit assumptions flagged.

How to use it (you don't have to do anything β€” it's automatic)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/project_ledger.py"

That single command now refreshes BOTH the ledger AND the codebase brief. Council picks up both automatically on the next dispatch.

Manual brief refresh (when codebase doc updates)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/codebase_brief.py"

Disabling the brief (debugging / not recommended)

python3 council_runtime.py --mode solo --question "..." --tier 1 --no-codebase

Use this only when debugging the runtime itself. Production dispatches must always have brief loaded.

πŸ“Œ Auditor enforcement: If Strategist authors a dispatch that references identifiers not in the brief (e.g. claims snippet #999 exists when there is no #999), Auditor returns AUDIT_FLAGS HIGH and the dispatch is held until corrected. Hallucinated identifiers don't ship.
🧰

Micro-steps: First-time setup

Before your first dispatch, verify these 5 things. ~3 min total.

1.1

Verify SSH key works

Open a Windows terminal (Git Bash, PowerShell, or any). Run:

ssh -i ~/.ssh/google_compute_engine dovew@34.55.179.122 "echo VM_OK; date; whoami"

Expected: three lines β€” VM_OK, current date, dovew. Takes <3 sec.

If you see "Permission denied (publickey)" β†’ SSH key missing or wrong path. Check ls ~/.ssh/google_compute_engine.

If you see "Connection refused" β†’ VM down. Email/Slack the team.

1.2

Verify the council files exist

ssh dovew@34.55.179.122 "ls -la /opt/nexus/nexus/scripts/council_runtime.py /opt/nexus/nexus/scripts/project_ledger.py"

Expected: both files listed with sizes ~22 KB and ~10 KB.

If missing β†’ tell Claude Code "the council files are missing, redeploy" and I scp them back.

1.3

Verify all 4 API keys exist

ssh dovew@34.55.179.122 "grep -E '^(ANTHROPIC|OPENAI|GEMINI|PERPLEXITY)_API_KEY' /opt/nexus/nexus/config/.env | awk -F= '{print \$1\" len=\"length(\$2)}'"

Expected: 4 lines, each with len= > 30.

If any shows len=0 β†’ that agent will fail. Rotate the missing key in .env before running council mode.

1.4

Generate the first ledger snapshot

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/project_ledger.py"

Expected: ~10 sec runtime, output ends with sha256 hash of functions.php and Template 105 element count = 13.

If element count β‰  13 β†’ Template 105 changed. Regenerate the locked baseline.

If sha256 differs from 22a4da06d76cf7c1 β†’ drift since last verified. Investigate before any write dispatch.

1.5

Test a Tier-0 dispatch (zero risk)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode solo --question 'Test dispatch β€” return a no-op markdown that demonstrates the format' --tier 0 --slug test-noop --no-mh-log"

Expected: ~30 sec runtime, output ends with COUNCIL RECEIPT, Strategist responded with text, dispatch file saved at /opt/nexus/.../dispatches/phase_*_test-noop.md.

If Strategist errors β†’ ANTHROPIC_API_KEY issue or model name change (current: claude-opus-4-5).

--no-mh-log flag means it won't pollute MH with the test.

πŸ“†

Micro-steps: Daily session flow

What to do every time you sit down to work on BSP. ~5 min from sit-down to first dispatch shipped.

2.1

Refresh the project ledger (snapshot live state)

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/project_ledger.py"

Watch for: Template 105 elements: 13 and functions.php sha: <hash>.

Compare hash to last session. Match = no drift. Mismatch = something changed; pause + investigate.

2.2

Read the ledger HTML

Open in browser: https://morpheus.callbrightside.com/documents/BSP_Project_Ledger.html

Or pull to local for offline review:

scp -i ~/.ssh/google_compute_engine dovew@34.55.179.122:/opt/nexus/nexus/scripts/output/playbooks/BSP_Project_Ledger.html C:/Users/dovew/Downloads/

Look for: open dispatches in queue, recent MH sections, drift baselines, snippet census.

2.3

Pick the next dispatch from queue OR Cheat Sheet 10-list

Either grab the top item from the ledger's open queue, or pick from the "10 dispatches you'll run in 2 weeks" list above. Or describe a new ask in chat.

2.4

Tell Claude Code (this chat) what you want OR run the command directly

In-chat (lazy/fast): "I need a T1 solo dispatch for retiring snippet #115"

Direct (when you don't want to wait for me): paste the command from Β§3 below.

2.5

Read the dispatch I produce

Either I show it to you in-chat, or you cat the file:

ssh dovew@34.55.179.122 "cat \$(ls -t /opt/nexus/nexus/scripts/output/dispatches/*.md | head -1)"

Look at: Steps 0-N, every ABORT gate, the Rollback line, the Council Review section if council mode.

2.6

Decide: SHIP / AMEND / HOLD

Tell me one word: ship, amend [what to change], or hold.

If ship β†’ I execute end-to-end.

If amend β†’ I rewrite the dispatch with your change, re-surface for confirm.

If hold β†’ dispatch sits, no execution. Comes back to queue next session.

2.7

Receive receipts

I report after execution: each step βœ“ or βœ—, MH section logged, files written, screenshots scp'd. Read the receipt to confirm what landed.

2.8

Repeat 2.3 - 2.7 for next dispatch

Or end session. The MH paper trail + ledger captures everything; next session picks up cold without losing context.

✍️

Micro-steps: Building a dispatch command from scratch

If you want to run dispatches without Claude Code in the loop, here's how to compose the command yourself. ~60 sec.

3.1

Compose the question (1-2 sentences)

Be specific. Include: WHAT you want, WHERE it applies (staging vs production), CONSTRAINTS.

Bad: "Fix the menu"

Good: "Add hover state on Template 105 nav text-links via functions.php β€” cyan #30C5FF on hover, navy #1D1760 default. Staging only."

3.2

Pick the slug (3-5 words, kebab-case)

This becomes part of the filename. Used for grep/search later.

Examples: nav-hover-state, retire-115, cutover-plan, map-hub-create

3.3

Pick the tier β€” use the decision tree

Does the dispatch only READ data? β”‚ β”œβ”€β”€ YES β†’ TIER 0 (auto-execute, no review needed) β”‚ └── NO β†’ Does it WRITE only to staging? β”‚ β”œβ”€β”€ YES β†’ Has rollback path? β”‚ β”œβ”€β”€ YES β†’ TIER 1 (auto-execute, rollback ready) β”‚ └── NO β†’ upgrade to TIER 2 β”‚ └── NO β†’ Does it touch PRODUCTION? β”‚ β”œβ”€β”€ YES β†’ Reversible? β”‚ β”œβ”€β”€ YES β†’ TIER 2 (Robert approves) β”‚ └── NO β†’ TIER 3 (signed receipt required)
3.4

Pick the mode

  • Tier 0 / 1 (no production impact) β†’ solo usually fine
  • Tier 2 / 3 (production / irreversible) β†’ council always
  • Single-question research (just citations) β†’ specialist with researcher only (TBD wiring)
3.5

Build the command

Template:

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode <MODE> --question '<QUESTION>' --tier <TIER> --slug <SLUG> --ledger /tmp/project_ledger_excerpt.md"

Filled example:

ssh dovew@34.55.179.122 "python3 /opt/nexus/nexus/scripts/council_runtime.py --mode solo --question 'Add hover state on Template 105 nav text-links via functions.php β€” cyan #30C5FF on hover, navy #1D1760 default. Staging only.' --tier 1 --slug nav-hover-state --ledger /tmp/project_ledger_excerpt.md"
3.6

Run it + watch output

Solo mode: ~30s. Council mode: ~2 min.

You'll see: [council] Mode: ..., [council] Strategist done in Xs, then for council, the 3 reviewers running parallel, then === COUNCIL RECEIPT === at the end.

3.7

Read the dispatch

ssh dovew@34.55.179.122 "cat \$(ls -t /opt/nexus/nexus/scripts/output/dispatches/*<SLUG>*.md | head -1)"
πŸ”Ž

Micro-steps: Reviewing a dispatch

What to actually look at when you read a dispatch markdown. ~2 min per dispatch.

4.1

Header check

Top of file: Mode, Tier, Question. Make sure the tier matches what you intended (sometimes the runtime upgrades a tier if the Strategist sees more risk).

4.2

Read "Prereqs already met"

If any prereq isn't actually met β†’ STOP and refresh the ledger first. Don't ship a dispatch with stale prereqs.

4.3

Walk Steps 0-N

For each step:

  • Does it modify state? (yes = real action; no = read-only)
  • What's the ABORT condition? Is it strict enough?
  • Are file paths absolute and correct?
  • Are post IDs / element IDs / snippet IDs accurate vs the ledger?
4.4

Find the Rollback line

Should be a literal command, not a description. Examples:

  • βœ… POST /tmp/template_105_pre_phase2.json to /bsp/v3/bricks/native-save
  • βœ… cp /tmp/functions_baseline_apr24_2042.php β†’ install-child
  • ❌ "restore from backup" β€” too vague
4.5

If council mode β€” read the dissent log

Each agent's section: STRATEGIST / CRITIC / RESEARCHER / AUDITOR.

Scan for: VOTE: REJECT from Critic, FACTUAL_ERROR from Researcher, AUDIT_FLAGS HIGH from Auditor. Any one of these β†’ don't ship as-is.

4.6

Decision

One word reply to me, or run the next command yourself.

🚒

Micro-steps: Shipping (what I do behind the scenes)

When you say "ship X", here's what happens. So you know what to expect in the receipt.

5.1

I read the dispatch from disk

Latest dispatch by slug + timestamp. I parse the steps section into a list.

5.2

I run pre-flight (Rule 0)

Per CLAUDE.md: query MH + Harness + Zeus RAG before any state-changing action. If a recent MH section contradicts the dispatch, I pause and surface to you.

5.3

I execute Steps 0, 1, 2... in order

Per step: I run the action, capture output, check the ABORT condition. If ABORT fires β†’ I stop, run the rollback, surface to you with state.

5.4

I verify with an independent reader

Per Rule 1: the script that performed the change is never the authority on success. After write β†’ I do a read-back, sha256 compare, or Playwright DOM read. Receipt only after that confirms.

5.5

I purge caches if state-touching

LS purge + Cloudflare purge_everything. Standard.

5.6

I log to MH

Section ID: bsp-<date>-<slug>-shipped. Body: 3-Point Gate (Produced / Correct / Persisted). Severity: success / warning / critical based on outcome.

5.7

I report receipts

Bulleted βœ“ list per step. Each item has the literal output (sha hash, byte count, HTTP status). Not paraphrased. If you didn't see the literal output, the receipt is incomplete.

⚠️

Micro-steps: Common errors decoded

SymptomWhat it meansWhat to do
STRATEGIST: error HTTP 401 ANTHROPIC_API_KEY invalid or expired Rotate key in /opt/nexus/nexus/config/.env. Validate at console.anthropic.com
CRITIC: error HTTP 429 OpenAI rate limit hit Wait 60s + retry, or proceed with 3 of 4 agents (still a quorum)
RESEARCHER: error HTTP 400 Perplexity model name changed (sonar-pro deprecated?) Update the model string in council_runtime.py Layer 1
AUDITOR: error 404 "no longer available" Gemini model deprecated. Common β€” Google rotates fast. Update gemini-2.5-pro β†’ next available model in council_runtime.py
MH log: FAIL nexus_html_logger.py couldn't append Check disk space + write permissions on the playbooks dir. Manual log if persistent.
Dispatch saved but very short (<1000 bytes) Strategist hit token limit or got truncated Re-run with smaller question scope, or split into 2 dispatches
readback sha256 mismatch after write Cache wasn't purged before read OR file was modified between write and read Purge LS + wait 5s + read again. If still mismatched β†’ STOP, investigate.
Step N ABORT fires unexpectedly State drifted between dispatch authoring and execution Refresh ledger, re-author dispatch with current state, re-run
Two dispatches in a row fail same step Two-Failure Stop rule fires I halt + surface. You weigh in. Don't let me try a third approach without input.
βͺ

Micro-steps: Rollback procedures by tier

Tier 0 β€” read-only / docs / MH log

No state change β†’ no rollback needed. If MH log was wrong, edit the section directly:

ssh dovew@34.55.179.122 "sed -i 's/old text/new text/' /opt/nexus/nexus/scripts/output/playbooks/BSP_Master_Session_History.html"

Tier 1 β€” staging writes (functions.php / Bricks tree / snippets)

Backup is automatic. Every write writes a backup file at /tmp/<file>.bak_<ts> first.

functions.php rollback

ssh dovew@34.55.179.122 "ls -t /tmp/functions*.bak_* | head -1"

Then re-deploy the backup via install-child:

ssh dovew@34.55.179.122 "python3 -c \"import os, requests; from pathlib import Path; [os.environ.update([l.split('=',1)]) for l in open('/opt/nexus/nexus/config/.env').read().splitlines() if '=' in l and not l.startswith('#')]; AUTH=(os.environ['BRICKS_WP_USER'], os.environ['BRICKS_WP_APP_PASSWORD']); fp=Path('/tmp/<BACKUP_FILE>').read_text(); r=requests.post('https://bricks.callbrightside.com/wp-json/bsp/v2/theme/install-child', json={'functions_php':fp}, auth=AUTH, timeout=60); print(r.status_code, r.text[:200])\""

Bricks tree rollback (Template 105 etc.)

Backup at /tmp/template_<id>_pre_<phase>.json. Re-POST to native-save:

ssh dovew@34.55.179.122 "curl -X POST -u 'USER:PASS' https://bricks.callbrightside.com/wp-json/bsp/v3/bricks/native-save --data @/tmp/template_105_pre_phase2.json"

Snippet rollback

Code Snippets plugin keeps revision history. Or delete the new snippet + recreate the old one from /tmp/snippets_backup_<ts>.json.

Tier 2 β€” production writes

Each dispatch must include its own rollback as a literal command. Tier 2 dispatches get extra: backup BEFORE write, sha256 readback AFTER write. Rollback = re-deploy backup + verify sha256 returns to pre-write hash.

Tier 3 β€” destructive / irreversible

Per definition: not rollback-able. Don't ship without signed receipt + Robert presence at execution.

πŸŒ™

Micro-steps: End-of-session checklist

Before you /clear, close the laptop, or hand off β€” 90 sec.

πŸ’‘ Pro tip: If you /clear Claude Code right after the end-of-session log, next session retrieves the state from MH + ledger + Zeus RAG. No conversation continuity needed.
πŸ”§

Micro-steps: When dispatches feel "off"

Sometimes the council produces a dispatch that's technically correct but misses the point. Here's how to course-correct.

9.1

Symptom: Dispatch is too generic

The Strategist gave you a textbook answer instead of a BSP-specific one.

Fix: Re-run with a more specific question. Add: "in the BSP context", "given current Bricks 2.3.2 state", "given functions.php is at sha <hash>". The more concrete details, the more concrete the dispatch.

9.2

Symptom: Council unanimous APPROVE on something risky

All 4 agreed, but your gut says no.

Trust your gut. Council has blind spots. Specifically: production-impact assessments are weakest because the agents don't see real GA4/conversion data. If your gut says wait, hold the dispatch.

9.3

Symptom: Critic flags HIGH risk you don't think matters

Read the Critic's specific risk. Sometimes it's right ("schema deprecation in Aug 2023"), sometimes it's wrong ("hostinger has rate limits" β€” usually fine).

Fix: If the risk is concrete + cite-able β†’ take it seriously. If it's hand-wavy β†’ discount it.

9.4

Symptom: Researcher says "no data available" too often

v3 + v4 + v5 SEO research all hit this. Sometimes the public record is genuinely thin.

Fix: Don't keep hammering the same question. Either accept "no data" as a finding or design a first-party experiment to generate the data.

9.5

Symptom: Auditor flags a contradiction with prior MH

Means: the dispatch reverses or undermines a prior decision.

Fix: Either explicitly mark the prior decision as superseded (with a new MH section "X-superseded-by-Y"), or amend the dispatch to align with the prior decision.

πŸš‘

When the council fails β€” recovery procedures (the backup plan)

The bulletproof default rule says: build the recovery story BEFORE you need it. If the council breaks, follow these in order.

Symptom 1: Anthropic API 529 / overloaded

Already handled automatically. _retry_post() retries 3x with 5s/15s/30s backoff. If still failing, call_strategist_with_fallback() falls back to GPT-4o. No action needed.

Symptom 2: Gemini Auditor returns empty

Already handled — call_gemini() Pro→Flash fallback fires automatically. If both fail, Auditor returns error message + Critic+Researcher reviews still surface.

Symptom 3: Zeus RAG endpoint (port 8765) down

Council degrades gracefully β€” RAG block notes "service unavailable" + dispatch authors with Protocol Gates + Project Ledger only. Validate Zeus is healthy:

ssh dovew@34.55.179.122 "curl -s http://localhost:8765/api/zeus/stats | python3 -m json.tool | head -10"

Restart if needed:

ssh dovew@34.55.179.122 "ps -ef | grep nexus_daniel_rag_bridge"

Symptom 4: Validation Score returns FAIL_HIGH on a dispatch you expected PASS

This is the system catching a hallucination correctly. Read the FAIL_HIGH detail in the dispatch surface. Common causes:

Symptom 5: A council component (referee.py / auditor_tools.py / validation_score.py) imports broken

All components are independent try/except imports. If one breaks, others still work. council_runtime.py sets *_AVAILABLE = False on import failure and skips that layer with a warning.

ssh dovew@34.55.179.122 "python3 -c 'from referee import classify_scope; from auditor_tools import audit_dispatch; from validation_score import validate_dispatch; print(\"all imports clean\")'"

Symptom 6: Need to bypass a defense layer for debugging

Override flags (use only when debugging council itself, NOT for production dispatches):

--no-gates # skip Protocol Gates pre-load --no-rag # skip Zeus RAG query --no-referee # skip Scope-Boundary Referee --no-mh-log # skip MH logging (dry run)

None of these flags affect Validation Score β€” that always runs. To bypass Validation Score (NOT recommended), edit council_runtime.py to set VALIDATION_AVAILABLE = False.

Symptom 7: council_runtime.py itself has a syntax error / can't run

Locked baseline + git history fallback:

ssh dovew@34.55.179.122 "ls -lat /opt/nexus/nexus/scripts/council_runtime.py.bak* 2>/dev/null | head -3"

Or rebuild from the canonical reference in MH section bsp-apr26-bulletproof-council-v2-architecture-shipped β€” that section lists every file and its size. Zeus RAG retrieves it on demand.

Symptom 8: Production cutover Friday goes sideways

The cutover dispatch authored under bulletproof v2 has its own ABORT gates per step + literal rollback command. See: most recent fri-cutover-final dispatch in /opt/nexus/nexus/scripts/output/dispatches/. The dispatch itself is the recovery doc.

Last resort: full recovery from MH paper trail

Every council dispatch is logged to MH. Every architectural decision is logged to MH. Zeus RAG indexes MH. To recover the entire council from scratch:

  1. SSH to VM: ssh dovew@34.55.179.122
  2. Read MH section bsp-apr26-bulletproof-council-v2-architecture-shipped β€” full file list + sizes + receipts
  3. Read MH section bsp-apr25-bulletproof-default-rule-9 β€” Rule 9 codification
  4. Reconstruct files from git log + BSP_Bulletproof_Council_Architecture_v2.html
πŸš€

Phase 2 (deferred β€” when stable)

πŸ“Œ

What you do tomorrow when you sit down

1

Read the live Project Ledger

https://morpheus.callbrightside.com/documents/BSP_Project_Ledger.html (or run python3 project_ledger.py first for fresh state)

2

Pick the next dispatch from the 10-list above

Or anything else that's on your mind β€” just describe it to me in chat.

3

Give me the ask

"I need a Tier 1 solo dispatch for X" or "Council dispatch for Y" β€” I author + save + show you.

4

Ship / amend / hold

One word back from you. I execute. Receipts to MH. Done.

v1.0 Β· 2026-04-25 Β· BSP Operator Council SOP

Single-page document. No external dependencies. Open in any browser.

Source: BSP_Operator_Council_SOP.html