Client Docker Template — Workstream Brief

Workstream Brief

Client Docker Template

The one thing every paying client gets a copy of. Each client lives on their own self-contained Docker stack: WordPress, MariaDB, a Python AI agent, and a Traefik router. We run the infrastructure. They run their business.

Source cards 82 decision + 50 build
Canon domains 5
Status today One live, blocker on clone 2
Updated 26 May 2026
Section 1

Executive summary

The Client Docker Template is the pristine recipe every paying coach is cloned from. One Docker Compose stack per client, isolated by database, volume and network. Inside the stack sit four core services — WordPress, MariaDB, the Python AI agent, and Traefik — plus the white-labelled Fluent suite and roughly two dozen must-use plugins that handle branding, audit, agent routing and security.

The template lives on the shared Hetzner host gg-client-template (178.105.123.133). Demo.guidancegate.com runs there today as the canonical reference. The reference is built, sanitised, monitored, and a clone tool exists and has been tested.

What is locked

  • One Docker Compose stack per client on a shared host (ratified R2, Paul 2026-05-17).
  • Stack composition: WordPress + MySQL/MariaDB + Python FastAPI agent + Traefik.
  • Each coach gets their own AI assistant on their own stack — not one shared engine with personas (supersedes earlier proposal).
  • Provisioning is an N8N-orchestrated clone of the pristine template, not a from-scratch build. Booking hashes and automation IDs survive (ratified D9, Paul 2026-05-17).
  • Client owns their data. All client business data lives in the client’s own MariaDB — never in GG central Postgres (ratified D7, Paul 2026-05-17).
  • MariaDB is the database target. Live demo is still MySQL 8.0.46 pending staging-proven migration (ratified D2, Paul 2026-05-17).
  • Every trial is a full per-client stack for 30 days (ratified D12, Paul 2026-05-17).

What is open

14 questions and 9 drifts between Canon and RMM-reality. The biggest is the multi-tenant Compose blocker: container_name and host-port collisions mean no second stack can stand up alongside Sarah Johnson’s on gg-client-template until the shared Traefik refactor is executed. That is the only thing blocking clone 1 going live and the same thing blocking Seth.

Why this brief exists

The template is the production line. Every future client is a Xerox of it. Get it wrong here and the mistake replicates 30 times. Get it right and provisioning becomes an N8N button. This brief is the joint reference point so Sam and Paul are looking at the same picture before the next sign-off.

Section 2

North star principles that govern the template

Architecture diagram, real developer workspace

Seven principles — lifted verbatim from brief #42 and the canon principles file — constrain every choice on the template. They are not negotiable for this build.

Client operates, we run the infrastructure

The client posts, edits, and sends. GG handles servers, DNS, SSL, backups, and security. The client never sees a terminal.

Client owns their data

All client business data lives on the client’s own Docker stack — their WordPress install, their MySQL database, their gg_client_fields table. Export is available any time, no questions asked. Retention comes from genuine value, not from lock-in.

White-label everything

The client sees their own brand and “GuidanceGate Business Platform.” They never see WordPress, Fluent, or any vendor name. All Fluent plugins are rebranded.

Boring bedrock, smart application layer

WordPress, Linux, Apache, and MySQL are the stable foundation. The AI agent layer is deliberately replaceable. If Anthropic disappears, the client’s site still works.

Open and scriptable beats closed and visual

Every tool and interface must be drivable end-to-end by AI. This rules out Divi, Elementor, and any proprietary binary format.

Single source of truth, queryable by AI

Each client’s gg_client_fields table is the single source of truth for that client’s business data. GG’s central Postgres holds fleet and ops only.

Every system debuggable by Claude unattended

Structured logs, health endpoints, and AI-readable error messages are mandatory. The bar is: Claude should be able to diagnose any issue at 3am with nobody online.

We dogfood

GG runs the same stack it sells. Sam’s Rhythm Mastery Method drum business is the first real client on the new stack. The demo.gg deployment (running as Sarah Johnson Coaching) is the active dogfood deployment.

Authority hierarchy

The deployed demo.gg Docker stack is ground truth for what currently exists. On a factual question about current state, the built and deployed evidence wins (ratified R5, Paul 2026-05-17). Brain decisions are the source of truth for what GG intends. Recency rule: on conflict, the later decision or build supersedes the earlier one.

Section 3

