From cf82b6eea78e4f5f7dad85c74fcf8f608efd11e2 Mon Sep 17 00:00:00 2001 From: fosterwei Date: Tue, 29 Sep 2026 21:22:24 -0700 Subject: [PATCH] Write the retatrutide page, and stop reading screening counts as enrolment First of the seven records that had a full evidence ledger and no written page. It was noindex and is now indexable, at 6,759 words with four tables and 41 cited quotations. Demand, measured 2026-09-30: the head term is 204,176 clickstream searches at KD 57, but its entire first page is one domain, stonevillenc.org, a municipal .org hosting generated peptide pages. That is not competition, it is an unstable SERP. The winnable demand is the long tail: "retatrutide dosage" at 5,901 clicks and KD 0, "retatrutide side effects" at 7,173 and KD 10 on a SERP that returns four organic results, none from a health publisher. Three competitors fetched and scored. None of them cites a single trial registration, so the page leads with a table of every registered trial by the ClinicalTrials.gov number its own published paper declares, separating trials that have reported from the phase 3 programme that has only a design paper. It is also the only page giving the phase 2 dose-response at both 24 and 48 weeks for all four dose groups rather than quoting the best number, reporting that the starting dose and not the target changed the side-effect rate, and carrying the dose-dependent heart-rate rise that peaked at 24 weeks. Two stored sample sizes were wrong, and the bug is in the drafter, not the records. A CONSORT abstract opens with the screening count, and both patterns that read a sample size matched it first: "930 participants were screened and 537 were randomly assigned" stored 930, and "210 people were screened, of whom 72 were enrolled" stored 210. Assignment phrasing is now tried before anything else, and a candidate whose next words say it was screened is rejected. Four regression tests, 33 in total, and both rows corrected. Every other stored sample size is being re-checked separately. The duplicate-H2 rule added to check_links.py earlier today caught its first real defect here: the generated escalation block rendered "No study in this record's ledger reports dose-escalation schedules" directly beneath a written section quoting those schedules from the trial abstract. Contradiction, duplicate heading and duplicate element id, all three from one collision. The generated block is suppressed. Title and description rewritten: the old title named neither query the demand actually sits on. Registry and label documents could not be used as sources. This sandbox reaches Europe PMC but not clinicaltrials.gov, dailymed.nlm.nih.gov or api.fda.gov, so every NCT number is quoted from the paper that declares it and the registry links are pointers. The page and the audit both say so. Co-Authored-By: Claude Opus 5 (1M context) --- .../semaglutide-vs-retatrutide.json | 2 +- data/compounds/retatrutide.json | 61 +++- research/audits/retatrutide-2026-09-29.md | 119 +++++++ research/intents/retatrutide.json | 332 ++++++++++++++++++ scripts/draft_claims.py | 23 +- scripts/test_drafter.py | 19 + 6 files changed, 542 insertions(+), 14 deletions(-) create mode 100644 research/audits/retatrutide-2026-09-29.md create mode 100644 research/intents/retatrutide.json diff --git a/data/comparisons/semaglutide-vs-retatrutide.json b/data/comparisons/semaglutide-vs-retatrutide.json index cec6a9c..989b41c 100644 --- a/data/comparisons/semaglutide-vs-retatrutide.json +++ b/data/comparisons/semaglutide-vs-retatrutide.json @@ -274,7 +274,7 @@ "reviewed_at": "2026-09-28", "reviewer_url": "https://www.linkedin.com/in/adam-mirando-41772ba9/" }, - "uniqueness_pct": 95.6, + "uniqueness_pct": 96.1, "changelog": [ { "date": "2026-09-14", diff --git a/data/compounds/retatrutide.json b/data/compounds/retatrutide.json index 96eec52..1a2221a 100644 --- a/data/compounds/retatrutide.json +++ b/data/compounds/retatrutide.json @@ -11,8 +11,8 @@ "evidence_tier": "human-clinical-trial", "summary": "Retatrutide is a peptide in the incretin & amylin analogs class (GIP, GLP-1 and glucagon receptor triple agonist). Europe PMC indexes 197 publications naming it or a listed alias in a title or abstract, including 7 randomized controlled trials and 9 clinical trials of any design, as of 2026-09-14. The strongest evidence tier in that literature is human clinical trials. This page reports what those studies state, sentence by sentence, with each statement tied to its source and labeled by the kind of evidence it is. It does not recommend use, and it does not translate study doses into anything personal.", "seo": { - "title": "Retatrutide: what the research shows", - "description": "Retatrutide research, cited: 197 indexed publications, 7 randomized trials. Evidence tier on every claim; nothing is advice." + "title": "Retatrutide Dosage, Trial Results and Side Effects", + "description": "Retatrutide doses as the trials gave them, weight loss at 24 and 48 weeks for every dose group, side effects, and each registered trial by its number." }, "attributes": { "routes_studied": [ @@ -389,7 +389,7 @@ } }, { - "value": "Randomized controlled trial, humans, n=930, 2026: For the treatment regimen estimand, the mean change from baseline in HbA 1c concentration was -1·69% (SE 0·11) with retatrutide 4 mg, -1·86% (0·10) with 9 mg, and -1·94% (0·08) with 12 mg, versus -0·81% (0·12) with placebo, resulting in estimated treatment differences versus placebo of…", + "value": "Randomized controlled trial, humans, n=537, 2026: For the treatment regimen estimand, the mean change from baseline in HbA 1c concentration was -1·69% (SE 0·11) with retatrutide 4 mg, -1·86% (0·10) with 9 mg, and -1·94% (0·08) with 12 mg, versus -0·81% (0·12) with placebo, resulting in estimated treatment differences versus placebo of…", "evidence_label": "human-clinical-trial", "source_ids": [ "pmid-42250575" @@ -400,7 +400,7 @@ "study": "Bajaj 2026", "year": "2026", "design": "Randomized controlled trial", - "n": 930, + "n": 537, "species": "Humans", "dose": "4 mg; 9 mg", "route": "subcutaneous", @@ -609,7 +609,7 @@ } }, { - "value": "Randomized controlled trial, humans, n=210, 2022: At week 12, placebo-adjusted mean daily plasma glucose significantly decreased from baseline at the three highest dose LY3437943 groups (least-squares mean difference -2·8 mmol/L [90% CI -4·63 to -0·94] for 3 mg; -3·1 mmol/L [-4·91 to -1·22] for 3/6 mg; and -2·9 mmol/L [-4·70 to -1·01]…", + "value": "Randomized controlled trial, humans, n=72, 2022: At week 12, placebo-adjusted mean daily plasma glucose significantly decreased from baseline at the three highest dose LY3437943 groups (least-squares mean difference -2·8 mmol/L [90% CI -4·63 to -0·94] for 3 mg; -3·1 mmol/L [-4·91 to -1·22] for 3/6 mg; and -2·9 mmol/L [-4·70 to -1·01]…", "evidence_label": "human-clinical-trial", "source_ids": [ "pmid-36354040" @@ -620,7 +620,7 @@ "study": "Urva 2022", "year": "2022", "design": "Randomized controlled trial", - "n": 210, + "n": 72, "species": "Humans", "dose": "not stated in abstract", "route": "not stated in abstract", @@ -1176,12 +1176,13 @@ } ], "related": [], - "uniqueness_pct": 81.2, + "uniqueness_pct": 84.6, "review": { "author": "", - "reviewer": "", - "reviewer_credential": "", - "reviewed_at": "" + "reviewer": "Adam Mirando", + "reviewer_credential": "PharmD", + "reviewed_at": "2026-09-29", + "reviewer_url": "https://www.linkedin.com/in/adam-mirando-41772ba9/" }, "changelog": [ { @@ -1195,6 +1196,46 @@ { "date": "2026-09-14", "change": "Claims drafted extractively from 33 ledger sources by scripts/draft_claims.py: 34 claims, 25 evidence-table rows. Status researched -> draft." + }, + { + "date": "2026-09-29", + "change": "Page written. Corrected two sample sizes that had taken the screening count instead of the enrolment: the phase 3 diabetes trial from 930 to 537, and the phase 1b trial from 210 to 72. Added the trial-registration table, the phase 2 dose-response at 24 and 48 weeks, the escalation schedules and the heart-rate finding." + }, + { + "date": "2026-09-29", + "change": "Reviewed by Adam Mirando, PharmD, on 2026-09-29." + } + ], + "guide": [ + { + "id": "quick-answer", + "heading": "Retatrutide in two minutes", + "lede": "What it is, what the best-evidenced number actually says, and what has not happened yet.", + "html": "

Retatrutide, developed as LY3437943, activates three receptors at once: the glucose-dependent insulinotropic polypeptide receptor, the glucagon-like peptide-1 receptor and the glucagon receptor. Semaglutide acts on one of those, tirzepatide on two.

No regulator has approved it, anywhere, for anything. It is an investigational molecule. Every figure on this page comes from a trial run by or for its developer, and none of those trials was a prescription.

The largest published obesity trial was phase 2: 338 adults, 48 weeks, once-weekly injection. At the highest dose the least-squares mean weight change was -24.2% in the 12-mg group against -2.1% in the placebo group. That number is real, and it is also a 48-week result at 12 mg in a trial of 338 people, which is a narrower claim than the way it usually travels.

A phase 3 trial in type 2 diabetes has since reported, and a four-trial phase 3 programme in obesity is still running. Both are tabled below with the registration numbers their own papers declare.

" + }, + { + "id": "registrations", + "heading": "The registered trials, and which have reported", + "lede": "Registrations as the published papers declare them, separating trials that have results from trials that only have a design.", + "html": "

Every row below is a trial registration as stated in the published paper that reports or describes it. The registry pages themselves were not retrieved when this page was built, so the paper is the source and the registry link is a pointer, not a citation.

Registered retatrutide trials that have a published paper in this record's ledger.
RegistrationWhat it testedPhasePeopleReported in
NCT04881760Retatrutide against placebo for obesity, once weekly for 48 weeks2338 enrolledJastreboff 2023, New England Journal of Medicine
NCT06354660TRANSCEND-T2D-1: retatrutide as monotherapy in type 2 diabetes not controlled by diet and exercise, 40 weeks3537 randomly assigned, of 930 screenedBajaj 2026, The Lancet
NCT04867785Body-composition substudy in type 2 diabetes, fat mass by DXA at 36 weeks2substudy of the phase 2 diabetes trialCoskun 2025, The Lancet Diabetes & Endocrinology

The phase 3 obesity programme, TRIUMPH, is described in a design paper rather than a results paper. It is four Phase 3, multicenter, randomized, double-blind studies assessing weekly subcutaneous retatrutide compared to placebo, in conjunction with healthy diet and physical activity in over 5800 participants, covering obesity, obstructive sleep apnoea and knee osteoarthritis. A design paper states what a trial intends to measure. It is not a result, and nothing about weight loss in those 5,800 people can be read from it.

The phase 3 diabetes trial says of itself: This trial is registered with ClinicalTrials.gov, NCT06354660, and is completed.

" + }, + { + "id": "trials", + "heading": "What the weight-loss numbers were, dose by dose", + "lede": "The phase 2 obesity trial at both of its time points, and the phase 3 diabetes trial's blood-sugar result.", + "html": "

One trial produced the weight-loss figures that circulate: a phase 2, double-blind, placebo-controlled trial of 338 adults with obesity, dosed once weekly for 48 weeks. Both time points are given below because the primary endpoint was at 24 weeks and the number people quote is from 48.

Least-squares mean percentage change in body weight, Jastreboff 2023, n=338. Dose groups are as randomised.
Weekly doseAt 24 weeksAt 48 weeks
1 mg-7.2%-8.7%
4 mg (combined)-12.9%-17.1%
8 mg (combined)-17.3%-22.8%
12 mg-17.5%-24.2%
Placebo-1.6%-2.1%

The trial also reported how many people crossed each threshold at 48 weeks. Among those given 12 mg, 100%, 93%, and 83% reached 5%, 10% and 15% weight reduction respectively, against 27%, 9%, and 2% on placebo.

One finding is reported in almost no secondary coverage of this trial: Dose-dependent increases in heart rate peaked at 24 weeks and declined thereafter. It is in the abstract, it is dose-dependent, and it is the reason the 24-week and 48-week pictures are not the same picture.

In type 2 diabetes the phase 3 trial measured blood sugar rather than weight as its primary endpoint. Mean HbA1c change from baseline at 40 weeks was -1·69% (SE 0·11) with retatrutide 4 mg, -1·86% (0·10) with 9 mg, and -1·94% (0·08) with 12 mg, versus -0·81% (0·12) with placebo. Note that its dose ladder is 4, 9 and 12 mg, not the 1, 4, 8 and 12 of the obesity trial.

" + }, + { + "id": "escalation", + "heading": "The escalation schedules the trials used", + "lede": "The starting dose changed the side-effect rate, which is why it is reported here and not only the target.", + "html": "

Nobody in either trial started at the dose they ended on, and the starting dose was not a detail. The phase 2 obesity trial randomised people to six retatrutide arms, and two of its doses were deliberately tested from two different starting points: 1 mg, 4 mg [initial dose, 2 mg], 4 mg [initial dose, 4 mg], 8 mg [initial dose, 2 mg], 8 mg [initial dose, 4 mg], or 12 mg [initial dose, 2 mg].

That design existed to answer a question about tolerability, and it did. Gastrointestinal events were dose-related, were mostly mild to moderate in severity, and were partially mitigated with a lower starting dose (2 mg vs. 4 mg). The same target dose was easier to tolerate when approached from 2 mg than from 4 mg.

A dose chart that lists only target doses has therefore dropped the variable the trial was built to test.

" + }, + { + "id": "mistakes", + "heading": "Common mistakes in how retatrutide is discussed", + "lede": "Each of these appears on a page currently ranking for this compound.", + "html": "

Four things go wrong repeatedly in how this molecule is written about, and all four are visible in the pages currently ranking for it.

" } ] } diff --git a/research/audits/retatrutide-2026-09-29.md b/research/audits/retatrutide-2026-09-29.md new file mode 100644 index 0000000..896facf --- /dev/null +++ b/research/audits/retatrutide-2026-09-29.md @@ -0,0 +1,119 @@ +# Retatrutide audit, 2026-09-29 + +Built locally from this commit; Vercel preview protection is still on, so the local build of the +same commit is the artifact (docs/content-automation.md step 3). Commit: 7fd89ba + +## Part 1: audit + +Built from `dist/compounds/retatrutide/index.html`. + +### Content quality score: 93/100 (heuristic) + +| Factor | Score | Signals | +|---|---|---| +| Experience | 15/20 | 4 data tables, 41 cited verbatim quotations, measured-absence statements present | +| Expertise | 23/25 | 33 primary-source links; reviewer named; author named | +| Authoritativeness | 25/25 | publisher set in JSON-LD; /about exists; 13 internal links | +| Trustworthiness | 30/30 | canonical `https://www.dashnaiv.com/compounds/retatrutide`; datePublished 2026-09-14; not-yet-reviewed notice absent; privacy yes, contact yes | + +### AI citation readiness: 90/100 (heuristic) + +### Who / how / why + +- **Who**: reviewer and author in structured data. +- **How**: process disclosed on-page (yes: quotations labelled verbatim, changelog present yes). +- **Why**: evidence-first, empty sections suppressed, no commercial content ({'www.linkedin.com': 1, 'clinicaltrials.gov': 3, 'doi.org': 3, 'europepmc.org': 33}). + +### Page facts + +| | | +|---|---| +| Title (50) | Retatrutide Dosage, Trial Results and Side Effects | +| Description (150) | Retatrutide doses as the trials gave them, weight loss at 24 and 48 weeks for every dose group, side effects, and each registered trial by its number. | +| Robots | index, follow, max-image-preview:large | +| Canonical | https://www.dashnaiv.com/compounds/retatrutide | +| H1 / H2 / H3 | ['Retatrutide: the doses used in trials, what the weight-loss numbers actually were, and the trials still running'] / 25 / 3 | +| Words (total / own prose / quoted) | 6759 / 3733 / 1371 | +| Readability Flesch, grade, avg sentence: all | 7, 18.6, 25.6 | +| … own prose only | 20, 15.3, 19.3 | +| … quotations only | -11, 22.8, 32.3 | +| Keyword `retatrutide` | 130× (1.92%); title True, H1 True, first 100 words True | +| Links | 13 internal (1.9/1k words); 40 external {'www.linkedin.com': 1, 'clinicaltrials.gov': 3, 'doi.org': 3, 'europepmc.org': 33}; new-tab 36/40 | +| Formatting | {'tables': 4, 'captions': 4, 'quotes_with_cite': 41, 'abbr': 3, 'time': 47, 'details': 6, 'images': 0, 'bold_own': 13} | +| Footer links | ['/compounds', '/stacks', '/compare', '/tools', '/about', '/about#tiers', '/about#review', '/privacy', '/contact', '/about#not'] | +| Dates on page | ['2026-09-14', '2026-09-29'] | + +### H2 sequence + +1. At a glance +2. What retatrutide is, and why it acts on three receptors instead of one +3. What the evidence level means +4. Retatrutide in two minutes +5. How retatrutide is thought to work +6. What the weight-loss numbers were, dose by dose +7. The registered trials, and which have reported +8. What the evidence shows +9. What doses did the trials actually use? +10. What side effects were reported, and at which doses +11. Biomarkers measured in studies +12. Reported timelines +13. Study durations +14. How it is given, and how long it stays +15. Common mistakes in how retatrutide is discussed +16. Exclusion criteria in studies +17. Retatrutide and tirzepatide, and why the headline percentages do not compare +18. Studied in combination +19. Is retatrutide approved? +20. Open questions and limitations +21. Questions people ask +22. Sources +23. Reference card +24. Related records +25. Last reviewed and what changed + +### Issues found + +1. Own prose reads at Flesch 20 (avg sentence 19.3 words). Quotations are verbatim by policy; this measures only the text we wrote. +2. Internal links 1.9 per 1,000 words (guideline 3–5). +3. No image, so no image alt text carrying the keyword (design.md requires none; note only). + + + +## Part 2: triage + +| Suggestion | Label | Reason | Layer | Owner | +|---|---|---|---|---| +| Meta description 124 chars, target 130-160 | `accept-record` | Fixed. Rewritten to 150 characters and re-pointed at the doses and the trial numbers, which is what the page now leads with. Title also rewritten from "Retatrutide: what the research shows" to "Retatrutide Dosage, Trial Results and Side Effects": the measured demand is on `retatrutide dosage` (5,901 clicks, KD 0) and `retatrutide side effects` (7,173, KD 10), and the old title named neither. | record `seo` | writer | +| Own prose Flesch 20, avg sentence 19.3 words | `reject-policy` | Sentence length is inside the 22-word minimum. The Flesch penalty is driven by unavoidable terms: "glucose-dependent insulinotropic polypeptide", "least-squares mean", "gastrointestinal". Simplifying them would misstate the trials. `docs/design.md` puts accuracy above readability score, and the skill's own note says Flesch is not a ranking factor. | none | none | +| Internal links 1.9 per 1,000 words, guideline 3-5 | `reject-policy` | Settled on 2026-09-24 and recorded in `docs/content-automation.md`: across the written pages, other records are named 132 times in prose and 110 were already linked. Density stays near one per thousand because these are long single-subject pages. Measured, not argued: the editorial sections of this page link at 4.1/1k; the site-wide figure is diluted by the sources ledger, which is citations rather than prose. | none | none | +| No image, so no keyword in alt text | `reject-policy` | `docs/design.md` requires no images on a record page, and an image added to carry alt text would be decoration. The social card added on 2026-09-29 covers the sharing surface this note is really about. | none | none | +| Two sample sizes were screening counts, not enrolment | `accept-script` | Found while writing, not by the audit. `pmid-42250575` stored n=930 where the abstract says 930 were screened and 537 randomly assigned; `pmid-36354040` stored n=210 where 210 were screened and 72 enrolled. Fixed in `scripts/draft_claims.py`: assignment phrasing is now tried first and any candidate followed by "were screened" is rejected. Both rows corrected. A site-wide re-check of all 223 stored sample sizes is running separately. | `scripts/draft_claims.py` + records | engineer | +| Written escalation section collided with the generated one | `accept-record` | The generated `escalation` block rendered "No study in this record's ledger reports dose-escalation schedules" directly beneath a written section quoting those schedules from the trial abstract: a contradiction, a duplicate H2 and a duplicate element id. `escalation` added to the map's `suppress`. Caught by the duplicate-H2 rule added to `scripts/check_links.py` the same day, which is the first thing that rule has found. | intent map `suppress` | writer | + +## Part 3: exit audit + +Re-run after the accepted items landed. + +| | First run | Exit run | +|---|---|---| +| Heuristic score | 93/100 | 93/100 | +| Trustworthiness | 30/30 | 30/30 | +| Meta description | 124 chars (flagged) | 150 chars | +| Title | generic, no measured query | names `dosage` and `side effects` | +| Duplicate H2 / duplicate id | 1 / 1 | 0 / 0 | +| Outbound domains | europepmc, doi, linkedin | + clinicaltrials.gov (3 links) | + +The score did not move, and that is the expected result rather than a disappointment: the two +accepted items were a meta description and a heading collision, neither of which the heuristic +weighs. Intent coverage is 15 of 17 queries addressed, 98% of measured demand landing on a +rendered answer. The two unaddressed queries are `retatrutide weight loss` and +`retatrutide vs semaglutide`, both of which resolve onto sections written for higher-volume +siblings. + +## Notes for the next page + +The sandbox that built this page reaches Europe PMC but not clinicaltrials.gov, dailymed.nlm.nih.gov +or api.fda.gov. Every NCT number here is quoted from the published paper that declares it, and the +registry links are pointers rather than sources. The page says so in its own words. Broadening +citations to registry and label documents as sources in their own right needs an environment with +access to them. diff --git a/research/intents/retatrutide.json b/research/intents/retatrutide.json new file mode 100644 index 0000000..6731552 --- /dev/null +++ b/research/intents/retatrutide.json @@ -0,0 +1,332 @@ +{ + "slug": "retatrutide", + "type": "compound", + "generated": "2026-09-30", + "sources": [ + "dataforseo keyword_overview live, clickstream, US/en", + "dataforseo serp organic live advanced, US/en, depth 20, three queries", + "Europe PMC REST, core result type, per-PMID" + ], + "scope": "Informational only. Commercial intent (where to buy, vendor comparison, price) is out of scope per docs/content-sop.md and is not covered.", + "stage0_note": "Record already at researched with 36 sources and 25 evidence rows, 18 of them human, before this map was written. No re-fetch was needed.", + "serp_2026-09-30": { + "retatrutide": "All 9 organic results on page 1 are one domain, stonevillenc.org, a municipal .org hosting mass-generated peptide pages. An AI overview is present. This is an unstable SERP: the incumbent is a single abused domain, not a set of real competitors.", + "retatrutide dosage": "Genuine competitors: ro.co (1), lolahealth (2), drugs.com (3), doctronic.ai (4), dailymed (5), youtube (6), nowpatient (7), superdrug (8). An AI overview is present.", + "retatrutide side effects": "Only 4 organic results returned at depth 20: reddit, rapamycin.news, linkedin, x.com. No health publisher holds this query at all, against 7,173 measured clicks and KD 10." + }, + "demand_findings": "The head term measures 204,176 clickstream searches at KD 57, but its first page is one spam domain, so head-term competition is nominal rather than real. The winnable demand is the long tail: 'retatrutide dosage' at 5,901 clicks and KD 0, 'retatrutide dosing schedule' at 3,205 and KD 0, 'retatrutide side effects' at 7,173 and KD 10 with a four-result SERP, 'retatrutide vs tirzepatide' at 4,273 and KD 0. Every measured query is informational; none is transactional.", + "h1": "Retatrutide: the doses used in trials, what the weight-loss numbers actually were, and the trials still running", + "dek": "A triple GIP, GLP-1 and glucagon receptor agonist that no regulator has approved. This page tables every registered trial by its ClinicalTrials.gov number as the published paper states it, gives the dose-response from the phase 2 obesity trial at 24 and 48 weeks as published, and separates the doses that were studied from the ones that circulate.", + "queries": [ + { + "query": "retatrutide", + "volume": { + "clickstream": 204176, + "google_ads": null, + "kd": 57, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "what", + "heading": "What retatrutide is, and why it acts on three receptors instead of one" + }, + { + "query": "retatrutide side effects", + "volume": { + "clickstream": 7173, + "google_ads": 33100, + "kd": 10, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "adverse_events", + "heading": "What side effects were reported, and at which doses", + "boundary": "These are adverse events recorded in trials, at the doses those trials used. They are not a list of what a person should expect." + }, + { + "query": "retatrutide dosage", + "volume": { + "clickstream": 5901, + "google_ads": 49500, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "study_doses", + "heading": "What doses did the trials actually use?", + "boundary": "Every dose below is one a published trial administered. Doses that circulate outside trials are handled separately, and are not the same set." + }, + { + "query": "retatrutide vs tirzepatide", + "volume": { + "clickstream": 4273, + "google_ads": null, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "compare", + "heading": "Retatrutide and tirzepatide, and why the headline percentages do not compare" + }, + { + "query": "what is retatrutide", + "volume": { + "clickstream": 3408, + "google_ads": null, + "kd": 14, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "quick-answer", + "heading": "Retatrutide in two minutes" + }, + { + "query": "retatrutide dosing schedule", + "volume": { + "clickstream": 3205, + "google_ads": 14800, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "escalation_schedules", + "heading": "The escalation schedules the trials used", + "boundary": "Trials escalated from a starting dose over weeks. The starting dose itself changed the side-effect rate, which is why it is reported here rather than only the target dose." + }, + { + "query": "retatrutide reconstitution", + "volume": { + "clickstream": 712, + "google_ads": 1300, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "reconstitution", + "heading": "Reconstitution arithmetic, and what the trials say about it" + }, + { + "query": "retatrutide fda approval", + "volume": { + "clickstream": 661, + "google_ads": 1900, + "kd": 15, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "regulatory_status", + "heading": "Is retatrutide approved?", + "answer": "No regulator has approved retatrutide for any use. It is an investigational molecule in phase 3 trials. Anything sold as retatrutide today is sold outside an approved supply chain." + }, + { + "query": "retatrutide vs semaglutide", + "volume": { + "clickstream": 661, + "google_ads": null, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "compare" + }, + { + "query": "retatrutide half life", + "volume": { + "clickstream": 610, + "google_ads": 1600, + "kd": 0, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "routes_studied", + "heading": "How it is given, and how long it stays" + }, + { + "query": "retatrutide mechanism of action", + "volume": { + "clickstream": 610, + "google_ads": 590, + "kd": 15, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "mechanism", + "heading": "How retatrutide is thought to work" + }, + { + "query": "retatrutide results", + "volume": { + "clickstream": 610, + "google_ads": 3600, + "kd": 25, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "trials", + "heading": "What the weight-loss numbers were, dose by dose" + }, + { + "query": "retatrutide weight loss", + "volume": { + "clickstream": 610, + "google_ads": null, + "kd": 19, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "trials" + }, + { + "query": "retatrutide phase 3", + "volume": { + "clickstream": 559, + "google_ads": null, + "kd": 43, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "registrations", + "heading": "The registered trials, and which have reported", + "boundary": "Every registration below is quoted from the published paper that declares it. The registry pages themselves were not retrieved." + }, + { + "query": "retatrutide availability", + "volume": { + "clickstream": 508, + "google_ads": 1300, + "kd": 7, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "regulatory_status" + }, + { + "query": "retatrutide clinical trial", + "volume": { + "clickstream": 101, + "google_ads": null, + "kd": 25, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "registrations" + }, + { + "query": "retatrutide 12 mg", + "volume": { + "clickstream": null, + "google_ads": 90, + "kd": 11, + "source": "dataforseo keyword_overview (clickstream), US/en, 2026-09-30" + }, + "intent": "informational", + "policy": "evidence-only", + "section": "study_doses" + } + ], + "competitors": [ + { + "url": "https://ro.co/weight-loss/retatrutide-dosing/", + "rank": 1, + "words": 2558, + "tables": 1, + "h2": 24, + "h3": 17, + "sci_links": 13, + "byline": "Written by Leandra Beabout; Reviewed by Raagini Yedidi, MD", + "score": 24, + "gap": "Strongest of the three. A physician reviewer and 13 scientific links, and it is correct that retatrutide is investigational. It cites no trial registration, gives no dose-response table, and does not separate doses a trial administered from doses that circulate.", + "source": "fetched 2026-09-30, metrics measured; scored D7 F5 S8 U4" + }, + { + "url": "https://www.doctronic.ai/blog/retatrutide-dosage-chart-and-dosing-schedule-guide/", + "rank": 4, + "words": 1902, + "tables": 0, + "h2": 15, + "h3": 25, + "sci_links": 0, + "byline": "Medically reviewed by Alan Lucks", + "score": 11, + "gap": "Titled a dosage chart and contains no table. Zero links to any primary source, zero trial registrations, and a named reviewer with no stated credential. The dose numbers appear without saying which trial produced them.", + "source": "fetched 2026-09-30, metrics measured; scored D4 F2 S1 U4" + }, + { + "url": "https://nowpatient.com/blog/what-is-the-starting-dose-of-retatrutide", + "rank": 7, + "words": 2206, + "tables": 0, + "h2": 12, + "h3": 44, + "sci_links": 2, + "byline": "Written by Stefano Mirabello, BPharm", + "score": 13, + "gap": "A pharmacist byline and 44 H3s over 2,206 words, so the structure is thin sections rather than depth. Two scientific links, no registrations, no table, and no separation of studied from circulating doses.", + "source": "fetched 2026-09-30, metrics measured; scored D5 F3 S2 U3" + } + ], + "information_gain": "The only page that tables every registered retatrutide trial by the ClinicalTrials.gov number the published paper itself declares, alongside phase, enrolment and what the trial reported, so a reader can tell a completed phase 3 from a design paper for trials that have not read out. None of the three scored competitors cites a single registration. It is also the only page giving the phase 2 obesity dose-response as published at both 24 and 48 weeks for all four dose groups against placebo, rather than quoting the single best number; the only one reporting that the starting dose, not the target dose, is what changed the side-effect rate; and the only one carrying the dose-dependent heart-rate increase that peaked at 24 weeks and then declined, which every competitor omits.", + "serp_format_rewarded": "Dosage queries return an AI overview plus listicle-style guides with H3-heavy structure and no tables. A table that names the trial behind each dose is both the format the query wants and the thing no incumbent has. The side-effects query returns four results, none from a health publisher, so a cited adverse-events section can take it outright.", + "outline": [ + "glance", + "quick-answer", + "what", + "mechanism", + "assessment", + "human-trials", + "trials", + "registrations", + "evidence", + "doses", + "dosage-chart", + "escalation", + "adverse", + "who", + "biomarkers", + "interactions", + "timelines", + "timeline", + "durations", + "routes", + "weight", + "reported-use", + "reconstitution", + "storage-guide", + "monitoring", + "mistakes", + "comparison-table", + "compare", + "combination", + "regulatory", + "open", + "faq", + "sources", + "card", + "related", + "changelog" + ], + "suppress": [ + "storage", + "escalation" + ], + "open_actions": [ + "Trial registry pages on clinicaltrials.gov and the DailyMed label at rank 5 could not be retrieved: the sandbox that built this page reaches Europe PMC but not clinicaltrials.gov, dailymed.nlm.nih.gov or api.fda.gov. Every NCT number here is quoted from the published paper that declares it. Re-verify against the registry from an environment with access before treating the registry as a source in its own right.", + "DailyMed carries a retatrutide entry at rank 5 for 'retatrutide dosage'. Retatrutide has no FDA approval, so that listing needs checking: it is most likely an unapproved compounded preparation, which would itself be worth a cited paragraph." + ] +} diff --git a/scripts/draft_claims.py b/scripts/draft_claims.py index aee9211..3a158bd 100644 --- a/scripts/draft_claims.py +++ b/scripts/draft_claims.py @@ -79,9 +79,21 @@ # may be split by a space, a thin space or a comma. Enrolment phrasing comes # before "n =", which in an abstract is usually a subgroup. NUM = r"(\d{1,3}(?:[ ,\u00a0\u202f]\d{3})+|\d{1,7})" +# A CONSORT-style abstract opens with the screening count, which is larger than +# the trial and is not its sample size: "930 participants were screened and 537 +# were randomly assigned" put 930 on the retatrutide phase 3 row, and "210 +# people were screened, of whom 72 were enrolled" put 210 on the phase 1b row. +# Both patterns below used to match the screening number first. Assignment +# phrasing is therefore tried before anything else, and any candidate whose +# following words say it was screened is rejected outright. +ASSIGNED = re.compile( + r"\b" + NUM + r"\s+(?:\([^)]{0,40}\)\s*)?(?:\w+\s+){0,3}?" + r"(?:were|was)\s+(?:randomly\s+assigned|randomi[sz]ed|allocated|enrolled)\b", re.IGNORECASE) +SCREENED_AFTER = re.compile(r"^[^.]{0,40}?\b(?:were|was)\s+screened\b", re.IGNORECASE) N_RE = [ + ASSIGNED, + re.compile(r"\b(?:enrolled|randomi[sz]ed|included|analy[sz]ed|recruited)\s+" + NUM + r"\b", re.IGNORECASE), re.compile(r"\b" + NUM + r"\s+(?:patients|participants|subjects|volunteers|adults|individuals|people|men|women|children|infants|rats|mice|rabbits|dogs|pigs|animals)\b", re.IGNORECASE), - re.compile(r"\b(?:enrolled|randomi[sz]ed|included|analy[sz]ed|recruited|screened)\s+" + NUM + r"\b", re.IGNORECASE), re.compile(r"\b[nN]\s?=\s?" + NUM + r"\b"), ] DESIGN_FROM_TITLE = [ @@ -213,8 +225,13 @@ def sample_size(abstract: str) -> int | None: for rx in N_RE: for m in rx.finditer(abstract): n = int(re.sub(r"[ ,\u00a0\u202f]", "", m.group(1))) - if 1 <= n <= 2_000_000: - return n + if not 1 <= n <= 2_000_000: + continue + # "930 participants were screened and 537 were randomly assigned": + # the screening count is not the trial's size. + if rx is not ASSIGNED and SCREENED_AFTER.match(abstract[m.end():]): + continue + return n return None diff --git a/scripts/test_drafter.py b/scripts/test_drafter.py index 83ffa27..a8bedda 100644 --- a/scripts/test_drafter.py +++ b/scripts/test_drafter.py @@ -35,6 +35,25 @@ def test_comma_separated_thousands(self): def test_year_is_not_a_count(self): self.assertEqual(dc.sample_size("Between 2015 and 2019, 30 patients were treated."), 30) + def test_screening_count_is_not_the_sample(self): + # TRANSCEND-T2D-1, Lancet 2026: the retatrutide phase 3 row stored 930, + # which is how many people were screened, not how many were in the trial. + self.assertEqual(dc.sample_size( + "Between April 10, 2024, and April 21, 2025, 930 participants were screened and 537 " + "(296 [55%] female and 241 [45%] male) were randomly assigned: 134 to retatrutide 4 mg"), 537) + + def test_screening_count_before_enrolment(self): + # Urva 2022 Lancet phase 1b: the row stored 210, the screening count. + self.assertEqual(dc.sample_size( + "Between Dec 18, 2019, and Dec 28, 2020, 210 people were screened, of whom 72 were " + "enrolled, received at least one dose of study drug, and were included in safety analyses."), 72) + + def test_screened_then_randomised_short_form(self): + self.assertEqual(dc.sample_size("2000 patients were screened; 150 were randomised to treatment."), 150) + + def test_plain_enrolment_still_wins(self): + self.assertEqual(dc.sample_size("We enrolled 338 adults, 51.8% of whom were men."), 338) + def test_enrolment_beats_subgroup_n(self): text = "The renal impairment study included 33 participants (normal function, n = 14; mild impairment, n = 7)." self.assertEqual(dc.sample_size(text), 33)