session-state.md
ops/session-state.md · last modified Jun 03
✏️ Edit
All Filesops › session-state.md

Session state — gg-cabinet content engine

Picked-up-cold readable. Captures what's deployed, what works, what's pending, and where the next move is.

RELOAD ANCHOR (read this ALONE after a compaction)

  • Brand rules: wiki/business/brand-book/messaging.md (~4.7KB — read in full)
  • Photos: wiki/content/photo_manifest.json (reference by id; do NOT re-read the 600-line gustavs-photo-library.md)
  • Build a carousel: py -3 scripts/build_carousel.py wiki/content/specs/<spec>.yaml (spec = slug + per-slide kind/copy/emphasis/photo-id)
  • Canva: import the carousel PPTX, move design to folder FAHKUT4tGpo
  • Verdicts to honor: wiki/content/feedback.json — reuse used/keep patterns, avoid anything marked crap, follow the note text
  • Dashboard deploy: py -3 scripts/build_dashboard.py --deploy (scp index.html+style.css to /var/www/test.messaging24.com/html/dashboard/)
  • Enhancement plan: docs/superpowers/plans/2026-05-31-carousel-engine-enhancement.md

DAILY-DRIVER STACK — read this for the cabinet (added 2026-06-03)

The cabinet (gg.messaging24.com, Flask landing/cabinet-backend/app.py) is now a daily driver. Deploy = git push hetzner main (preserves only telos/state.json + inbox/). Engine + scripts live in scripts/ (deploy with the cabinet).

  • THE morning brief = scripts/daily_brief.py (Hetzner cron 06:30, sends to Telegram chat TELEGRAM_CHAT_ID=539850894 = Ansis). Unifies: Mayan energy + Scout 3+3 + funnel/ARR + clean priorities/decisions + a daily AI wisdom line. scripts/scout.py runs 06:20 to feed it. The old morning_brief.py cron was replaced by daily_brief.py.
  • Old gotauts stack repointed: gotauts-telegram-bot + gotauts-agents containers had /vault mounted to a frozen April copy (/opt/gotauts/telegram-bot/cabinet) — repointed to /opt/gg-cabinet so they read live data. bot.js's own 06:00 briefing is disabled (commented scheduleDailyBriefing() + rebuilt). docker-compose.yml backed up.
  • Mayan = vendored Node engine scripts/tzolkin/ (NOT gotautscom/tzolkin, which is untracked). Key fns: getDayForPerson, getTrecena/getTrecenaForGustavs (13-day operating cycle), getDeepReading/getDeepReadingForGustavs (deep day+wave+personal panels). scripts/mayan.py shells in (subprocess cwd=scripts/, force encoding="utf-8" or Windows breaks). Wavespell data vendored at scripts/tzolkin/vendor/wavespell-data.js. Tests: cd scripts/tzolkin && node --test index.test.js.
  • /energy = deep daily+wave+personal read + 13-day cycle + Do/Avoid (day & wave). AI wisdom generated once/day → cached inbox/energy/wisdom-<date>.txt (shared by /energy + brief), prompt in scripts/energy_wisdom.py (Gustavs voice).
  • /scout (Opportunity Scout): 3 competitors + 3 product/sourcing finds daily, steerable prefs/feedback under inbox/scout/. Core = scripts/research.py (Gemini google_search grounding) + scripts/scout.py. Clickable history /scout?date=YYYY-MM-DD.
  • CEO agent has a research_web tool (grounded search + saves note to inbox/research/); is energy-aware in its context.
  • /outreach = wiki/content/outreach.json (campaigns + warm + bounced + highlights). Stats are a coverage funnel: Targets · Approached · Emailed · Repeat · Replied · Bounced · No-email.
  • MCP (claude.ai connectors, attended sessions only): Gmail ✅ works; Shopify ❌ token expired (re-auth in /mcp for live sales); Canva/Klaviyo/Figma/GDrive also present. These CANNOT power the unattended 06:30 brief.
  • Python tests: py -3 -m pytest tests/ scripts/tests/ -q (90 passing).

Session log: 2026-06-03 — cabinet became an autonomous daily driver