Architecture — per-client server model

Each client gets one Docker Compose stack on the shared gg-client-template Hetzner host (cx23, 2 vCPU / 4 GB / 40 GB). All client stacks share the host; inter-client isolation is provided by Docker — separate databases, volumes and networks per client. They cannot see each other’s data.

The four core services in every stack

ServiceWhat it isToday’s reality
wordpress Apache + PHP 8.3. The client’s website, admin interface and every coach-facing UI surface. Live on demo.gg.
db MariaDB 11 LTS is the ratified target. MySQL 8.0.46 is the deployed reality. The client’s own database; business data never leaves this container. Deployed as MySQL 8.0.46. Migration to MariaDB tracked — must be proven on staging first (D2).
agent Python / FastAPI on port 8000 internal. The client’s persistent AI partner. Not Claude Code CLI. Not a WordPress plugin. Skills are markdown files in the container. Live on demo.gg as the docker-agent image. 11 skills loaded.
traefik TLS termination and subdomain routing. Currently co-located in the per-client compose; the target is a shared platform Traefik in front of all stacks. Co-located today — this is the multi-tenant blocker (see Section 9).

The data architecture

Three tables matter on the client’s own MariaDB:

  • gg_client_fields — the key-value store managed by the gg-client-fields mu-plugin. All 251 business fields for a coaching practice live here. The bot reads and writes through gg_field() / gg_field_set() helpers. This is the single source of truth for that client’s business data.
  • gg_activity_log — logs logins, post edits, bot interactions, field writes by actor, action_type, timestamp and context. Queryable by Sage Shepherd when composing emails, and by the coach if they want to see what the bot did.
  • agent_threads / agent_messages / agent_audit / agent_pending — four tables created by the Python agent for chat history, tool use, and the staged-confirm pattern. Audit logs redact sensitive fields.

The central GG Postgres on gg-staff holds fleet and ops data only: heartbeats, status pings, brain_sync messages. It never holds client business data. NocoDB on gg-staff is an internal ops read-only UI for Paul and Sam — it is not in the client data path and not installed on any client stack.

The heartbeat

Each client’s stack pushes a daily status row to the central Postgres: client_id, current_stage, tasks_done_this_week, last_login, last_activity_timestamp, stuck_flag, active_batch, pipeline_count. That is the entire payload — status only, no business data. Sage Shepherd reads these heartbeats to triage which clients need a check-in email. If a heartbeat is older than 25 hours, Shepherd flags it and skips that client’s email for the day rather than silently using stale data.

The host topology

  • gg-staff (178.105.115.0, cx33) — the operations server. Brain app, Postgres, N8N, NocoDB, Traefik, Uptime Kuma, Playwright, Sam’s Claude Code. Not client-facing.
  • gg-client-template (178.105.123.133, cx23) — the client hosting host. Runs the canonical demo.gg stack today. Will hold every future client stack as additional Docker Compose projects on the same host.
  • Paul VPS (76.13.253.221) — Paul’s Claude Code, Caddy, off-site restic backup destination, MainWP. Not a client host.

No sandbox host exists. Decision #100 (three-Hetzner-server architecture) is an unratified proposal only.

Architecture: real developer workspace
Section 4

The three bots

The three bots — interfaces and roles

Three distinct bot roles. Two of them live on the client’s own stack. The third (Sage Shepherd) runs centrally on gg-staff and is therefore out of scope for this template — flagged here so nobody assumes it ships in the clone.

Merlin — the intake interviewer

