Loading... Live
NEW · 2026-05-15
Sessions tab now has a per-card pending-tasks dropdown
Click any session card’s “N pending” button to expand the dropdown. Once sync-sessions.sh emits pending_items[] per session, the dropdown will populate with full item details.
Jump to Sessions → Jump to Pipeline (new Meta layer) → Jump to Triage (NEW) →
Command Centre · Status
System Pulse
Live VPS + GitHub push health, schedule glance, and drift watchlist. Refreshes on every page load.
VPS & GitHub Push Status
Schedules At A Glance
Upcoming Tests & Actions
Drift Watchlist
Tools & Apps
Operations · Schedules
Cron & Task Scheduler Inventory
Active, pending, ghost and drift schedules across Windows Task Scheduler + Claude Desktop Scheduled Tasks. Reads from schedules.json (manual update).
Health Check Methodology — how to verify each schedule is alive (click to expand)

1. Windows Task Scheduler entries (SCHED-009 BrainzymeSnapshot, SCHED-011 BrainzymeRetroQueue)

From any PowerShell (admin not required for read-only):

schtasks /Query /TN BrainzymeSnapshot /V /FO LIST
schtasks /Query /TN BrainzymeRetroQueue /V /FO LIST

Healthy: Status: Ready + Last Result: 0 (or 267009 = task running) + Next Run Time in the future. Sick: Last Result non-zero (HRESULT — Google it), Status: Disabled, or Next Run Time: N/A.

Check the artefact each task writes — if the file timestamp is fresh, the cron really fired:

  • BrainzymeSnapshot: F:/brainzyme-git/google-ads-audit/pipeline/latest.json — should update each day ~08:47 (Daily Audit tab also shows last-fetch time).
  • BrainzymeRetroQueue: F:/Claude Root/v4.0/retro-queue.jsonchecked_at field rotates each day ~09:00. Empty due_slugs[] is normal until first chain run is 14 days old.

2. PreToolUse / PostToolUse hooks (SCHED-001 / 003-007 / 010)

These fire while a Claude Code session is running. Verify registration:

/c/Python314/python.exe -c "import json,sys; d=json.load(open(r'C:/Users/PC/.claude/settings.json')); h=d.get('hooks',{}); [sys.stdout.write(f'{k}: {len(v)} matchers\n') for k,v in h.items()]"

Each script logs to its own file when it fires — tail the relevant log to confirm:

  • F:/Claude Root/.claude/sync-pinecone.log — Pinecone auto-sync
  • F:/Claude Root/.claude/banned-copy-gate.log — Banned copy gate
  • F:/Claude Root/.claude/headline-bank-schema-gate.log — Headline bank gate
  • F:/Claude Root/.claude/matrix-lexicon-resync.log — Lexicon resync
  • F:/Claude Root/.claude/shopify-drift-check-{store}.lastrun — Shopify drift cache stamp

If a log hasn't updated in days but you've done relevant edits, the hook may have detached — re-register via settings.json or run the script manually with HOOK_BYPASS=1 to test.

3. Stop hook (SCHED-008 Session backup)

Fires when a Claude Code session ends. Verify backups exist:

ls -lt F:/Claude\ Root/_backups/ 2>/dev/null | head -5

If no recent backups after a known session-end, the Stop hook isn't wired — check .claude/settings.local.json Stop matcher.

4. Remote-trigger routines (SCHED-010 Pages Registry QC)

Fires in Anthropic cloud, not on this machine. Verify via the routine page:

# Open the routine URL from schedules.json -> remote_trigger_url
# Status panel shows: scheduled / running / completed / failed

Successful runs deliver to (a) git commit on the configured repo, (b) Gmail to [email protected]. Email subject prefixed [Brainzyme QC]. Use Gmail filter from:[email protected] to find them.

5. Quick all-systems sweep

One-liner that hits the four artefact paths in order — each line should print a timestamp from today (or yesterday for snapshot before 08:47):

