What was built
A pinned query you never change
The owner's Explore URL is frozen in hookd/query.json — video format, niches 5/16/30/32, English, US + AU, 3–5 min and 5 min+, winning performance tier, running ≥ 20 days, brands with ≥ 200 active ads, top-20 percentile. Re-running the pipeline re-runs exactly that query, so two snapshots are comparable.
One translation was unavoidable and is documented rather than hidden: the UI's language=23 is a numeric id and the API only accepts ISO codes, so it is sent as en. The REST /api/v1/explore endpoint also rejects the UI's parameter names outright, so the pipeline calls the MCP search_ads tool instead.
A selection rule that stops one advertiser owning the page
GetHookd's per-brand cap still let a single advertiser fill the ranking: seven of the top ten rows were the same Koseon creative family. The rule drops unscored rows, dedupes families by (landing-page host × ad-copy hash), takes one creative per advertiser in rank order, then rank-fills the rest — and records each creative's raw rank, so nothing is quietly discarded.
An evidence layer that can't drift
Per creative: the ad record, a timed transcript reconciled from two independent ASR passes arbitrated against the burned-in captions (uncertain words marked), a numbered shot table, and 14 committed key stills. Frames are extracted locally — GetHookd's own keyframe extraction returned failed on these ads — using scene-cut detection, a 5-second ladder, and contact sheets with burned-in timestamps so an agent can read a whole video in one image.
Raw pages are immutable after the critique pass. Corrections are appended, never silently rewritten.
Eight meta-functions
Each is a signature, a persuasion mechanism stated as psychology rather than plot, timestamped invariants, a slot table with constraints, a stage template in % of runtime, proof grammar, production DNA, and anti-patterns. The bar a page must clear: swap {PRODUCT} for an unrelated product in the same audience and the page must still fully specify a video.
The product brain, and a matrix that stops eight ads becoming one
goPure's landing page is compiled into what may actually be claimed on screen, plus avatar, offer mechanism (the heavy-cream paradox → weightless cupuaçu water-magnet) and the owner's research verbatim. Then assignment.md fixes, per trend, a unique hook × avatar identity × narrator archetype triple — because eight functions called with one product collapse into eight versions of the same ad unless the inputs are made to differ on purpose.
The map
A dependency-free static port of the MediaMagicPlatform "Карта" in the clay design system: tiered DAG, absolutely positioned cards in stage columns, cubic-Bézier edges, barycenter ordering, hover-preview vs click-commit BFS highlighting, a detail drawer that pushes rather than overlays. Page markdown is fetched on demand — the graph payload went from 1.74 MB to 330 KB and stays flat as the tree grows.
The eight functions
| # | Meta-function | Source advertiser | Len | Score | Assigned goPure angle | State |
|---|---|---|---|---|---|---|
| 01 | Proxy-witness vindication with a witnessed product event PROXY_WITNESS_VINDICATION() · 61 slots · 20 entity pages | KoseonBeautykoseonskincare.com | 6:04 | 10024 d | H2 Wardrobe — "I threw out every turtleneck and scarf"Post-divorce, back on the social market, 50–55 | verified |
| 02 | Missing-step reframe with dated visceral proof MISSING_STEP_VISCERAL_PROOF() · 62 slots · 17 entity pages | Holistic Health Secretsmyellora.com | 3:38 | 10071 d | H4 Amazon intrigue — cupuaçu, 440 % its own weight in waterTech-neck professional 35–42, video calls | verified |
| 03 | Defected-insider cycle-trap elimination DEFECTED_INSIDER_CYCLE_ELIMINATION() · 62 slots · 15 entity pages | Beauty Reviewssassysaints.com | 3:03 | 9129 d | H3 Heavy-cream horror — "your elite lifting cream made the jowl heavier"Menopause 50–58 | verified |
| 04 | Payoff-first sung revenge anthem PAYOFF_FIRST_REVENGE_ANTHEM() · 29 slots · 17 entity pages | Health That Fits Your Lifetryrovina.com | 3:59 | 10030 d | H5a Ozempic neck — "lost the weight, got the bill in your neck"Fast weight loss (GLP-1 / diet), 45–52 | verified |
| 05 | Insider absolution reframe — "the method failed you" INSIDER_ABSOLUTION_REFRAME() · 68 slots · 17 entity pages | Dr. Sam Valentineinformation.shopverticlear.com | 5:10 | 10023 d | H1 Industry exposé (absolution register) — "I told women for 20 years to take their face cream down to the neck"45–60 who "did everything right" | verified |
| 06 | Elder root-cause reframe — numbered self-diagnosis → hidden cause → criteria the product alone meets ELDER_ROOT_CAUSE_REFRAME() · 41 slots · 15 entity pages | Mens Health Tipsdrinkerodus.com | 5:33 | 10021 d | H5b Menopause collapse — "collagen went overnight"Perimenopause / menopause 48–58 | verified |
| 07 | Notebook re-attribution — "it was never random" NOTEBOOK_REATTRIBUTION() · 36 slots · 20 entity pages | Dr. Sam Valentineinformation.shopverticlear.com | 3:30 | 10023 d | H2b Self-tracking wardrobe — the scarf drawer as the logTech-neck + video-call professional 38–46 | draft |
| 08 | Adjacent-site cause relocation — permanence threat → failed-remedy exception → co-occurrence statistic → pathway + analogy → numbered device mechanism ADJACENT_SITE_CAUSE_RELOCATION() · 68 slots · 16 entity pages | Dr. Sam Valentineinformation.shopverticlear.com | 3:21 | 10023 d | H1b Anatomical relocation — "it was never the skin of your neck"40–55, band-focused ("кільця Венери") | draft |
"State" is the verification state of the brain, not of an adaptation. Three brains are still finishing their re-verification pass and honestly carry draft; the optimistic verified flags written by an interrupted earlier run were explicitly distrusted and have to be re-earned.
How it was kept honest
Three critics, told to refute
Every compiled brain is attacked by three independent adversarial critics running concurrently — evidence fidelity (re-checks every claim, timestamp and quote against the shot table, transcript and the actual pixels, re-extracting frames to spot-check), transferability (tries to prove the function is not product-agnostic by instantiating every slot for two unrelated products), and schema & production usability (is visual-style concrete enough to write a render prompt from alone?).
The fixer is told the critics may be wrong and must verify each finding against the evidence before applying it. Neither side is trusted by default.
Two interruptions, and what they cost
Account session limits killed 133 agents across two workflow runs. The first run then reported verified: true for brains whose critics had never run — an honest-looking result built on absent evidence, and the reason the current pass distrusts every inherited flag.
Round one's critics had completed before the wall, so their 282 findings were mined out of the run journal, deduped, and replayed into a cheaper fix pass rather than being paid for twice.
Planned, not implemented
The part of the brief this run did not reach, and why. Nothing here is blocked by an unknown — it is all scoped work with the scaffolding already in place.
The goPure adaptations — the actual "call"
Per trend: scenario.md (slot sheet with every signature slot filled, cast, stage-by-stage Ukrainian script with EN gloss and verbatim captions, invariant checklist, deviations), passports.md (the source's style DNA + render-ready character passports), previews.md (beat boards + clip specs), and renders/manifest.json.
Status: the four-phase workflow is written and staged — scenario → passports & previews → a four-lens self-fixing audit (invariant fidelity, claim compliance, Ukrainian language quality, producibility) → a portfolio pass that checks the eight for collisions. It was not fired: generation was paused at the owner's request while the map was reviewed. 0 of 8 exist.
Character passports and storyline previews, rendered
The render path is built end-to-end (gen.py kie.ai client, render.py manifest executor, a manifest contract in SCHEMA.md) and proven on two assets: the goPure jar re-rendered from its packshot with the label text intact, and a character passport rendered in trend 01's own style — that video runs two render registers, near-photoreal for the sufferer's wound shots and feature-animation for everyone else, and the passport was built in register A with goPure's wound (neck bands, turtleneck tug) substituted for the source's. A 10-second clip from it held character consistency through the motion.
Not done: per-trend passports, beat boards and preview clips. Measured cost to complete all eight ≈ 900 credits of the 3,245 remaining.
Re-verification of three brains, and the family map
Brains 03, 07 and 08 are still in the fix/verify pass and carry draft. The cross-trend README.md — grouping the eight into families by shared persuasion mechanism, with a "which function for which job" decision table across awareness level, product type, budget and runtime — is written into the workflow but its agent died to the session limit twice and has not yet produced the page.
Assembly into finished videos
seedance clips are 4–15 seconds; a 3–6 minute creative needs a cutlist, Ukrainian voice-over, burned-in caption rendering and an ffmpeg assembly pass. The pattern exists from the earlier sung-VSL work in this project but none of it is wired into hookd/. What exists today produces previews — proof the style and story hold — not deliverable ads.
Smaller gaps
- The map's adaptation, passport and preview columns are implemented and fixture-tested but render empty, because there are no adaptations yet.
- No refresh loop:
fetch.pyis re-runnable and snapshots are immutable, but nothing schedules it, so the "currently winning" set goes stale on its own. - Nothing is written back to GetHookd (swipe file, boards) — write operations were left for explicit approval.
- Trend 06 is a single continuous-style video where scene detection found no cuts at the standard threshold; its shot table is ladder-based rather than cut-based, which is coarser than the other seven.
Operating facts
What it costs to run
| GetHookd search (40-row ranking page) | ~0.4 cr |
get_ad, get_ad_media, list_* | free |
| Transcription per ad (async) | free tier |
| Passport / board image (nano-banana-2, 1K) | 8 cr |
| Preview clip (seedance-2-mini, 480p, 10 s) | 38 cr |
| Est. full adaptation set, all 8 trends | ~900 cr |
Clips are always seedance-2-mini at 480p per the owner's constraint — 496×864, 24 fps, with audio. Media URLs from GetHookd are signed and expire in 24 hours, so bytes are pulled at fetch time, never linked.
Where things live
| Live map | /graph/ |
| This report | /report/ |
| Private repo | PytaichukBohdan/hookd |
| Project PR | LevchykUGS#2 |
| Pipeline docs | hookd/README.md |
| Build log | hookd/WORKFLOWS.md |
| Conventions | hookd/SCHEMA.md |
API keys are supplied through the environment and never committed. Source videos are git-ignored and re-fetchable.
The next move
Fire the staged adaptation workflow. It produces, per trend, a Ukrainian scenario with every slot filled, character passports in that source video's own visual register, and boarded previews — then audits itself for invariant fidelity and claim compliance and checks the eight against each other for collisions. Roughly 900 credits and one uninterrupted run.
Recommended first single test if you'd rather not run all eight: trend 03, the defected-insider cycle-trap. It is the cheapest register to produce (live UGC talking head, ~3 minutes, no animated cast), and its structure — an ex-insider naming four "fixes" that quietly make the problem worse — maps one-to-one onto the four horror stories already documented in goPure's own research.