Massive build day. All deployed to Hetzner unless noted.

Shipped: - ⑤ School Kit purge — D2 + P3 + GOALS milestone + all refs removed across 9 docs (incl. history). Deployed. - ③ Morning brief — root cause: Gustavs's brief came from old bot.js reading a frozen April vault (still had D2). Repointed old containers to /opt/gg-cabinet, disabled bot.js brief, built daily_brief.py as the single autonomous briefer. Also fixed morning_brief.py HTML/400 bug earlier (HTML parse mode + _esc). - ④ CEO agent writes — the 3 create-tools were self-calling CSRF-protected routes (403). Now write directly via _create_person/_create_idea/_append_decision. Deployed. - ①② Mayan — energy engine (/energy), 13-day trecena operating-cycle, deep readings, daily AI wisdom, energy-log + check-in widget, CEO-agent energy-awareness. - ⑥ Opportunity Scout — research core + research_web tool + daily scout + /scout page; cron 06:20. - Outreach — added NYC-collab campaign (55 Gmail drafts for Jun 9–14 trip) + redesigned the stat funnel to coverage columns. - eCOMHUB calendar removed (state.json + DEFAULT_CALENDARS + help text). eCOMHUB-the-business refs kept. - Read Gmail via MCP: funding pipeline is hot (Tradewind positive, Clearco wants a Fri call, Storfund/Uncapped/SLR replied, $10M intake needs docs). Surfaced in the live briefs (msgs 254/260/262/264/265).

OPEN / next session: 1. Gmail App Password/opt/gotauts/.env (GMAIL_USER+GMAIL_APP_PASSWORD) so the 06:30 brief includes inbox highlights without an attended session (hook already built in daily_brief.gmail_highlights). 2. ③A recipient — brief goes to Ansis (539850894). Switch to Gustavs once he taps Start on @gotauts_bot (tg bot work "tomorrow" per Ansis); then set his chat_id. 3. Shopify MCP re-auth → live sales analytics in the brief + fix stale current_arr €13M (real ≈ $3M+/mo). 4. Funding — offered: draft Clearco/Storfund replies (Gmail create_draft) + a consolidated data-room checklist (bank statements, 2024/25 returns, 2025 YTD P&L+BS). 5. Scout competitor extraction sometimes returns 0 (grounded JSON parse) — hardening fast-follow. 6. Deploy-clobber (latent): agent/bot writes to tracked wiki//telos/ are reset on deploy; only state.json+inbox/ survive. Live data lives under inbox/.

Phase 0 verification (2026-05-31, feature/carousel-engine-enhancement)

Verified by reading the real files (several audit claims were stale): - build_dashboard.py = 901 lines, ONE render_dashboard (727) + ONE main (872). No triplication. Cards built by render_drafts (~445) as <details class="draft-detail"> — NO verdict UI yet, NO data-slug. - Deploy = scp -r index.html style.css (NOT rsync --delete). gg-funnel app source = landing/funnel-backend/app.py. - content_agent_run.py = no random.choice; selection is curated (do NOT add stochastic selection). - Canva permission spike (Task 0.5) — OPEN, manual for Ansis: set folder FAHKUT4tGpo share to "anyone with link → can edit", push one design in, check if the contained design inherits "anyone with link". Record canva-inheritance: holds | no-api here. Gates whether Phase 4 Canva autonomy is reachable.

Session log: 2026-05-14 — Personal AI OS shipped (gg.messaging24.com)

The day's milestone: gg.messaging24.com is live as Gustavs's Personal AI OS — Morning Briefing dashboard with live data + working CEO Agent backed by Gemini + Google Calendar integration + cabinet→Hetzner git auto-sync.

Shipped today