stat -c '%y %n' \
  "F:/brainzyme-git/google-ads-audit/pipeline/latest.json" \
  "F:/Claude Root/v4.0/retro-queue.json" \
  "F:/Claude Root/.claude/sync-pinecone.log" \
  "F:/Claude Root/.claude/banned-copy-gate.log" 2>/dev/null

6. Bypass log (loud-fail audit trail)

Anything bypassed via HOOK_BYPASS=1 appends a dated entry to v4.0/deployment-log.md. Search for BYPASSED there to see if anyone (or any process) skipped a gate.

7. When you change a schedule

Update schedules.json in this repo (google-ads-audit/pipeline/schedules.json) within the same session — that's what this dashboard reads. Cadence per _meta.update_policy: at end of session that touched any schedule. Also update memory/feedback_agent_hooks.md if the change is hook-related.

Active Schedules 0

Pending Activation 0

Scheduled Tests 0

Designed but Not Built 0

Ghost Crons 0

Drift Watchlist 0

Open Architecture Questions 0

Google Ads · Performance
Campaign & Market Overview
Daily snapshot of alerts, market breakdown, top campaigns, and live A/B tests. Feeds from latest.json (daily 08:47 BrainzymeSnapshot) + ab-tests.json.
Alerts
Market Breakdown
Top Campaigns Sessions live in the Sessions tab
A/B Tests — Campaign Experiments

Loading from ab-tests.json

Working Context · Sessions
Active & Ended Sessions
Bank-and-trim model: active files carry only pending + residual context. Auto-sync hook is disabled — run bash .claude/sync-sessions.sh to refresh.
Active (0)
Ended (0)
Creative · Pipeline Map
FLUX 2 Pro → PIL v5 Production Flow
Nine-stage pipeline from research through monitoring — with a new Meta / Self-Improve layer (Dream Review, 3-LLM QC Panel, Supervisor Session, GSD Bridge, Pending Registry) added 2026-05-15. Click any node for file locations, tools, and connected stages.
Memory Architecture
State & Context Network
Pinecone claude01-v2 RAG index + on-disk memory + working-context sessions. Four-node model with bank-and-trim lifecycle.
✓ Kanban auto-sync RE-ENABLED 2026-05-01 — PostToolUse hook now wired to sync-sessions.sh with two prior bugs fixed (unquoted session IDs, pending=00 double-emit). Throttle remains at 60s. Manual refresh: bash .claude/sync-sessions.sh.
Memory & State Architecture
Bank-and-trim model: sessions are lightweight (~25 lines). Completed work is banked to four permanent homes. Only ACTIVE session files are loaded on recovery.
Live State

🛠 Working Context

memory/working-context/_index.md
Lightweight session files (~25 lines). Only pending items + residual context. Completed work banked elsewhere.
Index

📚 MEMORY.md

memory/MEMORY.md
Master index of all memory files. Auto-loaded every session. One-line pointers to every memory file in the bank.
Handover

📦 Handover File

v4.0/source-files/HANDOVER-PENDING-TASKS.md
Emergency recovery doc. If a session dies mid-deploy, a new session picks up from here. Includes startup commands.
Queue

🚀 Go-Live Build Queue

v4.0/go-live-rundown.md
Wave-based deployment order. What to build, what it unblocks, who owns it. Single source of truth for launch sequence.
Logs

📝 Session Logs (x3)

logs/ads_*_log_YYYY-MM-DD.md
Change log, strategy log, technical log. Append-only. Archived to logs-old/ with session suffix on each update.
Permanent

🔒 Creative Vault

config/creative_vault.json
Permanent home for creative findings: FLUX prompts, pose library, guardrails, model routing, product data, regional config.
Boot

CLAUDE.md

F:/Claude Root/CLAUDE.md
Master instructions. Loaded every session. Brand rules, compliance, working context lifecycle rules, post-compaction SOP.

Working Context

Live State — Per-Session Recovery