Merlin is the runtime AI assistant that lives on every client stack. On the per-client Docker stack, the WordPress plugin gg-merlin is the thin front-end widget: it enqueues merlin-chat.js and routes to /agent/* where the Python FastAPI agent handles all bot logic. The PHP engine files inside gg-merlin (Engine.php, PromptBuilder.php, Anthropic.php, ToolHandler.php) are physically present but bypassed at runtime — inert, not formally deactivated, not deleted.

Merlin runs the Stage 1–2 offer-clarity interviews and writes every answer into gg_client_fields. He always offers two paths — “do it for you” or “show you how” — and teaches with breadcrumb-style navigation (ratified D8, Paul+Sam 2026-05-17). Model: Sonnet default, Haiku only for validated simple lookups, Opus reserved for premium. Max 5 agentic iterations per message. Rate limit: 50 messages/hour per client.

Client Bot / Maestro — the coach’s admin partner

Same Python agent, different surface. The persistent chat widget on every WP admin page. Reads and writes the Fluent plugins through tools registered in app/tools/registry.py. Builds pages by assembling from a library of around fifteen pre-built section types with 2–3 variants each, never from a blank canvas. All writes are human-gated: the staged-confirm pattern issues a confirmation card and the coach taps Confirm before any field is saved.

Pages are low-stakes, infrastructure is load-bearing. A broken page gets edited. A corrupted contact database or a broken WP stack requires recovery time and damages trust irreparably. — from card #104, Authority Limits & Guardrails

The hard-no list (cannot be unlocked, ever)

  • Charge or refund a payment method.
  • Delete a contact, tag, or list permanently (soft-delete only).
  • Send email to more than 5 recipients without explicit per-message confirmation.
  • Modify payment configuration, pricing, or checkout settings.
  • Edit legal pages (Terms, Privacy, Refund).
  • Modify WordPress core files, plugin files or theme structure files.
  • Modify database schema (no CREATE TABLE, ALTER TABLE, DROP TABLE).
  • Add or remove WordPress users, or change user roles.
  • Change any server-level configuration (nginx, PHP-FPM, cron, firewall).

Sage Shepherd — not in this template

Shepherd is the accountability layer for the 60-day programme. It runs centrally on Sam’s server. It reads the heartbeat table, classifies clients (STUCK / BEHIND / ON_TRACK / JUST_JOINED / POST_60), and drafts emails as Sam for review. Three-beat weekly rhythm: Monday batch, conditional Wednesday nudge, Friday summary.

Sage Shepherd has no chat interface, no widget, no client-facing API. Clients never interact with Shepherd directly. They receive emails that appear to come from Sam. Shepherd does not ship on the client template — nothing about Shepherd needs to land in the Docker stack. Build state checked live 21 May: nothing of the Sage Shepherd model is built — no Shepherd service, cron or workflow on the ops server.

Section 5

Skills architecture

Skills are interviews and playbooks, not code. They live as markdown files at /app/skills/*.md in the Python agent container’s git repository. The loader (~20 lines, app/skills/loader.py) globs every .md file at startup — no code changes are needed to add a skill. This replaces the role that the old gg-skills-config WordPress plugin previously held.

How a skill runs

  • Coach asks the bot to do something (“build me a testimonials page”).
  • Bot picks a skill from the library, loads it, and follows the script.
  • Skill reads fields from gg_client_fields, assembles HTML from a tested pattern, and proposes the result.
  • Staged-confirm: bot shows a confirmation card; coach taps Confirm before anything is saved.
  • Activity logged to gg_activity_log.

Model routing

ModelWhen it’s used
HaikuValidated simple lookups, standard Monday batch emails, mechanical data substitution. Cheap; default for vetted skill runs.
SonnetDefault for creative or complex work — page builds, copy generation, anything that requires judgement.
OpusReserved for premium tier or escalation only. Not the default.

Clients never see model names, token counts, or per-request costs. They see “your AI assistant.” Routing happens behind the scenes. Skills are not paywalled: the revenue model is the flat monthly subscription. Token cost is driven down by skills; there is no per-skill charge or model picker for clients.

Budget & metering

Budget is tracked in cents, not tokens. One pool covers Sonnet + Whisper. Internal cap is $4/month per client ($5 of the $97 subscription allocated; $1 margin). Typical usage runs $2–3/month. The client sees a daily message count and a simple counter — not raw token numbers. The gg-token-budget WP plugin (v2.0.0, must-use, present on the stack) is currently unwired to the Python agent; this is an open reconciliation item between decision #48 (WP plugin tracks tokens) and decision #71 (agent tracks cents).

The agent capability rule

Agent capabilities are additive-only, explicitly granted, never implicit. The Python agent starts with zero tools. Each capability is a deliberate addition. Clients interact through a locked room with specific doors — nothing is available by default (ratified Paul, 2026-05-17).

Section 6

Provisioning pipeline

Provisioning pipeline — terminal and automation

Provisioning is fully automated and zero-touch. The target chain from payment to live stack: 2–5 minutes, no human in the loop, no client action required.

The N8N chain

  • Payment (or trial signup) fires an N8N workflow on gg-staff.
  • N8N clones the pristine template stack on gg-client-template via docker compose up.
  • Four containers come up: WordPress, MariaDB, Python agent, Traefik.
  • N8N sets site identity — subdomain, admin user, GG default brand. No client-specific brand data at this step.
  • Traefik auto-routes a GG subdomain (firstnamelastname.guidancegate.com) with auto-SSL.
  • Coming Soon page set as homepage.
  • Stack registered in Uptime Kuma (monitoring) and MainWP (fleet plugin updates).
  • Playwright screenshot verifies the site is visually alive.
  • Welcome email sent to the client with login details.

The client’s real domain is not connected at provisioning time. It is connected in Stage 3, after pages are built and ready to show publicly. At that point Shepherd emails the client with personalised registrar instructions. Cloudflare DNS automation (N8N sub-workflow) adds the A, SPF, DKIM and DMARC records; a polling script monitors propagation; Traefik issues the SSL certificate once DNS resolves.

Critical path items currently unbuilt

  • FluentCart payment webhook to N8N — not wired. The shopping and billing plugin on demo.gg is still in test mode; no real subscription product, no live Stripe connection. Until this lands, no real client can pay us (card #3).
  • N8N docker compose up on gg-client-template — not built. The multi-tenant container_name blocker (Section 9) must be resolved first.

The 37-day cancellation window

Policy: when a client cancels, they get 37 days to export their data before their site is taken down. The policy exists as a line in a planning document. There is no runbook today for what happens at day 37 — who checks, who sends the warning, what gets deleted, what gets archived (card #10). This needs writing up as a real process before the first paying client.

Provisioning is an N8N-orchestrated clone of the pristine template — not a from-scratch compose build. The clone preserves all FluentBooking hashes, automation IDs, and configuration intact. N8N orchestrates the clone trigger. The template stack must always be kept pristine. — ratified D9, Paul, 2026-05-17
Section 7

Backups & security

Three backup tiers (ratified Paul+Sam 2026-05-15)

  • On-box logical. Both Hetzner hosts run local backup scripts. gg-client-template uses /root/scripts/gg-backup.sh — mysqldump, wp-content, agent app/skills, traefik acme.json, compose. Hourly + daily.
  • Off-box restic. Paul VPS pulls from both Hetzner hosts at 04:30 UTC. Rsync lands to /root/hetzner-staging/, restic encrypts into /root/hetzner-backups. Password in BWS.
  • Hetzner Cloud snapshots. Available via Hetzner API. Not yet scheduled — pending Paul decision on cost vs benefit.

Retention: hourly 48h / daily 7 days / weekly 5 weeks / monthly 6 months. Brain restore verified passing as of 2026-05-15.

Backup hard drives

Perimeter

Hetzner Cloud Firewall is the primary perimeter for both Hetzner hosts — applied off-host, no on-box state, instant rollback by API. UFW is inactive on both. Inbound: TCP 22, 80, 443 + ICMP. WireGuard UDP 51820 on gg-staff only (interface present, has never completed a handshake).

Secrets

BWS is the canonical secrets store for Paul VPS and gg-staff. Per-client Docker stacks currently use a plaintext .env file at runtime. BWS is not wired into the client template. Every client clone provisioned from the template propagates plaintext secrets by default. The client-side secret-management model (BWS client integration, Docker secrets, sealed-secrets, or accept-and-document) is an open decision — tracked in the hardening backlog as item #150.

The hardening shopping list

ItemSourceState
SSH key management — fleet-wide key rotation and access controlcard #208decision
Cloudflare WAF rules — protect client sites from web attackscard #209decision
Per-client API keys (separate Anthropic Workspace per client)card #84raised 22 May
Per-client BWS or sealed-secrets at provisioning timeinfra-sec-ops canon, item #150backlog
Intrusion detection — file integrity, process monitoringcard #214decision
Fluent Support — deactivate and delete from templateratified D1live on demo, not removed
Security plugin review (Fluent Security 2.1.2 + Wordfence 8.2.2 both active)infra-sec-ops canontwo security plugins running
WPS Hide Loginparent brief Section 5no card defines this on template
fail2banparent brief Section 5not in mu-plugin manifest
A note on the security image

This brief shows a real keyboard and padlock for the security section — not an abstract security badge. The same rule applies to every other image: actual digital work, not metaphors.

Monitoring

Live ops dashboard at dashboard.guidancegate.com/ops. Cron runs every 2 minutes across all three hosts. Nine data sources: disk usage, uptime on 12 GG domains, MainWP fleet status, backup log health, TLS certificate expiry, brain API health, MEMORY.md hygiene, Docker container status, and a security section spanning the full width (reboot_required, fail2ban status, recent failed SSH attempts, Hetzner Cloud Firewall state per host).

Each client’s stack registers with Uptime Kuma at provisioning time (card #150). MainWP child registration (card #151) hooks the stack into fleet plugin updates from Paul VPS.

Real keyboard and padlock
Section 8

White-labelling & branding

White-label branding system

The coach never sees “WordPress” or any Fluent plugin name. Every surface is white-labelled under GG branding. In the client’s platform the only visible GG reference is “Powered by GuidanceGate” in the admin footer. The bot carries the name the client chose, not “AI Business Assistant” or “Merlin.” Branding is set on first login.

The mu-plugin stack

Mu-plugins load before everything else and cannot be deactivated. Every new client clone includes them. This is the manifest from the canon provisioning file:

PluginWhat it does
gg-client-fields (v1.1.0)Registers the gg_client_fields table; gg_field() / gg_field_set() helpers; REST endpoint; WP-CLI access.
gg-client-dashboardWhite-label skin: replaces login logo, injects dark theme and GG logo, renames Fluent menus, suppresses WP update nags.
gg-activity-log (v2.0.0)Logs logins, post edits, bot interactions, field writes by actor / action / timestamp / context.
gg-asset-cptRegisters the gg_asset custom post type for DFY deliverables.
gg-bot-escalationRoutes escalation requests from the agent.
gg-bot-profileServes the client-chosen bot name through the Python agent.
gg-bot-arbiterMust-use arbiter enforcing mutual exclusion between gg-merlin and gg-ai-assistant (D3, Paul 2026-05-17).
gg-disable-xmlrpcDisables the XML-RPC endpoint — standard security tightening.
gg-fluent-rebrandWhite-labels all Fluent plugin labels, footers and update nags.
gg-fluent-rebrand-iconsmd5-syncs canonical GG icon assets to Fluent plugin paths on admin_init and plugin update.
gg-my-offerCoach-facing offer summary display.
gg-token-budget (v2.0.0)Present and active. Currently unwired to the Python agent — reconciliation open (Section 9).
gg-chat-history, gg-favicon, gg-mega-menu, gg-pages-page, gg-social-post-cpt, gg-users-page, gg-dashboardVarious supporting surfaces in the white-labelled admin.

Planned but not yet built: gg-seo-meta (lightweight SEO meta boxes — no third-party SEO plugin) and gg-brand-theme (reads the gg_brand WP option JSON, injects CSS variables site-wide).

The brand system

The gg_brand WordPress option (JSON) holds primary, secondary and tertiary colours, heading and body colours, heading and body fonts, border-radius and corner style. One value change in the option updates the entire site through CSS variables. Coach customisation is constrained to short lists, never freeform: inline text and image editing on the front end, structural changes through the Merlin chat widget, approximately 15 pre-built section types with 2–3 variants each, constrained colour and font pickers.

Theme

Base theme: stock Twenty Twenty-Five, completely unmodified. It exists only to keep WordPress happy. All client-facing pages use custom page templates: page-gg-funnel.php, page-gg-free-guide.php, page-gg-stub.php. There is no page builder — no Divi, no Elementor, no Gutenberg blocks. Page content is plain HTML stored in post_content (12–46 KB per funnel page on demo.gg).

Drift between brief and reality

The canon mu-plugin manifest lists roughly 19 must-use plugins. RMM (the active dogfood) currently has 28+ in its mu-plugins folder — including gg-briefs, gg-build, gg-business-accelerator-audit, gg-fe-edit, gg-pilot, gg-page-chrome, gg-portal-topbar, gg-site-nav and more. These are RMM-specific tooling that has not yet been triaged into “ships to every client” vs “stays as Sam’s own kit.” No card defines the curated subset. This needs a decision before clone 1 of the template goes live.

Section 9

Open items, drifts & next steps

Three buckets of unresolved work. The first is the small list of things blocking the very next clone going live. The second is everything else that needs a decision before the template is “done.” The third is the drifts between what canon says and what RMM-reality shows.

What blocks clone 1 going live

BlockerWhat it isOwner
Multi-tenant Composecontainer_name and host-port collisions mean only one stack can stand up per host today. The fix choices (drop container_name entirely, shared Traefik platform stack, per-client MySQL sidecar) are documented but no decision has been made. This is THE blocker before any second client provisions on gg-client-template.Paul + Sam joint
FluentCart live Stripe productDemo.gg shopping plugin still in test mode. No real subscription product, no live Stripe gateway, no webhook to provisioning. Until this is built, no real client can pay (card #3, checked live 2026-05-20).joint
9 architecture questions in brief #46Backups, resource limits, per-client MySQL vs shared, SSH access removal, failure domain, MariaDB switch. The compose rewrite is on hold until these are agreed (card #76).Paul + Sam joint
The mu-plugin manifestCanon lists ~19, RMM has 28+. No card defines the curated “ships to every client” subset. The provisioning cookbook (brief #22) should version-pin the manifest with a review step.joint

What blocks Seth

Seth is the first client off the new template. Everything in “blocks clone 1” above blocks Seth. Plus card #84: Seth is named as the place to start adopting per-client API keys (separate Anthropic Workspace per client) as the new provisioning standard. No client has been moved to individual keys yet; today the model is one shared Claude key and one shared voice-service key for all clients.

The 14 open decision-phase questions

Lifted from the project 3 decision cards — these are the discussion-phase items waiting on a sign-off:

#TopicOwner
3FluentCart needs a live Stripe product before we can take our first paymentjoint
8Should each client get their own Telegram bot, and if so, on by default?joint
9Lock down which WordPress plugins are required in every new client site — deactivated-on-template plugins keep or remove?joint
10The 37-day data-window after cancellation needs a real runbookjoint
579 architecture questions for one-isolated-setup-per-client (backups, resource limits, per-client DB, SSH access, failure domain, MariaDB switch…)Paul
60Sign off the shared store (gg_client_fields) — second sign-off pendingjoint
61Six small background mu-plugins (logging, security, branding) — second sign-off pendingjoint
62How a coach builds new pages after launch — second sign-off pendingjoint
63How much control coaches get when customising pages — second sign-off pendingjoint
65Voice input via Whisper — switch internal Telegram bots over? What do we call the assistant?joint
66One shared AI account for all clients vs per-client — if pooled, do we still get per-client metering and an off switch?joint
67Documentation library the bot can read — second sign-off pending; check if something similar already exists firstjoint
84Per-client AI keys — separate Anthropic Workspace per client, starting with SethPaul
112Token-budget and metering-model reconciliation (gg-token-budget WP plugin vs Python agent cents tracking)Paul + Sam

The 9 drifts between canon and RMM-reality

DriftCanon saysRMM-reality is
db engineMariaDB 11 LTS (ratified D2)MySQL 8.0.46 on demo.gg; RMM is already on MariaDB 11 — the migration path is proven on the RMM stack but not yet rolled to demo.gg
mu-plugin set~19 must-use plugins in the canon manifestRMM has 28+ in mu-plugins; subset for the template not defined
Fluent SupportDefinitively ruled out (D1) — deactivate and deleteStill active on demo.gg as exploration leftover
security pluginsSingle security plugin (review needed)Fluent Security 2.1.2 AND Wordfence 8.2.2 both active
WPS Hide LoginListed in parent brief Section 5Not installed on demo.gg or RMM; no card defines it
fail2banListed in parent brief Section 5Not in the mu-plugin manifest; host-level only, not standardised in the clone
staging lifecycleRequired by D2 (validate before live)wordpress-staging container exists on gg-client-template — lifecycle, teardown, key isolation not defined
secrets at runtimeBWS canonical on Paul VPS + gg-staffPer-client Docker stacks ship with plaintext .env containing all 16 secrets — every clone inherits this
canon paperworkOld template doc still describes demo-as-templateReal template is a separate, sanitised, neutral-named stack (since 19 May 2026). Canon update outstanding (card #81)

Deferred (not part of this template)

  • Sage Shepherd — central, not on the client stack. Out of scope for this brief.
  • Per-client Telegram bot — parked. The code can talk on Telegram; the per-client setup, cost, and onboarding experience are deliberately deferred (card #8).
  • Meta Pixel injection — parked 2026-05-11. Meta app does not exist yet (card #115).
  • gg-skills-config / gg-skills-dashboard — present and deactivated on disk. Keep-vs-delete decision deferred.

What sequencing looks like

  • Decide the multi-tenant compose model (shared Traefik vs container_name strip) — this unblocks everything else.
  • Migrate MySQL → MariaDB on staging, prove, then on demo.gg.
  • Curate the mu-plugin manifest and version-pin it.
  • Wire FluentCart live Stripe + provisioning webhook.
  • Adopt per-client API keys, starting with Seth.
  • Write the 37-day cancellation runbook.
  • Update the two canon docs to describe the real three-part template (working copy / pristine template / shared router).
Real task board with sticky notes
Appendix A

All 82 source cards by ID

Every decision-phase card in project_id=3 (“Client Docker template”) at the time of writing. Nothing dropped. Cards marked » are folded into a section above; cards marked + are absorbed contextually; cards marked — are noted but not directly load-bearing for the template (e.g. funnel-page skill specs that belong in their own skill files).

#TopicWhere it lands
3FluentCart live Stripe product» Section 6, 9
8Per-client Telegram bot» Section 9 (deferred)
9Required-plugin lock-down» Section 8, 9
1037-day cancellation runbook» Section 6, 9
12New email/conversation tool for clients+ flagged, build paused
27Submit-My-Offer central webhook» Section 6
34One central AI engine with personas (superseded)» Section 4 (superseded)
40Submit-My-Offer notification path+ open Q for Paul
57One isolated setup per client + MariaDB» Section 3, 9
58Sage Shepherd» Section 4 (out of scope)
60Sign off gg_client_fields shared store» Section 3, 9
61Six small background mu-plugins» Section 8, 9
62How a coach builds new pages» Section 4, 9
63Coach customisation freedom» Section 8, 9
64Shepherd as accountability layer» Section 4
65Whisper for voice input» Section 4, 9
66Shared vs per-client AI accounts» Section 5, 9
67Documentation library for the bot» Section 9
76Multi-tenant Compose rewrite + brief #46» Section 9
81Canon still describes the old template» Section 9
83NextQ as per-client plugin+ noted (idea)
84Per-client AI keys / Seth» Section 7, 9
97–103Hero Section Options, page-build skills— skill specs
104Client Bot authority limits & guardrails» Section 4
105Skills pull system» Section 5
107–111Sage Shepherd monitoring, composition, rhythm, escalation, canned replies» Section 4 (out of scope, summarised)
112Token tracking & usage dashboard» Section 5, 9
113API key provisioning & billing» Section 5, 7
114Navigation menu setup— provisioning skill
115Meta Pixel injection (PARKED)» Section 9 (deferred)
118–122Asset library, Skills Index, opt-in landing, Activity Log, Plug Drumming— skill / page specs
123–131Offer pages, FAQs, payment pages, calendars, contact, privacy— page specs
132Cron-driven coaching message scheduler+ Shepherd-adjacent
133Full site visual review» Section 6 (verification step)
134Form submission test suite» Section 6
135Email automation test» Section 6
136–145Booking, Stripe, SMTP, deliverability, search/sitemap, copy variants, video script, free guide— skill specs
146–161Coming-soon, social planner, FluentCRM lists, segmentation, broadcasts, automations, A/B tests, course modules— skill specs
162–180Community setup, member dashboard, app icons, white-label sweep, MainWP child config, monitoring registration, Cloudflare DNS, Hetzner snapshots, restic verify» Section 6, 7 (touched)
181–200Programme stage tasks, Shepherd templates, bot tools, page templates, error pages, 404, 500, robots.txt— skill / config specs
201–218WP plugin rollback, log aggregation, Postgres maintenance, MySQL maintenance, client decommission, rate limiting, push-to-fleet, health endpoint, sync drift, intrusion detection, security review» Section 7

Note on ranges: project 3 contains 82 decision cards, 50 build prompts, and 8 history items. Cards in the 118–200 range are mostly per-page or per-skill build prompts — they are inputs to the template (each page or automation that lands inside it) rather than template-defining decisions. They are referenced here for completeness and absorbed contextually.

End of brief

Client Docker Template — workstream brief. Synthesised from 82 decision-phase cards in project 3, the canon principles / architecture-stack / infra-sec-ops / provisioning-lifecycle / ai-partner domains, and live inspection of the deployed demo.gg and RMM stacks. Updated 26 May 2026.