| # | Task | Owner | Time | Impact |
| 1 | GO/NO-GO: a 500-contact activation test to the 6,813 who never worked out — $0, the growth fleet's top-ranked lever NOW why this matters + step-by-stepWhat: Approve the fleet drafting ONE activation email (get workout 1 done — no offer, no discount) to a 500-contact test slice of the app-side contacts who finished the survey but never did a single workout. You see the rendered email AND the segment-guard PASS before anything sends — this row is only the GO to draft-and-show. Why: The 10 Aug growth-fleet verdict on your no-paywall question ranked this #1 of five levers: 6,813 people are already ours, already qualified, and cost $0 to reach. If 5% activate and 7.3% of those pay, that is ~24 paying customers — more than the $97 paywall produced in its first ten days [MODELLED — the fleet's own skeptic flagged both rates as benchmarks, not measurements, which is exactly why the 500-contact test comes first]. The no_workout funnel-stage field went live 7 Aug, so the segment is buildable today. Steps - Reply GO (or amend) on this row
- The fleet builds the 500 segment from %TMA_FUNNEL_STAGE% = no_workout and runs segment_guard.py — its PASS text comes to you with the draft
- The fleet drafts via /email-fleet (locked footer, lint gate, activation CTA per the welcome doctrine — NO offer)
- You approve the RENDERED email; day-7 read of clicks + workout-1 completions decides whether the remaining ~6,300 get it
Done when: 500 contacts have received the activation email and the day-7 click/activation read exists — THAT number, not the modelled one, decides the full-list send. | AGA | 5m | ●●●●● |
| 2 | GO/NO-GO: give 758 Nurture Sequence 2 (14,600 contacts) a quiz-root CTA slot — sister of AGA-129 NOW why this matters + step-by-stepWhat: Approve ONE slot in 758 Nurture Sequence 2 carrying the quiz-root CTA (https://quiz.themovementathlete.com/, UTMs per the link rule). A single-slot change through the email fleet under the Evolution Law — not an arc rewrite. One GO can cover this and AGA-129 together. Why: The growth fleet's lever #2 ('fix the tap before the bucket'): ~14,600 contacts sit in that automation sending the quiz NOTHING, while email produced 0 of the new quiz's first 14 sales and owned surfaces are its best-converting source. The no-paywall question (§NP) cannot even be tested while the email engine converts at 0% — this row and AGA-146 are what un-darks it. Steps - Reply GO (or amend) on this row — say if one GO covers AGA-129 too
- The fleet names the worst eligible slot from the scoreboard and drafts the single-slot change via /email-fleet
- Collision + segment checks run against the live automations; results attached to the approval
- You approve the RENDERED email; day-7 read: email-sourced quiz leads vs the ~0.1/day baseline
Done when: One live slot in 758 Nurture Sequence 2 carries the quiz-root CTA and email-sourced quiz leads move off zero. | AGA | 5m | ●●●●● |
| 3 | Tell the dev to update Divi BEFORE touching PHP on Calisthenics Academy NOW why this matters + step-by-stepWhat: One message to Sovat with a single instruction: on calisthenicsacademy.co, update Divi before anything touches PHP — and confirm the Elegant Themes licence is still live, because the updater needs its API key. Why: The assessment he is working from is wrong. CA's active theme is Divi 4.4.8, and Elegant Themes only added PHP 8 support in Divi 4.8 — the theme predates PHP 8 support by four minor versions, so upgrading PHP first breaks the site. Page Builder Everywhere is real but is the smaller blocker: its entire footprint was one copyright line in one widget area.
The likely cause of the wrong read: BWA runs Divi 4.27.7, so a check done there looks clean — CA was never separately verified. Re-measured 12 Aug and it still holds: his report said the theme was updated and ‘Divi version verified’, and the live theme is still 4.4.8. Steps - Message Sovat: update Divi on CA first, then PHP — never the other way round
- Ask him to confirm the Elegant Themes licence/API key is still active (the updater needs it)
- Ask him which PHP version CA is on today — we cannot read that from outside WP Engine
- Ideally the whole job moves onto Rocket staging rather than being done on WP Engine at all
Done when: The dev has confirmed the Divi-before-PHP order in writing, and we know what PHP version CA is actually running. | AGA | 10m | ●●●●● |
| 4 | One builder visit — the workout-1 email + 2 safety conditions NOW why this matters + step-by-stepWhat: Three things in one ActiveCampaign sitting, about 12 minutes: build one small automation, add a skip-condition to two welcome arcs, and the promo-opt-out condition you already have queued. Why: The highest-intent moment in your whole funnel currently carries no email at all — the morning after someone finishes their FIRST workout. About 48 people a day reach it. Someone who trained yesterday is a different person from someone who downloaded an app: they have felt the product, and the ask stops being “buy something” and becomes “keep doing what you did yesterday”. Everything on my side is built and running — a nightly job reads the app’s data out of Intercom, finds everyone whose workout count went from 0 to 1, excludes payers four separate ways, and stamps the tag workout1-yesterday on them by about 03:30. The tag is the bridge: ActiveCampaign never has to see the app. What it cannot do is build an automation or add a condition — those are builder-only, which is the whole of your 12 minutes. Steps - 1 — the new automation (~6 clicks). Automations → New → start trigger Tag
workout1-yesterday is added (runs once) → Wait until 8:00am (contact’s time zone) → Send the workout-1 email → End. I’ll have the email written, QA’d and rendered for you to approve before you build this - 2 — stop nagging people who already train. On 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th and 750 TMA | Welcome Sequence After Quiz, add a condition on the later send steps: skip if tag
workout1-done exists - 3 — while you are in there: AGA-145’s
promo-opt-out exclusion on 993 SALES SEQUENCE — same 2-minute condition class - Tell me when the automation exists and I’ll push a test contact through it and verify the whole chain end to end
Done when: The automation exists and is armed, both welcome arcs skip people carrying workout1-done, and I’ve confirmed a test contact flows through correctly. | AGA | 12m | ●●●●● |
| 5 | Send the RN devs one link, then hold them to three things on return NOW why this matters + step-by-stepWhat: The in-app paywall rebuild is with the RN team. Your part is one link out and three checks when it comes back — you are not building anything. Why: All three in-app pricing pages (full price / 30% off / 50% off) are separate copies, and that is exactly how the current bug survived. The fix is to put all three on one component with a variant switch. The real defect being fixed is non-USD currency — a price literal hardcoded in the UI shows the wrong number to anyone not paying in dollars. Scope is UI only: RevenueCat, purchase, restore, terms and analytics are already wired, and the offers are already configured. Steps - Send them https://tma-paywall-brief.netlify.app/ — it links the design contract and the package zip on the same domain (all three verified live 6 Aug)
- Ask them to confirm the estimate before starting — 5h max, in 6 milestones
- On return, check three things: (1) no price literal anywhere — every figure comes from the store product at render time, with a retry state if offerings fail; (2) they used one component with variant=full|off30|off50, not three rebuilds; (3) their on-device pass included a non-USD currency
Done when: One paywall component serves all three pricing pages, every price is read from the store at render time, and a non-USD buyer sees the correct amount. | AGA | 15m | ●●●●● |
| 6 | Paid compliance sweep — 5 checks in the ad UIs, ~20 min NOW why this matters + step-by-stepWhat: Five checks in Meta Ads Manager and Google Ads that stop live rule breaches. None of them need a decision — they are verifications and one small revert. Why: 🔴 Found 5 Aug against the live Meta + Google APIs. Google is now 68% of paid spend running at ~6× its allocated $8/day, and its daily budget stepped up +43% on 1 Aug ($35→$50) — the measurement gate makes the Lead→Paid meter a hard gate before ANY budget increase, and no artefact records it clearing. Separately, three campaigns still violate the category-search-only ruling (Competitive Non-Branded alone took 35% of Google spend at £10.63/click with 0 conversions) and its kill task has no completion record. And the Audience Network drift that doubled Meta CPL in late June stopped on its own — the permanent lock was never applied, so it can come back with nobody touching anything. Steps - Google Ads → Campaigns: confirm Competitive Non-Branded, Competitors Branded and PMax are PAUSED (they violate the category-search-only ruling)
- Meta Ads Manager → ad set → Placements → Manual: untick Audience Network. This is the permanent lock — Advantage+ reallocates on its own without it
- Google Ads → budget: revert the 1-Aug step back to ~$35/day, OR record why the measurement gate is considered cleared
- Google Ads → filter campaign type = Video: is anything live? 69,076 "advertising" views at ~4.4 seconds each says something may be buying garbage (open since 28 Jul)
- DECIDE — Apple Search Ads brand defence at ~$8/day. ASA is the best-evidenced paid channel we have (7.4% install→purchase, 2.6× organic) and we currently bid $0 on our own brand terms. It also billed £256 through 25 Jul while the cockpit shows "$0 not running" — confirm its real state
Done when: Three Google campaigns show Paused · Audience Network is unticked under Manual placements · the Google budget is reverted or the gate is recorded as cleared · the Video question is answered yes/no · ASA has a decision. | AGA | 20m | ●●●●● |
| 7 | Point traffic at the evergreen launch we already own — cheapest cash on the board NOW why this matters + step-by-stepWhat: One entry-trigger change in the ActiveCampaign builder so leads actually flow into 760 School of Strength (NEW) — the complete evergreen 50%-off launch arc we already own. Why: We do not need to build an evergreen launch. We already have one, switched on, fully built with real deadline mechanics — education → the offer at E10 → "8 hours left" → "this closes at midnight". Twenty-nine people have ever entered it. Meanwhile 14,619 contacts sit inside 758 Nurture Sequence 2, which carries no priced offer on any surface at all. That is a routing failure, not a copy failure — which is why it is the cheapest cash in the estate: the asset is built and paid for, it is simply not connected to the people. Steps - The fleet hands you the click-by-click entry-trigger spec (which tag, which arc, what order)
- In the AC builder: set the entry trigger so the right cohort flows into 760 School of Strength (NEW) — this is the one step only you can do, the API cannot create or move entry triggers
- 🔴 Do it as an ATOMIC swap — both arcs live means double-mailing, neither live means new leads get nothing
- The fleet watches entrant counts for 48h and confirms people are actually arriving
Done when: 760 School of Strength (NEW)'s entered count is climbing instead of frozen at 29, and the fleet has confirmed the first cohort reached the offer email rather than dead-ending before it. | AGA | 20m | ●●●●● |
| 8 | The annual offer to the engaged — 🔴 NOT ready for you: the audience halved and the draft does not exist NOW why this matters + step-by-stepWhat: Nothing for you to do on this one this week. The plan was: sell the annual plan to everyone still opening our email. Three things have to be true before that reaches you, and none of them is. (1) We know who we are mailing — the list we call Engaged held 2,912 people when read live on 11 Aug, against the 6,038 the 31 July audit recorded. It has more than halved in eleven days and nobody knows why yet (FLEET-53, the fleet has taken it). (2) The email exists — it does not; FLEET-07 is still open. (3) The unsub gate is clear — 967 sits at 0.51% against a 0.5% hardstop. Why: That headcount is the denominator of the whole prize. Every number attached to this row — the +$898/mo modelled here, the $500–900/mo email goal in the charter, the cockpit’s email headline — is that count multiplied by a rate. Halve the people and you roughly halve the money, so approving a send sized on 6,367 would be approving a number that is no longer true. The underlying case still stands: annual buyers churn 9.1%/mo vs monthly’s 36.7%, and no broadcast at this scale has ever gone out. Steps - Nothing from you right now — this row is parked on fleet work, not on your decision
- Fleet: diagnose the Engaged-tag collapse, publish the real audience number and what maintains it (
FLEET-53) - Fleet: write the email through /email-fleet and lint it (
FLEET-07) - Fleet: collision-check it — never the same week as the 50%-off falsifier (
FLEET-38) or the warm pool (AGA-118) - Then it comes back to you, and your decision is ONE thing: read the rendered email and pick the week
- Day-7 read lands on the scoreboard: sends → clicks → annual starts, reconciled to Stripe
Done when: The engaged tier has been made the annual offer against an audience number we can defend, the day-7 read exists, and the mix shift (annual share of new sales) is measured against the 36.8% baseline. | AGA | 20m | ●●●●● |
| 9 | Point ONE weekly email at the quiz root — a link decision, not a campaign NOW why this matters + step-by-stepWhat: Approve making the CTA of one already-scheduled weekly send to the engaged list the quiz ROOT (https://quiz.themovementathlete.com/, UTMs per the link rule). One link in one send — not a new campaign, not a sequence rewrite. Why: Email produced exactly 1 quiz lead in 8 days — and it landed on the DEAD 2026-v2-3 build (via 967 TMA | Welcome Sequence After LEAD MAGNET E7/E2, which still links the old URL). Meanwhile ~14,600 sit in 758 Nurture Sequence 2 with no priced offer, and 4 of the 8 provable $97 buyers came from our own surfaces — owned traffic is the highest-converting source the $97 funnel has, and it is free. Rough sizing: 6,000 reached × 1–2% CTR ≈ 60–120 best-qualified visitors ≈ 1–3 × $97 sales per send [ESTIMATE]. Steps - Say which weekly send carries it (or let the email fleet propose one)
- The fleet drafts via /email-fleet — locked footer, lint gate, cadence collision check
- You approve the RENDERED email (nothing sends unseen)
- Day-7 read: email-sourced quiz leads vs the current baseline of ~0.1/day
Done when: One weekly send to the engaged carries the quiz-root CTA, and email-sourced quiz leads move off ~zero on the scoreboard. | AGA | 20m | ●●●●● |
| 10 | Rule on the post-quiz journey — six decisions (J1–J6) that make the strategy real NOW why this matters + step-by-stepWhat: Read §0 of the post-quiz journey strategy you ordered (about 5 minutes) and rule on six decisions. Each has its full argument written out; you are picking, not designing. Why: The shape: one journey, five stages, gated on BEHAVIOUR rather than on a timer. One arrival email instead of the current 5–6-email first-day burst; activation nudges until workout 1; then 🔴 the pitch lands the morning after workout 1 — the highest-intent moment in the whole funnel, which today carries no email at all. The 16-email evergreen 50% arc becomes the scheduled second-chance engine entering at ~day 8–10 unconverted, and abandonment overlays as-is. Steps - J1 — merge results-ready + the login email into ONE arrival email and KILL the verify email (it gates nothing and double-enrols into 992). ~1h of Nic
- J2 — adopt behaviour-gating on the live funnel-stage fields. Nightly grain means the pitch lands next morning; good enough, and needs no Nic
- J3 — the evergreen arc enters at the journey exit, NOT from 750's terminal, and 760 School of Strength is SUPERSEDED as the bridge (same offer, second clock). Recommend RETIRE
- J4 — pitch price: $97 while their quiz window lives, $78.50 only in the evergreen event (this reconciles AGA-114)
- J5 — 750 fixes are SURGICAL per the Evolution Law, worst slot first (the 1.14%-unsub E1). Never a rewrite
- J6 — activation becomes its own 3-email micro-arc replacing 750's front
Done when: All six are ruled, and the build order follows from them rather than from whoever asks next. | AGA | 20m | ●●●●● |
| 11 | Approve the personalised-welcome design — 20-min read, 4 calls NOW why this matters + step-by-stepWhat: Read the design artifact and reply GO (or amend) on the four calls in it — this is the green light for rebuilding the welcome sequence on the quiz personalisation data, with the abandonment engine doing the rendering. Why: You asked for exactly this: “take this personalisation engine and extrapolate it for the email sequence, starting with the welcome sequence — with a very strong fallback.” The analysis is done: 750 TMA | Welcome Sequence After Quiz is over its own unsubscribe hard-stop, sends one generic track to all 7 quiz paths, and its first ask contradicts its own spec. The engine, the per-stage fallback ladder and the build plan are ready — only these four calls are yours: (D1) deploy as a NEW automation + trigger swap (this row's GO is the Evolution-Law override) · (D2) stage-branched start — only checkout-reachers wait to day 3–4 · (D3) the welcome ask = soft free-trial, the $97 stays with the abandonment lane · (D4) measure by 50/50 split (the AGA-64 setup) rather than a blind swap. Steps - Open the design page: the welcome personalisation design — the 5 decision cards are at the top
- Reply in any session: “AGA-134: GO” — or GO with amendments per card (e.g. “D3: use the $97 ask instead”)
- The fleet then runs the build (FLEET-47/48) and comes back with the rendered 5-email arc for your review before anything touches AC
Done when: You've replied GO/amend on AGA-134. Nothing deploys to a live automation before that reply — and nothing sends without your rendered-review sign-off after it. | AGA | 20m | ●●●●● |
| 12 | Rotate 3 leaked passwords — one is a live WordPress admin on Calisthenics Academy NOW why this matters + step-by-stepWhat: Three passwords are sitting in plaintext in a repo file, and one of them belongs to an account that is currently an administrator on calisthenicsacademy.co. Rotate them, and tell me whether to remove the stale admin user. Why: Found 10 Aug in SUPPORT/Ca SUPPORT SOPs.txt (~20 password lines from the Calisthenics Academy era). ✅ Contained: I verified the file is tracked locally but was never pushed to origin — same shape as the July token find. I have added SUPPORT/ to .gitignore, which stops it reaching a remote but does not fix an already-committed secret. Only rotation does, and rewriting git history is forbidden here.
🔴 The live exposure is #1: jeffcowancc@gmail.com — its password is in the file and that Gmail is an administrator on CA (WP user calisthenicsacademy-2). Anyone with that password can password-reset their way to full control of the site. Steps - Change the jeffcowancc@gmail.com Gmail password — this is the one that actually matters
- Tell me whether to REMOVE that WordPress admin account — it is the old CA support person, and I would not delete a user without your word
- The Drift and UserEcho logins for hello@calisthenicsacademy.co are both services we no longer use — cancel them rather than rotate
Done when: The leaked Gmail password is changed, the stale WordPress admin is either removed or explicitly kept, and the two dead services are cancelled. | AGA | 20m | ●●●●● |
| 13 | The ~1,020 warm pool (saw the paywall / clicked buy) has NEVER been emailed — approve the send NOW why this matters + step-by-stepWhat: Approve emailing the two warmest segments we own: ~570 people who reached the paywall and did not click buy, and ~450 who clicked buy and never paid (90-day pools). Why: The revenue plan calls this the best paid audience in the business and orders the FREE version first — email before retargeting. Re-verified 6 Aug in the AC campaign log: nothing at this scale has ever been sent (newest real broadcast: 24 sends). The fleet drafts through /email-fleet, runs send_collision_check.py, and shows you the rendered emails; your part is the yes and the cadence slot. Steps - Say go — the fleet drafts both emails (paywall-seen → objection-answer; buy-clicked → finish-checkout) via /email-fleet
- Review the rendered emails (you see them open in the browser, per the email rule)
- The collision check runs against the live automations; result attached to the approval
- You pick the send slot inside the weekly-cadence doctrine — never the same week as the 50%-off falsifier send (approved 6 Aug, now
FLEET-38)
Done when: Both segments have received their email, opens/clicks/purchases are read at day 7, and the paid-retargeting version of the same pools inherits proven copy. | AGA | 45m | ●●●●● |
| 14 | 42 people typed their email at checkout and nothing ever emailed them NOW why this matters + step-by-stepWhat: Build the sequence that follows up people who started paying and stopped. Why: 42 people got as far as typing their email address into the checkout and did not finish — the highest-intent free traffic you have — and roughly 14 more accrue every day. I audited all 20 scheduled jobs: nothing emails them. Cancellations are covered, failed cards are covered, renewals are covered. Walk-aways are covered by nobody. Steps - This one is being built in its own dedicated chat — it is bigger than a single sitting
- Your decisions in that chat: the four email drafts, and the four shells in ActiveCampaign
- Nothing sends until you have read all four
Done when: Somebody who abandons the checkout gets a first note within an hour, and buyers are excluded at send time. | AGA | 120m | ●●●●● |
| 15 | 🔴 REPOINT 'QLG | ADV+ OFF | MC | Control' TO THE QUIZ ROOT — 5 min in Ads Manager. All 4 of its live ads still land on h… 🔴 REPOINT 'QLG | ADV+ OFF | MC | Control' TO THE QUIZ ROOT — 5 min in Ads Manager. All 4 of its live ads still land on https://quiz.themovementathlete.com/2026/, the old page that does NOT show the 97 dollar offer. Change the destination on all four to https://quiz.themovementathlete.com/ (the ROOT). Nothing else: leave url_tags, budgets, geo and the objective exactly as they are, and do NOT pause the campaign. EXACT LIST — adset 'General / T2 / FM 30-54 US/Canada' (GBP 9.62/day, geo US+CA): ad 120253084939360728 and ad 120253084939340728. Adset 'General / T2 / FM 30-54 AUS, FR, UK SING, NZ' (GBP 9.62/day, geo NZ GB IL AU FR): ad 120245527336080728 and ad 120245527336070728. WHY THIS AND NOT A PAUSE — measured live 11 Aug on the Meta API, 30 days, unified attribution: MC Control produced 129 leads at GBP 2.43 each, the biggest lead source on Meta (56% of the two QLG lines' 230 leads; 57 in the last 7 days). Pausing would cut Meta lead volume by more than half in the window we are banking leads for Black Friday. Repointing keeps all 129 leads/month and sends them to the page that shows the 97 AND enrols them into 993 SALES SEQUENCE, whose 10 Sep gate the whole paid plan waits on. Zero cash change either way — the account's daily budget is GBP 45.48 before and after. This is also exactly what Aga's 10 Aug ruling asked for ('RE-AIM into the ONE geo-locked lead line, quiz root'); NIC-97 was built as a clone, which the spec allowed, so MC Control itself was never touched. TWO OPTIONAL EXTRAS while you are in there: (a) drop IL from the second adset's geo — Israel is the only country in this campaign not on the buyer list (US UK CA AU DE SE NL FR); (b) pause the third adset 'General / T2 / FM 22-65 North America' — it holds a GBP 7.00/day budget but all SIX of its ads are paused, so it cannot deliver and spent GBP 0 in the last 7 days. Hygiene only, frees nothing. VALIDATION (2 min): after saving, open each of the 4 ads' preview and confirm the click goes to the quiz root and lands on the page showing the 97 offer, then confirm the campaign is still ACTIVE and its daily budget is unchanged at GBP 9.62 + 9.62. | NIC | 5m | ●●●●● |
| 16 | 🔴 FLEET — EVERY FABRICATION AUDIT MUST LOAD data/testimonials/ (177 per-person files with raw video transcripts). The 75… 🔴 FLEET — EVERY FABRICATION AUDIT MUST LOAD data/testimonials/ (177 per-person files with raw video transcripts). The 759 audit's first three rounds produced SIX FALSE 'fabricated' verdicts — all of Heath's quotes and most of Gareth's detail — because the brief named only SUCCESS_STORIES_SCRAPED.md and the TESTIMONIALS-DATABASE. They are real; the corpus was just missing from the search. Absence of evidence was absence of corpus. I re-verified every earlier repair (973/751/758/764) against data/testimonials/ afterwards and all of them hold — Timo's own file confirms 15kg and no frog stand, and the only 'Jacques' there is the AVATAR persona — but the near-miss is the point: a fabrication verdict that deletes real member copy is as damaging as the fabrication. ACTION: add data/testimonials/ to the standing audit brief and to the ANGLE_REGISTRY prohibition note, so no future run can score a quote fabricated without it. | FLEET | 20m | ●●●●● |
| 17 | 🤖 FLEET — 'THE ENGAGED LIST' IS NOT ONE LIST. ✅ DIAGNOSED 11 Aug, one decision left. Live AC tag census: 7 Day Engagers… 🤖 FLEET — 'THE ENGAGED LIST' IS NOT ONE LIST. ✅ DIAGNOSED 11 Aug, one decision left. Live AC tag census: 7 Day Engagers 1,666 · 30 Day 2,567 · Engaged(237) 2,912 · 60 Day 6,153 · 90 Day 7,172 · 180 Day 12,296 · 360 Day Engagers 19,826 · Active Users 14,054. AGA-119 says 'the engaged (~6,367)' and names NO tag — that figure sits between the 60-day (6,153) and 90-day (7,172) cohorts, so the audience for the plan's headline email has never actually been defined. 🔴 THE CHOICE SWINGS THE AUDIENCE 12x AND THE MODELLED PRIZE WITH IT. Two further findings: (1) tag 237 'Engaged' — the one the cockpit reports as 'engaged-reachable' — appears in exactly ONE file in the estate (tools/email-plan/email_cockpit_sync.py:60) and in no doc, so it is a DASHBOARD METRIC, not a proven send audience; its fall from 6,038 (31 Jul trust audit) to 2,912 is consistent with a rolling-window tag shedding the June-July intake wave (2.4x May, Facebook-heavy — CONFIRMED timeline event), i.e. mechanical decay, not list death [PLAUSIBLE, not confirmed — the maintenance rule is undocumented]. (2) History warns against reaching for the big tags: past promos went to 12,000-44,747 and 60-90% of every one went to people who had not engaged in a year. REMAINING: pick the tag with tma-email-deliverability + tma-segment-integrity-officer, write the rule down, and register a >20% drift check in estate_selfcheck.py. | FLEET | 60m | ●●●●● |
| 18 | 📧 MOVE THE ASK IN 973 Nurture Sequence 1 NEW COPY FROM CLAUDE — from step 18 (day 57) to ~step 7, where 751 Nurture Sequ… 📧 MOVE THE ASK IN 973 Nurture Sequence 1 NEW COPY FROM CLAUDE — from step 18 (day 57) to ~step 7, where 751 Nurture Sequence 1 proved it works. Measured 5 Aug via offer_reach_check.py: the offer currently reaches 0.0% of the arc; 751's identical ask at step 7 reaches 74.3% and clicks 1.25%, the best in the estate. ~11,000 people are currently walking an arc whose ask never arrives. This is a single-slot CHALLENGER change and is EVOLUTION LAW compliant. 973 is now visible on the scoreboard (12,141 sends, Tier B) since the campaign-map fix, so the instrument tier is DIRECTIONAL dated slot-swap. Run through /email-fleet; Step 1.4b offer-reach gate applies. | FLEET | 90m | ●●●●● |
| 19 | 📧 GIVE 758 Nurture Sequence 2 A PRICED OFFER BEFORE ANYONE ELSE MIGRATES IN — it holds 14,619 contacts and is TRIAL-DOOR… 📧 GIVE 758 Nurture Sequence 2 A PRICED OFFER BEFORE ANYONE ELSE MIGRATES IN — it holds 14,619 contacts and is TRIAL-DOOR ONLY: 11 emails, every CTA to /start-training/, no priced offer on any surface (verified 5 Aug via offer_reach_check.py). 973's contacts are being migrated INTO it, which as built moves 14,619 people from a weak late offer to none at all. This is an EXTENSION class change (net-new slot, no existing slot touched) so it does not consume 973's single-slot budget. Run through /email-fleet. | FLEET | 90m | ●●●●● |
| 20 | 📧 FLEET (me, not Nic) — 50%-OFF FALSIFIER BROADCAST, everything except the copy. Aga APPROVED the send on 6 Aug with one… 📧 FLEET (me, not Nic) — 50%-OFF FALSIFIER BROADCAST, everything except the copy. Aga APPROVED the send on 6 Aug with one amendment: 'I am going to create and prove the emails' — so /email-fleet does NOT write this one, she does. MINE: (1) build the Core audience — opened or clicked in the last 90 days, ~5,090, dormant tier EXCLUDED (July's 0.451%/send unsub damage came from there, and the June Postmaster spike band coincides with the dormant/sunset lanes); (2) mint a UNIQUE coupon code so invoice.discount.coupon.id becomes the campaign revenue key — only two coupon ids exist in eight years, which is exactly why email revenue is dark; (3) run tools/retention/send_collision_check.py so nobody mid-offer is double-mailed; (4) lint Aga's copy through tools/retention/email_lint.py, INCLUDING the new charge-immediately gate — this send points at a 50%-off link so it must carry no trial mechanics at all; (5) at T+72h read the $78.50 charge count and report the verdict either way, including if it refutes the offer-layer hypothesis. Aga presses send. | FLEET | 90m | ●●●●● |
| 21 | 🤖 FLEET — THE MEMBER-FABRICATION CLEANUP (the rest of it). An 11 Aug audit of 5 nurture arcs found 57 named people: 35 r… 🤖 FLEET — THE MEMBER-FABRICATION CLEANUP (the rest of it). An 11 Aug audit of 5 nurture arcs found 57 named people: 35 real, 16 exist NOWHERE in TMA's records, 46 of 57 carry at least one attribute their source does not support, and 6 verbatim quotes were transplanted from 3 real donors onto other people's names. ALREADY FIXED TODAY: 973 slot 8 (Braden's life published as Jacques's, plus an invented daughter), 973 slot 3 (Tim's 7kg/frog-stand/muscle-up published as Timo's — Timo lost 15kg), 758 slots 3/5/7 (Anthony's tendinitis quote published as 'Mark, 37' and 'Karim' across ~19,600 sends), and the ROOT CAUSE (ANGLE_REGISTRY.json told writers to 'assign new names + specific details before writing' — now replaced with a hard prohibition). STILL OPEN: 751 entirely (144,606 sends, the biggest carrier, incl. an invented 'David, 47'); 759's Martin (a fabricated medical outcome in his own voice — 'and my knee healed', 0 hits; his record says 'bad knee aches'); the reusable fake identity 'Sarah, 48' carrying FOUR different medical histories across four assets; 764 slot 4's twelve invented people; Andrew's job and age differing between arcs; 'Peter' (7,015 sends) whose name TMA's own article deliberately withholds. METHOD THAT WORKS: grep every name/number/job/injury against marketing/avatars/SUCCESS_STORIES_SCRAPED.md, and confirm identity on a SECOND attribute — near-identical first names (Tim/Timo) caused two of the three transplants. | FLEET | 180m | ●●●●● |
| 22 | 🤖 FLEET — PHASE 1 OF THE ABANDONMENT BUILD, APPROVED BY AGA (D5, 7 Aug PM). Five moves, all fleet-executable, nothing wa… 🤖 FLEET — PHASE 1 OF THE ABANDONMENT BUILD, APPROVED BY AGA (D5, 7 Aug PM). Five moves, all fleet-executable, nothing waiting on a human: (1) FLEET-10 pagination fix — the limit=10 Stripe bug is live in check_saves.py/r1_daily.py while wb_tag.py tags wb-eligible daily, so a paying member on an 11th record can be mis-tagged expired; fix before 976 is ever armed. (2) Re-feed quiz_abandon_sync.py from tag 63773 NEW quiz-reached-checkout instead of Stripe incompletes — Stripe undercounts checkout viewers ~7x because a PREFILLED quiz email never fires the blur that mints the record; keep Stripe as the buyer-safety check and the KPI read. 🔴 EXPECT THE RECOVERY RATE TO FALL as the denominator widens with lower-intent people — that is dilution, not decay. (3) E1-E4 personalised rebuild through /abandon-fleet + /email-fleet gates (FLEET-42) against the §8 quiz data. (4) Wire cart_abandon_reconcile.py hourly + a register row so v3 has an audience the day it has traffic. (5) Hygiene: nothing left — the STOP/reply wiring, the AGA-125 title, the _briefs/02 correction and the E11 row were all completed 7 Aug PM. ORDER MATTERS: (2) before (3), because a better email to 1.5 people/day is worth less than the same email to 10. | FLEET | 240m | ●●●●● |
| 23 | 🤖 FLEET — EXTRACT THE PERSONALISATION CORE + BUILD THE WELCOME PACK AND ENROL-WRITER (Phases 0–2 of WELCOME_PERSONALISAT… 🤖 FLEET — EXTRACT THE PERSONALISATION CORE + BUILD THE WELCOME PACK AND ENROL-WRITER (Phases 0–2 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-08-07.md). PHASE 0 PROOFS FIRST: (a) one 150-char sentence → one test contact text field → read back, no truncation (SHARED with FLEET-44 step one — run it once, both estates consume it); (b) the pipe-default hypothesis %FIELD|full sentence% proven on a REAL send or not used. Then: lift assemble()/pick_quote()/jly_block()/tier-detection/manifest machinery into tools/retention/personalisation_core.py with quiz_abandon_manual_notes.py behaviour byte-identical (--example both tiers before/after must match); assemble_welcome() implementing the §5 LEAD-tier/zero-data ladder (slot COPY is written by Agent 07 through /email-fleet — the engine stores it, never authors it); mint the 7 TMA_WELCOME_* fields (NEVER reuse the abandon adapter's 72–76 — same person can be in both estates in one week, shared fields + the freeze law = cross-arc rewrites); welcome_personalise.py enrol-writer on the funnel_stage_export.py PUT pattern (one call · retry 429/5xx · abort >200 errors · clear-stale · read-back) + per-person manifest + freeze check via contactAutomations + launchd + AUTOMATION_JOB_REGISTER row. Bulk AC writes need the segment gate (segment_guard.py PASS, Step 1.4c). | FLEET | 240m | ●●●●● |
| 24 | 1 min: tell Sovat to restore CA to STAGING, not over production — or he undoes yesterday's repair NOW why this matters + step-by-stepWhat: Send the one-paragraph follow-up in your existing thread: marketing/seo/DEV_FOLLOWUP_RESTORE_TO_STAGING_2026-08-12.md. It says one thing — if a pre-push restore point exists for Calisthenics Academy, restore it into a staging environment, not over production. Why: Your sent message asks whether a restore point exists. It does not say what to do with it. If he finds one and helpfully restores it over production to put things right, he wipes the repair made on 12 August — all 44 ebook buy links pointing at ThriveCart — and puts the site back to 2020 a second time.
And the answer to your question — yes, it can come back, but there is very little to bring back. I hold pre-push copies of 5 CA pages: 4 are byte-identical to the reverted state, and the 5th has identical visible text to the character — its only real loss was 2 ThriveCart links, already redone. The May-2026 web archive of the ebook page has less content than the page live today. One confirmed casualty: the footer copyright line — but that is the Page Builder Everywhere deactivation, not the rollback, and the fix is already in your main message.
Honest limit: that is hard evidence for 5 of 25 pages, and a database holds more than pages — settings, widgets, menus, users. Which is exactly why it is worth restoring to staging and comparing, rather than declaring it fine. Steps - Reply in the same thread with the one paragraph — it is written, no editing needed
- If he produces a staging restore, tell me and I will diff it against production myself
- If the restore points do not reach back that far, we treat production as final
Done when: Sovat knows not to restore over production, and either we have a pre-push copy to compare against or we know for certain none exists. | AGA | 1m | ●●●●○ |
| 25 | 🟡 HOLD until 13 Aug — then a 2-minute GO/NO-GO on Google hardware negatives NOW why this matters + step-by-stepWhat: A 2-minute read-then-decide. If you say GO, the fleet executes it by API — you are not clicking anything in Google Ads. The change is set-level negative keywords on Quiz Funnel | Competitive Non-Branded | US. Why: 30-day totals: £235.89 / 32 clicks / 0 conversions — and zero all-conversions — while both siblings converted (Competitors Branded £311.57 → 24; Non-Branded £241.33 → 6). All 60 still-enabled keywords are equipment phrases, and the campaign carries zero negatives and zero shared negative lists. The money has been buying ‘backyard calisthenics setup’ £9.94, ‘outdoor calisthenics gym’ £8.46, ‘wooden parallettes’ £7.91, ‘dip bar for home’ £3.26 — hardware shoppers, and we sell a programme.
This also corrects an argument we have made ourselves: ‘never pause, 59 of 66 keywords are untested’ is right in general but does not transfer here — the untested 60 are the same equipment-intent class that has already spent £235.89 for nothing. Steps - Do nothing until 13 Aug. Read the campaign then
- If spend is still ~£6–9/day on hardware search terms → the set-level fix is needed. Say GO
- If there is a material sustained drop → Nic's round worked. Stand this row down and let the campaign have its clean fortnight to the 24 Aug gate
- On GO the fleet adds campaign-level hardware negatives: bar, bars, parallettes, equipment, gear, machine, station, vest, kit, setup, buy, for sale, cheap
Done when: Either the negatives are live and the 24 Aug gate reads a clean campaign, or the row is stood down because Nic's surgery already fixed it. | AGA | 2m | ●●●●○ |
| 26 | Decide the Remarketing Playbook — two calls left (item 1 is struck) NOW why this matters + step-by-stepWhat: Read the playbook (~5 min) and rule on two things: how far to un-pause Meta, and the shape of the Google abandoner ladder. Why: (2) Meta un-pause is DEMOTED to a small experiment. The ‘10 purchases at £2.41’ that justified a bigger un-pause was double-counted AND window-cropped; the honest figure is 5 purchases at £67.48 full-life — and all of them bought a $297 offer that ended 12 Jul. So the case for scaling it is much weaker than it first read.
(3) The Google abandoner ladder at £12/day — rung 1 is fine; rung 2 must move to days 17–30 so paid does not undercut the welcome email's only full-price ask on day 10. Two of our own channels bidding against each other for the same person is the thing to avoid. Steps - Read the playbook — it is one page: https://tma-remarketing-playbook.netlify.app
- Rule on Meta: run it as the small experiment, or leave it paused
- Rule on the Google ladder: confirm rung 2 moves to days 17–30
- The fleet executes both by API once you rule — no ad-UI clicking for you
Done when: Meta has an explicit run-or-stay-paused decision sized on the honest number, and the Google ladder no longer competes with our own day-10 email. | AGA | 5m | ●●●●○ |
| 27 | 993: build the promo-opt-out exclusion — 5 min, the arc is live and promises it NOW why this matters + step-by-stepWhat: One condition in the AC builder: add Tag does-not-exist promo-opt-out to the standing exclusion on every promo send path — 993 SALES SEQUENCE’s entry first, then any promo broadcast segment. Why: Every email in 993 SALES SEQUENCE promises “reply STOP to promo emails” and tags the replier promo-opt-out. The tag exists (I created it, id 63977) — but nothing reads it yet, so a member who opts out keeps receiving the arc. That was tolerable while it was paused; you armed it, 115+ are in flight, so the promise is now live and unkept. The exclusion condition lives in automation segment logic the API cannot write — genuinely builder-only. Steps - ActiveCampaign → Automations → 993 SALES SEQUENCE → entry/segment settings
- Add condition: Tag · does not exist · promo-opt-out
- Same condition on any promo broadcast segment you send to (the broadcast-cadence doctrine list)
- Tell me it’s in — I’ll verify a tagged test contact is actually skipped
Done when: A contact carrying promo-opt-out cannot receive a 993 email or a promo broadcast; verified with a test contact. | AGA | 5m | ●●●●○ |
| 28 | One wording ruling — 12 emails tell app signups they took a quiz they never took NOW why this matters + step-by-stepWhat: Give me one sentence and I apply it to all 12 emails in 751 Nurture Sequence 1 myself, HTML and plaintext. Why: All 12 currently say ‘You're receiving this because you took the assessment at The Movement Athlete’. That is false for the app-signup cohort, who arrive via 988 TMA | Welcome Sequence AFTER APPSIGNUP and never took the quiz. This is not theoretical — a real lead (contact 377159) replied asking ‘What is this for’, which is how it was found. A permission reminder that is untrue for a whole cohort is the line that turns a legitimate email into a suspected one. Steps - Approve a wording that is true for BOTH quiz leads and app signups
- My suggestion: ‘You're receiving this because you signed up at The Movement Athlete.’
- I apply it to all 12 emails, HTML + plaintext, through the upload-integrity gate
- Nothing else in the arc changes — this is a footer line, not a copy pass
Done when: All 12 emails in 751 carry one permission line that is true for every person who can receive them. | AGA | 5m | ●●●●○ |
| 29 | 🔴 By 18 Aug — cancel a duplicate trial before it dunning-mails a paying member NOW why this matters + step-by-stepWhat: Cancel one Stripe subscription: sub_1U3ABWI6s6pBAbnmVQgr1ADU. Stripe Dashboard → Subscriptions → search the id → Cancel immediately. Why: Laurent Frejaville (achatnet43@laposte.net) holds two trialing annual $157 subscriptions on two customer records, both with trial_end 18 Aug 2026. One has a card attached; the other has no card.
On 18 August the carded one bills correctly — and the uncarded one attempts, fails, and starts sending dunning mail to a live paying member. He gets chased for money he has already paid. That is a support ticket and a cancellation risk manufactured out of nothing. Steps - Stripe Dashboard → Subscriptions → search
sub_1U3ABWI6s6pBAbnmVQgr1ADU - Confirm it is the one with NO payment method attached, then Cancel immediately
- Leave
sub_1U3MTMI6s6pBAbnm9BmlPxJ1 (the carded one) alone — that is his real subscription
Done when: Only one subscription remains on that member, and nothing dunning-mails him on 18 August. | AGA | 5m | ●●●●○ |
| 30 | We are quoting two prices for the same annual plan — $97 and $78.50 NOW why this matters + step-by-stepWhat: Rule on the annual price: (a) harmonise everything to $97 and retire $78.50, (b) harmonise to $78.50, or (c) keep them deliberately separate and document why. Why: Both are live right now. The restored quiz paywall tier sells annual at $97; the email offer sells the same annual at $78.50 through /50promo/. Anyone who meets both — and email subscribers who take the quiz do — is quoted two different prices for the identical product. This is not obviously wrong: a channel-specific intro price is a normal, defensible tactic, and the quiz tier is already producing sales. But right now it is inherited rather than decided, which means nobody can propagate it consistently and every new page or sequence guesses. One ruling ends that. Steps - Pick (a), (b) or (c) — you can answer in chat, there is nothing to click
- If (c), say in one line WHY they differ (e.g. "quiz = intro price, email = win-back price") so it can be written down
- The fleet then propagates your ruling across the offer ladder, every sequence and every page in a single pass, and the reason travels with it so no future session re-opens it
Done when: One annual price story exists, written into the ladder and matching on every live surface — or a documented, deliberate split that anyone can read and follow. | AGA | 10m | ●●●●○ |
| 31 | 10 min in the 973 builder — three emails promising a deadline that does not exist NOW why this matters + step-by-stepWhat: Open 973 Nurture Sequence 1 NEW COPY FROM CLAUDE in the AC builder and pause steps 18, 19 and 22 — the three discount emails, one subject-lined “This closes at midnight”. Why: The entry repoint (AGA-98) stopped NEW people entering 973 — but re-verified live 6 Aug: the automation is still ACTIVE with 11,056 entered, so contacts already in flight can still receive the three steps, and the midnight deadline they promise does not exist. That is a trust problem on every send. The v3 API cannot touch steps, so this is genuinely a builder click. Steps - AC → Automations → 973 Nurture Sequence 1 NEW COPY FROM CLAUDE → open the builder
- Pause / disconnect steps 18, 19 and 22 (the three discount emails)
- Tell me “done” — I re-read the automation and close the row
Done when: No in-flight contact can receive a false-deadline email from 973; the row closes on my API re-read. | AGA | 10m | ●●●●○ |
| 32 | Add the split step in 991 — 10 min, and the test runs NOW why this matters + step-by-stepWhat: In the ActiveCampaign builder, add a 50/50 Split to 991 NEW Re-Engagement so half get the current first email and half get the new one. It is the only thing left. Why: You said “split it” — this is that, and I genuinely cannot do it: POST /api/3/automations/991/blocks returns 405 Method Not Allowed, so automation steps can only be built in the UI. I checked the ways round it too — cloning to a parallel automation is equally builder-only, and a standalone broadcast would skip R2/R3 and the suppression logic and break the arc. Everything else is done: the challenger is written and through every QA gate (including a flow gate it failed first and was fixed, not waved through), 8,765 contacts are cleaned, and the bounce circuit-breaker is armed. The current email gets 2 clicks per 478 sends — 0.42%, while 28% open it. This settles whether an easier ask fixes that, for every re-engagement email we send after this one. Steps - Open 991 NEW Re-Engagement - For people who stopped opening Before Sunset in the automation builder
- Add a Split action immediately after the start, BEFORE the first email — set it 50/50
- Leave path A on the existing R1 (“You’ve ignored my last 19 emails. Fair.”, campaign 4109)
- Point path B at the new challenger — the HTML is at
marketing/email-sequences/991-r1-challenger-3choice-2026-08/R1B-three-choices.html (already open on your screen) - 🔴 Keep the subject IDENTICAL on both arms. Deliberate — the subject earns 28.24% opens and is not the problem; changing it too would confound the only thing being tested
- Let both paths rejoin afterwards so R2, R3 and the suppression logic are untouched
- Tell me it’s live and I start the feed and read it at 7 days
Done when: Both arms are running on the same 8,765 people, and in about a week we know — on CLICKS, never opens — whether an easier ask wakes a dormant list. Either answer is worth having. | AGA | 10m | ●●●●○ |
| 33 | Approve three wording fixes in the live T+1h abandon email — they ship to Nic as one NOW why this matters + step-by-stepWhat: Say yes to three corrected wordings. They then go to Nic as one small deploy, alongside NIC-94 which already touches the same estate. Why: The email is ‘Try the app on us — your results are ready’ — the ~1h post-checkout send doing about 30 in 4 days at 29.3% open. Read live 7 Aug, its copy publishes:
(1) the retired 4.9★ — the published figure is 4.8. FLEET-14 swept the whole estate to 4.8 and missed this one because it lives in Django, not in AC or WordPress. (2) ‘Backed by Lead Sports Accelerator — led by Adidas and ex-Red Bull executives’. Canon is ‘the LEAD Sports Tech Accelerator — run by the Adidas family and ex-Red Bull executives’. It drops ‘Tech’ and turns ‘run by the Adidas family’ into ‘led by Adidas’ — a corporate endorsement we cannot evidence. (3) the T+0 results email additionally promises ‘goodbye to that annoying joint pain in just 30 days’ to every quiz finisher — a dated outcome claim we cannot stand behind. Steps - Read the rendered copy — the SendGrid group at the top of the review doc
- Say yes to all three wordings (or amend any of them)
- They ship to Nic as one deploy with NIC-94, which already covers the "[Chosen Password]" literal in the same estate
Done when: The live abandon and results emails carry the published rating, the accelerator's real name, and no dated outcome promise. | AGA | 10m | ●●●●○ |
| 34 | 🚨 Rescue the rotting Facebook leads — a 90-day fuse is burning, ~264 still retrievable NOW why this matters + step-by-stepWhat: Two things in the Facebook UI, about 10 minutes: export the stored leads before Meta deletes them, and reconnect the ActiveCampaign ↔ Facebook Lead Ads integration. Why: The MOF - Lead Form campaign's AC sync died on 1 Dec 2025. Every muscle-guide form lead since — roughly 1,100 people — filled in a form and never reached email. 🔴 Meta deletes stored leads after 90 days, so most are already gone: about 264 (May–Aug) are still retrievable today, and fewer tomorrow.
Meanwhile the campaign still spends about £78/mo into the broken pipe — so reconnect it before any more money goes in. Steps - Ads Manager → Leads Center → the Build Muscle With 40+ higher-intent form → export leads as CSV and drop it in the repo
- ActiveCampaign → Apps → reconnect the Facebook Lead Ads integration so new leads flow again
- Tell me when the CSV is in and I will import, tag and route them
- Reconnect BEFORE more spend — the campaign is live right now
Done when: The CSV of still-retrievable leads is saved, the AC↔Facebook connection is live again, and new form leads reach email the same day. | AGA | 10m | ●●●●○ |
| 35 | Arm the cart-abandon lane, or leave the highest-intent audience unserved NOW why this matters + step-by-stepWhat: Decide whether to arm 756 Part 1 - Abandoned Cart Reminder with its finished email. 757 Part 2 - Abandoned Cart Reminder stays off — its four emails are still literally empty. Why: Cart abandoners are the highest-intent audience we have and we currently send them nothing. The feed already exists and is running: on 5 Aug it found 43 abandoners worth $4,171, synced them into ActiveCampaign with persona, offer and plan — and actioned zero, because there is nothing armed to receive them. 🔴 Two things changed since this row was written: you paused both 756 and 757 on 5 Aug (so nothing is armed and dangerous today — verified live), and the missing-unsubscribe blocker is solved — a compliant replacement email is written and passes the lint gate. So this is no longer "fix a broken thing", it is simply on or off. Steps - Say arm it (or not) — 757 stays off either way
- The fleet loads the rebuilt email into a fresh AC shell (the live campaigns are ed_version=2, which the API cannot overwrite)
- You un-pause 756 only — automation status is builder-only, there is no API path for it
- The fleet creates the safety sentinel and runs the enrolment; a buyer can never receive one (the paid check re-runs at send time, not just at entry)
Done when: 756 is live with the compliant email, the ~14/day abandoners are being chased within the hour, and 757 stays safely off until someone writes its four emails. | AGA | 15m | ●●●●○ |
| 36 | BWTA has no SPF, no DKIM and no DMARC — publish all three NOW why this matters + step-by-stepWhat: Publish three TXT records on bodyweighttrainingarena.com and flip one switch in Google Admin. Why: 🔴 Proven on a real message header, not inferred. Mail claiming to be from BWA carries no authentication a receiver can check — spf=none, and the only DKIM signature belongs to the host (mail1.wpengine.com) rather than to us, so it doesn't align. Two consequences on our biggest property (1.9M impressions): inbox placement rests entirely on IP reputation, and anyone can send mail as this domain with nothing to stop them. All three records are free and none of them change mail routing. Steps - You do NOT need a new Cloudflare account — the zone is already there (
heather.ns/zeus.ns.cloudflare.com). You need the login to the existing one - Full click-by-click, either for you or to hand to the external dev: the BWTA email authentication work order
- Record 1 — TXT on
@: v=spf1 include:_spf.google.com ~all - 🔴 Record 2 (DKIM) is the one that matters and only you can generate it — it needs Workspace super-admin. Google Admin → Apps → Google Workspace → Gmail → Authenticate email → select the domain → Generate new record (2048-bit) → publish the value as
google._domainkey → come back and click Start authentication, which is the step everyone forgets - Record 3 — TXT on
_dmarc: v=DMARC1; p=none; rua=mailto:hello@bodyweighttrainingarena.com; fo=1; - 🔴 Publish at
p=none, never reject. The site's contact-form mail currently goes out unaligned through the host — at reject you'd start bouncing your own form notifications. Tighten it in a separate job after a fortnight of reports
Done when: A real test email to Gmail shows spf=pass, dkim=pass with header.i=@bodyweighttrainingarena.com, and dmarc=pass. The header.i domain is the bit that decides it — any other domain means the platform signed it, not us. | AGA | 20m | ●●●●○ |
| 37 | Fleet work: rebuild the 756/757 arc E1–E4 with quiz-data personalisation NOW why this matters + step-by-stepWhat: The fleet (not you) runs /abandon-fleet → /email-fleet to rebuild the four abandonment emails with the new quiz data — persona conditional content, obstacle line, stakes echo — before Nic uploads them (E11). Why: The existing E1–E4 passed lint on 3 Aug but were written before the lead-signal data existed; uploading them as-is would waste the personalisation edge the NIC-54 ship just created. Steps - Fleet runs the loop: data brief → owner strategy → specialist copy → full gate stack
- Finished HTML lands beside the old set with scorecards; you see the rendered emails before anything uploads
- Then E11 (Nic/you): upload into 756/757, add steps/waits, activate — and the QA gate + your sentinel arm enrolment
Done when: Four gate-passed personalised emails on disk, rendered set shown to you, E11 unblocked. | FLEET | 120m | ●●●●○ |
| 38 | Two rulings on the rebuilt old arc — nothing gets wired until you say so why this matters + step-by-stepWhat: Twelve old 50%-off emails have been rebuilt and are sitting as files. They are not an automation, nobody is receiving them, and nothing happens until you answer two questions. Why: I did everything that was mine: built all 12, passed the lint gate 18/18, checked every image loads, and put them in a viewer. What is left is genuinely yours. (a) is a positioning call — one email (Free Shoulder Mobility Week with Ricky Warren) sells Bulletproof Your Shoulders, which is a different product from the Academy, so it may not belong inside an Academy discount arc at all. (b) is a send to real members, and I never arm one of those without your yes. Steps - Open the viewer on your Mac — it is a local file, not a website:
marketing/seasonal-campaigns/memorial-day-2026/index.html. Double-click it, then click the 🗄️ OLD tab. - Read OLD-11 (the Ricky Warren shoulder one). Answer (a): does it stay in the 50%-off Academy arc, or move to the 984 Shoulder Mobility Week lane where the shoulder product already lives?
- Answer (b): do you want these 12 wired into ActiveCampaign at all — and if yes, which list enters them? They currently have no entry trigger and no day order.
- Tell me both answers. I build the automation; you approve the arming before a single email sends.
Done when: Both answered. Either the arc is scheduled to be built to your spec, or it is parked — and nothing has sent. | AGA | 10m | ●●●●○ |
| 39 | For your awareness: 15 members paid twice, $1,662.86 — no action taken, and none will be why this matters + step-by-stepWhat: Nothing for you to do unless you decide otherwise. This is a finding put in front of you because it is money and members, and any money decision on it is entirely yours. Why: Measured 11 Aug across every Stripe subscription since 2024: of 3,478 customers, 370 hold more than one subscription, and 15 of those paid for two overlapping periods — $1,662.86 in total.
🔴 This also corrects a claim I made to you. I said a live subscription plus a checkout always double-bills. You said our system recognises the email and lets them upgrade or rebuy — and you were right: 355 of the 370 resolve cleanly. But these 15 are real, and nothing in the estate was watching for them.
The worst: andreszeledon@gmail.com $157 over 314 overlapping days · mattlahana@gmail.com $141.30 over 290d · moniquetavian@gmail.com $235.50 over 90d · bmwparts@outlook.com $78.50 over 176d · stoica.ciprian@gmail.com $235.50 over 44d · tomifaludi@gmail.com $199.88 over 43d. Nine more run 4–39 days. Steps - Read it. That is the whole ask
- If you want to do something for any of these members, that is your call and you tell me
- What the fleet is doing without you: diagnosing HOW these happen — whether one specific path leaves the old subscription running — from Stripe alone
Done when: You have seen it, and the fleet has a diagnosis of the path that creates them so it can be closed at source. | AGA | 15m | ●●●●○ |
| 40 | 750 welcome — 24 live subject variants that can never be read. Pick (a) or (b) why this matters + step-by-stepWhat: One choice between two ways out of a test that cannot produce an answer. Why: You built A/B/C splits on all 8 slots of 750 TMA | Welcome Sequence After Quiz (campaigns 4147–4153). ActiveCampaign returns split data BLENDED — one row per campaign, not per variant — so no arm can ever be declared the winner. On top of that, 8 concurrent slots on one automation breaks the max-3-tests rule, so even readable data would be confounded.
One arm has to go regardless of which route you pick: slot 6's ‘your 50% off is live’ sells the same discount that 993 sells, on a different clock — the exact collision the deploy spec warns about. Steps - (a) I build per-arm readback first (campaigns/<id>/campaignMessages + per-message stats), and we keep ONE slot under test
- (b) Collapse to the single best variant per slot now, and test properly later once readback exists
- Either way: kill slot 6's "your 50% off is live" arm — it collides with 993
Done when: 750 is either running one readable test or no test at all — and in both cases the discount collision with 993 is gone. | AGA | 20m | ●●●●○ |
| 41 | Turn on 3 email tests — the weekly learning loop has learned nothing for 3 weeks why this matters + step-by-stepWhat: Set up three A/B splits inside ActiveCampaign. The specs are already written. Why: The self-learning loop has now run three weeks in a row with zero live experiments, because splits have to be created by hand in AC and nobody has. So the loop faithfully reports every week that it has nothing to learn from. Three tests are designed and waiting — a subject-line test on the quiz welcome, plus one on nurture and one on re-engagement. Steps - Open ActiveCampaign → the automation → the email → Split test
- The exact variants and split percentages are written in the ledger and the weekly report — copy them
- Tell me when they are live and I will confirm they are collecting
Done when: Three splits are running and the next weekly report has real data in it. | AGA | 45m | ●●●●○ |
| 42 | Revoke the external dev's WP Engine SFTP — the day his work signs off why this matters + step-by-stepWhat: Delete his SFTP user on three environments, once the PHP upgrade is finished. Why: He holds live SFTP to three production sites and is mid-upgrade, so his access is correct right now. A contractor's access outliving the job is the commonest way a fixed breach quietly returns — so this is dated, not urgent. Steps - Ask him for a completion date and tell me — I set the reminder from his answer, so this does not sit here rotting.
- On that day: WP Engine → Sites → each environment → Users and SFTP → delete. Three times, once per environment.
Done when: No contractor SFTP user remains on any of the three environments. | AGA | 10m | ●●●●○ |
| 43 | Own the WordPress dev workstream — 69 outdated plugins, two slow sites why this matters + step-by-stepWhat: Brief the external WordPress developer and hold four items, none of which you do yourself. Why: You took this from Nic on 2 Aug. It is a coordination job: 69 outdated plugins across three environments and 11 outdated themes, plus a mobile speed score of 48/100 on two sites. Neither is urgent enough to rush and both are the kind of thing that quietly gets worse. Steps - Plugins — ask the dev to triage first, not update everything: security releases now, live environments only, and Divi / Yoast / Redirection / WP Rocket handled carefully because those four break things
- Speed — the mobile-48 fix and the WP Rocket Delay-JS task are the same sitting; give them together or the second undoes the first
- 404s — WP Engine had a live wp-admin incident, so rule that out before anyone diagnoses a 404 on our sites
- Bandwidth — just eyeball it next cycle: 401 of 550 GB used with visits up 63%
Done when: The dev has a triaged plugin plan, the speed work is scheduled as one job, and bandwidth is checked once. | AGA | 20m | ●●●●○ |
| 44 | 🤖 FLEET — CONFIRM THE NIC-91 PAYMENTINTENT STAMP ONCE A REAL SALE LANDS. Nic deployed the three attribution writes 7 Aug… 🤖 FLEET — CONFIRM THE NIC-91 PAYMENTINTENT STAMP ONCE A REAL SALE LANDS. Nic deployed the three attribution writes 7 Aug ~19:20 UTC. Two halves are already verified in served code: /register/monthly_2026/ now posts a quiz_variant hidden field plus the full UTM set, and the live quiz bundle (index-yC00xO94.js) carries first_touch_utm_source/medium/campaign/content/term + first_touch_fbclid/fbc/fbp behind a once-only __tma_quiz_first_touch_applied__ flag. The THIRD write — checkout_version stamped onto the PaymentIntent — is server-side and can only be proven by a sale created AFTER the deploy. There were none on deploy day (last PI 11:31 UTC, eight hours early), so the state is NOT KNOWABLE, not broken. RUN: python3 tools/analytics/attribution_stamp_check.py — exit 0 confirms, exit 1 means still no sale (re-run later), exit 2 means the write genuinely did not land and Nic gets it back. Expect a sale within ~24-48h at current volume. | FLEET | 5m | ●●●●○ |
| 45 | 🤖 FLEET — THE STAGING-PUSH ALARM IS LIVE, AND IT NEEDS ONE HABIT TO STAY HONEST. Built 12 Aug after the CA loss: tools/o… 🤖 FLEET — THE STAGING-PUSH ALARM IS LIVE, AND IT NEEDS ONE HABIT TO STAY HONEST. Built 12 Aug after the CA loss: tools/ops/staging_push_guard.py watches all 3 production WordPress sites for content moving BACKWARDS in time, which is the signature of a stale staging database landing on production (normal work only ever moves the stamp forward). Credential-free by design — it reads the public REST API, because the CA push wiped the application password as a side effect and an authenticated guard would have gone dark at exactly the wrong moment. Registered in estate_selfcheck as 'staging-push-guard' (offline logic proof, 5 properties) + 'staging-push-live' (the live alarm, --network). Baseline laid 12 Aug from a verified-intact state: BWA pages 2026-08-12T03:32:13 + 31 quiz-root links across the 5 sample pages, TMA pages 2026-08-11T16:17:01, CA pages 2026-08-11T17:03:34. 🔴 THE HABIT: after any session that legitimately edits WordPress content, re-run tma posts=2026-08-05T21:55:48 pages=2026-08-11T16:17:01 links={} bwa posts=2026-08-11T20:26:44 pages=2026-08-12T03:32:13 links={'best-calisthenics-workout': 12, 'muscle-up-progression': 2, 'dips-progression': 2, 'handstand-push-ups-progression': 2, 'calisthenics-for-over-50': 2} ca posts=2017-09-27T13:44:04 pages=2026-08-11T17:03:34 links={} [staging-push-guard] baseline written /Volumes/T9/projects/the-movement-athlete/data/hosting/production_content_baseline.json so the baseline tracks real work — and NEVER re-snapshot to clear an alarm, because that blesses the loss instead of investigating it. The guard says so in its own alarm text. Also worth doing when the dev replies: if he confirms no staging DB push, note it against this row; if he cannot, raise the migration's urgency, because an install that can be overwritten this easily should not be the one we spend three more weeks improving. | FLEET | 5m | ●●●●○ |
| 46 | 🍎 SHIP THE STAGED iOS KEYWORD FIELD — the LIVE one wastes ~86 of its 100 characters, and the good one is ALREADY WRITTEN… 🍎 SHIP THE STAGED iOS KEYWORD FIELD — the LIVE one wastes ~86 of its 100 characters, and the good one is ALREADY WRITTEN and sitting unsubmitted. Read live from App Store Connect 11 Aug 2026. LIVE (v1.70.71, READY_FOR_SALE): 'ab,butt,beachbody,tracker,gym,exercise,diet,planner,trainer,buttock,calisthenics,ladder,routine,diet' — 'diet' appears TWICE (Apple ignores the duplicate), 'calisthenics' is ALREADY indexed free from the subtitle 'Calisthenics & Gymnastics' so it is 13 wasted characters, 'butt'+'buttock' are both off-brand, 'beachbody' is a competitor brand, and only ONE term describes what we sell. ALREADY STAGED on v1.70.72 (PREPARE_FOR_SUBMISSION): 'bodyweight,workout,plan,progression,home,beginner,strength,mobility,pull,push,handstand,planche,core' — no duplicates, nothing already-indexed, dramatically better. ✅ SO THE ASK IS SIMPLY: confirm v1.70.72 is actually going out, and tell us roughly when. If it is stuck, say what on. This matters because 87.3% of iOS installs come from App Store SEARCH and 74.3% install WITHOUT ever opening the product page — the keyword field and subtitle ARE the conversion surface, and this costs GBP 0. Optional further gain, our proposal, 92/100 chars, skill-intent over generics: 'bodyweight,pullup,pushup,handstand,muscleup,planche,lever,dips,mobility,strength,progression'. | NIC | 10m | ●●●●○ |
| 47 | 🤖 FLEET — 24h RE-READ of the Google Ads Conversions column. Aga demoted the 4 non-sale + 5 stale $297 actions to Seconda… 🤖 FLEET — 24h RE-READ of the Google Ads Conversions column. Aga demoted the 4 non-sale + 5 stale $297 actions to Secondary on 11 Aug, but at the 10 Aug 21:20 UTC pull metrics.conversions STILL counted 77 bid-counted lead-forms. Google recomputes that column against current settings with a lag. Re-run tools/analytics/remarketing_playbook_pull.py and confirm metrics.conversions has fallen to roughly the PURCHASE count while all_conversions stays high. 🔴 IF IT HAS NOT MOVED, the demotion did not take the way we think and the next step is setting biddable=false on the account-level CustomerConversionGoal for each non-sale category — say so rather than assuming. Also confirm action 7663033877 has stopped stamping £297 (it added £1,188 of phantom value on 4 conversions, 3 of them on 10 Aug); if it stamps again, disable it outright rather than leaving it Secondary. Everything else in the remarketing playbook is gated on this. | FLEET | 15m | ●●●●○ |
| 48 | 🔴 REMOVE THE THIRD-PARTY GTM CONTAINER FROM THE CHECKOUT — GTM-PPGJXHH is hardcoded in app/apps/templates/base.html and… 🔴 REMOVE THE THIRD-PARTY GTM CONTAINER FROM THE CHECKOUT — GTM-PPGJXHH is hardcoded in app/apps/templates/base.html and is NOT ours. Aga checked all 7 GTM accounts / 12 containers on 11 Aug: no match. It loads on every legacy /register/ checkout — the page that holds a live Stripe key — alongside our own GTM-TKGDZR9, and we cannot see what it fires. DELETE two blocks in that one file: the <script> at lines ~12-18 (head) and the <noscript> iframe at ~52-55 (body). Leave GTM-TKGDZR9 untouched. While in there, also delete the dead Universal Analytics tag UA-104067894-1 (line ~20) — UA was sunset by Google in Jul 2023 and sends nothing. Nothing else in the file changes. AFTER DEPLOY: load /register/yearly3/ and confirm only GTM-TKGDZR9 loads. | NIC | 15m | ●●●●○ |
| 49 | 🔴 NIC — STOP PMax BUYING PLACEMENTS THAT HAVE NEVER CONVERTED. 'Quiz Funnel | PMax | US | Sales OBJ' is the only LIVE ca… 🔴 NIC — STOP PMax BUYING PLACEMENTS THAT HAVE NEVER CONVERTED. 'Quiz Funnel | PMax | US | Sales OBJ' is the only LIVE campaign breaching the settled 'Category Search ONLY — no Demand Gen, no YouTube' ruling, and the breach is measurable: over the last 30 days its non-Search arms took £60.85 across 280 clicks and returned ZERO conversions — CONTENT/Display £28.37 (39,067 impressions, 210 clicks, 0 conv), SEARCH_PARTNERS £28.17 (48 clicks, 0 conv), YOUTUBE £3.28 (17 clicks, 0 conv), DISCOVER £1.03 (5 clicks, 0 conv). That is 40%% of the campaign's £150.32 spend buying nothing. 🔴 DO NOT PAUSE THE CAMPAIGN — its SEARCH arm took £93.07 and returned 78 conversions at £0.53/click, the lowest cost-per-conversion in the account. THE ASK: keep the Search delivery, stop the rest. PMax gives no clean channel toggle, so pick whichever you judge best and tell us which: (1) Account-level Excluded Placements + Content Suitability to cut Display/YouTube inventory; (2) campaign-level negative keywords + turn OFF Final URL expansion; or (3) the clean structural answer — retire PMax and move its £5/day into a standard Search campaign, which is what the ruling actually asks for. TWO CAVEATS TO CARRY, not decorations: (a) 86%% of this account's 'conversions' are email addresses, not sales — 30d the account booked 59 Leads-GTM + 46 generate_lead + 4 add_to_cart + 4 Android installs against only 14 Purchase + 4 Lifetime-promo — so PMax's 78 are leads; (b) PMax self-attributes generously (78 conversions from 174 clicks is a 45%% rate), so treat its Search figure as directional, not proven. VALIDATION (5 min): after the change, re-open the campaign's 'Where ads showed'/placement report 3 days later and confirm Display/YouTube impressions have gone to ~0 while Search impressions and conversions hold. | NIC | 15m | ●●●●○ |
| 50 | ✅ REASSIGNED 31 Jul — the WP Engine security deletions moved to the EXTERNAL DEV (now Step 0 of the migration brief), no… ASSIGNED-DEV ✅ REASSIGNED 31 Jul — the WP Engine security deletions moved to the EXTERNAL DEV (now Step 0 of the migration brief), not Nic. Nic's only remaining involvement in the hosting migration is dropping DNS TTL to 300s ~48h before cutover. Original detail: `docs/company/HOSTING_MIGRATION_2026-08/NIC_BRIEF_DELETE_EXPOSED_FILES.md`. | NIC | 25m | ●●●●○ |
| 51 | 🤖 FLEET — ROTATE THE META TOKEN (same scopes) AND SPEC THE COMMENT/DM REPLY LANE. Aga reversed the shrink: she WANTS ins… 🤖 FLEET — ROTATE THE META TOKEN (same scopes) AND SPEC THE COMMENT/DM REPLY LANE. Aga reversed the shrink: she WANTS instagram_manage_comments / instagram_manage_messages / pages_manage_engagement because she wants us replying to comments and messages. So keep the scope set. But the current string never expires, sits in .env.local and was pasted into a chat transcript — anyone holding it can post as the brand. DO: (1) rotate once, identical permissions, new secret; (2) never paste a token into chat again; (3) set a rotation reminder; (4) spec the reply lane itself — what the fleet may answer unaided vs what routes to Aga, since replying publicly as the brand is member-facing. | FLEET | 30m | ●●●●○ |
| 52 | 🤖 FLEET — TWO LIVE DEFECTS INSIDE THE PAID APP (was three; item 1 STRUCK on Aga's ruling). ⛔ STRUCK 12 Aug — the old ite… 🤖 FLEET — TWO LIVE DEFECTS INSIDE THE PAID APP (was three; item 1 STRUCK on Aga's ruling). ⛔ STRUCK 12 Aug — the old item (1) was '/getstarted/ redirects to /start-training/ which renders 4.9, fix to 4.8'. That is the SAME defect Aga backlogged as NIC-98 ('leave this alone, backlog this') and NIC-104 ('I never want to hear about this again'). Her ruling covers the string wherever it appears, including as a sub-item inside another row — do NOT re-raise it here or anywhere. REMAINING AND STILL LIVE: (2) 🔴 app.themovementathlete.com/profile/subscriptions prints 'Monthly 70% Off $24.99 Expires on 23.08.26 $0 / Week' — the per-week figure computes to $0, a display bug on the exact screen where a member decides whether to upgrade. Needs Nic (Django template). (3) /start-training/ still advertises 'LIFETIME $997 >> $497' — check against the 29 Jul promo-estate retirement; if the $997 anchor is dead, the strike-through is a false anchor and must go. NOTE: item 3 touches the same PAGE as the struck item but is a DIFFERENT claim (a price anchor, not the star rating), so it stands. | FLEET | 30m | ●●●●○ |
| 53 | 🤖 FLEET — CAPTION AUDIT ON EVERY COMPOSITED TESTIMONIAL IMAGE (replaces the cancelled strip task). Aga approved the life… 🤖 FLEET — CAPTION AUDIT ON EVERY COMPOSITED TESTIMONIAL IMAGE (replaces the cancelled strip task). Aga approved the lifetime library on 4 Aug knowing LT-01..LT-20 are composited (built 1 Jul, faces from the member face pool) and that 02_proof-walls + LIFETIME_PROOF_BANNER derive from them. Her two limits are the whole remaining exposure and they are now law. DO: (1) sweep every live and staged surface using a composited image — 967-leads-welcome-indoctrination (LIVE), 967-lead-magnet-quiz-arc, july4-lifetime-2026, quiz-checkout-abandon-2026-08, plus any page/ad — and remove any caption, alt text or adjacent copy asserting 'real screenshot', 'unedited', 'actual capture', 'screenshot from a member' or equivalent; proof framing is fine, capture claims are not. (2) Tag the assets in ALL_ASSETS_INDEX.json and the TESTIMONIALS-DATABASE with provenance real_capture vs composited, so no future agent has to re-derive it from CATALOG.json. (3) Where a surface needs a genuine capture — ad review, app store, press, regulator — route to Aga's own LIFETIME TESTIMONILS WALL .png, confirmed by her 4 Aug as assembled from real screenshots. 967 is LIVE so caption edits are SINGLE-SLOT under the EVOLUTION LAW. | FLEET | 40m | ●●●●○ |
| 54 | 🤖 FLEET (Claude) — REPOINT ALL 40 PINNED YOUTUBE COMMENTS AT THE QUIZ ROOT. Measured live 6 Aug with tools/youtube-analy… 🤖 FLEET (Claude) — REPOINT ALL 40 PINNED YOUTUBE COMMENTS AT THE QUIZ ROOT. Measured live 6 Aug with tools/youtube-analytics/comment_audit.py: 40/40 back-catalogue videos carry our pinned comment and every single one links to https://themovementathlete.com/calisthenics-assessment/?utm_source=youtube&utm_medium=organic&utm_campaign=yt_pinned&utm_content=<slug> — the doorway Aga's 3 Aug ruling removed from the YouTube path. The comments were written in July; the quiz-root retrofit rewrote DESCRIPTIONS ONLY, so comments (and end screens, and the channel About text) were silently out of scope. THIS IS MINE, NOT THE VA'S: comments.update works on our own comments. DO: rewrite each comment body swapping the doorway for https://quiz.themovementathlete.com/?utm_source=youtube&utm_medium=organic&utm_campaign=yt_pinned&utm_content=<same slug>, preserving the rest of the text verbatim. COST: 50 units x 40 = 2,000 — will not fit alongside the 9,800-unit retrofit run, so schedule it for 9 Aug once the retrofit finishes (8 Aug) and the full 10,000 is free. VERIFY AFTER with comment_audit.py, which reads live at zero quota and must show 0 on the retired doorway. | FLEET | 40m | ●●●●○ |
| 55 | 🤖 FLEET — TMA (themovementathlete.com): PROVE WHERE THE 10th MAGNET'S LEADS ACTUALLY GO. Continues AGA-69, which the fle… 🤖 FLEET — TMA (themovementathlete.com): PROVE WHERE THE 10th MAGNET'S LEADS ACTUALLY GO. Continues AGA-69, which the fleet took back. get-started-with-calisthenics (page 252941) uses a Spectra uagb/forms block whose 36 attributes are ALL styling — no afterSubmitAction, no confirmationType, no webhook, no email target. No Spectra entry post type exists (/wp/v2/types shows only spectra-popup, 0 items); no AC list or tag matches the magnet (100 lists + 200 tags searched); no Code Snippet hooks the form (11 read). STRONG EVIDENCE THE FORM IS DARK — if so, 'no UTM capture' is the lesser half and this magnet has been losing leads outright, not just their source. DO: (1) submit a canary through the live form with a unique address and watch AC, the WP admin email and any entry store for 15 min — that single test settles it; (2) if it IS dark, decide the destination (AC form-endpoint POST vs a snippet hook vs move it to Leadpages like the other 9) and build it with UTM hidden fields from the start; (3) if it is NOT dark, find the delivery path and add the UTM fields there. NOT READABLE FROM HERE (state honestly in the writeup): Spectra global settings and any server-side plugin such as WP Fusion are wp-admin UI, not REST. | FLEET | 45m | ●●●●○ |
| 56 | 🤖 FLEET — MAKE SPAM COMPLAINTS VISIBLE. 🔴 THE ORIGINAL METHOD IS A DEAD END, PROVEN 6 Aug: ActiveCampaign's campaign end… 🤖 FLEET — MAKE SPAM COMPLAINTS VISIBLE. 🔴 THE ORIGINAL METHOD IS A DEAD END, PROVEN 6 Aug: ActiveCampaign's campaign endpoint returns send_amt, opens, clicks, unsubscribes, hardbounces and softbounces but NO complaint field at all, so collect_metrics.py cannot be extended to pull what AC does not expose. THE GOAL IS NOW SERVED BY GOOGLE POSTMASTER instead — Aga verified themovementathlete.com on 6 Aug and the 120-day spam-rate series is recorded at data/email-analytics/postmaster/SPAM_RATE_SERIES.json, readable via tools/analytics/postmaster_read.py. REMAINING WORK: once the two Postmaster API grants land (AGA-122), switch the reader to live mode, wire the daily pull into collect_metrics.py, and connect the weekly safety sweep's 0.10% hard-stop to that series so the rule can finally fire. | FLEET | 45m | ●●●●○ |
| 57 | 🤖 FLEET — STEP 0 OF THE APP-DOWNLOAD TEST: instrument the paywall-exit app links, which already exist and are already ta… 🤖 FLEET — STEP 0 OF THE APP-DOWNLOAD TEST: instrument the paywall-exit app links, which already exist and are already tagged. The live v1 quiz bundle carries apps.apple.com/...?ct=paywall_exit and play.google.com/...&referrer=utm_source=quiz&utm_medium=paywall_exit, but GA4 receives NO click or outbound event of any kind on quiz.themovementathlete.com (all 10 event names enumerated 1-10 Aug), so take-up is NOT KNOWABLE. This is the cheapest measurement in the whole doc and it answers Aga's app-download question before anything is built. DOABLE WITHOUT NIC: GTM-TKGDZR9 loads on the quiz host and the fleet holds publish rights, so this is a GTM click-trigger + GA4 event tag, not a quiz code change. 🔴 Run getStatus() FIRST — publishing ships the WHOLE workspace and workspaces 132 (Dikesh) and 124 (Google Optimize) hold other people's pending changes; use a fresh Default Workspace and prove the event on the wire with headless Chromium reading /g/collect, never from the tag config. | FLEET | 45m | ●●●●○ |
| 58 | 🤖 FLEET — WIRE PINTEREST SO THE BOARD CAN SCORE IT (Aga: 'I am trying to wire it'). Create the Pinterest developer app +… 🤖 FLEET — WIRE PINTEREST SO THE BOARD CAN SCORE IT (Aga: 'I am trying to wire it'). Create the Pinterest developer app + OAuth, then score OUTBOUND CLICKS — Pinterest's real currency, judged over 90 days, never weekly impressions (~3.7-month content half-life). Acceptance: platform_registry.pinterest.lane flips DARK->AUTO in tools/social-pipeline/social_status.json and clicks render on the board. Aga may need to approve the app inside her Pinterest account — ask for exactly that ONE step and nothing more. | FLEET | 60m | ●●●●○ |
| 59 | 🔧 976 Cancelled Win-Back CARRIES THE WRONG OFFER — downgraded 11 Aug from a safety defect to an offer defect, after meas… 🔧 976 Cancelled Win-Back CARRIES THE WRONG OFFER — downgraded 11 Aug from a safety defect to an offer defect, after measuring the trigger. WHAT IS TRUE: msg 13204 'Your calibration data is still in there.' carries /30trial/ and HAS SENT to 219 people (the row's original 'never fired, no harm done' was wrong on both counts); msg 13169 carries it unsent. ✅ BUT THE DOUBLE-BILL HAZARD IS NOT REAL FOR THIS ARC: the automation fires at ACCESS-END, not at cancel — measured by joining AC entry dates to Stripe, entry MINUS access-end = 0 days for 14 of 14 sampled (gap to cancel-date 3-347 days), corroborated by ZERO overlap with the live cancel queue. Nobody in it holds a live subscription, which is why the sweep found 0 double-bills across 648 active subs and the link has 0 human clicks. ⇒ IT IS THE WRONG OFFER, NOT A HAZARD. The fix is the plan-aware offer in CANCELLATION_AND_WINBACK_STRATEGY_2026-08-11.md §2: ANNUAL leavers (84 of 115 cancellers) get ANNUAL AT 50% — $78.50/yr, which is $41.38 CHEAPER for them than $9.99/mo ($119.88/yr) and ~2.9x the cash for us — via checkouts-v3/50off/12month/ which is LIVE and needs no build; monthly/quarterly keep $9.99/mo, reply-handled since no self-serve door exists. Gated on Aga's D2. Single-slot per the EVOLUTION LAW; this arc is Tier C so it is arc-cohort only. | FLEET | 60m | ●●●●○ |
| 60 | 🤖 FLEET — RUN THE FREE-MEMBER AUDIT. Aga supplied the account (app.themovementathlete.com/login, rayariley87@gmail.com;… BLOCKED 🤖 FLEET — RUN THE FREE-MEMBER AUDIT. Aga supplied the account (app.themovementathlete.com/login, rayariley87@gmail.com; password in .env.local, never in a doc). Answer the three login-walled questions: (1) which upgrade CTAs a free member actually sees and where, (2) what the paywall state looks like from inside a free account, (3) whether the $9.99 step-down is reachable at all. Capture screens, then map against the F2 app-install funnel where the assessment REQUIRES the upgrade. | FLEET | 60m | ●●●●○ |
| 61 | 🟡 BUILD THE $97 WARM RETARGETING TEST — sequenced AFTER the 45-min sitting (keyword surgery + NIC-97 + MOF pause) and th… 🟡 BUILD THE $97 WARM RETARGETING TEST — sequenced AFTER the 45-min sitting (keyword surgery + NIC-97 + MOF pause) and the 17-Aug CPL report. Spec: ONE Meta campaign, objective OUTCOME_SALES, ~$5/day (~$150/mo from the freed budget), WARM audiences only (site visitors 30d · quiz-starters · quiz-checkout abandoners; EXCLUDE payers via the ever-paid set), creative = the $97 offer straight (no promo framing), destination = quiz root, keep url_tags. Judged ONLY on stamped Stripe sales (checkout_version=quiz_checkout + fbclid), 4-week read. Brief = tma-remarketing-playbook.netlify.app — use its corrected economics (£67.48 full-life per purchase during promos; the £2.41 is withdrawn), so expectations are honest: evergreen-$97 retargeting is UNTESTED, this is a test not a scale-up. Strategic kicker: the Nov BF retargeting push is Nic's build anyway — this warms the audiences, pixel events and creative learnings for it. | NIC | 60m | ●●●●○ |
| 62 | 🤖 ANDROID: 32% OF USERS NEVER SUCCESSFULLY SIGN IN — and it is NOT a crash. RE-DIAGNOSED 11 Aug with Play vitals + a geo… ASSIGNED-DEV 🤖 ANDROID: 32% OF USERS NEVER SUCCESSFULLY SIGN IN — and it is NOT a crash. RE-DIAGNOSED 11 Aug with Play vitals + a geo-controlled GA4 split. 🔴 THE CRASH THEORY IS REFUTED: Play Developer Reporting API says crash rate 0.00% and ANR 0.10% over 25 Jul-9 Aug. 🔴 IT IS ALSO NOT THE CHEAP-GEO PAID WAVE: holding geography constant to BUYER countries only (US/UK/CA/DE/AU/FR/NL...), Android still runs onboarding-done 125 -> first workout 57 = 45.6%, against iOS 242 -> 269 = 111% in the SAME countries. So it is the Android app, not the audience. 🔎 WHERE IT BREAKS: sign-in. Buyer-geo login iOS 239/242 = 98.8% vs Android 85/125 = 68.0%. And the smoking gun: 'social_login_attempted' fires 103x on iOS and ZERO on Android across 28 days, while Android alone emits 'signed_in' (18) and 'signed_up' (6). ❓ THE 2-MINUTE QUESTION FOR YOU: does the Android build actually offer Google / social sign-in on the auth screen, or is it email+password only? If social sign-in is MISSING on Android that alone explains a 31-point login gap (Google Sign-In is the default expectation on Android). If it IS present, then it is firing no analytics event and the drop has another cause -- either way your answer decides the fix. Please also confirm whether workout_started/start_workout are wired identically on both platforms. | FLEET | 60m | ●●●●○ |
| 63 | 🤖 FLEET — BUILD THE AC ADAPTER SO THE 756/757 ARC IS PERSONALISED (the engine's second surface). The renderer already pr… 🤖 FLEET — BUILD THE AC ADAPTER SO THE 756/757 ARC IS PERSONALISED (the engine's second surface). The renderer already produces per-person sentences (assemble() in quiz_abandon_manual_notes.py); this writes them into AC custom fields so each email carries ONE merge tag per slot. 🔴 STEP ONE IS A PROOF, NOT A BUILD: all 54 AC custom fields are type=text and there are ZERO textarea fields in the account — our sentences run 100-200 chars. Write ONE full sentence to ONE test contact, read it back, confirm no truncation. If it truncates, mint as textarea. FREE field ids (live census 7 Aug): 57, 72, 73, 74, 75, 76. Then: mint 3 fields (goal_line, objection_line, ps_line), write via PUT /api/3/contacts/{cid} with a fieldValues array (ONE call, proven at 11,500 contacts in funnel_stage_export.py:200, ~4-5 req/s, retry 429/5xx, abort >200 errors), and collapse E1's 7 fake data-ac-condition divs + E2's 8 into ~3 merge tags. FOUR LAWS, each already responsible for a defect elsewhere: (1) EVERY slot always written with a non-empty default — an unset AC field renders as an empty string, it does not skip the sentence; (2) slots FREEZE at enrol, one writer, no mid-arc rewrites, or E3 contradicts what E1 promised; (3) read back a sample live — the write is not the truth; (4) the email must render sensibly with every tag empty. DO NOT arm anything: the arc still needs Aga's shells + the sentinel. | FLEET | 90m | ●●●●○ |
| 64 | 🤖 FLEET WORK — DRAFT the Job-7 annual push NOW so it is ready the day the gates clear: the annual offer to the 6,038 eng… 🤖 FLEET WORK — DRAFT the Job-7 annual push NOW so it is ready the day the gates clear: the annual offer to the 6,038 engaged-reachable (the plan calls it the cheapest clean test of the warm end; P2's +$500–900/mo basis). Blocked from SENDING by the unsub gate (967 tripped 1.07% vs 0.5%) and worth full value only after Stripe-UTM (29 Aug gate) — but WRITING it is blocked by nothing: /email-fleet full pass (angle audit → 07 → formatter → lint → 08r), lands as drafts for Aga review. Send date is hers, at gate-clear. | FLEET | 120m | ●●●●○ |
| 65 | 🤖 FLEET — FUNNEL-STAGE EXPORT (Intercom→AC nightly): stamp WHERE EACH PERSON STOPPED onto their AC contact. D1 APPROVED… 🤖 FLEET — FUNNEL-STAGE EXPORT (Intercom→AC nightly): stamp WHERE EACH PERSON STOPPED onto their AC contact. D1 APPROVED by Aga 7 Aug ('you can do it, no Nic needed'); segment D (checkout-abandon) carved out to the Abandonment Fleet — lanes are A survey-unfinished / B no-workout / C no-trial only. Intercom holds the whole funnel state per contact WITH email (95,698 contacts) — zero Nic, no app release. Phase 1 read-only census running; Phase 2 (create 2 AC fields + backfill + nightly launchd job, register in AUTOMATION_JOB_REGISTER.md) waits on Aga's D2 GO after she reads the census. Nothing sends from this build — the recovery emails go through /email-fleet with Aga's separate approval. | FLEET | 120m | ●●●●○ |
| 66 | 🤖 FLEET — WIRE PERSONALISATION ENFORCEMENT INTO /email-fleet (Phase 4 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-0… 🤖 FLEET — WIRE PERSONALISATION ENFORCEMENT INTO /email-fleet (Phase 4 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-08-07.md — the 7 Aug architecture sweep measured the law STATED in 29 seat briefings and ENFORCED by zero pipeline checks). (1) Agent 02b gets a real runbook step in Step 3 + _briefs/02b-personalisation-brief.json added to OUTPUT CONVENTION and DONE WHEN — today the only personalisation artifact reaching Agent 07 is made by an agent the runbook never invokes; (2) email_lint.py checks 18–21: every %TMA_*% tag exists in LEAD_SIGNAL_CONTRACT §8 or the rendered-slot registry · BLANK-RENDER test (strip all tags → no broken sentence, no empty styled block) · a RESULTS-tier tag requires a declared results-seen audience header · data-ac-condition/%IF% = instant FAIL; (3) email-variable-auditor wired as a BLOCKING Step 7 evaluator for any email carrying %TMA_*% beyond FIRSTNAME, at EVERY tier (08b runs FULL-tier only — FAST currently ships personalisation unaudited); (4) Agent 18 pre-upload check 6: slot fields exist (live read) + enrol-writer registered and stamping + defaults verified on a sample; (5) SPEC-WELCOME rewritten against the expansion doc (it predates the signals — 12 Jul) · _SPECIALIST_COMMON_CORE gains the how-a-specialist-requests-slots block · 07-MASTER-WRITER + 18-DEPLOYMENT get the lead-signal block they currently lack. Also fix the email-variable-auditor internal contradiction (life_context on the Tier-4 ban list AND listed as a real RESULTS field in the same file). | FLEET | 180m | ●●●●○ |
| 67 | 🤖 FLEET WORK — TRUST_AUDIT_2026-07-31 hardening block: (1) collision-proof id allocation + row-hash guard on SEO_HUMAN_Q… 🤖 FLEET WORK — TRUST_AUDIT_2026-07-31 hardening block: (1) collision-proof id allocation + row-hash guard on SEO_HUMAN_QUEUE (F1 root cause — two sessions minted the same ids); (2) close the four proven gate blind spots (F3): estate checker passes an inflated honest-sum · brief-sync passes a garbage page with bare ids · queue-drift discharged by any id mention · charter --check passes a rotted source_file; (3) content-fingerprinted brief cards; (4) post-sync verifier diffing DEPLOYED cockpit + AGA_TODO surfaces against sources; (5) F4 stale AGA_TODO_NOW gating; (6) minors: moved-to-aga double-listing · NIC-20/E11 impact-5 rubric check · age column on BRIEF gate tasks · indent law contradiction in aga.md · YT sessions dual-source (3,695 vs 3,786 — name one source). No Aga decisions inside; work top-down. | FLEET | 300m | ●●●●○ |
| 68 | Comp Pablo Mendoza free premium — Jesse's drafted reply promises it NOW why this matters + step-by-stepWhat: Pablo (pmendozacaballero@gmail.com) left over rebuild bugs + the price, and offered us a detailed bug list. Jesse's reply is drafted in his thread and promises full premium, free, until the bugs are fixed — 'nothing for you to do'. Someone has to actually switch that on. Why: The reply engine's first draft answered only the price line of his 8-paragraph email; the real reply is now drafted (send it from hello@ Drafts). But its comp promise has no owner — an unfulfilled promise to the exact member who offered to help us debug is worse than no reply. Steps - Send Jesse's drafted reply in Pablo's thread (hello@ → Drafts → search mendozacaballero)
- Comp his account: admin access grant, or one line to Nic to set it in the backend
- When he sends the bug list, it flows to hello@ — the reply-watcher will surface it
Done when: Reply sent, premium active on his account without charge, and he's confirmed he's in. | AGA | 5m | ●●●○○ |
| 69 | Rule the day-5 trial reminder: keep/change/kill — and make Nic name the rail NOW why this matters + step-by-stepWhat: One ruling plus one question. Rule whether the day-5 trial reminder stays; ask Nic which rail actually sends it (Django, ActiveCampaign or Stripe). Why: The checkout page promises buyers a pre-renewal reminder, and you verified a day-5 reminder exists (10 Jul) — but nobody has ever established which system sends it, so we cannot say whether trial-enders are actually covered. Killing it would break a promise printed on the checkout; keeping it unverified leaves a silent gap. I searched the AC automation list via the API — no day-5 automation exists there, which makes the rail question real, not paranoia. Steps - Ruling: keep (recommended — the promise is on the page)
- One line to Nic: “which rail sends the day-5 trial reminder — Django, AC or Stripe?”
- I verify the answer against the named system and close the row
Done when: The rail is named and verified, or the reminder is consciously rebuilt where we can see it. | AGA | 10m | ●●●○○ |
| 70 | Exclude the 766 lead-form list from promo broadcasts — the cold band that bled July NOW why this matters + step-by-stepWhat: Add the 766 Facebook Lead Form | LM: Building Muscle After 40 audience as an exclusion on promo broadcast segments. Why: Re-verified 6 Aug: 766 is ACTIVE with 913 entered — cold lead-form contacts. July’s burst unsubscribed at 0.451%/send, 4.8× worse than May on the same shape, and the damage came from exactly this cold band being included in promo sends. Audience exclusions on future broadcasts are a builder setting the API cannot preset. Steps - AC → the promo broadcast segment/template → add exclusion: contacts from the 766 lead-form list (or its tag)
- Tell me the segment name — I verify the next promo’s audience count drops accordingly
Done when: The next promo broadcast’s audience provably excludes the 766 cold band; unsub-per-send is compared against July’s 0.451%. | AGA | 10m | ●●●○○ |
| 71 | GTM-PPGJXHH — is that container yours under a different Google login? why this matters + step-by-stepWhat: One login check: is Google Tag Manager container GTM-PPGJXHH owned by an account of yours (agency, old account, a previous contractor)? Why: The legacy checkout page app.themovementathlete.com/register/yearly3/ is still live (verified 5 Aug: HTTP 200, titled “Register and pay”, carrying a live Stripe key) and it loads two GTM containers — GTM-TKGDZR9 (ours, readable) and GTM-PPGJXHH (not in the account our credentials can see). ✅ The urgency is low and that is measured, not assumed: Stripe subscriptions created in the last 30d split v3 115 / quiz_checkout 58 / unattributed 48, and the unattributed cohort ran 1–4/day all July then stopped — last one 2 Aug, zero on 3, 4 and 5 Aug. The money has already moved off that door; your redirect worked. What is left is simply not knowing who is firing tags on a page that holds a live payment key. Steps - Sign in to tagmanager.google.com — try each Google account you have, including any old or agency one
- Look for container
GTM-PPGJXHH - If it is there: Admin → User Management → add
google-analytics-claude-access@the-movement-athlete.iam.gserviceaccount.com as a Viewer. The whole question closes and the fleet can read it - If it is not there: tell me — that means a third party is firing tags on our checkout, which is the version worth acting on
Done when: You can say either “it is mine, access granted” or “it is not mine”. Nothing else depends on this today. | AGA | 10m | ●●●○○ |
| 72 | Pick how we measure clicks on the transactional emails — A or B why this matters + step-by-stepWhat: Right now we measure zero clicks on any transactional email. Click tracking in SendGrid is switched OFF at the account level, so all 1,106 emails delivered in the last 14 days recorded no clicks by construction — there is nothing to look at. Why: The one that matters is the abandon email 'Your login is in this email' — it goes out 11–14 times a day, gets opened 29.3% of the time, and its entire job is walking someone back to the checkout. We cannot say whether a single person has ever clicked it. That is money we can neither prove nor improve. I did not just switch tracking on, because doing so rewrites the links in password-reset and activation emails too — and a mail-security scanner that pre-fetches a rewritten one-time link can burn the token and lock a real member out of their account. That risk is yours to accept or decline, so it is a decision, not a chore. Steps - Option A — recommended, zero risk, no SendGrid change. We put UTMs on that email's links pointing at the quiz root, and read the clicks in GA4. It measures what we actually care about — people arriving at the checkout — not pixel fires. Costs one Django template change from Nic.
- Option B. Flip SendGrid → Settings → Tracking → Click Tracking to ON. One click, covers every transactional email at once — but carries the lockout risk above.
- If you want B anyway, the safe form is click tracking on the abandon email only, not account-wide. That is also a Nic change, so it is no faster than A.
- Reply A or B. I write the brief and hand it to Nic the same day.
Done when: You have said A or B, and the corresponding change is on Nic's approved list. | AGA | 10m | ●●●○○ |
| 73 | Do not read August's numbers yet — a note, not a job why this matters + step-by-stepWhat: Nothing to do. Just do not quote August's mix to anyone until around 13 August. Why: Annual share currently reads 57.1% against July's 13.8%, which looks like the new pricing page working beautifully. It is 4 sales out of 7, on day 3 of the month. At that size the number is equally consistent with “no change at all” and “huge win”. The same applies to retention's “4 cancel-ends” against July's 110. The direction is encouraging and the pricing page did ship on 31 July, so this is genuinely its first read — it is just not a result yet. Steps - Do not put these figures in front of Nic, the board, or any buyer
- At roughly 30–40 sales — about 13 August at the current 2.3/day — it becomes decision-grade
- I will bring you the real number then
Done when: 13 August passes and the number is read properly. | AGA | 1m | ●●●○○ |
| 74 | Watch hello@ for listicle replies why this matters + step-by-stepWhat: Keep an eye on hello@ for three outbound pitches. Why: Three went out today (fitbudd, gymnasetips, thehybridathlete), each offering free full access plus an optional commission arrangement. If one says yes we need to provision the free account promptly — a slow reply to an inbound yes wastes the placement. Steps - Watch hello@themovementathlete.com over the next few days
- Forward me any reply and I'll draft the response + provisioning steps
Done when: Each pitch has a reply or is aged out. Log: marketing/seo/listicle_outreach_log.json. | AGA | 5m | ●●●○○ |
| 75 | Ruling: strip the affiliate-programme links from a nurture sequence? why this matters + step-by-stepWhat: One decision — should the BECOME AN AMBASSADOR / affiliate-programme links stay in the nurture emails? Why: They send a subscriber who is being nurtured toward buying away from the offer and into a programme that pays out. Whether that trade is worth it is a judgement about the business, not a number I can settle. Steps - Reply strip them or leave them.
- If strip: the email fleet removes them and the lint gate keeps them out.
Done when: One answer, and the sequence matches it. | AGA | 5m | ●●●○○ |
| 76 | Make a free test account — 10 minutes, unblocks a whole audit BLOCKED why this matters + step-by-stepWhat: Create an ordinary free account on the app and send me the login. Why: Three questions cannot be answered from outside a login, and they all matter: which upgrade prompts a free member actually sees, what the paywall looks like from inside, and whether the $9.99 step-down is even reachable. Until the account exists the free-member audit cannot start at all. Steps - Sign up as a normal free user with any address you control
- Send me the email and password (or add me to a password manager entry)
- I run the audit from inside
Done when: I can log in as a free member and the audit report follows. | AGA | 10m | ●●●○○ |
| 77 | Hide the staging and beta sites from Google — Cloudflare, no deploy why this matters + step-by-stepWhat: Add one Cloudflare rule so test sites stop appearing in search, then clear what is already indexed. Why: staging. and beta. are being served to Google like real sites. Neither has a working robots.txt, and both return a normal 200 with nothing telling search engines to stay away. Test copies of your site competing with the real one is bad; indexed promo pages are worse. Steps - Cloudflare → Rules → Transform Rules → Modify Response Header
- Add
X-Robots-Tag: noindex, nofollow for hostname staging.themovementathlete.com, then the same for beta. - That is step 1 done — instant, no deploy, one click to undo
- 🔴 STOP — wait for Nic before the next step. It removes
app.themovementathlete.com/, which depends on Nic's noindex header on app. (NIC-43) — not the Cloudflare rule you just set, which only covers staging and beta. - Then Search Console → Removals → “Remove all URLs with this prefix” →
app.themovementathlete.com/ as ONE entry
Done when: Both hosts return the noindex header, and the already-indexed promo URLs disappear within about a day. | AGA | 25m | ●●●○○ |
| 78 | 🤖 Fleet: the 5 'B' variants in 967 use a non-canonical footer why this matters + step-by-stepWhat: Fleet work — no action from you. Messages 13549, 13551, 13553, 13555 and 13557 in 967 TMA | Welcome Sequence After LEAD MAGNET fail two lint checks that their A variants pass. Why: They are missing the locked social-proof row (badge image + ‘100,000+ members · 4.8 stars’), and their body/P.S. repeats the footer's proof, so the reader is told the same social proof twice. Pre-existing and inherited from whatever builder produced the B arm — the 11 Aug E1 rewrite took 13549 from 4 lint failures down to these 2 but deliberately left the shell untouched. Steps - Paste the locked footer into all 5 messages
- Remove the duplicated proof line from the body
- Plaintext regenerated in the same PUT, then the upload-integrity gate
- Bundled with FLEET-59 — same messages, one pass
Done when: All 5 B variants pass the footer and duplicate-proof lint checks, and read back correct from the API. | FLEET | 40m | ●●●○○ |
| 79 | 🤖 Fleet: 12 of 15 messages in 967 have a preview line that contradicts the email why this matters + step-by-stepWhat: Fleet work — no action from you. In 967 TMA | Welcome Sequence After LEAD MAGNET, the preheader_text field and the baked hidden preview div disagree on 12 of 15 live messages. Why: Several disagree materially. 13555's field promises ‘Marcus… 100 burpees destroyed Gareth's spine (here's what saved him)’ over a body about 20-minute sessions; 13549's promises ‘Your exact roadmap to abilities you thought were years away’; 13557's ‘Heavy weights make you weaker (I have proof)’.
This is the false-promise class — a preview promising what the body cannot deliver. It is pre-existing, not caused by the 11 Aug repair. Steps - Per message, decide which line is actually true of the body
- Write ONE line into both surfaces — the API field and the baked div
- Re-run the integrity gate
Done when: Every live message in 967 has one preview line, and it is true of the email underneath it. | FLEET | 45m | ●●●○○ |
| 80 | 🤖 Fleet: all 17 messages in 992 carry a preheader from a different sequence why this matters + step-by-stepWhat: Fleet work — no action from you. In 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th, the baked preview and the API preheader field disagree on every single message — and the field text is 967 lead-magnet copy. Why: 13651's field reads ‘Fifty-two and starting over, forty-seven and unfit…’ against a body about your workouts being everyone else's. 13638's reads ‘A warm hello, and the real reason bodyweight training never stuck.’
The preview line is the most-read copy in an email after the subject, so 17 readers' first impression is a promise the email never makes. Verified pre-existing against the pre-write backups — neither the door repair nor its round-2 fix touched this third surface. Steps - Per message, decide which line is true of the body
- Write ONE line into BOTH surfaces (field + baked div)
- Plaintext regen in the same PUT, then the integrity gate
Done when: All 17 live messages in 992 carry one preview line that matches their own body. | FLEET | 50m | ●●●○○ |
| 81 | 🤖 Fleet: 18 of 24 live messages in 750 fail the email formatting gate why this matters + step-by-stepWhat: Fleet work — no action from you. A formatting-only pass over 750 TMA | Welcome Sequence After Quiz. Why: 18 of its 24 live messages fail the mandatory formatting gate — missing bold and italic emphasis, no underline, and W7 has no visual-break block. Proven pre-existing: the pre-write backups fail identically.
It was invisible until 10 Aug because email_lint.py --ac had a short-circuit bug that linted exactly one message per series — a guard reporting success over work it could not see. That bug is now fixed, which is why the real number appeared. Steps - Run the formatter seat over the live arc
- ONE Evolution-Law-clean formatting-only pass — no copy changes
- Upload through the integrity gate
Done when: All 24 live messages in 750 pass the formatting gate, with no copy altered. | FLEET | 60m | ●●●○○ |
| 82 | ⏳ Not now, by your own ruling — approve the 48h enforcement when Nic's queue clears why this matters + step-by-stepWhat: This is a reminder, not a task. You ruled the $97 window binding on 7 Aug and said Nic is not to be interrupted for it. This row exists so it reaches him later rather than getting lost. Why: What he'll do (~45 min): enforce the window at charge time, not just in the UI — once an email has had a window, it never gets a second one. Acceptance test: an address 48h+ old sees $157 and Stripe charges $157.
What it unblocks: until it ships, no recovery email may claim the deadline — the server never returns expired today, and a lapsed visitor simply gets a fresh 48 hours. That is why the abandonment arc's E3 ‘your window closes tonight’ beat cannot ship at all. Steps - Leave it until Nic's queue clears — that was your call and it still stands
- When it clears, approve it and it goes onto his brief
- Approve → the abandonment arc gets its third email. Leave it → the arc runs E1-E2-E4 honestly, which is a perfectly good sequence
Done when: Either the window is enforced at charge time and E3 can ship, or E3 stays retired and the arc runs as three honest emails. | AGA | 10m | ●●●○○ |
| 83 | Confirm the PHP state — we genuinely can't see it ASSIGNED-DEV why this matters + step-by-stepWhat: Answer two questions about PHP versions. Why: The WP Engine activity log shows “PHP update from version 8.4.0 to …” at 04:50 on 30 July, and the portal separately reports “5 PHP outdated”. We cannot read PHP version from outside — WP Engine exposes it in neither headers nor REST — so the current state is genuinely unknown to us. Steps - Which environment did that 04:50 update apply to, and to what version? (if anything moved down from 8.4.0, that matters)
- Is BWA still on 7.4.33?
Done when: Both answered — a sentence or a screenshot is enough. | NIC | 10m | ●●●○○ |
| 84 | BWA PHP 7.4.33 → 8.2 (with a separate dev) ASSIGNED-DEV why this matters + step-by-stepWhat: Upgrade PHP on BWA and regression-test. Why: 7.4.33 is end of life — no security updates, and WordPress will stop supporting it. Flagged by the WP dashboard itself. Steps - WP Engine portal change + regression test
- Target 8.2, not 8.3 — Divi is only tested to 8.2
- Brief:
marketing/seo/DEV_BRIEF_bwa_php_upgrade_2026-07-29.md
Done when: BWA runs 8.2 and the site renders correctly. | NIC | 30m | ●●●○○ |
| 85 | RECONCILE THE LIVE PAID-SPEND FIGURE: the fleet quoted ~$897/mo (cockpit) while the 10 Aug live pull said ~$2,310/mo (Me… RECONCILE THE LIVE PAID-SPEND FIGURE: the fleet quoted ~$897/mo (cockpit) while the 10 Aug live pull said ~$2,310/mo (Meta $286.90 + Google £359.11 over 1-10 Aug) — a 2.5x gap. One fresh pull, both platforms, one stated window and label; until then the number carries [UNRECONCILED] and must not be quoted bare. Does NOT move the identity-resolution verdict ('everything that ever sold is paused' holds at either figure). | FLEET | 15m | ●●●○○ |
| 86 | WATCH ROW (DEC-2026-08-11-no-for-now-to-the, review 15 Dec): US consumer identity-resolution vendor lane is DEAD unless… WATCH ROW (DEC-2026-08-11-no-for-now-to-the, review 15 Dec): US consumer identity-resolution vendor lane is DEAD unless BOTH triggers fire — (a) the Nov BF first-party own+suppress holdout shows an ROI lift AND (b) counsel clears US-only anonymous-visitor resolution for a UK-established entity (Art 14 / DPIA / ICO third-party-list posture / CIPA pixel wave). If both clear: scope an ISOLATED pilot only (separate ESP + cousin domain, never the TMA AC account — AC's acceptable-use policy prohibits third-party-sourced addresses), Dec 2026/Jan 2027. Full verdict: quiz-funnel-versions/#sPAidr | FLEET | 20m | ●●●○○ |
| 87 | 🤖 FLEET — FINISH THE §8.4 RECONCILE OF LISTICLE_TARGET_SHEET_2026-07-25.md. Surfaced 11 Aug 2026 by doc_decision_drift.p… 🤖 FLEET — FINISH THE §8.4 RECONCILE OF LISTICLE_TARGET_SHEET_2026-07-25.md. Surfaced 11 Aug 2026 by doc_decision_drift.py after its extractor was fixed — the check had been BLIND since 5 Aug (it hardcoded '## 7. Open decisions'; the doc renumbered it to §8), and a bare-substring routing test then cleared §8.4 because '8.4' matched an unrelated queue row reading 'PHP update from version 8.4.0'. VERIFIED HALF-DONE on 4 Aug: the 4.9★ instruction IS retracted (the sheet now says 'NEVER quote a star rating'; real = 4.53★/297 iOS, 4.7★/374 Play) and rows 3+5 now carry 'NEVER re-offer a commission — they already have one'. STILL OPEN: the contact routing. Rows 3 and 5 are EXISTING Tapfiliate affiliates (Jari Dohmen / calisthenicsworldwide.com, Rick Donohoe / calisthenics-101.co.uk — 65 clicks, 2 customers, £37.47) but the Contact column still says 'Site contact form' / 'Contact page', while the sheet's own correction block states their real email addresses were sitting in our Tapfiliate export the whole time. DO: pull both emails from the affiliate export, replace the contact-column values, then mark §8.4 ✅ in OUTREACH_MASTER so the drift check clears. Commission TERMS stay OPEN (§8 item 3) — that one is Aga's ruling, do not invent terms. | FLEET | 25m | ●●●○○ |
| 88 | P10 front-lever cluster 301s — FLEET EXECUTES (off Nic's list 7 Aug), ranked LAST: 3 x 301 (/improve-front-lever/, /how-… P10 front-lever cluster 301s — FLEET EXECUTES (off Nic's list 7 Aug), ranked LAST: 3 x 301 (/improve-front-lever/, /how-to-do-a-front-lever/, /front-lever-variation/ → /front-lever-progression/) + 6 internal-link repoints via the Redirection REST API, ~20 min. NIC82 keyword map (6 Aug, Aga-approved) downgraded the lane: ≈+1.1 leads/28d [MODELLED] across all three clusters, zero-click share 62-72%, 8 live pages not 9, DO-NOT on the fourth merge. Live-checked 7 Aug: all 4 URLs still 200 — work real, value low. | NIC | 30m | ●●●○○ |
| 89 | 🤖 FLEET — 973 Nurture 1 BODY defects surfaced by the blind subject judges. The envelope is fixed (11 subjects+previews s… 🤖 FLEET — 973 Nurture 1 BODY defects surfaced by the blind subject judges. The envelope is fixed (11 subjects+previews shipped 11 Aug); the copy underneath is not. (1) JACQUES IS THREE DIFFERENT MEN: slot 7 = a decade of weightlifting, slot 8 = a powerlifter with a daughter and shoulder pain, slot 16 = a physicist. Same first name, contradictory biographies, one arc — a reader who gets all three learns the case studies are manufactured. (2) SIX OF SIX protagonists are male, on a list JESSE_VOICE_CORE defines as men AND women 35-60+. (3) The bill/invoice/tab metaphor sits in THREE bodies (8, 10, 16), and a body-keeps-an-accurate-journal line is near-verbatim in bodies 2 AND 3. (4) Slot 8's body promises members' answers will challenge everything you know, then gives not one answer. Each is a SINGLE-SLOT change under the EVOLUTION LAW — rename Jacques in two bodies, strip the duplicated metaphors, pay slot 8's promise. Not an arc rewrite. | FLEET | 45m | ●●●○○ |
| 90 | 🤖 FLEET WORK BLOCK — hello@ job-family hardening, the remaining open audit findings: O2 (HIGH: send_payment_drafts caps… 🤖 FLEET WORK BLOCK — hello@ job-family hardening, the remaining open audit findings: O2 (HIGH: send_payment_drafts caps at 100 drafts unpaginated — oldest fall off first and an approved email silently never sends) · O3 (r1_queue_emails fails open → two lanes can email the same person) · O4 (autosend no send-time spacing/re-check) · O5 (guardian false-MISSED on long jobs) · O7 (_lifetime_paid caps at 100 invoices) · O8 (973→758 duplicate on ambiguous timeout — job self-completes ~2 Aug) · O9 (crash can duplicate reply drafts) · O10 (cross-lane pairs unguarded) · O11 (R1 lifetime set never re-touches a repeat canceller) · O12 (LOW ×10 hygiene). Owner: the FLEET — none needs an Aga decision; O1 and O6 already have their own rows (done / AGA-49). Work them top-down (O2 first), same session-per-fix discipline as O1: fix → verify → strike through in the findings doc. | FLEET | 240m | ●●●○○ |
| 91 | 🤖 Fleet: 992 reports itself as up to three different campaigns in GA4 why this matters + step-by-stepWhat: Fleet work — no action from you. One convergent pass over the UTM tags in 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th. Why: Three different utm_campaign values live inside single emails: the 45 quiz links and 2 checkout links carry 992-tma-welcome-after-appsignup (stamped by the door repair); the ~34 site links still carry the retired 968-app-signup-activation-jul2026; and neither matches the registry-derived slug the tagging tool would mint, 992-tma-welcome-sequence-after-appsignup-ab.
So one email reports itself as up to three campaigns, and the arc cannot be read as a unit. Partially pre-existing, partially introduced by the repair. Steps - One convergent pass settling on the registry slug across every link in the arc
- Re-run the UTM checker in --check mode
- Same class exists on 967, whose footer links carry utm_content slugs naming the RETIRED subject lines — fold it in
Done when: Every link in 992 carries the registry slug, and the arc reads as one campaign in GA4. | FLEET | 40m | ●●○○○ |
| 92 | Go/no-go: bulk-delete 4,464 junk ActiveCampaign tags so the tag manager is usable why this matters + step-by-stepWhat: A yes or no. If yes, I scope it and show you a dry-run list first — nothing is deleted without your sign-off on the actual list. Why: 4,464 of 5,846 AC tags (76.4%) are one-person junk — the result of the add_tag_to_quiz_contact() bug that concatenated a field value into the tag name. 5,621 of them were minted in a single day, 29 Oct 2025.
Nothing is getting worse — the writer has been quiet since Nov 2025. This is purely about making the tag manager navigable again, which matters every time anyone builds a segment and has to find the real tags among the noise. Steps - Say go and I scope it
- I produce a dry-run list of exactly what would be deleted
- You sign off on that list — then, and only then, anything is removed
Done when: The tag manager shows roughly 1,400 real tags instead of 5,846, and every deletion was on a list you approved. | AGA | 5m | ●●○○○ |
| 93 | 🤖 Fleet (deferred by you): sweep the accelerator wording to canon — 32 occurrences why this matters + step-by-stepWhat: Fleet work, and you already deferred it. 32 occurrences across 25 files read ‘Lead Sports Accelerator — led by Adidas and ex-Red Bull executives’. Why: Canon is ‘the LEAD Sports Tech Accelerator — run by the Adidas family and ex-Red Bull executives’. The live wording drops ‘Tech’ and turns ‘run by the Adidas family’ into ‘led by Adidas’ — a corporate endorsement we cannot evidence.
🔴 I told you this was a one-line fix and it is not. It spans the free-workouts email, the buyer welcome email, the no-quiz welcome and the page. Steps - Deferred by you — it runs when the higher-value rows are clear
- Shipping blocker to resolve first: tma-paywall-spec is NOT in the deploy estate, so the corrected page cannot ship via the sanctioned path — either add it to the estate, or Nic copies canon by hand
- Do NOT fold the 3→[N] change into this pass — that number is your decision, separately
Done when: All 32 occurrences read the canonical accelerator line, and the page shipped through a sanctioned deploy path rather than by hand. | FLEET | 45m | ●●○○○ |
| 94 | 🤖 FLEET — GA4 SEES ZERO tma.thrivecart.com SESSIONS IN 28d, YET THE TAG DEMONSTRABLY FIRES THERE. Wire-tested 12 Aug: bo… 🤖 FLEET — GA4 SEES ZERO tma.thrivecart.com SESSIONS IN 28d, YET THE TAG DEMONSTRABLY FIRES THERE. Wire-tested 12 Aug: both ThriveCart carts (calisthenics-ultimate-guide + challenge2026) load GTM-TKGDZR9 and send GA4 hits on our own G-ZBQN3P8WKW. But a GA4 query on property 177471782 filtered to hostName CONTAINS 'thrivecart' returns ZERO rows over 28 days, while the identical query for 'calisthenicsacademy' returns 239 sessions — so the query is fine and the hostname genuinely is not in the property. Candidate causes, in order of likelihood: (a) the cart simply gets almost no traffic and 28d of near-zero rounds to no rows; (b) tma.thrivecart.com is not a configured domain on the data stream, so hits are dropped or mis-attributed; (c) an internal-traffic or unwanted-referral filter is excluding it; (d) consent/cookie state on that host blocks the hit before it lands. DO: check the GA4 data stream's configured domains and any active filters, then confirm with a realtime report while loading the cart by hand (realtime bypasses the 24-48h processing delay that makes a fresh test look like a zero). LOW PRIORITY AND SAY SO: the ebook these carts sell has 7 charges <=$35 across Stripe account 2's ENTIRE 79-charge history and ZERO in 90 days, so the traffic being measured is probably near-nil anyway — this is a data-hygiene question, not a revenue one. Do not let it displace anything on the capture-rate lane. | FLEET | 30m | ●●○○○ |
| 95 | 🤖 FLEET WORK — OUTREACH §7.4: reconcile LISTICLE_TARGET_SHEET_2026-07-25.md. It still carries the dead 4.9★ rule and the… 🤖 FLEET WORK — OUTREACH §7.4: reconcile LISTICLE_TARGET_SHEET_2026-07-25.md. It still carries the dead 4.9★ rule and the wrong "contact form / offer commission" routing that nearly re-offered existing partners their own commission. Rewrite rows against the affiliate export + the new gate rules (COLD vs PARTNER, 30% standard). No Aga minutes. | FLEET | 45m | ●●○○○ |