The working context system saves each active session's state to a dedicated markdown file in memory/working-context/. Each file contains: the session's objective, progress checklist, key decisions, working data (IDs, budgets, account state), and the explicit next action.

When Claude's context window compacts mid-session, the post-compaction SOP (in CLAUDE.md) tells Claude to read _index.md, find the most recent ACTIVE session, load that file, and resume. This prevents the "silent drift" problem where Claude loses track of what it was doing after compaction.

Multiple sessions can run in parallel (e.g., campaign build + creative R&D + social media). Each gets its own file and status (ACTIVE/ENDED). The index shows all of them.

Connects To

MEMORY.md CLAUDE.md Handover File Go-Live Queue

Session Lifecycle (Bank-and-Trim)

CLAUDE.md boots MEMORY.md loaded Read ACTIVE sessions only CREATE session file UPDATE at milestones BANK to permanent home TRIM completed items Update logs (x3) END (~3 lines + pointers)

Four Permanent Homes (where banked data lives)

Creative Vault (config/creative_vault.json) Memory Files (memory/*.md) Deployment Log (v4.0/deployment-log.md) Go-Live Queue (v4.0/go-live-rundown.md)

Post-Compaction Recovery (4-Step SOP)

Context compacts 1. Read _index.md 2. Self-audit (silent) 3. Disclose gaps to user 4. Resume work
Pending-Tasks Triage · Option C discipline
Stop the bleeding without surgery
Three read-only scripts on the existing pending-tasks-registry.md: vague-verb checker, weekly stale-flagger, Calum decision packet. Plus Week 1 fan-out instrumentation: counts TaskCreate dispatches per session. Hook is live; data populates as sessions run.
QUICK START · what to look for
Now that Option C is live, here's the operational rhythm:
CadenceWhat to doWhere to look
DailyGlance at the Triage hero KPIs (top of this tab). If Stale >21d jumps from 0, something is rotting.Hero KPIs above
Weekly (Friday)Open the Calum decision packet section. Each item has a keep / escalate / kill / clarify / do-now recommendation. Action the list in one sitting — that’s the whole point of batching.Section 2 below
Weekly (Monday)Run the 3 scripts to refresh the JSONs. Cron candidate.python tools/triage_pending_tasks.py · calum_decision_packet.py · fanout_summary.py
Per sessionWhen banking, the check_pending_task.py CLI flags vague verbs and missing acceptance criteria. Warn-only for now.python tools/check_pending_task.py --text "..."
What “working” looks like at +14 days:
  • Stale >21d count stays low (ideally ≤5). Means the registry isn’t accreting.
  • Calum-blocked count drops from 24 toward <15 after the first weekly decision packet is actioned.
  • Missing acceptance trends down as new tasks get written with done-conditions (vague-verb prompt fires at bank-time).
  • Fan-out density establishes a baseline — first week is just observation. By week 2 you’ll see which sessions dispatch the most subagents (likely 25, 32, 38). Outlier ≠ bad; outlier + low completion = signal.
Reversibility: all 3 scripts are read-only on the markdown registry. Delete the scripts and unregister the fanout hook from .claude/settings.json — nothing else changes.

Triage report

Loading triage report…

Calum decision packet

Loading decision packet…

Async fan-out density (Week 1 instrumentation)

Loading fan-out summary…

'working-context': { title: 'Working Context', type: 'Live State \u2014 Bank-and-Trim Lifecycle', desc: 'Lightweight session files (~25 lines each) in memory/working-context/. Each contains only: current objective, pending items not yet banked elsewhere, and residual context pointers. Not a full history \u2014 completed work is banked to permanent homes.', detail: 'Lifecycle: CREATE (new session file) \u2192 UPDATE (at milestones) \u2192 BANK (move findings to permanent home) \u2192 TRIM (remove banked items) \u2192 END (3-line summary + pointers). On compaction, Claude reads _index.md and loads only ACTIVE files \u2014 never ENDED ones.', detail2: 'Auto-sync hook \u2014 DISABLED (2026-04-21): The PostToolUse Write/Edit hook (.claude/sync-sessions.sh) that was supposed to auto-generate sessions.json and push to GitHub Pages is disabled pending re-statement. Until it is re-enabled, sessions.json is a manual sync target \u2014 run bash .claude/sync-sessions.sh to refresh the Kanban. The Kanban may be stale at any given moment.

Four permanent homes: (1) config/creative_vault.json, (2) memory/*.md, (3) v4.0/deployment-log.md, (4) v4.0/go-live-rundown.md.', connections: ['MEMORY.md:memory-index', 'CLAUDE.md:claude-md', 'Creative Vault:vault', 'Go-Live Queue:go-live', 'sessions.json:logs'] }, 'memory-index': { title: 'MEMORY.md', type: 'Index \u2014 Auto-Loaded Every Session', desc: 'Master index file that is automatically loaded into every Claude session\'s context. Contains one-line pointers to 35+ individual memory files organised by type: user profile, feedback/behaviour rules, project state, references, strategy, competitors, and more.', detail: 'Each memory file has YAML frontmatter (name, description, type) and focused content. Types: user (who Calum is), feedback (how Claude should behave), project (current state of initiatives), reference (where to find things). Memory files are the long-term knowledge base \u2014 they persist across all sessions and conversations.', detail2: 'Key memory files: feedback_permissions.md (tool auto-approval), pending_tasks_registry.md (check on startup), customer_insights.md (review-based copy), strategic_observations.md (positioning angles), ref-google-ads-full.md (full Ads architecture).', connections: ['Working Context:working-context', 'CLAUDE.md:claude-md', 'Pending Tasks:handover', 'All 35+ memory files:memory-index'] }, 'handover': { title: 'Handover File', type: 'Emergency Recovery \u2014 Cross-Session', desc: 'If a Claude session dies mid-deployment (rate limit, crash, context exhaustion), this file contains everything a new session needs to pick up immediately: pending tasks, completed work, script fixes applied, Python paths, credentials, and a ready-to-paste startup command.', detail: 'Unlike working context (which is for same-session compaction recovery), the handover file is for new session recovery. It includes the exact bash commands to run, which task IDs are done, which are pending, and known warnings to ignore. It also documents all script fixes applied so a new session doesn\'t re-discover the same bugs.', detail2: 'Current source-of-truth pointers: v4.0/go-live-rundown.md, v4.0/deployment-log.md, v4.0/agent-playbook.md, v4.0/campaign-architecture.json. Pending items tracked in the live session files under memory/working-context/.', connections: ['Working Context:working-context', 'Go-Live Queue:go-live', 'Deploy Scripts:logs', 'CLAUDE.md:claude-md'] }, 'go-live': { title: 'Go-Live Build Queue', type: 'Deployment Queue \u2014 Wave-Based', desc: 'The single source of truth for what needs to be built, fixed, and launched. Ordered by priority scoring matrix. Wave 0 (blockers, DONE) \u2192 Wave 1 (quick wins) \u2192 Wave 1.5 (LP compliance) \u2192 Waves 2\u20137 (builds + translations + cleanup).', detail: '38 campaigns total: 18 Search + 20 PMax across UK/DE/FR/US. Budget: \u00A3753/day. Each wave lists: task, priority score, effort, method, status, and who owns it. Campaign unpauses are blocked by Calum answering Q1\u2013Q6 (compliance decisions on ADHD/TDAH/ADHS page rewrites).', detail2: 'Feeds from: priority reconciliation scoring, compliance checklist (traffic light), landing page audit. Feeds into: handover file, deployment log, session working context.', connections: ['Handover File:handover', 'Compliance Checklist:logs', 'Landing Page Audit:logs', 'Deployment Log:logs', 'Working Context:working-context'] }, 'logs': { title: 'Session Logs (x3)', type: 'Append-Only \u2014 Versioned per Session', desc: 'Three parallel logs, each following strict versioning rules: Change Log (every account mutation with reversal instructions), Strategy Log (hypotheses, user decisions, competitive intel), Technical Log (API errors, tool reliability, workarounds).', detail: 'Each session appends a new section. Before updating, the current file is archived to logs-old/ with a session suffix (e.g., _s22). This means every session\'s pre-update state is preserved \u2014 you can diff any two sessions to see exactly what changed.', detail2: 'The strategy log includes a User Decisions & Rationale table (Q1\u2013Q64) that prevents future sessions from re-asking settled questions. The technical log includes a Tool Reliability Matrix that new sessions check before attempting operations.', connections: ['Working Context:working-context', 'Go-Live Queue:go-live', 'Handover File:handover', 'CLAUDE.md:claude-md'] }, 'vault': { title: 'Creative Vault', type: 'Permanent Home \u2014 Creative Findings', desc: 'Single source of truth for all creative configuration: products (4 per market), regions (UK/DE/FR/US with locale-specific rules), guardrails (10 non-negotiable ad copy rules), image generation defaults (FLUX settings, shape lock, pose library), and model routing.', detail: 'This is permanent home #1. When a session discovers new prompt techniques, pose libraries, guardrail rules, or model settings, they are banked here \u2014 not left in the session file. Both batch_generate.py and generate_image.py read directly from this vault at runtime.', detail2: 'Key sections: products (name, slug, price, ingredients per market), regions (locale, currency, disclaimers, tone rules), guardrails (10 rules like no_treatment_claims, no_anti_coffee), image_generation (model routing, FLUX defaults, selfie prompt template, pose library), brand_voice (Poppins, navy, gold tokens).', connections: ['Working Context:working-context', 'Batch Generate:logs', 'Image Gen:logs', 'Template Registry:memory-index'] }, 'claude-md': { title: 'CLAUDE.md', type: 'Boot Config \u2014 Loaded Every Session', desc: 'Master instruction file loaded into every Claude session\'s system prompt. Contains: brand rules, product info, compliance (non-negotiable), tool routing, creative pipeline specs, file locations, working context lifecycle rules, and the post-compaction self-audit SOP.', detail: 'This is the root of all behaviour. It tells Claude who Calum is, what Brainzyme\u00AE is, how to handle compliance, which tools to use for which tasks, and where all key files live. Now includes the working context lifecycle documentation: CREATE \u2192 UPDATE \u2192 BANK \u2192 TRIM \u2192 END, plus the four permanent homes.', detail2: 'Key sections: Session Startup (check permissions, check pending tasks, read only ACTIVE session files), Working Context Lifecycle (bank-and-trim pattern, four permanent homes), Post-Compaction SOP (4-step recovery), Compliance (never claim to treat/cure), Google Ads (CEP protocol, 3x Kill Rule), Creative Pipeline (matching principle, 3-stage production).', connections: ['MEMORY.md:memory-index', 'Working Context:working-context', 'Creative Vault:vault', 'All Reference Files:memory-index'] } }; function showMemDetail(key, evt) { const d = MEM_DATA[key]; if (!d) return; document.getElementById('md-title').textContent = d.title; document.getElementById('md-type').textContent = d.type; document.getElementById('md-desc').innerHTML = d.desc; document.getElementById('md-detail').innerHTML = d.detail; document.getElementById('md-detail2').innerHTML = d.detail2; const conns = document.getElementById('md-connections'); conns.innerHTML = '

Connects To

'; d.connections.forEach(c => { const [label, target] = c.split(':'); const span = document.createElement('span'); span.className = 'md-conn-item'; span.textContent = label; span.onclick = (e) => showMemDetail(target, e); conns.appendChild(span); }); document.querySelectorAll('.mem-node').forEach(n => n.classList.remove('mem-active')); const target = evt && evt.currentTarget && evt.currentTarget.classList.contains('mem-node') ? evt.currentTarget : null; if (target) target.classList.add('mem-active'); }

Key Files

Connects To