Where we started → where we ended up → SOP for how v4 pages are now made
← Command Centre · GSD: wave-3-rollout-2026-05-10 · Branch: feature/v4-migration · Generated 10 May 2026
feedback_fix_codex_highs_dont_halt.md, HIGHs were fixed inline rather than halting. The risks below are surfaced in dedicated callouts rather than buried in narrative; see §9 for the full Mission 25 integration go/no-go gate.| Reviewer | Verdict | HIGH | MEDIUM | LOW |
|---|---|---|---|---|
| Codex 5.5 (plan mode) | REFINE | 2 | 4 | 2 |
| Gemini Pro 2.5 | PASS | 0 | 1 | 2 |
--channel blog / --channel landing “NEVER --channel article”, contradicting AGENTS.md & CLAUDE.md which mandate --channel article for disease-adjacent topics. Fixed — pipeline now reads copy_preflight.py --channel article with the canonical disease-adjacent topic list.GRAPHITI_API_KEY status: kept READY (fallback OK) since flat-file fallback returns canonical answers; flagged in §0 risks and §9.C with explicit “fix when convenient.” Not blocking Mission 25.sync_canonical_messaging.py needed connections-registry consultation. Fixed in §9.D step 2.mkt-creative-brief “verify reads same source as mkt-ad-copy” — deferred to Mission 25 dispatch as a hard pre-flight check rather than a passive note.apps.np.org vs apps.nutritionalproducts.org: both valid (alias). No change.viz-image-pipeline SKILL.md. No change.check_copy_against_canonical.py currently runs flat-file fallback because GRAPHITI_API_KEY env-var resolution needs a fix. Flat files return canonical answers correctly, so this is non-blocking; flagged so it isn’t forgotten.projects/briefs/canonical-messaging-multi-track-2026-05-09/wave-3-backlog.md. Not blockers; documented so they aren’t lost between sessions.tools/sync_canonical_messaging.py before any new copy work.The original mandate was narrow: backfill tactics docs for ten v4 landing pages that had been built without a pre-publish strategy doc. Those ten pages were a snapshot of how things had been done up to that point — commission a page, ship it, audit later.
While walking through the ten pages, two customer-facing copy bugs surfaced:
Those two bugs were the visible symptom. Behind them sat the deeper system problem: copy was drifting across pages because there was no canonical source of truth, no enforced gate before publish, and no automated check between “what the label / authorised-claim says” and “what got typed into a Liquid file at 2am.” The whole rest of the session traces back to that observation.
What started as a tactics backfill turned into a cleanup of the entire pipeline that produces v4 pages. In rough order, here’s what landed:
Every new page must have a tactics doc at projects/briefs/{slug}/tactics.md (template at _tactics-template.md) before any publisher tool will POST. A 2026-05-10 cutoff date grandfathers existing pages via a retro_derived: true frontmatter flag, and a git-history check makes the flag uncheatable on net-new work (D4: switched from filesystem mtime to git history; fail-closed on shallow clones).
Also: 10 retro tactics docs backfilled for the original Phase 5 articles.
Every audit ran with Codex 5.5 plan-mode peer review. After the GABA Wave-1 follow-up sweep, all 10 audits are marked codex_reviewed: true in frontmatter. No more “ship now, audit later” for v4 LPs.
Two stores, one role each:
bz-canonical-messaging, 1,016 records (FAQs, customer quotes, catalogue prose, product-label specs) for semantic retrieval.brainzyme-canonical-facts, 869 deterministic triplets (products, nutrients, claims, regulators, discount codes, age rules, banned terms) for hard yes/no checks.Both promoted to Tier 1 service contracts with self-diagnostics and a 3-tier failover policy (live → markdown mirror → flat files → fail-closed).
reference/data-contracts/discount-codes.md — the four canonical welcome codes (UK/US WELCOME10, DE WILLKOMMEN10, FR BIENVENUE10).reference/data-contracts/product-labels.md — 18 label specs (3 products × 6 segments) banked from Calum’s Drive doc.reference/authorised-health-claims/ — 12 files (3 products × 4 markets) of EFSA / FDA / ANSM-authorised wording, verbatim.reference/data-contracts/canonical-messaging-rag.md — the hybrid spec itself.Every customer-facing copy edit now consults the canonical-messaging hybrid + product labels + discount codes before writing. Mirrors the existing pattern for connections-registry / page-build-registry / browser-tools-routing.
5-layer gate: Graphiti structural BLOCK on hard fact mismatch → Pinecone semantic WARN/PASS → Haiku LLM advisory on style → override governance (inline WARN_OVERRIDE; central log for BLOCK_OVERRIDE) → failover policy. 3/3 smoke tests pass; flat-file fallback active until env-var fix.
Every v4 LP gets atmospheric watercolour scenes (GPT-Image-2 ligne-claire) plus ONE photorealistic FLUX 2 Pro product-in-scene shot in the nutrition section. viz-image-pipeline §1.5 locks this rule. 10 LPs re-illustrated under it.
All 4 stores migrated from per-page ad-hoc codes (RED-BULL10, etc.) to canonical welcome codes. Audit regex hardened to word-boundary, RED-BULL10 disabled and added to deprecated registry table.
30 theme files modified. 106 mechanical fixes (canonical-messaging gate consultation, discount-code refs, anti-coffee phrasing, Liquid hygiene). 29 atomic commits for clean rollback. 5-log ritual per market (DEPLOYMENT_LOG / pointer / session bank / pages_registry / Component Registry).
16/16 hits cleaned. No outstanding meta-description drift across UK/US v4 pages.
Track A (autonomous): ~60% resolved without escalation — A1 UK anti-coffee sweep, A4/A5/A6/A8/A9/A10 landed, pages_registry planpath hygiene applied. Track B (Calum-decision): 5 items escalated to wave-3-review dashboard with 3 options + recommendation each. 3 items resolved autonomously (B2 Ritalin / B5 anti-coffee ambiguous=0 / B8 US Dopamine H1).
Every customer-facing page now flows through this pipeline, in order. Publisher tooling refuses to POST when an upstream gate is missing — that’s intentional, not a bug. The headline change: we used to publish first and audit later. Now we plan first, gate continuously, and only PUT when every upstream layer has signed off.
| Market | Theme commits | Files | Mechanical fixes | Browserbase desktop QC | Playwright mobile QC | Summary commit |
|---|---|---|---|---|---|---|
| UK | 4 + 3 follow-up | 7 | 26 | PASS | PASS | bee8af9 |
| DE | 9 | 9 | 33 (8 .liquid + 24 JS scope-ext + 1 anti-coffee) | PASS | PASS | e3e5497 |
| FR | 8 | 8 | 27 (8 .liquid + 19 JS scope-ext) | PASS | PASS | 833ef7a |
| US | 5 | 6 | 20 | PASS | PASS | 72e8786 |
F:/Agentic-OS/.env, never F:/Claude Root/.env. Two copies of shopify_get_token.py existed; running the wrong one wrote tokens nobody read. Fix: always cd F:/Agentic-OS first. Memory pointer at feedback_shopify_token_mint_canonical_path.md.check_copy_against_canonical.py) with 3/3 smoke tests passing.projects/briefs/canonical-messaging-multi-track-2026-05-09/wave-3-backlog.md..qc-log/canonical-overrides.jsonl, deferred-to-Calum log, per-phase audit reports). If ASA / EFSA / ANSM / FDA ever asks “how did this claim get on the page?” we can answer.| # | Decision | Action | Status |
|---|---|---|---|
| B1 | KEEP all 6 review quotes — review-context relaxes banned-phrase rule (testimonial ≠ claim) | Canonical rule update banked: AGENTS.md + canonical-messaging-rag.md + check_copy_against_canonical.py Layer 4 | DONE |
| B2 | Ritalin substance — resolved autonomously | — | DONE |
| B3 | RETIRE black-friday-hot-deals UK | Already unpublished + existing 301 to /collections/cognitive-enhancers-smart-pills kept. Verified 301→200 chain. | DONE |
| B4 | FR Dopamine pain-led H1 port + mechanism paragraph | Theme PUT 200 + page body_html PUT 200. Live H1: "Pourquoi vous vous sentez démotivé — et ce qui aide vraiment". Canonical gate WARN_OVERRIDE audit-logged. | DONE |
| B5 | Anti-coffee ambiguous cases — resolved autonomously (count = 0) | — | DONE |
| B6 | Orphan codes — defer to Strategy A migration (option C) | Recorded; no immediate action; will be picked up in next wave | DONE |
| B7 | Path B — build proper DE-store cognitive-enhancers-smart-pills LP | 11 phases complete. Live at brainzyme.de/collections/cognitive-enhancers-smart-pills in EUR with 3 FOCUS products. Re-finding: original "DE→UK URL misroute" premise NOT corroborated by live Google Ads state — no CEP CSV needed. Collection stands as defensive infrastructure. | DONE |
| B8 | US Dopamine "Four-Layer Dopamine Support System" hero rewrite + UK mirror | Template reassign worked both markets. US + UK pages now render new H1/subtitle/H2 + full section structure. All 18 US markers + 9 UK markers present. Token refresh required mid-flow (US went stale). 4 v2 follow-ups flagged. | DONE |
.dockerignore excluded screenshots from Coolify build context.quote:other:top-sant corrected (first pass over-removed zinc/iodine/choline alongside iron; re-fixed to preserve valid minerals, drop iron only). Phase 2 themes: 13 files PUT across 4 markets. Phase 3 Shopify pages: iron counts UK 7→0, US 12→0, DE 12→0, FR 13→0. Phase 5 Layer 6 gate: 280-line gate + 31-ingredient lexicon × 3 langs + 29/29 pytest tests, wired with BZ_INGREDIENT_GATE_ENABLED=advisory flag. DONEreference/data-contracts/product-ingredients.md. Citation Library v1.0: 28 ingredients × 138 citations, manual-only sync. DONEbrainzyme.de/collections/cognitive-enhancers-smart-pills in EUR with 3 FOCUS products. Phase 9 re-finding: original "DE→UK URL misroute" premise NOT corroborated by live Google Ads state — collection now stands as defensive infrastructure. DONECalum is about to dispatch the Mission 25 cascade (campaign architecture → creative briefs → LP commissioning → asset renders → ad setup). This section answers: does anything Session 38 built conflict with Mission 25, and what does Mission 25 need to know to inherit cleanly?
| Zone | Session 38 footprint | Mission 25 risk | Status |
|---|---|---|---|
| Theme repos (4 stores) | 30 .liquid files modified across UK/US/DE/FR via Wave 2 Phase 2 | New LPs will write new templates; merge-conflict only if Mission 25 edits the same files we just touched | READY — verify clean working tree on each repo before dispatch |
| pages_registry | 88 v4 rows refreshed (theme_files / components_used / hash / status) | Mission 25 adds new rows for new pages; schema-compatible | READY |
| Discount codes | 44 deprecated refs migrated to canonical welcome codes; orphan codes disabled | Mission 25 must NOT mint new topic-prefixed codes; reuse welcome codes per market | NEEDS-CHECK — B6 still has 6 orphan disable proposals pending |
| Tactics docs | Tactics-first hard gate live; publish_planned_articles.py refuses POST without doc | Mission 25 LPs MUST produce tactics docs upstream — gate will block otherwise | READY — gate is enforcing, not advisory |
| Canonical messaging | Pinecone (1,016) + Graphiti (869) populated; gate tool live | Mission 25 copy must pass the gate; drift detection catches fact mismatches | NEEDS-CHECK — verify Drive→Pinecone mirror is fresh before cascade |
| Product positioning / labels | 18 label specs banked at reference/data-contracts/product-labels.md | Mission 25 ad copy + LP copy must reference these (4-class lexicon: PRO ≠ ELITE) | READY — mkt-ad-copy already enforces; verify mkt-creative-brief reads same source |
tools/lib/tactics_gate.py. Every LP needs projects/briefs/{slug}/tactics.md per _tactics-template.md.tools/check_copy_against_canonical.py per chunk before any PUT.WELCOME10 (UK/US), WILLKOMMEN10 (DE), BIENVENUE10 (FR). Don’t mint new topic-prefixed codes.viz-image-pipeline §1.5.| Check | Status | Action |
|---|---|---|
| Orphan tactics docs needing GC | READY | None known — 10 retro docs backfilled in commit e27081f |
| Canonical messaging mirror fresh (Drive→Pinecone→Graphiti) | READY | Track A5 lazy per-day watcher LIVE (tools/sync_canonical_messaging.py). 79 zombie records purged. Sentinel ensures 1-call-per-day diff overhead. Self-corrects on first canonical gate use. |
| Resolution of 8 wave-3-review items (B1–B8) | RESOLVED | All 8 closed or in active flight. B1/B2/B3/B4/B5/B6 DONE. B7 (Path B DE LP build) + B8 (US Dopamine reassign) running in background; not blocking cascade dispatch since they’re isolated workstreams. |
| 4 markets at clean theme state (Bucket 1 cascade complete) | DEPLOYED CLEAN | UK / US / DE / FR all shipped: chat widget + Forms popup suppressed on focus-hub, Related Articles fix applied. 32 PUTs all 200 OK. Zero customer-visible regressions. |
| Pre-PUT assertion suite (post-cascade hardening) | CODIFIED | 6-assertion suite now MANDATORY in AGENTS.md for any layout/theme.liquid touch. Caught a real Liquid 422 pre-render on DE leg. |
| Track B brain-fog quiz hero redesign | SHIPPED 4 MARKETS | 16 WebPs across UK/US/DE/FR with responsive decoupling pattern (mobile stack / desktop overlay-quiet-side). Canonical pattern banked at reference/page-types/quiz.md. |
| DE Dopamine pain-led canonical alignment | DONE | Three locations updated (section + body_html + page.title). Live H1 now matches the canonical pain-led pattern. |
| Iron sweep + ingredient gate (Layer 6) | IN FLIGHT | Multi-agent orchestrator running: Pinecone pollution removal → per-market parallel theme cleanup → Shopify body_html cleanup → Layer 6 gate build. Won’t block ad cascade if iron is already correctly absent from PRO/Elite labels (which the audit confirmed). |
| Enforcement tool GRAPHITI_API_KEY env-var path | READY (fallback OK) | Flat-file fallback returns canonical answers; not blocking. |
| 18+ disclaimer fix verified live | FIXED | Wave 2 Phase 2 swept all 4 markets; Browserbase desktop + Playwright mobile QC PASS |
git status on each (UK/US/DE/FR brainzyme-themes-*) before kicking off the cascade. Should all be clean except whatever B7 + B8 + Iron orchestrator are still writing.Calum: green light to start the cascade. Final blocker check before you go: confirm theme repos are clean (one-liner you can run from this dashboard if useful: cd F:/brainzyme-themes/uk && git status; cd ../us && git status; cd ../de && git status; cd ../fr && git status).
Session 25 working context: F:/Agentic-OS/context/sessions/session-25-competitor-creative-intel.md · Campaign Planner v2 brief: F:/Agentic-OS/projects/briefs/campaign-planner-v2/PHASE-A-BRIEF.md · Phase B sign-off dashboard: /phase-b-signoff/