The cabinet itself — gg.messaging24.com: - Flask app at landing/cabinet-backend/, port 5002, nginx vhost + LE cert, systemd gg-cabinet.service. Mobile-first navy/gold UI lifted from CEOPIT/GustavsAIOS-DemoUI.html. - Pages: Morning Briefing (/), Goals & Missions (/goals), Calendar (/calendar), All Files (/files + /files-ggim), Business (/business), Ideas (/ideas), People (/people), Decisions (/decisions), AI Agents (/agents), Gmail (/gmail), Telegram Bot (/telegram), TELOS Files (/telos), Inbox (/inbox), File viewer (/file?path=…), Markdown editor (/edit?path=…). - Sidebar reshuffled: Overview (Morning Briefing · Goals · Calendar) — Knowledge Base (All Files · Business · Ideas · People · Decisions) — OS Core (AI Agents · Gmail · Telegram Bot · TELOS Files) — Content Engine (@gotauts Dashboard ↗). - Build marker bottom-left sidebar so cache state is verifiable.

Morning Briefing content: - Today's Kin (from Node tzolkin engine) - 📅 Today's calendar events row — pulled from iCal feeds with 30-min cache - 🎯 Top priority (parsed from GOALS.md milestones, first 🔴 status) - ⚠️ Open Loops (first 3 from DECISIONS.md, "+ N more →" if more) - 📱 Carousel engine status (N drafts / saved / tests, link to @gotauts dashboard) - 📖 Brain Food card (side-by-side with 260-Day Mission): daily quote rotation (30 quotes from Bezos / Jobs / Munger / Naval / Ravikant / Voss / etc.) + daily technique rotation (20 frameworks each with attribution + when-to-use + verified Read more → link) - 260-Day Mission card: ARR progress bar (gold, €13M / €100M = 13%) + time-elapsed bar + 5 milestones from GOALS.md - Alerts banner — only renders when something's broken (cron missed, key missing, carousel empty)

Goals editor (/goals): - Big ARR hero card with inline edit form (sets current_arr + target_arr in telos/state.json) - Milestones table from GOALS.md as inline-editable rows: status dropdown (saves on change), label + deadline inputs (save on blur), delete button per row, add-new form at bottom - API endpoints: POST /api/arr, POST /api/milestone/new, POST /api/milestone/{idx}/update, POST /api/milestone/{idx}/delete

