Ad-autopsy runs automatically every week. It reads the always-on Supabase data layer — competitor intelligence and live performance views maintained continuously by Hermes agents — and converts what won and what lost into three structured feeds. Section A (Post-Mortem Findings) surfaces what didn't work and why — written for editors and media buyers, framed as guidance the pod weighs, with the rare cardinal finding (claim safety / compliance) tagged as hard. Section B (Forbidden Words and Patterns) loads directly into the script quality-assurance pass. Section C (Positive Patterns) tilts concept generation toward frameworks that have already proven out. The skill writes its findings as rows in the launch_learnings table, with a supersede chain so old patterns are never wiped — only retired.
All calls go through OpenRouter and are logged with model + cost. Counting and maths are plain code, never a model.
| Task | Model | Why |
|---|---|---|
| Bucketing creatives from live_performance.status enum (performing / underperforming / fatiguing / paused / winning) and counting pattern frequency across the shortlist | Plain code — no language model | Deterministic-first rule. Counting and bucketing against a controlled-vocabulary enum is pure logic. An language model adds latency and cost and cannot improve on deterministic enumeration. Output feeds directly into the language model reasoning steps below. |
| Computing window maths: spend thresholds, days-of-data checks, supersede-chain linking, launch_learnings row writes | Plain code — no language model | All arithmetic and relational writes. Completeness is never a language model's job. These run before and after the synthesis steps. |
| Section A / B / C pattern reasoning — synthesising the bounded winner/loser shortlist into negative constraints, forbidden vocabulary, and positive framework patterns | claude-opus-4-8 (Opus 4.8) via OpenRouter | Diagnosis-grade synthesis over a bounded, pre-filtered dataset. The shortlist is small (5–30 creatives) so context cost is controlled. Opus 4.8 is the correct ceiling for 'what is the pattern and why did it fail / succeed' reasoning. Every call is logged to the agent_run audit trail with model ID, provider, and cost. |
| Cross-batch synthesis — the single hardest one-shot narrative that explains how this week's patterns shift the overall creative strategy (only if 3 or more batches of data exist and a structural shift is detected) | claude-fable-5 (Fable 5) via OpenRouter — only if justified | Fable 5 is reserved for ceiling-jobs only. It costs 2x Opus 4.8 and carries a mandatory 30-day data-retention obligation. It is not the default. If the cross-batch synthesis is routine (no structural shift detected), Opus 4.8 runs instead and the audit log records the justification for not escalating. |
What goes in, and what comes out.
| Input | What it is |
|---|---|
| live_performance view (Supabase Layer 4) | The always-fresh Supabase view of every creative Amelia Fenmore (IDA) has run as a paid Meta ad. Hermes agents keep this current by pulling from Fibery after each daily Meta and Hyros sync. The skill reads this view — never Fibery directly. Key fields used: fibery_creative_id (unique identifier), creative_name, spend (total money spent on this ad), cost_per_booked_call (CPBC — how much it cost to get one person to book a sales call), cost_per_lead (CPL — how much it cost to get one person to register for the free training), hook_rate (percentage of viewers who watch past the opening hook), hold_rate (percentage of viewers who stay through the mid-section), and status (the Fibery controlled vocabulary classification: performing, underperforming, fatiguing, paused, or winning). |
| competitor_intelligence view (Supabase Layer 3) | The always-fresh Supabase view of competitor paid ads and organic posts collected by Hermes scraper agents for the IDA namespace (interior-design business coaching). Contains ad copy, video transcripts, offer details, and engagement signals. Replaces the manual Paid-Ad-Analysis Google Doc that the previous version of this skill read. The skill reads this view — never Google Drive directly. |
| expert_config row for IDA (Supabase Layer 6) | The configuration row for Amelia Fenmore (IDA namespace). Contains target_cpbc (the maximum acceptable cost per booked call — the threshold that separates winners from losers) and daily_spend_gbp (the minimum daily spend before a creative is considered to have had a fair test). If either value is null, the skill halts immediately and does not produce output, because all winner/loser classification would be undefined. |
| launch_learnings rows from prior runs (Supabase Layer 5) | Rows written by previous autopsy runs for the same expert. The skill reads these to build the supersede chain — when a new run finds a pattern that replaces an old one, it stamps superseded_at and superseded_by on the old row rather than deleting it. This preserves the history of which constraints were active in which batch. |
| Field | What it means |
|---|---|
| id | Unique identifier for this pattern row. |
| expert_namespace | Which expert this finding applies to — 'ida' for Amelia Fenmore. |
| section | Always 'avoid' for Section A rows. These are post-mortem findings (PM[N]) — a creative-director read on what didn't land and why, tagged GUIDANCE (the pod weighs it) or CARDINAL (rare hard check — almost always claim safety / compliance). |
| pattern_text | The plain-language headline of what didn't work — written for editors and media buyers to read in two minutes. Example: 'Opened on the expert's credentials before naming the audience's problem.' |
| pattern_detail | The full post-mortem record: which specific creatives failed (with Production Status and the metric signal that flagged them), what was observed in the cut and script reviewed CD-style (visual + spoken word), why it likely didn't land, the watch-out for next time, and the hardness tag (GUIDANCE or CARDINAL). Minimum two examples required for any finding to be encoded. |
| mode | Either 'pioneer' (based on competitor data only, no IDA own-data yet) or 'iteration' (based on IDA's own live_performance data, with competitor data as secondary). |
| source_autopsy_run_id | Foreign key pointing to the agent_run row for the autopsy run that created this constraint. Lets any downstream user trace a constraint back to its exact origin. |
| superseded_at | Timestamp set when a later autopsy run finds a replacement or reversal for this constraint. Null if the constraint is still active. |
| superseded_by | Foreign key pointing to the replacement launch_learnings row. Null if the constraint is still active. Together with superseded_at, this forms the supersede chain — patterns evolve, they are never deleted. |
| Field | What it means |
|---|---|
| section | Always 'forbidden' for Section B rows. These feed directly into the scripter-polish quality-assurance scan as Tier 4 forbidden terms — expert-specific and campaign-specific findings that sit on top of the static forbidden word lists already in scripter-polish. |
| pattern_text | The forbidden word, phrase, or structural pattern. For vocabulary: the exact term. For structural patterns: a plain-language description of the sentence construction or section sequence that caused failure. |
| pattern_detail | Why it is forbidden — tone mismatch, mechanism reveal risk, trust erosion, compliance risk, or association with a specific losing creative. Includes the preferred replacement term where one exists. |
| source_autopsy_run_id | Same as Section A — traces back to the agent_run that produced this entry. |
| superseded_at / superseded_by | Same supersede chain logic as Section A. |
| Field | What it means |
|---|---|
| section | Always 'positive' for Section C rows. These feed into ad-ideate Step 0.5e to weight framework allocation toward what has already proven out. |
| pattern_text | Plain-language description of what worked — which hook framework, proof delivery timing, emotional arc, or format outperformed. |
| pattern_detail | The framework ID from ad-hook-generation (must be one of F1-F12 for cold core, HT1-HT12 for high-ticket cold, or W1-W10 for warm retargeting), the evidence (which creatives, with status and CPBC figures), why it worked in one sentence, source confidence (VALIDATED if from own live_performance data; COMPETITOR-CONFIRMED if from competitor_intelligence Tier 1; EMERGING if single instance), and the allocation weight (HIGH for 3 or more confirmed instances, MEDIUM for 2, LOW for one promising instance). |
| source_autopsy_run_id | Same trace-back to the agent_run that produced this entry. |
| superseded_at / superseded_by | Same supersede chain logic. |
| Field | What it means |
|---|---|
| id | The unique identifier for this autopsy run. This becomes the source_autopsy_run_id stamped on every launch_learnings row written in this run. |
| agent_name | Always 'ad-autopsy'. |
| triggered_by | Always 'cron' for the weekly scheduled run. |
| status | Set to 'running' when the run opens. Updated to 'success', 'partial', 'failed', or 'halted' when the run closes. 'halted' means the run detected a configuration problem (null target_cpbc or null daily_spend_gbp) and stopped before producing any output. |
| status_detail | Human-readable explanation of any non-success status. Also records the detected mode (PIONEER or ITERATION) and, where Fable 5 was considered but not used, the justification. |
| Field | What it means |
|---|---|
| expert_namespace | Which expert the autopsy just ran for. |
| mode | PIONEER or ITERATION — tells the reader whether this was based on own IDA data or competitor data only. |
| finding count / pattern count | How many Section A post-mortem findings, Section B forbidden entries, and Section C positive patterns were written in this run. |
| source_autopsy_run_id | The agent_run ID, so a human can look up the full run record in Supabase if needed. |
--- SECTION A — POST-MORTEM FINDINGS (avoid) ---
PM1:
pattern_text: Market-level claim as the hook, with no named person's story or specific dollar outcome anchoring it.
pattern_detail: Saw it in: MARKET/UberMoment (live_performance.status = underperforming, CPBC $177 vs target $65); HomeStaging (underperforming, no named proof). What we observed: hook opens on a broad industry claim — no named student, no specific result; generic transformation language in the body. Why it likely didn't land: cold viewers have no reason to care about market statistics before they feel the problem — the hook spends its 3 seconds on the category, not on a person the viewer can recognise as themselves. Watch-out: lead with a named student outcome or a specific dollar figure, not a market-size claim. How hard a rule: GUIDANCE. Confidence: VALIDATED.
mode: iteration
source_confidence: VALIDATED (own live_performance data)
PM2:
pattern_text: High hook rate treated as a success signal, masking conversion failure.
pattern_detail: Saw it in: LeakedAIDemo (highest hook rate in batch, live_performance.status = underperforming). What we observed: the hook grabbed attention at scale; the body did not convert. Hook rate measures interruption, not persuasion — this creative demonstrated the hook-rate trap in its clearest form. Why it likely didn't land: the hook created curiosity without qualified intent; viewers watched and left without booking. Watch-out: score hook and conversion together; a high hook rate with weak conversion is an attention-only result, not a win. How hard a rule: GUIDANCE. Confidence: VALIDATED.
mode: iteration
source_confidence: VALIDATED (own live_performance data)
--- SECTION B — FORBIDDEN WORDS AND PATTERNS (forbidden) ---
B1:
pattern_text: 'transform your interior design business'
pattern_detail: Reason: vague transformation language with no specificity. Appeared in MARKET/UberMoment hook and HomeStaging body. Associated with two losers. Replacement: name the specific outcome ('go from $3K project fees to $15K retainers') or the specific student result.
B2 (structural pattern):
pattern_text: Opening with market-level statistics before establishing a named individual's result
pattern_detail: Example: 'The interior design industry is worth $X billion...' Reason: cold Meta traffic does not care about industry statistics. They care about whether someone like them got a result. This pattern appeared in both MARKET/UberMoment and HomeStaging losers.
--- SECTION C — POSITIVE PATTERNS (positive) ---
P1:
pattern_text: Identity callout using a disqualifying credential — naming what the viewer does NOT have (no design degree, no prior customers) as the entry signal for the hook.
pattern_detail: Framework ID: F5 (Identity Callout). Evidence: CREDENTIALS/no-degree creative — live_performance.status = winning, CPL $8 (target_cpl ~$18). Why it worked: IDA's avatar is a career-switcher or self-taught decorator. Explicitly naming the no-degree identity removes the 'this isn't for someone like me' exit. Allocation weight: HIGH (VALIDATED, own data). Source confidence: VALIDATED.
P2:
pattern_text: Confession or vulnerability-led story opening using a named prior-career identity (accountant, teacher, nurse) as the credibility inversion — the expert's 'wrong background' becomes the hook.
pattern_detail: Framework ID: HT8 (Confession / Vulnerability Lead). Evidence: ESCAPE/accountant creative — live_performance.status = performing, CPL tracking below target. Why it worked: the named prior profession (accountant) signals 'if she could switch, so can I' — it borrows authority from the relatable failure rather than the expert's current success. Allocation weight: MEDIUM (2 validated instances across CREDENTIALS and ESCAPE). Source confidence: VALIDATED.
--- HANDOFF RECORD ---
launched_learnings rows written: 7 (2 avoid, 2 forbidden, 3 positive)
source_autopsy_run_id: [agent_run.id for this run]
superseded rows retired: 3 (prior Section A findings from 2026-05-12 autopsy run superseded by PM1 and PM2 above)
Slack notification: posted to #ida-ads| Term | In full / what it means |
|---|---|
| CPBC | Cost Per Booked Call — How much money was spent on Meta ads to get one person to book a sales call with Amelia Fenmore. The primary success metric for IDA cold traffic. Target threshold lives in expert_config.target_cpbc. |
| CPL | Cost Per Lead — How much money was spent to get one person to register for the free training (the intermediate conversion before a booked call). Used as an early-signal proxy when CPBC data is not yet available. |
| CPBC | Cost Per Booked Call — Same as above — spelled out again here for completeness because it is the central metric in every classification decision. |
| TOF | Top of Funnel — Cold traffic — people who have never seen Amelia Fenmore's content before. IDA cold Meta ads target TOF audiences and drive them to a free training before asking for a sales call booking. |
| MOF | Middle of Funnel — Warm traffic — people who have seen content or engaged with an ad but have not yet booked a call. Retargeting ads typically target MOF audiences. |
| BOF | Bottom of Funnel — Hot traffic — people who have seen the free training or visited the booking page but have not yet booked. High-intent retargeting. |
| VSR | View-to-Baseline Ratio — A signal used by the organic scraper to detect high-performing YouTube videos relative to a channel's baseline view count. Used in ad-organic-scraper, not directly in ad-autopsy. |
| DTC | Direct to Camera — A video ad format where the presenter speaks directly into the camera lens, creating a one-on-one feel. One of the two main video formats in the IDA creative system (the other is Studio DTC with production lighting/backdrop). |
| UGC | User-Generated Content — An ad format that mimics organic, creator-style content — informal, handheld, less polished. Routed through a separate production pathway in ad-production-brief. |
| GP3 | Gemini Pass 3 (Winner Analysis) — The third pass in the ad-data-scraper Gemini analysis sequence, which produces structured breakdowns of winning competitor ads. These fed the old Paid-Ad-Analysis Google Doc. In the new architecture, the equivalent data lives in competitor_intelligence rows with performance_signal = 'verified_winner'. |
| GP4 | Gemini Pass 4 (Loser Analysis) — The fourth pass in the old ad-data-scraper sequence, which produced failure scorecards for losing competitor ads. In the new architecture, the equivalent data lives in competitor_intelligence rows tagged with failure analysis, which ad-autopsy reads when synthesising Section A post-mortem findings in Pioneer mode. |
| GP5 | Gemini Pass 5 (Matched Pair Comparison) — The fifth pass in the old sequence, comparing a winner and a loser from the same advertiser to isolate the single differentiating variable. Highest-confidence source for Section A post-mortem findings in Pioneer mode. |
| PM | Post-Mortem Finding — A creative-director read on what didn't land and why, derived from underperforming creatives. Written for editors and media buyers. Tagged GUIDANCE (the pod weighs it against everything else) or CARDINAL (rare hard check — almost always claim safety / compliance). Findings are stored in launch_learnings (section = 'avoid') and read by ad-ideate. The prefix PM[N] identifies each finding in a run. |
| IDA | Interior Design Academy — The expert identity for Amelia Fenmore, an interior-design business coach. IDA cold Meta ads drive traffic to a free training, which converts to booked sales calls. The expert namespace in all IDA Supabase rows is 'ida'. |
| PII | Personally Identifiable Information — Any data that can identify a specific individual — names, email addresses, phone numbers, call recordings with customer details. Fable 5 has a mandatory 30-day data-retention obligation on all inputs; PII must never be included without explicit operator sign-off. |
| GBP | British Pounds Sterling — The currency used in daily_spend_gbp, the minimum daily spend threshold from expert_config used to judge whether a creative has had a fair test. |
| Hermes | Hermes (autonomous agent layer) — The always-on agent system that maintains the Supabase data layer. Hermes agents continuously scrape competitor ads, pull Fibery performance data, and keep the competitor_intelligence and live_performance views current without operator commands. Ad-autopsy reads from these views rather than triggering scrapes itself. |
| Fibery | Fibery (project management and CRM) — The system of record for all IDA creative entities, their production status, and their Meta performance data. Hermes agents pull Fibery data into the live_performance Supabase view after each daily Meta and Hyros sync. |
| Supabase | Supabase (database platform) — The PostgreSQL-based database that hosts the SKL ad creative system data layer — all seven layers from raw ad captures through to launch learnings. Ad-autopsy reads from and writes to Supabase views and tables. |
| OpenRouter | OpenRouter (model routing proxy) — The API gateway through which all language model calls in this system are routed. Provides unified billing, model switching, and the per-call logs (model ID, provider, cost) that feed the agent_run audit trail. |
| agent_run | agent_run (Supabase audit table) — The cross-cutting table that records every agent run in the data layer. Ad-autopsy opens a row at the start of each run and closes it at the end. The row's id becomes the source_autopsy_run_id stamped on every launch_learnings row, creating a full trace from pattern to the run that produced it. |
| launch_learnings | launch_learnings (Supabase Layer 5 table) — The table where ad-autopsy writes its output — one row per pattern, partitioned by section (avoid, forbidden, positive). The supersede chain (superseded_at, superseded_by) means patterns evolve across weekly runs without losing history. |
| supersede chain | Supersede chain (launch_learnings evolution protocol) — The mechanism by which patterns are updated without deleting history. When a new autopsy run finds that a previous constraint has been reversed or replaced, it stamps superseded_at and sets superseded_by to the new row's id on the old row. The old row remains readable as historical record. Patterns are never wiped. |
| F1-F12 | Cold Traffic Core Hook Frameworks 1 through 12 — The 12 core cold-traffic hook frameworks in ad-hook-generation.md (Contrarian Claim, Unexpected Outcome, Hidden Truth, Specific Transformation, Identity Callout, Mistake Reveal, Paradox Hook, Question Interrupt, Time Collapse, What If Reframe, Social Proof Lead, Native Story Opening). Section C pattern entries must reference framework IDs from this set, HT1-HT12, or W1-W10 only. |
| HT1-HT12 | High-Ticket Cold Traffic Hook Frameworks 1 through 12 — The 12 high-ticket cold-traffic hook frameworks in ad-hook-generation.md (Competence Test, Gatekeeper/Velvet Rope, Mechanism Reveal, New Category, Identity Wedge, Cost of Inaction, Borrowed Authority, Confession/Vulnerability Lead, Epiphany Bridge, Investment Reframe, Permission Slip, Dissonance Trigger). For IDA (a high-ticket coaching offer) these are frequently the correct Section C framework mapping. |
| W1-W10 | Warm Traffic Retargeting Frameworks 1 through 10 — The 10 warm-traffic hook frameworks in ad-hook-generation.md (Social Proof Stack, Objection Reversal, Testimonial Lead, Remember Callback, Urgency Trigger, Before/After Story, Why Now Hook, and three others). Only relevant for IDA retargeting ads — cold TOF ads use F1-F12 and HT1-HT12. |