Calendar (/calendar): - 3 calendars pre-seeded in state.json: eCOMHUB · Yourgreenhouses · Personal (Gustavs's Gmail). All as Google Calendar iframe embeds. - Inline form to add/remove calendars. State persists in telos/state.json under calendars. - iCal feeds parsed server-side for the morning brief's "📅 Today" row (private calendars 404 → silently skipped, public ones surface)

CEO Agent — live, Gemini-backed, 9 tools: - Backend: gemini-2.5-flash via Google's generateContent API. Reuses existing GEMINI_API_KEY in /opt/gotauts/.env. - Pre-loaded cabinet context in every request: Day N/260 + Kin + ARR + carousel status + today's events + open decisions + made decisions + recent ideas + MISSION.md + GOALS.md excerpts. Agent answers strategy questions instantly without read_file calls. - 9 tools available: add_person, update_person, delete_person, add_idea, log_decision, complete_decision (smart-match by D-label or title substring), set_arr, search_wiki (greps wiki/ + telos/), read_file (sandboxed) - Right-column chat input on every page. Captures raw message to inbox first (failsafe), then runs agentic loop up to 4 rounds. - Voice button (hold-to-record) → POST /capture/audio → saves webm/ogg + transcript when OPENAI_API_KEY set, else pending stub.

Knowledge base (wiki/) content created or expanded: - wiki/business/_index.md — three-businesses overview (YGH + eCOMHUB + @gotauts) with AI-implementation cross-ref - wiki/business/ai-implementation.md — exhaustive state-of-AI doc, kept current - wiki/founder/ — 9 files: founding-story (15-year father arc + Europe/US gap context) · timeline · quotes (42 verbatim) · anecdotes (20 recurring) · numbers · visual-broll · philosophy · gaps · _index - wiki/content/viral-mechanics.md — 12 rules + retention math distilled from research/

Cabinet → Hetzner auto-sync: - Bare repo at /opt/gg-cabinet.git + post-receive hook on Hetzner - Local git remote hetzner at ssh://root@204.168.179.124/opt/gg-cabinet.git - git push hetzner main = full deploy. Hook preserves state.json + inbox/ + .venv/ + outputs/ + GGim/ across deploys - Full docs in ops/DEPLOY.md - telos/state.json and inbox/ now .gitignored so my pushes never overwrite user data

Morning brief cron (Telegram, separate from web cabinet): - scripts/morning_brief.py — daily 06:30 Riga cron on Hetzner. Pushes Kin + last-24h leads + top draft + Canva link to Gustavs's Telegram chat (reuses gotauts-telegram-bot token).

Open follow-ups (in priority order — pick up next session)

  1. Wire today's calendar events into the Telegram brief — cron version still shows just Kin + leads + draft. Same iCal feed function exists, just need to call it from morning_brief.py.
  2. Pass 2: AI research prompt generator for decisions — when you log a decision, button to have Gemini draft a tailored research prompt. Track this against task #19.
  3. CEO Agent: voice in/out — voice button captures + saves but doesn't speak back. Needs OPENAI_API_KEY for Whisper + a TTS endpoint (ElevenLabs / Google / OpenAI TTS).
  4. Streaming responses — agent replies all-at-once today. SSE/streaming would feel snappier.
  5. Tighter Gustavs-voice in system prompt — load top quotes from wiki/founder/quotes.md into context. Currently has 5 inline principles.
  6. Knowledge Compiler — cron that processes /opt/gg-cabinet/inbox/ files, classifies via Claude Haiku (or Gemini), routes into the right wiki folder.
  7. Gmail integration/gmail is a placeholder with the safety-first design doc. Wire it with App Password + IMAP + strict deny-list.
  8. Market Scout — watches competitors (GreenDome etc.) on a schedule, surfaces signals.
  9. Pre-existing follow-ups from 2026-05-13 still open: email provider (Resend), sending domain verification, Loom walkthrough, ManyChat wiring, image-gen MCP for R4 wealth-style, content-engine cron + button (Phase 2 #2 + #4).

Live state on Hetzner

  • Cabinet service: gg-cabinet.service, systemd, port 5002, healthy
  • Public URL: https://gg.messaging24.com/ (Let's Encrypt cert, auto-renew)
  • ARR: €13M of €100M (13%) in telos/state.json
  • 3 calendars in state.json (eCOMHUB · YGH · Personal)
  • 4 inbox captures + 26 carousel drafts
  • 2 made decisions (D1), no open decisions
  • GEMINI_API_KEY confirmed live in /opt/gotauts/.env (loaded into gg-cabinet's systemd env)
  • Build marker 1500+ (changes per restart)
  • All Phase-1 follow-ups from 2026-05-13 still relevant, plus the new ones above

Resumption protocol — next session

  1. Drop into chat: Resume from ops/session-state.md
  2. Confirm the cabinet still loads: curl -s -o /dev/null -w '%{http_code}\n' https://gg.messaging24.com/
  3. Pick the next follow-up — probably #1 (today's events in Telegram brief) or #2 (decision research prompt).
  4. Deploy is one command: git push hetzner main.

Session log: 2026-05-13 — viral aesthetics + dashboard restructure

Shipped today

Photo automation: - wiki/content/gustavs-photo-library.md — 75 photos in GGim/Pictures/ tagged by 5 parallel vision subagents. 27 usable (gustavs-solo / with-audience), 48 excluded. last_reviewed_by: gustavs. - scripts/pick_photo.py — scoring picker. CLI + library. Reads catalog, scores entries against archetype (A1/A2/A3/A6) + mood_hint + headline-zone + emphasis-color compatibility. - render_carousel.py + render_carousel_pptx.py support BACKGROUND_IMAGE: auto plus ARCHETYPE_HINT + MOOD_HINT slide fields.

Composites: - scripts/compose_cover.py — viral composite generator (before/after, triptych, 2x2 grid, diagonal). PIL-only, no image-gen MCP needed. Demos in outputs/composites/.

Viral aesthetics (3 + 4 + 5 = 12 new carousels pushed today): - scripts/viral_covers.py — covers, body slides, CTAs for 8 distinct styles total: - v1: magazine (FOUNDER mock), screenshot (Stripe/iMessage cards), newspaper (THE FOUNDER halftone) - v2: twitter thread, document (annotated ledger), notebook (yellow legal pad), quote (Naval-style typography), polaroid (kraft corkboard photo dump) - scripts/build_viral_carousels.py — content + render pipeline for the original 7 (c1-c7) - scripts/build_viral_v2_carousels.py — content + render pipeline for the new 5 (c1-c5) - scripts/assemble_viral_pptx.py — wraps image-only slides into a PPTX (no native text frames; design IS the message)

Dashboard restructure: - New sections: Tests (default, ~22 entries) and Our Saved Concepts (promotion via saved: true frontmatter flag — currently empty by design) - private? warn badge on every Canva link until canva_link_public: true flag is set in draft frontmatter - Persistent Canva-share callout in Saved Concepts section - KPI base flipped: "Drafts in pipeline" → "Saved concepts" - cover_image_path frontmatter override so viral-test JPGs at outputs/viral-tests*/c*-*/slide-01.jpg resolve cleanly - Both PNG and JPG covers supported

Bulletproof renderer: - render_carousel_pptx.py cover text frame extended from 460px → 880px (bottom-anchored, y=120, h=880). Fixes the H8-v3-style Canva-import cropping. Hook covers also get a word-count warning above 12 words.

Canva infrastructure

  • Shareable folder created: FAHJiE-eEZM ("@gotauts — public-edit (gg-cabinet pushes)") — https://www.canva.com/folder/FAHJiE-eEZM
  • All 19+ recent designs auto-moved into the folder via move-item-to-folder MCP calls
  • Open hypothesis: Canva folder-permission inheritance onto contained designs — Gustavs needs to test once (set folder share to "anyone with link → can edit", then verify a contained design now says "anyone with link"). If inheritance works, every future push is born public. If not, the folder still centralizes for fast manual flipping.

Workflow rules now in effect (memory-backed)

  1. Every import-design-from-url push MUST follow up with move-item-to-folderFAHJiE-eEZM.
  2. Surface the per-design URLs + manual share-flip instruction in the response message to Ansis after every push.
  3. After Ansis flips share permission, he adds canva_link_public: true to the draft frontmatter so the dashboard badge clears.

See: ~/.claude/projects/.../memory/feedback_canva_pushes.md for the canonical rule.

Saved memories added this session

  • gustavs_photo_library_and_picker.md
  • compose_cover_viral_composites.md
  • feedback_canva_pushes.md (expanded with the folder-auto-move workflow)
  • viral_covers_test.md

Open follow-ups (in priority order)

  1. Verify Canva folder-permission inheritance — Ansis tests on folder FAHJiE-eEZM. If it works, every future push is automatically public.
  2. Promote keepers from Tests → Saved Concepts — Ansis reviews the 22 tests, marks winners with saved: true in frontmatter, redeploys dashboard.
  3. First in-market carousel post — pick from the v2 viral set or the Caleb-pattern H5/H8 set, post on @gotauts, gather performance data.
  4. Sync cover_image_path review with Gustavs — he hasn't seen the 5 v2 styles yet (twitter / document / notebook / quote / polaroid). Schedule a 10-min walkthrough.
  5. Existing follow-ups unchanged from prior sessions: email provider for gg-funnel, Loom walkthrough, ManyChat NUMBERS wiring, image-gen MCP for R4 wealth-style (now partially solved by compose_cover.py for personal-arc composites — full wealth-grid still pending).

What's running in production

Hetzner box 204.168.179.124 (cpx22, Ubuntu 24.04)

  • SSH as root (key-auth from this Windows machine works)
  • nginx 1.24 with 3 sites:
  • gotauts (proxy to localhost:3000 — gotauts-cabinet Next.js app)
  • yourgreenhouses (proxy to localhost:8501)
  • test.messaging24.com (static + /api/ proxy + /dashboard/)
  • certbot 2.9 — Let's Encrypt cert for test.messaging24.com auto-renews
  • 3 Docker containers (existing, unrelated to engine):
  • gotauts-cabinet (Next.js admin UI — separate project, port 3000)
  • gotauts-agents (FastAPI — port 8000)
  • gotauts-telegram-bot
  • 1 systemd service we own:
  • gg-funnel — Flask app at /opt/gg-funnel/app.py, port 5001 (not exposed; nginx proxies /api/ to it)

Public URLs (test.messaging24.com)

URL Purpose Status
https://test.messaging24.com/ NUMBERS form landing page live
https://test.messaging24.com/tracker/ tracker preview page live
https://test.messaging24.com/tracker/tracker.xlsx Excel template download live
https://test.messaging24.com/api/numbers POST endpoint for form submits live
https://test.messaging24.com/api/health health check live
https://test.messaging24.com/dashboard/ content engine dashboard (no auth currently) live

Server-side files (Hetzner, paths to remember)

  • /opt/gg-funnel/app.py — Flask backend
  • /opt/gg-funnel/.venv/ — Python venv with Flask installed
  • /opt/gg-funnel/leads.md — canonical lead capture file (synced to local on dashboard build)
  • /opt/gg-funnel/email-queue.jsonl — emails queued because no provider yet
  • /etc/systemd/system/gg-funnel.service — systemd unit
  • /var/www/test.messaging24.com/html/ — static web root
  • /etc/nginx/sites-available/test.messaging24.com — nginx vhost (HTTPS via certbot lines)
  • /etc/nginx/.htpasswd-dashboard — dashboard basic auth (currently NOT enforced)

DNS

  • test.messaging24.com A record → 204.168.179.124 (Namecheap cPanel zone editor for messaging24.com)
  • messaging24.com zone hosted on dns1/dns2.namecheaphosting.com
  • Hetzner local DNS cache flushed once during DNS work; future flush via systemctl restart systemd-resolved

Approval state — Gustavs has signed off on

11 cabinet files flipped from last_reviewed_by: pending-gustavs to gustavs (commit see git log). Files: brand-book/{about,icp,offers,messaging}.md, hooks.md, archetypes.md, prompt.md, content-engine.md (SOP), and the 3 freebie/* files.

Brand book is locked. Visual references locked. Voice DNA locked.

Visual references catalog (wiki/content/visual-references.md)

  • R1 — Caleb Watson ("I BEAT CANCER 3 TIMES") — personal arc + cover-dominant + restraint. Implementable now: photo full-color, ALL CAPS bottom-anchored headline, lime emphasis, black stroke for legibility, vertical gradient on bottom half. Confirmed in production renderer (PIL + PPTX both updated).
  • R2 — AJ Ellison (IFBB pro at 50) — authority + specific count + trust-hack. Same renderer as R1.
  • R3 — Gustavs's own ($1M+ MONTH) — receipt-driven A1 archetype.
  • R4 — @wealth grid — composite-imagery + bottom yellow headline. NOT implementable yet: requires AI image generation (Codex CLI / GPT-Image-1 / Midjourney) for multi-photo composites. Phase-2 task. ~4–6 hours integration when ready.

Hook batches generated

  • wiki/content/drafts/queue/proposed-hooks-2026-05-05.md — batch 1, 7 hooks, 7 of 8 formulas (skipped H5)
  • wiki/content/drafts/queue/proposed-hooks-2026-05-06.md — batch 2, 7 hooks, includes H5 first-test. First batch reading visual-references.md.

Both batches: mix 2/4/1 (Validator/Operator/Scaler), within ±10pt of 30/50/20 target.

Draft ID Hook Persona Slides Canva v2 (current) Canva v1 (dimmed, archived)
2026-05-05-h1-bad-day-narrative H1 Operator 8 https://www.canva.com/d/MyVRhpiwA9Rqs72 https://www.canva.com/d/ToXeOQxN2TqTXFh
2026-05-05-h1-bad-day-narrative-receipts H1 Operator 8 https://www.canva.com/d/OmrYdgHQ_nkU5fM https://www.canva.com/d/LFpOs8kLs0E-Oks
2026-05-06-h5-discounts-vs-aov H5 Operator 7 https://www.canva.com/d/T9lKnXX2dGtXFkP https://www.canva.com/d/98etz_SZt_NrH0a
2026-05-06-h8-cashflow-not-roas-protocol H8 Operator 8 https://www.canva.com/d/JltNuDfQsYz9QXh https://www.canva.com/d/XYdmFwP4VNOlYvH

H5 + H8 are the strongest Caleb-pattern fits and the recommended "ship first" picks once we go live on @gotauts.

Pending decisions (open gates)

Gate Owner Action Blocks
Email provider Gustavs/Ansis Pick Resend or other, get API key, add as RESEND_API_KEY to gg-funnel.service env Real emails sending. Currently queued to /opt/gg-funnel/email-queue.jsonl. From-address placeholder: gustavs@gotauts.com.
Verify sending domain Ansis Add Resend DNS records to gotauts.com (or messaging24.com) Email deliverability
Loom walkthrough Gustavs Record 90-sec walkthrough of the tracker; URL → wiki/content/freebie/numbers-tracker.md loom_walkthrough_url Better UX in tracker preview page (pasted into landing/tracker/index.html LOOM_URL_PLACEHOLDER)
First carousel post Ansis Export H5 or H8 from Canva v2 → schedule via Meta Business Suite First real lead, first perf data
ManyChat (last) Ansis Wire NUMBERS comment trigger → /api/numbers POST Auto-DM funnel automation
Image-gen MCP Ansis Pick image-2.0 provider; add MCP integration Wealth-style (R4) carousels, A6 archetype

Phase 2 build queue (when ready, in order)

  1. Sync cabinet to Hetzner — git remote on Hetzner, so dashboard build can run server-side via cron
  2. Cron the dashboard build — every 5 min, no more manual --deploy
  3. Cron the perf pullscripts/meta_insights_pull.py nightly via Hetzner cron once we have IG posts to pull from
  4. Dashboard "Generate next batch" button — small Flask endpoint on Hetzner that runs content_agent_run.py server-side; cabinet on Hetzner; ANTHROPIC_API_KEY in env. ~50 min build.
  5. Image-gen MCP for R4 wealth-style. ~4–6 hours.
  6. Approval workflow buttons in dashboard — flask endpoints to flip frontmatter, commit, refresh. ~45 min.

Local commands cheatsheet (for resumption)

# From the cabinet root, refresh dashboard from current state
py -3 scripts/build_dashboard.py --deploy

# Generate a new hook batch (needs ANTHROPIC_API_KEY)
ANTHROPIC_API_KEY=sk-ant-... CABINET_PATH=. py -3 scripts/content_agent_run.py

# Render a draft to PNG previews
py -3 scripts/render_carousel.py wiki/content/drafts/<draft_id>.md

# Render a draft to editable PPTX (push-to-Canva ready)
py -3 scripts/render_carousel_pptx.py wiki/content/drafts/<draft_id>.md

# Bundle PPTX + upload to catbox (gives public URL for Canva import)
curl -sS -F "reqtype=fileupload" -F "fileToUpload=@<path-to-pptx>" https://catbox.moe/user/api.php

# SSH to Hetzner
ssh root@204.168.179.124

# Tail funnel backend logs
ssh root@204.168.179.124 'journalctl -u gg-funnel -f'

# Tail nginx access log for tracker downloads
ssh root@204.168.179.124 'tail -f /var/log/nginx/test.messaging24.com.access.log'

Spec + plan locations

  • Spec: gotautscom/docs/superpowers/specs/2026-05-05-gotauts-content-engine-design.md
  • Plan: gotautscom/docs/superpowers/plans/2026-05-05-gotauts-content-engine.md

(Both in the gotautscom/ inner git repo, not the gg-cabinet outer one.)

Resumption protocol for the next Claude session

When you start a new session, drop this into the first message:

Resume from ops/session-state.md. Read it before responding. Then we continue.

That + claude --continue should pick up cleanly. If --continue history is lossy, the session-state file is sufficient on its own.

👔
CEO Agent
Ready
I can add people, log decisions, save ideas, and read any cabinet file. Try: "add me as CEO of YGH", "log decision: school kits build or partner by May 30", or "save idea: rep gifting tour for greenhouse kits". I'll write to the right file and confirm.
now