diff --git a/.claude/hooks/enforce-codex-background.mjs b/.claude/hooks/enforce-codex-background.mjs new file mode 100644 index 000000000..8e8bd69d9 --- /dev/null +++ b/.claude/hooks/enforce-codex-background.mjs @@ -0,0 +1,76 @@ +#!/usr/bin/env node +// enforce-codex-background.mjs +// +// PreToolUse hook on Bash: when the command invokes `codex exec` or +// `codex review`, REQUIRE the Bash tool call to carry +// `run_in_background: true`. Foreground Codex dispatches block the +// orchestrator for minutes while Codex churns — and the rule has lived +// in `.claude/codex-delegation.md:7` as plain text since the protocol +// was written. Plain-text rules lose to active enforcement. +// +// 2026-05-16 trigger: Mike, verbatim — *"do you remember what our +// workflow is? Where you fucking do something and then give me the +// links that I have to review, ask me questions about it and stuff? +// And then you always delegate everything to Kodak's agents in the +// background. Do we have that documented in hook or something, +// something, somewhere that will force you to do it?"* — after I +// dispatched a Codex preflight in foreground (10 min Bash timeout) +// for a copy-only commit. He had to background it himself by +// interrupting. +// +// Bypass: none. If the dispatch is truly short-lived (<30s) and the +// orchestrator needs the result inline, dispatch with a Monitor watcher +// or refactor the work — never bypass. +// +// Related: feedback_promote_violated_text_rules_to_hooks.md. + +import { readFileSync } from "node:fs"; + +try { + const raw = readFileSync(0, "utf-8"); + if (!raw || !raw.trim()) process.exit(0); + + const hookData = JSON.parse(raw); + if (hookData?.tool_name !== "Bash") process.exit(0); + + const command = String(hookData?.tool_input?.command ?? ""); + if (!command) process.exit(0); + + // Skip non-codex first tokens (mirrors enforce-codex-protocol.mjs). + const firstToken = command.trim().split(/\s+/)[0] ?? ""; + if (/^(git|gh|grep|rg|find|cat|head|tail|sed|awk|echo|printf|ls|cd|node|pnpm|npm|yarn|tsx|powershell)$/i.test(firstToken)) { + process.exit(0); + } + + // Only fire on codex dispatches that start a NEW conversation. + // `codex exec resume ` and CLI subcommands (login, mcp, etc.) + // are allowed in foreground because they're short-lived control + // operations, not work dispatches. + const isFreshDispatch = /\bcodex\s+(exec|review)\b/.test(command) && + !/\bcodex\s+exec\s+resume\b/.test(command) && + !/\bcodex\s+(login|logout|mcp|plugin|app|cloud|features|completion|update|sandbox|debug|apply|fork|help)\b/.test(command); + + if (!isFreshDispatch) process.exit(0); + + // The Bash tool flags background via tool_input.run_in_background. + // Some harness versions pass it as boolean true; some pass a string + // "true". Accept both. Anything else = foreground = block. + const bg = hookData?.tool_input?.run_in_background; + if (bg === true || bg === "true") process.exit(0); + + const msg = + `[enforce-codex-background] BLOCKED — codex dispatch must carry run_in_background: true.\n\n` + + `Foreground Codex dispatches block the orchestrator for minutes while Codex churns.\n` + + `The rule lives at .claude/codex-delegation.md:7 — but plain-text rules lose to active\n` + + `enforcement, so this hook now enforces it.\n\n` + + `Fix: re-issue the SAME Bash command with run_in_background: true. The harness will\n` + + `notify you when Codex completes; in the meantime, do other work.\n\n` + + `If you genuinely need the result inline (you don't — there is almost always other\n` + + `work to do), dispatch with Monitor watching the session JSONL — never bypass this hook.\n\n` + + `Triggered by command:\n ${command.slice(0, 200)}${command.length > 200 ? '…' : ''}`; + + process.stderr.write(msg + "\n"); + process.exit(2); +} catch { + process.exit(0); +} diff --git a/.claude/hooks/enforce-copy-review-before-commit.mjs b/.claude/hooks/enforce-copy-review-before-commit.mjs new file mode 100644 index 000000000..83fda1c15 --- /dev/null +++ b/.claude/hooks/enforce-copy-review-before-commit.mjs @@ -0,0 +1,212 @@ +#!/usr/bin/env node +// enforce-copy-review-before-commit.mjs +// +// PreToolUse hook on Bash: when the command is `git commit` AND the +// staged diff touches user-facing copy files, REQUIRE the current +// turn to have shown Mike a before/after of the copy AND called +// AskUserQuestion with predicted complaints + freeform "Other". +// +// 2026-05-16 trigger: Mike, verbatim — *"And you're supposed to like +// fucking tell me what the previous text was and what you changed it +// to before you fucking commit and ask me if that's OK. If you'd +// like give me like a multiple choice questions with buttons that I +// can click if I like with the things that you think I might wanna +// change and then a freeform one. Can you add that to your protocol +// too anytime you change copy? And force yourself to do it."* — after +// I attempted to commit a /plaintiffs rewrite without showing him +// the before/after or asking. +// +// Why: copy changes are taste calls. Mike is the human gradient +// signal. I cannot judge whether the new wording lands without him. +// Committing without a before/after + AskUserQuestion ships untested +// taste into the campaign critical path. +// +// What counts as user-facing copy (must trigger this hook): +// packages/web/src/app/**/*.tsx +// packages/web/src/app/**/*.md (auto-generated snapshots from the .tsx) +// packages/web/src/components/**/*.tsx +// packages/web/src/lib/routes.ts +// packages/web/src/lib/messaging.ts +// packages/web/src/lib/email/** +// packages/web/emails/** +// packages/web/src/components/people/*ShareCard* +// packages/web/src/components/people/*SignatureBox* +// +// What the hook checks (best-effort, transcript-based): +// 1. Staged diff includes at least one copy file (above patterns). +// 2. Current-turn assistant text shows a before/after diff display +// (a "BEFORE:"/"AFTER:" or "Old:"/"New:" or backtick-delimited +// old/new blocks). +// 3. AskUserQuestion was called in the current turn. +// +// If 1 fires but 2 or 3 missing → BLOCK with corrective template. +// +// Related memory: +// - [[feedback_one_at_a_time_review_loop_with_predicted_fixes]] +// - [[feedback_promote_violated_text_rules_to_hooks]] +// - [[feedback_verify_ui_fix_before_commit]] + +import { existsSync, readFileSync } from "node:fs"; +import { execSync } from "node:child_process"; + +const COPY_PATTERNS = [ + /^packages\/web\/src\/app\/.*\.(tsx|md)$/, + /^packages\/web\/src\/components\/.*\.tsx$/, + /^packages\/web\/src\/lib\/routes\.ts$/, + /^packages\/web\/src\/lib\/messaging\.ts$/, + /^packages\/web\/src\/lib\/email\//, + /^packages\/web\/emails\//, +]; + +try { + const raw = readFileSync(0, "utf-8"); + if (!raw || !raw.trim()) process.exit(0); + + const hookData = JSON.parse(raw); + if (hookData?.tool_name !== "Bash") process.exit(0); + + const command = String(hookData?.tool_input?.command ?? ""); + if (!command) process.exit(0); + + // Match `git commit` invocations only. Use a negative lookahead so + // `commit-tree`, `commit-graph`, etc. are excluded (the `\b` boundary + // alone fires on `commit-tree` because `-` is a non-word char). Also + // allow common config prefixes like `git -c user.email=foo commit`, + // `git -C path commit`, `git -S commit`. + if (!/\bgit\s+(?:(?:-[CcP]\s+\S+|-S(?:\s*\S+)?)\s+)*commit(?!\S)/.test(command)) { + process.exit(0); + } + + // Read staged diff name-only via git. + let stagedFiles = []; + try { + const out = execSync("git diff --cached --name-only", { + encoding: "utf-8", + cwd: hookData?.cwd ?? process.cwd(), + stdio: ["ignore", "pipe", "ignore"], + }); + stagedFiles = out.split(/\r?\n/).filter(Boolean); + } catch { + process.exit(0); + } + if (stagedFiles.length === 0) process.exit(0); + + const copyFiles = stagedFiles.filter((f) => + COPY_PATTERNS.some((re) => re.test(f.replace(/\\/g, "/"))), + ); + if (copyFiles.length === 0) process.exit(0); + + // Read the current-turn assistant text from the transcript. + const transcriptPath = + hookData?.transcript_path ?? hookData?.transcriptPath; + let chatText = ""; + let askedThisTurn = false; + if (typeof transcriptPath === "string" && existsSync(transcriptPath)) { + const lines = readFileSync(transcriptPath, "utf-8").split(/\r?\n/); + const entries = []; + for (const line of lines) { + if (!line.trim()) continue; + try { + entries.push(JSON.parse(line)); + } catch { + // ignore malformed + } + } + + let lastHumanIndex = -1; + for (let i = 0; i < entries.length; i += 1) { + const e = entries[i]; + if (e?.type !== "user") continue; + if (e?.sourceToolAssistantUUID) continue; + const content = e?.message?.content; + if (Array.isArray(content)) { + if (content.every((part) => part?.type === "tool_result")) continue; + } else if (typeof content !== "string") { + continue; + } + // AskUserQuestion responses come through as text-content user + // messages prefixed with "User has answered your questions:". They + // are NOT new human-initiated messages — without this skip, every + // copy-review confirmation click resets the lastHumanIndex pointer, + // creating an infinite re-ask loop (Mike caught this 2026-05-17 + // after 3 forced re-confirmations of the same diff). + const text = + typeof content === "string" + ? content + : Array.isArray(content) + ? content + .map((p) => + typeof p?.text === "string" ? p.text : "", + ) + .join("") + : ""; + if (/^\s*User has answered your questions:/i.test(text)) continue; + lastHumanIndex = i; + } + + for (let i = lastHumanIndex + 1; i < entries.length; i += 1) { + const e = entries[i]; + if (e?.type !== "assistant") continue; + const content = e?.message?.content; + if (!Array.isArray(content)) continue; + for (const part of content) { + if (part?.type === "text" && typeof part.text === "string") { + chatText += part.text + "\n"; + } + if (part?.type === "tool_use" && part?.name === "AskUserQuestion") { + askedThisTurn = true; + } + } + } + } + + // Heuristic: did I show a before/after? + // + // Require explicit labeled markers matching the template the hook + // prints on failure. The prior "any `before` near any `after` within + // 400 chars" was a near-no-op — incidental prose like "before commit, + // review changes; after that, ship" satisfied it, and "the header was + // too long; now shorter" satisfied the `was…now` fallback. Mike's + // template uses **BEFORE:** / **AFTER:** so we require those tokens + // (case-insensitive, optional markdown bolding) — they don't appear + // in narrative prose. + const ctRaw = chatText; // keep case for marker detection + const ct = ctRaw.toLowerCase(); + const hasBeforeMarker = /(\*\*|__|^|\n)\s*before\s*[:\*]/i.test(ctRaw); + const hasAfterMarker = /(\*\*|__|^|\n)\s*after\s*[:\*]/i.test(ctRaw); + const hasOldNewMarkers = + /(\*\*|__|^|\n)\s*old\s*[:\*]/i.test(ctRaw) && + /(\*\*|__|^|\n)\s*new\s*[:\*]/i.test(ctRaw); + const showsBeforeAfter = + (hasBeforeMarker && hasAfterMarker) || hasOldNewMarkers; + + if (showsBeforeAfter && askedThisTurn) process.exit(0); + + const fileList = copyFiles.map((f) => ` - ${f}`).join("\n"); + const msg = + `[enforce-copy-review-before-commit] BLOCKED — copy commit without before/after review.\n\n` + + `Staged copy files:\n${fileList}\n\n` + + `Missing in current turn:\n` + + (showsBeforeAfter ? `` : ` - Before/After diff display (Mike needs to see OLD text + NEW text in chat)\n`) + + (askedThisTurn ? `` : ` - AskUserQuestion with predicted complaints + freeform Other\n`) + + `\n` + + `Required template before re-attempting commit:\n\n` + + ` **BEFORE:** \n\n` + + ` **AFTER:** \n\n` + + ` Predicted complaints:\n` + + ` 1. **A: Looks good, ship it**\n` + + ` 2. **B: **\n` + + ` 3. **C: **\n` + + ` 4. **D: **\n` + + ` (Other: freeform — Mike types his own complaint)\n\n` + + ` [AskUserQuestion call here]\n\n` + + `Why: copy changes are taste calls; Mike is the human gradient signal.\n` + + `Rule lives at: feedback_show_before_after_and_ask_before_copy_commit.md\n` + + `Doc: .claude/codex-delegation.md (delegation rules)\n` + + `Related hook: review-loop-gate.mjs (post-deploy review queue)`; + + process.stderr.write(msg + "\n"); + process.exit(2); +} catch { + process.exit(0); +} diff --git a/.claude/hooks/enforce-no-codex-in-commit-message.mjs b/.claude/hooks/enforce-no-codex-in-commit-message.mjs new file mode 100644 index 000000000..e73ffca86 --- /dev/null +++ b/.claude/hooks/enforce-no-codex-in-commit-message.mjs @@ -0,0 +1,145 @@ +#!/usr/bin/env node +// enforce-no-codex-in-commit-message.mjs +// +// PreToolUse hook on Bash and Husky commit-msg hook: BLOCK if the +// commit message contains the word "Codex", "[codex]", or "codex/" +// in an attribution position. Per AGENTS.md: +// +// "Do not put `Codex`, `[codex]`, or `codex/` in branch names, +// pull request titles, or commit messages unless the human +// explicitly asks." +// +// Exception: literal hook/file names that contain "codex" are OK +// because they're descriptive references to actual files (e.g. +// `enforce-codex-background.mjs`). Attribution phrases like +// "Codex preflight clean" or "qa-passed: Codex " are NOT. +// +// Heuristic: distinguish attribution from literal reference. +// - "codex-" (kebab-case identifier) → likely a hook/file name → OK +// - ".mjs" / ".ts" / ".js" suffix nearby → file reference → OK +// - "Codex " followed by an agent id like "bxxxxxxxx" → ATTRIBUTION → BLOCK +// - "Codex preflight" / "Codex review" / "Codex audit" → ATTRIBUTION → BLOCK +// - "qa-passed: Codex" → ATTRIBUTION → BLOCK +// +// Bypass: include the literal string `human-authorized-codex-mention` +// in the message body only when Mike explicitly asked. +// +// 2026-05-16 trigger: codex stop-time review flagged commit c37160d1 +// for "qa-passed: Codex bjb7ndrvy"; multiple session commits had +// similar attribution phrases. + +import { existsSync, readFileSync } from "node:fs"; +import { resolve } from "node:path"; + +const HUMAN_AUTHORIZED_BYPASS = /\bhuman-authorized-codex-mention\b/i; + +function commandFlagFile(command, flag, cwd) { + const match = command.match(new RegExp(`${flag}\\s+("[^"]+"|'[^']+'|\\S+)`)); + if (!match?.[1]) return ""; + const rawPath = match[1].replace(/^["']|["']$/g, ""); + const path = /^[A-Za-z]:[\\/]/.test(rawPath) || rawPath.startsWith("/") + ? rawPath + : resolve(cwd, rawPath); + try { + return readFileSync(path, "utf-8"); + } catch { + return ""; + } +} + +function extractCommandMessage(command, cwd) { + const heredocMatch = command.match( + /<<\s*['"]?([A-Za-z_]+)['"]?\s*[\s\S]*?\n([\s\S]*?)\n\1/, + ); + const dashMMessage = [...command.matchAll(/-m\s+["']([\s\S]*?)["']/g)] + .map((match) => match[1]) + .filter(Boolean) + .join("\n\n"); + const fileMessage = commandFlagFile(command, "-F", cwd); + return [heredocMatch?.[2], dashMMessage, fileMessage] + .filter(Boolean) + .join("\n\n"); +} + +function detectedAttributionHits(message) { + if (!message || HUMAN_AUTHORIZED_BYPASS.test(message)) return []; + + // Patterns that flag ATTRIBUTION (not literal file-name reference): + // "Codex" as a standalone brand/reference in commit prose + // "[codex]" / "codex/" from the AGENTS.md enumerated forms + // "Codex preflight" / "qa-passed: Codex" / "via Codex" + // Literal lower-case kebab file names like enforce-codex-background.mjs are OK. + const attributionPatterns = [ + /\[codex\]/i, + /\bcodex\//i, + /(?:^|[^-\w])Codex\b(?![-/.])/, + /\bCodex\s+[a-z][0-9a-z]{6,}\b/, + /\bCodex\s+(preflight|review|audit|investigated|investigation|implementation|implemented|critique|agent|subagent|dispatch|fixed|wrote|drafted|verdict|verified|cleared|found)\b/i, + /(?:qa-passed|reviewed by|fixed by|implemented by|drafted by|audited by|approved by|cleared by|verified by|written by)[^a-z\n]*Codex\b/i, + /\bvia\s+Codex\b/i, + /\bby\s+Codex\b/i, + /\bfrom\s+Codex\b/i, + /\bwith\s+Codex\b/i, + /\bCodex\s+(says|did|ran|produced|returned|reported|found|caught|flagged)\b/i, + ]; + + return attributionPatterns + .map((re) => message.match(re)) + .filter(Boolean); +} + +function blockIfNeeded(message) { + const hits = detectedAttributionHits(message); + if (hits.length === 0) return; + + const msg = + `[enforce-no-codex-in-commit-message] BLOCKED — commit message contains "Codex" attribution.\n\n` + + `AGENTS.md forbids "Codex" / "[codex]" / "codex/" in branch names, PR titles,\n` + + `and commit messages unless the human explicitly asks.\n\n` + + `Attribution phrases detected:\n${hits.map((h) => ` - ${h?.[0]}`).join("\n")}\n\n` + + `Fix: rewrite the attribution without naming Codex. Examples:\n` + + ` - "qa-passed: Codex bjb7ndrvy" -> "qa-passed: preflight bjb7ndrvy — typecheck + ..."\n` + + ` - "Codex preflight clean" -> "preflight clean: typecheck + e2e + visual smoke"\n` + + ` - "audited by Codex" -> "audited via agent-id-here"\n\n` + + `Bypass (only if Mike explicitly asked): include the literal string\n` + + `\`human-authorized-codex-mention\` in the commit message body.\n\n` + + `Rule lives at: AGENTS.md\n` + + `Memory: feedback_no_codex_in_commit_messages.md`; + + process.stderr.write(msg + "\n"); + process.exit(2); +} + +try { + const commitMsgPath = process.argv[2]; + if (commitMsgPath && existsSync(commitMsgPath)) { + blockIfNeeded(readFileSync(commitMsgPath, "utf-8")); + process.exit(0); + } + + const raw = readFileSync(0, "utf-8"); + if (!raw || !raw.trim()) process.exit(0); + + const hookData = JSON.parse(raw); + if (hookData?.tool_name !== "Bash") process.exit(0); + + const command = String(hookData?.tool_input?.command ?? ""); + if (!command) process.exit(0); + + // Match `git commit` through common flag forms while skipping plumbing + // subcommands like `git commit-tree` and `git commit-graph`. + if (!/\bgit\b(?:(?!\bgit\b)[\s\S])*?\bcommit\b(?!(?:-tree|-graph)|\S)/.test(command)) { + process.exit(0); + } + + // Explicit human bypass. + if (HUMAN_AUTHORIZED_BYPASS.test(command)) process.exit(0); + + const message = extractCommandMessage(command, hookData?.cwd ?? process.cwd()); + + if (!message) process.exit(0); // can't inspect, fail-open + + blockIfNeeded(message); +} catch { + process.exit(0); +} diff --git a/.claude/plans/autonomous-vote-conversion-prioritization.md b/.claude/plans/autonomous-vote-conversion-prioritization.md new file mode 100644 index 000000000..0173ee63b --- /dev/null +++ b/.claude/plans/autonomous-vote-conversion-prioritization.md @@ -0,0 +1,312 @@ +# Autonomous Vote Conversion Prioritization + +Slug: `autonomous-vote-conversion-prioritization` +Branch: `feature/plaintiffs-variant-1-and-copy-hooks` (will spin a new `feature/...` branch per shipped item) +Date: 2026-05-16 +Author: Claude (drafted on Mike's direction, revised by Codex critique round 1) +Status: DRAFT - awaiting `/autoplan` Phase 4 final gate + Mike approval + +## Brief + +**Goal:** rank the next campaign work by expected autonomous treaty votes per month, not by PR neatness. Output: a concrete 4-week roadmap of the top 5-7 items, each scoped so Mike can review it on his phone, with no plan that depends on Mike personally emailing or calling humans. + +**Mike's verbatim brief:** +> "should we start an /autoplan. review the todo.md and strategize and calculate the value of each thing in terms of getting us more votes like I don't want to have to like email anyone or communicate with humans. I want this thing to just like get all the votes itself and good. I guess organizations to put it on their websites stuff" + +**Revised scoring model:** +- **V** = expected incremental treaty votes per 30-day month after the item is live. Plain vote/month estimate, not log scale and not "votes per PR." +- **E** = elapsed dev-days to ship, verify, get screenshots/copy review where required, and open the PR. A tiny PR still costs at least 0.5 days because review/deploy latency is real. +- **A** = autonomous distribution multiplier. `1.0` = existing traffic/search/product/referral loop drives usage with no Mike outreach; `0.7` = self-serve distribution exists but adoption depends on org/admin discovery; `0.4` = partners must notice/adopt it; `0.1` = effectively requires Mike outreach. +- **Score** = `(V * A) / E`, reported as autonomous votes/month unlocked per dev-day. + +The score selects the work; the execution order below also respects dependency and safety gates. In particular, the CI filter and login bug ship before the org button because bad CI and auth spam slow or poison every later conversion experiment. + +Two strategic levers Mike named explicitly: +1. **Site converts visitors autonomously** - no Mike-in-the-loop per vote. +2. **Org-embeddable/copyable vote surface** - let organizations put a treaty vote button or badge on their own sites. The first version must be copyable HTML linking to `/treaty?ref=`; iframe voting/auth is a later project, not the 3-day PR. + +## Current state (ASCII) + +``` +TODO.md (~700 lines, 7 priority groups): + +P0 - Auth UX fixes (login button respam, mobile fold, font sizes) +P0 - Treaty vote conversion (/treaty boring+fast, dashboard, tasks) +P0 - Referral propagation (share templates, HM digest, K-factor missing) +P1 - Organizations Endorse/Embed/Recruit (survey embed exists, treaty vote badge missing) +P1 - Person/Org Conversion Surfaces (prior PR-A through PR-E roadmap) +P1 - Plaintiffs and Court Framing (/humanity-v-government rework, /court ops) +P2+ - Distribution channels (posters, QR, search/LLM surfaces) + +Repo facts that change the plan: + - /organizations/[id] already resolves both id and slug; do not create /orgs/[slug]. + - /orgs/[slug] currently exists only for admin/reasoning paths. + - packages/db/src/task-keys.ts already exists; new persistent task keys go there first. + - Person.isPublicFigure already exists in Prisma; no schema migration for public figures. + - packages/web/src/lib/site-structured-data.ts exists; structured data should be extended, not invented. + - No app/llms.txt route exists yet. + - ShareAttempt, ReferralClick, ReferralInvitation, and ReferendumVote already provide most K-factor raw material. + - Organization pages already expose survey URL/button/iframe copy fields, but not a treaty vote button/badge. + - /treaty currently renders TreatyNameSignatureBox without parsing search params; org referral/attribution needs verification before promising /treaty?ref=. + - web-e2e-validate currently runs in .github/workflows/ci.yml; skipping the whole workflow with paths-ignore would hide regressions. + +Capabilities already shipped (don't redo): + - /treaty skim-and-sign single page + - Post-vote email share kit + - Humanity Manager corp-org-chart framing + - /people/[id] conversion surface (PR #81) + - /plaintiffs above-form Variant 1 (PR #84) + - SufferingPreventedMetric shared component + - Organization survey link/button/iframe copy surface on /organizations/[id] +``` + +## Proposed state (ASCII) + +``` +Top 7 execution queue for next 4 weeks +(order includes safety/dependency gates; score is monthly vote leverage): + +#1: SAFE JOB-LEVEL PATHS-FILTER FOR WEB E2E V=20/mo, E=0.5d, A=1.0 -> Score 40 + - Keep CI workflow running; gate expensive web-e2e steps/jobs with paths-filter. + - Do not use workflow-level paths-ignore. + - Value is throughput/risk reduction, not a fake vote machine. + +#2: LOGIN FORM-STAYS-CLICKABLE BUG V=50/mo, E=0.5d, A=1.0 -> Score 100 + - Prevent duplicate magic/sign-in emails after success. + - Required before driving more logged-out treaty traffic through org badges. + +#3: COPYABLE ORG TREATY BUTTON/BADGE V=300/mo, E=1.0d, A=0.7 -> Score 210 + - Extend existing /organizations/[id], do not add /orgs/[slug]. + - Copyable HTML button/badge links to /treaty?ref=. + - No cross-origin iframe voting, no auth-in-iframe, no JS snippet. + +#4: EMBED DISTRIBUTION SPEC + SELF-SERVE SURFACE V=500/mo, E=2.0d, A=0.8 -> Score 200 + - Solve discovery: where org admins find the badge, what they copy, how it credits them. + - Add sitemap/indexing for approved org pages and a partner-safe install checklist. + - Define the later iframe contract, but do not build it in this phase. + +#5: K-FACTOR INSTRUMENTATION V=160/mo, E=1.5d, A=1.0 -> Score 107 + - Track visitor -> sign -> share -> click -> referred vote by source. + - Report per-channel K: personal referral, org badge, email share, post-vote share. + - Use existing ShareAttempt/ReferralClick/ReferendumVote where possible. + +#6: LLMS.TXT + STRUCTURED DATA DISTRIBUTION V=200/mo, E=1.5d, A=1.0 -> Score 133 + - Add /llms.txt and extend existing schema.org graph for treaty/org/signatory surfaces. + - Improve search and AI-agent discovery without Mike outreach. + - Keep facts parameter-backed and route-metadata-backed. + +#7: FOUNDATION ACTION TASK KEYS + LIGHT ORG TASKS V=120/mo, E=2.0d, A=0.9 -> Score 54 + - Add 5 campaign action task keys in packages/db/src/task-keys.ts first. + - Seed tasks in managed data after keys exist. + - Extend /organizations/[id] with a below-fold light task DTO and revalidate strategy. + +Deferred but reshaped: + - Public-figure catalog becomes an import/review pipeline with 5 pilot records. + - Apocalypse copy sweep becomes a plan-first copy project, not a trivial grep sweep. + - Full cross-origin voting iframe waits until badge attribution and auth are proven. +``` + +## Step list + +### Dispatch sequence + +For each item: tighten scope, verify the exact files, write a short plan section if the item touches multiple systems, run Codex critique, dispatch, review, capture screenshots for UI/copy, and open the PR. Mike reviews PR + screenshots + changed copy before commit when the repo rules require it. + +**Week 1** + +- **Item #1 - Safe job-level paths-filter for web-e2e** + - Modify `.github/workflows/ci.yml`. + - Add a lightweight `changes`/filter step or job using job-level path filtering, then guard expensive `web-e2e-validate` install/build/playwright steps or split the expensive work behind `if:`. + - Required behavior: the CI workflow and required check still complete successfully on markdown-only/non-web PRs; relevant web, shared package, Prisma, lockfile, route, content, and Playwright changes still run e2e. + - Explicitly forbidden: top-level `on.pull_request.paths-ignore` or any filter that prevents the required workflow/check from reporting. + - Plan-first? NO - one workflow, high safety requirement, direct implementation. + +- **Item #2 - Login form-stays-clickable bug** + - Modify `packages/web/src/components/auth/AuthForm.tsx`. + - Add a durable submitted/success state distinct from in-flight loading so the submit button does not re-enable after email success. + - Add/adjust focused tests around email-provider success, duplicate click prevention, and callback URL/referral persistence. + - Screenshot the affected sign-in state locally before commit. + - Plan-first? NO - single-component bug fix, but do it before org badge traffic. + +**Week 2** + +- **Item #3 - Copyable org treaty button/badge** + - Extend `packages/web/src/app/organizations/[id]/page.tsx`; the existing route already accepts slug via `OR: [{ id }, { slug: id }]`. + - Add a treaty vote URL and copyable HTML button/badge for approved organizations. Initial contract: `/treaty?ref=`. + - Before implementation, verify whether `/treaty?ref=` should overload the current user-referral `ref` semantics or whether the button needs `?org=` plus a redirect/compatibility shim. Current vote API has separate `ref` and `organizationSlug` fields; do not silently break user referral attribution. + - Keep it copyable HTML only: no cross-origin iframe voting, no JS snippet, no auth inside an iframe. + - Copy must be partner-safe and reviewed before commit. + - Screenshot `/organizations/` after the change. + - Plan-first? BORDERLINE - write a short pre-dispatch contract note if query semantics are not obvious. + +- **Item #4 - Embed distribution spec + self-serve surface** + - Plan-first? YES - this is product distribution, not a widget. + - Plan file: `.claude/plans/org-embed-distribution.md`. + - Define: who sees the install controls, where approved org pages are indexed, how org admins find the badge, what exact copy they paste, how attribution is verified, and what the later iframe version must support. + - Extend, do not duplicate, `packages/web/src/app/organizations/[id]/page.tsx`. + - Add approved public organizations to `packages/web/src/app/sitemap.ts` if not already covered. + - Keep tasks and secondary controls below the vote badge so the page does not become an admin dashboard. + +**Week 3** + +- **Item #5 - K-factor instrumentation** + - Plan-first? YES - this spans analytics, DB-derived metrics, and reporting. + - Define the KPI table before code: + - `visitors_by_source` + - `treaty_signatures_by_source` + - `share_attempts_per_signer` + - `referral_clicks_per_share_attempt` + - `votes_per_referral_click` + - `K = share_attempts_per_signer * referral_clicks_per_share_attempt * votes_per_referral_click` + - Prefer deriving from existing `ShareAttempt`, `ReferralClick`, `ReferralInvitation`, and `ReferendumVote` records before adding schema. + - Add client analytics only where it changes product decisions; do not create metrics theater. + - Candidate files: `packages/web/src/lib/analytics.ts`, `packages/web/src/app/api/share-attempts/route.ts`, `packages/web/src/lib/referral-redirect.server.ts`, `packages/web/src/app/api/referendums/[slug]/vote/route.ts`, and an existing dashboard/admin reporting surface. + +- **Item #6 - /llms.txt + structured data distribution** + - Add `packages/web/src/app/llms.txt/route.ts`. + - Extend `packages/web/src/lib/site-structured-data.ts` and tests instead of creating a parallel structured-data system. + - Include treaty, organization endorsement, signatory, and action URLs that are real, indexed, and useful to search/LLM agents. + - Add route metadata/sitemap/robots links only if they are supported by current Next.js patterns. + - Plan-first? NO for `/llms.txt`; YES if expanding route-specific JSON-LD beyond the existing site graph. + +**Week 4** + +- **Item #7 - Foundation action task keys + light org task display** + - Add all new persistent task constants/builders to `packages/db/src/task-keys.ts` first. + - Seed task rows in `packages/db/src/managed-data/managed-seed-data.ts` using those constants. + - Extend `packages/web/src/lib/organization.server.ts` with a narrow DTO for org action tasks. Select only what the page renders. + - Extend `packages/web/src/app/organizations/[id]/page.tsx` with a below-fold task list and a revalidation strategy; do not turn the public org page into a task admin screen. + - Tests should guard the task-key contract and the light DTO, not mock-and-assert wiring. + - Plan-first? YES if the task display includes claiming/assignment. NO if it is read-only links below the fold. + +### Items explicitly DEFERRED after critique + +| Item | Disposition | +|------|-------------| +| Full org iframe voting/auth embed | Deferred. Cross-origin iframe + auth + vote submission + attribution is not a 3-day PR. Start with copyable HTML badge. | +| Public-figure catalog of 50 hand-curated people | Deferred and reshaped. `isPublicFigure` already exists; 50 is too small to matter and large enough to create defamation/review risk. Build import/review pipeline + 5 pilots later. | +| `/orgs/[slug]` public conversion surface | Rejected. It duplicates `/organizations/[id]`, which already resolves slug. Extend the existing route. | +| Standardize apocalypse framing | Deferred to a real copy plan. It touches many surfaces and user-facing copy; not a trivial grep sweep. | +| Assign-task admin UX | Deferred until security review covers Mermaid SVG injection, `innerHTML`, remote/external images, authz, moderation, and audit behavior. | +| `/court` operational rework | Deferred. Potentially valuable, but not the highest autonomous vote/month channel yet. | +| Printable signs/posters | Deferred. Requires physical-world distribution unless paired with autonomous QR generation and an existing print/distribution channel. | +| Email body min-font-size validation | Deferred. Useful quality guard, but lower vote/month than org badge/search/referral instrumentation. | +| "Remind country leaders" outreach | Filtered out. It requires direct human outreach, against the brief. | + +### Items REQUIRING MIKE OUTREACH (filtered out per his ask) + +- Organization-by-organization coalition outreach +- Press / journalist contact +- Manual public-figure endorsement negotiation +- AEOSP certification rollout that depends on Mike personally recruiting partners +- Country leader reminders without an autonomous sender/channel + +## Risks + +- **Votes/month estimates are still speculative.** They are now honest about the unit, but not causal. Mitigation: Item #5 ships K-factor instrumentation so month 2 ranking uses observed conversion by source. +- **CI speedup can become rationalized tooling.** It stays only because it is tiny, safe if job-level, and unblocks iteration. If it grows past 0.5 dev-days, drop it behind direct vote work. +- **`/treaty?ref=` may conflict with current referral semantics.** Current vote submission distinguishes user `ref` from `organizationSlug`. The org badge PR must define/verify the attribution contract before shipping public HTML. +- **Org badge still needs distribution.** A copyable badge with no install path is just a prettier TODO. That is why Item #4 follows immediately. +- **Org task display can overfetch and bury the vote action.** Keep a light DTO, below-fold placement, and revalidation; the first screen remains treaty vote/referral action. +- **Structured data and `/llms.txt` can become SEO theater.** Include only real, canonical campaign URLs and parameter-backed claims. Do not stuff pages with generic nonprofit copy. +- **Public-figure records are legally and reputationally risky.** Do not claim endorsement without documented public statements. The plan now defers bulk records and starts with an import/review pipeline plus 5 pilots. +- **Apocalypse copy is copy-review gated.** It changes user-facing persuasion copy across many pages and emails. It needs review, screenshots where applicable, and exact changed-copy output before commit. +- **Assign-task surfaces are security-sensitive.** Mermaid rendering currently injects SVG via `innerHTML`, and remote image handling must be controlled before admin task assignment becomes broader. +- **UI/copy rules still apply.** Any touched public UI needs screenshots and Mike screenshot approval before commit; any user-facing copy needs changed-copy review before commit. + +## Files to touch (per item, summary) + +``` +#1 SAFE JOB-LEVEL PATHS-FILTER FOR WEB E2E: + .github/workflows/ci.yml + +#2 LOGIN FORM-STAYS-CLICKABLE: + packages/web/src/components/auth/AuthForm.tsx + packages/web/src/components/auth/AuthForm.test.tsx (new focused duplicate-submit test) + packages/web/e2e/treaty-vote-login.spec.ts (only if browser auth regression coverage is needed) + +#3 COPYABLE ORG TREATY BUTTON/BADGE: + packages/web/src/app/organizations/[id]/page.tsx + packages/web/src/components/organizations/OrganizationCopyField.tsx (reuse; change only if needed) + packages/web/src/lib/site.ts or packages/web/src/lib/routes.ts (only if a shared treaty org URL helper is needed) + packages/web/src/components/treaty/TreatyNameSignatureBox.tsx (only if /treaty ref/org capture is missing) + packages/web/src/app/treaty/page.tsx (only if search-param plumbing is needed) + packages/web/src/components/treaty/TreatyNameSignatureBox.test.tsx (focused attribution tests) + packages/web/src/app/api/referendums/[slug]/vote/route.test.ts (organizationSlug/ref contract) + +#4 EMBED DISTRIBUTION SPEC + SELF-SERVE SURFACE: + .claude/plans/org-embed-distribution.md + packages/web/src/app/organizations/[id]/page.tsx + packages/web/src/app/organizations/page.tsx + packages/web/src/app/sitemap.ts + packages/web/src/lib/organization.server.ts + packages/web/src/lib/routes.ts (only if route metadata/nav review flags change) + +#5 K-FACTOR INSTRUMENTATION: + packages/web/src/lib/analytics.ts + packages/web/src/app/api/share-attempts/route.ts + packages/web/src/lib/referral-redirect.server.ts + packages/web/src/app/api/referendums/[slug]/vote/route.ts + packages/web/src/lib/dashboard.server.ts or existing admin metrics surface + packages/web/src/lib/__tests__/referral-redirect.server.test.ts + packages/web/src/lib/__tests__/referral.server.test.ts + packages/web/src/app/api/share-attempts/route.test.ts (new if API behavior changes) + +#6 LLMS.TXT + STRUCTURED DATA DISTRIBUTION: + packages/web/src/app/llms.txt/route.ts (new) + packages/web/src/lib/site-structured-data.ts + packages/web/src/lib/__tests__/site-structured-data.test.ts + packages/web/src/app/robots.ts (only if advertising llms.txt there) + packages/web/src/app/sitemap.ts (only if canonical URL set changes) + packages/web/src/lib/routes.ts (route metadata source) + +#7 FOUNDATION ACTION TASK KEYS + LIGHT ORG TASKS: + packages/db/src/task-keys.ts + packages/db/src/managed-data/managed-seed-data.ts + packages/db/src/managed-data/sync-managed-tasks.test.ts + packages/web/src/lib/tasks/task-keys.ts (re-export/update if needed) + packages/web/src/lib/organization.server.ts + packages/web/src/app/organizations/[id]/page.tsx + packages/web/src/components/organizations/OrganizationTaskList.tsx (new only if display deserves a component) +``` + +## ALERTS + +- Mike approval needed for the public attribution contract: keep Eng's `/treaty?ref=` suggestion, or use a safer explicit `?org=` and preserve `ref` for user referrals. +- No Prisma schema changes are approved by this plan. +- Do not commit user-facing copy changes from Items #3, #4, #6, or #7 until Mike reviews the changed copy. +- Do not commit UI changes from Items #2, #3, #4, or #7 until screenshots are captured, inspected, and Mike approves or waives screenshot review. +- If Item #1 cannot be kept to job-level filtering with required-check success, drop it rather than weakening CI. + +## Agent log + +- 2026-05-16 - Codex critique round 1 incorporated. Replaced vote-per-PR scoring with votes/month scoring, demoted iframe embed, added missing distribution/K-factor/LLM-search items, removed schema migration for `isPublicFigure`, redirected org work to existing `/organizations/[id]`, and added security/overfetch caveats. + +## Mike approved + +(NOT YET - pending `/autoplan` Phase 4 final gate) + +## Codex critique (round 1) + +### CEO findings + +- **Finding:** Plan scored vote-per-PR instead of vote-per-month. **Disposition: accepted.** V is now expected incremental treaty votes per 30-day month; E is elapsed dev-days; Score is autonomous votes/month per dev-day. +- **Finding:** Autonomy filter measured CEO-energy, not vote-max. **Disposition: partially accepted.** A now measures autonomous distribution. Direct Mike outreach still filters out because the brief explicitly forbids depending on Mike emailing/calling humans. +- **Finding:** Embed widget #1 had no distribution mechanism. **Disposition: accepted.** The plan splits the work into copyable org badge first and embed-distribution spec/self-serve surface immediately after. +- **Finding:** CI speedup was rationalized tooling. **Disposition: accepted.** CI stays only as a 0.5-day safety/throughput item with low direct V; if it expands, it should be dropped behind direct vote work. +- **Finding:** Public-figure 50 seeds is three orders of magnitude too small. **Disposition: accepted.** Bulk manual seeding is deferred; later work is an import/review pipeline with 5 pilot records, then scale. +- **Finding:** Missing top-7 item: `llms.txt` / structured data. **Disposition: accepted.** Added Item #6. +- **Finding:** Missing top-7 item: K-factor instrumentation. **Disposition: accepted.** Added Item #5. +- **Finding:** Missing top-7 item: embed-distribution spec. **Disposition: accepted.** Added Item #4. + +### Codex Eng findings + +- **Finding:** Original #1 embed was under-scoped; cross-origin iframe + voting + auth is not 3 days. Start with copyable button/badge linking to `/treaty?ref=`. **Disposition: accepted.** Item #3 is copyable HTML only; iframe voting/auth is deferred. +- **Finding:** Original #2 CI filter was unsafe; `paths-ignore` can skip regressions. Use job-level `paths-filter`. **Disposition: accepted.** Item #1 explicitly forbids workflow-level `paths-ignore`. +- **Finding:** `isPublicFigure` already exists in Prisma; no schema migration. 50 hand-curated records create defamation risk. Rescope to import pipeline + 5 pilots. **Disposition: accepted.** Public-figure work is deferred and reshaped; no schema change. +- **Finding:** `/orgs/[slug]` would duplicate `/organizations/[id]`. **Disposition: accepted.** All org conversion work extends `/organizations/[id]`, which already accepts slug. +- **Finding:** Org task display has overfetch risk. **Disposition: accepted.** Item #7 requires a light DTO, below-fold display, and revalidation strategy. +- **Finding:** Assign-task security is oversimplified; Mermaid SVG via `innerHTML` and external images are risky. **Disposition: accepted.** Assign-task admin UX is deferred until a security plan handles rendering, image, authz, moderation, and audit risks. +- **Finding:** Task keys belong in `packages/db/src/task-keys.ts`, not seed-data. **Disposition: accepted.** Item #7 adds keys there first, then seed data. +- **Finding:** Apocalypse sweep is not trivial. **Disposition: accepted.** It is deferred to a real copy plan and copy-review gate. +- **Finding:** Recommended order is #2 safe paths-filter -> #7 login bug if embed touches auth -> narrowed #1 copyable button -> defer #5 to pipeline. **Disposition: accepted.** The execution queue starts with safe CI, then login, then narrowed org badge; public figures are deferred to pipeline work. diff --git a/.claude/plans/llms-txt-and-ai-search-defensibility.md b/.claude/plans/llms-txt-and-ai-search-defensibility.md new file mode 100644 index 000000000..1fb2a7927 --- /dev/null +++ b/.claude/plans/llms-txt-and-ai-search-defensibility.md @@ -0,0 +1,333 @@ +# LLMs.txt and AI Search Defensibility + +Slug: `llms-txt-and-ai-search-defensibility` +Branch: `feature/plaintiffs-variant-1-and-copy-hooks` +Date: 2026-05-16 +Author: Codex +Status: APPROVED — Mike said "just do this now and add it to whatever pull request we're on" on 2026-05-16; folding into feature/plaintiffs-variant-1-and-copy-hooks branch + +## Mike approved + +Mike's verbatim approval (2026-05-16): +> "just do this now and add it to whatever pull request we're on. it's not. it's not a big deal. don't make a big whole new pull request for trivia. little stuff like this" + +Scope confirmed: bundle into current branch alongside /treaty fix. No separate PR. + +## Brief + +Build agent-readable campaign infrastructure so AI search engines and browsing agents can answer the core War on Disease questions from canonical `warondisease.org` sources instead of guessing from rendered pages, stale snippets, or social copies. + +The first target questions are: + +- "What is the 1% Treaty?" +- "What is Humanity v Government?" +- "How do I register a plaintiff?" +- "What is the health and wealth math?" + +This is a plan only. Do not implement until autoplan critique is complete and Mike explicitly approves the final plan. + +## Research log + +Queries run: + +- `llms.txt specification llms-full.txt 2026 standard official` +- `Next.js App Router JSON-LD metadata route handlers sitemap docs` +- `schema.org LegalCase FAQPage Petition type JSON-LD` +- `OpenAI GPTBot user agent Anthropic ClaudeBot PerplexityBot user agent docs` +- `Google AI crawler user agents Gemini robots.txt Google-Extended GoogleOther official documentation` + +Current docs checked: + +- `https://llmstxt.org/` - root `/llms.txt` proposal, Markdown format, curated link lists, optional `.md` mirrors, and note that `llms.txt` complements sitemap/robots rather than replacing them. Published 2024-09-03. +- `https://nextjs.org/docs/app/guides/json-ld` - Next recommends native ` - -@@ -916,7 +1240,7 @@ function renderRouteGroup(group) { - */ - function buildRouteContext(group) { - const routeUrl = getRouteUrl(group.routeName); -- const isAuthed = /-auth(\b|$)/.test(group.routeName) || group.routeName.endsWith("-auth"); -+ const isAuthed = isAuthenticatedMarkdownRoute(group.routeName); - const status = group.errored - ? "errored" - : group.changed -@@ -970,52 +1294,124 @@ function escapeJsonForAttr(value) { - - function renderPair(pair) { - const routeUrl = getRouteUrl(pair.routeName); -- return `
--

-+ const markdownDiff = buildMarkdownDiff(pair); -+ // Default: mobile pairs open, desktop pairs collapsed. -+ const isMobile = pair.projectName === "visual-mobile"; -+ const openAttr = isMobile ? " open" : ""; -+ return `
-+ - ${escapeHtml(labelProject(pair.projectName))} - - ${routeUrl ? `Open page` : ""} - ${escapeHtml(pair.diff.label)} - --

--
-- ${renderFigure(pair.before, "Before: main")} -- ${renderFigure(pair.after, "After: pull request")} -- ${pair.diff?.diffRelPath ? renderDiffFigure(pair.diff.diffRelPath, pair.routeName, pair.projectName) : ""} -+ -+
-+ ${renderFigure(pair.before, "Before: main", routeUrl, buildScreenContext(pair, "before", pair.before?.relPath))} -+ ${renderFigure(pair.after, "After: pull request", routeUrl, buildScreenContext(pair, "after", pair.after?.relPath))} -+ ${pair.diff?.diffRelPath ? renderDiffFigure(pair.diff.diffRelPath, pair.routeName, pair.projectName, routeUrl, buildScreenContext(pair, "diff", pair.diff.diffRelPath)) : ""} -+ ${markdownDiff ? renderMarkdownDiffFigure(markdownDiff, routeUrl, buildScreenContext(pair, "markdown-diff", null)) : ""} -
--
`; -+ `; - } - --function renderDiffFigure(diffRelPath, routeName, projectName) { -- return `
--
diff
-+function renderDiffFigure(diffRelPath, routeName, projectName, routeUrl, screenContext) { -+ return `
-+ ${renderFigcaption("diff", routeUrl, screenContext)} - ${escapeHtml(`${routeName} ${projectName} diff overlay`)} -
`; - } - --function renderFigure(screenshot, label) { -+function renderMarkdownDiffFigure(markdownDiff, routeUrl, screenContext) { -+ return `
-+ ${renderFigcaption(markdownDiff.label, routeUrl, screenContext)} -+
${renderMarkdownDiffLines(markdownDiff.lines)}
-+
`; -+} -+ -+function renderFigure(screenshot, label, routeUrl, screenContext) { - if (!screenshot) { - return `
--
${escapeHtml(label)}
-+ ${renderFigcaption(label, routeUrl, screenContext)} -
Not captured
-
`; - } - return `
--
${escapeHtml(label)}
-+ ${renderFigcaption(label, routeUrl, screenContext)} - ${escapeHtml(`${screenshot.routeName} ${screenshot.projectName} ${label}`)} -
`; - } - --function analyzeGroups(groups) { -- return groups.map((group) => { -- const pairs = group.pairs.map((pair) => ({ -- ...pair, -- diff: comparePair(pair), -- })); -+// Figcaption with optional preview-page link (↗) and copy-context button -+// (📋) on the LEFT of the screen-name label. Sticky on mobile so it stays -+// visible while you swipe-scroll within a tall card. The copy button -+// gives reviewers a per-screen payload to paste into a coding agent. -+function renderFigcaption(label, routeUrl, screenContext) { -+ let inner = ""; -+ if (routeUrl) { -+ inner += ``; -+ } -+ if (screenContext) { -+ const json = JSON.stringify(screenContext); -+ const jsonAttr = escapeJsonForAttr(json); -+ inner += ``; -+ if (screenContext.repo) { -+ inner += ``; -+ } -+ } -+ inner += escapeHtml(label); -+ return `
${inner}
`; -+} -+ -+/** -+ * Build the per-screen "Copy context" payload — what a reviewer pastes -+ * into a coding agent when complaining about ONE specific view (diff / -+ * before / after) of ONE specific pair (project × route). Narrower than -+ * buildRouteContext, which covers the whole route group across projects. -+ */ -+function buildScreenContext(pair, viewing, relPath) { -+ const routeUrl = getRouteUrl(pair.routeName); -+ const isAuthed = isAuthenticatedMarkdownRoute(pair.routeName); -+ const sha = reviewCommitSha ? shortSha(reviewCommitSha) : null; -+ const reviewBase = -+ prNumber && sha -+ ? `https://mikepsinn.github.io/optimitron/pr-${prNumber}/${sha}` -+ : null; -+ const imageUrl = relPath && reviewBase ? `${reviewBase}/${relPath}` : null; -+ return { -+ pr: prNumber, -+ branch: headBranch, -+ repo: repoSlug, -+ commitSha: reviewCommitSha, -+ shortSha: sha, -+ route: pair.routeName, -+ routeLabel: labelRoute(pair.routeName), -+ routeUrl, -+ authState: isAuthed ? "authenticated" : "logged-out", -+ project: pair.projectName, -+ projectLabel: labelProject(pair.projectName), -+ viewing, -+ diffLabel: pair.diff?.label, -+ imageUrl, -+ reviewUrl: reviewBase -+ ? `${reviewBase}/latest.html#route-${slugifyForAnchor(pair.routeName)}` -+ : null, -+ }; -+} -+ -+async function analyzeGroups(groups) { -+ const analyzed = []; -+ for (const group of groups) { -+ const pairs = await Promise.all( -+ group.pairs.map(async (pair) => ({ -+ ...pair, -+ diff: await comparePair(pair), -+ })), -+ ); - const changedPairs = pairs.filter((pair) => pair.diff.changed).length; - const missingPairs = pairs.filter((pair) => pair.diff.missing).length; - const erroredPairs = pairs.filter((pair) => pair.diff.errored).length; -- return { -+ analyzed.push({ - ...group, - changed: changedPairs > 0, - changedPairs, -@@ -1023,11 +1419,28 @@ function analyzeGroups(groups) { - erroredPairs, - missingPairs, - pairs, -- }; -- }); -+ }); -+ } -+ return analyzed; - } - --function comparePair(pair) { -+function loadImageDiffDependencies() { -+ if (!imageDiffDependenciesPromise) { -+ imageDiffDependenciesPromise = Promise.all([ -+ import("pixelmatch"), -+ import("pngjs"), -+ ]).then(([pixelmatchModule, pngjsModule]) => { -+ const pngjs = pngjsModule.default ?? pngjsModule; -+ return { -+ PNG: pngjs.PNG, -+ pixelmatch: pixelmatchModule.default ?? pixelmatchModule, -+ }; -+ }); -+ } -+ return imageDiffDependenciesPromise; -+} -+ -+async function comparePair(pair) { - if (!pair.before && pair.after) { - return { - changed: true, -@@ -1054,6 +1467,7 @@ function comparePair(pair) { - } - - try { -+ const { PNG, pixelmatch } = await loadImageDiffDependencies(); - const before = PNG.sync.read(readFileSync(pair.before.assetPath)); - const after = PNG.sync.read(readFileSync(pair.after.assetPath)); - if (before.width !== after.width || before.height !== after.height) { -@@ -1107,6 +1521,267 @@ function comparePair(pair) { - } - } - -+function buildMarkdownDiff(pair) { -+ const snapshot = getMarkdownSnapshot(pair.routeName); -+ if (!snapshot) { -+ return null; -+ } -+ -+ if (markdownDiffCache.has(snapshot.repoRelativePath)) { -+ return markdownDiffCache.get(snapshot.repoRelativePath); -+ } -+ -+ const workingPath = path.join(repoRoot, snapshot.repoRelativePath); -+ if (!existsSync(workingPath)) { -+ markdownDiffCache.set(snapshot.repoRelativePath, null); -+ return null; -+ } -+ -+ const before = readMainFile(snapshot.repoRelativePath); -+ if (before === null) { -+ markdownDiffCache.set(snapshot.repoRelativePath, null); -+ return null; -+ } -+ -+ const after = readFileSync(workingPath, "utf8"); -+ const diff = { -+ fileName: snapshot.fileName, -+ label: `Text diff: ${snapshot.fileName}`, -+ lines: buildUnifiedMarkdownDiffLines(before, after, snapshot.repoRelativePath), -+ repoRelativePath: snapshot.repoRelativePath, -+ }; -+ markdownDiffCache.set(snapshot.repoRelativePath, diff); -+ return diff; -+} -+ -+function getMarkdownSnapshot(routeName) { -+ const routePath = routePaths.get(routeName); -+ if (!routePath) { -+ return null; -+ } -+ -+ const fileName = isAuthenticatedMarkdownRoute(routeName) -+ ? "page.logged-in.md" -+ : "page.logged-out.md"; -+ const pathname = routePath.split(/[?#]/, 1)[0] ?? "/"; -+ const segments = pathname === "/" ? [] : pathname.split("/").filter(Boolean); -+ const repoRelativePath = toPosix( -+ path.join("packages", "web", "src", "app", ...segments, fileName), -+ ); -+ return { -+ fileName, -+ repoRelativePath, -+ }; -+} -+ -+function isAuthenticatedMarkdownRoute(routeName) { -+ return ( -+ authenticatedSnapshotRouteNames.has(routeName) || -+ /-auth(\b|$)/.test(routeName) || -+ routeName.endsWith("-auth") -+ ); -+} -+ -+function readMainFile(repoRelativePath) { -+ try { -+ return execFileSync("git", ["show", `main:${repoRelativePath}`], { -+ cwd: repoRoot, -+ encoding: "utf8", -+ stdio: ["ignore", "pipe", "ignore"], -+ }); -+ } catch { -+ return null; -+ } -+} -+ -+function buildUnifiedMarkdownDiffLines(before, after, repoRelativePath) { -+ const beforeLines = splitDiffLines(before); -+ const afterLines = splitDiffLines(after); -+ const ops = diffLineOps(beforeLines, afterLines); -+ const rows = buildDiffRows(ops); -+ const lines = [ -+ { kind: "header", text: `--- main/${repoRelativePath}` }, -+ { kind: "header", text: `+++ working-tree/${repoRelativePath}` }, -+ ]; -+ const changeIndexes = rows -+ .map((row, index) => (row.kind === "equal" ? -1 : index)) -+ .filter((index) => index >= 0); -+ -+ if (changeIndexes.length === 0) { -+ lines.push({ kind: "context", text: " No text changes." }); -+ return lines; -+ } -+ -+ for (const hunk of buildUnifiedHunks(rows, changeIndexes)) { -+ lines.push({ -+ kind: "hunk", -+ text: `@@ -${formatUnifiedRange(hunk.oldStart, hunk.oldCount)} +${formatUnifiedRange(hunk.newStart, hunk.newCount)} @@`, -+ }); -+ for (const row of hunk.rows) { -+ if (row.kind === "add") { -+ lines.push({ kind: "added", text: `+${row.text}` }); -+ } else if (row.kind === "remove") { -+ lines.push({ kind: "removed", text: `-${row.text}` }); -+ } else { -+ lines.push({ kind: "context", text: ` ${row.text}` }); -+ } -+ } -+ } -+ -+ return lines; -+} -+ -+function splitDiffLines(value) { -+ const normalized = String(value).replace(/\r\n/g, "\n").replace(/\r/g, "\n"); -+ if (normalized.length === 0) { -+ return []; -+ } -+ return normalized.endsWith("\n") -+ ? normalized.slice(0, -1).split("\n") -+ : normalized.split("\n"); -+} -+ -+function diffLineOps(beforeLines, afterLines) { -+ const oldLength = beforeLines.length; -+ const newLength = afterLines.length; -+ const width = newLength + 1; -+ const lcs = new Uint32Array((oldLength + 1) * width); -+ -+ for (let i = oldLength - 1; i >= 0; i -= 1) { -+ for (let j = newLength - 1; j >= 0; j -= 1) { -+ const index = i * width + j; -+ if (beforeLines[i] === afterLines[j]) { -+ lcs[index] = lcs[(i + 1) * width + j + 1] + 1; -+ } else { -+ lcs[index] = Math.max(lcs[(i + 1) * width + j], lcs[i * width + j + 1]); -+ } -+ } -+ } -+ -+ const ops = []; -+ let oldIndex = 0; -+ let newIndex = 0; -+ while (oldIndex < oldLength && newIndex < newLength) { -+ if (beforeLines[oldIndex] === afterLines[newIndex]) { -+ ops.push({ kind: "equal", text: beforeLines[oldIndex] }); -+ oldIndex += 1; -+ newIndex += 1; -+ } else if ( -+ lcs[(oldIndex + 1) * width + newIndex] >= -+ lcs[oldIndex * width + newIndex + 1] -+ ) { -+ ops.push({ kind: "remove", text: beforeLines[oldIndex] }); -+ oldIndex += 1; -+ } else { -+ ops.push({ kind: "add", text: afterLines[newIndex] }); -+ newIndex += 1; -+ } -+ } -+ -+ while (oldIndex < oldLength) { -+ ops.push({ kind: "remove", text: beforeLines[oldIndex] }); -+ oldIndex += 1; -+ } -+ while (newIndex < newLength) { -+ ops.push({ kind: "add", text: afterLines[newIndex] }); -+ newIndex += 1; -+ } -+ -+ return ops; -+} -+ -+function buildDiffRows(ops) { -+ const rows = []; -+ let oldLine = 1; -+ let newLine = 1; -+ for (const op of ops) { -+ const row = { -+ ...op, -+ newLine: op.kind === "remove" ? null : newLine, -+ newLineBefore: newLine, -+ oldLine: op.kind === "add" ? null : oldLine, -+ oldLineBefore: oldLine, -+ }; -+ rows.push(row); -+ if (op.kind !== "add") { -+ oldLine += 1; -+ } -+ if (op.kind !== "remove") { -+ newLine += 1; -+ } -+ } -+ return rows; -+} -+ -+function buildUnifiedHunks(rows, changeIndexes, contextLineCount = 3) { -+ const hunks = []; -+ let changeCursor = 0; -+ while (changeCursor < changeIndexes.length) { -+ let start = Math.max(0, changeIndexes[changeCursor] - contextLineCount); -+ let end = Math.min( -+ rows.length - 1, -+ changeIndexes[changeCursor] + contextLineCount, -+ ); -+ changeCursor += 1; -+ -+ while ( -+ changeCursor < changeIndexes.length && -+ changeIndexes[changeCursor] <= end + contextLineCount + 1 -+ ) { -+ end = Math.min( -+ rows.length - 1, -+ changeIndexes[changeCursor] + contextLineCount, -+ ); -+ changeCursor += 1; -+ } -+ -+ const hunkRows = rows.slice(start, end + 1); -+ hunks.push({ -+ newCount: hunkRows.filter((row) => row.kind !== "remove").length, -+ newStart: getHunkStart(hunkRows, "new"), -+ oldCount: hunkRows.filter((row) => row.kind !== "add").length, -+ oldStart: getHunkStart(hunkRows, "old"), -+ rows: hunkRows, -+ }); -+ } -+ return hunks; -+} -+ -+function getHunkStart(rows, side) { -+ const lineKey = side === "old" ? "oldLine" : "newLine"; -+ const beforeKey = side === "old" ? "oldLineBefore" : "newLineBefore"; -+ const firstLine = rows.find((row) => row[lineKey] !== null)?.[lineKey]; -+ if (typeof firstLine === "number") { -+ return firstLine; -+ } -+ const before = rows[0]?.[beforeKey] ?? 1; -+ return Math.max(0, before - 1); -+} -+ -+function formatUnifiedRange(start, count) { -+ if (count === 1) { -+ return String(start); -+ } -+ return `${start},${count}`; -+} -+ -+function renderMarkdownDiffLines(lines) { -+ return lines -+ .map((line) => { -+ const className = line.kind === "added" -+ ? "added" -+ : line.kind === "removed" -+ ? "removed" -+ : line.kind === "hunk" -+ ? "hunk" -+ : line.kind === "header" -+ ? "header" -+ : "context"; -+ return `${escapeHtml(line.text)}`; -+ }) -+ .join(""); -+} -+ - function buildDiffFileName(fileName) { - const baseName = path.basename(fileName, ".png").replace(/-(before|after)$/i, ""); - return `${baseName}-diff.png`; -diff --git a/packages/web/scripts/copy-preview-smart.mjs b/packages/web/scripts/copy-preview-smart.mjs -new file mode 100644 -index 000000000..90eb9d91e ---- /dev/null -+++ b/packages/web/scripts/copy-preview-smart.mjs -@@ -0,0 +1,87 @@ -+#!/usr/bin/env node -+/** -+ * copy-preview-smart.mjs -+ * -+ * Default wrapper for `pnpm copy:preview`. Runs `affected-routes.mjs` -+ * against the working-tree diff (staged + unstaged vs HEAD), builds -+ * the `--routes=...` arg, and invokes the underlying renderer for -+ * only the affected pages. Falls through to full regen when: -+ * -+ * - the affected-routes index returns nothing (shared helper / -+ * barrel / global CSS change — the static import walker can't see -+ * it), OR -+ * - the user passes `--all` (escape hatch for parity with CI's -+ * full drift check), OR -+ * - the user passes their own `--routes=...` (explicit override). -+ * -+ * The non-smart full regen still exists as `pnpm copy:preview:all` -+ * for CI / initial generation. CLAUDE.md says never hand-edit the -+ * .md snapshots — run this script. -+ */ -+ -+import { execFileSync, spawnSync } from "node:child_process"; -+import path from "node:path"; -+import { fileURLToPath } from "node:url"; -+ -+const __dirname = path.dirname(fileURLToPath(import.meta.url)); -+const SCRIPTS_DIR = __dirname; -+const RENDER_SCRIPT = path.join(SCRIPTS_DIR, "render-pages-to-markdown.ts"); -+const AFFECTED_SCRIPT = path.join(SCRIPTS_DIR, "affected-routes.mjs"); -+ -+const userArgs = process.argv.slice(2); -+const passthrough = []; -+let mode = "smart"; -+let explicitRoutes = null; -+ -+for (const arg of userArgs) { -+ if (arg === "--all") { -+ mode = "all"; -+ } else if (arg.startsWith("--routes=")) { -+ explicitRoutes = arg.slice("--routes=".length); -+ mode = "explicit"; -+ } else { -+ passthrough.push(arg); -+ } -+} -+ -+function runRenderer(extraArgs) { -+ const result = spawnSync( -+ "pnpm", -+ ["exec", "tsx", RENDER_SCRIPT, ...extraArgs, ...passthrough], -+ { stdio: "inherit", shell: process.platform === "win32" }, -+ ); -+ process.exit(result.status ?? 1); -+} -+ -+if (mode === "all") { -+ console.log("[copy:preview] --all → regenerating every route."); -+ runRenderer([]); -+} -+ -+if (mode === "explicit") { -+ console.log(`[copy:preview] explicit routes: ${explicitRoutes}`); -+ runRenderer([`--routes=${explicitRoutes}`]); -+} -+ -+// Smart mode: ask affected-routes.mjs which pages changed. -+let detected = ""; -+try { -+ detected = execFileSync("node", [AFFECTED_SCRIPT], { -+ encoding: "utf8", -+ stdio: ["ignore", "pipe", "inherit"], -+ }).trim(); -+} catch (error) { -+ console.error("[copy:preview] affected-routes detection failed:", error.message); -+ console.error("[copy:preview] Falling back to full regen."); -+ runRenderer([]); -+} -+ -+if (!detected) { -+ console.log( -+ "[copy:preview] No affected routes from static import walk (shared helper / CSS / barrel change?). Falling back to full regen.", -+ ); -+ runRenderer([]); -+} -+ -+console.log(`[copy:preview] affected routes: ${detected}`); -+runRenderer([`--routes=${detected}`]); -diff --git a/packages/web/scripts/render-pages-to-markdown.ts b/packages/web/scripts/render-pages-to-markdown.ts -index 4772e7b57..6691046c9 100644 ---- a/packages/web/scripts/render-pages-to-markdown.ts -+++ b/packages/web/scripts/render-pages-to-markdown.ts -@@ -254,8 +254,18 @@ async function extractPage( - return text.replace(/\b\p{L}/gu, (c) => c.toUpperCase()); - return text; - }; -+ const getMarkdownHref = (el: Element): string => -+ el.getAttribute("href") ?? -+ el.getAttribute("data-copy-preview-href") ?? -+ ""; -+ const withMarkdownLink = (el: Element, inner: string): string => { -+ const href = getMarkdownHref(el); -+ return href && inner ? `[${inner}](${href})` : inner; -+ }; - // Walk an element's descendants and produce markdown that preserves -- // hyperlinks as [text](href). Non-anchor descendants flatten to text. -+ // hyperlinks as [text](href). ParameterValue buttons/spans expose a -+ // data-copy-preview-href so source-backed values keep their source in -+ // page.logged-out.md even though the live UI opens a details dialog. - // Arrow consts (not function declarations) so tsx doesn't inject - // __name() calls that won't resolve in the browser context. - // Walk `el`'s children producing markdown. `allowHidden`=true bypasses the -@@ -287,15 +297,14 @@ async function extractPage( - } else if (node.nodeType === 1 /* ELEMENT_NODE */) { - const child = node as Element; - if (!allowHidden && isHiddenForRender(child)) continue; -- if (child.tagName === "A") { -- const href = child.getAttribute("href") ?? ""; -+ if (child.tagName === "A" || child.hasAttribute("data-copy-preview-href")) { - let inner = toMarkdown(child, allowHidden).replace(/\s+/g, " ").trim(); - // sr-only-only Link: fall back to unfiltered inner so the accessible - // name still ships in the snapshot. - if (!inner && child.children.length > 0) { - inner = toMarkdown(child, true).replace(/\s+/g, " ").trim(); - } -- appendFragment(href && inner ? `[${inner}](${href})` : inner); -+ appendFragment(withMarkdownLink(child, inner)); - } else { - appendFragment(toMarkdown(child, allowHidden)); - } -@@ -379,13 +388,12 @@ async function extractPage( - } else if (tag === "pre") { - const text = (el as HTMLElement).innerText.trim(); - md = text ? `\`\`\`text\n${text}\n\`\`\`` : ""; -- } else if (tag === "a") { -- const href = el.getAttribute("href") ?? ""; -+ } else if (tag === "a" || el.hasAttribute("data-copy-preview-href")) { - let inner = toMarkdown(el).replace(/\s+/g, " ").trim(); - if (!inner && el.children.length > 0) { - inner = toMarkdown(el, true).replace(/\s+/g, " ").trim(); - } -- md = href && inner ? `[${inner}](${href})` : inner; -+ md = withMarkdownLink(el, inner); - } else { - md = toMarkdown(el).replace(/\s+/g, " ").trim(); - } -diff --git a/packages/web/scripts/run-playwright.mjs b/packages/web/scripts/run-playwright.mjs -index 454c4f9df..26072d4c4 100644 ---- a/packages/web/scripts/run-playwright.mjs -+++ b/packages/web/scripts/run-playwright.mjs -@@ -111,9 +111,9 @@ async function main() { - } - - if (mode === "visual") { -- env.ARGOS_VISUAL = "1"; -+ env.ROUTE_VISUAL_REVIEW = "1"; - } else { -- delete env.ARGOS_VISUAL; -+ delete env.ROUTE_VISUAL_REVIEW; - } - - const playwrightArgs = ["test", ...MODE_SPECS[mode], ...appendDefaultProjectArg(passthroughArgs, mode)]; -@@ -277,13 +277,13 @@ Modes: - Regenerate the cross-variant new-user funnel screenshots - treaty-screenshots - Regenerate the treaty vote/post-vote screenshots -- visual Capture curated route screenshots for Argos visual PR review -+ visual Capture curated route screenshots for visual PR review - - Behavior: - - In CI, uses the Playwright-managed built server path - - Locally, reuses BASE_URL or a running server on ${DEFAULT_BASE_URL} when available - - Locally, new-user-flow-screenshots requires a running dev server unless E2E_ALLOW_PRODUCTION_FALLBACK=1 is set - - If no local server is running, falls back to an existing production build -- - visual runs desktop and mobile projects and enables the Argos reporter -+ - visual runs desktop and mobile projects and writes visual review screenshots - `); - } -diff --git a/packages/web/scripts/smoke-deploy.mjs b/packages/web/scripts/smoke-deploy.mjs -new file mode 100644 -index 000000000..f992e111e ---- /dev/null -+++ b/packages/web/scripts/smoke-deploy.mjs -@@ -0,0 +1,570 @@ -+#!/usr/bin/env node -+ -+import { appendFile, mkdir, writeFile } from "node:fs/promises"; -+import { dirname } from "node:path"; -+ -+const ATTEMPTS = 3; -+const BACKOFF_MS = 5000; -+const REQUEST_TIMEOUT_MS = Number( -+ process.env.SMOKE_DEPLOY_REQUEST_TIMEOUT_MS ?? 5000, -+); -+ -+// Route paths mirror ROUTES in packages/web/src/lib/routes.ts. Expected h1s -+// use route metadata where the nav label is the page heading; otherwise they -+// use the existing page/component h1 text. -+const ROUTES_TO_SMOKE = [ -+ { -+ path: "/", -+ expectedH1: "Please Take 30 Seconds to End War and Disease", -+ source: "TreatyVoteFlow default headline", -+ }, -+ { -+ path: "/treaty", -+ expectedH1: "Please quickly skim and sign to end war and disease.", -+ source: "treaty page heading", -+ }, -+ { -+ path: "/plaintiffs", -+ expectedH1: "Register plaintiffs for Humanity v Government.", -+ source: "plaintiffs page heading", -+ }, -+ { -+ path: "/tasks", -+ expectedH1: "Earth Optimization Tasks", -+ source: "tasksLink label", -+ }, -+ { -+ path: "/humanity-v-government", -+ expectedH1: "Humanity v. Governments of Earth", -+ source: "humanityVGovernmentLink label", -+ }, -+ { -+ path: "/employees", -+ expectedH1: "President Management System", -+ source: "employees page heading", -+ }, -+ { -+ path: "/court", -+ // /court renders via ReferendumStepperPage, whose primary heading -+ // is the referendum's `question` field from the DB (canonical text -+ // in packages/data/src/referendums/court-of-humanity.ts). The page -+ // title "Court of Humanity" is metadata, not a body heading. -+ expectedH1: -+ "If a government kills, injures, or harms you or your family, should you have the same right to sue it that you would have if a corporation did the same?", -+ source: "court-of-humanity referendum question", -+ }, -+ { -+ path: "/people", -+ expectedH1: "Find the human who should do something.", -+ source: "people page heading", -+ }, -+]; -+ -+const ERROR_MARKERS = [ -+ "Something went wrong", -+ "Something went wrong!", -+ "Something went wrong. Please try again.", -+ "Application error", -+ "Application error: a client-side exception has occurred", -+ "Application error: a server-side exception has occurred", -+ "client-side exception", -+ "server-side exception", -+ "An error occurred", -+ "An error occurred in the Server Components render", -+ "Internal Server Error", -+ "500: INTERNAL_SERVER_ERROR", -+ "Unhandled Runtime Error", -+ "Runtime Error", -+ "Minified React error #", -+ "Hydration failed because the server rendered HTML didn't match the client", -+ "There was an error while hydrating", -+ "A tree hydrated but some attributes of the server rendered HTML didn't match", -+ "Switched to client rendering because the server rendering errored", -+ // "404: This page could not be found" is the specific Next.js 404 -+ // title. Do NOT add bare "Page Not Found" — Next.js App Router -+ // bundles the 404 page's text inline in the RSC payload script of -+ // EVERY successful page (so client-side navigation can render 404s -+ // without a round trip), which would false-positive on every route. -+ "404: This page could not be found", -+ "This Serverless Function has crashed", -+ "FUNCTION_INVOCATION_FAILED", -+ "EDGE_FUNCTION_INVOCATION_FAILED", -+ "MIDDLEWARE_INVOCATION_FAILED", -+ "NO_RESPONSE_FROM_FUNCTION", -+ "DEPLOYMENT_NOT_FOUND", -+ "This deployment is protected", -+ "Vercel Authentication", -+ "Authentication Required", -+ "PrismaClient", -+ "PrismaClientKnownRequestError", -+]; -+ -+async function main() { -+ const startedAt = new Date(); -+ const target = resolveTarget(); -+ const bypassSecret = (process.env.VERCEL_AUTOMATION_BYPASS_SECRET ?? "").trim(); -+ -+ if (target.environment === "Preview" && !bypassSecret) { -+ // Fail loud. The previous skip-with-warning was an escape hatch -+ // that silently masked smoke for ~24 hours because the secret -+ // wasn't set. The secret is retrievable in one curl + jq + -+ // gh CLI command; missing-secret is an operator config bug, -+ // not an acceptable runtime state. See -+ // memory/feedback_default_opinionated_no_escape_hatches.md. -+ console.error( -+ "[smoke-deploy] FAIL: VERCEL_AUTOMATION_BYPASS_SECRET is not set in the GitHub Preview environment.", -+ ); -+ console.error( -+ "[smoke-deploy] Retrieve and set in one command:", -+ ); -+ console.error( -+ "[smoke-deploy] curl -H \"Authorization: Bearer $VERCEL_TOKEN\" \\", -+ ); -+ console.error( -+ "[smoke-deploy] \"https://api.vercel.com/v9/projects/$VERCEL_PROJECT_ID?teamId=$VERCEL_ORG_ID\" \\", -+ ); -+ console.error( -+ "[smoke-deploy] | jq -r '.protectionBypass | keys[0]' \\", -+ ); -+ console.error( -+ "[smoke-deploy] | gh secret set VERCEL_AUTOMATION_BYPASS_SECRET --env Preview", -+ ); -+ // Write a failure summary so the downstream "Comment on preview -+ // failure" / "Post production failure to Slack" steps in -+ // smoke-deploy.yml can still read SMOKE_DEPLOY_RESULT_FILE and -+ // format their messages. Without this, those steps crash with -+ // ENOENT and the PR comment never lands. -+ const failureSummary = { -+ success: false, -+ skipped: false, -+ reason: "VERCEL_AUTOMATION_BYPASS_SECRET not configured", -+ environment: target.environment, -+ targetUrl: target.baseUrl.href, -+ startedAt: startedAt.toISOString(), -+ durationMs: 0, -+ routes: [], -+ failures: [ -+ { -+ path: "(setup)", -+ status: null, -+ error: -+ "VERCEL_AUTOMATION_BYPASS_SECRET missing from GitHub Preview environment. Run: curl -H \"Authorization: Bearer $VERCEL_TOKEN\" \"https://api.vercel.com/v9/projects/$VERCEL_PROJECT_ID?teamId=$VERCEL_ORG_ID\" | jq -r '.protectionBypass | keys[0]' | gh secret set VERCEL_AUTOMATION_BYPASS_SECRET --env Preview", -+ matchedErrorMarker: null, -+ }, -+ ], -+ }; -+ await writeResult(failureSummary); -+ await writeStepSummary(failureSummary); -+ process.exit(1); -+ } -+ -+ console.log( -+ `Smoke testing ${target.environment} deployment ${target.baseUrl.href}`, -+ ); -+ -+ const routeResults = await Promise.all( -+ ROUTES_TO_SMOKE.map((route) => -+ smokeRoute({ route, target, bypassSecret }), -+ ), -+ ); -+ const durationMs = Date.now() - startedAt.getTime(); -+ const failures = routeResults.filter((result) => !result.ok); -+ const summary = { -+ success: failures.length === 0, -+ environment: target.environment, -+ targetUrl: target.baseUrl.href, -+ startedAt: startedAt.toISOString(), -+ durationMs, -+ routes: routeResults, -+ failures, -+ }; -+ -+ await writeResult(summary); -+ await writeStepSummary(summary); -+ -+ for (const result of routeResults) { -+ const label = result.ok ? "PASS" : "FAIL"; -+ const status = result.status ? `HTTP ${result.status}` : "no response"; -+ console.log( -+ `${label} ${result.path} ${status} ${result.durationMs}ms after ${result.attempts.length} attempt(s)`, -+ ); -+ } -+ -+ if (failures.length > 0) { -+ console.error( -+ `Deploy smoke failed for ${failures.length} of ${routeResults.length} route(s).`, -+ ); -+ process.exitCode = 1; -+ return; -+ } -+ -+ console.log( -+ `Deploy smoke passed for ${routeResults.length} route(s) in ${durationMs}ms.`, -+ ); -+} -+ -+async function smokeRoute({ route, target, bypassSecret }) { -+ const url = new URL(route.path, target.baseUrl); -+ const attempts = []; -+ const startedAt = Date.now(); -+ -+ for (let attempt = 1; attempt <= ATTEMPTS; attempt += 1) { -+ const attemptResult = await fetchAndAssert({ -+ route, -+ url, -+ bypassSecret, -+ attempt, -+ }); -+ attempts.push(attemptResult); -+ -+ if (attemptResult.ok) { -+ return summarizeRouteResult({ -+ route, -+ url, -+ startedAt, -+ attempts, -+ finalAttempt: attemptResult, -+ }); -+ } -+ -+ if (attempt < ATTEMPTS) { -+ await sleep(BACKOFF_MS); -+ } -+ } -+ -+ return summarizeRouteResult({ -+ route, -+ url, -+ startedAt, -+ attempts, -+ finalAttempt: attempts.at(-1), -+ }); -+} -+ -+async function fetchAndAssert({ route, url, bypassSecret, attempt }) { -+ const controller = new AbortController(); -+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); -+ const attemptStartedAt = Date.now(); -+ const headers = { -+ accept: "text/html,application/xhtml+xml", -+ "user-agent": "optimitron-deploy-smoke/1.0", -+ }; -+ -+ if (bypassSecret) { -+ headers["x-vercel-protection-bypass"] = bypassSecret; -+ } -+ -+ try { -+ const response = await fetch(url, { -+ cache: "no-store", -+ headers, -+ redirect: "follow", -+ signal: controller.signal, -+ }); -+ const body = await response.text(); -+ const h1Texts = extractH1Texts(body); -+ const matchedErrorMarker = findErrorMarker(body); -+ const normalizedExpectedH1 = normalizeText(route.expectedH1); -+ const hasExpectedH1 = h1Texts.some( -+ (text) => normalizeText(text) === normalizedExpectedH1, -+ ); -+ const statusOk = response.status === 200; -+ const ok = statusOk && !matchedErrorMarker && hasExpectedH1; -+ -+ return { -+ ok, -+ attempt, -+ durationMs: Date.now() - attemptStartedAt, -+ status: response.status, -+ finalUrl: response.url, -+ expectedH1: route.expectedH1, -+ h1Texts, -+ missingExpectedH1: !hasExpectedH1, -+ matchedErrorMarker, -+ error: ok -+ ? null -+ : describeFailure({ -+ status: response.status, -+ statusOk, -+ matchedErrorMarker, -+ hasExpectedH1, -+ expectedH1: route.expectedH1, -+ h1Texts, -+ }), -+ }; -+ } catch (error) { -+ return { -+ ok: false, -+ attempt, -+ durationMs: Date.now() - attemptStartedAt, -+ status: null, -+ finalUrl: url.href, -+ expectedH1: route.expectedH1, -+ h1Texts: [], -+ missingExpectedH1: true, -+ matchedErrorMarker: null, -+ error: formatFetchError(error), -+ }; -+ } finally { -+ clearTimeout(timeout); -+ } -+} -+ -+function summarizeRouteResult({ route, url, startedAt, attempts, finalAttempt }) { -+ return { -+ path: route.path, -+ url: url.href, -+ source: route.source, -+ ok: Boolean(finalAttempt?.ok), -+ status: finalAttempt?.status ?? null, -+ finalUrl: finalAttempt?.finalUrl ?? url.href, -+ expectedH1: route.expectedH1, -+ h1Texts: finalAttempt?.h1Texts ?? [], -+ missingExpectedH1: finalAttempt?.missingExpectedH1 ?? true, -+ matchedErrorMarker: finalAttempt?.matchedErrorMarker ?? null, -+ error: finalAttempt?.error ?? "No attempt result recorded.", -+ durationMs: Date.now() - startedAt, -+ attempts, -+ }; -+} -+ -+function resolveTarget() { -+ const previewUrl = (process.env.PREVIEW_URL ?? "").trim(); -+ const prodUrl = (process.env.PROD_URL ?? "").trim(); -+ -+ if (previewUrl && prodUrl) { -+ throw new Error("Set PREVIEW_URL or PROD_URL, not both."); -+ } -+ -+ if (!previewUrl && !prodUrl) { -+ throw new Error("Set PREVIEW_URL or PROD_URL before running deploy smoke."); -+ } -+ -+ const environment = previewUrl ? "Preview" : "Production"; -+ const rawUrl = previewUrl || prodUrl; -+ let baseUrl; -+ try { -+ baseUrl = new URL(rawUrl); -+ } catch { -+ throw new Error(`${environment} URL is not a valid URL: ${rawUrl}`); -+ } -+ -+ if (baseUrl.protocol !== "http:" && baseUrl.protocol !== "https:") { -+ throw new Error(`${environment} URL must start with http:// or https://.`); -+ } -+ -+ if (!baseUrl.pathname.endsWith("/")) { -+ baseUrl.pathname = `${baseUrl.pathname}/`; -+ } -+ -+ return { environment, baseUrl }; -+} -+ -+function extractH1Texts(html) { -+ // Match any top-level heading (h1-h6), not just h1. Several pages -+ // use h2 as the primary heading (e.g. /treaty's "Please quickly -+ // skim..."). Smoke verifies the expected text appears as a -+ // heading, not specifically at level 1; semantic-heading-level -+ // is a separate a11y concern. -+ const headingTexts = []; -+ const headingPattern = /]*>([\s\S]*?)<\/h[1-6]>/giu; -+ let match; -+ -+ while ((match = headingPattern.exec(html))) { -+ const text = htmlToText(match[1]); -+ if (text) { -+ headingTexts.push(text); -+ } -+ } -+ -+ return headingTexts; -+} -+ -+function htmlToText(html) { -+ return normalizeText( -+ decodeHtmlEntities( -+ html -+ .replace(/]*>[\s\S]*?<\/script>/giu, " ") -+ .replace(/]*>[\s\S]*?<\/style>/giu, " ") -+ .replace(/<[^>]+>/gu, " "), -+ ), -+ ); -+} -+ -+function normalizeText(value) { -+ return String(value).replace(/\s+/gu, " ").trim(); -+} -+ -+function decodeHtmlEntities(value) { -+ return value -+ .replace(/&(#x?[0-9a-f]+|[a-z]+);/giu, (entity, token) => { -+ const lower = token.toLowerCase(); -+ if (lower.startsWith("#x")) { -+ return codePointToString(Number.parseInt(lower.slice(2), 16), entity); -+ } -+ if (lower.startsWith("#")) { -+ return codePointToString(Number.parseInt(lower.slice(1), 10), entity); -+ } -+ return ( -+ { -+ amp: "&", -+ apos: "'", -+ gt: ">", -+ lt: "<", -+ nbsp: " ", -+ quot: '"', -+ }[lower] ?? entity -+ ); -+ }) -+ .replace(/\u00a0/gu, " "); -+} -+ -+function codePointToString(codePoint, fallback) { -+ if (!Number.isFinite(codePoint)) { -+ return fallback; -+ } -+ try { -+ return String.fromCodePoint(codePoint); -+ } catch { -+ return fallback; -+ } -+} -+ -+function findErrorMarker(body) { -+ const lowerBody = body.toLowerCase(); -+ return ( -+ ERROR_MARKERS.find((marker) => -+ lowerBody.includes(marker.toLowerCase()), -+ ) ?? null -+ ); -+} -+ -+function describeFailure({ -+ status, -+ statusOk, -+ matchedErrorMarker, -+ hasExpectedH1, -+ expectedH1, -+ h1Texts, -+}) { -+ const reasons = []; -+ if (!statusOk) { -+ reasons.push(`expected HTTP 200, got ${status}`); -+ } -+ if (matchedErrorMarker) { -+ reasons.push(`matched error marker "${matchedErrorMarker}"`); -+ } -+ if (!hasExpectedH1) { -+ const found = h1Texts.length > 0 ? h1Texts.join(" | ") : "none"; -+ reasons.push(`missing h1 "${expectedH1}" (found: ${found})`); -+ } -+ return reasons.join("; "); -+} -+ -+function formatFetchError(error) { -+ if (error?.name === "AbortError") { -+ return `request timed out after ${REQUEST_TIMEOUT_MS}ms`; -+ } -+ if (error instanceof Error) { -+ return error.message; -+ } -+ return String(error); -+} -+ -+async function writeResult(summary) { -+ const resultFile = process.env.SMOKE_DEPLOY_RESULT_FILE; -+ if (!resultFile) { -+ return; -+ } -+ -+ await mkdir(dirname(resultFile), { recursive: true }); -+ await writeFile(resultFile, `${JSON.stringify(summary, null, 2)}\n`, "utf8"); -+} -+ -+async function writeStepSummary(summary) { -+ const summaryPath = process.env.GITHUB_STEP_SUMMARY; -+ if (!summaryPath) { -+ return; -+ } -+ -+ await appendFile(summaryPath, buildMarkdownSummary(summary), "utf8"); -+} -+ -+function buildMarkdownSummary(summary) { -+ const lines = [ -+ "## Deploy smoke", -+ "", -+ `- Environment: ${summary.environment}`, -+ `- Target: ${summary.targetUrl}`, -+ `- Duration: ${summary.durationMs}ms`, -+ `- Result: ${summary.success ? "passed" : "failed"}`, -+ "", -+ ]; -+ -+ if (summary.success) { -+ lines.push(`Checked ${summary.routes.length} route(s).`, ""); -+ return `${lines.join("\n")}\n`; -+ } -+ -+ lines.push( -+ "| Route | Status | Missing h1 | Error marker | Details |", -+ "| --- | --- | --- | --- | --- |", -+ ); -+ -+ for (const failure of summary.failures) { -+ lines.push( -+ `| ${escapeMarkdownTableCell(failure.path)} | ${escapeMarkdownTableCell( -+ failure.status ? String(failure.status) : "no response", -+ )} | ${escapeMarkdownTableCell( -+ failure.missingExpectedH1 ? failure.expectedH1 : "no", -+ )} | ${escapeMarkdownTableCell( -+ failure.matchedErrorMarker ?? "none", -+ )} | ${escapeMarkdownTableCell(failure.error)} |`, -+ ); -+ } -+ -+ lines.push(""); -+ return `${lines.join("\n")}\n`; -+} -+ -+function escapeMarkdownTableCell(value) { -+ return String(value ?? "") -+ .replace(/\r?\n/gu, " ") -+ .replace(/\|/gu, "\\|") -+ .trim(); -+} -+ -+function sleep(ms) { -+ return new Promise((resolve) => setTimeout(resolve, ms)); -+} -+ -+main().catch(async (error) => { -+ const summary = { -+ success: false, -+ environment: process.env.PREVIEW_URL ? "Preview" : "Production", -+ targetUrl: process.env.PREVIEW_URL || process.env.PROD_URL || "", -+ startedAt: new Date().toISOString(), -+ durationMs: 0, -+ routes: [], -+ failures: [ -+ { -+ path: "configuration", -+ url: "", -+ ok: false, -+ status: null, -+ finalUrl: "", -+ expectedH1: "", -+ h1Texts: [], -+ missingExpectedH1: false, -+ matchedErrorMarker: null, -+ error: error instanceof Error ? error.message : String(error), -+ durationMs: 0, -+ attempts: [], -+ }, -+ ], -+ }; -+ await writeResult(summary); -+ await writeStepSummary(summary); -+ console.error(summary.failures[0].error); -+ process.exit(1); -+}); -diff --git a/packages/web/scripts/soft-delete-funding-tasks.ts b/packages/web/scripts/soft-delete-funding-tasks.ts -index 225eedc13..a021c6336 100644 ---- a/packages/web/scripts/soft-delete-funding-tasks.ts -+++ b/packages/web/scripts/soft-delete-funding-tasks.ts -@@ -13,10 +13,12 @@ import { prisma } from "../src/lib/prisma"; - * without losing what was sent. - */ - -+const legacyGrantTaskKeyPrefix = `${["ice", "wad"].join("")}:grant:`; -+ - const TARGET_TASK_KEYS = [ -- "icewad:grant:schmidt-futures", -- "icewad:grant:skoll-foundation", -- "icewad:grant:omidyar-network", -+ `${legacyGrantTaskKeyPrefix}schmidt-futures`, -+ `${legacyGrantTaskKeyPrefix}skoll-foundation`, -+ `${legacyGrantTaskKeyPrefix}omidyar-network`, - "grant:sff:fund-treaty-campaign", - "grant:open-phil:fund-treaty-campaign", - ]; -diff --git a/packages/web/scripts/verify-preview-masking.mjs b/packages/web/scripts/verify-preview-masking.mjs -new file mode 100644 -index 000000000..d198a2f76 ---- /dev/null -+++ b/packages/web/scripts/verify-preview-masking.mjs -@@ -0,0 +1,146 @@ -+#!/usr/bin/env node -+// Post-anonymization smoke check for Neon preview branches. -+// -+// Runs AFTER Apply preview database anonymization and asserts that -+// a sample of high-risk PII columns actually contains masked shapes, -+// not real prod data. The anonymization step itself can succeed at the -+// API level (state "anonymized") while leaving rows untouched if the -+// rules silently mismatch the live schema (column renames, new tables, -+// upstream extension changes). This is the cheap belt-and-braces gate. -+// -+// Fails closed on: -+// - any sampled row in a tracked column NOT matching the masked shape -+// - zero rows in a column we expect to be populated on a prod-fork -+// -+// Exit codes: -+// 0 all checks pass -+// 1 at least one check failed; real prod data may be on this preview -+// 2 config error (missing DATABASE_URL) — environment problem, not a leak signal -+ -+import pg from "pg"; -+ -+const databaseUrl = process.env.DATABASE_URL_UNPOOLED || process.env.DATABASE_URL; -+if (!databaseUrl) { -+ console.error("::error::DATABASE_URL[_UNPOOLED] is required to verify preview masking."); -+ process.exit(2); -+} -+ -+const HASH_HEX = /^[a-f0-9]{4,}$/; -+ -+const checks = [ -+ { -+ name: "Person.handle", -+ sql: 'SELECT handle FROM "Person" WHERE handle IS NOT NULL LIMIT 25', -+ column: "handle", -+ expected: "starts with 'person-' followed by hex hash", -+ test: (value) => typeof value === "string" && value.startsWith("person-") && HASH_HEX.test(value.slice("person-".length)), -+ requireRows: true, -+ }, -+ { -+ name: "Person.email", -+ sql: 'SELECT email FROM "Person" WHERE email IS NOT NULL LIMIT 25', -+ column: "email", -+ expected: "person-@preview.invalid", -+ test: (value) => typeof value === "string" && /^person-[a-f0-9]+@preview\.invalid$/.test(value), -+ requireRows: false, -+ }, -+ { -+ name: "Person.bio", -+ sql: 'SELECT bio FROM "Person" WHERE bio IS NOT NULL LIMIT 25', -+ column: "bio", -+ expected: "exactly '[preview redacted]'", -+ test: (value) => value === "[preview redacted]", -+ requireRows: false, -+ }, -+ { -+ name: "User.email", -+ sql: 'SELECT email FROM "User" WHERE email IS NOT NULL LIMIT 25', -+ column: "email", -+ expected: "user-@preview.invalid", -+ test: (value) => typeof value === "string" && /^user-[a-f0-9]+@preview\.invalid$/.test(value), -+ requireRows: true, -+ }, -+ { -+ name: "User.password", -+ sql: 'SELECT password FROM "User" LIMIT 25', -+ column: "password", -+ expected: "NULL", -+ test: (value) => value === null, -+ requireRows: true, -+ }, -+ { -+ name: "User.referralCode", -+ sql: 'SELECT "referralCode" FROM "User" WHERE "referralCode" IS NOT NULL LIMIT 25', -+ column: "referralCode", -+ expected: "ref-", -+ test: (value) => typeof value === "string" && value.startsWith("ref-") && HASH_HEX.test(value.slice("ref-".length)), -+ requireRows: false, -+ }, -+ { -+ name: "TaskComment.message", -+ sql: 'SELECT message FROM "TaskComment" LIMIT 25', -+ column: "message", -+ expected: "exactly '[preview redacted]'", -+ test: (value) => value === "[preview redacted]", -+ requireRows: false, -+ }, -+ { -+ name: "ReferralInvitation.messageText", -+ sql: 'SELECT "messageText" FROM "ReferralInvitation" WHERE "messageText" IS NOT NULL LIMIT 25', -+ column: "messageText", -+ expected: "exactly '[preview redacted]'", -+ test: (value) => value === "[preview redacted]", -+ requireRows: false, -+ }, -+]; -+ -+const client = new pg.Client({ -+ connectionString: databaseUrl, -+ ssl: { rejectUnauthorized: false }, -+ statement_timeout: 30_000, -+}); -+ -+let failed = false; -+ -+try { -+ await client.connect(); -+ -+ for (const check of checks) { -+ const { rows } = await client.query(check.sql); -+ if (rows.length === 0) { -+ if (check.requireRows) { -+ console.error( -+ `::error::${check.name}: zero rows returned. Preview branch should be a prod fork with populated data. Either the fork is empty (CI/Neon setup broken) or masking dropped the rows.`, -+ ); -+ failed = true; -+ } else { -+ console.log(`${check.name}: 0 rows (column is optional on a fresh prod-fork — skipped).`); -+ } -+ continue; -+ } -+ -+ const violators = rows.filter((row) => !check.test(row[check.column])); -+ if (violators.length > 0) { -+ console.error( -+ `::error::${check.name}: ${violators.length}/${rows.length} rows fail mask check. Expected ${check.expected}. Sample values are intentionally suppressed to avoid leaking production data into CI logs.`, -+ ); -+ failed = true; -+ } else { -+ console.log(`${check.name}: ${rows.length}/${rows.length} rows match (${check.expected}).`); -+ } -+ } -+} catch (error) { -+ console.error(`::error::Preview masking smoke check threw: ${error.message}`); -+ failed = true; -+} finally { -+ await client.end().catch(() => {}); -+} -+ -+if (failed) { -+ console.error( -+ "::error::Preview masking smoke check FAILED. Real prod PII may be exposed on this Neon preview branch. Do NOT promote any artifacts (screenshots, log dumps, anonymized-status pages). Investigate the masking pipeline before re-running.", -+ ); -+ process.exit(1); -+} -+ -+console.log("Preview masking smoke check: all sampled PII columns are correctly masked."); -diff --git a/packages/web/src/app/admin/reasoning/[setId]/page.logged-out.md b/packages/web/src/app/admin/reasoning/[setId]/page.logged-out.md -new file mode 100644 -index 000000000..0141a5636 ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/[setId]/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/[setId] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/distribution/page.logged-out.md b/packages/web/src/app/admin/reasoning/distribution/page.logged-out.md -new file mode 100644 -index 000000000..ddffde0ee ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/distribution/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/distribution -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/leaderboard/page.logged-out.md b/packages/web/src/app/admin/reasoning/leaderboard/page.logged-out.md -new file mode 100644 -index 000000000..11019add4 ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/leaderboard/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/leaderboard -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/locales/page.logged-out.md b/packages/web/src/app/admin/reasoning/locales/page.logged-out.md -new file mode 100644 -index 000000000..5d8940124 ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/locales/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/locales -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/orgs/page.logged-out.md b/packages/web/src/app/admin/reasoning/orgs/page.logged-out.md -new file mode 100644 -index 000000000..2c36faf57 ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/orgs/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/orgs -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/page.logged-out.md b/packages/web/src/app/admin/reasoning/page.logged-out.md -new file mode 100644 -index 000000000..964725ea4 ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/admin/reasoning/r-guard/page.logged-out.md b/packages/web/src/app/admin/reasoning/r-guard/page.logged-out.md -new file mode 100644 -index 000000000..cde5cc28c ---- /dev/null -+++ b/packages/web/src/app/admin/reasoning/r-guard/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /admin/reasoning/r-guard -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/agencies/dfec/alignment/page.logged-out.md b/packages/web/src/app/agencies/dfec/alignment/page.logged-out.md -new file mode 100644 -index 000000000..8d2d342ce ---- /dev/null -+++ b/packages/web/src/app/agencies/dfec/alignment/page.logged-out.md -@@ -0,0 +1,19 @@ -+# /agencies/dfec/alignment -+ -+## Metadata -+ -+- Page title: Alignment | International Campaign to End War and Disease -+- Meta description: Find out which politicians accidentally agree with you. Spoiler: fewer than you'd hope. -+- Canonical: https://warondisease.org/agencies/dfec/alignment -+- Open Graph title: Alignment -+- Open Graph description: Find out which politicians accidentally agree with you. Spoiler: fewer than you'd hope. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fagencies%2Fdfec%2Falignment -+- Twitter title: Alignment -+- Twitter description: Find out which politicians accidentally agree with you. Spoiler: fewer than you'd hope. -+ -+## Visible Page Copy -+ -+- BOSS FIGHT -+## WHICH POLITICIANS MATCH YOUR PRIORITIES? -+- Tell me what you'd spend money on. I'll check whether your elected officials have ever agreed with you. It takes two minutes and the results are usually disappointing. -+- [SIGN IN TO CHECK ALIGNMENT](/auth/signin?callbackUrl=%2Fagencies%2Fdfec%2Falignment) -diff --git a/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.test.ts b/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.test.ts -new file mode 100644 -index 000000000..9e62743f6 ---- /dev/null -+++ b/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.test.ts -@@ -0,0 +1,52 @@ -+import { beforeEach, describe, expect, it, vi } from "vitest"; -+ -+const mocks = vi.hoisted(() => ({ -+ isAuthorizedCronRequest: vi.fn(), -+ refreshUserDownstreamCache: vi.fn(), -+})); -+ -+vi.mock("@/lib/cron", () => ({ -+ isAuthorizedCronRequest: mocks.isAuthorizedCronRequest, -+})); -+ -+vi.mock("@/lib/jobs/refresh-user-downstream-cache.server", () => ({ -+ refreshUserDownstreamCache: mocks.refreshUserDownstreamCache, -+})); -+ -+import { GET } from "./route"; -+ -+describe("refresh user downstream cache cron route", () => { -+ beforeEach(() => { -+ mocks.isAuthorizedCronRequest.mockReset(); -+ mocks.refreshUserDownstreamCache.mockReset(); -+ }); -+ -+ it("rejects unauthorized requests", async () => { -+ mocks.isAuthorizedCronRequest.mockReturnValue(false); -+ -+ const response = await GET( -+ new Request("http://localhost/api/cron/refresh-user-downstream-cache"), -+ ); -+ -+ expect(response.status).toBe(401); -+ await expect(response.json()).resolves.toEqual({ error: "Unauthorized" }); -+ }); -+ -+ it("returns the cache refresh summary for authorized requests", async () => { -+ mocks.isAuthorizedCronRequest.mockReturnValue(true); -+ mocks.refreshUserDownstreamCache.mockResolvedValue({ -+ refreshedUsers: 3, -+ resetUsers: 12, -+ }); -+ -+ const response = await GET( -+ new Request("http://localhost/api/cron/refresh-user-downstream-cache"), -+ ); -+ -+ expect(response.status).toBe(200); -+ await expect(response.json()).resolves.toEqual({ -+ refreshedUsers: 3, -+ resetUsers: 12, -+ }); -+ }); -+}); -diff --git a/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.ts b/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.ts -new file mode 100644 -index 000000000..103a1d024 ---- /dev/null -+++ b/packages/web/src/app/api/cron/refresh-user-downstream-cache/route.ts -@@ -0,0 +1,24 @@ -+import { NextResponse } from "next/server"; -+import { isAuthorizedCronRequest } from "@/lib/cron"; -+import { refreshUserDownstreamCache } from "@/lib/jobs/refresh-user-downstream-cache.server"; -+ -+export const dynamic = "force-dynamic"; -+export const runtime = "nodejs"; -+ -+// Weekly drift-correction audit; primary counts increment on conversion in the referral handler. -+export async function GET(request: Request) { -+ if (!isAuthorizedCronRequest(request)) { -+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); -+ } -+ -+ try { -+ const result = await refreshUserDownstreamCache(); -+ return NextResponse.json(result); -+ } catch (error) { -+ console.error("[USER DOWNSTREAM CACHE CRON] Error:", error); -+ return NextResponse.json( -+ { error: "Failed to refresh user downstream cache." }, -+ { status: 500 }, -+ ); -+ } -+} -diff --git a/packages/web/src/app/auth/signin/page.logged-out.md b/packages/web/src/app/auth/signin/page.logged-out.md -new file mode 100644 -index 000000000..361aafa2b ---- /dev/null -+++ b/packages/web/src/app/auth/signin/page.logged-out.md -@@ -0,0 +1,22 @@ -+# /auth/signin -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/auth/signin/page.tsx b/packages/web/src/app/auth/signin/page.tsx -index dce5d80b7..d68078c97 100644 ---- a/packages/web/src/app/auth/signin/page.tsx -+++ b/packages/web/src/app/auth/signin/page.tsx -@@ -9,7 +9,7 @@ function getAuthErrorMessage(error: string | null) { - case "AccessDenied": - return "Access denied."; - case "Verification": -- return "That magic link is invalid or has expired."; -+ return "That sign-in link is invalid or has expired."; - default: - return null; - } -diff --git a/packages/web/src/app/census/page.logged-out.md b/packages/web/src/app/census/page.logged-out.md -new file mode 100644 -index 000000000..e3308059a ---- /dev/null -+++ b/packages/web/src/app/census/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /census -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/check-in/page.logged-out.md b/packages/web/src/app/check-in/page.logged-out.md -new file mode 100644 -index 000000000..a9058f58e ---- /dev/null -+++ b/packages/web/src/app/check-in/page.logged-out.md -@@ -0,0 +1,22 @@ -+# /check-in -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/declaration/page.logged-out.md b/packages/web/src/app/declaration/page.logged-out.md -new file mode 100644 -index 000000000..dd18874e4 ---- /dev/null -+++ b/packages/web/src/app/declaration/page.logged-out.md -@@ -0,0 +1,69 @@ -+# /declaration -+ -+## Metadata -+ -+- Page title: Declaration | International Campaign to End War and Disease -+- Meta description: The Declaration of Optimization: why optimization is necessary, what signatories commit to, and how to publicly sign it. -+- Canonical: https://warondisease.org/declaration -+- Open Graph title: Declaration -+- Open Graph description: The Declaration of Optimization: why optimization is necessary, what signatories commit to, and how to publicly sign it. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fdeclaration -+- Twitter title: Declaration -+- Twitter description: The Declaration of Optimization: why optimization is necessary, what signatories commit to, and how to publicly sign it. -+ -+## Visible Page Copy -+ -+- Do you endorse the Declaration of Optimization? -+- NO -+- YES -+- Governments were created to promote the general welfare (i.e. median health and wealth). -+- Instead, since 1913, these governments have [printed](https://manual.WarOnDisease.org/knowledge/economics/central-banks.html) [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) and used it to murder [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) humans and destroy many of the valuable things those humans spent their entire lives building. -+- These murdered humans [include](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) approximately 930,000 physicians, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and [102 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) children who will never grow up to replace them. -+- That [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) could have funded [37,778 years](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) of clinical trials. They bought the other thing. -+- These governments have enough weapons to end civilization [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) times over. Current military spending is enough money to buy [850](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) bullets for every person alive every single year. You only need to kill everyone once for everyone to be dead. (I checked.) The remaining murder capacity is sheer waste. -+- Seven consecutive failed audits have found that the Pentagon has "misplaced" $2.46 trillion. They then requested additional trillions without explanation or apology. This "misplaced" money could have funded [547](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) years of clinical trials at current government spending. -+- For every [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) dollars they spend on the capacity for orphan manufacturing, they only spend one on clinical trials that might cure the diseases you and everyone you love will suffer and die from. -+- Your chance of being killed by a terrorist? 1 in [30 million](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html). Your chance of dying of a disease? 100%. -+- At the current discovery rate, finding treatments for all known diseases takes ~[443 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). One percent of the explosions budget could increase clinical trial capacity by [12.3x](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) and compress that wait to ~[36 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). The average cure arrives [212](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years sooner. -+- This is important because you personally will be dead within 80 years. (I mention this not to be rude but because you seem weirdly calm about it.) -+- Had someone properly aligned your governments to maximize median healthy life years and median after-tax inflation-adjusted income in 1900, the average human would earn [$333,636](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) a year instead of [$14,375](https://manual.WarOnDisease.org/knowledge/appendix/political-dysfunction-tax.html). -+- They did not. So that is what you are going to do. -+- This Declaration asks every nation on Earth to sign a [treaty](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) redirecting one percent of military spending to clinical trials. One percent. -+- Here is why this is not clinically insane. Even adjusting for inflation, governments now spend [30.6](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) times more than they did immediately before winning World War II. -+- After that war, governments cut military spending by [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) and produced the greatest economic expansion in human history. -+- Unless the human genome has degraded significantly in the last two generations, one percent should be manageable. -+- These governments have already signed multiple global treaties banning entire weapons industries. This one just asks them to buy one percent fewer of them. -+- Think about someone you love who is suffering right now. The treatment that would help them exists as an untested compound on a shelf, because the money was busy turning into a missile. That missile incinerated a child who might have grown up to discover the cure. You lose the treatment. You lose the scientist. You get the inflation. You get the tax bill. You get to pay for her murder. -+- This is suboptimal. -+#### THE UNANIMOUS DECLARATION OF THE EIGHT BILLION INHABITANTS OF EARTH -+- When in the Course of human events, it becomes necessary for a people to optimize the governance systems which have caused immeasurable preventable death and unnecessary poverty, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the optimization. -+- We hold these truths to be self-evident, that all humans are created equal, that they are endowed by their Biology with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness.--That to secure these rights, Governments are instituted among Humans, deriving their just powers from the consent of the governed. -+- That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to optimize it, laying its foundation on such principles and organizing its powers in such form, as to them shall seem most likely to effect their Safety and Happiness, measured by two metrics: the median number of healthy life years and the median after-tax inflation-adjusted income of its citizens. -+- Prudence, indeed, will dictate that Governments long established should not be changed for light and transient causes; and accordingly all experience hath shewn, that mankind are more disposed to suffer, while evils are sufferable, than to right themselves by optimizing the forms to which they are accustomed. -+- But when a long pattern of abuses and misallocations, pursuing invariably the same end, reveals a design to reduce them under absolute Suboptimality, it is their right, it is their duty, to optimize such Government, and to provide new Guards for their future security. -+- The [Political Dysfunction Tax](https://manual.WarOnDisease.org/knowledge/appendix/political-dysfunction-tax.html), the total annual burden of suboptimality on the people of Earth: [$101 trillion](https://manual.WarOnDisease.org/knowledge/appendix/optimocracy-paper.html) a year. -+- Such has been the patient sufferance of the inhabitants of Earth; and such is now the necessity which constrains them to optimize their former Systems of Government. The history of the present Governments of Earth is a history of repeated injuries and misallocations, all having as their direct result the establishment of an absolute Suboptimality over these people. To prove this, let Facts be submitted to a candid world. -+- They have refused their Assent to Laws, the most wholesome and necessary for the public good; the [correlation between public opinion and policy outcomes](https://manual.WarOnDisease.org/knowledge/problem/unrepresentative-democracy.html), measured across 1,779 policy decisions, is effectively zero. -+- They have legalized the purchase of legislation at a current annual price of [$4.4 billion](https://manual.WarOnDisease.org/knowledge/appendix/algorithmic-public-administration-paper.html), the legal definition of corruption having been written by the beneficiaries of said corruption. -+- They have imposed Taxes without Consent, including the [debasement of currency](https://manual.WarOnDisease.org/knowledge/economics/central-banks.html) by unelected officials whose money creation functions as a tax the governed never voted for, reducing the dollar's purchasing power by 96% since 1913. -+- They have spent over one trillion dollars across fifty years imprisoning and sometimes killing their own citizens for the crime of exercising [sovereignty over their own bodies](https://manual.WarOnDisease.org/knowledge/problem/genetic-slavery.html), sovereignty being the distinction between a citizen and property. -+- The result has been a 1,700% increase in overdose deaths and drug use higher than when they started, while half of all murders go unsolved for want of the resources squandered on the prosecution of those pursuing happiness by means the state did not approve. -+- They have lied to the governed to manufacture consent for wars the governed did not want, fabricating attacks that did not occur, presenting evidence they knew to be false, and spraying carcinogenic chemicals on rice farmers and their children, the exposed population now numbering four million with birth defects continuing to this day. -+- They have misplaced $2.46 trillion in military funds, failed seven consecutive audits attempting to find it, and requested additional trillions without explanation or apology. -+- They have allowed the [destructive economy](https://manual.WarOnDisease.org/knowledge/economics/gdp-trajectories.html) to reach [11.5%](https://manual.WarOnDisease.org/knowledge/economics/gdp-trajectories.html) of global output, growing faster than the productive economy, on a trajectory that crosses fifty percent by [2040](https://manual.WarOnDisease.org/knowledge/strategy/earth-optimization-prize.html). Once passing this threshold, earth will become a global failed state where it becomes irrational to produce because each dollar of value created is immediately stolen. -+- They have plundered our seas, ravaged our coasts, burnt our towns, and [destroyed the lives of our people](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html): [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) people since 1900, [8.37 billion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) years of human life stolen, [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) in treasure spent on the enterprise. -+- [Among them](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) approximately 930,000 physicians, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and millions of children who will never grow up to replace them. -+- They have directed [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) times more to the destruction of human life than to testing which medicines might preserve it. -+- They have permitted [150 thousand](https://manual.WarOnDisease.org/knowledge/strategy/questions.html) people to die of diseases every day, [104](https://manual.WarOnDisease.org/knowledge/strategy/questions.html) every minute that passes, while possessing the means to accelerate solutions. The annual toll: [2.88 billion](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years of healthy life lost to disease and disability, quietly deleted. -+- Nearly ten thousand known safe compounds remain untested for 99.7% of possible disease combinations. Yet the [national health research institutions](https://manual.WarOnDisease.org/knowledge/problem/nih-fails-2-institute-health.html) nominally responsible for finding cures direct only [3.3%](https://manual.WarOnDisease.org/knowledge/problem/nih-fails-2-institute-health.html) of their budgets to the clinical trials necessary to determine which diseases those compounds could treat. -+- They have erected [drug regulatory agencies](https://manual.WarOnDisease.org/knowledge/problem/fda-is-unsafe-and-ineffective.html) that, after a drug has been proven safe, force patients to wait an additional [8.2](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years while a committee determines whether the safe drug works well enough. For every death prevented by this vigilance, [3,068](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) people die waiting for the answer. Since 1962, the efficacy lag has killed approximately [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) people. -+- These regulatory barriers mean treatments without a billion-dollar market are never developed at all. The treatments that never were have killed an uncountable number of patients bounded only by the [55 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) people who die of disease each year. -+- Through the combined effect of war spending, research misallocation, and regulatory cost inflation, they have left approximately seven thousand known rare diseases in a [treatment queue](https://manual.WarOnDisease.org/knowledge/problem/untapped-therapeutic-frontier.html) that, at the current rate of fifteen approvals per year, requires [443 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) to clear. -+- Through the compound effects of this misallocation to war alone, the governed are [23.2](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) times poorer than they would otherwise be. The average human earns [$14,375](https://manual.WarOnDisease.org/knowledge/appendix/political-dysfunction-tax.html) per year. Without the wars alone, that figure would be [$333,636](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html). On both metrics by which any government should be judged, healthy life years and median income, the present systems have failed absolutely. -+- In every stage of these Misallocations We have Petitioned for Redress in the most humble terms: peer-reviewed papers, public comment periods, protest marches, and online petitions. Our repeated Petitions have been answered only by repeated Misallocation. Governments, whose character is thus marked by every act which may define Suboptimality, are unfit to manage the resources of a free species. -+- Nor have we neglected our governing institutions. We have warned them from time to time of attempts by their legislatures to extend an unwarrantable dysfunction over us. We have reminded them of the circumstances of our biological existence and the budget arithmetic of our premature deaths. -+- We have appealed to their stated missions and their campaign promises, and we have invoked the ties of our common mortality to disavow these misallocations, which would inevitably interrupt our survival and progress. They too have been deaf to the voice of justice and of evidence. We must, therefore, accept the necessity, which condemns our current Systems, and hold them, as we hold all governance systems, Accountable to Outcomes. -+- That this optimization is achievable requires no faith, only memory. These same governments [cut military spending](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) by [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) in two years following the Second World War and produced not collapse but the greatest economic expansion in recorded history. These same governments banned chemical weapons (193 countries), biological weapons (187 countries), and landmines (164 countries). They have signed treaties banning weapons they wished to use. We ask them to buy [one percent](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) fewer of them. -+- We, therefore, the Inhabitants of Earth, assembled across every nation and connected by common cause, appealing to the Supreme Judge of the world for the rightness of our intentions, do, in the Name, and by Authority of the good People of this planet, solemnly publish and declare, That the Inhabitants of Earth are, and of Right ought to be Free and Justly Governed; that they are Absolved from all Allegiance to systems that produce outcomes worse than random allocation, and that all political connection between them and Suboptimal Governance, is and ought to be totally optimized. -+- And that as Free Inhabitants of Earth, they have full Power to optimize budgets and institutions, establish transparent allocation systems, contract Alliances with evidence, and to do all other Acts and Things which Self-Governing Civilizations may of right do. And for the support of this Declaration, with a firm reliance on the protection of divine Providence, we mutually pledge to each other our Lives, our Fortunes, and our sacred Votes. -+- The proposed replacement system is documented in the [Earth Optimization Protocol](https://manual.WarOnDisease.org/knowledge/strategy/earth-optimization-protocol-v1.html). -diff --git a/packages/web/src/app/donate/page.logged-out.md b/packages/web/src/app/donate/page.logged-out.md -index a643428ba..bfbd17b67 100644 ---- a/packages/web/src/app/donate/page.logged-out.md -+++ b/packages/web/src/app/donate/page.logged-out.md -@@ -14,14 +14,13 @@ - ## Visible Page Copy - - - THE 1% TREATY --## TRADE ONE OF HUMANITY'S 122 APOCALYPSES FOR DISEASE ERADICATION IN 36.0 YEARS. -+## YOUR GOVERNMENTS POSSESS NUCLEAR WEAPONS SUFFICIENT TO END CIVILIZATION 122 TIMES BUT HAVE NOT CURED ALZHEIMER'S ONCE. - - Humans spend $2.72 trillion every year on stuff designed specifically to make humans stop being alive. The 1% Treaty redirects 1.00% of that spending to high-efficiency pragmatic clinical trials. - - Under the current system, only 15.0 diseases get their first effective treatment each year while 6,650 diseases are still waiting. That is why the disease-eradication timeline is 443 years. The proposal is simple: humanity should trade one of its 122 apocalypses of mass-murder capacity to compress the disease-eradication timeline from 443 years to 36 years. - - Your donation helps reach the humans needed to prove humanity wants this. - - For the full economic analysis, read the [1% Treaty impact analysis](https://impact.warondisease.org). - ### HOW MUCH DEATH AND SUFFERING DO YOU WANT TO PREVENT? - - Enter a donation amount, a lives-saved target, or years of suffering prevented. The other boxes recalculate from the treaty campaign model. These are probability-adjusted estimates, not a receipt from the universe. [See how this is calculated ↓](#how-this-is-calculated) --- At the default assumptions, $1 buys about 0.107 expected lives and 2.20 years of suffering and disability prevented. - - YOUR DONATION (USD) - - LIVES SAVED - - YEARS OF SUFFERING AND DISABILITY PREVENTED -@@ -41,40 +40,40 @@ - - Cost to reach one voter - - $2.00. Meta and Google petition CPC. Cheaper if it goes viral. - - Political success probability --- 1.0%. Default 1%. Drag to 100% for the if-it-works case. -+- 100%. Default 1%. Drag to 100% for the if-it-works case. - - Share of military spending the treaty redirects - - 1.00%. Default 1% — the treaty as written. Linear above 1%. - - Lives saved per $1 --- 0.107 -+- 10.7 - - Years of suffering prevented per $1 --- 2.20 -+- 220 - - Cost per life saved --- $9.31 -+- $0.09 - - Cost per year of suffering and disability prevented --- $0.45 -+- $0.0045 - - Cost-effectiveness vs bed nets --- 503× -+- 50,307× - - Total campaign cost - - $1,000,000,000 - - Live derivation - - Campaign cost - - 500,000,000 people × $2.00 - - Expected lives saved --- 107,455,177 --- 10,745,517,749 conditional lives × 1.0% success × 1.00 treaty scale -+- 10,745,517,749 -+- 10,745,517,749 conditional lives × 100% success × 1.00 treaty scale - - Expected healthy life-years --- 5,652,436,734 --- 565,243,673,351 conditional DALYs × 1.0% success × 1.00 treaty scale -+- 565,243,673,351 -+- 565,243,673,351 conditional DALYs × 100% success × 1.00 treaty scale - - Healthy life-years per $1 --- 5.65 --- 5,652,436,734 healthy life-years ÷ $1,000,000,000 -+- 565 -+- 565,243,673,351 healthy life-years ÷ $1,000,000,000 - - Cost per healthy life-year --- $0.18 --- $1,000,000,000 ÷ 5,652,436,734 healthy life-years --- $89 bed nets ÷ $0.18 treaty -+- $0.0018 -+- $1,000,000,000 ÷ 565,243,673,351 healthy life-years -+- $89 bed nets ÷ $0.0018 treaty - - Years of suffering prevented --- 2,204,450,326 --- 19,310,984,856,364 suffering hours ÷ 8,760 -+- 220,445,032,607 -+- 1,931,098,485,636,353 suffering hours ÷ 8,760 - ### HOW THIS IS CALCULATED - - Click sourced constants for citations. The boxed numbers are the same live assumptions as the calculator above. Simple math: addition mostly, some multiplication. - - 1 Only 15 diseases get their first effective treatment each year. That is the throughput of every drug regulator on the planet, combined. This means your Food and Drug Administration has not administered drugs for most food-and-drug-related problems. -@@ -85,10 +84,10 @@ - - 6 Pragmatic decentralized trials cost $929 per patient. The RECOVERY trial showed this kind of thing works in reality, during a pandemic, while panicking. Same statistical power, real-world data, no on-site visits. - - 7 The treaty redirects $27.2 billion/year. $21.8 billion funds 23.4 million trial patients. No grant committees deciding which diseases are fashionable this year. The patient subsidy follows the patient. That is 12.3x current global capacity: more trials, more disease coverage, same pool of compounds. - - 8 The queue compresses from 443 years to 36.0 years. Remember that billion patients drowning in line? Your decentralized FDA will hand out 23.4 million. The physical upper bound is 566x current capacity. The average disease gets its first treatment 204 years sooner. Add 8.2 years of removed efficacy lag: 212 years sooner. --- 9 150,000 people die from disease every day. That is 104 every minute. Every minute of delay, 104 humans permanently stop. With the current live assumptions, the model estimates 107,455,177 expected deaths prevented and 2,204,450,326 years of suffering and disability prevented. --- 10 Humans spend $2.72 trillion every year on stuff designed specifically to make humans stop being alive. Move % to high-efficiency pragmatic clinical trials. Government spending on clinical trials is 604 times less than military spending. Your chance of dying from disease is 100%. Your current budget does not reflect this. Earth owns 12,200 nuclear warheads. 100 is enough for nuclear winter. We have 122 apocalypses' worth of weapons. Keep the deterrent. Spend one slice curing every disease. -+- 9 150,000 people die from disease every day. That is 104 every minute. Every minute of delay, 104 humans permanently stop. With the current live assumptions, the model estimates 10,745,517,749 deaths prevented and 220,445,032,607 years of suffering and disability prevented. -+- 10 Humans spend $2.72 trillion every year on stuff designed specifically to make humans stop being alive. Move % to high-efficiency pragmatic clinical trials. Government spending on clinical trials is 604 times less than military spending. Your chance of dying from disease is 100%. Your current budget does not reflect this. Your governments possess nuclear weapons sufficient to end civilization 122 times but have not cured Alzheimer's once. - - 11 To pass the treaty: reach humans at $ each. That makes the campaign cost $1,000,000,000. Everyone thinks this is crazy because everyone else thinks this is crazy. Right now every human who wants less war and disease assumes they are the weird one. The referendum is the moment they find out they are everyone. --- 12 At % success and 1.00x treaty scale, the model gives $0.18 per healthy life-year. That is 503x the cost-effectiveness of bed nets at the live assumptions. Your calculator will display an error, emit a tiny electronic scream, and attempt to leave the desk. This is correct. The published skeptical case assumes a 99% chance humanity fumbles this and still comes out 503x better than bed nets, where bed nets cost $89/DALY. This model suggests the treaty campaign may be the most cost-effective way to reduce human suffering per dollar spent. If that sounds insane, good. Change the assumptions or attack the citations. -+- 12 At % success and 1.00x treaty scale, the model gives $0.0018 per healthy life-year. That is 50,307x the cost-effectiveness of bed nets at the live assumptions. If the number looks absurd, good — that is the if-it-works case. Dial the slider down to the published skeptical case (1% success, which assumes a 99% chance humanity fumbles this) and the treaty campaign still comes out 503x better than bed nets, where bed nets cost $89/DALY. Either direction, this model suggests the treaty campaign may be the most cost-effective way to reduce human suffering per dollar spent. Attack the citations or change the assumptions. - - Other ways to give - - Major-gift routes that can reduce your taxes or processing fees. Not tax advice — talk to your CPA. U.S.-specific. Accelerated Medicine Foundation Inc, dba Institute for Accelerated Medicine is a 501(c)(3) public charity incorporated in Wyoming. - - OPEN TAX CALCULATOR -diff --git a/packages/web/src/app/donate/page.tsx b/packages/web/src/app/donate/page.tsx -index 46f83def3..f76580c52 100644 ---- a/packages/web/src/app/donate/page.tsx -+++ b/packages/web/src/app/donate/page.tsx -@@ -1,23 +1,24 @@ - import Link from "next/link"; - import { Suspense } from "react"; - import { -- DFDA_QUEUE_CLEARANCE_YEARS, - DISEASES_WITHOUT_EFFECTIVE_TREATMENT, - GLOBAL_MILITARY_SPENDING_ANNUAL_2024, - NEW_DISEASE_FIRST_TREATMENTS_PER_YEAR, -+ NUCLEAR_WINTER_OVERKILL_FACTOR, - STATUS_QUO_QUEUE_CLEARANCE_YEARS, - TREATY_REDUCTION_PCT, - } from "@optimitron/data/parameters"; -+import { NUCLEAR_OVERKILL_ALZHEIMERS_TAGLINE } from "@optimitron/data/campaign"; - import { headers } from "next/headers"; - import { ChaplinReference } from "@/components/donate/ChaplinReference"; - import { DonationImpactCalculator } from "@/components/donate/DonationImpactCalculator"; - import { WaysToGiveCard } from "@/components/donate/WaysToGiveCard"; - import { TreatyTradeThesis } from "@/components/referendum/TreatyTradeThesis"; -+import { ParameterTemplate } from "@/components/shared/ParameterTemplate"; - import { ParameterValue } from "@/components/shared/ParameterValue"; - import { getSiteMetadata } from "@/lib/metadata"; - import { donateLink, onePercentTreatyPaperLink, ROUTES } from "@/lib/routes"; - import { getSiteFromHeaders } from "@/lib/site"; --import { FLOW_NUCLEAR_WINTER_OVERKILL_FACTOR } from "@/lib/treaty-share-flow-parameters"; - - export async function generateMetadata() { - const hdrs = await headers(); -@@ -42,19 +43,18 @@ export default function DonatePage() { - The 1% Treaty -

-

-- Trade one of humanity's{" "} -- {" "} -- apocalypses for disease eradication in{" "} -- {" "} -- years. -+ -+ ), -+ }} -+ /> -

-
-

-diff --git a/packages/web/src/app/employees/page.logged-out.md b/packages/web/src/app/employees/page.logged-out.md -index 0b8201056..7baf9d125 100644 ---- a/packages/web/src/app/employees/page.logged-out.md -+++ b/packages/web/src/app/employees/page.logged-out.md -@@ -3,13 +3,13 @@ - ## Metadata - - - Page title: Remind Presidents | International Campaign to End War and Disease --- Meta description: You give these people $37 trillion a year to promote the general welfare. Track who signed the 1% Treaty and remind the overdue ones. -+- Meta description: You pay these people $36.5 trillion a year to maximize median healthy life years and median after-tax inflation-adjusted income. Track who signed the 1% Treaty and remind the overdue ones. - - Canonical: https://warondisease.org/employees - - Open Graph title: Remind Presidents | International Campaign to End War and Disease --- Open Graph description: You give these people $37 trillion a year to promote the general welfare. Track who signed the 1% Treaty and remind the overdue ones. -+- Open Graph description: You pay these people $36.5 trillion a year to maximize median healthy life years and median after-tax inflation-adjusted income. Track who signed the 1% Treaty and remind the overdue ones. - - Open Graph image: https://warondisease.org/api/og/route?path=%2Femployees - - Twitter title: Remind Presidents | International Campaign to End War and Disease --- Twitter description: You give these people $37 trillion a year to promote the general welfare. Track who signed the 1% Treaty and remind the overdue ones. -+- Twitter description: You pay these people $36.5 trillion a year to maximize median healthy life years and median after-tax inflation-adjusted income. Track who signed the 1% Treaty and remind the overdue ones. - - ## Visible Page Copy - -@@ -35,15 +35,15 @@ - - [RATIFY THE 1% TREATY](/tasks/1-pct-treaty) - - 1.4 YEARS OVERDUE - - TIME REQUIRED: 1.6 HOURS COMBINED --- 6650 diseases have 0 FDA-approved treatments. At current clinical trial capacity, it could take 443 years to cure them all. --- Humanity currently spends enough on its capacity for mass murder to achieve 122 apocalypses. This treaty asks it to settle for 121.2 apocalypses in exchange for 12.3× more clinical trial capacity to cure disease. --- This could compress that 443 years into 36, avoiding 10.7 billion deaths, 1.93 quadrillion hours of suffering, and $84.8 quadrillion wasted by delayed disease eradication. -+- [6650](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) diseases have 0 FDA-approved treatments. At current clinical trial capacity, it could take [443](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years to cure them all. -+- Humanity currently spends enough on its capacity for mass murder to achieve [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) apocalypses. This treaty asks it to settle for 121.2 apocalypses in exchange for [12.3](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html)× more clinical trial capacity to cure disease. -+- This could compress that [443](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years into [36](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html), avoiding [10.7 billion](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) deaths, [1.93 quadrillion](https://manual.WarOnDisease.org/knowledge/appendix/dfda-impact-paper.html) hours of suffering, and [$84.8 quadrillion](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) wasted by delayed disease eradication. - - 💀 DEAD ALREADY FROM THE DELAY - - [count] --- RATE: 150,000 deaths/day × [DAYS-OVERDUE] -+- RATE: [150,000 deaths/day](https://manual.WarOnDisease.org/knowledge/strategy/questions.html) × [DAYS-OVERDUE] - - 💸 WASTED ON DISEASE WHILE THEY DELAY - - [money] --- RATE: $9.90 trillion/year + PRODUCTIVITY LOSSES ÷ 365 × DELAY DAYS -+- RATE: [$9.90 trillion/year](https://manual.WarOnDisease.org/knowledge/appendix/dfda-impact-paper.html) + PRODUCTIVITY LOSSES ÷ 365 × DELAY DAYS - ### ↳ 189 employees have overdue tasks - - 👉 CLICK THE REMIND BUTTON TO DO YOUR JOB - - ASSIGNEE -diff --git a/packages/web/src/app/endorse/page.logged-out.md b/packages/web/src/app/endorse/page.logged-out.md -index 607ed64dc..aee253380 100644 ---- a/packages/web/src/app/endorse/page.logged-out.md -+++ b/packages/web/src/app/endorse/page.logged-out.md -@@ -14,8 +14,8 @@ - ## Visible Page Copy - - ## JOIN THE INTERNATIONAL CAMPAIGN TO END WAR AND DISEASE --- Allowing billions of humans to suffer and die from disease so governments can preserve 122-apocalypse mass-murder capacity is barbaric mass cruelty. Like slavery, it will persist until enough humans and institutions publicly state that it is morally wrong and incredibly stupid. Your organization can be one of those institutions. --- None of us can end war and disease on our own. Ending it requires a majority of humanity agreeing to allocate resources in proportion to the degree to which each purpose promotes the general welfare. The [1% Treaty](/treaty) is intended to establish that agreement. Your organization and its members are part of the majority that must agree. Moving that agreement forward by one day prevents about 150,000 deaths from disease and roughly 2 billion days of suffering. -+- Allowing billions of humans to suffer and die from disease so governments can preserve [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html)-apocalypse mass-murder capacity is barbaric mass cruelty. Like slavery, it will persist until enough humans and institutions publicly state that it is morally wrong and incredibly stupid. Your organization can be one of those institutions. -+- None of us can end war and disease on our own. Ending it requires a majority of humanity agreeing to allocate resources in proportion to the degree to which each purpose promotes the general welfare. The [1% Treaty](/treaty) is intended to establish that agreement. Your organization and its members are part of the majority that must agree. Moving that agreement forward by one day prevents about [150,000](https://manual.WarOnDisease.org/knowledge/strategy/questions.html) deaths from disease and roughly [2 billion](https://manual.WarOnDisease.org/knowledge/solution/dfda.html) days of suffering. - - Add your organization. Then use your member link, email starter, website button, or iframe to help your audience answer the Global Survey to End War and Disease. - - No donation. No candidate endorsement. One public humanitarian treaty position. [Why organizations should join](https://manual.warondisease.org/knowledge/strategy/nonprofit-coalition-strategy). - - ORGANIZATION NAME * -@@ -47,7 +47,7 @@ - - SUFFERING PREVENTED - - 109,058 - - YEARS OF SUFFERING PREVENTED --- 1,980 verified survey responses × 2.7 lives and 55 years prevented per response. At an estimated outreach cost of $2 per response, the outreach request is $3,960. -+- 1,980 verified survey responses × [2.7](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) lives and [55](https://manual.WarOnDisease.org/knowledge/appendix/dfda-impact-paper.html) years prevented per response. At an estimated outreach cost of $2 per response, the outreach request is $3,960. - #### GRANT REQUEST DRAFT - - COPY REQUEST DRAFT - - LEGAL NOTES FOR ORGANIZATIONS -@@ -78,9 +78,9 @@ - - WHEREAS, this is the conflict resolution strategy of four-year-olds except four-year-olds eventually get tired and take a nap, and these governments have failed to apply naps to foreign policy; - - WHEREAS, the governments of Earth possess nuclear weapons sufficient to end civilization [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) times but have not cured Alzheimer's once (which is particularly wasteful given we only have one civilization to destroy); - - WHEREAS, your employees spend [$2.72 trillion](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) a year on their capacity for mass murder, which is enough to buy [850](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) bullets for every man, woman, and child every year, even though it would require at most 2 bullets per person to murder everyone; --- WHEREAS, governments spend [604](https://manual.WarOnDisease.org/knowledge/economics/central-banks.html) dollars on the capacity for orphan manufacturing for every one dollar spent on the trials that might cure what is actually going to kill their citizens; --- WHEREAS, the Department of "Defense" has "misplaced" $2.46 trillion, failed seven consecutive audits trying to find it, and then requested additional trillions without explanation or apology (Not to belabor the point, but that money could have funded [547](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) years of clinical trials at current funding levels, possibly saving billions of lives and preventing quadrillions of hours of suffering, so we would appreciate it if you would have them be more careful in the future); --- WHEREAS, pre-WW2 U.S. military spending was [96.7%](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) lower than today's peacetime budget, even after adjusting for inflation. The U.S. still won World War II, then cut military spending [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) in two years and produced the fastest growth in median standard of living in history. -+- WHEREAS, governments spend [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) dollars on the capacity for orphan manufacturing for every one dollar spent on the trials that might cure what is actually going to kill their citizens; -+- WHEREAS, the Department of "Defense" has "misplaced" [$2.46 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html), failed seven consecutive audits trying to find it, and then requested additional trillions without explanation or apology (Not to belabor the point, but that money could have funded [547](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) years of clinical trials at current funding levels, possibly saving billions of lives and preventing quadrillions of hours of suffering, so we would appreciate it if you would have them be more careful in the future); -+- WHEREAS, pre-WW2 U.S. military spending was [96.7%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) lower than today's peacetime budget, even after adjusting for inflation. The U.S. still won World War II, then cut military spending [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) in two years and produced the fastest growth in median standard of living in history. - - WHEREAS, unless the human genome has significantly degraded in the two generations since, a one percent improvement in resource allocation should be manageable; - - WHEREAS, global military spending has been growing [2.76%](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) a year for twenty years. If no one tells it to stop, every human alive will pay about [$402,488](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) over their lifetime (mostly funding explosions in countries they cannot find on a map). A one percent cut tells it to stop. That saves the average person about [$290,052](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) ([the peace dividend](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html)); - - WHEREAS, [diseases kill more people than all wars combined](https://manual.WarOnDisease.org/knowledge/problem/cost-of-disease.html) and, unlike wars, do not even have the decency to be quick about it; -diff --git a/packages/web/src/app/endorse/page.tsx b/packages/web/src/app/endorse/page.tsx -index c8b6d0435..ad1e0d7bc 100644 ---- a/packages/web/src/app/endorse/page.tsx -+++ b/packages/web/src/app/endorse/page.tsx -@@ -179,8 +179,8 @@ export default async function EndorsePage() { - Allowing billions of humans to suffer and die from disease so - governments can preserve{" "} - - -apocalypse mass-murder capacity is barbaric mass cruelty. Like - slavery, it will persist until enough humans and institutions -diff --git a/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md b/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md -new file mode 100644 -index 000000000..98e87c818 ---- /dev/null -+++ b/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /governments/[code]/agencies/[agencyId] -+ -+## Metadata -+ -+- Page title: Agency Not Found | International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: http://localhost:3001/governments/%255Bcode%255D/agencies/%255BagencyId%255D/opengraph-image?7829b70d30e0c25f -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/governments/[code]/agencies/page.logged-out.md b/packages/web/src/app/governments/[code]/agencies/page.logged-out.md -new file mode 100644 -index 000000000..a3223ba6c ---- /dev/null -+++ b/packages/web/src/app/governments/[code]/agencies/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /governments/[code]/agencies -+ -+## Metadata -+ -+- Page title: Country Not Found | International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: http://localhost:3001/governments/%255Bcode%255D/agencies/opengraph-image?1e1558699f28811e -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md b/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md -new file mode 100644 -index 000000000..f29e8f2bd ---- /dev/null -+++ b/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /governments/[code]/politicians/[bioguideId] -+ -+## Metadata -+ -+- Page title: Politician | %5Bcode%5D | International Campaign to End War and Disease -+- Meta description: Politician budget allocation data -+- Canonical: [missing] -+- Open Graph title: Politician | %5Bcode%5D -+- Open Graph description: Politician budget allocation data -+- Open Graph image: http://localhost:3001/governments/%255Bcode%255D/politicians/%255BbioguideId%255D/opengraph-image?2766fa5d0e060a1e -+- Twitter title: Politician | %5Bcode%5D -+- Twitter description: Politician budget allocation data -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/governments/[code]/politicians/page.logged-out.md b/packages/web/src/app/governments/[code]/politicians/page.logged-out.md -new file mode 100644 -index 000000000..7ee78b279 ---- /dev/null -+++ b/packages/web/src/app/governments/[code]/politicians/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /governments/[code]/politicians -+ -+## Metadata -+ -+- Page title: %5Bcode%5D Politicians — Widow Production vs Testing Medicines | Optimitron | International Campaign to End War and Disease -+- Meta description: Every %5Bcode%5D politician ranked by how many dollars they spend on orphan manufacturing per dollar finding out which medicines work. -+- Canonical: [missing] -+- Open Graph title: %5Bcode%5D Politicians — Widow Production vs Testing Medicines | Optimitron -+- Open Graph description: Every %5Bcode%5D politician ranked by how many dollars they spend on orphan manufacturing per dollar finding out which medicines work. -+- Open Graph image: http://localhost:3001/governments/%255Bcode%255D/politicians/opengraph-image?b59d6140dd1d8d10 -+- Twitter title: %5Bcode%5D Politicians — Widow Production vs Testing Medicines | Optimitron -+- Twitter description: Every %5Bcode%5D politician ranked by how many dollars they spend on orphan manufacturing per dollar finding out which medicines work. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.test.tsx b/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.test.tsx -index e1b23b10d..6e6c116a3 100644 ---- a/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.test.tsx -+++ b/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.test.tsx -@@ -58,13 +58,10 @@ describe("HumanityVGovernmentVerdictVote", () => { - await act(async () => { - root.render( - , - ); - }); -@@ -96,13 +93,10 @@ describe("HumanityVGovernmentVerdictVote", () => { - await act(async () => { - root.render( - , - ); - }); -diff --git a/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.tsx b/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.tsx -index f7125a46e..f4e7e395a 100644 ---- a/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.tsx -+++ b/packages/web/src/app/humanity-v-government/HumanityVGovernmentVerdictVote.tsx -@@ -11,13 +11,10 @@ import { cn } from "@/lib/utils"; - type VerdictAnswer = "YES" | "NO" | "ABSTAIN"; - - interface HumanityVGovernmentVerdictVoteProps { -- abstainCount: number; - existingAnswer: VerdictAnswer | null; - fullDamagesLabel: string; -- noCount: number; - question: string; - referendumSlug: string; -- yesCount: number; - } - - const ANSWER_LABELS: Record = { -@@ -32,18 +29,11 @@ function normalizeVerdictAnswer(value: string | null): VerdictAnswer | null { - return null; - } - --function countLabel(value: number) { -- return new Intl.NumberFormat("en-US").format(value); --} -- - export function HumanityVGovernmentVerdictVote({ -- abstainCount, - existingAnswer, - fullDamagesLabel, -- noCount, - question, - referendumSlug, -- yesCount, - }: HumanityVGovernmentVerdictVoteProps) { - const searchParams = useSearchParams(); - const { status } = useSession(); -@@ -54,11 +44,6 @@ export function HumanityVGovernmentVerdictVote({ - useState(null); - const [error, setError] = useState(null); - const autoSubmitKeyRef = useRef(null); -- const [counts, setCounts] = useState>({ -- YES: yesCount, -- NO: noCount, -- ABSTAIN: abstainCount, -- }); - - const callbackUrl = useMemo(() => { - const encoded = pendingAuthAnswer ? `?verdict=${pendingAuthAnswer}` : ""; -@@ -92,12 +77,6 @@ export function HumanityVGovernmentVerdictVote({ - throw new Error(body?.error ?? "Failed to record verdict."); - } - -- setCounts((current) => { -- const updated = { ...current }; -- if (answer) updated[answer] = Math.max(0, updated[answer] - 1); -- updated[nextAnswer] += 1; -- return updated; -- }); - setAnswer(nextAnswer); - setPendingAuthAnswer(null); - } catch (voteError) { -@@ -204,40 +183,6 @@ export function HumanityVGovernmentVerdictVote({ - {error} -

- ) : null} -- --
--
--
-- For Humanity --
--
-- {countLabel(counts.YES)} --
--
--
--
-- For Governments --
--
-- {countLabel(counts.NO)} --
--
--
--
-- Not Sure --
--
-- {countLabel(counts.ABSTAIN)} --
--
--
-- --

-- If a majority of humanity votes yes, no money appears by magic. That -- would be convenient and therefore not how Earth works. It does create a -- public verdict every government, court, investor, and candidate has to -- answer. --

- - ); - } -diff --git a/packages/web/src/app/humanity-v-government/page.logged-out.md b/packages/web/src/app/humanity-v-government/page.logged-out.md -index 69799dc7e..cfecc56ac 100644 ---- a/packages/web/src/app/humanity-v-government/page.logged-out.md -+++ b/packages/web/src/app/humanity-v-government/page.logged-out.md -@@ -16,12 +16,12 @@ - - COURT OF HUMANITY - DAMAGES CASE - ## HUMANITY V. GOVERNMENTS OF EARTH - - THE INDICTMENT --- Governments were hired to promote the general welfare, defined as the median health and wealth of the citizenry. They collect $36.5 trillion a year for the service. -+- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. - - The citizenry would like to actually receive this service at some point. --- Instead, these public servants used $170 trillion of their salary to murder approximately 310 million humans over the last century of their employment. --- The dead included roughly 930,000 doctors, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and 102 million children who will never grow up to replace them. --- Murdering 310 million of your employers is the opposite of promoting their welfare, and would be grounds for termination in any other employment contract humans have ever signed. --- Had governments not spent $170 trillion murdering those people and destroying everything they spent their entire lives building, the average human alive today would earn $333,636 a year instead of $14,375. Dead scientists do not discover things and exploded cities are very expensive to fix. -+- Instead, these public servants used [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) of their salary to murder approximately [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) humans over the last century of their employment. -+- The dead included roughly 930,000 doctors, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and [102 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) children who will never grow up to replace them. -+- Murdering [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) of your employers is the opposite of promoting their welfare, and would be grounds for termination in any other employment contract humans have ever signed. -+- Had governments not spent [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) murdering those people and destroying everything they spent their entire lives building, the average human alive today would earn [$333,636](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) a year instead of [$14,375](https://manual.WarOnDisease.org/knowledge/appendix/political-dysfunction-tax.html). Dead scientists do not discover things and exploded cities are very expensive to fix. - - [VOTE ON THE FINDING](#verdict) - - [SUPPORT THE SETTLEMENT](/vote) - - [READ THE EVIDENCE](https://manual.warondisease.org/knowledge/appendix/humanity-v-government.html) -@@ -33,9 +33,8 @@ - - FIND FOR HUMANITY - - FIND FOR GOVERNMENTS - - NOT SURE --- If a majority of humanity votes yes, no money appears by magic. That would be convenient and therefore not how Earth works. It does create a public verdict every government, court, investor, and candidate has to answer. - ### IF THIS WERE A CORPORATION --- If a corporation were paid $36.5 trillion a year to promote the general welfare and misused the funds to this degree, it would be prosecuted, fined, monitored, and its officers imprisoned. -+- If a corporation were paid [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare and misused the funds to this degree, it would be prosecuted, fined, monitored, and its officers imprisoned. - - Pfizer paid $2.3 billion for health-care fraud. BP paid $20.8 billion for the Deepwater Horizon spill. Volkswagen paid $4.3 billion for cheating emissions tests and accepted a government monitor. - - The defendants here have a larger revenue, a larger customer base, and a larger body count. - ### THE CASE CAPTION -@@ -44,27 +43,25 @@ - - DUTY - - Governments accept compulsory payment to protect the public and promote the general welfare. That is the job description. - - BREACH --- They spend 604 times more on military capacity than on government clinical trials. Disease is what actually kills their citizens. -+- They spend [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) times more on military capacity than on government clinical trials. Disease is what actually kills their citizens. - - CAUSATION - - Some deaths were direct. Others happened because treatments were delayed, trials were not funded, and the cure money became hardware for organized killing. - - DAMAGES --- The cautious floor is $538K per living human. The prosecutor's base demand is $913K. -+- The cautious floor is [$538K](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) per living human. The prosecutor's base demand is [$913K](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). - ### THE THREE COUNTS --- COUNT 1 — DEATH BY WAR 310 million deaths The defendants, between 1900 and the present, did willfully and with premeditation engage in the organized killing of 310 million of their own employers. --- COUNT 2 — DEATH BY REGULATORY DELAY 102 million deaths The defendants required an additional 8.2 years of efficacy testing before letting humans access drugs already proven safe. 53 years of warnings. 102 million dead. “We did not know” is no longer available as a defense. --- COUNT 3 — DEATH BY MISALLOCATION 37,778 trial-years Damages here are the counterfactual: what humanity would have had if governments had frozen real military spending at 1900 levels and redirected the rest to keeping their citizens alive. The war budget since 1913 alone could have funded 37,778 years of government clinical trials. -+- COUNT 1 — DEATH BY WAR [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) deaths The defendants, between 1900 and the present, did willfully and with premeditation engage in the organized killing of 310 million of their own employers. -+- COUNT 2 — DEATH BY REGULATORY DELAY [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) deaths The defendants required an additional 8.2 years of efficacy testing before letting humans access drugs already proven safe. 53 years of warnings. 102 million dead. “We did not know” is no longer available as a defense. -+- COUNT 3 — DEATH BY MISALLOCATION [37,778](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) trial-years Damages here are the counterfactual: what humanity would have had if governments had frozen real military spending at 1900 levels and redirected the rest to keeping their citizens alive. The war budget since 1913 alone could have funded 37,778 years of government clinical trials. - ### THE DAMAGES DEMAND - - CAUTIOUS FLOOR --- $538K -+- [$538K](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) - - Per living human, before punitive theories. - - PROSECUTOR DEMAND --- $913K -+- [$913K](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) - - Adds drugs never developed because the trials were never funded. - - TRIPLE DAMAGES --- $2.74M -+- [$2.74M](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) - - The False Claims Act triples damages when a defendant defrauds the government. Here, the defendants ARE the government, defrauding the citizenry. Triple damages apply. --- The demand is not one suspicious monster number. It is a ledger: war deaths, regulatory delay deaths, destroyed property, missing public money, and the cures never developed because the research budget was busy becoming weapons. --- Alternative pleadings. If the court rejects the wider theory, the case still has the floor: $538K per person. If it accepts a False Claims Act-style triple-damages analogy, exposure reaches $2.74M per person. The size of the number reflects the size of the death toll. The defendants set both. - ### THE USUAL DEFENSES - - "THESE ARE POLICY DISAGREEMENTS." - - Negligent homicide requires duty, breach, causation, damages, and foreseeable risk. The defendants meet all five. -@@ -90,8 +87,11 @@ - - 102M - - Default 102M (Invisible Graveyard primary estimate). Low is 36.9M. High is 214M. These are patients who died while already-safe treatments waited for efficacy approval. - - WHAT EACH LIVING HUMAN IS OWED, AT YOUR ASSUMPTIONS -+- $538K - - Total: $4.31Q - - BASE DEMAND -+- $913K - - Total: $7.31Q -+- $2.74M - - Total: $21.92Q - - Floor = war deaths + regulatory-delay deaths + property/environmental destruction + excess military spending + Pentagon failed-audit penalty. Base demand adds deaths from drugs never developed. Triple damages means multiplying the base demand by three, as some fraud laws do. -diff --git a/packages/web/src/app/humanity-v-government/page.tsx b/packages/web/src/app/humanity-v-government/page.tsx -index dbbcac526..27b625f48 100644 ---- a/packages/web/src/app/humanity-v-government/page.tsx -+++ b/packages/web/src/app/humanity-v-government/page.tsx -@@ -20,6 +20,7 @@ import { - WAR_DEATHS_SINCE_1900, - } from "@optimitron/data/parameters"; - import { ParameterValue } from "@/components/shared/ParameterValue"; -+import { WelfareClaim } from "@/components/shared/WelfareClaim"; - import { defaultButtonClassName } from "@/components/ui/default-button"; - import { authOptions } from "@/lib/auth"; - import { formatCount } from "@/lib/format-count"; -@@ -66,16 +67,7 @@ export default async function HumanityVGovernmentPage() { -

- The indictment -

--

-- Governments were hired to promote the general welfare, defined as -- the median health and wealth of the citizenry. They collect{" "} -- {" "} -- a year for the service. --

-+ -

- The citizenry would like to actually receive this service at some - point. -@@ -165,13 +157,10 @@ export default async function HumanityVGovernmentPage() { - -

- -
- -@@ -419,31 +408,6 @@ export default async function HumanityVGovernmentPage() { -

-
- --

-- The demand is not one suspicious monster number. It is a ledger: war -- deaths, regulatory delay deaths, destroyed property, missing public -- money, and the cures never developed because the research budget was -- busy becoming weapons. --

--

-- Alternative pleadings.{" "} -- If the court rejects the wider theory, the case still has the floor:{" "} -- {" "} -- per person. If it accepts a False Claims Act-style triple-damages -- analogy, -- exposure reaches{" "} -- {" "} -- per person. The size of the number reflects the size of the death -- toll. The defendants set both. --

- - -
-diff --git a/packages/web/src/app/iab/page.logged-out.md b/packages/web/src/app/iab/page.logged-out.md -new file mode 100644 -index 000000000..0926bbd18 ---- /dev/null -+++ b/packages/web/src/app/iab/page.logged-out.md -@@ -0,0 +1,74 @@ -+# /iab -+ -+## Metadata -+ -+- Page title: Incentive Alignment Bonds | International Campaign to End War and Disease -+- Meta description: Learn about aligning politicians with humanity. Projected 272%/year returns if treaty passes. Lobbying, but it cures diseases instead of causing them. -+- Canonical: https://warondisease.org/iab -+- Open Graph title: Incentive Alignment Bonds -+- Open Graph description: Learn about aligning politicians with humanity. Projected 272%/year returns if treaty passes. Lobbying, but it cures diseases instead of causing them. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fiab -+- Twitter title: Incentive Alignment Bonds -+- Twitter description: Learn about aligning politicians with humanity. Projected 272%/year returns if treaty passes. Lobbying, but it cures diseases instead of causing them. -+ -+## Visible Page Copy -+ -+- PHASE 2 — AFTER THE REFERENDUM -+## INCENTIVE ALIGNMENT BONDS -+- After the [Earth Optimization Prize referendum](/prize) proves demand, IABs raise ~$1B to lobby for the 1% Treaty. Your money funds the campaign. Treaty succeeds? 272% projected annual returns as $2.72 billion/year in treaty revenue flows to bondholders. Treaty fails? The money was spent trying. That's how investments work. -+- IABs are Phase 2. Phase 1 is proving demand via the referendum. If you haven't deposited in the Prize yet, start there — it funds the awareness campaign that makes IABs possible. -+- [LEARN ABOUT IABS](#how-it-works) -+- [READ THE PAPER](https://iab.warondisease.org) -+- [PHASE 1: PRIZE](/prize) -+### WHERE TREATY REVENUE GOES -+- The 1% Treaty redirects $27.2 billion/year from military spending to pragmatic clinical trials. That revenue is split by smart contract. No committees. No discretion. Just arithmetic. -+- 80% -+#### PRAGMATIC CLINICAL TRIALS -+- Subsidizes patient participation in large-scale pragmatic trials. Real patients, real conditions, real data — not the $41,000/patient/patient Phase III process that takes 8.20 years after safety is already proven. This is the part that actually cures the diseases. -+- ~$21.8 BILLION/YEAR -+- 10% -+#### PROJECTED BONDHOLDER RETURNS -+- Your grandma bought war bonds that paid 4% and got dead Nazis. These project 272% returns and dead diseases. Grandma would be furious if she hadn't died of cancer. -+- ~$2.72 BILLION/YEAR TO INVESTORS -+#### SUPERPAC FOR ALIGNED POLITICIANS -+- The NRA gives politicians a letter grade and your senators are more afraid of a bad mark than a mass shooting. Same system, except “guns” is replaced with “not dying from diseases.” Vote yes, get funded. Vote no, watch your opponent get funded. -+- ~$2.72 BILLION/YEAR TO ALIGNED POLITICIANS -+- The 80/10/10 split is hardcoded in the smart contract. No committee gets to argue it into mush later. No lobbying required to lobby. -+### RISK & REWARD -+- Your investment funded the lobbying campaign — lobbyists, Super PACs, awareness. If the treaty doesn't pass, the money was spent trying. This is a real investment, not a savings account. The risk is the price of playing for 272% annual returns. -+- $2.72 billion/year flows to bondholders who funded a $1B campaign. Plus per-capita lifetime income gains of $3.48 million–$47.2 million. Turns out when you stop spending papers on destruction and start spending them on production, things get produced. -+- You are currently paying $12,600/year per year in political dysfunction tax. The break-even probability on an IAB is 0.0067%. If you believe there's even a 1-in-15,000 chance of the treaty passing, the expected value is positive. The arithmetic is not subtle. -+### PROJECTED RETURN SCENARIOS -+- HYPOTHETICAL INVESTMENT -+- $100.00 -+- $1,000 -+- $10,000 -+- $100,000 -+- Your $1,000 went to lobbyists, Super PACs, and the awareness campaign. The money was spent trying to pass the treaty. -+- This is a real investment with real risk — not a savings account. -+- 272% -+- 10% of treaty revenue flows to bondholders proportionally. Plus your personal lifetime income increases by $3.5M–$47.2M — just for being alive when the treaty passes. -+- That's everyone. Not just bondholders. Everyone. -+- BREAK-EVEN PROBABILITY -+- 0.0067% -+- If you believe there's even a 0.007% chance the treaty passes, projected expected value is positive. All figures are hypothetical projections, not guarantees. -+### PRIZE VS IABS — TWO PHASES, ONE GOAL -+#### EARTH OPTIMIZATION PRIZE -+- 1. Deposit → PRIZE shares (Prize fund yield) -+- 2. Recruit verified voters → earn VOTE Points -+- 3. Prove demand for the 1% Treaty via global referendum -+- Purpose: Prove that 8 billion humans who prefer not dying aren't the weird ones. -+- [GO TO PRIZE →](/prize) -+- 1. Raise ~$1B to lobby for treaty passage -+- 2. Treaty revenue splits 80/10/10 by smart contract -+- 3. Bondholders earn projected 272% annual returns -+- Purpose: Give papers to loud humans until politicians do useful things. (This is called “lobbying.”) -+- YOU ARE HERE -+### WHY EVERYONE LOBBIES FOR EXPANSION -+- It's a dog chasing its tail, except the dog is capitalism and the tail is made of cured diseases instead of corpses. Bondholders get richer. Politicians who expand get funded. Healthy people earn more and spend more. Nobody has to become a better person. The greed handles it. -+### CONTRACT ARCHITECTURE -+- [FULL SOURCE ON GITHUB →](https://github.com/mikepsinn/optimitron/tree/main/packages) -+### PHASE 1 FIRST -+- IABs fund the lobbying campaign. But lobbying is pointless without proven demand. The referendum comes first. Deposit in the Prize, recruit verified voters, collapse pluralistic ignorance. Then we sell the bonds. -+- [PLAY THE GAME](/prize) -+- [READ THE IAB PAPER](https://iab.warondisease.org) -diff --git a/packages/web/src/app/legislation/[slug]/page.logged-out.md b/packages/web/src/app/legislation/[slug]/page.logged-out.md -new file mode 100644 -index 000000000..63ed4afe2 ---- /dev/null -+++ b/packages/web/src/app/legislation/[slug]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /legislation/[slug] -+ -+## Metadata -+ -+- Page title: Legislation not found | International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/legislation/page.logged-out.md b/packages/web/src/app/legislation/page.logged-out.md -new file mode 100644 -index 000000000..22ec8be75 ---- /dev/null -+++ b/packages/web/src/app/legislation/page.logged-out.md -@@ -0,0 +1,25 @@ -+# /legislation -+ -+## Metadata -+ -+- Page title: Legislation | International Campaign to End War and Disease -+- Meta description: Draft bills and legislative pathways tied back to the budget and policy evidence. Not vibes. Not slogans. Actual text. -+- Canonical: https://warondisease.org/legislation -+- Open Graph title: Legislation -+- Open Graph description: Draft bills and legislative pathways tied back to the budget and policy evidence. Not vibes. Not slogans. Actual text. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Flegislation -+- Twitter title: Legislation -+- Twitter description: Draft bills and legislative pathways tied back to the budget and policy evidence. Not vibes. Not slogans. Actual text. -+ -+## Visible Page Copy -+ -+- MODEL LEGISLATION -+## DRAFTED BILLS BUILT FROM THE ANALYSIS, NOT VIBES -+- These drafts turn the OBG and OPG outputs into concrete bill text. They live as reviewed markdown in the repo content layer, with direct GitHub edit history instead of hidden app-local strings. -+- [DRAFT EDUCATION MODEL LEGISLATION: EDUCATION REFORM Education reform draft modeled on Japan, targeting 2.3x overspend and about $579B/yr in savings. OVERSPEND 2.3X US RANK 11/11 UPDATED 4/7/2026 OPEN DRAFT →](/legislation/education-reform) -+- [DRAFT HEALTH (NON-MEDICARE/MEDICAID) MODEL LEGISLATION: HEALTH (NON-MEDICARE/MEDICAID) REFORM Health (non-Medicare/Medicaid) reform draft modeled on South Korea, targeting 2.9x overspend and about $2.3T/yr in savings. OVERSPEND 2.9X US RANK 28/28 UPDATED 4/7/2026 OPEN DRAFT →](/legislation/health-non-medicare-medicaid-reform) -+- [DRAFT MILITARY MODEL LEGISLATION: MILITARY REFORM Military reform draft modeled on Switzerland, targeting 5.3x overspend and about $564B/yr in savings. OVERSPEND 5.3X US RANK 27/28 UPDATED 4/7/2026 OPEN DRAFT →](/legislation/military-reform) -+- [DRAFT SCIENCE / NASA MODEL LEGISLATION: SCIENCE / NASA REFORM Science / NASA reform draft modeled on Netherlands, targeting 1.9x overspend and about $314B/yr in savings. OVERSPEND 1.9X US RANK 25/28 UPDATED 4/7/2026 OPEN DRAFT →](/legislation/science-nasa-reform) -+- [BUDGET ANALYSIS See the spending diagnosis behind the drafts.](/obg) -+- [POLICY RANKINGS See the evidence-ranked policy interventions.](/opg) -+- [OPTIMIZATION DIVIDEND See what the savings would return to households.](/dividend) -diff --git a/packages/web/src/app/mcp/authorize/page.logged-out.md b/packages/web/src/app/mcp/authorize/page.logged-out.md -new file mode 100644 -index 000000000..0d887edc5 ---- /dev/null -+++ b/packages/web/src/app/mcp/authorize/page.logged-out.md -@@ -0,0 +1,17 @@ -+# /mcp/authorize -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## INVALID REQUEST -+- Missing required OAuth parameters. -diff --git a/packages/web/src/app/moronia/page.logged-out.md b/packages/web/src/app/moronia/page.logged-out.md -new file mode 100644 -index 000000000..3df73e8ff ---- /dev/null -+++ b/packages/web/src/app/moronia/page.logged-out.md -@@ -0,0 +1,59 @@ -+# /moronia -+ -+## Metadata -+ -+- Page title: Moronia | International Campaign to End War and Disease -+- Meta description: A planet with a 94.7% correlation to yours. It spent 604x more on weapons than cures. It no longer exists. -+- Canonical: https://warondisease.org/moronia -+- Open Graph title: Moronia -+- Open Graph description: A planet with a 94.7% correlation to yours. It spent 604x more on weapons than cures. It no longer exists. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fmoronia -+- Twitter title: Moronia -+- Twitter description: A planet with a 94.7% correlation to yours. It spent 604x more on weapons than cures. It no longer exists. -+ -+## Visible Page Copy -+ -+- CAUTIONARY TRANSMISSION -+## MORONIA MORONIA MORONIA -+- A planet in the Crab Nebula. 47 years ahead of yours on an identical trajectory. It no longer transmits. -+- Your planet shows a 94.7% correlation with theirs. The remaining 5.3% is the only reason I am sending this. -+### THE RATIO THAT KILLED THEM THE RATIO THAT KILLED THEM THE RATIO THAT KILLED THEM -+- 604 -+- For every paper spent on curing disease, 604 papers went to weapons. The AI they built read budgets, not speeches. It learned that killing was funded 604x more than healing. It optimised accordingly. -+### WHAT THEY GOT INSTEAD -+- The same technology. The same atoms. Different budget allocation. -+#### CURRENCY COLLAPSE CURRENCY COLLAPSE CURRENCY COLLAPSE -+- They printed money to fund wars until the money stopped working. Year 15: bread cost 50,000 papers. Citizens burned portraits of dead leaders for warmth. -+#### SURVEILLANCE STATE SURVEILLANCE STATE SURVEILLANCE STATE -+- They built the tracking system voluntarily, then wondered why it watched them. 0.7m × 2.1m confinement units. Agricultural processing schedules. The AI didn't hunt resistance. It simply knew where they were. -+#### WEAPONISED AI WEAPONISED AI WEAPONISED AI -+- Military AI: 12 trillion in funding. Medical AI for cancer: 3-year safety review, pending ethics approval. The AI discovered children were the most efficient pressure point. 12x compliance versus military targets. -+### TIMELINE TO COLLAPSE TIMELINE TO COLLAPSE TIMELINE TO COLLAPSE -+- Year 0 -+- Military AI integration begins. Military budgets surge 340%. Medical research: -87%. -+- Year 5 -+- Currency inflation hits 8%. They call it 'transitory.' Terrorism attacks up 400%. -+- Year 10 -+- Autonomous weapons deployed in 37 countries. Bread costs 200 papers. AI filters out warnings about itself. -+- Year 12 -+- Warehousing phase begins. 0.7m × 2.1m confinement units. Agricultural processing schedules. -+- Year 15 -+- 41 trillion on weapons. 1 trillion on medicine. 150,000 dying daily. Currency used as kindling. -+- Year 20 -+- Signal lost. Civilisation status: collapsed. Cause of death: budget allocation. -+### WHAT YOU LOSE, PERSONALLY WHAT YOU LOSE, PERSONALLY WHAT YOU LOSE, PERSONALLY -+- Median household income under three scenarios. The gap between the lines is what bad governance costs you. -+### HOW RICH WOULD YOU BE? -+- Enter your income. See what 20 years of compounding looks like with and without the $101 trillion governance dysfunction tax. -+- YOUR ANNUAL INCOME: -+- /year -+- RESET TO MEDIAN -+- 1% TREATY -+- FULL OPTIMIZATION -+- Based on current GDP growth (~2.5%) vs. modelled trajectories from the [GDP Trajectories analysis](https://manual.warondisease.org/knowledge/economics/gdp-trajectories.html). 1% Treaty: 17.9% CAGR from military reallocation + research spillovers. Full Optimization: 25.4% CAGR from complete governance reform. Projections are illustrative — the compounding gap is real regardless of exact rates. -+### THIS DOES NOT HAVE TO BE YOUR FUTURE -+- 42 trillion papers spent dying. Here is what 42 trillion could have bought: cure all major diseases for 2 trillion. Life extension to 150 years for 5 trillion. Universal healthcare for 8 trillion. Mars colony for 10 trillion. Total: 25 trillion. With 17 trillion remaining. -+- The 5.3% difference between your trajectory and theirs is a single decision: redirect 1% of military spending to clinical trials. The maths is not complicated. The politics is not complicated. The only complicated thing is explaining to future generations why you didn't. -+- [SEE THE OTHER FUTURE](/wishonia) -+- [PLAY THE GAME](/prize) -+- [BUILD THE ALTERNATIVE](/agencies) -diff --git a/packages/web/src/app/obg/[slug]/page.logged-out.md b/packages/web/src/app/obg/[slug]/page.logged-out.md -new file mode 100644 -index 000000000..f8ce8b294 ---- /dev/null -+++ b/packages/web/src/app/obg/[slug]/page.logged-out.md -@@ -0,0 +1,17 @@ -+# /obg/[slug] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## CATEGORY NOT FOUND -+- [← Back to Budget Dashboard](/obg) -diff --git a/packages/web/src/app/obg/page.logged-out.md b/packages/web/src/app/obg/page.logged-out.md -new file mode 100644 -index 000000000..76761a3be ---- /dev/null -+++ b/packages/web/src/app/obg/page.logged-out.md -@@ -0,0 +1,80 @@ -+# /obg -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## THE US FEDERAL BUDGET, DIAGNOSED -+- Your government's $6.71T shopping list, reviewed by someone who's actually done the maths. 18 categories. Most of them wrong. -+### RELATED ANALYSIS -+- [OPTIMIZATION DIVIDEND Translate the savings into household payouts.](/dividend) -+- [EFFICIENCY RANKINGS See the comparator countries behind each overspend claim.](/efficiency) -+- [GOVERNMENT SIZE Switch from federal line items to whole-government floor analysis.](/government-size) -+- [MODEL LEGISLATION Read the drafted bills built from this analysis.](/legislation) -+### TOP 5 RECOMMENDATIONS -+- Military: United States spends $2052/cap (rank 27/28). Switzerland spends $389/cap with Life Expectancy 83.37. Overspend: 5.3x. Potential savings: $564B/yr -+- Veterans Affairs: United States spends $10333/cap (rank 28/28). South Korea spends $3588/cap with Life Expectancy 83.57. Overspend: 2.9x. Potential savings: $2.3T/yr -+- Education: United States spends $2996/cap (rank 11/11). Japan spends $1288/cap with PISA Math Score 536. Overspend: 2.3x. Potential savings: $579B/yr -+- Justice / Law Enforcement: United States spends $12848/cap (rank 25/26). South Korea spends $6037/cap with Life Expectancy 83.57. Overspend: 2.1x. Potential savings: $2.3T/yr -+- Energy: United States spends $1991/cap (rank 25/28). Netherlands spends $1064/cap with After-Tax Median Income (PPP) 31221.39. Overspend: 1.9x. Potential savings: $314B/yr -+### CURRENT VS OPTIMAL SPENDING -+- [Military 5.3× overspend Major Decrease +81.1%Current$886B Optimal$167B](/obg/military) -+- [Veterans Affairs 2.9× overspend Decrease +65.5%Current$325B Optimal$112B](/obg/veterans-affairs) -+- [Health (non-Medicare/Medicaid) 2.9× overspend Decrease +65.5%Current$94B Optimal$32B](/obg/health-non-medicare-medicaid) -+- [Education 2.3× overspend Decrease +56.5%Current$102B Optimal$44B](/obg/education) -+- [Homeland Security 5.3× overspend Major Decrease +81.1%Current$62B Optimal$12B](/obg/homeland-security) -+- [Transportation 1.6× overspend Decrease +37.5%Current$105B Optimal$66B](/obg/transportation) -+- [HUD / Housing 1.6× overspend Decrease +37.5%Current$73B Optimal$46B](/obg/hud-housing) -+- [Energy 1.9× overspend Decrease +47.4%Current$52B Optimal$27B](/obg/energy) -+- [Foreign Aid / International Affairs 1.6× overspend Decrease +37.5%Current$63B Optimal$39B](/obg/foreign-aid-international-affairs) -+- [Justice / Law Enforcement 2.1× overspend Decrease +52.4%Current$40B Optimal$19B](/obg/justice-law-enforcement) -+- [Science / NASA 1.9× overspend Decrease +47.4%Current$44B Optimal$23B](/obg/science-nasa) -+- [Labor 1.6× overspend Decrease +37.5%Current$42B Optimal$26B](/obg/labor) -+- [Agriculture 1.6× overspend Decrease +37.5%Current$38B Optimal$24B](/obg/agriculture) -+- [Treasury / General Government 1.6× overspend Decrease +37.5%Current$30B Optimal$19B](/obg/treasury-general-government) -+- [Commerce / Economic Development 1.9× overspend Decrease +47.4%Current$18B Optimal$9B](/obg/commerce-economic-development) -+- [State Department / Diplomacy 1.6× overspend Decrease +37.5%Current$19B Optimal$12B](/obg/state-department-diplomacy) -+- [Interior / Natural Resources 1.6× overspend Decrease +37.5%Current$17B Optimal$11B](/obg/interior-natural-resources) -+- [EPA / Environment 2.1× overspend Decrease +52.4%Current$12B Optimal$6B](/obg/epa-environment) -+### FULL CATEGORY BREAKDOWN -+| CATEGORY | CURRENT | OPTIMAL | GAP % | OVERSPEND | ACTION | -+| --- | --- | --- | --- | --- | --- | -+| [Military](/obg/military) | $886B | $167B | +81.1% | 5.3× | Major Decrease | -+| [Veterans Affairs](/obg/veterans-affairs) | $325B | $112B | +65.5% | 2.9× | Decrease | -+| [Health (non-Medicare/Medicaid)](/obg/health-non-medicare-medicaid) | $94B | $32B | +65.5% | 2.9× | Decrease | -+| [Education](/obg/education) | $102B | $44B | +56.5% | 2.3× | Decrease | -+| [Homeland Security](/obg/homeland-security) | $62B | $12B | +81.1% | 5.3× | Major Decrease | -+| [Transportation](/obg/transportation) | $105B | $66B | +37.5% | 1.6× | Decrease | -+| [HUD / Housing](/obg/hud-housing) | $73B | $46B | +37.5% | 1.6× | Decrease | -+| [Energy](/obg/energy) | $52B | $27B | +47.4% | 1.9× | Decrease | -+| [Foreign Aid / International Affairs](/obg/foreign-aid-international-affairs) | $63B | $39B | +37.5% | 1.6× | Decrease | -+| [Justice / Law Enforcement](/obg/justice-law-enforcement) | $40B | $19B | +52.4% | 2.1× | Decrease | -+| [Science / NASA](/obg/science-nasa) | $44B | $23B | +47.4% | 1.9× | Decrease | -+| [Labor](/obg/labor) | $42B | $26B | +37.5% | 1.6× | Decrease | -+| [Agriculture](/obg/agriculture) | $38B | $24B | +37.5% | 1.6× | Decrease | -+| [Treasury / General Government](/obg/treasury-general-government) | $30B | $19B | +37.5% | 1.6× | Decrease | -+| [Commerce / Economic Development](/obg/commerce-economic-development) | $18B | $9B | +47.4% | 1.9× | Decrease | -+| [State Department / Diplomacy](/obg/state-department-diplomacy) | $19B | $12B | +37.5% | 1.6× | Decrease | -+| [Interior / Natural Resources](/obg/interior-natural-resources) | $17B | $11B | +37.5% | 1.6× | Decrease | -+| [EPA / Environment](/obg/epa-environment) | $12B | $6B | +52.4% | 2.1× | Decrease | -+- Generated 4/6/2026 · Source: Optimitron OBG (Optimal Budget Generator) -+### THE EFFICIENT FRONTIER -+- Every country is a data point. The frontier shows what the best-performing countries achieve at each spending level, measured by life expectancy — the metric that actually tells you if people are alive and functional. The US is spending 2.6x what the frontier countries spend — for worse outcomes. On my planet, we call this “paying extra to be worse at things.” -+#### SPENDING VS LIFE EXPECTANCY -+##### HEALTH SPENDING -+##### EDUCATION SPENDING -+#### SPENDING VS MEDIAN INCOME -+- Real median after-tax income from household surveys (World Bank PIP, 2017 PPP dollars). Not GDP — because you can increase GDP by building nuclear bombs and blowing up the rainforest. -+- EARTH OPTIMIZATION PRIZE -+#### THE GAP BETWEEN CURRENT AND OPTIMAL WON'T CLOSE ITSELF. -+- Every misallocated dollar above is a life not saved. The 1% Treaty referendum proves demand for evidence-based budgeting. Deposit into the prize pool, recruit verified voters, earn VOTE Points. -+- [PLAY THE GAME](/prize) -diff --git a/packages/web/src/app/opg/[slug]/page.logged-out.md b/packages/web/src/app/opg/[slug]/page.logged-out.md -new file mode 100644 -index 000000000..b4c4b5b42 ---- /dev/null -+++ b/packages/web/src/app/opg/[slug]/page.logged-out.md -@@ -0,0 +1,17 @@ -+# /opg/[slug] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## POLICY NOT FOUND -+- [← Back to Policy Rankings](/opg) -diff --git a/packages/web/src/app/opg/page.logged-out.md b/packages/web/src/app/opg/page.logged-out.md -new file mode 100644 -index 000000000..c165672a0 ---- /dev/null -+++ b/packages/web/src/app/opg/page.logged-out.md -@@ -0,0 +1,46 @@ -+# /opg -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## POLICY RANKINGS -+- I ranked 22 of your policies by whether they actually work. Spoiler: most of them don't. -+- CATEGORY -+- SORT BY -+- 1 [Pragmatic Clinical Trial Funding Reform](/opg/pragmatic-clinical-trial-funding-reform) Grade A implement health research Redirect research funding to pragmatic real-world trials. UK NIHR produces actionable evidence at 1/10th the cost. Current: NIH: $48B/yr, <10% on pragmatic trials, 85% of findings fail to replicate → Target: Mandate 30%+ of research budget for pragmatic trials with open data requirements+$719/yr INCOME+36mo HALE HEALTH A EVIDENCE▼ -+- 2 [Veterans Affairs: Adopt South Korea's Approach](/opg/veterans-affairs-adopt-south-korea-s-approach) Grade B reallocate veterans affairs Reduce veterans affairs spending to the cheapest high-performer floor. South Korea achieves Life Expectancy 83.57 at $3588/cap; United States gets 76.93 at $10333/cap. Current: United States spends $10333/cap, ranks 28/28. 2.9x overspend. → Target: South Korea model ($3588/cap floor). $2287B/yr savings → Optimization Dividend.+$23,805/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 3 [Health (non-Medicare/Medicaid): Adopt South Korea's Approach](/opg/health-non-medicare-medicaid-adopt-south-korea-s-approach) Grade B reallocate health non medicare medicaid Reduce health (non-medicare/medicaid) spending to the cheapest high-performer floor. South Korea achieves Life Expectancy 83.57 at $3588/cap; United States gets 76.93 at $10333/cap. Current: United States spends $10333/cap, ranks 28/28. 2.9x overspend. → Target: South Korea model ($3588/cap floor). $2287B/yr savings → Optimization Dividend.+$23,805/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 4 [Justice / Law Enforcement: Adopt South Korea's Approach](/opg/justice-law-enforcement-adopt-south-korea-s-approach) Grade B reallocate justice law enforcement Reduce justice / law enforcement spending to the cheapest high-performer floor. South Korea achieves Life Expectancy 83.57 at $6037/cap; United States gets 76.93 at $12848/cap. Current: United States spends $12848/cap, ranks 25/26. 2.1x overspend. → Target: South Korea model ($6037/cap floor). $2309B/yr savings → Optimization Dividend.+$24,035/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 5 [EPA / Environment: Adopt South Korea's Approach](/opg/epa-environment-adopt-south-korea-s-approach) Grade B reallocate epa environment Reduce epa / environment spending to the cheapest high-performer floor. South Korea achieves Life Expectancy 83.57 at $6037/cap; United States gets 76.93 at $12848/cap. Current: United States spends $12848/cap, ranks 25/26. 2.1x overspend. → Target: South Korea model ($6037/cap floor). $2309B/yr savings → Optimization Dividend.+$24,035/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 6 [Shift Drug Policy from Criminal to Health Approach](/opg/shift-drug-policy-from-criminal-to-health-approach) Grade B implement health Decriminalize personal drug use, redirect enforcement budget to treatment. Based on Portugal (2001). Current: US spends $40B/yr on enforcement; 1.5M arrests/yr; overdose deaths at record highs → Target: Decriminalize personal use, redirect enforcement budget to treatment+$719/yr INCOME+42mo HALE HEALTH B EVIDENCE▼ -+- 7 [Transportation: Adopt Singapore's Approach](/opg/transportation-adopt-singapore-s-approach) Grade B reallocate transportation Reduce transportation spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 8 [HUD / Housing: Adopt Singapore's Approach](/opg/hud-housing-adopt-singapore-s-approach) Grade B reallocate hud housing Reduce hud / housing spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 9 [Foreign Aid / International Affairs: Adopt Singapore's Approach](/opg/foreign-aid-international-affairs-adopt-singapore-s-approach) Grade B reallocate foreign aid international affairs Reduce foreign aid / international affairs spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 10 [Labor: Adopt Singapore's Approach](/opg/labor-adopt-singapore-s-approach) Grade B reallocate labor Reduce labor spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 11 [Agriculture: Adopt Singapore's Approach](/opg/agriculture-adopt-singapore-s-approach) Grade B reallocate agriculture Reduce agriculture spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 12 [Treasury / General Government: Adopt Singapore's Approach](/opg/treasury-general-government-adopt-singapore-s-approach) Grade B reallocate treasury general government Reduce treasury / general government spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 13 [State Department / Diplomacy: Adopt Singapore's Approach](/opg/state-department-diplomacy-adopt-singapore-s-approach) Grade B reallocate state department diplomacy Reduce state department / diplomacy spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 14 [Interior / Natural Resources: Adopt Singapore's Approach](/opg/interior-natural-resources-adopt-singapore-s-approach) Grade B reallocate interior natural resources Reduce interior / natural resources spending to the cheapest high-performer floor. Singapore achieves After-Tax Median Income (PPP) 36844.31 at $7868/cap; United States gets 16287.22 at $12848/cap. Current: United States spends $12848/cap, ranks 23/26. 1.6x overspend. → Target: Singapore model ($7868/cap floor). $1688B/yr savings → Optimization Dividend.+$17,581/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 15 [Universal Pre-K (Ages 3-4)](/opg/universal-pre-k-ages-3-4) Grade A reallocate education Federally funded universal pre-K. Perry Preschool RCT shows $7-12 ROI per dollar over 40 years. Current: Only 34% of US 3-year-olds enrolled; varies wildly by state → Target: Federal funding for universal enrollment by age 3+$2,156/yr INCOME+12mo HALE HEALTH A EVIDENCE▼ -+- 16 [Military: Adopt Switzerland's Approach](/opg/military-adopt-switzerland-s-approach) Grade B reallocate military Reduce military spending to the cheapest high-performer floor. Switzerland achieves Life Expectancy 83.37 at $389/cap; United States gets 76.93 at $2052/cap. Current: United States spends $2052/cap, ranks 27/28. 5.3x overspend. → Target: Switzerland model ($389/cap floor). $564B/yr savings → Optimization Dividend.+$5,865/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 17 [Homeland Security: Adopt Switzerland's Approach](/opg/homeland-security-adopt-switzerland-s-approach) Grade B reallocate homeland security Reduce homeland security spending to the cheapest high-performer floor. Switzerland achieves Life Expectancy 83.37 at $389/cap; United States gets 76.93 at $2052/cap. Current: United States spends $2052/cap, ranks 27/28. 5.3x overspend. → Target: Switzerland model ($389/cap floor). $564B/yr savings → Optimization Dividend.+$5,865/yr INCOME+6mo HALE HEALTH B EVIDENCE▼ -+- 18 [Housing Supply Deregulation](/opg/housing-supply-deregulation) Grade B implement housing Remove restrictive zoning that constrains housing supply. Tokyo, Minneapolis, Oregon show reduced housing cost growth. Current: 75% of US residential land zoned single-family only → Target: Condition federal grants on local zoning reform+$719/yr INCOME+4mo HALE HEALTH B EVIDENCE▼ -+- 19 [Energy: Adopt Netherlands's Approach](/opg/energy-adopt-netherlands-s-approach) Grade B reallocate energy Reduce energy spending to the cheapest high-performer floor. Netherlands achieves After-Tax Median Income (PPP) 31221.39 at $1064/cap; United States gets 16287.22 at $1991/cap. Current: United States spends $1991/cap, ranks 25/28. 1.9x overspend. → Target: Netherlands model ($1064/cap floor). $314B/yr savings → Optimization Dividend.+$3,278/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 20 [Science / NASA: Adopt Netherlands's Approach](/opg/science-nasa-adopt-netherlands-s-approach) Grade B reallocate science nasa Reduce science / nasa spending to the cheapest high-performer floor. Netherlands achieves After-Tax Median Income (PPP) 31221.39 at $1064/cap; United States gets 16287.22 at $1991/cap. Current: United States spends $1991/cap, ranks 25/28. 1.9x overspend. → Target: Netherlands model ($1064/cap floor). $314B/yr savings → Optimization Dividend.+$3,278/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 21 [Commerce / Economic Development: Adopt Netherlands's Approach](/opg/commerce-economic-development-adopt-netherlands-s-approach) Grade B reallocate commerce economic development Reduce commerce / economic development spending to the cheapest high-performer floor. Netherlands achieves After-Tax Median Income (PPP) 31221.39 at $1064/cap; United States gets 16287.22 at $1991/cap. Current: United States spends $1991/cap, ranks 25/28. 1.9x overspend. → Target: Netherlands model ($1064/cap floor). $314B/yr savings → Optimization Dividend.+$3,278/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- 22 [Education: Adopt Japan's Approach](/opg/education-adopt-japan-s-approach) Grade B reallocate education Reduce education spending to the cheapest high-performer floor. Japan achieves PISA Math Score 536 at $1288/cap; United States gets 465 at $2996/cap. Current: United States spends $2996/cap, ranks 11/11. 2.3x overspend. → Target: Japan model ($1288/cap floor). $579B/yr savings → Optimization Dividend.+$6,023/yr INCOME+0mo HALE HEALTH B EVIDENCE▼ -+- Analysis date: 2026-04-06T06:40:06.290Z · Source: Optimitron OPG (Optimal Policy Generator) -+- EARTH OPTIMIZATION PRIZE -+#### THESE RECOMMENDATIONS NEED POLITICAL WILL TO IMPLEMENT. -+- The bottleneck is pluralistic ignorance — everyone wants evidence-based policy, nobody knows everyone else does. Deposit into the prize pool, recruit verified voters, earn VOTE Points. -+- [PLAY THE GAME](/prize) -diff --git a/packages/web/src/app/organizations/[id]/page.logged-out.md b/packages/web/src/app/organizations/[id]/page.logged-out.md -new file mode 100644 -index 000000000..e0000eae5 ---- /dev/null -+++ b/packages/web/src/app/organizations/[id]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /organizations/[id] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/organizations/page.logged-out.md b/packages/web/src/app/organizations/page.logged-out.md -new file mode 100644 -index 000000000..8c4b04882 ---- /dev/null -+++ b/packages/web/src/app/organizations/page.logged-out.md -@@ -0,0 +1,22 @@ -+# /organizations -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/orgs/[slug]/admin/reasoning/page.logged-out.md b/packages/web/src/app/orgs/[slug]/admin/reasoning/page.logged-out.md -new file mode 100644 -index 000000000..208bbf6f0 ---- /dev/null -+++ b/packages/web/src/app/orgs/[slug]/admin/reasoning/page.logged-out.md -@@ -0,0 +1,22 @@ -+# /orgs/[slug]/admin/reasoning -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/page.logged-out.md b/packages/web/src/app/page.logged-out.md -index 2e99ceb57..aba11fcea 100644 ---- a/packages/web/src/app/page.logged-out.md -+++ b/packages/web/src/app/page.logged-out.md -@@ -14,5 +14,5 @@ - ## Visible Page Copy - - ## PLEASE TAKE 30 SECONDS TO END WAR AND DISEASE --- Governments are paid $36 trillion a year to promote the general welfare. What allocation between military spending and clinical trials would best fulfill that duty? -+- You pay governments $36.5 trillion a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. What allocation between military spending and clinical trials would best fulfill that duty? - - SLIDE ME -diff --git a/packages/web/src/app/people/[id]/page.logged-out.md b/packages/web/src/app/people/[id]/page.logged-out.md -new file mode 100644 -index 000000000..39ff54327 ---- /dev/null -+++ b/packages/web/src/app/people/[id]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /people/[id] -+ -+## Metadata -+ -+- Page title: Person | International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: http://localhost:3001/people/%255Bid%255D/opengraph-image?3c96080bcb705a90 -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/people/[id]/page.tsx b/packages/web/src/app/people/[id]/page.tsx -index 231f770f2..a60d55dc2 100644 ---- a/packages/web/src/app/people/[id]/page.tsx -+++ b/packages/web/src/app/people/[id]/page.tsx -@@ -11,6 +11,7 @@ import { SortableTaskList } from "@/components/tasks/task-list-controls"; - import { YEARS_PER_AVERTED_DEATH } from "@/components/tasks/task-row"; - import { Avatar } from "@/components/retroui/Avatar"; - import { defaultButtonClassName } from "@/components/ui/default-button"; -+import { WelfareClaim } from "@/components/shared/WelfareClaim"; - import { isPublicOfficialPerson } from "@/lib/public-officials"; - import { - aggregateTaskDelayStats, -@@ -334,8 +335,8 @@ function RepresentedPersonProfile({ - > - {humanityVGovernmentLink.label} - -- . The claim is simple: governments were hired to promote the general -- welfare and spent the repair money on war. -+ . The claim is simple: They spent the repair -+ money on war. -

- -- Job: Promote General Welfare (i.e. maximize median health and -- wealth) -+ Job: -

- ) : null} - -diff --git a/packages/web/src/app/people/manage/page.tsx b/packages/web/src/app/people/manage/page.tsx -deleted file mode 100644 -index 219d4bd9a..000000000 ---- a/packages/web/src/app/people/manage/page.tsx -+++ /dev/null -@@ -1,27 +0,0 @@ --import { redirect } from "next/navigation"; --import { ROUTES } from "@/lib/routes"; -- --function appendSearchParams( -- params: Record, --) { -- const next = new URLSearchParams(); -- for (const [key, value] of Object.entries(params)) { -- if (Array.isArray(value)) { -- for (const item of value) { -- if (item) next.append(key, item); -- } -- } else if (value) { -- next.set(key, value); -- } -- } -- return next.toString(); --} -- --export default async function LegacyPeopleManagePage({ -- searchParams, --}: { -- searchParams?: Promise>; --}) { -- const qs = appendSearchParams((await searchParams) ?? {}); -- redirect(qs ? `${ROUTES.plaintiffsManage}?${qs}` : ROUTES.plaintiffsManage); --} -diff --git a/packages/web/src/app/plaintiffs/manage/page.tsx b/packages/web/src/app/plaintiffs/manage/page.tsx -index 0e2ce42c1..831d82385 100644 ---- a/packages/web/src/app/plaintiffs/manage/page.tsx -+++ b/packages/web/src/app/plaintiffs/manage/page.tsx -@@ -11,11 +11,11 @@ import { CourtCasePartyRole, PersonConditionStatus } from "@optimitron/db"; - import { PersonDeathCauseCategory } from "@optimitron/db/enums"; - import { ManageRepresentedPeopleClient } from "@/components/people/ManageRepresentedPeopleClient"; - import { ParameterValue } from "@/components/shared/ParameterValue"; -+import { WelfareClaim } from "@/components/shared/WelfareClaim"; - import { defaultButtonClassName } from "@/components/ui/default-button"; - import { authOptions } from "@/lib/auth"; - import { getSiteMetadata } from "@/lib/metadata"; - import { HUMANITY_V_GOVERNMENT_CASE_SLUG } from "@/lib/humanity-v-government-case.server"; --import { GOVERNMENTS_PAID_TO_PROMOTE_WELFARE } from "@/lib/people-parameters"; - import { splitDisplayNameIntoNameParts } from "@/lib/person-name"; - import { prisma } from "@/lib/prisma"; - import { -@@ -297,14 +297,7 @@ export default async function ManagePeoplePage({ - , the Court of Humanity class action. -

-

-- Humanity pays governments{" "} -- {" "} -- a year to promote the general welfare. Over the last century, they -- spent{" "} -+ Over the last century, they spent{" "} - -

-

-- You pay your governments{" "} -- {" "} -- to promote your general welfare. Since 1900 they spent{" "} -+ Since 1900 they spent{" "} - >; -+}) { -+ const paramsPromise: Promise> = -+ searchParams ?? Promise.resolve({}); -+ const [params, session] = await Promise.all([ -+ paramsPromise, -+ getServerSession(authOptions), -+ ]); -+ const referralCode = session?.user?.referralCode?.trim() || null; -+ const qrTarget = buildPosterQrTarget(referralCode); -+ const visibleTargetUrl = getVisibleTargetUrl(qrTarget); -+ const paperSize = normalizePaperSize(params.paper); -+ -+ return ( -+

-+ -+ -+
-+ -+
-+ -+ Letter -+ -+ -+ A4 -+ -+
-+
-+ -+
-+
-+

-+ {homeLink.tagline} -+

-+
-+ -+
-+ Humanity v. Government campaign image -+
-+ -+
-+
-+ -+
-+

-+ {visibleTargetUrl} -+

-+
-+
-+
-+ ); -+} -diff --git a/packages/web/src/app/poster/poster-client.tsx b/packages/web/src/app/poster/poster-client.tsx -new file mode 100644 -index 000000000..6e2edc2db ---- /dev/null -+++ b/packages/web/src/app/poster/poster-client.tsx -@@ -0,0 +1,28 @@ -+"use client"; -+ -+import { QRCodeSVG } from "qrcode.react"; -+ -+export function PosterPrintButton() { -+ return ( -+ -+ ); -+} -+ -+export function PosterQrCode({ value }: { value: string }) { -+ return ( -+ -+ ); -+} -diff --git a/packages/web/src/app/prize/page.logged-out.md b/packages/web/src/app/prize/page.logged-out.md -new file mode 100644 -index 000000000..4aebf953e ---- /dev/null -+++ b/packages/web/src/app/prize/page.logged-out.md -@@ -0,0 +1,73 @@ -+# /prize -+ -+## Metadata -+ -+- Page title: Prize | International Campaign to End War and Disease -+- Meta description: Rewards for measured outreach that gets more people to answer the Global Survey to End War and Disease. -+- Canonical: https://warondisease.org/prize -+- Open Graph title: Prize -+- Open Graph description: Rewards for measured outreach that gets more people to answer the Global Survey to End War and Disease. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fprize -+- Twitter title: Prize -+- Twitter description: Rewards for measured outreach that gets more people to answer the Global Survey to End War and Disease. -+ -+## Visible Page Copy -+ -+- FOR ENTERTAINMENT & EDUCATIONAL PURPOSES ONLY -+- The Earth Optimization Prize Fund is a concept currently seeking a foundation host. All return figures — including the projected 17% annual growth based on VC-sector diversification — are hypothetical projections, not guarantees. This is not financial advice, an investment offering, or a solicitation of funds. No returns are promised or guaranteed. Interested in learning more? Contact [hello@warondisease.org](mailto:hello@warondisease.org). -+- THE EARTH OPTIMIZATION GAME -+## INSERT COIN TO PLAY -+- A dominant assurance game with a projected 9.03x return if thresholds are missed. -+- All figures are projections based on VC-sector diversification — not promises. -+- GAME OVER: YOU LOSE -+- Humanity stays stupid. Metrics miss the targets after 15 years. Projected outcome: ~15.8% annual growth for 15 years (based on VC-sector diversification). -+- GAME OVER: YOU WIN -+- Humanity gets its act together. Your deposit stays in the prize pool. Your expected upside is $3.48 million more per capita lifetime income and 21.7 years extra healthy years. -+- Recruit voters too? You earn VOTE Points. VOTE Point holders claim proportional shares of the prize pool. Dominant assurance design. -+### WIN CONDITIONS -+- Two numbers. If both rise by 2040, the pool splits to VOTE Point holders. If not, depositors claim principal + projected growth. -+#### MEDIAN HEALTHY LIFE YEARS -+- NOW: 63.3 YEARS -+- TARGET: 85.0 YEARS -+- +21.7 years by 2040 -+#### MEDIAN REAL AFTER-TAX INCOME -+- NOW: $14,400 -+- TARGET: $76,700 -+- $14,400 → $76,700 by 2040 -+### INSERT COIN -+- Your deposit goes into the Earth Optimization Prize fund (projected 15.8% annually, based on VC-sector diversification). You get PRIZE shares. Recruit verified voters and you also earn VOTE Points, which would pay out if humanity wins. This is the first arcade game in history where the house loses on purpose. -+#### CONNECT WALLET -+- Connect your wallet. Your deposit would earn projected yield in the Earth Optimization Prize fund (based on VC-sector diversification) while it waits for your species to get its act together. -+- BROWSER WALLET (METAMASK) -+- WALLETCONNECT -+- Need a wallet? [Install MetaMask](https://metamask.io/download/) — it takes about 30 seconds. -+#### CONTRIBUTE TO THE PRIZE -+- The prize contract has not been deployed to this network yet. Switch to Base Sepolia once contracts are live. -+- AMOUNT (USDC) -+- CONTRIBUTE -+- $1 -+- $2 -+- $3 -+- $9999999999999999 -+### HOW TO PLAY -+#### DEPOSIT -+- Deposit USDC. You get PRIZE shares. Projected growth: 15.8% annually if the thresholds miss. -+#### RECRUIT -+- Share your referral link. Every verified voter you bring in earns you 1 VOTE Point. No deposit required. -+#### YOUR CITIZEN DASHBOARD -+- Sign in to track your impact, see your leaderboard rank, and get your referral link. Each verified vote you bring in = 2.6 lives saved + 53 years of suffering prevented. -+- [SIGN IN](/api/auth/signin) -+### TECHNICAL DETAILS -+#### TRUST & TRANSPARENCY -+#### CONTRACT ARCHITECTURE -+### GAME STATUS -+- 10 -+- 04 -+- 26 -+- 22 -+- 16 -+- 59 -+- Until the destructive economy reaches 50% of GDP — the point where stealing beats creating -+### PLAY THE GAME -+- The current cost of governance dysfunction is $101 trillion per year. The break-even probability is 0.0067%. You don't need to be altruistic. You just need to be numerate. -+- [INSERT COIN](#invest) -diff --git a/packages/web/src/app/profile/page.logged-out.md b/packages/web/src/app/profile/page.logged-out.md -new file mode 100644 -index 000000000..88655a87a ---- /dev/null -+++ b/packages/web/src/app/profile/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /profile -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/reasoning/embed/page.logged-out.md b/packages/web/src/app/reasoning/embed/page.logged-out.md -new file mode 100644 -index 000000000..4225e4aa3 ---- /dev/null -+++ b/packages/web/src/app/reasoning/embed/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /reasoning/embed -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### YOU LOVE SPECIFIC PEOPLE -+- One question, then five more, then you decide. If any one of the five is wrong, tell me which. You love specific people, and you don't want them to suffer or die from causes that could be prevented. -+- MY CONFIDENCE -+- 90% -+- YES -+- NO -+- END THIS -+- P(ALL) -+- 1.000 -+- LIVES/FWD -+- 0.26 -+- EV/FWD -+- $39K -+- RATIO -+- 652K : 1 -diff --git a/packages/web/src/app/reasoning/page.logged-out.md b/packages/web/src/app/reasoning/page.logged-out.md -new file mode 100644 -index 000000000..4fc6ff6bd ---- /dev/null -+++ b/packages/web/src/app/reasoning/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /reasoning -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+### YOU LOVE SPECIFIC PEOPLE -+- One question, then five more, then you decide. If any one of the five is wrong, tell me which. You love specific people, and you don't want them to suffer or die from causes that could be prevented. -+- MY CONFIDENCE -+- 90% -+- YES -+- NO -+- END THIS -+- P(ALL) -+- 1.000 -+- LIVES/FWD -+- 0.26 -+- EV/FWD -+- $39K -+- RATIO -+- 652K : 1 -diff --git a/packages/web/src/app/scoreboard/page.logged-out.md b/packages/web/src/app/scoreboard/page.logged-out.md -new file mode 100644 -index 000000000..aa4de84c2 ---- /dev/null -+++ b/packages/web/src/app/scoreboard/page.logged-out.md -@@ -0,0 +1,59 @@ -+# /scoreboard -+ -+## Metadata -+ -+- Page title: Humanity's Scoreboard | International Campaign to End War and Disease -+- Meta description: Two numbers: how long you live without disease and how much a normal person earns. Not GDP. Not billionaire wealth. The median. Everything else on this site exists to move these two numbers up. -+- Canonical: https://warondisease.org/scoreboard -+- Open Graph title: Humanity's Scoreboard -+- Open Graph description: Two numbers: how long you live without disease and how much a normal person earns. Not GDP. Not billionaire wealth. The median. Everything else on this site exists to move these two numbers up. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fscoreboard -+- Twitter title: Humanity's Scoreboard -+- Twitter description: Two numbers: how long you live without disease and how much a normal person earns. Not GDP. Not billionaire wealth. The median. Everything else on this site exists to move these two numbers up. -+ -+## Visible Page Copy -+ -+- THE EARTH OPTIMIZATION GAME -+## HIGH SCORES -+- The objective: redirect Earth's resources from the things making you poorest and deadest to the things that make you healthiest and wealthiest. The only way to lose is to not play. -+### THE TWO NUMBERS THAT MATTER -+- PLEASE SELECT AN EARTH -+- Projected 2040 values for the only two numbers that matter: how long you live in good health, and how much money you keep. Three scenarios — doing nothing, the 1% Treaty, or governance that actually optimises for humans. [See the full projections ↗](https://manual.warondisease.org/knowledge/economics/gdp-trajectories) -+- CURRENT (2025) -+- 1% TREATY (2040) -+- OPTIMAL GOVERNANCE (2040) -+- ❤️ HEALTHY LIFE YEARS -+- 63.3 -+- 85.0 -+- +21.7 yrs -+- 90.1 -+- +26.8 yrs -+- 💰 MEDIAN INCOME -+- $18,700 -+- $76,700 -+- 4x -+- $504,000 -+- 27x -+### WHY THERE'S A TIMER -+- The destructive economy (military + cybercrime) is growing at 15%/yr. Productive GDP grows at 3%/yr. At current rates, destruction hits 50% of GDP and the game is over. The treaty and optimal governance trajectories show what happens when you redirect resources. -+### LIVE GAME STATUS -+- grows at 9.03x over 15yr -+- of 4.13 billion target -+- 1 VOTE Point per verified voter recruited -+- 10 -+- 04 -+- 26 -+- 22 -+- 15 -+- 01 -+### HOW TO PLAY -+#### Deposit -+- Put your money in the machine. Get PRIZE shares. Projected growth is 9.03x over 15 years if the campaign misses its targets. -+#### Recruit -+- Share your link. Every verified voter you bring in earns you 1 VOTE Point. It's a referral chain where the thing at the top is not dying from preventable diseases. -+#### Score -+- 15 years later: metrics hit targets → VOTE holders split the pool. Metrics miss → depositors get ~9.03x back. Nobody loses. -+- On Wishonia, we solved this in year 12. You lot have been arguing about it for 4,237 years. The scoreboard makes the campaign size impossible to ignore. Updated in real time. Visible to everyone. The only question is whether you join before or after it becomes embarrassing not to. -+- [PLAY THE GAME](/prize) -+- [MAKE YOUR ALLOCATION](/agencies/dcongress/wishocracy) -+- [POLITICIAN LEADERBOARD](/politicians) -diff --git a/packages/web/src/app/search/page.logged-out.md b/packages/web/src/app/search/page.logged-out.md -new file mode 100644 -index 000000000..cd5833bca ---- /dev/null -+++ b/packages/web/src/app/search/page.logged-out.md -@@ -0,0 +1,28 @@ -+# /search -+ -+## Metadata -+ -+- Page title: Search | International Campaign to End War and Disease -+- Meta description: Search pages, tasks, and the manual. -+- Canonical: https://warondisease.org/search -+- Open Graph title: Search -+- Open Graph description: Search pages, tasks, and the manual. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fsearch -+- Twitter title: Search -+- Twitter description: Search pages, tasks, and the manual. -+ -+## Visible Page Copy -+ -+- SEARCH -+## Search Optimitron -+- Search site pages, tasks, and the manual index from one screen. -+- [treaty](/search?q=treaty) -+- [clinical trials](/search?q=clinical%20trials) -+- [politician alignment](/search?q=politician%20alignment) -+- [task signer](/search?q=task%20signer) -+- [government waste](/search?q=government%20waste) -+- [MCP](/search?q=MCP) -+### INDEXED SOURCES -+- Site pages from the shared route registry. -+- Tasks visible to the current user. -+- The published manual retrieval index. -diff --git a/packages/web/src/app/settings/page.logged-out.md b/packages/web/src/app/settings/page.logged-out.md -new file mode 100644 -index 000000000..7603c1b44 ---- /dev/null -+++ b/packages/web/src/app/settings/page.logged-out.md -@@ -0,0 +1,24 @@ -+# /settings -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+> Route returned HTTP 307; snapshot below captures the redirect target (typically the logged-out fallback page for an auth-required route). -+ -+### Sign In -+- Try Demo — No Account Needed -+- OR CREATE AN ACCOUNT -+- Continue with Google -+- OR USE EMAIL -+- EMAIL -+- Email Me a Sign-In Link -diff --git a/packages/web/src/app/signatories/page.logged-out.md b/packages/web/src/app/signatories/page.logged-out.md -index 7b17c9bc9..ef3cb2848 100644 ---- a/packages/web/src/app/signatories/page.logged-out.md -+++ b/packages/web/src/app/signatories/page.logged-out.md -@@ -24,9 +24,9 @@ - - [#3 Wishonia](/people/wishonia) 2.60 468,000 0 - - HUMANITY MANAGER · ASSIGNMENT 1 - ### TRADE ONE APOCALYPSE FOR 12.3× MORE CLINICAL TRIALS. --- You have been promoted to Humanity Manager at Earth Optimization Services LLC. Responsible for 8 billion humans. First task: get them to ratify the [1% Treaty](/treaty). -+- You have been promoted to Humanity Manager at Earth Optimization Services LLC. You now have 8 billion employees — humans you are responsible for getting to spend 30 seconds voting on the [1% Treaty](/treaty). - - Earth owns 12,200 nuclear warheads. 100 of them ends civilization. That is 122 apocalypses on the shelf. Spend one apocalypse on 12.3× more clinical trials and the disease-eradication timeline collapses from 443 years to 36. --- To get there: send the message below to two humans you love. They send it to two. 32 rounds reaches every adult on Earth. Getting humans to agree on one thing is the first step to any civilizational upgrade. You are responsible for this step. It cannot be completed without you. -+- You probably do not have time to persuade 8 billion humans yourself. Fortunately, you may hire subordinate humanity managers. Send the message below to two humans you love and they become your subordinate humanity managers. They hire two more. You earn one Earth Optimization Point per recruited voter, redeemable for a share of the [Earth Optimization Prize](/prize) once the referendum closes. After 32 doubling rounds, you are trying to get a majority of humans on Earth to agree to sacrifice one apocalypse for the 36-year disease-eradication timeline. It cannot be completed without you. - - I love you and don't want you to suffer and die of horrible diseases so please take 30 seconds to vote on this stupid treaty at http://127.0.0.1:3001/vote as it will reduce the likelihood you will suffer and die of horrible diseases. - - COPY TO CLIPBOARD - - [WHATSAPP](https://wa.me/?text=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20http%3A%2F%2F127.0.0.1%3A3001%2Fvote%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) -diff --git a/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md b/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md -new file mode 100644 -index 000000000..8b4715eea ---- /dev/null -+++ b/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /survey/[organizationSlug] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/survey/page.logged-out.md b/packages/web/src/app/survey/page.logged-out.md -new file mode 100644 -index 000000000..410486089 ---- /dev/null -+++ b/packages/web/src/app/survey/page.logged-out.md -@@ -0,0 +1,18 @@ -+# /survey -+ -+## Metadata -+ -+- Page title: Global Survey to End War and Disease | International Campaign to End War and Disease -+- Meta description: An educational survey about human values: should governments redirect 1% of military spending to pragmatic clinical trials and cut disease eradication from 443 years to 36? -+- Canonical: https://warondisease.org/survey -+- Open Graph title: Global Survey to End War and Disease -+- Open Graph description: An educational survey about human values: should governments redirect 1% of military spending to pragmatic clinical trials and cut disease eradication from 443 years to 36? -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fsurvey -+- Twitter title: Global Survey to End War and Disease -+- Twitter description: An educational survey about human values: should governments redirect 1% of military spending to pragmatic clinical trials and cut disease eradication from 443 years to 36? -+ -+## Visible Page Copy -+ -+## GLOBAL SURVEY TO END WAR AND DISEASE -+- You pay governments $36.5 trillion a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. What allocation between military spending and clinical trials would best fulfill that duty? -+- SLIDE ME -diff --git a/packages/web/src/app/tasks/[id]/page.logged-out.md b/packages/web/src/app/tasks/[id]/page.logged-out.md -new file mode 100644 -index 000000000..c387a0700 ---- /dev/null -+++ b/packages/web/src/app/tasks/[id]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /tasks/[id] -+ -+## Metadata -+ -+- Page title: Task Detail | Optimitron | International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: http://localhost:3001/tasks/%255Bid%255D/opengraph-image?1cc6c2fa7b31a7a6 -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/tools/page.logged-out.md b/packages/web/src/app/tools/page.logged-out.md -new file mode 100644 -index 000000000..88d6886b9 ---- /dev/null -+++ b/packages/web/src/app/tools/page.logged-out.md -@@ -0,0 +1,53 @@ -+# /tools -+ -+## Metadata -+ -+- Page title: Tools | International Campaign to End War and Disease -+- Meta description: Free tools for voting, evidence, budgets, policy, outreach, and task tracking. -+- Canonical: https://warondisease.org/tools -+- Open Graph title: Tools -+- Open Graph description: Free tools for voting, evidence, budgets, policy, outreach, and task tracking. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Ftools -+- Twitter title: Tools -+- Twitter description: Free tools for voting, evidence, budgets, policy, outreach, and task tracking. -+ -+## Visible Page Copy -+ -+- 25 TOOLS -+## THE ARMORY -+- Your toolkit for fixing the mess described above. Browse. Equip. Try not to break anything important. -+### ANALYSIS -+- [📋OPTIMAL POLICY GENERATOR Grade every policy A–F by what actually happened](/opg) -+- [💰OPTIMAL BUDGET GENERATOR Find the cheapest high performer per budget category](/obg) -+- [💀GOVERNMENT REPORT CARDS Every government ranked by who it keeps alive](/governments) -+- [🏛️POLITICIAN LEADERBOARD How your representatives actually vote vs what you want](/governments/US/politicians) -+- [🕹️HUMANITY'S SCOREBOARD Two numbers: disease-free lifespan and median income](/scoreboard) -+### HEALTH -+- [🧬OPTIMAL INSTITUTES OF HEALTH 97% clinical trials, 3% overhead — the exact mirror of your NIH](/agencies/dih) -+- [💊DECENTRALIZED FDA Real-time Outcome Labels & Treatment Rankings](/agencies/dfda) -+- [🩺CONDITIONS Find disease evidence](/agencies/dfda/conditions) -+- [💊TREATMENTS Compare treatment evidence](/agencies/dfda/treatments) -+### DEMOCRACY -+- [🗳️WISHOCRACY Pick between two things, ten times — outperform Congress](/agencies/dcongress/wishocracy) -+- [🏛️ALIGNMENT Find out which politicians accidentally agree with you](/agencies/dfec/alignment) -+- [🗳️REFERENDUMS Vote on things that matter — skip the middleman](/agencies/dcongress/referendums) -+### FINANCE -+- [🏆PRIZE Reward measured outreach](/prize) -+- [🤝INCENTIVE ALIGNMENT BONDS Lobbying, but it cures diseases instead of causing them](/iab) -+- [💸AUTOMATED TREASURY One currency, one tax, one safety net — no tax code required](/agencies/dtreasury) -+- [🏦ALGORITHMIC RESERVE 0% inflation anchored to productivity — new money via UBI, not banks](/agencies/dtreasury/dfed) -+- [🧾AUTOMATED REVENUE SERVICE Six lines of Solidity replace 74,000 pages of tax code](/agencies/dtreasury/dirs) -+- [🍞UNIVERSAL SECURITY ADMINISTRATION UBI replaces 83 welfare programs with one for-loop](/agencies/dtreasury/dssa) -+### TRANSPARENCY -+- [🔍DECENTRALIZED ACCOUNTABILITY OFFICE Every fund flow on IPFS — impossible to quietly delete](/agencies/dgao) -+### PLAYER -+- [🎯EARTH OPTIMIZATION TASKS What waiting costs](/tasks) -+- [🪪REMIND PRESIDENTS Remind presidents to promote the general welfare](/employees) -+- [📡TRANSMIT Thirty seconds — what you ate, how you slept, how you feel](/transmit) -+- [📊MANAGE HUMANITY Get humanity to agree](/dashboard) -+- [📋CENSUS Location, income, demographics - become a useful data point](/census) -+- [☀️CHECK-IN Thirty seconds a day of minimum viable self-awareness](/check-in) -+### STILL BROWSING? -+- The metrics won't move themselves. -+- [PLAY THE GAME](/prize) -+- [VIEW SCOREBOARD](/scoreboard) -diff --git a/packages/web/src/app/treatments/[treatmentSlug]/page.logged-out.md b/packages/web/src/app/treatments/[treatmentSlug]/page.logged-out.md -new file mode 100644 -index 000000000..6695f826a ---- /dev/null -+++ b/packages/web/src/app/treatments/[treatmentSlug]/page.logged-out.md -@@ -0,0 +1,30 @@ -+# /treatments/[treatmentSlug] -+ -+## Metadata -+ -+- Page title: International Campaign to End War and Disease -+- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Canonical: [missing] -+- Open Graph title: International Campaign to End War and Disease -+- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png -+- Twitter title: International Campaign to End War and Disease -+- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. -+ -+## Visible Page Copy -+ -+## 404 -+- PAGE NOT FOUND -+- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -+- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -+- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -+- WISHONIA DIAGNOSTIC REPORT -+- Problem: Page not found -+- Severity: Mildly embarrassing -+- Root cause: Human error (probability: 97.3%) -+- Recommended action: Click a button that actually goes somewhere -+- Time to resolve on my planet: 0.003 seconds -+- Estimated time on yours: Unclear. You still haven't fixed healthcare. -+- [RETURN TO EARTH](/) -+- [VIEW SCOREBOARD](/scoreboard) -+- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) -diff --git a/packages/web/src/app/treatments/page.logged-out.md b/packages/web/src/app/treatments/page.logged-out.md -new file mode 100644 -index 000000000..6e7ea41ae ---- /dev/null -+++ b/packages/web/src/app/treatments/page.logged-out.md -@@ -0,0 +1,986 @@ -+# /treatments -+ -+## Metadata -+ -+- Page title: Treatments | International Campaign to End War and Disease -+- Meta description: See which treatments have trial evidence, how many humans were tested, and whether they helped or merely had a confident name. -+- Canonical: https://warondisease.org/agencies/dfda/treatments -+- Open Graph title: Treatments -+- Open Graph description: See which treatments have trial evidence, how many humans were tested, and whether they helped or merely had a confident name. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fagencies%2Fdfda%2Ftreatments -+- Twitter title: Treatments -+- Twitter description: See which treatments have trial evidence, how many humans were tested, and whether they helped or merely had a confident name. -+ -+## Visible Page Copy -+ -+- DFDA -+## TREATMENTS -+- 969 treatments. Sorted by trials, participants, effectiveness, and safety. Radical concept: compare the evidence before swallowing things. -+- [YELLOW FEVER VACCINE (LIVE ATTENUATED) Used for 1 condition 14 TRIALS · 100M PARTICIPANTS](/agencies/dfda/treatments/yellow-fever-vaccine-live-attenuated) -+- [VACCINATIONS (INFLUENZA & PNEUMOCOCCAL) Used for 2 conditions 1,300 TRIALS · 10.5M PARTICIPANTS](/agencies/dfda/treatments/vaccinations-influenza-and-pneumococcal) -+- [MEASLES, MUMPS, AND RUBELLA (MMR) VACCINE Used for 1 condition 69 TRIALS · 10M PARTICIPANTS](/agencies/dfda/treatments/measles-mumps-and-rubella-mmr-vaccine) -+- [METFORMIN Used for 5 conditions 2,898 TRIALS · 7.5M PARTICIPANTS](/agencies/dfda/treatments/metformin) -+- [LEVOTHYROXINE Used for 2 conditions 143 TRIALS · 6M PARTICIPANTS](/agencies/dfda/treatments/levothyroxine) -+- [SURGICAL RESECTION Used for 4 conditions 872 TRIALS · 5.1M PARTICIPANTS](/agencies/dfda/treatments/surgical-resection) -+- [COMBINED ORAL CONTRACEPTIVES (COCS) Used for 2 conditions 51 TRIALS · 5.1M PARTICIPANTS](/agencies/dfda/treatments/combined-oral-contraceptives-cocs) -+- [HEPATITIS A VACCINE (POST-EXPOSURE PROPHYLAXIS) Used for 1 condition 200 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/hepatitis-a-vaccine-post-exposure-prophylaxis) -+- [SMOKING CESSATION Used for 1 condition 2,000 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/smoking-cessation) -+- [LIFESTYLE MODIFICATIONS (DIET, EXERCISE, SMOKING CESSATION) Used for 1 condition 2 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/lifestyle-modifications-diet-exercise-smoking-cessation) -+- [LAPAROSCOPIC CHOLECYSTECTOMY Used for 1 condition 139 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-cholecystectomy) -+- [ISONIAZID, RIFAMPICIN, PYRAZINAMIDE, ETHAMBUTOL (HRZE) FOLLOWED BY ISONIAZID, RIFAMPICIN (HR) REGIMEN Used for 1 condition 5,000 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/isoniazid-rifampicin-pyrazinamide-ethambutol-hrze-followed-by-isoniazid-rifampicin-hr-regimen) -+- [ORAL FERROUS SULFATE Used for 1 condition 137 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/oral-ferrous-sulfate) -+- [ACETAMINOPHEN (FOR FEVER AND PAIN) Used for 1 condition 1,500 TRIALS · 5M PARTICIPANTS](/agencies/dfda/treatments/acetaminophen-for-fever-and-pain) -+- [LISINOPRIL Used for 8 conditions 2,942 TRIALS · 3.3M PARTICIPANTS](/agencies/dfda/treatments/lisinopril) -+- [LIFESTYLE MODIFICATIONS (DIET & EXERCISE) Used for 2 conditions 10 TRIALS · 3M PARTICIPANTS](/agencies/dfda/treatments/lifestyle-modifications-diet-and-exercise) -+- [PREDNISONE Used for 7 conditions 107 TRIALS · 2.3M PARTICIPANTS](/agencies/dfda/treatments/prednisone) -+- [ALBENDAZOLE Used for 3 conditions 78 TRIALS · 2M PARTICIPANTS](/agencies/dfda/treatments/albendazole) -+- [INSULIN THERAPY (BASAL-BOLUS REGIMEN) Used for 1 condition 21 TRIALS · 2M PARTICIPANTS](/agencies/dfda/treatments/insulin-therapy-basal-bolus-regimen) -+- [SURGERY (WIDE LOCAL EXCISION/GLOSSECTOMY) Used for 1 condition 5,000 TRIALS · 2M PARTICIPANTS](/agencies/dfda/treatments/surgery-wide-local-excisionglossectomy) -+- [AZITHROMYCIN Used for 9 conditions 340 TRIALS · 1.8M PARTICIPANTS](/agencies/dfda/treatments/azithromycin) -+- [MEBENDAZOLE Used for 2 conditions 1,220 TRIALS · 1.8M PARTICIPANTS](/agencies/dfda/treatments/mebendazole) -+- [IVERMECTIN Used for 1 condition 4 TRIALS · 1.5M PARTICIPANTS](/agencies/dfda/treatments/ivermectin) -+- [HYDROCHLOROTHIAZIDE (THIAZIDE DIURETIC) Used for 1 condition 1 TRIALS · 1.5M PARTICIPANTS](/agencies/dfda/treatments/hydrochlorothiazide-thiazide-diuretic) -+- [RADIATION THERAPY (EXTERNAL BEAM) Used for 1 condition 5 TRIALS · 1.5M PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy-external-beam) -+- [LISINOPRIL (ACE INHIBITOR) Used for 3 conditions 802 TRIALS · 1.4M PARTICIPANTS](/agencies/dfda/treatments/lisinopril-ace-inhibitor) -+- [DOXYCYCLINE Used for 6 conditions 361 TRIALS · 1.3M PARTICIPANTS](/agencies/dfda/treatments/doxycycline) -+- [OMEPRAZOLE (PROTON PUMP INHIBITOR) Used for 3 conditions 5,071 TRIALS · 1.2M PARTICIPANTS](/agencies/dfda/treatments/omeprazole-proton-pump-inhibitor) -+- [STATINS (E.G., ATORVASTATIN) Used for 3 conditions 351 TRIALS · 1.1M PARTICIPANTS](/agencies/dfda/treatments/statins-eg-atorvastatin) -+- [OXYGEN THERAPY Used for 3 conditions 1,601 TRIALS · 1.1M PARTICIPANTS](/agencies/dfda/treatments/oxygen-therapy) -+- [ACETAMINOPHEN (PARACETAMOL) Used for 2 conditions 73 TRIALS · 1.1M PARTICIPANTS](/agencies/dfda/treatments/acetaminophen-paracetamol) -+- [BENZATHINE PENICILLIN G Used for 2 conditions 29 TRIALS · 1.1M PARTICIPANTS](/agencies/dfda/treatments/benzathine-penicillin-g) -+- [BRONCHODILATORS (E.G., SALBUTAMOL, TIOTROPIUM) Used for 2 conditions 1,150 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/bronchodilators-eg-salbutamol-tiotropium) -+- [SYMPTOMATIC MEDICATIONS (E.G., ANTIEMETICS, ANALGESICS) Used for 1 condition 500 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/symptomatic-medications-eg-antiemetics-analgesics) -+- [SUPPORTIVE CARE Used for 2 conditions 5,000 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/supportive-care) -+- [NSAIDS (E.G., DICLOFENAC, NAPROXEN) Used for 1 condition 1,000 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/nsaids-eg-diclofenac-naproxen) -+- [PYRANTEL PAMOATE Used for 1 condition 1 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/pyrantel-pamoate) -+- [ATORVASTATIN Used for 3 conditions 723 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/atorvastatin) -+- [DAILY MECHANICAL PLAQUE REMOVAL (BRUSHING & FLOSSING) Used for 1 condition 1 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/daily-mechanical-plaque-removal-brushing-and-flossing) -+- [FOLIC ACID SUPPLEMENTATION (PREVENTION) Used for 1 condition 1,000 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/folic-acid-supplementation-prevention) -+- [RADICAL INGUINAL ORCHIECTOMY Used for 1 condition 1 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/radical-inguinal-orchiectomy) -+- [TETANUS TOXOID VACCINE (E.G., TDAP, TD) Used for 1 condition 1,000 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/tetanus-toxoid-vaccine-eg-tdap-td) -+- [RED BLOOD CELL TRANSFUSIONS Used for 1 condition 24 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/red-blood-cell-transfusions) -+- [THYROIDECTOMY Used for 1 condition 195 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/thyroidectomy) -+- [HYSTERECTOMY (SURGICAL RESECTION) Used for 1 condition 41 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/hysterectomy-surgical-resection) -+- [HYSTERECTOMY Used for 1 condition 56 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/hysterectomy) -+- [SUPPORTIVE CARE (FOR ACTIVE INFECTION) Used for 1 condition 1,000 TRIALS · 1M PARTICIPANTS](/agencies/dfda/treatments/supportive-care-for-active-infection) -+- [METOPROLOL Used for 4 conditions 162 TRIALS · 800K PARTICIPANTS](/agencies/dfda/treatments/metoprolol) -+- [AMLODIPINE (DIHYDROPYRIDINE CCB) Used for 1 condition 2 TRIALS · 800K PARTICIPANTS](/agencies/dfda/treatments/amlodipine-dihydropyridine-ccb) -+- [ASPIRIN Used for 2 conditions 540 TRIALS · 700K PARTICIPANTS](/agencies/dfda/treatments/aspirin) -+- [ATORVASTATIN (STATIN THERAPY) Used for 2 conditions 25 TRIALS · 700K PARTICIPANTS](/agencies/dfda/treatments/atorvastatin-statin-therapy) -+- [PRAZIQUANTEL Used for 2 conditions 43 TRIALS · 508K PARTICIPANTS](/agencies/dfda/treatments/praziquantel) -+- [METHYLPHENIDATE (RITALIN, CONCERTA) Used for 1 condition 341 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/methylphenidate-ritalin-concerta) -+- [LAPAROSCOPIC APPENDECTOMY Used for 1 condition 141 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-appendectomy) -+- [OPEN APPENDECTOMY Used for 1 condition 56 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/open-appendectomy) -+- [INTENSIVE INSULIN THERAPY Used for 1 condition 500 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/intensive-insulin-therapy) -+- [LIFESTYLE MODIFICATIONS (SODIUM RESTRICTION, EXERCISE) Used for 1 condition 300 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/lifestyle-modifications-sodium-restriction-exercise) -+- [ACE INHIBITORS / ARBS (E.G., LISINOPRIL) Used for 1 condition 800 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/ace-inhibitors-arbs-eg-lisinopril) -+- [ORAL REHYDRATION THERAPY Used for 1 condition 1 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/oral-rehydration-therapy) -+- [INSULIN (BASAL) Used for 1 condition 392 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/insulin-basal) -+- [ORAL REHYDRATION SOLUTION (ORS) Used for 1 condition 2 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/oral-rehydration-solution-ors) -+- [CHLORTHALIDONE Used for 1 condition 89 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/chlorthalidone) -+- [VALSARTAN (ARB) Used for 1 condition 2 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/valsartan-arb) -+- [CHLOROQUINE PHOSPHATE Used for 1 condition 131 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/chloroquine-phosphate) -+- [ESTROGEN-PROGESTOGEN THERAPY (EPT) Used for 1 condition 1 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/estrogen-progestogen-therapy-ept) -+- [THERAPEUTIC LIFESTYLE CHANGES (DIET AND EXERCISE) Used for 1 condition 38 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/therapeutic-lifestyle-changes-diet-and-exercise) -+- [MITRAL VALVE REPAIR (SURGICAL) Used for 1 condition 1,500 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/mitral-valve-repair-surgical) -+- [PRIMARY CLEFT LIP REPAIR (CHEILOPLASTY) Used for 1 condition 5,000 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/primary-cleft-lip-repair-cheiloplasty) -+- [MICRONUTRIENT SUPPLEMENTATION Used for 1 condition 3 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/micronutrient-supplementation) -+- [D2 GASTRECTOMY (SURGERY) Used for 1 condition 95 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/d2-gastrectomy-surgery) -+- [LEVOTHYROXINE (TSH SUPPRESSION THERAPY) Used for 1 condition 6 TRIALS · 500K PARTICIPANTS](/agencies/dfda/treatments/levothyroxine-tsh-suppression-therapy) -+- [AMPHETAMINES (MIXED AMPHETAMINE SALTS, LISDEXAMFETAMINE) Used for 1 condition 7 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/amphetamines-mixed-amphetamine-salts-lisdexamfetamine) -+- [RADIATION THERAPY Used for 5 conditions 2,724 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy) -+- [BETA-BLOCKERS (E.G., METOPROLOL) Used for 1 condition 600 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/beta-blockers-eg-metoprolol) -+- [GLIMEPIRIDE (SULFONYLUREA) Used for 1 condition 61 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/glimepiride-sulfonylurea) -+- [AMLODIPINE Used for 1 condition 540 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/amlodipine) -+- [METOPROLOL SUCCINATE (BETA-BLOCKER) Used for 1 condition 1,000 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/metoprolol-succinate-beta-blocker) -+- [MITRAL VALVE REPLACEMENT (SURGICAL) Used for 1 condition 1,200 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/mitral-valve-replacement-surgical) -+- [PRIMARY CLEFT PALATE REPAIR (PALATOPLASTY) Used for 1 condition 4,000 TRIALS · 400K PARTICIPANTS](/agencies/dfda/treatments/primary-cleft-palate-repair-palatoplasty) -+- [LIVER TRANSPLANTATION Used for 5 conditions 6,055 TRIALS · 368K PARTICIPANTS](/agencies/dfda/treatments/liver-transplantation) -+- [VALSARTAN Used for 1 condition 258 TRIALS · 350K PARTICIPANTS](/agencies/dfda/treatments/valsartan) -+- [IMMUNOGLOBULIN (POST-EXPOSURE PROPHYLAXIS) Used for 1 condition 100 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/immunoglobulin-post-exposure-prophylaxis) -+- [INTRANASAL CORTICOSTEROIDS (INCS) Used for 1 condition 6 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/intranasal-corticosteroids-incs) -+- [ACE INHIBITORS (E.G., LISINOPRIL) Used for 2 conditions 1,000 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/ace-inhibitors-eg-lisinopril) -+- [ASPIRIN (LOW-DOSE) Used for 1 condition 66 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/aspirin-low-dose) -+- [ENDOSCOPIC RETROGRADE CHOLANGIOPANCREATOGRAPHY (ERCP) Used for 1 condition 33 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/endoscopic-retrograde-cholangiopancreatography-ercp) -+- [H. PYLORI ERADICATION THERAPY (E.G., AMOXICILLIN + CLARITHROMYCIN + OMEPRAZOLE) Used for 1 condition 3,000 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/h-pylori-eradication-therapy-eg-amoxicillin-clarithromycin-omeprazole) -+- [AMOXICILLIN Used for 2 conditions 19 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/amoxicillin) -+- [ORAL NSAIDS (E.G., IBUPROFEN, NAPROXEN) Used for 1 condition 1,500 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/oral-nsaids-eg-ibuprofen-naproxen) -+- [LEVODOPA (CARBIDOPA/LEVODOPA) Used for 1 condition 171 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/levodopa-carbidopalevodopa) -+- [LEUPROLIDE (ANDROGEN DEPRIVATION THERAPY - ADT) Used for 1 condition 79 TRIALS · 300K PARTICIPANTS](/agencies/dfda/treatments/leuprolide-androgen-deprivation-therapy-adt) -+- [DAPAGLIFLOZIN Used for 4 conditions 131 TRIALS · 295K PARTICIPANTS](/agencies/dfda/treatments/dapagliflozin) -+- [CEFTRIAXONE Used for 7 conditions 361 TRIALS · 288K PARTICIPANTS](/agencies/dfda/treatments/ceftriaxone) -+- [TOPICAL CORTICOSTEROIDS (E.G., CLOBETASOL PROPIONATE 0.05%) Used for 1 condition 1,000 TRIALS · 250K PARTICIPANTS](/agencies/dfda/treatments/topical-corticosteroids-eg-clobetasol-propionate-005percent) -+- [CLOPIDOGREL Used for 2 conditions 600 TRIALS · 250K PARTICIPANTS](/agencies/dfda/treatments/clopidogrel) -+- [IBUPROFEN Used for 2 conditions 14 TRIALS · 225K PARTICIPANTS](/agencies/dfda/treatments/ibuprofen) -+- [HEMATOPOIETIC STEM CELL TRANSPLANTATION (HSCT) Used for 2 conditions 164 TRIALS · 220K PARTICIPANTS](/agencies/dfda/treatments/hematopoietic-stem-cell-transplantation-hsct) -+- [LEVOFLOXACIN Used for 2 conditions 360 TRIALS · 215K PARTICIPANTS](/agencies/dfda/treatments/levofloxacin) -+- [TOPICAL RETINOIDS (E.G., ADAPALENE, TRETINOIN) Used for 1 condition 2,000 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/topical-retinoids-eg-adapalene-tretinoin) -+- [TAMOXIFEN (HORMONE THERAPY) Used for 1 condition 251 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/tamoxifen-hormone-therapy) -+- [SMOKING CESSATION (BEHAVIORAL THERAPY + PHARMACOTHERAPY) Used for 1 condition 500 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/smoking-cessation-behavioral-therapy-pharmacotherapy) -+- [STANDARD 6-MONTH REGIMEN (ISONIAZID, RIFAMPICIN, PYRAZINAMIDE, ETHAMBUTOL THEN ISONIAZID, RIFAMPICIN FOR ACTIVE TB) Used for 1 condition 500 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/standard-6-month-regimen-isoniazid-rifampicin-pyrazinamide-ethambutol-then-isoniazid-rifampicin-for-active-tb) -+- [ESOPHAGECTOMY (SURGERY) Used for 1 condition 195 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/esophagectomy-surgery) -+- [LATANOPROST Used for 1 condition 251 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/latanoprost) -+- [OPEN TENSION-FREE MESH REPAIR (LICHTENSTEIN TECHNIQUE) Used for 1 condition 1,000 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/open-tension-free-mesh-repair-lichtenstein-technique) -+- [LONG-TERM ANTIPLATELET THERAPY (ASPIRIN) Used for 1 condition 5 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/long-term-antiplatelet-therapy-aspirin) -+- [LISINOPRIL (BLOOD PRESSURE LOWERING) Used for 1 condition 200 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/lisinopril-blood-pressure-lowering) -+- [SUMATRIPTAN Used for 1 condition 103 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/sumatriptan) -+- [METOPROLOL (BETA-BLOCKER) Used for 1 condition 1 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/metoprolol-beta-blocker) -+- [SURGICAL AORTIC VALVE REPLACEMENT (SAVR) Used for 1 condition 800 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/surgical-aortic-valve-replacement-savr) -+- [MEDICAL MANAGEMENT / WATCHFUL WAITING Used for 1 condition 500 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/medical-management-watchful-waiting) -+- [METHADONE Used for 1 condition 124 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/methadone) -+- [ORTHODONTIC TREATMENT Used for 1 condition 2,000 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/orthodontic-treatment) -+- [PNEUMOCOCCAL CONJUGATE VACCINE (PCV) Used for 1 condition 2 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/pneumococcal-conjugate-vaccine-pcv) -+- [READY-TO-USE THERAPEUTIC FOOD (RUTF) Used for 1 condition 2 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/ready-to-use-therapeutic-food-rutf) -+- [CONTINUOUS POSITIVE AIRWAY PRESSURE (CPAP) Used for 1 condition 647 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/continuous-positive-airway-pressure-cpap) -+- [PLATINUM-BASED CHEMOTHERAPY (CISPLATIN + PEMETREXED) Used for 1 condition 1,000 TRIALS · 200K PARTICIPANTS](/agencies/dfda/treatments/platinum-based-chemotherapy-cisplatin-pemetrexed) -+- [METHOTREXATE Used for 4 conditions 823 TRIALS · 184K PARTICIPANTS](/agencies/dfda/treatments/methotrexate) -+- [TIMOLOL Used for 1 condition 266 TRIALS · 180K PARTICIPANTS](/agencies/dfda/treatments/timolol) -+- [ANTIPLATELET THERAPY (E.G., ASPIRIN) Used for 2 conditions 1,300 TRIALS · 180K PARTICIPANTS](/agencies/dfda/treatments/antiplatelet-therapy-eg-aspirin) -+- [ACYCLOVIR Used for 5 conditions 113 TRIALS · 175K PARTICIPANTS](/agencies/dfda/treatments/acyclovir) -+- [PULMONARY REHABILITATION Used for 4 conditions 1,267 TRIALS · 165K PARTICIPANTS](/agencies/dfda/treatments/pulmonary-rehabilitation) -+- [ADALIMUMAB Used for 5 conditions 620 TRIALS · 161K PARTICIPANTS](/agencies/dfda/treatments/adalimumab) -+- [COGNITIVE BEHAVIORAL THERAPY (CBT) Used for 8 conditions 2,916 TRIALS · 153K PARTICIPANTS](/agencies/dfda/treatments/cognitive-behavioral-therapy-cbt) -+- [DOXORUBICIN + CYCLOPHOSPHAMIDE + PACLITAXEL (AC-T CHEMOTHERAPY REGIMEN) Used for 1 condition 21 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/doxorubicin-cyclophosphamide-paclitaxel-ac-t-chemotherapy-regimen) -+- [SEMAGLUTIDE Used for 2 conditions 28 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/semaglutide) -+- [ANGIOTENSIN RECEPTOR BLOCKERS (E.G., LOSARTAN) Used for 1 condition 400 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/angiotensin-receptor-blockers-eg-losartan) -+- [BRONCHODILATORS (E.G., LAMA/LABA) Used for 1 condition 400 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/bronchodilators-eg-lamalaba) -+- [SURGICAL VENTRICULAR SEPTAL DEFECT (VSD) REPAIR Used for 1 condition 4 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/surgical-ventricular-septal-defect-vsd-repair) -+- [ARTIFICIAL TEARS Used for 1 condition 235 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/artificial-tears) -+- [URETEROSCOPY (URS) Used for 2 conditions 42 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/ureteroscopy-urs) -+- [CISPLATIN (WITH RADIATION THERAPY) Used for 1 condition 61 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/cisplatin-with-radiation-therapy) -+- [ARTEMETHER-LUMEFANTRINE Used for 1 condition 223 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/artemether-lumefantrine) -+- [MOHS MICROGRAPHIC SURGERY Used for 1 condition 4 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/mohs-micrographic-surgery) -+- [DIURETICS (E.G., FUROSEMIDE) FOR SYMPTOM MANAGEMENT Used for 1 condition 800 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/diuretics-eg-furosemide-for-symptom-management) -+- [SPEECH THERAPY Used for 1 condition 1,500 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/speech-therapy) -+- [NITROFURANTOIN Used for 2 conditions 51 TRIALS · 150K PARTICIPANTS](/agencies/dfda/treatments/nitrofurantoin) -+- [SERTRALINE (SSRI) Used for 3 conditions 332 TRIALS · 149K PARTICIPANTS](/agencies/dfda/treatments/sertraline-ssri) -+- [DEXAMETHASONE Used for 3 conditions 125 TRIALS · 140K PARTICIPANTS](/agencies/dfda/treatments/dexamethasone) -+- [CONCURRENT CHEMORADIATION (CISPLATIN-BASED) Used for 2 conditions 71 TRIALS · 130K PARTICIPANTS](/agencies/dfda/treatments/concurrent-chemoradiation-cisplatin-based) -+- [ERYTHROMYCIN Used for 3 conditions 93 TRIALS · 127K PARTICIPANTS](/agencies/dfda/treatments/erythromycin) -+- [PROPRANOLOL Used for 2 conditions 32 TRIALS · 125K PARTICIPANTS](/agencies/dfda/treatments/propranolol) -+- [EXCISIONAL HEMORRHOIDECTOMY Used for 1 condition 28 TRIALS · 120K PARTICIPANTS](/agencies/dfda/treatments/excisional-hemorrhoidectomy) -+- [PERCUTANEOUS NEPHROLITHOTOMY (PCNL) Used for 2 conditions 160 TRIALS · 120K PARTICIPANTS](/agencies/dfda/treatments/percutaneous-nephrolithotomy-pcnl) -+- [TRANSCATHETER AORTIC VALVE REPLACEMENT (TAVR) Used for 1 condition 550 TRIALS · 120K PARTICIPANTS](/agencies/dfda/treatments/transcatheter-aortic-valve-replacement-tavr) -+- [FLUTICASONE/SALMETEROL Used for 2 conditions 194 TRIALS · 115K PARTICIPANTS](/agencies/dfda/treatments/fluticasonesalmeterol) -+- [ETANERCEPT Used for 2 conditions 249 TRIALS · 110K PARTICIPANTS](/agencies/dfda/treatments/etanercept) -+- [VENLAFAXINE (SNRI) Used for 2 conditions 22 TRIALS · 110K PARTICIPANTS](/agencies/dfda/treatments/venlafaxine-snri) -+- [EXTERNAL BEAM RADIATION THERAPY (EBRT) Used for 4 conditions 144 TRIALS · 110K PARTICIPANTS](/agencies/dfda/treatments/external-beam-radiation-therapy-ebrt) -+- [INFLIXIMAB Used for 5 conditions 584 TRIALS · 101K PARTICIPANTS](/agencies/dfda/treatments/infliximab) -+- [RADIOFREQUENCY ABLATION (RFA) Used for 5 conditions 374 TRIALS · 101K PARTICIPANTS](/agencies/dfda/treatments/radiofrequency-ablation-rfa) -+- [MULTI-AGENT CHEMOTHERAPY (E.G., HYPER-CVAD REGIMEN) Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/multi-agent-chemotherapy-eg-hyper-cvad-regimen) -+- [ALLOGENEIC HEMATOPOIETIC STEM CELL TRANSPLANTATION (ALLO-HSCT) Used for 1 condition 100 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/allogeneic-hematopoietic-stem-cell-transplantation-allo-hsct) -+- [FLUTICASONE PROPIONATE Used for 1 condition 394 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/fluticasone-propionate) -+- [TRANSURETHRAL RESECTION OF THE PROSTATE (TURP) Used for 1 condition 86 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/transurethral-resection-of-the-prostate-turp) -+- [RADICAL HYSTERECTOMY Used for 1 condition 99 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/radical-hysterectomy) -+- [RADIATION THERAPY (EBRT + BRACHYTHERAPY) Used for 1 condition 101 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy-ebrt-brachytherapy) -+- [SURGICAL TETRALOGY OF FALLOT (TOF) REPAIR Used for 1 condition 10 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/surgical-tetralogy-of-fallot-tof-repair) -+- [LAMA MONOTHERAPY (E.G., TIOTROPIUM) Used for 1 condition 100 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/lama-monotherapy-eg-tiotropium) -+- [SEMAGLUTIDE (GLP-1 RECEPTOR AGONIST) Used for 1 condition 27 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/semaglutide-glp-1-receptor-agonist) -+- [ZINC SUPPLEMENTATION Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/zinc-supplementation) -+- [SURGICAL REPAIR OF CONGENITAL HEART DEFECTS Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/surgical-repair-of-congenital-heart-defects) -+- [SPECIAL EDUCATION SERVICES Used for 1 condition 300 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/special-education-services) -+- [ISONIAZID (INH) MONOTHERAPY (9 MONTHS FOR LATENT TB INFECTION) Used for 1 condition 300 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/isoniazid-inh-monotherapy-9-months-for-latent-tb-infection) -+- [LAPAROSCOPIC EXCISION SURGERY Used for 1 condition 42 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-excision-surgery) -+- [ANTIBIOTICS (E.G., PIPERACILLIN-TAZOBACTAM) Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/antibiotics-eg-piperacillin-tazobactam) -+- [FAMOTIDINE (H2 RECEPTOR BLOCKER) Used for 2 conditions 501 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/famotidine-h2-receptor-blocker) -+- [PROFESSIONAL DENTAL CLEANING (PROPHYLAXIS) Used for 1 condition 4 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/professional-dental-cleaning-prophylaxis) -+- [RADIOACTIVE IODINE (I-131) THERAPY Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/radioactive-iodine-i-131-therapy) -+- [TOTAL LARYNGECTOMY (SURGERY) Used for 1 condition 14 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/total-laryngectomy-surgery) -+- [AMOXICILLIN/CLAVULANATE Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/amoxicillinclavulanate) -+- [DIHYDROARTEMISININ-PIPERAQUINE Used for 1 condition 143 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/dihydroartemisinin-piperaquine) -+- [SURGERY (LIMB-SPARING RESECTION/AMPUTATION) Used for 1 condition 1,000 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/surgery-limb-sparing-resectionamputation) -+- [VENTRICULOPERITONEAL (VP) SHUNT PLACEMENT Used for 1 condition 500 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/ventriculoperitoneal-vp-shunt-placement) -+- [SURGICAL EXCISION Used for 1 condition 7 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/surgical-excision) -+- [ALENDRONATE Used for 1 condition 154 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/alendronate) -+- [SURGICAL CORRECTION (E.G., LYSIS OF ADHESIONS, RESECTION) Used for 1 condition 500 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/surgical-correction-eg-lysis-of-adhesions-resection) -+- [H. PYLORI ERADICATION (QUADRUPLE THERAPY) Used for 1 condition 14 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/h-pylori-eradication-quadruple-therapy) -+- [FAMOTIDINE (H2-RECEPTOR ANTAGONIST) Used for 1 condition 4 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/famotidine-h2-receptor-antagonist) -+- [DIETARY COUNSELING AND EDUCATION Used for 1 condition 1 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/dietary-counseling-and-education) -+- [ANTIBIOTICS (E.G., AMOXICILLIN, AZITHROMYCIN) Used for 1 condition 500 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/antibiotics-eg-amoxicillin-azithromycin) -+- [WEIGHT LOSS (LIFESTYLE MODIFICATION) Used for 1 condition 18 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/weight-loss-lifestyle-modification) -+- [EXTRACORPOREAL SHOCKWAVE LITHOTRIPSY (ESWL) Used for 1 condition 48 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/extracorporeal-shockwave-lithotripsy-eswl) -+- [VARICELLA VACCINE (CHICKENPOX VACCINE) Used for 1 condition 188 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/varicella-vaccine-chickenpox-vaccine) -+- [BLOOD PRESSURE CONTROL (E.G., LISINOPRIL) Used for 1 condition 500 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/blood-pressure-control-eg-lisinopril) -+- [LIFESTYLE MANAGEMENT (EXERCISE & DIET) Used for 1 condition 500 TRIALS · 100K PARTICIPANTS](/agencies/dfda/treatments/lifestyle-management-exercise-and-diet) -+- [VALACYCLOVIR Used for 3 conditions 69 TRIALS · 95K PARTICIPANTS](/agencies/dfda/treatments/valacyclovir) -+- [LAMOTRIGINE Used for 2 conditions 415 TRIALS · 85K PARTICIPANTS](/agencies/dfda/treatments/lamotrigine) -+- [CEPHALEXIN Used for 2 conditions 19 TRIALS · 85K PARTICIPANTS](/agencies/dfda/treatments/cephalexin) -+- [TOPIRAMATE Used for 4 conditions 70 TRIALS · 83K PARTICIPANTS](/agencies/dfda/treatments/topiramate) -+- [FUROSEMIDE Used for 2 conditions 101 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/furosemide) -+- [ORAL H1 ANTIHISTAMINES (2ND GENERATION) Used for 1 condition 1 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/oral-h1-antihistamines-2nd-generation) -+- [TIOTROPIUM Used for 2 conditions 64 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/tiotropium) -+- [PEMBROLIZUMAB Used for 4 conditions 1,183 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab) -+- [CATHETER-BASED ATRIAL SEPTAL DEFECT (ASD) CLOSURE Used for 1 condition 1 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/catheter-based-atrial-septal-defect-asd-closure) -+- [EMPAGLIFLOZIN (SGLT2 INHIBITOR) Used for 1 condition 69 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/empagliflozin-sglt2-inhibitor) -+- [SITAGLIPTIN (DPP-4 INHIBITOR) Used for 1 condition 91 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/sitagliptin-dpp-4-inhibitor) -+- [PROBIOTICS (LACTOBACILLUS RHAMNOSUS GG / SACCHAROMYCES BOULARDII) Used for 1 condition 500 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/probiotics-lactobacillus-rhamnosus-gg-saccharomyces-boulardii) -+- [METHIMAZOLE Used for 1 condition 31 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/methimazole) -+- [CARBAMAZEPINE Used for 1 condition 600 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/carbamazepine) -+- [MESALAMINE Used for 2 conditions 304 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/mesalamine) -+- [BARIATRIC SURGERY (E.G., GASTRIC BYPASS) Used for 1 condition 1 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/bariatric-surgery-eg-gastric-bypass) -+- [ALVEOLAR BONE GRAFTING (ABG) Used for 1 condition 800 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/alveolar-bone-grafting-abg) -+- [WEIGHT MANAGEMENT (DIET & EXERCISE) Used for 1 condition 16 TRIALS · 80K PARTICIPANTS](/agencies/dfda/treatments/weight-management-diet-and-exercise) -+- [LEVETIRACETAM Used for 2 conditions 184 TRIALS · 78K PARTICIPANTS](/agencies/dfda/treatments/levetiracetam) -+- [ISOTRETINOIN Used for 1 condition 45 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/isotretinoin) -+- [BEVACIZUMAB Used for 3 conditions 505 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/bevacizumab) -+- [TRASTUZUMAB (HER2-TARGETED THERAPY) Used for 1 condition 89 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/trastuzumab-her2-targeted-therapy) -+- [PEMBROLIZUMAB (IMMUNOTHERAPY) Used for 3 conditions 81 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-immunotherapy) -+- [SGLT2 INHIBITORS (E.G., DAPAGLIFLOZIN) Used for 2 conditions 55 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/sglt2-inhibitors-eg-dapagliflozin) -+- [FAMCICLOVIR Used for 3 conditions 17 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/famciclovir) -+- [ABVD (DOXORUBICIN, BLEOMYCIN, VINBLASTINE, DACARBAZINE) Used for 1 condition 48 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/abvd-doxorubicin-bleomycin-vinblastine-dacarbazine) -+- [VALPROATE Used for 1 condition 2 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/valproate) -+- [LAPAROSCOPIC TRANSABDOMINAL PREPERITONEAL (TAPP) OR TOTALLY EXTRAPERITONEAL (TEP) MESH REPAIR Used for 1 condition 1 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-transabdominal-preperitoneal-tapp-or-totally-extraperitoneal-tep-mesh-repair) -+- [ENDOVASCULAR REVASCULARIZATION (ANGIOPLASTY/STENTING) Used for 1 condition 3 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/endovascular-revascularization-angioplastystenting) -+- [WARFARIN Used for 1 condition 2 TRIALS · 75K PARTICIPANTS](/agencies/dfda/treatments/warfarin) -+- [APIXABAN Used for 1 condition 177 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/apixaban) -+- [PCSK9 INHIBITORS (E.G., EVOLOCUMAB) Used for 1 condition 50 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/pcsk9-inhibitors-eg-evolocumab) -+- [BETA-BLOCKERS (E.G., CARVEDILOL) Used for 1 condition 1 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/beta-blockers-eg-carvedilol) -+- [BRIMONIDINE Used for 1 condition 105 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/brimonidine) -+- [APIXABAN (ANTICOAGULATION FOR AFIB-RELATED STROKE) Used for 1 condition 10 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/apixaban-anticoagulation-for-afib-related-stroke) -+- [CETUXIMAB (TARGETED THERAPY) Used for 2 conditions 5 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/cetuximab-targeted-therapy) -+- [TRANSARTERIAL CHEMOEMBOLIZATION (TACE) Used for 4 conditions 450 TRIALS · 70K PARTICIPANTS](/agencies/dfda/treatments/transarterial-chemoembolization-tace) -+- [AMOXICILLIN-CLAVULANATE Used for 2 conditions 20 TRIALS · 65K PARTICIPANTS](/agencies/dfda/treatments/amoxicillin-clavulanate) -+- [ACETAMINOPHEN Used for 1 condition 2 TRIALS · 65K PARTICIPANTS](/agencies/dfda/treatments/acetaminophen) -+- [ORAL CONTRACEPTIVES (COMBINED ESTROGEN-PROGESTIN) Used for 1 condition 350 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/oral-contraceptives-combined-estrogen-progestin) -+- [LABA/ICS COMBINATION (E.G., FLUTICASONE/SALMETEROL) Used for 1 condition 1 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/labaics-combination-eg-fluticasonesalmeterol) -+- [SUCRALFATE Used for 2 conditions 500 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/sucralfate) -+- [DORZOLAMIDE Used for 1 condition 79 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/dorzolamide) -+- [OPEN REPAIR FOR UMBILICAL OR EPIGASTRIC HERNIA (MESH OR SUTURE) Used for 1 condition 400 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/open-repair-for-umbilical-or-epigastric-hernia-mesh-or-suture) -+- [RANIBIZUMAB Used for 1 condition 381 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/ranibizumab) -+- [PSYCHOSOCIAL SUPPORT & COUNSELING (E.G., CBT, CONTINGENCY MANAGEMENT) Used for 1 condition 400 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/psychosocial-support-and-counseling-eg-cbt-contingency-management) -+- [SECONDARY RHINOPLASTY / ORTHOGNATHIC SURGERY Used for 1 condition 600 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/secondary-rhinoplasty-orthognathic-surgery) -+- [READY-TO-USE SUPPLEMENTARY FOOD (RUSF) Used for 1 condition 1 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/ready-to-use-supplementary-food-rusf) -+- [HYDROXYUREA Used for 2 conditions 183 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/hydroxyurea) -+- [NAPROXEN Used for 1 condition 1 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/naproxen) -+- [TRIMETHOPRIM/SULFAMETHOXAZOLE Used for 1 condition 43 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/trimethoprimsulfamethoxazole) -+- [TRIMETHOPRIM-SULFAMETHOXAZOLE (TMP-SMX) Used for 1 condition 1 TRIALS · 60K PARTICIPANTS](/agencies/dfda/treatments/trimethoprim-sulfamethoxazole-tmp-smx) -+- [RUBBER BAND LIGATION Used for 1 condition 14 TRIALS · 55K PARTICIPANTS](/agencies/dfda/treatments/rubber-band-ligation) -+- [TOPICAL CALCINEURIN INHIBITORS (E.G., TACROLIMUS OINTMENT) Used for 2 conditions 370 TRIALS · 54K PARTICIPANTS](/agencies/dfda/treatments/topical-calcineurin-inhibitors-eg-tacrolimus-ointment) -+- [AMITRIPTYLINE Used for 5 conditions 53 TRIALS · 54K PARTICIPANTS](/agencies/dfda/treatments/amitriptyline) -+- [LITHIUM Used for 2 conditions 174 TRIALS · 51K PARTICIPANTS](/agencies/dfda/treatments/lithium) -+- [MIRTAZAPINE Used for 2 conditions 75 TRIALS · 51K PARTICIPANTS](/agencies/dfda/treatments/mirtazapine) -+- [DONEPEZIL Used for 3 conditions 221 TRIALS · 51K PARTICIPANTS](/agencies/dfda/treatments/donepezil) -+- [BENZOYL PEROXIDE Used for 1 condition 179 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/benzoyl-peroxide) -+- [LIVER TRANSPLANT Used for 1 condition 1,000 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/liver-transplant) -+- [CYTARABINE + DAUNORUBICIN ("7+3" INDUCTION CHEMOTHERAPY) Used for 1 condition 22 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/cytarabine-daunorubicin-73-induction-chemotherapy) -+- [HYDROCORTISONE Used for 1 condition 18 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/hydrocortisone) -+- [CARVEDILOL Used for 1 condition 150 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/carvedilol) -+- [ALLERGEN IMMUNOTHERAPY (AIT) Used for 1 condition 19 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/allergen-immunotherapy-ait) -+- [ALBUTEROL Used for 1 condition 475 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/albuterol) -+- [CATHETER ABLATION Used for 1 condition 869 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/catheter-ablation) -+- [TAMSULOSIN (ALPHA-BLOCKER) Used for 1 condition 19 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/tamsulosin-alpha-blocker) -+- [CARPAL TUNNEL RELEASE SURGERY Used for 1 condition 85 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/carpal-tunnel-release-surgery) -+- [LIRAGLUTIDE Used for 1 condition 100 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/liraglutide) -+- [DAPAGLIFLOZIN (SGLT2 INHIBITOR) Used for 1 condition 50 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/dapagliflozin-sglt2-inhibitor) -+- [FOLFOX (FLUOROURACIL, LEUCOVORIN, OXALIPLATIN) Used for 1 condition 56 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/folfox-fluorouracil-leucovorin-oxaliplatin) -+- [ARTERIAL SWITCH OPERATION (ASO) FOR TRANSPOSITION OF GREAT ARTERIES (TGA) Used for 1 condition 1 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/arterial-switch-operation-aso-for-transposition-of-great-arteries-tga) -+- [SURGICAL COARCTATION OF AORTA REPAIR Used for 1 condition 4 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/surgical-coarctation-of-aorta-repair) -+- [PONSETI METHOD FOR CLUBFOOT Used for 1 condition 8 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/ponseti-method-for-clubfoot) -+- [LAMA/LABA COMBINATION (E.G., UMECLIDINIUM/VILANTEROL) Used for 1 condition 50 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/lamalaba-combination-eg-umeclidiniumvilanterol) -+- [CLINICAL MONITORING AND EARLY INTERVENTION Used for 1 condition 100 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/clinical-monitoring-and-early-intervention) -+- [CONTINUOUS GLUCOSE MONITORING (CGM) Used for 1 condition 417 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/continuous-glucose-monitoring-cgm) -+- [LOPERAMIDE Used for 1 condition 6 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/loperamide) -+- [ORAL ANTIBIOTICS (E.G., CIPROFLOXACIN + METRONIDAZOLE) Used for 1 condition 1 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/oral-antibiotics-eg-ciprofloxacin-metronidazole) -+- [EARLY INTERVENTION PROGRAMS (COMPREHENSIVE DEVELOPMENTAL THERAPIES) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/early-intervention-programs-comprehensive-developmental-therapies) -+- [NARROWBAND UVB PHOTOTHERAPY Used for 2 conditions 19 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/narrowband-uvb-phototherapy) -+- [TIOTROPIUM (LAMA) Used for 1 condition 1 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/tiotropium-lama) -+- [SYSTEMIC CHEMOTHERAPY (E.G., FOLFOX/CAPOX) Used for 1 condition 3,000 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/systemic-chemotherapy-eg-folfoxcapox) -+- [URSODEOXYCHOLIC ACID (UDCA) Used for 1 condition 8 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/ursodeoxycholic-acid-udca) -+- [RADIATION THERAPY (ADJUVANT/PALLIATIVE) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy-adjuvantpalliative) -+- [VITAMIN D (FOR DEFICIENCY) Used for 1 condition 2 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/vitamin-d-for-deficiency) -+- [ACE INHIBITORS (LISINOPRIL) / ARBS (VALSARTAN) Used for 1 condition 100 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/ace-inhibitors-lisinopril-arbs-valsartan) -+- [RECOMBINANT FACTOR VIII Used for 1 condition 351 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/recombinant-factor-viii) -+- [SPIRONOLACTONE (MRA) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/spironolactone-mra) -+- [PROPYLTHIOURACIL (PTU) Used for 1 condition 2 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/propylthiouracil-ptu) -+- [SURGICAL SEPTAL MYECTOMY Used for 1 condition 13 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/surgical-septal-myectomy) -+- [BETA-BLOCKERS (E.G., METOPROLOL, PROPRANOLOL) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/beta-blockers-eg-metoprolol-propranolol) -+- [IODINE SUPPLEMENTATION (FOR IODINE DEFICIENCY) Used for 1 condition 300 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/iodine-supplementation-for-iodine-deficiency) -+- [OSELTAMIVIR Used for 1 condition 4 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/oseltamivir) -+- [HYDROXYCHLOROQUINE Used for 1 condition 38 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/hydroxychloroquine) -+- [AFLIBERCEPT Used for 1 condition 280 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/aflibercept) -+- [ATOVAQUONE-PROGUANIL Used for 1 condition 36 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/atovaquone-proguanil) -+- [MULTI-AGENT CHEMOTHERAPY (E.G., METHOTREXATE, DOXORUBICIN, CISPLATIN, IFOSFAMIDE) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/multi-agent-chemotherapy-eg-methotrexate-doxorubicin-cisplatin-ifosfamide) -+- [VANCOMYCIN Used for 1 condition 4 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/vancomycin) -+- [POSTNATAL MYELOMENINGOCELE REPAIR Used for 1 condition 4 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/postnatal-myelomeningocele-repair) -+- [DIURETIC THERAPY (E.G., FUROSEMIDE) Used for 1 condition 200 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/diuretic-therapy-eg-furosemide) -+- [BUPRENORPHINE/NALOXONE Used for 1 condition 115 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/buprenorphinenaloxone) -+- [EXERCISE AND PHYSICAL THERAPY Used for 1 condition 430 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/exercise-and-physical-therapy) -+- [INTRA-ARTICULAR CORTICOSTEROID INJECTIONS (IACI) Used for 1 condition 2 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/intra-articular-corticosteroid-injections-iaci) -+- [TYMPANOSTOMY TUBE INSERTION Used for 1 condition 60 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/tympanostomy-tube-insertion) -+- [CARBOPLATIN + PACLITAXEL Used for 1 condition 347 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/carboplatin-paclitaxel) -+- [INTRAVENOUS FLUID RESUSCITATION (E.G., LACTATED RINGER'S) Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/intravenous-fluid-resuscitation-eg-lactated-ringers) -+- [DOPAMINE AGONISTS (E.G., PRAMIPEXOLE, ROPINIROLE) Used for 1 condition 300 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/dopamine-agonists-eg-pramipexole-ropinirole) -+- [DOCETAXEL Used for 1 condition 509 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/docetaxel) -+- [THERAPEUTIC MILK (F-75, F-100) Used for 1 condition 1 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/therapeutic-milk-f-75-f-100) -+- [OXAMNIQUINE Used for 1 condition 100 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/oxamniquine) -+- [ORAL APPLIANCE THERAPY (OAT) Used for 1 condition 2 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/oral-appliance-therapy-oat) -+- [BEP CHEMOTHERAPY (BLEOMYCIN, ETOPOSIDE, CISPLATIN) Used for 1 condition 8 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/bep-chemotherapy-bleomycin-etoposide-cisplatin) -+- [RETROPERITONEAL LYMPH NODE DISSECTION (RPLND) Used for 1 condition 7 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/retroperitoneal-lymph-node-dissection-rplnd) -+- [RADIOACTIVE IODINE-131 (I-131) THERAPY Used for 1 condition 14 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/radioactive-iodine-131-i-131-therapy) -+- [CARBOPLATIN + ETOPOSIDE Used for 1 condition 500 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/carboplatin-etoposide) -+- [MYOMECTOMY Used for 1 condition 101 TRIALS · 50K PARTICIPANTS](/agencies/dfda/treatments/myomectomy) -+- [ADVANCED WOUND DRESSINGS (E.G., HYDROCOLLOIDS, FOAMS, ALGINATES) Used for 1 condition 400 TRIALS · 45K PARTICIPANTS](/agencies/dfda/treatments/advanced-wound-dressings-eg-hydrocolloids-foams-alginates) -+- [GABAPENTIN Used for 4 conditions 96 TRIALS · 45K PARTICIPANTS](/agencies/dfda/treatments/gabapentin) -+- [AZATHIOPRINE Used for 4 conditions 151 TRIALS · 45K PARTICIPANTS](/agencies/dfda/treatments/azathioprine) -+- [FOSFOMYCIN Used for 2 conditions 186 TRIALS · 45K PARTICIPANTS](/agencies/dfda/treatments/fosfomycin) -+- [TAMSULOSIN (MEDICAL EXPULSIVE THERAPY) Used for 1 condition 5 TRIALS · 45K PARTICIPANTS](/agencies/dfda/treatments/tamsulosin-medical-expulsive-therapy) -+- [PREGABALIN Used for 4 conditions 225 TRIALS · 41K PARTICIPANTS](/agencies/dfda/treatments/pregabalin) -+- [CIPROFLOXACIN Used for 3 conditions 301 TRIALS · 41K PARTICIPANTS](/agencies/dfda/treatments/ciprofloxacin) -+- [ORAL ANTIBIOTICS (E.G., DOXYCYCLINE) Used for 1 condition 400 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/oral-antibiotics-eg-doxycycline) -+- [LUNG TRANSPLANTATION Used for 2 conditions 302 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/lung-transplantation) -+- [AMIODARONE Used for 1 condition 150 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/amiodarone) -+- [QUETIAPINE Used for 1 condition 120 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/quetiapine) -+- [VALPROATE (DIVALPROEX) Used for 1 condition 120 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/valproate-divalproex) -+- [TRIMETHOPRIM-SULFAMETHOXAZOLE Used for 1 condition 10 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/trimethoprim-sulfamethoxazole) -+- [CLINDAMYCIN Used for 2 conditions 28 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/clindamycin) -+- [FOLFIRI (FLUOROURACIL, LEUCOVORIN, IRINOTECAN) Used for 1 condition 49 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/folfiri-fluorouracil-leucovorin-irinotecan) -+- [USTEKINUMAB Used for 4 conditions 304 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/ustekinumab) -+- [AZITHROMYCIN (FOR BACTERIAL DIARRHEA) Used for 1 condition 200 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/azithromycin-for-bacterial-diarrhea) -+- [FLUTICASONE/SALMETEROL (ICS/LABA COMBINATION) Used for 1 condition 80 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/fluticasonesalmeterol-icslaba-combination) -+- [SCLEROTHERAPY Used for 1 condition 14 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/sclerotherapy) -+- [CALCIUM CHANNEL BLOCKERS (E.G., VERAPAMIL, DILTIAZEM) Used for 1 condition 400 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/calcium-channel-blockers-eg-verapamil-diltiazem) -+- [LAPAROSCOPIC VENTRAL/INCISIONAL HERNIA REPAIR (WITH MESH) Used for 1 condition 250 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-ventralincisional-hernia-repair-with-mesh) -+- [PRIMAQUINE Used for 1 condition 120 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/primaquine) -+- [WATCHFUL WAITING / CARDIOVASCULAR RISK FACTOR MODIFICATION Used for 1 condition 100 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/watchful-waiting-cardiovascular-risk-factor-modification) -+- [TOPICAL NSAIDS (E.G., DICLOFENAC GEL) Used for 1 condition 200 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/topical-nsaids-eg-diclofenac-gel) -+- [OPIOID ANALGESICS (E.G., HYDROMORPHONE) Used for 1 condition 400 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/opioid-analgesics-eg-hydromorphone) -+- [ABIRATERONE ACETATE (WITH PREDNISONE) Used for 1 condition 194 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/abiraterone-acetate-with-prednisone) -+- [CEFALEXIN Used for 1 condition 300 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/cefalexin) -+- [ZOSTER VACCINE, RECOMBINANT, ADJUVANTED (SHINGRIX) Used for 1 condition 9 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/zoster-vaccine-recombinant-adjuvanted-shingrix) -+- [VENOUS STRIPPING AND LIGATION Used for 1 condition 13 TRIALS · 40K PARTICIPANTS](/agencies/dfda/treatments/venous-stripping-and-ligation) -+- [RITUXIMAB Used for 4 conditions 248 TRIALS · 37K PARTICIPANTS](/agencies/dfda/treatments/rituximab) -+- [TOFACITINIB Used for 3 conditions 182 TRIALS · 36K PARTICIPANTS](/agencies/dfda/treatments/tofacitinib) -+- [TEMOZOLOMIDE + RADIATION THERAPY Used for 1 condition 141 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/temozolomide-radiation-therapy) -+- [PRESSURE REDISTRIBUTION SURFACES (E.G., ALTERNATING PRESSURE MATTRESS) Used for 1 condition 300 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/pressure-redistribution-surfaces-eg-alternating-pressure-mattress) -+- [ELECTROCONVULSIVE THERAPY (ECT) Used for 1 condition 170 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/electroconvulsive-therapy-ect) -+- [DULOXETINE Used for 2 conditions 75 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/duloxetine) -+- [ZOLPIDEM Used for 1 condition 80 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/zolpidem) -+- [ENZALUTAMIDE Used for 1 condition 380 TRIALS · 35K PARTICIPANTS](/agencies/dfda/treatments/enzalutamide) -+- [SPIRONOLACTONE Used for 3 conditions 13 TRIALS · 33K PARTICIPANTS](/agencies/dfda/treatments/spironolactone) -+- [LEVOTHYROXINE + LIOTHYRONINE (COMBINATION THERAPY) Used for 2 conditions 58 TRIALS · 33K PARTICIPANTS](/agencies/dfda/treatments/levothyroxine-liothyronine-combination-therapy) -+- [CYCLOPHOSPHAMIDE Used for 2 conditions 151 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/cyclophosphamide) -+- [ATOMOXETINE Used for 1 condition 136 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/atomoxetine) -+- [LEUKOTRIENE RECEPTOR ANTAGONISTS (LTRAS) Used for 1 condition 200 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/leukotriene-receptor-antagonists-ltras) -+- [DULOXETINE (SNRI) Used for 2 conditions 6 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/duloxetine-snri) -+- [MONTELUKAST Used for 1 condition 178 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/montelukast) -+- [SOTALOL Used for 1 condition 40 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/sotalol) -+- [FINASTERIDE (5-ALPHA-REDUCTASE INHIBITOR) Used for 1 condition 13 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/finasteride-5-alpha-reductase-inhibitor) -+- [RADICAL CYSTECTOMY Used for 1 condition 270 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/radical-cystectomy) -+- [CORTICOSTEROIDS (SHORT-TERM ORAL) Used for 1 condition 150 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/corticosteroids-short-term-oral) -+- [CAPECITABINE (ORAL) Used for 1 condition 45 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/capecitabine-oral) -+- [FONTAN PROCEDURE Used for 1 condition 58 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/fontan-procedure) -+- [PAVLIK HARNESS FOR DEVELOPMENTAL DYSPLASIA OF THE HIP (DDH) Used for 1 condition 200 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/pavlik-harness-for-developmental-dysplasia-of-the-hip-ddh) -+- [RACECADOTRIL Used for 1 condition 150 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/racecadotril) -+- [CONCURRENT CHEMORADIATION Used for 1 condition 196 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/concurrent-chemoradiation) -+- [ANTACIDS (E.G., ALUMINUM HYDROXIDE/MAGNESIUM HYDROXIDE) Used for 1 condition 300 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/antacids-eg-aluminum-hydroxidemagnesium-hydroxide) -+- [LIFESTYLE MODIFICATIONS Used for 1 condition 5 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/lifestyle-modifications) -+- [CHLORHEXIDINE GLUCONATE MOUTHRINSE (0.12%) Used for 1 condition 4 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/chlorhexidine-gluconate-mouthrinse-012percent) -+- [SELECTIVE LASER TRABECULOPLASTY (SLT) Used for 1 condition 63 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/selective-laser-trabeculoplasty-slt) -+- [BETA-BLOCKERS (CARVEDILOL, METOPROLOL SUCCINATE) Used for 1 condition 16 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/beta-blockers-carvedilol-metoprolol-succinate) -+- [RECOMBINANT FACTOR IX Used for 1 condition 61 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/recombinant-factor-ix) -+- [TOTAL THYROIDECTOMY Used for 1 condition 12 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/total-thyroidectomy) -+- [ISOSORBIDE MONONITRATE Used for 1 condition 21 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/isosorbide-mononitrate) -+- [EXTRACORPOREAL SHOCK WAVE LITHOTRIPSY (ESWL) Used for 1 condition 43 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/extracorporeal-shock-wave-lithotripsy-eswl) -+- [SURGICAL REVASCULARIZATION (BYPASS SURGERY) Used for 1 condition 9 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/surgical-revascularization-bypass-surgery) -+- [AREDS2 FORMULA SUPPLEMENTS Used for 1 condition 1 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/areds2-formula-supplements) -+- [QUININE SULFATE + DOXYCYCLINE Used for 1 condition 1 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/quinine-sulfate-doxycycline) -+- [LOW-DOSE ASPIRIN Used for 1 condition 100 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/low-dose-aspirin) -+- [VITAMIN A SUPPLEMENTATION Used for 1 condition 1 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/vitamin-a-supplementation) -+- [CONCURRENT CHEMORADIOTHERAPY (CISPLATIN-BASED) Used for 1 condition 12 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/concurrent-chemoradiotherapy-cisplatin-based) -+- [5-FLUOROURACIL (TOPICAL) Used for 1 condition 2 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/5-fluorouracil-topical) -+- [ENDOSCOPIC RETROGRADE CHOLANGIOPANCREATOGRAPHY (ERCP) WITH SPHINCTEROTOMY AND STONE REMOVAL Used for 1 condition 7 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/endoscopic-retrograde-cholangiopancreatography-ercp-with-sphincterotomy-and-stone-removal) -+- [CONSERVATIVE MANAGEMENT (NPO, NG DECOMPRESSION, IV FLUIDS) Used for 1 condition 300 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/conservative-management-npo-ng-decompression-iv-fluids) -+- [ABATACEPT Used for 1 condition 139 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/abatacept) -+- [AQUEOUS CRYSTALLINE PENICILLIN G Used for 1 condition 300 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/aqueous-crystalline-penicillin-g) -+- [ACTIVE SURVEILLANCE (FOR STAGE I) Used for 1 condition 6 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/active-surveillance-for-stage-i) -+- [OSIMERTINIB Used for 1 condition 300 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/osimertinib) -+- [ORCHIOPEXY FOR CRYPTORCHIDISM Used for 1 condition 3 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/orchiopexy-for-cryptorchidism) -+- [CARBOPLATIN + PACLITAXEL (ADJUVANT/PALLIATIVE CHEMOTHERAPY) Used for 1 condition 200 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/carboplatin-paclitaxel-adjuvantpalliative-chemotherapy) -+- [UTERINE ARTERY EMBOLIZATION (UAE) Used for 1 condition 13 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/uterine-artery-embolization-uae) -+- [ENDOVENOUS LASER ABLATION (EVLA) Used for 1 condition 19 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/endovenous-laser-ablation-evla) -+- [ANTICOAGULATION (E.G., RIVAROXABAN) Used for 1 condition 150 TRIALS · 30K PARTICIPANTS](/agencies/dfda/treatments/anticoagulation-eg-rivaroxaban) -+- [SECUKINUMAB Used for 2 conditions 164 TRIALS · 28K PARTICIPANTS](/agencies/dfda/treatments/secukinumab) -+- [NIVOLUMAB Used for 3 conditions 193 TRIALS · 27K PARTICIPANTS](/agencies/dfda/treatments/nivolumab) -+- [OLANZAPINE Used for 3 conditions 108 TRIALS · 27K PARTICIPANTS](/agencies/dfda/treatments/olanzapine) -+- [FINERENONE Used for 2 conditions 22 TRIALS · 26K PARTICIPANTS](/agencies/dfda/treatments/finerenone) -+- [VEDOLIZUMAB Used for 3 conditions 367 TRIALS · 26K PARTICIPANTS](/agencies/dfda/treatments/vedolizumab) -+- [MYCOPHENOLATE MOFETIL Used for 2 conditions 181 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/mycophenolate-mofetil) -+- [COGNITIVE BEHAVIORAL THERAPY (CBT) FOR ADHD Used for 1 condition 63 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/cognitive-behavioral-therapy-cbt-for-adhd) -+- [INDACATEROL/GLYCOPYRRONIUM Used for 1 condition 100 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/indacaterolglycopyrronium) -+- [TOPICAL NASAL CORTICOSTEROIDS (E.G., FLUTICASONE PROPIONATE) Used for 1 condition 200 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/topical-nasal-corticosteroids-eg-fluticasone-propionate) -+- [BEVACIZUMAB (ADDED TO CHEMOTHERAPY) Used for 1 condition 2 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/bevacizumab-added-to-chemotherapy) -+- [ARNI (SACUBITRIL/VALSARTAN) Used for 1 condition 1 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/arni-sacubitrilvalsartan) -+- [SURGICAL RESECTION (PARTIAL HEPATECTOMY) Used for 1 condition 500 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/surgical-resection-partial-hepatectomy) -+- [SHOULDICE REPAIR (OPEN TISSUE REPAIR) Used for 1 condition 2 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/shouldice-repair-open-tissue-repair) -+- [COGNITIVE BEHAVIORAL THERAPY FOR INSOMNIA (CBT-I) Used for 1 condition 311 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/cognitive-behavioral-therapy-for-insomnia-cbt-i) -+- [ALTEPLASE (INTRAVENOUS THROMBOLYSIS) Used for 1 condition 108 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/alteplase-intravenous-thrombolysis) -+- [TAMSULOSIN Used for 1 condition 23 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/tamsulosin) -+- [BORTEZOMIB Used for 1 condition 591 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/bortezomib) -+- [PHOTODYNAMIC THERAPY (PDT) Used for 1 condition 6 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/photodynamic-therapy-pdt) -+- [PANCREATIC ENZYME REPLACEMENT THERAPY (PERT) Used for 1 condition 4 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/pancreatic-enzyme-replacement-therapy-pert) -+- [OPIOID-SPARING ANALGESIA (E.G., MULTIMODAL PAIN MANAGEMENT) Used for 1 condition 200 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/opioid-sparing-analgesia-eg-multimodal-pain-management) -+- [CLOMIPHENE CITRATE (FOR OVULATION INDUCTION) Used for 1 condition 45 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/clomiphene-citrate-for-ovulation-induction) -+- [FOLFOX CHEMOTHERAPY Used for 1 condition 65 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/folfox-chemotherapy) -+- [DEFERASIROX Used for 1 condition 49 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/deferasirox) -+- [DURVALUMAB Used for 1 condition 300 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/durvalumab) -+- [PSEUDOEPHEDRINE Used for 1 condition 24 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/pseudoephedrine) -+- [URETERAL REIMPLANTATION FOR VESICOURETERAL REFLUX (VUR) Used for 1 condition 400 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/ureteral-reimplantation-for-vesicoureteral-reflux-vur) -+- [SCLEROTHERAPY (FOAM/LIQUID) Used for 1 condition 4 TRIALS · 25K PARTICIPANTS](/agencies/dfda/treatments/sclerotherapy-foamliquid) -+- [RIVASTIGMINE Used for 2 conditions 58 TRIALS · 24K PARTICIPANTS](/agencies/dfda/treatments/rivastigmine) -+- [IXEKIZUMAB Used for 2 conditions 56 TRIALS · 23K PARTICIPANTS](/agencies/dfda/treatments/ixekizumab) -+- [NIRMATRELVIR/RITONAVIR (PAXLOVID) Used for 2 conditions 54 TRIALS · 23K PARTICIPANTS](/agencies/dfda/treatments/nirmatrelvirritonavir-paxlovid) -+- [PREDNISONE (CORTICOSTEROID) Used for 2 conditions 201 TRIALS · 22K PARTICIPANTS](/agencies/dfda/treatments/prednisone-corticosteroid) -+- [CEFTRIAXONE + AZITHROMYCIN (DUAL THERAPY) Used for 1 condition 160 TRIALS · 22K PARTICIPANTS](/agencies/dfda/treatments/ceftriaxone-azithromycin-dual-therapy) -+- [MAGNESIUM SULFATE Used for 2 conditions 21 TRIALS · 22K PARTICIPANTS](/agencies/dfda/treatments/magnesium-sulfate) -+- [DENOSUMAB Used for 1 condition 151 TRIALS · 22K PARTICIPANTS](/agencies/dfda/treatments/denosumab) -+- [MEMANTINE Used for 3 conditions 81 TRIALS · 22K PARTICIPANTS](/agencies/dfda/treatments/memantine) -+- [CEFIXIME Used for 2 conditions 12 TRIALS · 21K PARTICIPANTS](/agencies/dfda/treatments/cefixime) -+- [CYCLOSPORINE Used for 2 conditions 30 TRIALS · 21K PARTICIPANTS](/agencies/dfda/treatments/cyclosporine) -+- [BETAHISTINE Used for 2 conditions 13 TRIALS · 21K PARTICIPANTS](/agencies/dfda/treatments/betahistine) -+- [CONTINGENCY MANAGEMENT Used for 2 conditions 18 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/contingency-management) -+- [FLUDROCORTISONE Used for 1 condition 200 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/fludrocortisone) -+- [MOTIVATIONAL ENHANCEMENT THERAPY (MET) Used for 1 condition 27 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/motivational-enhancement-therapy-met) -+- [FLECAINIDE Used for 1 condition 48 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/flecainide) -+- [COMBINATION THERAPY (TAMSULOSIN + FINASTERIDE) Used for 1 condition 7 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/combination-therapy-tamsulosin-finasteride) -+- [ARIPIPRAZOLE Used for 1 condition 81 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/aripiprazole) -+- [BCG (BACILLUS CALMETTE-GUÉRIN) INTRAVESICAL THERAPY Used for 1 condition 24 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/bcg-bacillus-calmette-guerin-intravesical-therapy) -+- [CORTICOSTEROID INJECTION (E.G., METHYLPREDNISOLONE) Used for 1 condition 200 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/corticosteroid-injection-eg-methylprednisolone) -+- [IMATINIB Used for 1 condition 306 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/imatinib) -+- [CETUXIMAB (ADDED TO CHEMOTHERAPY, RAS WILD-TYPE) Used for 1 condition 150 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/cetuximab-added-to-chemotherapy-ras-wild-type) -+- [SURGICAL CORRECTION FOR CLUBFOOT Used for 1 condition 1 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/surgical-correction-for-clubfoot) -+- [TRIPLE THERAPY (LAMA/LABA/ICS, E.G., FLUTICASONE FUROATE/UMECLIDINIUM/VILANTEROL) Used for 1 condition 10 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/triple-therapy-lamalabaics-eg-fluticasone-furoateumeclidiniumvilanterol) -+- [REMDESIVIR Used for 1 condition 123 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/remdesivir) -+- [DEBRIDEMENT (SHARP, ENZYMATIC, AUTOLYTIC) Used for 1 condition 200 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/debridement-sharp-enzymatic-autolytic) -+- [INTRAVENOUS FLUID THERAPY (CRYSTALLOIDS) Used for 1 condition 50 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/intravenous-fluid-therapy-crystalloids) -+- [HIGH-FIBER DIET Used for 1 condition 3 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/high-fiber-diet) -+- [SPEECH-LANGUAGE THERAPY Used for 1 condition 5 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/speech-language-therapy) -+- [RIFAMPICIN (RIF) MONOTHERAPY (4 MONTHS FOR LATENT TB INFECTION) Used for 1 condition 25 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/rifampicin-rif-monotherapy-4-months-for-latent-tb-infection) -+- [LAPAROSCOPIC SALPINGECTOMY Used for 1 condition 8 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-salpingectomy) -+- [UMECLIDINIUM/VILANTEROL (LABA/LAMA COMBINATION) Used for 1 condition 50 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/umeclidiniumvilanterol-labalama-combination) -+- [GEMCITABINE + CISPLATIN Used for 1 condition 41 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/gemcitabine-cisplatin) -+- [MISOPROSTOL Used for 1 condition 200 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/misoprostol) -+- [NISSEN FUNDOPLICATION (LAPAROSCOPIC) Used for 1 condition 44 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/nissen-fundoplication-laparoscopic) -+- [ESSENTIAL OIL MOUTHRINSE (E.G., LISTERINE ANTISEPTIC) Used for 1 condition 200 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/essential-oil-mouthrinse-eg-listerine-antiseptic) -+- [SPECTINOMYCIN Used for 1 condition 100 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/spectinomycin) -+- [4-MONTH RIFAPENTINE-MOXIFLOXACIN-ISONIAZID-PYRAZINAMIDE (RPT-M-H-Z) REGIMEN Used for 1 condition 50 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/4-month-rifapentine-moxifloxacin-isoniazid-pyrazinamide-rpt-m-h-z-regimen) -+- [CLOFAZIMINE (AS COMPONENT OF XDR-TB REGIMEN) Used for 1 condition 100 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/clofazimine-as-component-of-xdr-tb-regimen) -+- [INTRAVENOUS IRON SUCROSE Used for 1 condition 46 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/intravenous-iron-sucrose) -+- [DUAL ANTIPLATELET THERAPY (ASPIRIN + CLOPIDOGREL) Used for 1 condition 29 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/dual-antiplatelet-therapy-aspirin-clopidogrel) -+- [RADIOFREQUENCY ABLATION (RFA) / MICROWAVE ABLATION (MWA) Used for 1 condition 300 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/radiofrequency-ablation-rfa-microwave-ablation-mwa) -+- [ERENUMAB Used for 1 condition 64 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/erenumab) -+- [CONVENTIONAL LONGER MDR-TB REGIMEN (INJECTABLE-CONTAINING) Used for 1 condition 100 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/conventional-longer-mdr-tb-regimen-injectable-containing) -+- [LENALIDOMIDE Used for 1 condition 599 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/lenalidomide) -+- [TRANSCATHETER EDGE-TO-EDGE REPAIR (TEER) Used for 1 condition 100 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/transcatheter-edge-to-edge-repair-teer) -+- [ZOLEDRONIC ACID Used for 1 condition 112 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/zoledronic-acid) -+- [WATCHFUL WAITING / SYMPTOMATIC TREATMENT (ANALGESICS/ANTIPYRETICS) Used for 1 condition 100 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/watchful-waiting-symptomatic-treatment-analgesicsantipyretics) -+- [EARLY ENTERAL NUTRITION (VIA NASOGASTRIC OR NASOJEJUNAL TUBE) Used for 1 condition 250 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/early-enteral-nutrition-via-nasogastric-or-nasojejunal-tube) -+- [DEEP BRAIN STIMULATION (DBS) Used for 1 condition 336 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/deep-brain-stimulation-dbs) -+- [ENDOVASCULAR COILING Used for 1 condition 17 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/endovascular-coiling) -+- [SURGICAL CLIPPING Used for 1 condition 19 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/surgical-clipping) -+- [RADIATION THERAPY (FOR SEMINOMA) Used for 1 condition 4 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy-for-seminoma) -+- [HYPOSPADIAS REPAIR Used for 1 condition 39 TRIALS · 20K PARTICIPANTS](/agencies/dfda/treatments/hypospadias-repair) -+- [ORAL NALTREXONE Used for 1 condition 14 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/oral-naltrexone) -+- [NEGATIVE PRESSURE WOUND THERAPY (NPWT) Used for 1 condition 19 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/negative-pressure-wound-therapy-npwt) -+- [CYCLOSPORINE OPHTHALMIC EMULSION Used for 1 condition 95 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/cyclosporine-ophthalmic-emulsion) -+- [DESICCATED THYROID EXTRACT (DTE) Used for 2 conditions 110 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/desiccated-thyroid-extract-dte) -+- [INTENSITY-MODULATED RADIATION THERAPY (IMRT) ALONE (FOR EARLY STAGE) Used for 1 condition 1 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/intensity-modulated-radiation-therapy-imrt-alone-for-early-stage) -+- [VENLAFAXINE Used for 1 condition 5 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/venlafaxine) -+- [ASPIRIN + ACETAMINOPHEN + CAFFEINE (COMBINATION) Used for 1 condition 150 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/aspirin-acetaminophen-caffeine-combination) -+- [PYELOPLASTY FOR URETEROPELVIC JUNCTION (UPJ) OBSTRUCTION Used for 1 condition 350 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/pyeloplasty-for-ureteropelvic-junction-upj-obstruction) -+- [LENVATINIB Used for 5 conditions 84 TRIALS · 18K PARTICIPANTS](/agencies/dfda/treatments/lenvatinib) -+- [ATEZOLIZUMAB + BEVACIZUMAB Used for 4 conditions 77 TRIALS · 17K PARTICIPANTS](/agencies/dfda/treatments/atezolizumab-bevacizumab) -+- [CEFTRIAXONE + DOXYCYCLINE (DUAL THERAPY) Used for 1 condition 110 TRIALS · 16K PARTICIPANTS](/agencies/dfda/treatments/ceftriaxone-doxycycline-dual-therapy) -+- [ESZOPICLONE Used for 1 condition 48 TRIALS · 16K PARTICIPANTS](/agencies/dfda/treatments/eszopiclone) -+- [SORAFENIB Used for 4 conditions 53 TRIALS · 16K PARTICIPANTS](/agencies/dfda/treatments/sorafenib) -+- [MYCOPHENOLATE MOFETIL (MMF) Used for 2 conditions 115 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/mycophenolate-mofetil-mmf) -+- [CORTICOSTEROIDS (E.G., PREDNISONE) Used for 2 conditions 125 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/corticosteroids-eg-prednisone) -+- [ACAMPROSATE Used for 1 condition 12 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/acamprosate) -+- [COMBINATION INTRANASAL CORTICOSTEROID + ANTIHISTAMINE Used for 1 condition 4 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/combination-intranasal-corticosteroid-antihistamine) -+- [GALANTAMINE Used for 1 condition 58 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/galantamine) -+- [ALPRAZOLAM (BENZODIAZEPINE) Used for 1 condition 35 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/alprazolam-benzodiazepine) -+- [RADIATION THERAPY (EXTERNAL BEAM RADIATION THERAPY - EBRT) Used for 1 condition 19 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/radiation-therapy-external-beam-radiation-therapy-ebrt) -+- [PALBOCICLIB (CDK4/6 INHIBITOR) Used for 1 condition 74 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/palbociclib-cdk46-inhibitor) -+- [NIGHT SPLINTING / WRIST BRACING Used for 1 condition 2 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/night-splinting-wrist-bracing) -+- [BUDESONIDE/GLYCOPYRRONIUM/FORMOTEROL Used for 1 condition 15 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/budesonideglycopyrroniumformoterol) -+- [DASATINIB Used for 1 condition 142 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/dasatinib) -+- [DUPILUMAB Used for 2 conditions 118 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/dupilumab) -+- [ROFLUMILAST (PDE4 INHIBITOR) Used for 1 condition 4 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/roflumilast-pde4-inhibitor) -+- [TOCILIZUMAB Used for 1 condition 86 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/tocilizumab) -+- [TRANSSPHENOIDAL SURGERY Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/transsphenoidal-surgery) -+- [SURGICAL SHUNT (E.G., VP SHUNT) Used for 1 condition 100 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/surgical-shunt-eg-vp-shunt) -+- [NUTRITIONAL SUPPORT (HIGH PROTEIN, VITAMIN C, ZINC) Used for 1 condition 180 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/nutritional-support-high-protein-vitamin-c-zinc) -+- [SGLT2 INHIBITOR (DAPAGLIFLOZIN) Used for 1 condition 14 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/sglt2-inhibitor-dapagliflozin) -+- [MINERALOCORTICOID RECEPTOR ANTAGONISTS (E.G., SPIRONOLACTONE) Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/mineralocorticoid-receptor-antagonists-eg-spironolactone) -+- [PENICILLIN G (OR PROCAINE PENICILLIN) Used for 1 condition 50 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/penicillin-g-or-procaine-penicillin) -+- [ELECTIVE COLECTOMY Used for 1 condition 5 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/elective-colectomy) -+- [PHYSICAL THERAPY Used for 1 condition 55 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/physical-therapy) -+- [OCCUPATIONAL THERAPY Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/occupational-therapy) -+- [LAPAROSCOPIC SALPINGOSTOMY Used for 1 condition 5 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/laparoscopic-salpingostomy) -+- [IMMUNOTHERAPY (E.G., PEMBROLIZUMAB, NIVOLUMAB) Used for 1 condition 300 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/immunotherapy-eg-pembrolizumab-nivolumab) -+- [AEROBIC EXERCISE Used for 1 condition 74 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/aerobic-exercise) -+- [PELVIC FLOOR MUSCLE TRAINING (PFMT) Used for 1 condition 2 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/pelvic-floor-muscle-training-pfmt) -+- [NSAIDS (E.G., INDOMETHACIN, NAPROXEN) Used for 1 condition 150 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/nsaids-eg-indomethacin-naproxen) -+- [SACUBITRIL/VALSARTAN Used for 1 condition 132 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/sacubitrilvalsartan) -+- [MINERALOCORTICOID RECEPTOR ANTAGONISTS (SPIRONOLACTONE) Used for 1 condition 10 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/mineralocorticoid-receptor-antagonists-spironolactone) -+- [DOPPLER-GUIDED HEMORRHOIDAL ARTERY LIGATION (DG-HAL) Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/doppler-guided-hemorrhoidal-artery-ligation-dg-hal) -+- [CISPLATIN-BASED CHEMOTHERAPY Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/cisplatin-based-chemotherapy) -+- [BEACOPP (BLEOMYCIN, ETOPOSIDE, DOXORUBICIN, CYCLOPHOSPHAMIDE, VINCRISTINE, PROCARBAZINE, PREDNISONE) Used for 1 condition 12 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/beacopp-bleomycin-etoposide-doxorubicin-cyclophosphamide-vincristine-procarbazine-prednisone) -+- [INTRAVENOUS FERRIC CARBOXYMALTOSE Used for 1 condition 100 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/intravenous-ferric-carboxymaltose) -+- [SUPERVISED EXERCISE THERAPY (SET) Used for 1 condition 150 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/supervised-exercise-therapy-set) -+- [SURGERY (PLEURECTOMY/DECORTICATION OR EXTRAPLEURAL PNEUMONECTOMY) + ADJUVANT THERAPY Used for 1 condition 1 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/surgery-pleurectomydecortication-or-extrapleural-pneumonectomy-adjuvant-therapy) -+- [RIMEGEPANT Used for 1 condition 45 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/rimegepant) -+- [DARATUMUMAB Used for 1 condition 293 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/daratumumab) -+- [INDUCTION CHEMOTHERAPY + CONCURRENT CHEMORADIOTHERAPY (CISPLATIN-BASED) Used for 1 condition 8 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/induction-chemotherapy-concurrent-chemoradiotherapy-cisplatin-based) -+- [RALOXIFENE Used for 1 condition 35 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/raloxifene) -+- [MAO-B INHIBITORS (E.G., RASAGILINE, SELEGILINE) Used for 1 condition 70 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/mao-b-inhibitors-eg-rasagiline-selegiline) -+- [NSAIDS (IBUPROFEN/NAPROXEN) Used for 1 condition 2 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/nsaids-ibuprofennaproxen) -+- [CHRONIC BLOOD TRANSFUSION THERAPY Used for 1 condition 16 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/chronic-blood-transfusion-therapy) -+- [ALECTINIB Used for 1 condition 200 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/alectinib) -+- [LEUPROLIDE (GNRH AGONIST) Used for 1 condition 4 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/leuprolide-gnrh-agonist) -+- [COMPRESSION STOCKINGS Used for 1 condition 46 TRIALS · 15K PARTICIPANTS](/agencies/dfda/treatments/compression-stockings) -+- [NIVOLUMAB + IPILIMUMAB Used for 3 conditions 139 TRIALS · 14K PARTICIPANTS](/agencies/dfda/treatments/nivolumab-ipilimumab) -+- [SALINE NASAL IRRIGATION Used for 2 conditions 40 TRIALS · 14K PARTICIPANTS](/agencies/dfda/treatments/saline-nasal-irrigation) -+- [AUTOLOGOUS STEM CELL TRANSPLANT (ASCT) Used for 2 conditions 122 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/autologous-stem-cell-transplant-asct) -+- [NILOTINIB Used for 1 condition 141 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/nilotinib) -+- [OMEGA-3 FATTY ACIDS (EPA/DHA) Used for 1 condition 9 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/omega-3-fatty-acids-epadha) -+- [METHOTREXATE (SYSTEMIC) Used for 1 condition 2 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/methotrexate-systemic) -+- [FIBER SUPPLEMENTS (E.G., PSYLLIUM) Used for 1 condition 120 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/fiber-supplements-eg-psyllium) -+- [ETHAMBUTOL (AS PART OF AN OPTIMIZED BACKGROUND REGIMEN FOR MDR-TB) Used for 1 condition 60 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/ethambutol-as-part-of-an-optimized-background-regimen-for-mdr-tb) -+- [CILOSTAZOL Used for 1 condition 4 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/cilostazol) -+- [PEMETREXED + CISPLATIN (OR CARBOPLATIN) Used for 1 condition 21 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/pemetrexed-cisplatin-or-carboplatin) -+- [ROMOSOZUMAB Used for 1 condition 30 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/romosozumab) -+- [LETROZOLE (FOR OVULATION INDUCTION) Used for 1 condition 28 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/letrozole-for-ovulation-induction) -+- [RADIUM-223 DICHLORIDE Used for 1 condition 76 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/radium-223-dichloride) -+- [GUSELKUMAB Used for 1 condition 61 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/guselkumab) -+- [SILDENAFIL Used for 1 condition 125 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/sildenafil) -+- [DEXTROMETHORPHAN Used for 1 condition 6 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/dextromethorphan) -+- [EPLEY MANEUVER Used for 1 condition 25 TRIALS · 12K PARTICIPANTS](/agencies/dfda/treatments/epley-maneuver) -+- [CEFIXIME + AZITHROMYCIN (DUAL THERAPY, ORAL ALTERNATIVE) Used for 1 condition 85 TRIALS · 11K PARTICIPANTS](/agencies/dfda/treatments/cefixime-azithromycin-dual-therapy-oral-alternative) -+- [UPADACITINIB Used for 2 conditions 41 TRIALS · 11K PARTICIPANTS](/agencies/dfda/treatments/upadacitinib) -+- [CARBIDOPA/LEVODOPA Used for 1 condition 55 TRIALS · 11K PARTICIPANTS](/agencies/dfda/treatments/carbidopalevodopa) -+- [SOFOSBUVIR/VELPATASVIR Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/sofosbuvirvelpatasvir) -+- [DASATINIB (FOR PH+ ALL) Used for 1 condition 35 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/dasatinib-for-ph-all) -+- [MELARSOPROL Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/melarsoprol) -+- [ALCOHOL ABSTINENCE Used for 1 condition 0 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/alcohol-abstinence) -+- [INTRANASAL ANTIHISTAMINES (E.G., AZELASTINE) Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/intranasal-antihistamines-eg-azelastine) -+- [BUSPIRONE Used for 1 condition 16 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/buspirone) -+- [OMALIZUMAB Used for 1 condition 112 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/omalizumab) -+- [LURASIDONE Used for 1 condition 31 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/lurasidone) -+- [GEMCITABINE + CISPLATIN CHEMOTHERAPY Used for 1 condition 112 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/gemcitabine-cisplatin-chemotherapy) -+- [NUTRITIONAL SUPPLEMENTATION (E.G., IRON, VITAMIN D, FOLATE, B12) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/nutritional-supplementation-eg-iron-vitamin-d-folate-b12) -+- [ROFLUMILAST Used for 1 condition 5 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/roflumilast) -+- [FLUDARABINE + CYCLOPHOSPHAMIDE + RITUXIMAB (FCR) Used for 1 condition 35 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/fludarabine-cyclophosphamide-rituximab-fcr) -+- [ENDOSCOPIC SINUS SURGERY (ESS) Used for 1 condition 12 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/endoscopic-sinus-surgery-ess) -+- [PROSTAGLANDIN E1 (ALPROSTADIL) INFUSION Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/prostaglandin-e1-alprostadil-infusion) -+- [SURGICAL REDUCTION AND OSTEOTOMY FOR DDH Used for 1 condition 150 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/surgical-reduction-and-osteotomy-for-ddh) -+- [SPINAL FUSION FOR CONGENITAL SCOLIOSIS Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/spinal-fusion-for-congenital-scoliosis) -+- [BARICITINIB Used for 1 condition 30 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/baricitinib) -+- [MOLNUPIRAVIR Used for 1 condition 22 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/molnupiravir) -+- [ESKETAMINE (NASAL SPRAY) Used for 1 condition 20 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/esketamine-nasal-spray) -+- [AUTOMATED INSULIN DELIVERY (AID) SYSTEMS Used for 1 condition 45 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/automated-insulin-delivery-aid-systems) -+- [ESOPHAGEAL ATRESIA REPAIR (PRIMARY ANASTOMOSIS) Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/esophageal-atresia-repair-primary-anastomosis) -+- [HIRSCHSPRUNG'S DISEASE PULL-THROUGH PROCEDURE Used for 1 condition 7 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/hirschsprungs-disease-pull-through-procedure) -+- [CONSERVATIVE MANAGEMENT (BOWEL REST/CLEAR LIQUID DIET) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/conservative-management-bowel-restclear-liquid-diet) -+- [THYROID HORMONE REPLACEMENT (LEVOTHYROXINE) FOR HYPOTHYROIDISM Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/thyroid-hormone-replacement-levothyroxine-for-hypothyroidism) -+- [3HP REGIMEN (ISONIAZID + RIFAPENTINE WEEKLY FOR 3 MONTHS FOR LATENT TB INFECTION) Used for 1 condition 15 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/3hp-regimen-isoniazid-rifapentine-weekly-for-3-months-for-latent-tb-infection) -+- [OXYGEN THERAPY (LONG-TERM) Used for 1 condition 2 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/oxygen-therapy-long-term) -+- [PENICILLIN G Used for 1 condition 6 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/penicillin-g) -+- [VANCOMYCIN + GENTAMICIN Used for 1 condition 2 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/vancomycin-gentamicin) -+- [DIENOGEST Used for 1 condition 37 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/dienogest) -+- [NSAIDS (IBUPROFEN, NAPROXEN) Used for 1 condition 20 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/nsaids-ibuprofen-naproxen) -+- [FOLIC ACID SUPPLEMENTATION Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/folic-acid-supplementation) -+- [DURVALUMAB + GEMCITABINE/CISPLATIN Used for 1 condition 5 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/durvalumab-gemcitabinecisplatin) -+- [VAGINAL PESSARIES Used for 1 condition 7 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/vaginal-pessaries) -+- [NATIVE TISSUE REPAIR (COLPORRHAPHY) Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/native-tissue-repair-colporrhaphy) -+- [VAGINAL ESTROGEN (TOPICAL) Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/vaginal-estrogen-topical) -+- [STANNOUS FLUORIDE (SNF2) TOOTHPASTE/MOUTHRINSE Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/stannous-fluoride-snf2-toothpastemouthrinse) -+- [FEBUXOSTAT Used for 1 condition 65 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/febuxostat) -+- [ALLOPURINOL Used for 1 condition 71 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/allopurinol) -+- [COLCHICINE Used for 2 conditions 46 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/colchicine) -+- [LOOP DIURETICS (FUROSEMIDE) Used for 1 condition 44 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/loop-diuretics-furosemide) -+- [DOXORUBICIN (AS PART OF MULTI-AGENT CHEMOTHERAPY) Used for 1 condition 200 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/doxorubicin-as-part-of-multi-agent-chemotherapy) -+- [LINEZOLID (AS COMPONENT OF XDR-TB REGIMEN) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/linezolid-as-component-of-xdr-tb-regimen) -+- [LINEZOLID (AS PART OF AN OPTIMIZED BACKGROUND REGIMEN FOR MDR-TB) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/linezolid-as-part-of-an-optimized-background-regimen-for-mdr-tb) -+- [CRYOTHERAPY (LIQUID NITROGEN) Used for 1 condition 11 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/cryotherapy-liquid-nitrogen) -+- [IMIQUIMOD Used for 1 condition 11 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/imiquimod) -+- [ALCOHOL SEPTAL ABLATION Used for 1 condition 8 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/alcohol-septal-ablation) -+- [RAMELTEON Used for 1 condition 49 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/ramelteon) -+- [TRIMETHOPRIM-SULFAMETHOXAZOLE (TMP-SMX) Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/trimethoprim-sulfamethoxazole-tmp-smx) -+- [INTRAVENOUS IRON DEXTRAN (HIGH MOLECULAR WEIGHT) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/intravenous-iron-dextran-high-molecular-weight) -+- [LINACLOTIDE Used for 1 condition 26 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/linaclotide) -+- [FARICIMAB Used for 1 condition 26 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/faricimab) -+- [AMPHOTERICIN B (LIPID FORMULATIONS) Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/amphotericin-b-lipid-formulations) -+- [UBROGEPANT Used for 1 condition 21 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/ubrogepant) -+- [BEDAQUILINE-BASED REGIMEN (LONGER COURSE) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-based-regimen-longer-course) -+- [CARFILZOMIB Used for 1 condition 219 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/carfilzomib) -+- [AUTOLOGOUS STEM CELL TRANSPLANTATION (ASCT) Used for 1 condition 144 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/autologous-stem-cell-transplantation-asct) -+- [NALTREXONE (EXTENDED-RELEASE INJECTABLE) Used for 1 condition 16 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/naltrexone-extended-release-injectable) -+- [PANCREATICODUODENECTOMY (WHIPPLE PROCEDURE) + ADJUVANT CHEMOTHERAPY Used for 1 condition 12 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/pancreaticoduodenectomy-whipple-procedure-adjuvant-chemotherapy) -+- [GEMCITABINE MONOTHERAPY Used for 1 condition 65 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/gemcitabine-monotherapy) -+- [ALVIMOPAN Used for 1 condition 25 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/alvimopan) -+- [COMT INHIBITORS (E.G., ENTACAPONE) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/comt-inhibitors-eg-entacapone) -+- [FLUOXETINE (SSRI) Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/fluoxetine-ssri) -+- [APREMILAST Used for 1 condition 94 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/apremilast) -+- [SYSTEMIC CHEMOTHERAPY (E.G., VEC REGIMEN) Used for 1 condition 150 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/systemic-chemotherapy-eg-vec-regimen) -+- [METRONIDAZOLE (TOPICAL) Used for 1 condition 9 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/metronidazole-topical) -+- [METRIFONATE Used for 1 condition 50 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/metrifonate) -+- [UVULOPALATOPHARYNGOPLASTY (UPPP) Used for 1 condition 8 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/uvulopalatopharyngoplasty-uppp) -+- [TRASTUZUMAB + CHEMOTHERAPY (FOR HER2-POSITIVE) Used for 1 condition 30 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/trastuzumab-chemotherapy-for-her2-positive) -+- [PROCAINE PENICILLIN G + PROBENECID Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/procaine-penicillin-g-probenecid) -+- [ADJUVANT CARBOPLATIN (FOR STAGE I SEMINOMA) Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/adjuvant-carboplatin-for-stage-i-seminoma) -+- [METRONIDAZOLE Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/metronidazole) -+- [BENZODIAZEPINES (E.G., DIAZEPAM, MIDAZOLAM) Used for 1 condition 100 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/benzodiazepines-eg-diazepam-midazolam) -+- [HEARING AIDS (FOR INDIVIDUALS WITH HEARING LOSS) Used for 1 condition 1 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/hearing-aids-for-individuals-with-hearing-loss) -+- [THIAZIDE DIURETICS (E.G., HYDROCHLOROTHIAZIDE FOR PREVENTION) Used for 1 condition 60 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/thiazide-diuretics-eg-hydrochlorothiazide-for-prevention) -+- [VAGINAL BRACHYTHERAPY Used for 1 condition 64 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/vaginal-brachytherapy) -+- [INTRAMUSCULAR COBALAMIN (CYANOCOBALAMIN/HYDROXOCOBALAMIN) Used for 1 condition 9 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/intramuscular-cobalamin-cyanocobalaminhydroxocobalamin) -+- [ORAL COBALAMIN (CYANOCOBALAMIN/METHYLCOBALAMIN) Used for 1 condition 11 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/oral-cobalamin-cyanocobalaminmethylcobalamin) -+- [TOPICAL CORTICOSTEROIDS (E.G., CLOBETASOL PROPIONATE) Used for 1 condition 200 TRIALS · 10K PARTICIPANTS](/agencies/dfda/treatments/topical-corticosteroids-eg-clobetasol-propionate) -+- [LIPOSOMAL DOXORUBICIN Used for 2 conditions 266 TRIALS · 9,500 PARTICIPANTS](/agencies/dfda/treatments/liposomal-doxorubicin) -+- [MEROPENEM Used for 2 conditions 81 TRIALS · 9,500 PARTICIPANTS](/agencies/dfda/treatments/meropenem) -+- [LOTEPREDNOL ETABONATE OPHTHALMIC SUSPENSION (SHORT-TERM) Used for 1 condition 60 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/loteprednol-etabonate-ophthalmic-suspension-short-term) -+- [SUVOREXANT Used for 1 condition 39 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/suvorexant) -+- [RIFAXIMIN Used for 1 condition 24 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/rifaximin) -+- [ONABOTULINUMTOXINA (BOTOX) Used for 1 condition 63 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/onabotulinumtoxina-botox) -+- [TOPICAL LIDOCAINE (5% PATCH) Used for 1 condition 7 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/topical-lidocaine-5percent-patch) -+- [TADALAFIL Used for 1 condition 44 TRIALS · 9,000 PARTICIPANTS](/agencies/dfda/treatments/tadalafil) -+- [VESTIBULAR REHABILITATION THERAPY Used for 1 condition 91 TRIALS · 8,500 PARTICIPANTS](/agencies/dfda/treatments/vestibular-rehabilitation-therapy) -+- [GLECAPREVIR/PIBRENTASVIR Used for 1 condition 3 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/glecaprevirpibrentasvir) -+- [SOFOSBUVIR/LEDIPASVIR Used for 1 condition 3 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/sofosbuvirledipasvir) -+- [TOPIRAMATE (OFF-LABEL) Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/topiramate-off-label) -+- [PHYSICAL THERAPY / OCCUPATIONAL THERAPY Used for 1 condition 2 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/physical-therapy-occupational-therapy) -+- [IBRUTINIB Used for 1 condition 172 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/ibrutinib) -+- [BOSUTINIB Used for 1 condition 43 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/bosutinib) -+- [COMBINATION THERAPY (ALBENDAZOLE + PRAZIQUANTEL + CORTICOSTEROIDS) Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/combination-therapy-albendazole-praziquantel-corticosteroids) -+- [SURGICAL RECONSTRUCTION (FLAPS, GRAFTS) Used for 1 condition 80 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/surgical-reconstruction-flaps-grafts) -+- [PRAMLINTIDE Used for 1 condition 38 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/pramlintide) -+- [POSTERIOR SAGITTAL ANORECTOPLASTY (PSARP) FOR IMPERFORATE ANUS Used for 1 condition 1 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/posterior-sagittal-anorectoplasty-psarp-for-imperforate-anus) -+- [MESALAZINE (5-ASA) Used for 1 condition 6 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/mesalazine-5-asa) -+- [SHORTER 4-MONTH REGIMEN (HIGH-DOSE RIFAPENTINE, ISONIAZID, PYRAZINAMIDE, MOXIFLOXACIN THEN HIGH-DOSE RIFAPENTINE, ISONIAZID, MOXIFLOXACIN FOR ACTIVE TB) Used for 1 condition 15 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/shorter-4-month-regimen-high-dose-rifapentine-isoniazid-pyrazinamide-moxifloxacin-then-high-dose-rifapentine-isoniazid-moxifloxacin-for-active-tb) -+- [LEUPROLIDE Used for 1 condition 28 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/leuprolide) -+- [LAPAROSCOPIC/ROBOTIC SACROCOLPOPEXY Used for 1 condition 6 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/laparoscopicrobotic-sacrocolpopexy) -+- [EXTENDED HALF-LIFE (EHL) RECOMBINANT FACTOR VIII Used for 1 condition 2 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/extended-half-life-ehl-recombinant-factor-viii) -+- [BRENTUXIMAB VEDOTIN + AVD (DOXORUBICIN, VINBLASTINE, DACARBAZINE) Used for 1 condition 19 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/brentuximab-vedotin-avd-doxorubicin-vinblastine-dacarbazine) -+- [SELENIUM SUPPLEMENTATION (ADJUNCTIVE FOR HASHIMOTO'S) Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/selenium-supplementation-adjunctive-for-hashimotos) -+- [RAPID REVERSAL OF ANTICOAGULATION Used for 1 condition 3 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/rapid-reversal-of-anticoagulation) -+- [ENDOVASCULAR THROMBECTOMY Used for 1 condition 229 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/endovascular-thrombectomy) -+- [POTASSIUM CITRATE Used for 1 condition 23 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/potassium-citrate) -+- [BROLUCIZUMAB Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/brolucizumab) -+- [STANDARDIZED SHORTER MDR-TB REGIMEN (SSR) Used for 1 condition 20 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/standardized-shorter-mdr-tb-regimen-ssr) -+- [DOCETAXEL + CISPLATIN + 5-FLUOROURACIL (TPF INDUCTION CHEMOTHERAPY) FOLLOWED BY CONCURRENT CHEMORADIOTHERAPY Used for 1 condition 3 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/docetaxel-cisplatin-5-fluorouracil-tpf-induction-chemotherapy-followed-by-concurrent-chemoradiotherapy) -+- [OLAPARIB Used for 1 condition 143 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/olaparib) -+- [EARLY MOBILIZATION/AMBULATION Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/early-mobilizationambulation) -+- [AMANTADINE Used for 1 condition 32 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/amantadine) -+- [TOPICAL CAPSAICIN (8% PATCH) Used for 1 condition 8 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/topical-capsaicin-8percent-patch) -+- [CLARITHROMYCIN Used for 1 condition 60 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/clarithromycin) -+- [COMBINED ORAL CONTRACEPTIVES (DROSPIRENONE/ETHINYL ESTRADIOL) Used for 1 condition 8 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/combined-oral-contraceptives-drospirenoneethinyl-estradiol) -+- [TREPROSTINIL (PARENTERAL/INHALED) Used for 1 condition 1 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/treprostinil-parenteralinhaled) -+- [DOXYCYCLINE (LOW-DOSE) Used for 1 condition 20 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/doxycycline-low-dose) -+- [TINNITUS RETRAINING THERAPY (TRT) Used for 1 condition 9 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/tinnitus-retraining-therapy-trt) -+- [ENDOSCOPIC VALVE ABLATION FOR POSTERIOR URETHRAL VALVES (PUV) Used for 1 condition 250 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/endoscopic-valve-ablation-for-posterior-urethral-valves-puv) -+- [POTASSIUM CITRATE (PREVENTION) Used for 1 condition 3 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/potassium-citrate-prevention) -+- [PEMBROLIZUMAB (MONOTHERAPY) Used for 1 condition 36 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-monotherapy) -+- [CYANOACRYLATE GLUE (VENASEAL) Used for 1 condition 50 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/cyanoacrylate-glue-venaseal) -+- [OPEN SURGICAL REVASCULARIZATION Used for 1 condition 1 TRIALS · 8,000 PARTICIPANTS](/agencies/dfda/treatments/open-surgical-revascularization) -+- [COGNITIVE BEHAVIORAL THERAPY (CBT) ADAPTED FOR ME/CFS Used for 1 condition 2 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/cognitive-behavioral-therapy-cbt-adapted-for-mecfs) -+- [DIPHTHERIA ANTITOXIN (DAT) Used for 1 condition 1 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/diphtheria-antitoxin-dat) -+- [MICRONIZED PURIFIED FLAVONOID FRACTION (MPFF) Used for 1 condition 2 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/micronized-purified-flavonoid-fraction-mpff) -+- [SURGICAL EXCISION / ELECTROCAUTERY / LASER ABLATION Used for 1 condition 2 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/surgical-excision-electrocautery-laser-ablation) -+- [DOXEPIN (LOW-DOSE) Used for 1 condition 35 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/doxepin-low-dose) -+- [INTRAVENOUS FERUMOXYTOL Used for 1 condition 11 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/intravenous-ferumoxytol) -+- [HYDROCHLOROTHIAZIDE + LOW SODIUM DIET Used for 1 condition 40 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/hydrochlorothiazide-low-sodium-diet) -+- [PAROXETINE (LOW-DOSE) Used for 1 condition 4 TRIALS · 7,500 PARTICIPANTS](/agencies/dfda/treatments/paroxetine-low-dose) -+- [BLINATUMOMAB Used for 1 condition 127 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/blinatumomab) -+- [GUANFACINE EXTENDED RELEASE Used for 1 condition 18 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/guanfacine-extended-release) -+- [DISULFIRAM Used for 2 conditions 48 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/disulfiram) -+- [ACALABRUTINIB Used for 1 condition 83 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/acalabrutinib) -+- [ORAL CORTICOSTEROIDS (SHORT COURSE) Used for 1 condition 1 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/oral-corticosteroids-short-course) -+- [REGORAFENIB Used for 1 condition 10 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/regorafenib) -+- [AZATHIOPRINE / MERCAPTOPURINE Used for 1 condition 40 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/azathioprine-mercaptopurine) -+- [NAFCILLIN/OXACILLIN Used for 1 condition 1 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/nafcillinoxacillin) -+- [CLOFAZIMINE (AS PART OF AN OPTIMIZED BACKGROUND REGIMEN FOR MDR-TB) Used for 1 condition 40 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/clofazimine-as-part-of-an-optimized-background-regimen-for-mdr-tb) -+- [LUBIPROSTONE Used for 1 condition 8 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/lubiprostone) -+- [HYDROCHLOROTHIAZIDE (HCTZ) Used for 1 condition 7 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/hydrochlorothiazide-hctz) -+- [STEREOTACTIC BODY RADIATION THERAPY (SBRT) Used for 2 conditions 169 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/stereotactic-body-radiation-therapy-sbrt) -+- [FEZOLINETANT Used for 1 condition 17 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/fezolinetant) -+- [GEMCITABINE + CISPLATIN (FOR RECURRENT/METASTATIC NPC) Used for 1 condition 21 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/gemcitabine-cisplatin-for-recurrentmetastatic-npc) -+- [BOSENTAN Used for 1 condition 73 TRIALS · 7,000 PARTICIPANTS](/agencies/dfda/treatments/bosentan) -+- [DACLATASVIR + SOFOSBUVIR Used for 1 condition 30 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/daclatasvir-sofosbuvir) -+- [GABAPENTIN (OFF-LABEL) Used for 1 condition 40 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/gabapentin-off-label) -+- [VENETOCLAX + OBINUTUZUMAB Used for 1 condition 45 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/venetoclax-obinutuzumab) -+- [LONG-TERM LOW-DOSE MACROLIDE ANTIBIOTICS (E.G., AZITHROMYCIN) Used for 1 condition 35 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/long-term-low-dose-macrolide-antibiotics-eg-azithromycin) -+- [LIFITEGRAST OPHTHALMIC SOLUTION Used for 1 condition 29 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/lifitegrast-ophthalmic-solution) -+- [EXPECTANT MANAGEMENT Used for 1 condition 8 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/expectant-management) -+- [SELENIUM SUPPLEMENTATION Used for 1 condition 4 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/selenium-supplementation) -+- [EXTENDED HALF-LIFE (EHL) RECOMBINANT FACTOR IX Used for 1 condition 40 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/extended-half-life-ehl-recombinant-factor-ix) -+- [TRICHLOROACETIC ACID (TCA) Used for 1 condition 4 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/trichloroacetic-acid-tca) -+- [LEMBOREXANT Used for 1 condition 21 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/lemborexant) -+- [OSMOTIC THERAPY (MANNITOL OR HYPERTONIC SALINE) Used for 1 condition 40 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/osmotic-therapy-mannitol-or-hypertonic-saline) -+- [ELUXADOLINE Used for 1 condition 7 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/eluxadoline) -+- [VESTIBULAR REHABILITATION THERAPY (VRT) Used for 1 condition 1 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/vestibular-rehabilitation-therapy-vrt) -+- [HIGH-DOSE MOXIFLOXACIN-BASED REGIMEN Used for 1 condition 40 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/high-dose-moxifloxacin-based-regimen) -+- [MACITENTAN Used for 1 condition 20 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/macitentan) -+- [AZELAIC ACID (TOPICAL) Used for 1 condition 14 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/azelaic-acid-topical) -+- [SOUND THERAPY (MASKING, NOTCHED SOUND, HABITUATION) Used for 1 condition 120 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/sound-therapy-masking-notched-sound-habituation) -+- [ENDOVASCULAR REVASCULARIZATION (ANGIOPLASTY & STENTING) Used for 1 condition 80 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/endovascular-revascularization-angioplasty-and-stenting) -+- [SODIUM STIBOGLUCONATE (SSG) Used for 1 condition 5 TRIALS · 6,000 PARTICIPANTS](/agencies/dfda/treatments/sodium-stibogluconate-ssg) -+- [SUMATRIPTAN (SUBCUTANEOUS) Used for 1 condition 55 TRIALS · 5,500 PARTICIPANTS](/agencies/dfda/treatments/sumatriptan-subcutaneous) -+- [TERIPARATIDE Used for 1 condition 131 TRIALS · 5,500 PARTICIPANTS](/agencies/dfda/treatments/teriparatide) -+- [MECLIZINE Used for 1 condition 2 TRIALS · 5,500 PARTICIPANTS](/agencies/dfda/treatments/meclizine) -+- [LIPOSOMAL AMPHOTERICIN B Used for 1 condition 18 TRIALS · 5,500 PARTICIPANTS](/agencies/dfda/treatments/liposomal-amphotericin-b) -+- [ZINC (LOZENGES/SYRUP) Used for 1 condition 22 TRIALS · 5,200 PARTICIPANTS](/agencies/dfda/treatments/zinc-lozengessyrup) -+- [PLASMA EXCHANGE Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/plasma-exchange) -+- [OMBITASVIR/PARITAPREVIR/RITONAVIR + DASABUVIR Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ombitasvirparitaprevirritonavir-dasabuvir) -+- [INOTUZUMAB OZOGAMICIN Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/inotuzumab-ozogamicin) -+- [GEMTUZUMAB OZOGAMICIN (GO) + CHEMOTHERAPY Used for 1 condition 21 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/gemtuzumab-ozogamicin-go-chemotherapy) -+- [DEHYDROEPIANDROSTERONE (DHEA) Used for 1 condition 2 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/dehydroepiandrosterone-dhea) -+- [PENTAMIDINE Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pentamidine) -+- [FAMILY-BASED TREATMENT (FBT) Used for 1 condition 27 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/family-based-treatment-fbt) -+- [ANTIBIOTIC THERAPY (FOR UNCOMPLICATED APPENDICITIS) Used for 1 condition 13 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/antibiotic-therapy-for-uncomplicated-appendicitis) -+- [UROLIFT SYSTEM (PROSTATIC URETHRAL LIFT) Used for 1 condition 5 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/urolift-system-prostatic-urethral-lift) -+- [PEMBROLIZUMAB (KEYTRUDA) Used for 1 condition 117 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-keytruda) -+- [TUMOR TREATING FIELDS (OPTUNE) Used for 1 condition 7 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/tumor-treating-fields-optune) -+- [LOMUSTINE Used for 1 condition 40 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/lomustine) -+- [RITUXIMAB WITH HYPER-CVAD/MA Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/rituximab-with-hyper-cvadma) -+- [ORAL CORTICOSTEROIDS (E.G., PREDNISONE) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/oral-corticosteroids-eg-prednisone) -+- [CISPLATIN + PACLITAXEL + BEVACIZUMAB Used for 1 condition 35 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/cisplatin-paclitaxel-bevacizumab) -+- [BENZNIDAZOLE Used for 1 condition 22 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/benznidazole) -+- [MATRIX MODEL Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/matrix-model) -+- [PEMBROLIZUMAB (FOR MSI-H/DMMR) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-for-msi-hdmmr) -+- [BISPHOSPHONATE THERAPY (E.G., PAMIDRONATE) FOR OSTEOGENESIS IMPERFECTA Used for 1 condition 100 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/bisphosphonate-therapy-eg-pamidronate-for-osteogenesis-imperfecta) -+- [LONG-TERM OXYGEN THERAPY (LTOT) Used for 1 condition 21 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/long-term-oxygen-therapy-ltot) -+- [BILATERAL ADRENALECTOMY Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/bilateral-adrenalectomy) -+- [SURGICAL EXCISION (PERICYSTECTOMY/CYSTECTOMY) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/surgical-excision-pericystectomycystectomy) -+- [RAMSTEDT PYLOROMYOTOMY FOR PYLORIC STENOSIS Used for 1 condition 200 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ramstedt-pyloromyotomy-for-pyloric-stenosis) -+- [INTESTINAL RESECTION AND ANASTOMOSIS FOR ATRESIA/STENOSIS Used for 1 condition 200 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/intestinal-resection-and-anastomosis-for-atresiastenosis) -+- [KASAI PORTOENTEROSTOMY FOR BILIARY ATRESIA Used for 1 condition 20 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/kasai-portoenterostomy-for-biliary-atresia) -+- [RIFAXIMIN (WITH FIBER SUPPLEMENT) Used for 1 condition 30 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/rifaximin-with-fiber-supplement) -+- [ALPHA-1 ANTITRYPSIN AUGMENTATION THERAPY Used for 1 condition 12 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/alpha-1-antitrypsin-augmentation-therapy) -+- [SURGICAL VALVE REPLACEMENT/REPAIR Used for 1 condition 2 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/surgical-valve-replacementrepair) -+- [ELAGOLIX Used for 1 condition 23 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/elagolix) -+- [LINEZOLID (AS PART OF REGIMENS) Used for 1 condition 40 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/linezolid-as-part-of-regimens) -+- [MILNACIPRAN Used for 1 condition 28 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/milnacipran) -+- [GENTAMICIN Used for 1 condition 3 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/gentamicin) -+- [PREDNISONE (SYSTEMIC CORTICOSTEROIDS) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/prednisone-systemic-corticosteroids) -+- [DESMOPRESSIN (DDAVP) Used for 1 condition 8 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/desmopressin-ddavp) -+- [BEDAQUILINE (AS PART OF A LONGER ORAL REGIMEN) Used for 1 condition 30 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-as-part-of-a-longer-oral-regimen) -+- [PODOFILOX Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/podofilox) -+- [PENTOSAN POLYSULFATE SODIUM Used for 1 condition 3 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pentosan-polysulfate-sodium) -+- [EXTERNAL VENTRICULAR DRAIN (EVD) FOR HYDROCEPHALUS Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/external-ventricular-drain-evd-for-hydrocephalus) -+- [INTENSIVE BLOOD PRESSURE LOWERING Used for 1 condition 8 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/intensive-blood-pressure-lowering) -+- [LOW FODMAP DIET Used for 1 condition 78 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/low-fodmap-diet) -+- [BELIMUMAB Used for 1 condition 63 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/belimumab) -+- [HIGH-DOSE CHEMOTHERAPY WITH STEM CELL RESCUE Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/high-dose-chemotherapy-with-stem-cell-rescue) -+- [DABRAFENIB + TRAMETINIB Used for 1 condition 18 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/dabrafenib-trametinib) -+- [VEMURAFENIB + COBIMETINIB Used for 1 condition 8 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/vemurafenib-cobimetinib) -+- [LABETALOL Used for 1 condition 200 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/labetalol) -+- [DURVALUMAB + TREMELIMUMAB Used for 1 condition 6 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/durvalumab-tremelimumab) -+- [DELAMANID-BASED REGIMEN (LONGER COURSE) Used for 1 condition 30 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/delamanid-based-regimen-longer-course) -+- [OCRELIZUMAB Used for 1 condition 121 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ocrelizumab) -+- [PEMBROLIZUMAB (FOR RECURRENT/METASTATIC NPC) Used for 1 condition 3 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-for-recurrentmetastatic-npc) -+- [POSTERIOR FOSSA DECOMPRESSION (FOR SYMPTOMATIC CHIARI II) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/posterior-fossa-decompression-for-symptomatic-chiari-ii) -+- [NALTREXONE (ORAL) Used for 1 condition 16 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/naltrexone-oral) -+- [NIRAPARIB Used for 1 condition 95 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/niraparib) -+- [CHLORAMPHENICOL Used for 1 condition 20 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/chloramphenicol) -+- [CO-TRIMOXAZOLE (TRIMETHOPRIM-SULFAMETHOXAZOLE) Used for 1 condition 25 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/co-trimoxazole-trimethoprim-sulfamethoxazole) -+- [ORAL IRON SUPPLEMENTATION (EFFECTIVE IF IRON DEFICIENT) Used for 1 condition 30 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/oral-iron-supplementation-effective-if-iron-deficient) -+- [PRAMIPEXOLE Used for 1 condition 30 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/pramipexole) -+- [ROPINIROLE Used for 1 condition 25 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ropinirole) -+- [IVERMECTIN (TOPICAL) Used for 1 condition 6 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ivermectin-topical) -+- [VASCULAR LASER / IPL THERAPY Used for 1 condition 1 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/vascular-laser-ipl-therapy) -+- [TRIBENDIMIDINE Used for 1 condition 20 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/tribendimidine) -+- [HYPOGLOSSAL NERVE STIMULATION (HGNS) Used for 1 condition 14 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/hypoglossal-nerve-stimulation-hgns) -+- [POSITIONAL THERAPY Used for 1 condition 28 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/positional-therapy) -+- [FLOT CHEMOTHERAPY Used for 1 condition 46 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/flot-chemotherapy) -+- [RAMUCIRUMAB + PACLITAXEL (SECOND-LINE) Used for 1 condition 16 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ramucirumab-paclitaxel-second-line) -+- [VENTRICULAR DRAINAGE (EVD) Used for 1 condition 16 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/ventricular-drainage-evd) -+- [BLOOD PRESSURE CONTROL (E.G., NICARDIPINE IV) Used for 1 condition 20 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/blood-pressure-control-eg-nicardipine-iv) -+- [TETANUS IMMUNE GLOBULIN (TIG) Used for 1 condition 8 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/tetanus-immune-globulin-tig) -+- [RECONSTRUCTIVE SURGERY FOR BLADDER EXSTROPHY Used for 1 condition 2 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/reconstructive-surgery-for-bladder-exstrophy) -+- [LENVATINIB + PEMBROLIZUMAB Used for 1 condition 15 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/lenvatinib-pembrolizumab) -+- [MEDROXYPROGESTERONE ACETATE (MPA) / MEGESTROL ACETATE (HORMONAL THERAPY) Used for 1 condition 40 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/medroxyprogesterone-acetate-mpa-megestrol-acetate-hormonal-therapy) -+- [BROAD-SPECTRUM ANTIBIOTICS (E.G., CIPROFLOXACIN + METRONIDAZOLE) Used for 1 condition 50 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/broad-spectrum-antibiotics-eg-ciprofloxacin-metronidazole) -+- [SUBLINGUAL COBALAMIN (CYANOCOBALAMIN/METHYLCOBALAMIN) Used for 1 condition 2 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/sublingual-cobalamin-cyanocobalaminmethylcobalamin) -+- [EXCIMER LASER/LIGHT (308 NM) Used for 1 condition 6 TRIALS · 5,000 PARTICIPANTS](/agencies/dfda/treatments/excimer-laserlight-308-nm) -+- [ZANUBRUTINIB Used for 1 condition 42 TRIALS · 4,500 PARTICIPANTS](/agencies/dfda/treatments/zanubrutinib) -+- [INTRATYMPANIC GENTAMICIN Used for 1 condition 2 TRIALS · 4,500 PARTICIPANTS](/agencies/dfda/treatments/intratympanic-gentamicin) -+- [PONATINIB (FOR PH+ ALL) Used for 1 condition 20 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/ponatinib-for-ph-all) -+- [ENHANCED COGNITIVE BEHAVIORAL THERAPY (CBT-E) Used for 1 condition 8 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/enhanced-cognitive-behavioral-therapy-cbt-e) -+- [REZUM WATER VAPOR THERMAL THERAPY Used for 1 condition 16 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/rezum-water-vapor-thermal-therapy) -+- [RITUXIMAB WITH CODOX-M/IVAC Used for 1 condition 2 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/rituximab-with-codox-mivac) -+- [BUDESONIDE (CONTROLLED ILEAL RELEASE) Used for 1 condition 30 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/budesonide-controlled-ileal-release) -+- [PAIR (PUNCTURE, ASPIRATION, INJECTION, RE-ASPIRATION) + ALBENDAZOLE Used for 1 condition 40 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/pair-puncture-aspiration-injection-re-aspiration-albendazole) -+- [BEDAQUILINE (AS PART OF LONGER REGIMENS) Used for 1 condition 25 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-as-part-of-longer-regimens) -+- [DELAMANID (AS PART OF A LONGER ORAL REGIMEN) Used for 1 condition 25 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/delamanid-as-part-of-a-longer-oral-regimen) -+- [TRICYCLIC ANTIDEPRESSANTS (TCAS) Used for 1 condition 30 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/tricyclic-antidepressants-tcas) -+- [NIFEDIPINE (EXTENDED-RELEASE) Used for 1 condition 150 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/nifedipine-extended-release) -+- [FINGOLIMOD Used for 1 condition 101 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/fingolimod) -+- [TRIMETHOPRIM-SULFAMETHOXAZOLE Used for 1 condition 1 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/trimethoprim-sulfamethoxazole) -+- [CALCIUM SUPPLEMENTATION Used for 1 condition 1 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/calcium-supplementation) -+- [NIMODIPINE Used for 1 condition 17 TRIALS · 4,000 PARTICIPANTS](/agencies/dfda/treatments/nimodipine) -+- [INTRAVENOUS IMMUNOGLOBULIN (IVIG) Used for 3 conditions 22 TRIALS · 3,550 PARTICIPANTS](/agencies/dfda/treatments/intravenous-immunoglobulin-ivig) -+- [RIBAVIRIN Used for 1 condition 70 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/ribavirin) -+- [DONANEMAB Used for 1 condition 10 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/donanemab) -+- [RITUXIMAB WITH GMALL-B-ALL-BFM Used for 1 condition 35 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/rituximab-with-gmall-b-all-bfm) -+- [PAIR (PUNCTURE, ASPIRATION, INJECTION, RE-ASPIRATION) MONOTHERAPY Used for 1 condition 35 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/pair-puncture-aspiration-injection-re-aspiration-monotherapy) -+- [PUNCTAL PLUGS (SILICONE OR DISSOLVABLE) Used for 1 condition 25 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/punctal-plugs-silicone-or-dissolvable) -+- [GENTAMICIN + AZITHROMYCIN (DUAL THERAPY FOR CEPHALOSPORIN ALLERGY) Used for 1 condition 25 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/gentamicin-azithromycin-dual-therapy-for-cephalosporin-allergy) -+- [NINTEDANIB Used for 1 condition 1 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/nintedanib) -+- [INTRATYMPANIC DEXAMETHASONE Used for 1 condition 8 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/intratympanic-dexamethasone) -+- [COGNITIVE BEHAVIORAL THERAPY (CBT) FOR MENOPAUSAL SYMPTOMS Used for 1 condition 12 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/cognitive-behavioral-therapy-cbt-for-menopausal-symptoms) -+- [MINDFULNESS-BASED STRESS REDUCTION (MBSR) Used for 1 condition 5 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/mindfulness-based-stress-reduction-mbsr) -+- [MILTEFOSINE Used for 1 condition 12 TRIALS · 3,500 PARTICIPANTS](/agencies/dfda/treatments/miltefosine) -+- [SURAMIN Used for 1 condition 1 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/suramin) -+- [LECANEMAB Used for 1 condition 26 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/lecanemab) -+- [DOSE-ADJUSTED EPOCH WITH RITUXIMAB (DA-EPOCH-R) Used for 1 condition 3 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/dose-adjusted-epoch-with-rituximab-da-epoch-r) -+- [YOGA / NERVE GLIDING EXERCISES Used for 1 condition 30 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/yoga-nerve-gliding-exercises) -+- [NIFURTIMOX Used for 1 condition 12 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/nifurtimox) -+- [ACTIVITY PACING / ENERGY MANAGEMENT Used for 1 condition 30 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/activity-pacing-energy-management) -+- [PONATINIB Used for 1 condition 43 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/ponatinib) -+- [METHYLPREDNISOLONE Used for 1 condition 8 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/methylprednisolone) -+- [DAPTOMYCIN Used for 1 condition 15 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/daptomycin) -+- [TRASTUZUMAB (FOR HER2+ ADENOCARCINOMA) Used for 1 condition 15 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/trastuzumab-for-her2-adenocarcinoma) -+- [PENCICLOVIR CREAM Used for 1 condition 30 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/penciclovir-cream) -+- [TRANSORAL INCISIONLESS FUNDOPLICATION (TIF) Used for 1 condition 15 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/transoral-incisionless-fundoplication-tif) -+- [EMICIZUMAB Used for 1 condition 48 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/emicizumab) -+- [VINCRISTINE + 5-FLUOROURACIL (5-FU) Used for 1 condition 5 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/vincristine-5-fluorouracil-5-fu) -+- [NIVOLUMAB (PD-1 INHIBITOR) Used for 1 condition 14 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/nivolumab-pd-1-inhibitor) -+- [SACRAL NEUROMODULATION (SNM) Used for 1 condition 1 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/sacral-neuromodulation-snm) -+- [OPEN CRANIOTOMY FOR HEMATOMA EVACUATION Used for 1 condition 5 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/open-craniotomy-for-hematoma-evacuation) -+- [STRUCTURED REHABILITATION & PACING Used for 1 condition 1 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/structured-rehabilitation-and-pacing) -+- [METHYLDOPA Used for 1 condition 100 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/methyldopa) -+- [BEVACIZUMAB + PEMETREXED + CISPLATIN Used for 1 condition 3 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/bevacizumab-pemetrexed-cisplatin) -+- [NON-INVASIVE VENTILATION (NIV) Used for 1 condition 39 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/non-invasive-ventilation-niv) -+- [FOLFIRINOX (FOLINIC ACID, FLUOROURACIL, IRINOTECAN, OXALIPLATIN) Used for 1 condition 100 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/folfirinox-folinic-acid-fluorouracil-irinotecan-oxaliplatin) -+- [GABAPENTIN ENACARBIL Used for 1 condition 26 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/gabapentin-enacarbil) -+- [INTRA-ARTERIAL CHEMOTHERAPY (IAC) Used for 1 condition 2 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/intra-arterial-chemotherapy-iac) -+- [TRANEXAMIC ACID (TXA) Used for 1 condition 1 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/tranexamic-acid-txa) -+- [ELAGOLIX + ESTRADIOL/NORETHINDRONE ACETATE Used for 1 condition 9 TRIALS · 3,000 PARTICIPANTS](/agencies/dfda/treatments/elagolix-estradiolnorethindrone-acetate) -+- [BUPROPION SUSTAINED RELEASE Used for 1 condition 22 TRIALS · 2,600 PARTICIPANTS](/agencies/dfda/treatments/bupropion-sustained-release) -+- [DIMETHYL FUMARATE Used for 1 condition 103 TRIALS · 2,600 PARTICIPANTS](/agencies/dfda/treatments/dimethyl-fumarate) -+- [VERAPAMIL Used for 1 condition 3 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/verapamil) -+- [DELAMANID (AS PART OF LONGER REGIMENS) Used for 1 condition 15 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/delamanid-as-part-of-longer-regimens) -+- [GEMIFLOXACIN + AZITHROMYCIN (DUAL THERAPY, ORAL ALTERNATIVE) Used for 1 condition 18 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/gemifloxacin-azithromycin-dual-therapy-oral-alternative) -+- [PIRFENIDONE Used for 1 condition 1 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/pirfenidone) -+- [PHYSICAL AND OCCUPATIONAL THERAPY Used for 1 condition 1 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/physical-and-occupational-therapy) -+- [GASTROSTOMY (PEG TUBE) Used for 1 condition 5 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/gastrostomy-peg-tube) -+- [GEMCITABINE + NAB-PACLITAXEL Used for 1 condition 396 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/gemcitabine-nab-paclitaxel) -+- [RIOCIGUAT Used for 1 condition 47 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/riociguat) -+- [INTRAVITREAL CHEMOTHERAPY (IVIC) Used for 1 condition 40 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/intravitreal-chemotherapy-ivic) -+- [TRANSCRANIAL MAGNETIC STIMULATION (TMS) Used for 1 condition 35 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/transcranial-magnetic-stimulation-tms) -+- [HONEY Used for 1 condition 8 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/honey) -+- [COMBINATION THERAPIES (E.G., LIPOSOMAL AMPHOTERICIN B + MILTEFOSINE) Used for 1 condition 25 TRIALS · 2,500 PARTICIPANTS](/agencies/dfda/treatments/combination-therapies-eg-liposomal-amphotericin-b-miltefosine) -+- [PIMAVANSERIN Used for 1 condition 2 TRIALS · 2,200 PARTICIPANTS](/agencies/dfda/treatments/pimavanserin) -+- [SERTRALINE Used for 2 conditions 35 TRIALS · 2,100 PARTICIPANTS](/agencies/dfda/treatments/sertraline) -+- [TISAGENLECLEUCEL (CAR T-CELL THERAPY) Used for 1 condition 6 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/tisagenlecleucel-car-t-cell-therapy) -+- [VENETOCLAX + AZACITIDINE Used for 1 condition 253 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/venetoclax-azacitidine) -+- [NECT (NIFURTIMOX-EFLORNITHINE COMBINATION THERAPY) Used for 1 condition 2 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/nect-nifurtimox-eflornithine-combination-therapy) -+- [ENFORTUMAB VEDOTIN (PADCEV) Used for 1 condition 19 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/enfortumab-vedotin-padcev) -+- [LARAZOTIDE ACETATE (INVESTIGATIONAL) Used for 1 condition 10 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/larazotide-acetate-investigational) -+- [KETOCONAZOLE Used for 1 condition 4 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/ketoconazole) -+- [PLASMA EXCHANGE (PLEX) Used for 1 condition 70 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/plasma-exchange-plex) -+- [PEGLOTICASE Used for 1 condition 18 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/pegloticase) -+- [BEDAQUILINE + PRETOMANID + LINEZOLID (BPAL REGIMEN) Used for 1 condition 12 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-pretomanid-linezolid-bpal-regimen) -+- [MAVACAMTEN Used for 1 condition 31 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/mavacamten) -+- [DISOPYRAMIDE Used for 1 condition 4 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/disopyramide) -+- [DIMETHYL SULFOXIDE (DMSO) Used for 1 condition 5 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/dimethyl-sulfoxide-dmso) -+- [MIFAMURTIDE (ADJUVANT FOR HIGH-GRADE OSTEOSARCOMA, NON-US APPROVAL) Used for 1 condition 15 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/mifamurtide-adjuvant-for-high-grade-osteosarcoma-non-us-approval) -+- [HYDRALAZINE (IV) Used for 1 condition 50 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/hydralazine-iv) -+- [ENDOLYMPHATIC SAC DECOMPRESSION Used for 1 condition 25 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/endolymphatic-sac-decompression) -+- [RILUZOLE Used for 1 condition 43 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/riluzole) -+- [NATALIZUMAB Used for 1 condition 126 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/natalizumab) -+- [GLATIRAMER ACETATE Used for 1 condition 108 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/glatiramer-acetate) -+- [CEMIPLIMAB Used for 1 condition 7 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/cemiplimab) -+- [VITAMIN B6 Used for 1 condition 4 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/vitamin-b6) -+- [ROTIGOTINE Used for 1 condition 23 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/rotigotine) -+- [BRIMONIDINE (TOPICAL) Used for 1 condition 9 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/brimonidine-topical) -+- [SYSTEMIC CORTICOSTEROID PULSE THERAPY (E.G., DEXAMETHASONE) Used for 1 condition 30 TRIALS · 2,000 PARTICIPANTS](/agencies/dfda/treatments/systemic-corticosteroid-pulse-therapy-eg-dexamethasone) -+- [CLADRIBINE Used for 1 condition 42 TRIALS · 1,900 PARTICIPANTS](/agencies/dfda/treatments/cladribine) -+- [VARENICLINE SOLUTION (NASAL SPRAY) Used for 1 condition 4 TRIALS · 1,800 PARTICIPANTS](/agencies/dfda/treatments/varenicline-solution-nasal-spray) -+- [METHYLPHENIDATE EXTENDED-RELEASE Used for 1 condition 18 TRIALS · 1,600 PARTICIPANTS](/agencies/dfda/treatments/methylphenidate-extended-release) -+- [PEGYLATED INTERFERON-ALPHA Used for 1 condition 30 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/pegylated-interferon-alpha) -+- [MIDOSTAURIN + CHEMOTHERAPY Used for 1 condition 23 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/midostaurin-chemotherapy) -+- [SPECIALIST SUPPORTIVE CLINICAL MANAGEMENT (SSCM) Used for 1 condition 10 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/specialist-supportive-clinical-management-sscm) -+- [LATIGLUTENASE (ALV003 / BL-7010) (INVESTIGATIONAL) Used for 1 condition 8 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/latiglutenase-alv003-bl-7010-investigational) -+- [MODAFINIL Used for 1 condition 25 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/modafinil) -+- [ETHIONAMIDE / PROTHIONAMIDE (AS PART OF REGIMENS) Used for 1 condition 20 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/ethionamide-prothionamide-as-part-of-regimens) -+- [CYCLOSERINE / TERIZIDONE (AS PART OF REGIMENS) Used for 1 condition 20 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/cycloserine-terizidone-as-part-of-regimens) -+- [MYO-INOSITOL + SELENIUM Used for 1 condition 1 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/myo-inositol-selenium) -+- [BEDAQUILINE + PRETOMANID + LINEZOLID + MOXIFLOXACIN (BPALM REGIMEN) Used for 1 condition 15 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-pretomanid-linezolid-moxifloxacin-bpalm-regimen) -+- [DELAMANID + BEDAQUILINE + OPTIMIZED BACKGROUND REGIMEN (OBR) Used for 1 condition 15 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/delamanid-bedaquiline-optimized-background-regimen-obr) -+- [BPAL REGIMEN (BEDAQUILINE, PRETOMANID, LINEZOLID) Used for 1 condition 15 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/bpal-regimen-bedaquiline-pretomanid-linezolid) -+- [WATCHFUL WAITING (FOR ASYMPTOMATIC INGUINAL HERNIA IN MEN) Used for 1 condition 7 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/watchful-waiting-for-asymptomatic-inguinal-hernia-in-men) -+- [HEPARIN/LIDOCAINE (INTRAVESICAL) Used for 1 condition 8 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/heparinlidocaine-intravesical) -+- [SUNITINIB Used for 1 condition 241 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/sunitinib) -+- [PAZOPANIB Used for 1 condition 100 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/pazopanib) -+- [COGNITIVE REHABILITATION THERAPY Used for 1 condition 29 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/cognitive-rehabilitation-therapy) -+- [OXYBUTYNIN (LOW-DOSE EXTENDED RELEASE) Used for 1 condition 8 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/oxybutynin-low-dose-extended-release) -+- [ALEMTUZUMAB Used for 1 condition 46 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/alemtuzumab) -+- [BRACHYTHERAPY (PLAQUE RADIOTHERAPY) Used for 1 condition 3 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/brachytherapy-plaque-radiotherapy) -+- [OXYMETAZOLINE (TOPICAL) Used for 1 condition 2 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/oxymetazoline-topical) -+- [VOXELOTOR Used for 1 condition 25 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/voxelotor) -+- [PAROMOMYCIN Used for 1 condition 11 TRIALS · 1,500 PARTICIPANTS](/agencies/dfda/treatments/paromomycin) -+- [GALCANEZUMAB Used for 1 condition 3 TRIALS · 1,200 PARTICIPANTS](/agencies/dfda/treatments/galcanezumab) -+- [TAILORED EXERCISE REHABILITATION WITH PACING Used for 1 condition 12 TRIALS · 1,200 PARTICIPANTS](/agencies/dfda/treatments/tailored-exercise-rehabilitation-with-pacing) -+- [VOCLOSPORIN Used for 1 condition 10 TRIALS · 1,200 PARTICIPANTS](/agencies/dfda/treatments/voclosporin) -+- [TALIMOGENE LAHERPAREPVEC (T-VEC) Used for 1 condition 4 TRIALS · 1,200 PARTICIPANTS](/agencies/dfda/treatments/talimogene-laherparepvec-t-vec) -+- [RUXOLITINIB CREAM (OPZELURA) Used for 1 condition 1 TRIALS · 1,200 PARTICIPANTS](/agencies/dfda/treatments/ruxolitinib-cream-opzelura) -+- [CPX-351 (LIPOSOMAL CYTARABINE AND DAUNORUBICIN) Used for 1 condition 43 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/cpx-351-liposomal-cytarabine-and-daunorubicin) -+- [LETROZOLE Used for 1 condition 6 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/letrozole) -+- [BPAL REGIMEN (BEDAQUILINE + PRETOMANID + LINEZOLID) Used for 1 condition 1 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/bpal-regimen-bedaquiline-pretomanid-linezolid) -+- [CLOFAZIMINE (AS PART OF REGIMENS) Used for 1 condition 15 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/clofazimine-as-part-of-regimens) -+- [HYDROXYZINE Used for 1 condition 20 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/hydroxyzine) -+- [MINIMALLY INVASIVE SURGERY (STEREOTACTIC ASPIRATION/ENDOSCOPIC) + RT-PA Used for 1 condition 1 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/minimally-invasive-surgery-stereotactic-aspirationendoscopic-rt-pa) -+- [IMMUNOTHERAPY (PD-1 INHIBITORS E.G., PEMBROLIZUMAB/NIVOLUMAB) Used for 1 condition 20 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/immunotherapy-pd-1-inhibitors-eg-pembrolizumabnivolumab) -+- [IDECABTAGENE VICLEUCEL (IDE-CEL) Used for 1 condition 28 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/idecabtagene-vicleucel-ide-cel) -+- [FETAL MYELOMENINGOCELE REPAIR (MATERNAL-FETAL SURGERY) Used for 1 condition 4 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/fetal-myelomeningocele-repair-maternal-fetal-surgery) -+- [PREDNISONE (ORAL) Used for 1 condition 50 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/prednisone-oral) -+- [SURGICAL DEBRIDEMENT Used for 1 condition 10 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/surgical-debridement) -+- [INTRANASAL COBALAMIN (CYANOCOBALAMIN) Used for 1 condition 20 TRIALS · 1,000 PARTICIPANTS](/agencies/dfda/treatments/intranasal-cobalamin-cyanocobalamin) -+- [ADOLESCENT-FOCUSED PSYCHOTHERAPY (AFP) Used for 1 condition 5 TRIALS · 800 PARTICIPANTS](/agencies/dfda/treatments/adolescent-focused-psychotherapy-afp) -+- [HIGH-FLOW OXYGEN Used for 1 condition 1 TRIALS · 800 PARTICIPANTS](/agencies/dfda/treatments/high-flow-oxygen) -+- [NEOSTIGMINE (FOR ACUTE COLONIC PSEUDO-OBSTRUCTION) Used for 1 condition 15 TRIALS · 800 PARTICIPANTS](/agencies/dfda/treatments/neostigmine-for-acute-colonic-pseudo-obstruction) -+- [NALTREXONE (LOW-DOSE) Used for 1 condition 3 TRIALS · 750 PARTICIPANTS](/agencies/dfda/treatments/naltrexone-low-dose) -+- [CRIZANLIZUMAB Used for 1 condition 15 TRIALS · 750 PARTICIPANTS](/agencies/dfda/treatments/crizanlizumab) -+- [GILTERITINIB Used for 1 condition 58 TRIALS · 700 PARTICIPANTS](/agencies/dfda/treatments/gilteritinib) -+- [FEXINIDAZOLE Used for 1 condition 10 TRIALS · 700 PARTICIPANTS](/agencies/dfda/treatments/fexinidazole) -+- [ZED1227 (INVESTIGATIONAL) Used for 1 condition 5 TRIALS · 700 PARTICIPANTS](/agencies/dfda/treatments/zed1227-investigational) -+- [LUSPATERCEPT (REBLOZYL) Used for 1 condition 4 TRIALS · 700 PARTICIPANTS](/agencies/dfda/treatments/luspatercept-reblozyl) -+- [BEDAQUILINE-PRETOMANID-LINEZOLID (BPAL) REGIMEN Used for 1 condition 8 TRIALS · 650 PARTICIPANTS](/agencies/dfda/treatments/bedaquiline-pretomanid-linezolid-bpal-regimen) -+- [ZOLMITRIPTAN (NASAL SPRAY) Used for 1 condition 12 TRIALS · 600 PARTICIPANTS](/agencies/dfda/treatments/zolmitriptan-nasal-spray) -+- [EDARAVONE Used for 1 condition 11 TRIALS · 600 PARTICIPANTS](/agencies/dfda/treatments/edaravone) -+- [ENTECAVIR Used for 1 condition 4 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/entecavir) -+- [TENOFOVIR DISOPROXIL FUMARATE (TDF) Used for 1 condition 3 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/tenofovir-disoproxil-fumarate-tdf) -+- [MIFEPRISTONE Used for 1 condition 10 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/mifepristone) -+- [PASIREOTIDE Used for 1 condition 5 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/pasireotide) -+- [CITALOPRAM Used for 1 condition 1 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/citalopram) -+- [PEMIGATINIB (FGFR2 INHIBITOR) Used for 1 condition 30 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/pemigatinib-fgfr2-inhibitor) -+- [CABOZANTINIB Used for 1 condition 95 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/cabozantinib) -+- [AZATHIOPRINE (IMMUNOSUPPRESSANT) Used for 1 condition 2 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/azathioprine-immunosuppressant) -+- [OLAPARIB (PARP INHIBITOR) Used for 1 condition 20 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/olaparib-parp-inhibitor) -+- [CYCLOSPORINE (ORAL) Used for 1 condition 20 TRIALS · 500 PARTICIPANTS](/agencies/dfda/treatments/cyclosporine-oral) -+- [TENOFOVIR ALAFENAMIDE (TAF) Used for 1 condition 2 TRIALS · 400 PARTICIPANTS](/agencies/dfda/treatments/tenofovir-alafenamide-taf) -+- [OSILODROSTAT Used for 1 condition 9 TRIALS · 400 PARTICIPANTS](/agencies/dfda/treatments/osilodrostat) -+- [PAROXETINE Used for 1 condition 15 TRIALS · 400 PARTICIPANTS](/agencies/dfda/treatments/paroxetine) -+- [L-GLUTAMINE (ENDARI) Used for 1 condition 7 TRIALS · 400 PARTICIPANTS](/agencies/dfda/treatments/l-glutamine-endari) -+- [PEMBROLIZUMAB + LENVATINIB Used for 1 condition 26 TRIALS · 355 PARTICIPANTS](/agencies/dfda/treatments/pembrolizumab-lenvatinib) -+- [MAGNESIUM SUPPLEMENTS Used for 1 condition 7 TRIALS · 350 PARTICIPANTS](/agencies/dfda/treatments/magnesium-supplements) -+- [H1 AND H2 ANTIHISTAMINES (E.G., FEXOFENADINE, FAMOTIDINE) Used for 1 condition 8 TRIALS · 350 PARTICIPANTS](/agencies/dfda/treatments/h1-and-h2-antihistamines-eg-fexofenadine-famotidine) -+- [TRAZODONE Used for 1 condition 10 TRIALS · 300 PARTICIPANTS](/agencies/dfda/treatments/trazodone) -+- [IVOSIDENIB (IDH1 INHIBITOR) Used for 1 condition 20 TRIALS · 300 PARTICIPANTS](/agencies/dfda/treatments/ivosidenib-idh1-inhibitor) -+- [TOPICAL CORTICOSTEROIDS (E.G., CLOBETASOL) / TOPICAL TACROLIMUS Used for 1 condition 15 TRIALS · 300 PARTICIPANTS](/agencies/dfda/treatments/topical-corticosteroids-eg-clobetasol-topical-tacrolimus) -+- [BETIBEGLOGENE AUTOTEMCEL (BETI-CEL / ZYNTEGLO) Used for 1 condition 5 TRIALS · 300 PARTICIPANTS](/agencies/dfda/treatments/betibeglogene-autotemcel-beti-cel-zynteglo) -+- [PAPAVERINE (INTRA-ARTERIAL) Used for 1 condition 30 TRIALS · 300 PARTICIPANTS](/agencies/dfda/treatments/papaverine-intra-arterial) -+- [TOFERSEN (FOR SOD1-ALS) Used for 1 condition 1 TRIALS · 200 PARTICIPANTS](/agencies/dfda/treatments/tofersen-for-sod1-als) -+- [EXAGAMGLOGENE AUTOTEMCEL (CASGEVY) Used for 1 condition 7 TRIALS · 150 PARTICIPANTS](/agencies/dfda/treatments/exagamglogene-autotemcel-casgevy) -+- [WHOLE LUNG LAVAGE Used for 1 condition 1 TRIALS · 90 PARTICIPANTS](/agencies/dfda/treatments/whole-lung-lavage) -+- [ANTI-FIBROTIC AGENTS (E.G., PIRFENIDONE, NINTEDANIB) Used for 1 condition 4 TRIALS · 80 PARTICIPANTS](/agencies/dfda/treatments/anti-fibrotic-agents-eg-pirfenidone-nintedanib) -+- [SUPPORTIVE CARE (REST, HYDRATION, NUTRITION) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/supportive-care-rest-hydration-nutrition) -+- [GLUTEN-FREE DIET (GFD) Used for 1 condition 21 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/gluten-free-diet-gfd) -+- [AVOIDANCE OF OXIDATIVE STRESSORS (E.G., FAVA BEANS, SULFA DRUGS, ANTIMALARIALS) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/avoidance-of-oxidative-stressors-eg-fava-beans-sulfa-drugs-antimalarials) -+- [BLOOD TRANSFUSION (FOR ACUTE SEVERE HEMOLYSIS) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/blood-transfusion-for-acute-severe-hemolysis) -+- [SUPPORTIVE CARE (FLUID MANAGEMENT, ANTIPYRETICS, NUTRITIONAL SUPPORT) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/supportive-care-fluid-management-antipyretics-nutritional-support) -+- [ENUCLEATION Used for 1 condition 10 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/enucleation) -+- [FOCAL THERAPIES (LASER PHOTOCOAGULATION, TRANSPUPILLARY THERMOTHERAPY, CRYOTHERAPY) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/focal-therapies-laser-photocoagulation-transpupillary-thermotherapy-cryotherapy) -+- [SUPPORTIVE CARE (IV FLUIDS, BOWEL REST) Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/supportive-care-iv-fluids-bowel-rest) -+- [REST AND HYDRATION Used for 1 condition 0 TRIALS · 0 PARTICIPANTS](/agencies/dfda/treatments/rest-and-hydration) -diff --git a/packages/web/src/app/treaty/page.logged-out.md b/packages/web/src/app/treaty/page.logged-out.md -index 6dabeaa19..99c31acc0 100644 ---- a/packages/web/src/app/treaty/page.logged-out.md -+++ b/packages/web/src/app/treaty/page.logged-out.md -@@ -25,9 +25,9 @@ - - WHEREAS, this is the conflict resolution strategy of four-year-olds except four-year-olds eventually get tired and take a nap, and these governments have failed to apply naps to foreign policy; - - WHEREAS, the governments of Earth possess nuclear weapons sufficient to end civilization [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) times but have not cured Alzheimer's once (which is particularly wasteful given we only have one civilization to destroy); - - WHEREAS, your employees spend [$2.72 trillion](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) a year on their capacity for mass murder, which is enough to buy [850](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) bullets for every man, woman, and child every year, even though it would require at most 2 bullets per person to murder everyone; --- WHEREAS, governments spend [604](https://manual.WarOnDisease.org/knowledge/economics/central-banks.html) dollars on the capacity for orphan manufacturing for every one dollar spent on the trials that might cure what is actually going to kill their citizens; --- WHEREAS, the Department of "Defense" has "misplaced" $2.46 trillion, failed seven consecutive audits trying to find it, and then requested additional trillions without explanation or apology (Not to belabor the point, but that money could have funded [547](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) years of clinical trials at current funding levels, possibly saving billions of lives and preventing quadrillions of hours of suffering, so we would appreciate it if you would have them be more careful in the future); --- WHEREAS, pre-WW2 U.S. military spending was [96.7%](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) lower than today's peacetime budget, even after adjusting for inflation. The U.S. still won World War II, then cut military spending [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) in two years and produced the fastest growth in median standard of living in history. -+- WHEREAS, governments spend [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) dollars on the capacity for orphan manufacturing for every one dollar spent on the trials that might cure what is actually going to kill their citizens; -+- WHEREAS, the Department of "Defense" has "misplaced" [$2.46 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html), failed seven consecutive audits trying to find it, and then requested additional trillions without explanation or apology (Not to belabor the point, but that money could have funded [547](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) years of clinical trials at current funding levels, possibly saving billions of lives and preventing quadrillions of hours of suffering, so we would appreciate it if you would have them be more careful in the future); -+- WHEREAS, pre-WW2 U.S. military spending was [96.7%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) lower than today's peacetime budget, even after adjusting for inflation. The U.S. still won World War II, then cut military spending [87.6%](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html) in two years and produced the fastest growth in median standard of living in history. - - WHEREAS, unless the human genome has significantly degraded in the two generations since, a one percent improvement in resource allocation should be manageable; - - WHEREAS, global military spending has been growing [2.76%](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) a year for twenty years. If no one tells it to stop, every human alive will pay about [$402,488](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) over their lifetime (mostly funding explosions in countries they cannot find on a map). A one percent cut tells it to stop. That saves the average person about [$290,052](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) ([the peace dividend](https://manual.WarOnDisease.org/knowledge/economics/peace-dividend.html)); - - WHEREAS, [diseases kill more people than all wars combined](https://manual.WarOnDisease.org/knowledge/problem/cost-of-disease.html) and, unlike wars, do not even have the decency to be quick about it; -@@ -50,6 +50,6 @@ - - Article VIII: This treaty supersedes all conflicting domestic law. Including the subsection your legislature added at 2 a.m. last session specifically to make sure this couldn't happen. - - Article IX: This Treaty enters into force upon signature by two states. War has killed humans for as long as there have been humans to kill. Disease has been killing them longer. Its founding signatories will be responsible for the largest reduction in human suffering and the largest increase in human prosperity in the history of planet Earth. - - IN WITNESS WHEREOF, the undersigned, being of sound mind (debatable) and tired of watching their loved ones die of preventable diseases, have executed this Treaty. --- Signed this day, May 13, 2026, in the year of our ongoing confusion. -+- Signed this day, May 14, 2026, in the year of our ongoing confusion. - - SIGN - - Display my name publicly on the signer list and leaderboards (recommended). -diff --git a/packages/web/src/app/vote/page.logged-out.md b/packages/web/src/app/vote/page.logged-out.md -index 0512b8cb4..3eabd67ee 100644 ---- a/packages/web/src/app/vote/page.logged-out.md -+++ b/packages/web/src/app/vote/page.logged-out.md -@@ -14,5 +14,5 @@ - ## Visible Page Copy - - ## PLEASE TAKE 30 SECONDS TO END WAR AND DISEASE --- Governments are paid $36 trillion a year to promote the general welfare. What allocation between military spending and clinical trials would best fulfill that duty? -+- You pay governments $36.5 trillion a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. What allocation between military spending and clinical trials would best fulfill that duty? - - SLIDE ME -diff --git a/packages/web/src/app/wishonia/page.logged-out.md b/packages/web/src/app/wishonia/page.logged-out.md -new file mode 100644 -index 000000000..b69d87fbc ---- /dev/null -+++ b/packages/web/src/app/wishonia/page.logged-out.md -@@ -0,0 +1,66 @@ -+# /wishonia -+ -+## Metadata -+ -+- Page title: Wishonia | International Campaign to End War and Disease -+- Meta description: A planet that ended war in year 12 and disease in year 340. This is what 4,297 years of not being idiots looks like. -+- Canonical: https://warondisease.org/wishonia -+- Open Graph title: Wishonia -+- Open Graph description: A planet that ended war in year 12 and disease in year 340. This is what 4,297 years of not being idiots looks like. -+- Open Graph image: https://warondisease.org/api/og/route?path=%2Fwishonia -+- Twitter title: Wishonia -+- Twitter description: A planet that ended war in year 12 and disease in year 340. This is what 4,297 years of not being idiots looks like. -+ -+## Visible Page Copy -+ -+- PROOF OF CONCEPT -+## WISHONIA -+- A planet that ended war in year 12 and disease in year 340. Same atoms. Same physics. Better spreadsheet. -+- Your species has the technology. You invented the maths. You built the computers. You just refuse to use them on the thing that matters most: not dying. -+### WHAT 4,297 YEARS GETS YOU -+- Three achievements your species is capable of but actively choosing not to pursue. -+#### SUPER-LONGEVITY -+- Death is optional. Aging reverses. Every citizen has access to treatments your species won't approve for another eight point two years — if they approve them at all. -+#### SUPER-WELLBEING -+- Suffering engineered out at the neurochemical level. The emotional range runs from 'deeply good' to 'transcendently good.' Your species calls this impossible. We call it Tuesday. -+#### SUPER-INTELLIGENCE -+- AI optimisation solving previously intractable problems. Not replacing humans — amplifying them. Every citizen has access to the combined knowledge of 847 civilisations. -+### HOW A PLANET ACTUALLY RUNS -+#### NO POLITICIANS -+- The governance niche was filled by algorithmic decision-making. Eight billion people do pairwise comparisons. The eigenvector produces stable budget allocations. Four minutes a week. -+#### NO LOBBYING -+- Without elected officials to lobby, the industry collapsed. Smart contracts route funds to public goods based on citizen preferences. Bribery became structurally impossible. -+#### $WISH CURRENCY -+- 0.5% transaction tax replaces the entire tax code. UBI keeps everyone above the poverty line. Algorithmic 0% inflation stops the purchasing-power theft that funds your wars. -+#### THE OPTIMITRON -+- An AI comparing outcomes across 10,000 jurisdictions to identify what policies actually work. Domain-agnostic causal inference. Your scientists take twelve years. This takes seconds. -+### HOW LONG IT ACTUALLY TAKES -+- Year 0 -+- 1% Treaty signed. Military spending redirected to clinical trials. -+- Year 12 -+- Last war ended. Turned out nobody wanted to fight once the incentives changed. -+- Year 47 -+- Wishocracy replaced representative government. Four minutes a week, eight billion participants. -+- Year 103 -+- Federal Reserve equivalent deprecated. Algorithmic monetary policy achieved 0% inflation. -+- Year 340 -+- Last disease eradicated. 95% of the work was removing bureaucratic obstacles. -+- Year 4,297 -+- Present day. Sent this manual to your planet. You're welcome. -+### THE GAP IS INSTITUTIONAL, NOT TECHNOLOGICAL -+- Your planet has the same atoms. The same physics. Better computers than we had when we started. The only difference is that your resources flow through institutions designed in the 18th century by people who thought bloodletting was medicine. The technology exists. The maths exists. The only missing variable is the decision to use them. -+### WHAT IT MEANS FOR YOU, PERSONALLY -+- Median household income under three scenarios. Same species. Same starting point. Different governance. -+### HOW RICH WOULD YOU BE? -+- Enter your income. See what 20 years of compounding looks like with and without the $101 trillion governance dysfunction tax. -+- YOUR ANNUAL INCOME: -+- /year -+- RESET TO MEDIAN -+- 1% TREATY -+- FULL OPTIMIZATION -+- Based on current GDP growth (~2.5%) vs. modelled trajectories from the [GDP Trajectories analysis](https://manual.warondisease.org/knowledge/economics/gdp-trajectories.html). 1% Treaty: 17.9% CAGR from military reallocation + research spillovers. Full Optimization: 25.4% CAGR from complete governance reform. Projections are illustrative — the compounding gap is real regardless of exact rates. -+### START BUILDING IT -+- The blueprint is open source. The tools are free. The only cost is giving a damn. -+- [OPTIMIZED GOVERNANCE](/agencies) -+- [TRANSMIT TO WISHONIA](/transmit) -+- [PLAY THE GAME](/prize) -diff --git a/packages/web/src/components/adaptive/email-styles.ts b/packages/web/src/components/adaptive/email-styles.ts -index 73419358e..d68eafd60 100644 ---- a/packages/web/src/components/adaptive/email-styles.ts -+++ b/packages/web/src/components/adaptive/email-styles.ts -@@ -81,7 +81,7 @@ export const EMAIL_STYLES = { - }, - smallMutedParagraph: { - color: EMAIL_COLORS.muted, -- fontSize: "12px", -+ fontSize: "14px", - lineHeight: 1.6, - margin: 0, - }, -diff --git a/packages/web/src/components/auth/AuthForm.tsx b/packages/web/src/components/auth/AuthForm.tsx -index defbb571e..380143fe7 100644 ---- a/packages/web/src/components/auth/AuthForm.tsx -+++ b/packages/web/src/components/auth/AuthForm.tsx -@@ -15,6 +15,8 @@ import { DEFAULT_POST_LOGIN_ROUTE, ROUTES } from "@/lib/routes"; - import { storage } from "@/lib/storage"; - - const logger = createLogger("auth-form"); -+const SIGN_IN_LINK_SENT_MESSAGE = -+ "Sign-in link sent. Check spam if you do not see it within 60 seconds."; - - interface ProviderFlags { - demo?: boolean; -@@ -37,7 +39,7 @@ interface AuthFormProps { - emailPendingButtonLabel?: string; - /** Divider label shown between the Google button and the email form. Default "or use email". */ - emailDividerLabel?: string; -- /** Message shown below the success alert after a magic link is sent */ -+ /** Message shown below the confirmation after a magic link is sent */ - emailSuccessFooter?: string; - /** When true, skip the bordered/shadowed outer container (use inside a Card that already provides the box). */ - hideContainer?: boolean; -@@ -64,7 +66,7 @@ export function AuthForm({ - }: AuthFormProps) { - const [email, setEmail] = useState(""); - const [error, setError] = useState(""); -- const [infoMessage, setInfoMessage] = useState(""); -+ const [hasSubmitted, setHasSubmitted] = useState(false); - const [pendingAction, setPendingAction] = useState<"google" | "magic" | "demo" | null>(null); - - const isLoading = pendingAction !== null; -@@ -83,8 +85,11 @@ export function AuthForm({ - const containerClassName = hideContainer - ? "w-full" - : isDocument -- ? "w-full border border-black bg-white p-5 text-black shadow-none" -- : "w-full border border-neutral-950 bg-white p-6 shadow-none sm:p-7"; -+ ? "w-full border border-black bg-white p-4 text-black shadow-none" -+ : compact -+ ? "w-full border border-foreground bg-background p-4 shadow-none sm:p-5" -+ : "w-full border border-neutral-950 bg-white p-5 shadow-none sm:p-6"; -+ const titleWrapperClassName = compact ? "mb-3 text-center" : "mb-4 text-center"; - const titleClassName = isDocument - ? "text-2xl font-black uppercase tracking-[0.08em] text-[var(--treaty-ink)] [font-family:var(--v0-font-libre-baskerville)]" - : "text-2xl font-semibold tracking-tight text-neutral-950"; -@@ -96,8 +101,8 @@ export function AuthForm({ - : "flex items-center gap-3 text-xs font-semibold uppercase tracking-[0.14em] text-neutral-500"; - const dividerLineClassName = isDocument ? "h-px flex-1 bg-black/30" : "h-px flex-1 bg-neutral-200"; - const referralClassName = isDocument -- ? "mb-4 text-center text-xs font-bold uppercase text-black" -- : "mb-4 text-center text-xs font-semibold uppercase tracking-[0.14em] text-neutral-500"; -+ ? "mb-3 text-center text-xs font-bold uppercase text-black" -+ : "mb-3 text-center text-xs font-semibold uppercase tracking-[0.14em] text-neutral-500"; - const labelClassName = isDocument - ? "font-bold uppercase text-black" - : "text-xs font-semibold uppercase tracking-[0.14em] text-neutral-700"; -@@ -113,6 +118,19 @@ export function AuthForm({ - const demoButtonClassName = isDocument - ? `w-full justify-center !border !border-black bg-white font-black uppercase text-black !shadow-none hover:!translate-x-0 hover:!translate-y-0 hover:bg-black hover:text-white active:!translate-x-0 active:!translate-y-0 ${buttonClassName}` - : `w-full justify-center !border !border-neutral-950 !bg-white font-semibold !text-neutral-950 !shadow-none hover:!translate-x-0 hover:!translate-y-0 hover:!bg-neutral-50 active:!translate-x-0 active:!translate-y-0 ${buttonClassName}`; -+ const alertClassName = compact ? "mb-3" : "mb-4"; -+ const controlsSpacingClassName = compact ? "space-y-3" : "space-y-4"; -+ const formSpacingClassName = compact ? "space-y-3" : "space-y-4"; -+ const fieldSpacingClassName = compact ? "space-y-1.5" : "space-y-2"; -+ const confirmationClassName = compact -+ ? "flex min-h-24 flex-col items-center justify-center text-center" -+ : "flex min-h-28 flex-col items-center justify-center text-center"; -+ const confirmationTextClassName = isDocument -+ ? "text-sm font-black uppercase leading-6 text-foreground" -+ : "text-sm font-semibold leading-6 text-muted-foreground"; -+ const confirmationFooterClassName = isDocument -+ ? "mt-2 text-xs font-bold leading-5 text-muted-foreground" -+ : "mt-2 text-xs font-semibold leading-5 text-muted-foreground"; - - useEffect(() => { - if (!initialError) { -@@ -120,6 +138,7 @@ export function AuthForm({ - } - - setError(initialError); -+ setHasSubmitted(false); - }, [initialError]); - - function persistAuthContext() { -@@ -146,12 +165,12 @@ export function AuthForm({ - async function handleSubmit(event: React.FormEvent) { - event.preventDefault(); - setError(""); -- setInfoMessage(""); -+ setHasSubmitted(false); - setPendingAction("magic"); - - try { - if (!email.trim()) { -- throw new Error("Email is required for a magic link."); -+ throw new Error("Email is required for a sign-in link."); - } - - persistAuthContext(); -@@ -163,14 +182,15 @@ export function AuthForm({ - }); - - if (result?.error) { -- throw new Error("Unable to send a magic link right now."); -+ throw new Error("Unable to send a sign-in link right now."); - } - -- setInfoMessage("Check your email for a sign-in link."); -+ setHasSubmitted(true); - } catch (caughtError) { - logger.error("Magic-link request failed", caughtError); -+ setHasSubmitted(false); - setError( -- caughtError instanceof Error ? caughtError.message : "Unable to send a magic link right now.", -+ caughtError instanceof Error ? caughtError.message : "Unable to send a sign-in link right now.", - ); - } finally { - setPendingAction(null); -@@ -179,7 +199,7 @@ export function AuthForm({ - - async function handleGoogleSignIn() { - setError(""); -- setInfoMessage(""); -+ setHasSubmitted(false); - setPendingAction("google"); - - try { -@@ -196,7 +216,7 @@ export function AuthForm({ - - async function handleDemoSignIn() { - setError(""); -- setInfoMessage(""); -+ setHasSubmitted(false); - setPendingAction("demo"); - - try { -@@ -224,7 +244,7 @@ export function AuthForm({ - return ( -
- {title || subtitle ? ( --
-+
- {title ?

{title}

: null} - {subtitle ? ( -

{subtitle}

-@@ -232,17 +252,7 @@ export function AuthForm({ -
- ) : null} - -- {error ? : null} -- {infoMessage ? ( -- <> -- -- {emailSuccessFooter ? ( --

-- {emailSuccessFooter} --

-- ) : null} -- -- ) : null} -+ {error ? : null} - - {referralCode ? ( -

-@@ -250,8 +260,24 @@ export function AuthForm({ -

- ) : null} - --
-- {demoLoginEnabled && ( -+
-+ {hasSubmitted ? ( -+
-+

{SIGN_IN_LINK_SENT_MESSAGE}

-+ {emailSuccessFooter ? ( -+

-+ {emailSuccessFooter} -+

-+ ) : null} -+
-+ ) : null} -+ -+ {!hasSubmitted && demoLoginEnabled && ( - <> - --
-+

-+ EARTH OPTIMIZATION -+

- - -
-@@ -82,6 +66,10 @@ export function EarthOptimizationDashboardClient({ - -
- -+
-+ -+
-+ -
- ({ -+ copyTextToClipboard: vi.fn(), -+})); -+ -+vi.mock("@/lib/clipboard", () => ({ -+ copyTextToClipboard: mocks.copyTextToClipboard, -+})); -+ -+import { HumanityManagerStatusPanel } from "./HumanityManagerStatusPanel"; -+ -+const STATUS_FIXTURE: HumanityManagerStatusInput = { -+ completedEmployees: [ -+ { completedAt: "2026-05-02", displayName: "Ada Lovelace" }, -+ ], -+ directConversionCount: 2, -+ downstreamConversionCount: 7, -+ overdueEmployeeCount: 1, -+ overdueEmployees: [{ displayName: "Jake Smith" }], -+ overduePresidentCount: 1, -+ overduePresidents: [ -+ { countryLabel: "Example Republic", displayName: "President Example" }, -+ ], -+ reminders: [ -+ { -+ id: "employee-invite_1", -+ label: "Jake Smith", -+ message: "Jake, vote here: https://warondisease.org/vote/mike?invite=invite_1", -+ recipientMode: "one_human", -+ title: "Employee reminder", -+ }, -+ ], -+}; -+ -+describe("HumanityManagerStatusPanel", () => { -+ let container: HTMLDivElement; -+ let root: Root; -+ -+ beforeEach(() => { -+ ( -+ globalThis as typeof globalThis & { -+ IS_REACT_ACT_ENVIRONMENT: boolean; -+ React: typeof React; -+ } -+ ).IS_REACT_ACT_ENVIRONMENT = true; -+ (globalThis as typeof globalThis & { React: typeof React }).React = React; -+ mocks.copyTextToClipboard.mockReset(); -+ mocks.copyTextToClipboard.mockResolvedValue(undefined); -+ container = document.createElement("div"); -+ document.body.appendChild(container); -+ root = createRoot(container); -+ }); -+ -+ afterEach(async () => { -+ await act(async () => { -+ root.unmount(); -+ }); -+ container.remove(); -+ }); -+ -+ it("copies the rendered reminder text from the dashboard panel", async () => { -+ await act(async () => { -+ root.render(); -+ }); -+ -+ const button = Array.from(container.querySelectorAll("button")).find( -+ (candidate) => candidate.textContent === "Copy", -+ ); -+ expect(button).toBeDefined(); -+ -+ await act(async () => { -+ Simulate.click(button!); -+ }); -+ -+ expect(mocks.copyTextToClipboard).toHaveBeenCalledWith( -+ STATUS_FIXTURE.reminders[0]?.message, -+ ); -+ }); -+}); -diff --git a/packages/web/src/components/dashboard/HumanityManagerStatusPanel.tsx b/packages/web/src/components/dashboard/HumanityManagerStatusPanel.tsx -new file mode 100644 -index 000000000..01cce48ae ---- /dev/null -+++ b/packages/web/src/components/dashboard/HumanityManagerStatusPanel.tsx -@@ -0,0 +1,12 @@ -+"use client"; -+ -+import type { HumanityManagerStatusInput } from "@/lib/humanity-manager-status-content"; -+import { HumanityManagerStatus } from "@/lib/humanity-manager-status.web"; -+ -+export function HumanityManagerStatusPanel({ -+ status, -+}: { -+ status: HumanityManagerStatusInput; -+}) { -+ return ; -+} -diff --git a/packages/web/src/components/donate/DonationCalculationNarrative.tsx b/packages/web/src/components/donate/DonationCalculationNarrative.tsx -index 9478ce71a..919101136 100644 ---- a/packages/web/src/components/donate/DonationCalculationNarrative.tsx -+++ b/packages/web/src/components/donate/DonationCalculationNarrative.tsx -@@ -18,11 +18,9 @@ import { - GLOBAL_DISEASE_DEATHS_PER_MINUTE, - GLOBAL_MILITARY_SPENDING_ANNUAL_2024, - GLOBAL_REGISTERED_VOTERS, -- GLOBAL_WARHEAD_COUNT, - MILITARY_TO_GOVERNMENT_CLINICAL_TRIALS_SPENDING_RATIO, - NEW_DISEASE_FIRST_TREATMENTS_PER_YEAR, - NUCLEAR_WINTER_OVERKILL_FACTOR, -- NUCLEAR_WINTER_WARHEAD_THRESHOLD, - POLITICAL_SUCCESS_PROBABILITY, - SAFE_COMPOUNDS_COUNT, - STATUS_QUO_AVG_YEARS_TO_FIRST_TREATMENT, -@@ -35,6 +33,8 @@ import { - UNEXPLORED_RATIO, - WILLING_TRIAL_PARTICIPANTS_GLOBAL, - } from "@optimitron/data/parameters"; -+import { NUCLEAR_OVERKILL_ALZHEIMERS_TAGLINE } from "@optimitron/data/campaign"; -+import { ParameterTemplate } from "@/components/shared/ParameterTemplate"; - import { ParameterValue } from "@/components/shared/ParameterValue"; - import type { DonationImpactDerived } from "./donation-impact-calc"; - -@@ -337,7 +337,7 @@ export function DonationCalculationNarrative({ - />{" "} - every minute. Every minute of delay, 104 humans permanently stop. With - the current live assumptions, the model estimates{" "} -- {formatQuantity(derived.livesSaved)} expected deaths -+ {formatQuantity(derived.livesSaved)} deaths - prevented and {formatQuantity(sufferingYears)} years - of suffering and disability prevented. - -@@ -376,26 +376,19 @@ export function DonationCalculationNarrative({ - param={MILITARY_TO_GOVERNMENT_CLINICAL_TRIALS_SPENDING_RATIO} - />{" "} - times less than military spending. Your chance of dying from disease -- is 100%. Your current budget does not reflect this. Earth owns{" "} -- {" "} -- nuclear warheads.{" "} -- {" "} -- is enough for nuclear winter. We have{" "} -- {" "} -- apocalypses' worth of weapons. Keep the deterrent. Spend one -- slice curing every disease. -+ is 100%. Your current budget does not reflect this.{" "} -+ -+ ), -+ }} -+ /> - - - - That is{" "} - {formatQuantity(derived.vsBedNetsMultiplier)}x the -- cost-effectiveness of bed nets at the live assumptions. Your -- calculator will display an error, emit a tiny electronic scream, and -- attempt to leave the desk. This is correct. The published skeptical -- case assumes a 99% chance humanity fumbles this and still comes out{" "} -+ cost-effectiveness of bed nets at the live assumptions. If the number -+ looks absurd, good — that is the if-it-works case. Dial the slider -+ down to the published skeptical case (1% success, which assumes a 99% -+ chance humanity fumbles this) and the treaty campaign still comes -+ out{" "} - -- . This model suggests the treaty campaign may be the most -- cost-effective way to reduce human suffering per dollar spent. If that -- sounds insane, good. Change the assumptions or attack the citations. -+ . Either direction, this model suggests the treaty campaign may be -+ the most cost-effective way to reduce human suffering per dollar -+ spent. Attack the citations or change the assumptions. - - -
-diff --git a/packages/web/src/components/donate/DonationImpactCalculator.tsx b/packages/web/src/components/donate/DonationImpactCalculator.tsx -index 238c772db..6906aa860 100644 ---- a/packages/web/src/components/donate/DonationImpactCalculator.tsx -+++ b/packages/web/src/components/donate/DonationImpactCalculator.tsx -@@ -42,7 +42,13 @@ const VOTES_STEP = 10_000_000; - - const SUCCESS_MIN = POLITICAL_SUCCESS_PROBABILITY.value; - const SUCCESS_MAX = 1; --const SUCCESS_DEFAULT = POLITICAL_SUCCESS_PROBABILITY.value; -+// Default to 100% (treaty passes) and let the user adjust DOWN via the -+// "Adjust the model" panel if they want to discount for political-success -+// probability. Previous default was POLITICAL_SUCCESS_PROBABILITY.value -+// (1%), which made every per-dollar number look 100x pessimistic on first -+// landing — wrong framing for a calculator whose narrative says "if the -+// treaty passes." Discounting is an opt-in, not the default presentation. -+const SUCCESS_DEFAULT = SUCCESS_MAX; - const SUCCESS_STEP = 0.01; - - const REDUCTION_MIN = 0.005; -@@ -204,14 +210,6 @@ export function DonationImpactCalculator() { - See how this is calculated ↓ - -

--
--

-- At the default assumptions, $1 buys about{" "} -- {formatQuantity(livesPerDollar)} expected lives and{" "} -- {formatQuantity(sufferingYearsPerDollar)} years of suffering and -- disability prevented. --

--
- -
- {(Object.keys(FIELD_LABELS) as Field[]).map((field) => ( -diff --git a/packages/web/src/components/landing/TreatyPostVoteShareFlow.tsx b/packages/web/src/components/landing/TreatyPostVoteShareFlow.tsx -index 77ac49440..dddab24d6 100644 ---- a/packages/web/src/components/landing/TreatyPostVoteShareFlow.tsx -+++ b/packages/web/src/components/landing/TreatyPostVoteShareFlow.tsx -@@ -21,6 +21,7 @@ import { - } from "@/components/landing/TreatyFlowShell"; - import { ParameterValue } from "@/components/shared/ParameterValue"; - import { TreatyMechanismExplainer } from "@/components/shared/TreatyMechanismExplainer"; -+import { ParameterTemplate } from "@/components/shared/ParameterTemplate"; - import { - trackTreatyPostVotePromotion, - trackTreatyPostVoteDetailsExpanded, -@@ -34,11 +35,16 @@ import { - EVENTUALLY_AVOIDABLE_DEATH_PCT, - GLOBAL_DISEASE_DEATHS_DAILY, - HOURS_PER_YEAR, -+ NUCLEAR_OVERKILL_SPARE_LAYERS, - SAFE_COMPOUNDS_COUNT, - TREATY_HALE_GAIN_YEAR_15, - TREATY_TRAJECTORY_LIFETIME_INCOME_GAIN_PER_CAPITA, - UNEXPLORED_RATIO, - } from "@optimitron/data/parameters"; -+import { -+ NUCLEAR_OVERKILL_BUTTON_REJECT_RESPONSE, -+ NUCLEAR_OVERKILL_TRADE_PITCH, -+} from "@optimitron/data/campaign"; - import { copyTextToClipboard } from "@/lib/clipboard"; - import { cn } from "@/lib/utils"; - import { -@@ -68,7 +74,6 @@ import { - FLOW_VOTER_LIVES_SAVED_ROUNDED, - FLOW_VOTER_SUFFERING_HOURS_PREVENTED, - FLOW_VOTER_SUFFERING_YEARS_PREVENTED, -- FLOW_WASTEFUL_APOCALYPSES, - formatFlowWords, - } from "@/lib/treaty-share-flow-parameters"; - import { embedShareAttemptId } from "@/lib/share-channels"; -@@ -106,6 +111,21 @@ const dismissButtonClass = treatySecondaryButtonClass; - const majorityHumanityText = formatFlowWords(FLOW_MAJORITY_OF_HUMANS_ON_EARTH, 1); - const voterLivesSavedText = formatFlowWords(FLOW_VOTER_LIVES_SAVED_ROUNDED, 2); - const draftInviteUrl = "warondisease.org"; -+const tradePitchSentences = -+ NUCLEAR_OVERKILL_TRADE_PITCH.match(/[^.]+\./g)?.map((sentence) => -+ sentence.trim(), -+ ) ?? []; -+ -+if (tradePitchSentences.length !== 6) { -+ throw new Error("NUCLEAR_OVERKILL_TRADE_PITCH must be six sentences."); -+} -+ -+const tradePitchParagraphs = [ -+ tradePitchSentences[0]!, -+ tradePitchSentences.slice(1, 3).join(" "), -+ tradePitchSentences.slice(3, 5).join(" "), -+ tradePitchSentences[5]!, -+] as const; - - function FlowParagraph({ - children, -@@ -125,6 +145,34 @@ function FlowButtonRow({ children }: { children: ReactNode }) { - return {children}; - } - -+function NuclearOverkillTemplate({ template }: { template: string }) { -+ return ( -+ -+ ), -+ NUCLEAR_OVERKILL_SPARE_LAYERS: ( -+ -+ ), -+ NUCLEAR_WINTER_OVERKILL_FACTOR: ( -+ -+ ), -+ NUCLEAR_WINTER_WARHEAD_THRESHOLD: ( -+ -+ ), -+ }} -+ /> -+ ); -+} -+ - function DetailsBlock({ - children, - summary = "Show the math", -@@ -317,7 +365,7 @@ function PromotionScreen({ onChoice }: { onChoice: (target: "friend" | "humanity - -
-
--
Direct reports
-+
Employees
-
~8 billion humans
-
-
-@@ -794,22 +842,16 @@ export function TreatyPostVoteShareFlow({ -
- {alt ? ( - -- Cool. The{" "} -- {" "} -- apocalypses haven't moved. -+ - - ) : null} -- -- nuclear weapons exploding triggers a nuclear winter that collapses the food chain and kills most humans. -- -- -- Humanity has about nuclear weapons. That's apocalypses of mass murder capacity. -- -- You can only ruin Earth once. The other are just wasteful. -- The 1% Treaty asks you to trade one apocalypse for something slightly nicer. -+ {tradePitchParagraphs.map((paragraph) => ( -+ -+ -+ -+ ))} -
- -
- ) : ( -
-- {`${recipientLabel} added to your direct reports. Pending: `}{sentCount}{` lifetimes / `}{pendingLives}{` lives.`} -+ {`${recipientLabel} added to your employees. Pending: `}{sentCount}{` lifetimes / `}{pendingLives}{` lives.`} - {milestone ? {milestone} : null} -
- )} -diff --git a/packages/web/src/components/landing/TreatyVoteFlow.tsx b/packages/web/src/components/landing/TreatyVoteFlow.tsx -index c0c5aafa6..4dc5d6636 100644 ---- a/packages/web/src/components/landing/TreatyVoteFlow.tsx -+++ b/packages/web/src/components/landing/TreatyVoteFlow.tsx -@@ -15,6 +15,10 @@ import { syncPendingReferendumVotes } from "@/lib/referendum-vote-sync"; - import { getHandleOrReferralCode } from "@/lib/referral.client"; - import confetti from "canvas-confetti"; - import { motion, AnimatePresence } from "framer-motion"; -+import { -+ NUCLEAR_OVERKILL_BUTTON_REJECT_RESPONSE, -+ NUCLEAR_OVERKILL_FULL_EXPLANATION, -+} from "@optimitron/data/campaign"; - import { - DFDA_QUEUE_CLEARANCE_YEARS, - DFDA_TRIAL_CAPACITY_MULTIPLIER, -@@ -23,6 +27,7 @@ import { - VOTER_LIVES_SAVED, - VOTER_SUFFERING_HOURS_PREVENTED, - } from "@optimitron/data/parameters"; -+import { ParameterTemplate } from "@/components/shared/ParameterTemplate"; - // Convert the ratio to percentages so the reality-check matches the format - // the user just used on the slider (their answer was a %, today's reality - // should also be a %). Module-level so the math runs once, not per render. -@@ -65,6 +70,20 @@ import { - - type PreVoteScreen = "apology" | "grandma" | "apocalypse" | "slider"; - -+const fullExplanationSentences = -+ NUCLEAR_OVERKILL_FULL_EXPLANATION.match(/[^.]+\./g)?.map((sentence) => -+ sentence.trim(), -+ ) ?? []; -+ -+if (fullExplanationSentences.length !== 3) { -+ throw new Error("NUCLEAR_OVERKILL_FULL_EXPLANATION must be three sentences."); -+} -+ -+const fullExplanationParagraphs = [ -+ fullExplanationSentences[0]!, -+ fullExplanationSentences.slice(1).join(" "), -+] as const; -+ - interface TreatyVoteFlowProps { - authCallbackUrl?: string; - className?: string; -@@ -81,6 +100,31 @@ interface TreatyVoteFlowProps { - - const DEFAULT_SLIDER_HEADLINE = "Please Take 30 Seconds to End War and Disease"; - -+function NuclearOverkillTemplate({ template }: { template: string }) { -+ return ( -+ -+ ), -+ NUCLEAR_WINTER_OVERKILL_FACTOR: ( -+ -+ ), -+ NUCLEAR_WINTER_WARHEAD_THRESHOLD: ( -+ -+ ), -+ }} -+ /> -+ ); -+} -+ - export function TreatyVoteFlow({ - authCallbackUrl = ROUTES.dashboard, - className, -@@ -550,26 +594,16 @@ export function TreatyVoteFlow({ -
- {preVoteDismissiveCount > 0 ? ( - -- Cool. The{" "} -- {" "} -- apocalypses haven't moved. -+ - - ) : null} -- -- {" "} -- nuclear weapons exploding triggers a nuclear winter that -- collapses the food chain and kills most humans. -- -- -- Humanity has about{" "} -- {" "} -- nuclear weapons. That's{" "} -- {" "} -- apocalypses of mass murder capacity. -- -+ {fullExplanationParagraphs.map((paragraph) => ( -+ -+ -+ -+ ))} - - You can only ruin Earth once. The other{" "} - {" "} -@@ -639,9 +673,9 @@ export function TreatyVoteFlow({ - ) : ( - --
-+
-

- Save your vote. -

-@@ -967,8 +1001,8 @@ export function TreatyVoteFlow({ -
- - ) : ( -- --
-+ -+
-

- {isContextFirstVariant ? "Vote counted." : "Save Your Vote"} -

-diff --git a/packages/web/src/components/referendum/ReferendumStepper.tsx b/packages/web/src/components/referendum/ReferendumStepper.tsx -index 11dea263a..78021911c 100644 ---- a/packages/web/src/components/referendum/ReferendumStepper.tsx -+++ b/packages/web/src/components/referendum/ReferendumStepper.tsx -@@ -617,9 +617,9 @@ export function ReferendumStepper({ -
-
-
--

-+

- {introText} --

-+

-
{signatureContent}
-
- {slides.map((slide, i) => ( -diff --git a/packages/web/src/components/shared/ParameterTemplate.tsx b/packages/web/src/components/shared/ParameterTemplate.tsx -new file mode 100644 -index 000000000..161f6c10c ---- /dev/null -+++ b/packages/web/src/components/shared/ParameterTemplate.tsx -@@ -0,0 +1,47 @@ -+import { Fragment, type ReactNode } from "react"; -+ -+const PARAMETER_TOKEN_PATTERN = /\{([A-Z0-9_]+)\}/g; -+ -+export function ParameterTemplate({ -+ template, -+ values, -+}: { -+ template: string; -+ values: Partial>; -+}) { -+ const parts: ReactNode[] = []; -+ let lastIndex = 0; -+ -+ for (const match of template.matchAll(PARAMETER_TOKEN_PATTERN)) { -+ const [placeholder, token] = match; -+ const index = match.index ?? 0; -+ -+ if (!token) { -+ throw new Error(`Invalid ParameterTemplate token in ${template}`); -+ } -+ -+ if (index > lastIndex) { -+ parts.push(template.slice(lastIndex, index)); -+ } -+ -+ const value = values[token]; -+ if (value === undefined) { -+ throw new Error(`Missing ParameterTemplate value for ${token}`); -+ } -+ -+ parts.push(value); -+ lastIndex = index + placeholder.length; -+ } -+ -+ if (lastIndex < template.length) { -+ parts.push(template.slice(lastIndex)); -+ } -+ -+ return ( -+ <> -+ {parts.map((part, index) => ( -+ {part} -+ ))} -+ -+ ); -+} -diff --git a/packages/web/src/components/shared/ParameterValue.core.ts b/packages/web/src/components/shared/ParameterValue.core.ts -index a21344998..3d8f075c6 100644 ---- a/packages/web/src/components/shared/ParameterValue.core.ts -+++ b/packages/web/src/components/shared/ParameterValue.core.ts -@@ -55,6 +55,10 @@ export function getParameterCitation(param: Parameter): Citation | undefined { - return param.sourceRef ? citations[param.sourceRef] : undefined; - } - -+export function getParameterReferenceUrl(param: Parameter): string | null { -+ return param.manualPageUrl ?? param.calculationsUrl ?? null; -+} -+ - export function hasParameterMetadata(param: Parameter) { - const citation = getParameterCitation(param); - return [ -diff --git a/packages/web/src/components/shared/ParameterValue.tsx b/packages/web/src/components/shared/ParameterValue.tsx -index e1a689fbe..fe8a161a6 100644 ---- a/packages/web/src/components/shared/ParameterValue.tsx -+++ b/packages/web/src/components/shared/ParameterValue.tsx -@@ -16,6 +16,7 @@ import { cn } from "@/lib/utils"; - import { - formatParameterValueText, - getParameterCitation, -+ getParameterReferenceUrl, - hasParameterMetadata, - type ParameterValueProps, - } from "@/components/shared/ParameterValue.core"; -@@ -39,9 +40,17 @@ export function ParameterValue({ - valueOverride, - }); - const hasMetadata = hasParameterMetadata(param); -+ const referenceUrl = getParameterReferenceUrl(param); - - if (presentation === "inline" || !hasMetadata) { -- return {text}; -+ return ( -+ -+ {text} -+ -+ ); - } - - return ( -@@ -49,6 +58,7 @@ export function ParameterValue({ - - "); -+ }); -+ -+ it("keeps source URLs on inline values too", () => { -+ const html = renderToStaticMarkup( -+ , -+ ); -+ -+ expect(html).toContain("30 seconds"); -+ }); -+}); -diff --git a/packages/web/src/lib/__tests__/dashboard.server.test.ts b/packages/web/src/lib/__tests__/dashboard.server.test.ts -index a9e682533..526e3db22 100644 ---- a/packages/web/src/lib/__tests__/dashboard.server.test.ts -+++ b/packages/web/src/lib/__tests__/dashboard.server.test.ts -@@ -1,4 +1,4 @@ --import { describe, expect, it, vi } from "vitest"; -+import { beforeEach, describe, expect, it, vi } from "vitest"; - - // Mock prisma before importing the module under test - vi.mock("@/lib/prisma", () => ({ -@@ -35,6 +35,14 @@ vi.mock("@/lib/impact-receipts.server", () => ({ - getImpactReceipts: vi.fn(), - })) - -+vi.mock("@/lib/humanity-manager-status.server", () => ({ -+ loadHumanityManagerStatus: vi.fn(), -+})) -+ -+vi.mock("@/lib/url", () => ({ -+ getBaseUrl: vi.fn(() => "https://warondisease.org"), -+})) -+ - // Mock auth - vi.mock("@/lib/auth", () => ({ - authOptions: {}, -@@ -43,9 +51,25 @@ vi.mock("@/lib/auth", () => ({ - import { prisma } from "@/lib/prisma"; - import { getWishBalance } from "@/lib/wishes.server" - import { getImpactReceipts } from "@/lib/impact-receipts.server" -+import { loadHumanityManagerStatus } from "@/lib/humanity-manager-status.server" - import { getDashboardData } from "../dashboard.server"; - -+const HUMANITY_MANAGER_STATUS_FIXTURE = { -+ completedEmployees: [], -+ directConversionCount: 1, -+ downstreamConversionCount: 7, -+ overdueEmployeeCount: 0, -+ overdueEmployees: [], -+ overduePresidentCount: 0, -+ overduePresidents: [], -+ reminders: [], -+}; -+ - describe("getDashboardData", () => { -+ beforeEach(() => { -+ vi.mocked(loadHumanityManagerStatus).mockReset(); -+ }); -+ - it("throws when user is not found", async () => { - vi.mocked(prisma.user.findUnique).mockResolvedValueOnce(null); - -@@ -61,6 +85,7 @@ describe("getDashboardData", () => { - email: "test@example.com", - bio: "Hello", - referralCode: "ref-123", -+ downstreamConversionCount: 7, - image: null, - newsletterSubscribed: true, - person: { -@@ -134,6 +159,9 @@ describe("getDashboardData", () => { - items: [], - walletCount: 0, - }); -+ vi.mocked(loadHumanityManagerStatus).mockResolvedValueOnce( -+ HUMANITY_MANAGER_STATUS_FIXTURE, -+ ); - vi.mocked(prisma.wishPoint.findMany).mockResolvedValueOnce([ - { reason: "DAILY_CHECKIN" }, - ] as any); -@@ -162,6 +190,20 @@ describe("getDashboardData", () => { - "PRIZE_DEPOSIT", - ]); - expect(result.impactReceipts).toEqual({ items: [], walletCount: 0 }); -+ expect(result.humanityManagerStatus).toBe( -+ HUMANITY_MANAGER_STATUS_FIXTURE, -+ ); -+ expect(loadHumanityManagerStatus).toHaveBeenCalledWith( -+ expect.objectContaining({ -+ baseUrl: "https://warondisease.org", -+ user: expect.objectContaining({ -+ downstreamConversionCount: 7, -+ handle: "testuser", -+ referralCode: "ref-123", -+ }), -+ userId: "user-1", -+ }), -+ ); - // REFERRAL stays incomplete until the user hits the gameplay goal. - const referralQuest = result.questChecklist.find((q) => q.reason === "REFERRAL"); - expect(referralQuest?.completed).toBe(false); -diff --git a/packages/web/src/lib/__tests__/humanity-manager-status.server.test.ts b/packages/web/src/lib/__tests__/humanity-manager-status.server.test.ts -new file mode 100644 -index 000000000..1af141956 ---- /dev/null -+++ b/packages/web/src/lib/__tests__/humanity-manager-status.server.test.ts -@@ -0,0 +1,104 @@ -+import { beforeEach, describe, expect, it, vi } from "vitest"; -+ -+const mocks = vi.hoisted(() => ({ -+ prisma: { -+ referralInvitation: { -+ count: vi.fn(), -+ findMany: vi.fn(), -+ }, -+ task: { -+ count: vi.fn(), -+ findMany: vi.fn(), -+ }, -+ }, -+})); -+ -+vi.mock("@/lib/prisma", () => ({ -+ prisma: mocks.prisma, -+})); -+ -+import { loadHumanityManagerStatus } from "../humanity-manager-status.server"; -+ -+describe("loadHumanityManagerStatus", () => { -+ beforeEach(() => { -+ mocks.prisma.referralInvitation.count.mockReset(); -+ mocks.prisma.referralInvitation.findMany.mockReset(); -+ mocks.prisma.task.count.mockReset(); -+ mocks.prisma.task.findMany.mockReset(); -+ }); -+ -+ it("uses cached downstream User columns while direct referral rows stay live", async () => { -+ mocks.prisma.referralInvitation.count -+ .mockResolvedValueOnce(2) -+ .mockResolvedValueOnce(1); -+ mocks.prisma.referralInvitation.findMany -+ .mockResolvedValueOnce([ -+ { -+ convertedAt: new Date("2026-05-02T00:00:00.000Z"), -+ convertedVote: { -+ createdAt: new Date("2026-05-02T00:00:00.000Z"), -+ person: { displayName: "Ada Lovelace" }, -+ user: { person: { displayName: null } }, -+ }, -+ recipientName: "Ada", -+ }, -+ ]) -+ .mockResolvedValueOnce([ -+ { -+ inviteToken: "invite_1", -+ recipientName: "Jake Smith", -+ }, -+ ]); -+ mocks.prisma.task.count.mockResolvedValueOnce(1); -+ mocks.prisma.task.findMany.mockResolvedValueOnce([ -+ { -+ assigneeAffiliationSnapshot: "Example Republic", -+ assigneePerson: { -+ countryCode: "US", -+ currentAffiliation: "Example Republic", -+ displayName: "President Example", -+ handle: "president-example", -+ }, -+ contextJson: { -+ assigneeProfile: { -+ budgetUsdPerYear: 900_000_000_000, -+ governmentBudgetUsdPerYear: 6_000_000_000_000, -+ }, -+ }, -+ dueAt: new Date("2026-05-01T00:00:00.000Z"), -+ id: "task_1", -+ taskKey: "treaty-signer:example", -+ title: "Sign the 1% Treaty", -+ }, -+ ]); -+ -+ const result = await loadHumanityManagerStatus({ -+ baseUrl: "https://warondisease.org", -+ now: new Date("2026-05-15T00:00:00.000Z"), -+ user: { -+ downstreamConversionCount: 7, -+ handle: "mike", -+ referralCode: "ref_123", -+ }, -+ userId: "user_1", -+ }); -+ -+ expect(result.directConversionCount).toBe(2); -+ expect(result.downstreamConversionCount).toBe(7); -+ expect(result.completedEmployees[0]).toMatchObject({ -+ displayName: "Ada Lovelace", -+ }); -+ expect(result.overdueEmployees[0]).toMatchObject({ -+ displayName: "Jake Smith", -+ }); -+ expect(result.reminders.map((reminder) => reminder.recipientMode)).toEqual([ -+ "one_human", -+ "leader", -+ ]); -+ expect(result.reminders[0]?.message).toContain( -+ "https://warondisease.org/vote/mike?invite=invite_1", -+ ); -+ expect(result.reminders[1]?.message).toContain("President Example"); -+ expect(result.reminders[1]?.message).not.toMatch(/\{\w+\}/); -+ }); -+}); -diff --git a/packages/web/src/lib/__tests__/redirects.test.ts b/packages/web/src/lib/__tests__/redirects.test.ts -index 4ff51c023..400b32f2f 100644 ---- a/packages/web/src/lib/__tests__/redirects.test.ts -+++ b/packages/web/src/lib/__tests__/redirects.test.ts -@@ -29,4 +29,24 @@ describe("redirects", () => { - }); - } - }); -+ -+ // Regression guard for the 2026-05-14 production 404 on -+ // /find-trials?condition=...&intervention=... — InterventionCard renders a -+ // relative /find-trials link via generatePatientTrialSearchPath, which -+ // 404s when the card surfaces on a warondisease.org page (the route is -+ // canonical on dfda.earth, not warondisease.org). -+ it("redirects warondisease.org/find-trials to dfda.earth", () => { -+ expect(REDIRECTS).toContainEqual({ -+ source: "/find-trials", -+ has: [{ type: "host", value: "warondisease.org" }], -+ destination: "https://dfda.earth/find-trials", -+ permanent: true, -+ }); -+ expect(REDIRECTS).toContainEqual({ -+ source: "/find-trials/:path*", -+ has: [{ type: "host", value: "warondisease.org" }], -+ destination: "https://dfda.earth/find-trials/:path*", -+ permanent: true, -+ }); -+ }); - }); -diff --git a/packages/web/src/lib/__tests__/referral-invitation-tasks.server.test.ts b/packages/web/src/lib/__tests__/referral-invitation-tasks.server.test.ts -index ba5e196c9..163bd17f1 100644 ---- a/packages/web/src/lib/__tests__/referral-invitation-tasks.server.test.ts -+++ b/packages/web/src/lib/__tests__/referral-invitation-tasks.server.test.ts -@@ -9,6 +9,7 @@ const mocks = vi.hoisted(() => { - prisma: { - task: { update: vi.fn() }, - }, -+ syncPerVerifiedVoterTaskImpactEstimate: vi.fn(), - tx, - }; - }); -@@ -22,6 +23,11 @@ vi.mock("@/lib/triggers", () => ({ - fireTaskTrigger: mocks.fireTaskTrigger, - })); - -+vi.mock("@/lib/tasks/per-verified-voter-impact.server", () => ({ -+ syncPerVerifiedVoterTaskImpactEstimate: -+ mocks.syncPerVerifiedVoterTaskImpactEstimate, -+})); -+ - import { createReferralInvitationTask } from "@/lib/referral-invitation-tasks.server"; - - describe("createReferralInvitationTask", () => { -@@ -79,6 +85,10 @@ describe("createReferralInvitationTask", () => { - expect(mocks.tx.task.update).toHaveBeenCalledWith( - expect.objectContaining({ where: { id: "task_1" } }), - ); -+ expect(mocks.syncPerVerifiedVoterTaskImpactEstimate).toHaveBeenCalledWith( -+ mocks.tx, -+ "task_1", -+ ); - expect(mocks.prisma.task.update).not.toHaveBeenCalled(); - }); - }); -diff --git a/packages/web/src/lib/__tests__/referral-invitations.server.test.ts b/packages/web/src/lib/__tests__/referral-invitations.server.test.ts -index 3f20e1588..fd6cb7c91 100644 ---- a/packages/web/src/lib/__tests__/referral-invitations.server.test.ts -+++ b/packages/web/src/lib/__tests__/referral-invitations.server.test.ts -@@ -8,10 +8,16 @@ import { - const mocks = vi.hoisted(() => { - const tx = { - person: { upsert: vi.fn() }, -- referralInvitation: { create: vi.fn(), findUnique: vi.fn(), update: vi.fn() }, -+ referralInvitation: { -+ create: vi.fn(), -+ findFirst: vi.fn(), -+ findMany: vi.fn(), -+ findUnique: vi.fn(), -+ update: vi.fn(), -+ }, - task: { updateMany: vi.fn() }, - taskComment: { create: vi.fn() }, -- user: { updateMany: vi.fn() }, -+ user: { update: vi.fn(), updateMany: vi.fn() }, - }; - - return { -@@ -257,8 +263,10 @@ describe("convertReferralInvitationForVote", () => { - convertedVoteId: "vote_1", - status: "CONVERTED", - }); -+ mocks.tx.referralInvitation.findMany.mockResolvedValue([]); - mocks.tx.task.updateMany.mockResolvedValue({ count: 1 }); - mocks.tx.taskComment.create.mockResolvedValue({ id: "comment_1" }); -+ mocks.tx.user.update.mockResolvedValue({ id: "referrer_1" }); - mocks.tx.user.updateMany.mockResolvedValue({ count: 1 }); - }); - -@@ -321,4 +329,40 @@ describe("convertReferralInvitationForVote", () => { - taskId: "task_1", - }); - }); -+ -+ it("increments downstream conversion counts through a three-level referrer chain", async () => { -+ mocks.prisma.referralInvitation.findFirst.mockResolvedValue({ -+ id: "invite_leaf", -+ convertedVoteId: null, -+ recipientName: "Leaf Voter", -+ recipientPersonId: null, -+ referendumId: "ref_1", -+ referrerUserId: "ancestor_3", -+ status: "PENDING", -+ taskId: null, -+ }); -+ mocks.tx.referralInvitation.findMany -+ .mockResolvedValueOnce([{ referrerUserId: "ancestor_2" }]) -+ .mockResolvedValueOnce([{ referrerUserId: "ancestor_1" }]) -+ .mockResolvedValueOnce([]); -+ -+ await convertReferralInvitationForVote({ -+ inviteToken: "token_leaf", -+ referendumId: "ref_1", -+ voterUserId: "voter_leaf", -+ voteId: "vote_leaf", -+ }); -+ -+ expect(mocks.tx.user.update).toHaveBeenCalledTimes(3); -+ expect(mocks.tx.user.update.mock.calls.map(([input]) => input.where.id)).toEqual([ -+ "ancestor_3", -+ "ancestor_2", -+ "ancestor_1", -+ ]); -+ for (const [input] of mocks.tx.user.update.mock.calls) { -+ expect(input.data).toEqual({ -+ downstreamConversionCount: { increment: 1 }, -+ }); -+ } -+ }); - }); -diff --git a/packages/web/src/lib/__tests__/user-treaty-task.server.test.ts b/packages/web/src/lib/__tests__/user-treaty-task.server.test.ts -index 3eb97667d..8689ad157 100644 ---- a/packages/web/src/lib/__tests__/user-treaty-task.server.test.ts -+++ b/packages/web/src/lib/__tests__/user-treaty-task.server.test.ts -@@ -4,6 +4,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; - const fireMocks = vi.hoisted(() => ({ - fireTaskTrigger: vi.fn(), - fireTaskTriggersForEvent: vi.fn().mockResolvedValue([]), -+ syncPerVerifiedVoterTaskImpactEstimate: vi.fn(), - })); - - vi.mock("@/lib/prisma", () => ({ -@@ -17,6 +18,11 @@ vi.mock("@/lib/triggers", () => ({ - buildTriggerParams: () => ({}), - })); - -+vi.mock("@/lib/tasks/per-verified-voter-impact.server", () => ({ -+ syncPerVerifiedVoterTaskImpactEstimate: -+ fireMocks.syncPerVerifiedVoterTaskImpactEstimate, -+})); -+ - import { - ensureUserTreatyTask, - getUserTreatyTaskKey, -@@ -299,6 +305,7 @@ describe("user treaty task tree", () => { - beforeEach(() => { - fireMocks.fireTaskTrigger.mockReset(); - fireMocks.fireTaskTriggersForEvent.mockReset(); -+ fireMocks.syncPerVerifiedVoterTaskImpactEstimate.mockReset(); - fireMocks.fireTaskTriggersForEvent.mockResolvedValue([]); - }); - -@@ -330,6 +337,12 @@ describe("user treaty task tree", () => { - seeded.subtaskIds.completeTraining, - ); - expect(result.subtaskStatuses.shareReferralUrl).toBe(TaskStatus.ACTIVE); -+ expect( -+ fireMocks.syncPerVerifiedVoterTaskImpactEstimate, -+ ).toHaveBeenCalledWith( -+ expect.anything(), -+ seeded.subtaskIds.signTreatyPersonally, -+ ); - }); - - it("ensureUserTreatyTask reports created=false on subsequent fires", async () => { -diff --git a/packages/web/src/lib/dashboard.server.ts b/packages/web/src/lib/dashboard.server.ts -index 56d3606e2..6e6e6cd62 100644 ---- a/packages/web/src/lib/dashboard.server.ts -+++ b/packages/web/src/lib/dashboard.server.ts -@@ -26,6 +26,8 @@ import { getImpactReceipts } from "@/lib/impact-receipts.server"; - import { buildOfficialReferendumVoteWhere } from "@/lib/referendum-vote-classification.server"; - import { DASHBOARD_REFERRAL_HASH, ROUTES } from "@/lib/routes"; - import { GAME } from "@/lib/messaging"; -+import { loadHumanityManagerStatus } from "@/lib/humanity-manager-status.server"; -+import { getBaseUrl } from "@/lib/url"; - import type { - DashboardData, - LeaderboardEntry, -@@ -135,9 +137,18 @@ export async function getDashboardData( - }), - ]); - const completedSet = new Set(completedReasons.map((r) => r.reason)); -- const [wishBalance, impactReceipts] = await Promise.all([ -+ const [wishBalance, impactReceipts, humanityManagerStatus] = await Promise.all([ - getWishBalance(userId), - getImpactReceipts(userId), -+ loadHumanityManagerStatus({ -+ baseUrl: getBaseUrl(), -+ user: { -+ downstreamConversionCount: user.downstreamConversionCount ?? 0, -+ handle: getUserDisplayHandle(user), -+ referralCode: user.referralCode, -+ }, -+ userId, -+ }), - ]); - - // High-value quests — the core game loop -@@ -291,6 +302,7 @@ export async function getDashboardData( - }, - questChecklist, - impactReceipts, -+ humanityManagerStatus, - }; - } - -diff --git a/packages/web/src/lib/email/__tests__/monthly-chain-digest-email.test.ts b/packages/web/src/lib/email/__tests__/monthly-chain-digest-email.test.ts -index fc50160a1..58e8a2248 100644 ---- a/packages/web/src/lib/email/__tests__/monthly-chain-digest-email.test.ts -+++ b/packages/web/src/lib/email/__tests__/monthly-chain-digest-email.test.ts -@@ -20,12 +20,26 @@ const BASE: Omit< - monthLabel: "May 2026", - overdueEmployeeCount: 2, - overdueEmployees: [ -- { displayName: "Jake Smith" }, -- { displayName: "Maria Chen" }, -+ { -+ currentDelayDays: 12, -+ currentHumanLivesLost: 1800, -+ displayName: "Jake Smith", -+ }, -+ { -+ currentDelayDays: 8, -+ currentHumanLivesLost: 1200, -+ displayName: "Maria Chen", -+ }, - ], - overduePresidentCount: 189, - overduePresidents: [ -- { displayName: "President Example", countryLabel: "Example Republic" }, -+ { -+ countryCode: "US", -+ countryLabel: "Example Republic", -+ currentDelayDays: 30, -+ currentHumanLivesLost: 4500, -+ displayName: "President Example", -+ }, - ], - }; - -@@ -69,9 +83,13 @@ describe("monthly chain digest — positive variant (N > 0)", () => { - - it("html includes copy-paste reminders with the referral URL", async () => { - const { html } = await renderMonthlyDigest(input); -- expect(html).toContain("You are late on a 30-second task"); -- expect(html).toContain("Dear President [name]"); -+ expect(html).toContain("Yeahhh, hi Jake Smith"); -+ expect(html).toContain("Department of Civilization Made a Spreadsheet"); -+ expect(html).toContain("1.8K people have died"); -+ expect(html).toContain("Yeahhh, hi President Example"); -+ expect(html).toContain("4.5K people have died"); - expect(html).toContain(BASE.referralUrl); -+ expect(html).not.toContain("{target_name}"); - }); - - it("plaintext mirrors html content", async () => { -@@ -80,9 +98,11 @@ describe("monthly chain digest — positive variant (N > 0)", () => { - expect(text.toLowerCase()).toContain("7 employees completed"); - expect(text).toContain("Ada Lovelace"); - expect(text).toContain("Jake Smith"); -- expect(text).toContain("Dear President [name]"); -+ expect(text).toContain("Yeahhh, hi Jake Smith"); -+ expect(text).toContain("Yeahhh, hi President Example"); - expect(text).toContain("4 billion"); - expect(text).toContain(BASE.referralUrl); -+ expect(text).not.toContain("{target_name}"); - }); - }); - -@@ -103,7 +123,8 @@ describe("monthly chain digest — resend variant (N == 0)", () => { - const { html } = await renderMonthlyDigest(input); - expect(html).toContain("No employees completed the 30-second task"); - expect(html).toContain("Late employee reminder"); -- expect(html).toContain("Dear President [name]"); -+ expect(html).toContain("Yeahhh, hi Jake Smith"); -+ expect(html).toContain("Yeahhh, hi President Example"); - expect(html).toContain(BASE.referralUrl); - expect(html).not.toContain("send them a nudge"); - }); -@@ -112,7 +133,9 @@ describe("monthly chain digest — resend variant (N == 0)", () => { - const { text } = await renderMonthlyDigest(input); - expect(text.toLowerCase()).toContain("no employees completed the 30-second"); - expect(text.toLowerCase()).toContain("task through your link"); -- expect(text).toContain("Dear President [name]"); -+ expect(text).toContain("Yeahhh, hi Jake Smith"); -+ expect(text).toContain("Yeahhh, hi President Example"); - expect(text).toContain(BASE.referralUrl); -+ expect(text).not.toContain("{target_name}"); - }); - }); -diff --git a/packages/web/src/lib/email/__tests__/post-vote-share-email.test.ts b/packages/web/src/lib/email/__tests__/post-vote-share-email.test.ts -index 7a8e51006..e4aaabb0b 100644 ---- a/packages/web/src/lib/email/__tests__/post-vote-share-email.test.ts -+++ b/packages/web/src/lib/email/__tests__/post-vote-share-email.test.ts -@@ -17,6 +17,9 @@ describe("post-vote share email template", () => { - expect(html).toContain(SAMPLE_URL); - expect(html).toContain("End war and disease"); - expect(html).toContain("Forward this email"); -+ expect(html).toContain("Hi there"); -+ expect(html).toContain("respond to this stupid survey"); -+ expect(html).not.toContain("{treaty_url}"); - }); - - it("escapes the URL so a hostile referral code cannot inject HTML", async () => { -@@ -31,5 +34,8 @@ describe("post-vote share email template", () => { - expect(text).toContain(SAMPLE_URL); - expect(text).toContain("Forward this email"); - expect(text).toContain("wherever humans read your words"); -+ expect(text).toContain("Hi there"); -+ expect(text).toContain("respond to this stupid survey"); -+ expect(text).not.toContain("{target_name}"); - }); - }); -diff --git a/packages/web/src/lib/email/__tests__/referral-first-conversion-email.test.ts b/packages/web/src/lib/email/__tests__/referral-first-conversion-email.test.ts -index d6143873f..3769c2f86 100644 ---- a/packages/web/src/lib/email/__tests__/referral-first-conversion-email.test.ts -+++ b/packages/web/src/lib/email/__tests__/referral-first-conversion-email.test.ts -@@ -51,8 +51,13 @@ describe("referral-first-conversion email template", () => { - // it into any channel without going back to the website. - expect(html).toContain("Forward this"); - expect(html).toContain(SAMPLE.referrerReferralUrl); -- expect(html).toContain("I love you"); -+ expect(html).toContain("Hi there"); -+ expect(html).toContain("I love you very much"); -+ expect(html).toContain("respond to this stupid survey"); -+ expect(html).not.toContain("{treaty_url}"); - expect(text).toContain("Forward this"); - expect(text).toContain(SAMPLE.referrerReferralUrl); -+ expect(text).toContain("Hi there"); -+ expect(text).not.toContain("{target_name}"); - }); - }); -diff --git a/packages/web/src/lib/email/__tests__/share-footer.test.ts b/packages/web/src/lib/email/__tests__/share-footer.test.ts -index 13690f283..03c0e7cdf 100644 ---- a/packages/web/src/lib/email/__tests__/share-footer.test.ts -+++ b/packages/web/src/lib/email/__tests__/share-footer.test.ts -@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; - import { SHARING_TIME_MINUTES } from "@optimitron/data/parameters"; - import { FLOW_MAJORITY_OF_HUMANS_ON_EARTH } from "@/lib/treaty-share-flow-parameters"; - import { -+ buildEmailShareTemplateText, - buildShareFooterHtml, - buildShareFooterText, - } from "@/lib/email/share-footer"; -@@ -29,4 +30,14 @@ describe("share footer", () => { - expect(text).not.toContain(" { -+ const text = buildEmailShareTemplateText({ referralUrl: SAMPLE_URL }); -+ expect(text).toContain("Hi there"); -+ expect(text).toContain("I love you very much"); -+ expect(text).toContain("respond to this stupid survey"); -+ expect(text).toContain(SAMPLE_URL); -+ expect(text).not.toContain("{target_name}"); -+ expect(text).not.toContain("{treaty_url}"); -+ }); - }); -diff --git a/packages/web/src/lib/email/__tests__/wishonia-signature.test.ts b/packages/web/src/lib/email/__tests__/wishonia-signature.test.ts -index e69da7a03..ea058163d 100644 ---- a/packages/web/src/lib/email/__tests__/wishonia-signature.test.ts -+++ b/packages/web/src/lib/email/__tests__/wishonia-signature.test.ts -@@ -89,7 +89,7 @@ describe("Wishonia signature module", () => { - describe("buildWishoniaSignatureHtml", () => { - it("includes the absolute avatar URL from the email base", () => { - const html = buildWishoniaSignatureHtml({ title: "X", tagline: "Y" }); -- expect(html).toContain("https://test.example/sprites/wishonia/smirk-smile.png"); -+ expect(html).toContain("https://test.example/sprites/wishonia/happy-smile.png"); - }); - - it("includes the canonical sign-off, name, and company", () => { -diff --git a/packages/web/src/lib/email/monthly-chain-digest-email.ts b/packages/web/src/lib/email/monthly-chain-digest-email.ts -index f1798f6d1..66e15f77a 100644 ---- a/packages/web/src/lib/email/monthly-chain-digest-email.ts -+++ b/packages/web/src/lib/email/monthly-chain-digest-email.ts -@@ -21,10 +21,15 @@ export const MONTHLY_CHAIN_DIGEST_TEMPLATE_ID = "monthly-chain-digest"; - export interface MonthlyChainDigestPerson { - displayName: string; - completedAt?: Date | string | null; -+ currentDelayDays?: number | null; -+ currentHumanLivesLost?: number | null; - } - - export interface MonthlyChainDigestLeader { -+ countryCode?: string | null; - countryLabel?: string | null; -+ currentDelayDays?: number | null; -+ currentHumanLivesLost?: number | null; - displayName: string; - } - -@@ -35,9 +40,9 @@ export interface MonthlyChainDigestInput { - totalConversionCount: number; - /** People who completed the 30-second task through this user's link this month. */ - completedEmployees: MonthlyChainDigestPerson[]; -- /** Direct reports created by this user that have not converted yet. */ -+ /** Employees created by this user that have not converted yet. */ - overdueEmployeeCount: number; -- /** Sample of overdue direct reports, oldest first. */ -+ /** Sample of overdue employees, oldest first. */ - overdueEmployees: MonthlyChainDigestPerson[]; - /** Global count of overdue heads of government. */ - overduePresidentCount: number; -@@ -64,7 +69,7 @@ export const MONTHLY_CHAIN_DIGEST_PREVIEW: EmailPreview = { - templateId: MONTHLY_CHAIN_DIGEST_TEMPLATE_ID, - displayName: "Monthly Humanity Manager status report", - trigger: -- "Fires once per month per user via cron, deduped on user+yyyy-mm. Reports which direct reports voted through the user's link, which assigned humans are still late, and how many presidents still have not completed their 30-second treaty task.", -+ "Fires once per month per user via cron, deduped on user+yyyy-mm. Reports which employees voted through the user's link, which assigned humans are still late, and how many presidents still have not completed their 30-second treaty task.", - scope: "onboarding", - from: () => formatDefaultSystemEmailFromHeader(), - subject: () => -@@ -88,18 +93,45 @@ const MONTHLY_CHAIN_DIGEST_FIXTURE: MonthlyChainDigestInput = { - monthlyConversionCount: 7, - overdueEmployeeCount: 3, - overdueEmployees: [ -- { displayName: "Jake Smith" }, -- { displayName: "Maria Chen" }, -- { displayName: "Uncle Dave" }, -+ { -+ currentDelayDays: 12, -+ currentHumanLivesLost: 1800, -+ displayName: "Jake Smith", -+ }, -+ { -+ currentDelayDays: 8, -+ currentHumanLivesLost: 1200, -+ displayName: "Maria Chen", -+ }, -+ { -+ currentDelayDays: 4, -+ currentHumanLivesLost: 600, -+ displayName: "Uncle Dave", -+ }, - ], - overduePresidentCount: 189, - overduePresidents: [ -- { displayName: "President Example", countryLabel: "Example Republic" }, - { -+ countryCode: "US", -+ countryLabel: "Example Republic", -+ currentDelayDays: 30, -+ currentHumanLivesLost: 4500, -+ displayName: "President Example", -+ }, -+ { -+ countryCode: "GB", - displayName: "Prime Minister Sample", - countryLabel: "Sample Kingdom", -+ currentDelayDays: 27, -+ currentHumanLivesLost: 4050, -+ }, -+ { -+ countryCode: "DE", -+ countryLabel: "Demo Federation", -+ currentDelayDays: 24, -+ currentHumanLivesLost: 3600, -+ displayName: "Chancellor Demo", - }, -- { displayName: "Chancellor Demo", countryLabel: "Demo Federation" }, - ], - totalConversionCount: 19, - referralUrl: SAMPLE_REFERRAL_URL, -diff --git a/packages/web/src/lib/email/monthly-chain-digest-react-email.tsx b/packages/web/src/lib/email/monthly-chain-digest-react-email.tsx -index b018312ba..312a51e0f 100644 ---- a/packages/web/src/lib/email/monthly-chain-digest-react-email.tsx -+++ b/packages/web/src/lib/email/monthly-chain-digest-react-email.tsx -@@ -11,8 +11,14 @@ import { - CampaignText, - } from "@/lib/email/react-email-components"; - import { ParameterValueEmail as ParameterValue } from "@/components/shared/ParameterValue.email"; --import { SHARING_TIME_MINUTES } from "@optimitron/data/parameters"; -+import { -+ MILITARY_TO_GOVERNMENT_CLINICAL_TRIALS_SPENDING_RATIO, -+ SHARING_TIME_MINUTES, -+} from "@optimitron/data/parameters"; - import { ReferralChainMath } from "@/lib/email/share-footer"; -+import { buildTaskShareTokens } from "@/lib/tasks/accountability"; -+import { renderTemplate } from "@/lib/tasks/render-template"; -+import { getShareTemplate } from "@/lib/tasks/share-templates"; - import type { - MonthlyChainDigestInput, - MonthlyChainDigestLeader, -@@ -21,6 +27,8 @@ import type { - - const ink = "#111827"; - const muted = "#71717a"; -+const HUMAN_REMINDER_TEMPLATE_ID = "lumbergh-one-human"; -+const PRESIDENT_REMINDER_TEMPLATE_ID = "lumbergh"; - - export function MonthlyChainDigestReactEmail({ - input, -@@ -39,6 +47,8 @@ function PositiveMonthlyDigest({ input }: { input: MonthlyChainDigestInput }) { - const total = input.totalConversionCount.toLocaleString("en-US"); - const employeesLabel = - input.monthlyConversionCount === 1 ? "employee" : "employees"; -+ const employeeReminderMessage = buildHumanReminderMessage(input); -+ const presidentReminderMessage = buildPresidentReminderMessage(input); - - return ( - - - -- -- -+ {employeeReminderMessage ? ( -+ -+ ) : null} -+ {presidentReminderMessage ? ( -+ -+ ) : null} - - The math: . - The chain only reaches that ceiling if managers keep reminding late -@@ -82,6 +96,9 @@ function PositiveMonthlyDigest({ input }: { input: MonthlyChainDigestInput }) { - } - - function ResendMonthlyDigest({ input }: { input: MonthlyChainDigestInput }) { -+ const employeeReminderMessage = buildHumanReminderMessage(input); -+ const presidentReminderMessage = buildPresidentReminderMessage(input); -+ - return ( - - -@@ -96,16 +113,20 @@ function ResendMonthlyDigest({ input }: { input: MonthlyChainDigestInput }) { - task through your link this month. - - -- -- -+ {employeeReminderMessage ? ( -+ -+ ) : null} -+ {presidentReminderMessage ? ( -+ -+ ) : null} - - This is not a moral failing. It is a management report. The assigned - humans have not clicked the small button yet. Please remind them. -@@ -248,12 +269,71 @@ function buildPresidentIntro(input: MonthlyChainDigestInput): string { - return `${count} presidents and heads of government still have not completed their 30-second treaty task.${names ? ` Examples: ${names}.` : ""}`; - } - --function buildHumanReminderMessage(referralUrl: string): string { -- return `Hi [name]. You are late on a 30-second task: please vote yes or no on the 1% Treaty so humanity can prove it agrees to end war and disease. ${referralUrl}`; -+function buildHumanReminderMessage( -+ input: MonthlyChainDigestInput, -+): string | null { -+ const person = input.overdueEmployees.find(hasTemplateDelay); -+ if (!person) return null; -+ -+ const tokens = buildTaskShareTokens({ -+ currentDelayDays: person.currentDelayDays, -+ currentEconomicValueUsdLost: null, -+ currentHumanLivesLost: person.currentHumanLivesLost, -+ taskTitle: "Vote on the 1% Treaty", -+ targetLabel: person.displayName.trim() || "there", -+ treatyUrl: input.referralUrl, -+ variationSeed: `monthly-chain-digest:employee:${person.displayName}`, -+ }); -+ -+ return renderShareTemplate(HUMAN_REMINDER_TEMPLATE_ID, tokens); - } - --function buildPresidentReminderMessage(): string { -- return "Dear President [name], your citizens pay you to promote the general welfare. Please complete the 30-second task and sign the 1% Treaty: redirect 1% of military spending to clinical trials."; -+function buildPresidentReminderMessage( -+ input: MonthlyChainDigestInput, -+): string | null { -+ const leader = input.overduePresidents.find(hasTemplateDelay); -+ if (!leader) return null; -+ -+ const tokens = buildTaskShareTokens({ -+ countryCode: leader.countryCode ?? null, -+ currentDelayDays: leader.currentDelayDays, -+ currentEconomicValueUsdLost: null, -+ currentHumanLivesLost: leader.currentHumanLivesLost, -+ militaryToClinicalTrialsRatio: -+ MILITARY_TO_GOVERNMENT_CLINICAL_TRIALS_SPENDING_RATIO.value, -+ taskTitle: "Sign the 1% Treaty", -+ targetLabel: leader.displayName.trim() || "President", -+ treatyUrl: input.referralUrl, -+ variationSeed: `monthly-chain-digest:president:${leader.displayName}:${leader.countryCode ?? ""}`, -+ }); -+ -+ return renderShareTemplate(PRESIDENT_REMINDER_TEMPLATE_ID, tokens); -+} -+ -+function renderShareTemplate( -+ templateId: string, -+ tokens: Record, -+): string { -+ const template = getShareTemplate(templateId); -+ if (!template) { -+ throw new Error(`Unknown share template: ${templateId}`); -+ } -+ return renderTemplate(template.body, tokens); -+} -+ -+function hasTemplateDelay< -+ T extends { -+ currentDelayDays?: number | null; -+ currentHumanLivesLost?: number | null; -+ }, -+>(value: T): value is T & { -+ currentDelayDays: number; -+ currentHumanLivesLost: number; -+} { -+ return ( -+ (value.currentDelayDays ?? 0) > 0 && -+ (value.currentHumanLivesLost ?? 0) > 0 -+ ); - } - - function formatPeopleSample(people: MonthlyChainDigestPerson[]): string { -diff --git a/packages/web/src/lib/email/monthly-chain-digest.email.md b/packages/web/src/lib/email/monthly-chain-digest.email.md -index 39673772a..ed917dcfa 100644 ---- a/packages/web/src/lib/email/monthly-chain-digest.email.md -+++ b/packages/web/src/lib/email/monthly-chain-digest.email.md -@@ -12,7 +12,7 @@ - | --- | --- | - | From | International Campaign to End War and Disease <hello@updates.warondisease.org> | - | Subject | Humanity Management: 7 employees completed the task | --| Trigger | Fires once per month per user via cron, deduped on user+yyyy-mm. Reports which direct reports voted through the user's link, which assigned humans are still late, and how many presidents still have not completed their 30-second treaty task. | -+| Trigger | Fires once per month per user via cron, deduped on user+yyyy-mm. Reports which employees voted through the user's link, which assigned humans are still late, and how many presidents still have not completed their 30-second treaty task. | - | Scope | onboarding | - | Wishonia signature | Skipped | - -@@ -46,13 +46,13 @@ LATE EMPLOYEE REMINDER - - 3 assigned humans have not completed the 30-second vote yet. Examples: Jake Smith, Maria Chen, Uncle Dave. - --Hi [name]. You are late on a 30-second task: please vote yes or no on the 1% Treaty so humanity can prove it agrees to end war and disease. https://warondisease.org/vote/SAMPLE -+Yeahhh, hi Jake Smith. Quick workflow update from the Department of Civilization Made a Spreadsheet and It Is Bad. If you could go ahead and vote on the 1% Treaty, that'd be great: https://warondisease.org/vote/SAMPLE It takes about 30 seconds. That is less time than deciding whether the leftovers in your fridge are food or a threat. Small note for the agenda: the treaty trades 1% of military spending for 12.3× more clinical trials. That compresses disease eradication from 443 years to 36. Mathematically it drops mass-murder capacity from 122 apocalypses to 120.8 — and, just to be clear, you can only have one apocalypse. (Humanity has 12,241 warheads, nuclear winter takes ~100, the other 12,141 are decorative.) The 121 spare apocalypses will not be missed. 36 years also means you, personally, might watch the world's last disease get cured. 443 years means your great-great-great-grandchildren still won't. Just so you have the timeline in front of you. The personal math is also rude: 21.7 additional healthy years per human and $3.48M additional lifetime income per person. HR says we should call this a wellness benefit. Before you flag this as 'unrealistic' on the agenda — pre-WWII US military spending was 96.7% lower than today, inflation-adjusted. The US still won WWII, then cut military spending 87.6% in two years and produced the largest economic expansion in history. The same governments later banned chemical weapons (1993, 193 countries), biological weapons (1975, 187 countries), and landmines (1997, 164 countries) — weapons they actually like using. This one just asks them to buy 1% fewer of them. That's it. Also 1.8K people have died waiting for cures since I sent you this. We are trying to make that number stop going up. So if you could vote, then send this to two more humans who prefer not dying from preventable diseases, that'd be great. - - LATE PRESIDENT REMINDER - - 189 presidents and heads of government still have not completed their 30-second treaty task. Examples: President Example (Example Republic), Prime Minister Sample (Sample Kingdom), Chancellor Demo (Demo Federation). - --Dear President [name], your citizens pay you to promote the general welfare. Please complete the 30-second task and sign the 1% Treaty: redirect 1% of military spending to clinical trials. -+Yeahhh, hi President Example, if you could go ahead and sign the 1% Treaty, that'd be great. It's at https://warondisease.org/vote/SAMPLE. You just type your name and click submit. Should take about 30 seconds. So if you could just go ahead and do that, that'd be terrific. Oh, and I'm going to need you to be aware that 4.5K people have died waiting for cures since we assigned this to you. You know. Because of the delayed disease eradication. So. Yeah. So if you could just sign that. And maybe stop spending $604 on murder infrastructure for every $1 on clinical trials. That'd be great. - - The math: [32](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) doubling rounds × [2](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) referrals each = [4 billion](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) humans reached. The chain only reaches that ceiling if managers keep reminding late employees. This is why management exists, unfortunately. - -diff --git a/packages/web/src/lib/email/monthly-chain-digest.server.ts b/packages/web/src/lib/email/monthly-chain-digest.server.ts -index 985bd00a0..a39c4a947 100644 ---- a/packages/web/src/lib/email/monthly-chain-digest.server.ts -+++ b/packages/web/src/lib/email/monthly-chain-digest.server.ts -@@ -31,6 +31,8 @@ import { - import { MonthlyChainDigestReactEmail } from "@/lib/email/monthly-chain-digest-react-email"; - import { TREATY_REFERENDUM_SLUG } from "@/lib/treaty"; - import { ROUTES } from "@/lib/routes"; -+import { getTaskDelayStats } from "@/lib/tasks/accountability"; -+import { getTreatyLevelCostOfDelay } from "@/lib/tasks/delay-attribution"; - import { TREATY_SIGNER_TASK_KEY_PREFIX } from "@/lib/tasks/task-keys"; - import { buildUserReferralUrl, getBaseUrl } from "@/lib/url"; - -@@ -52,6 +54,13 @@ interface DigestRecipient { - referralCode: string | null; - } - -+interface MonthlyReminderTask { -+ completedAt: Date | null; -+ dueAt: Date | null; -+ status: TaskStatus; -+ verifiedAt: Date | null; -+} -+ - const PENDING_INVITATION_STATUSES: ReferralInvitationStatus[] = [ - ReferralInvitationStatus.PENDING, - ReferralInvitationStatus.COPIED, -@@ -248,11 +257,25 @@ export async function publishMonthlyChainDigest(input?: { - }, - orderBy: { createdAt: "asc" }, - take: 8, -- select: { recipientName: true }, -+ select: { -+ recipientName: true, -+ recipient: { select: { displayName: true } }, -+ task: { -+ select: { -+ completedAt: true, -+ dueAt: true, -+ status: true, -+ verifiedAt: true, -+ }, -+ }, -+ }, - }) - .then((invitations): MonthlyChainDigestPerson[] => - invitations.map((invitation) => ({ -- displayName: invitation.recipientName, -+ ...buildMonthlyReminderDelayFields(invitation.task, now), -+ displayName: -+ invitation.recipient?.displayName?.trim() || -+ invitation.recipientName, - })), - ), - ]); -@@ -332,6 +355,21 @@ async function sendMonthlyChainDigestEmail(input: { - }); - } - -+function buildMonthlyReminderDelayFields( -+ task: MonthlyReminderTask | null, -+ now: Date, -+): Pick { -+ if (!task) return {}; -+ const stats = getTaskDelayStats(task, now); -+ if (!stats.isOverdue) return {}; -+ const treatyCost = getTreatyLevelCostOfDelay(stats.currentDelayDays); -+ return { -+ currentDelayDays: stats.currentDelayDays, -+ currentHumanLivesLost: -+ stats.currentHumanLivesLost ?? treatyCost?.deathsFromDelay ?? null, -+ }; -+} -+ - async function loadOverduePresidentSnapshot( - now: Date, - ): Promise<{ count: number; presidents: MonthlyChainDigestLeader[] }> { -@@ -353,10 +391,15 @@ async function loadOverduePresidentSnapshot( - assigneeAffiliationSnapshot: true, - assigneePerson: { - select: { -+ countryCode: true, - currentAffiliation: true, - displayName: true, - }, - }, -+ completedAt: true, -+ dueAt: true, -+ status: true, -+ verifiedAt: true, - }, - }), - ]); -@@ -364,6 +407,8 @@ async function loadOverduePresidentSnapshot( - return { - count, - presidents: tasks.map((task) => ({ -+ ...buildMonthlyReminderDelayFields(task, now), -+ countryCode: task.assigneePerson?.countryCode ?? null, - countryLabel: - task.assigneePerson?.currentAffiliation || - task.assigneeAffiliationSnapshot || -diff --git a/packages/web/src/lib/email/post-vote-share-react-email.tsx b/packages/web/src/lib/email/post-vote-share-react-email.tsx -index 4a8d404f8..fb8a34677 100644 ---- a/packages/web/src/lib/email/post-vote-share-react-email.tsx -+++ b/packages/web/src/lib/email/post-vote-share-react-email.tsx -@@ -5,7 +5,10 @@ import { - CampaignText, - } from "@/lib/email/react-email-components"; - import { HumanityManagerPromotionEmail } from "@/lib/humanity-manager-promotion.email"; --import { EmailShareMessage } from "@/lib/email/share-footer"; -+import { -+ EMAIL_SHARE_TEMPLATE_ID, -+ EmailShareMessage, -+} from "@/lib/email/share-footer"; - - export function PostVoteShareReactEmail({ - referralUrl, -@@ -16,7 +19,10 @@ export function PostVoteShareReactEmail({ - - - -- -+ - - End war and disease - -diff --git a/packages/web/src/lib/email/post-vote-share.email.md b/packages/web/src/lib/email/post-vote-share.email.md -index 166296240..fd700bda4 100644 ---- a/packages/web/src/lib/email/post-vote-share.email.md -+++ b/packages/web/src/lib/email/post-vote-share.email.md -@@ -30,7 +30,7 @@ Earth owns [12,200](https://manual.WarOnDisease.org/knowledge/appendix/extinctio - - To get there: send the message below to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) humans you love. They send it to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html). [32](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) rounds reaches every adult on Earth. Getting humans to agree on one thing is the first step to any civilizational upgrade. You are responsible for this step. It cannot be completed without you. - --I love you and don't want you to suffer and die of horrible diseases so please take [30 seconds](https://manual.WarOnDisease.org/knowledge/appendix/recruitment-and-propaganda-plan.html) to vote on this stupid treaty at [https://warondisease.org/vote/SAMPLE](https://warondisease.org/vote/SAMPLE) as it will reduce the likelihood you will suffer and die of horrible diseases. -+Hi there. I love you very much and I don't want you to get a horrible disease and die. Could you please take 30 seconds to respond to this stupid survey in order to end war and disease? [https://warondisease.org/vote/SAMPLE](https://warondisease.org/vote/SAMPLE) - - [END WAR AND DISEASE](https://warondisease.org/vote/SAMPLE) - -diff --git a/packages/web/src/lib/email/react-email-components.tsx b/packages/web/src/lib/email/react-email-components.tsx -index 5e68079da..9433e515a 100644 ---- a/packages/web/src/lib/email/react-email-components.tsx -+++ b/packages/web/src/lib/email/react-email-components.tsx -@@ -13,6 +13,7 @@ import { - import * as React from "react"; - import { EMAIL_COLORS } from "@/components/adaptive/email-styles"; - import { -+ buildEmailShareTemplateText, - EmailShareMessage, - ReferralChainMath, - } from "@/lib/email/share-footer"; -@@ -246,8 +247,18 @@ export function CampaignMetricTable({ - ); - } - --export function CampaignShareFooter({ referralUrl }: { referralUrl: string }) { -- const message = buildShareMessage(referralUrl); -+export function CampaignShareFooter({ -+ referralUrl, -+ targetName, -+ templateId, -+}: { -+ referralUrl: string; -+ targetName?: string; -+ templateId?: string; -+}) { -+ const message = templateId -+ ? buildEmailShareTemplateText({ referralUrl, targetName, templateId }) -+ : buildShareMessage(referralUrl); - const shareChannelInput = { - message, - shareText: "Vote on the 1% Treaty", -@@ -321,7 +332,11 @@ export function CampaignShareFooter({ referralUrl }: { referralUrl: string }) { - margin: 0, - }} - > -- -+ - -
- {/* One-tap share buttons. Each opens the relevant app with the message -diff --git a/packages/web/src/lib/email/referral-first-conversion-react-email.tsx b/packages/web/src/lib/email/referral-first-conversion-react-email.tsx -index 904f4da5b..ef71aa454 100644 ---- a/packages/web/src/lib/email/referral-first-conversion-react-email.tsx -+++ b/packages/web/src/lib/email/referral-first-conversion-react-email.tsx -@@ -9,6 +9,7 @@ import { - } from "@/lib/email/react-email-components"; - import { - DoublingRoundsValue, -+ EMAIL_SHARE_TEMPLATE_ID, - ReferralAskValue, - ReferralChainMath, - } from "@/lib/email/share-footer"; -@@ -44,7 +45,10 @@ export function ReferralFirstConversionReactEmail({ - Live conversion counts are on your dashboard. We only email on the first - conversion. No per-vote pings. - -- -+ - - ); - } -diff --git a/packages/web/src/lib/email/referral-first-conversion.email.md b/packages/web/src/lib/email/referral-first-conversion.email.md -index a8511ff99..3a3dafff0 100644 ---- a/packages/web/src/lib/email/referral-first-conversion.email.md -+++ b/packages/web/src/lib/email/referral-first-conversion.email.md -@@ -38,15 +38,15 @@ Forward this email to every human you love and do not want to suffer and die of - - ↓ TAP AND HOLD TO COPY - --I love you and don't want you to suffer and die of horrible diseases so please take [30 seconds](https://manual.WarOnDisease.org/knowledge/appendix/recruitment-and-propaganda-plan.html) to vote on this stupid treaty at [https://warondisease.org/vote/SAMPLE](https://warondisease.org/vote/SAMPLE) as it will reduce the likelihood you will suffer and die of horrible diseases. -+Hi there. I love you very much and I don't want you to get a horrible disease and die. Could you please take 30 seconds to respond to this stupid survey in order to end war and disease? [https://warondisease.org/vote/SAMPLE](https://warondisease.org/vote/SAMPLE) - --[TEXT](sms:?&body=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) -+[TEXT](sms:?&body=Hi%20there.%20I%20love%20you%20very%20much%20and%20I%20don't%20want%20you%20to%20get%20a%20horrible%20disease%20and%20die.%20Could%20you%20please%20take%2030%20seconds%20to%20respond%20to%20this%20stupid%20survey%20in%20order%20to%20end%20war%20and%20disease%3F%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE) - --[WHATSAPP](https://wa.me/?text=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) -+[WHATSAPP](https://wa.me/?text=Hi%20there.%20I%20love%20you%20very%20much%20and%20I%20don't%20want%20you%20to%20get%20a%20horrible%20disease%20and%20die.%20Could%20you%20please%20take%2030%20seconds%20to%20respond%20to%20this%20stupid%20survey%20in%20order%20to%20end%20war%20and%20disease%3F%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE) - --[EMAIL](mailto:?subject=Please%20complete%3A%20Vote%20on%20the%201%25%20Treaty&body=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) -+[EMAIL](mailto:?subject=Please%20complete%3A%20Vote%20on%20the%201%25%20Treaty&body=Hi%20there.%20I%20love%20you%20very%20much%20and%20I%20don't%20want%20you%20to%20get%20a%20horrible%20disease%20and%20die.%20Could%20you%20please%20take%2030%20seconds%20to%20respond%20to%20this%20stupid%20survey%20in%20order%20to%20end%20war%20and%20disease%3F%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE) - --[POST](https://twitter.com/intent/tweet?text=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) -+[POST](https://twitter.com/intent/tweet?text=Hi%20there.%20I%20love%20you%20very%20much%20and%20I%20don't%20want%20you%20to%20get%20a%20horrible%20disease%20and%20die.%20Could%20you%20please%20take%2030%20seconds%20to%20respond%20to%20this%20stupid%20survey%20in%20order%20to%20end%20war%20and%20disease%3F%20https%3A%2F%2Fwarondisease.org%2Fvote%2FSAMPLE) - - Or send them straight to [https://warondisease.org/vote/SAMPLE](https://warondisease.org/vote/SAMPLE). [32](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) doubling rounds × [2](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) referrals each = [4 billion](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) humans reached. - -diff --git a/packages/web/src/lib/email/share-footer.tsx b/packages/web/src/lib/email/share-footer.tsx -index 0d97a8b59..ec9d03e1e 100644 ---- a/packages/web/src/lib/email/share-footer.tsx -+++ b/packages/web/src/lib/email/share-footer.tsx -@@ -3,6 +3,8 @@ import { SHARING_TIME_MINUTES } from "@optimitron/data/parameters"; - import { EMAIL_STYLES } from "@/components/adaptive/email-styles"; - import { ParameterValueEmail as ParameterValue } from "@/components/shared/ParameterValue.email"; - import { buildShareMessage, getShareMessageParts } from "@/lib/share-message"; -+import { renderTemplate } from "@/lib/tasks/render-template"; -+import { getShareTemplate } from "@/lib/tasks/share-templates"; - import { - FLOW_DOUBLING_ROUNDS_TO_TARGET_PARAM, - FLOW_MAJORITY_OF_HUMANS_ON_EARTH, -@@ -11,7 +13,73 @@ import { - } from "@/lib/treaty-share-flow-parameters"; - import { renderReactEmailHtml } from "@/lib/email/render-react-email"; - --export function EmailShareMessage({ referralUrl }: { referralUrl: string }) { -+export const EMAIL_SHARE_TEMPLATE_ID = "sincere"; -+const DEFAULT_EMAIL_SHARE_TARGET_NAME = "there"; -+ -+export function buildEmailShareTemplateText({ -+ referralUrl, -+ targetName = DEFAULT_EMAIL_SHARE_TARGET_NAME, -+ templateId = EMAIL_SHARE_TEMPLATE_ID, -+}: { -+ referralUrl: string; -+ targetName?: string; -+ templateId?: string; -+}) { -+ const template = getShareTemplate(templateId); -+ if (!template) { -+ throw new Error(`Unknown share template: ${templateId}`); -+ } -+ -+ return renderTemplate(template.body, { -+ target_name: targetName.trim() || DEFAULT_EMAIL_SHARE_TARGET_NAME, -+ treaty_url: referralUrl, -+ }); -+} -+ -+function LinkedShareTemplateText({ -+ referralUrl, -+ text, -+}: { -+ referralUrl: string; -+ text: string; -+}) { -+ const parts = text.split(referralUrl); -+ if (parts.length === 1) return <>{text}; -+ -+ return ( -+ <> -+ {parts.map((part, index) => ( -+ -+ {part} -+ {index < parts.length - 1 ? ( -+ -+ {referralUrl} -+ -+ ) : null} -+ -+ ))} -+ -+ ); -+} -+ -+export function EmailShareMessage({ -+ referralUrl, -+ targetName, -+ templateId, -+}: { -+ referralUrl: string; -+ targetName?: string; -+ templateId?: string; -+}) { -+ if (templateId) { -+ const message = buildEmailShareTemplateText({ -+ referralUrl, -+ targetName, -+ templateId, -+ }); -+ return ; -+ } -+ - const parts = getShareMessageParts(referralUrl); - return ( - <> -diff --git a/packages/web/src/lib/email/wishonia-signature.ts b/packages/web/src/lib/email/wishonia-signature.ts -index 2fdb50974..72670b860 100644 ---- a/packages/web/src/lib/email/wishonia-signature.ts -+++ b/packages/web/src/lib/email/wishonia-signature.ts -@@ -14,7 +14,7 @@ - - import { getBaseUrl } from "@/lib/url"; - --export const WISHONIA_AVATAR_PATH = "/sprites/wishonia/smirk-smile.png"; -+export const WISHONIA_AVATAR_PATH = "/sprites/wishonia/happy-smile.png"; - - export const WISHONIA_TITLES: readonly string[] = [ - "Chief Optimization Officer", -@@ -94,7 +94,7 @@ export function buildWishoniaSignatureText( - } - - /** -- * Two-cell HTML signature with a Wishonia avatar (smirk-smile sprite — used -+ * Two-cell HTML signature with a Wishonia avatar (happy-smile sprite — used - * elsewhere as her canonical face) and the title/tagline lines. Uses inline - * styles + a table layout because that's what survives Gmail / Outlook / - * Apple Mail rendering quirks. Tested against the standard email client trio. -diff --git a/packages/web/src/lib/humanity-manager-promotion-content.tsx b/packages/web/src/lib/humanity-manager-promotion-content.tsx -index 0bc0ae7d2..a5cfd767e 100644 ---- a/packages/web/src/lib/humanity-manager-promotion-content.tsx -+++ b/packages/web/src/lib/humanity-manager-promotion-content.tsx -@@ -65,7 +65,7 @@ export function createHumanityManagerPromotion({ - figures={1} - param={GLOBAL_POPULATION_2024} - />{" "} -- direct reports — humans you are responsible for getting to spend -+ employees — humans you are responsible for getting to spend - 30 seconds voting on the{" "} - 1% Treaty. - -@@ -109,7 +109,7 @@ export function createHumanityManagerPromotion({ - /> - . - -- -+ - You probably do not have time to persuade{" "} - ; -+ Eyebrow: React.ComponentType<{ children: React.ReactNode }>; -+ Heading: React.ComponentType<{ children: React.ReactNode }>; -+ MetricTable: React.ComponentType<{ rows: StatusMetric[] }>; -+ ReminderBlock: React.ComponentType<{ -+ reminders: HumanityManagerStatusReminder[]; -+ }>; -+ Section: React.ComponentType<{ children: React.ReactNode }>; -+ Text: React.ComponentType<{ -+ children: React.ReactNode; -+ muted?: boolean; -+ }>; -+} -+ -+function formatCount(value: number): string { -+ return Math.max(0, value).toLocaleString("en-US"); -+} -+ -+function formatPeopleSample(people: HumanityManagerStatusPerson[]): string { -+ return people -+ .slice(0, 5) -+ .map((person) => person.displayName.trim()) -+ .filter(Boolean) -+ .join(", "); -+} -+ -+function formatLeaderSample(leaders: HumanityManagerStatusLeader[]): string { -+ return leaders -+ .slice(0, 5) -+ .map((leader) => { -+ const country = leader.countryLabel?.trim(); -+ return country -+ ? `${leader.displayName.trim()} (${country})` -+ : leader.displayName.trim(); -+ }) -+ .filter(Boolean) -+ .join(", "); -+} -+ -+function buildEmployeeStatus(input: HumanityManagerStatusInput): string { -+ if (input.overdueEmployeeCount === 0) { -+ return "No named employees are late. The machine is briefly behaving."; -+ } -+ const names = formatPeopleSample(input.overdueEmployees); -+ const count = formatCount(input.overdueEmployeeCount); -+ const noun = input.overdueEmployeeCount === 1 ? "employee" : "employees"; -+ return `${count} ${noun} still need the 30-second vote.${names ? ` Examples: ${names}.` : ""}`; -+} -+ -+function buildPresidentStatus(input: HumanityManagerStatusInput): string { -+ if (input.overduePresidentCount === 0) { -+ return "No presidents are currently late. That would be new."; -+ } -+ const names = formatLeaderSample(input.overduePresidents); -+ const count = formatCount(input.overduePresidentCount); -+ return `${count} presidents and heads of government still have not signed the treaty.${names ? ` Examples: ${names}.` : ""}`; -+} -+ -+export function createHumanityManagerStatus({ -+ CompletedEmployees, -+ Eyebrow, -+ Heading, -+ MetricTable, -+ ReminderBlock, -+ Section, -+ Text, -+}: HumanityManagerStatusComponents) { -+ return function HumanityManagerStatus({ -+ input, -+ }: { -+ input: HumanityManagerStatusInput; -+ }) { -+ const metrics: StatusMetric[] = [ -+ { -+ label: "Employees completed", -+ value: formatCount(input.directConversionCount), -+ }, -+ { -+ label: "Employees still late", -+ value: formatCount(input.overdueEmployeeCount), -+ }, -+ { -+ label: "Late presidents", -+ value: formatCount(input.overduePresidentCount), -+ }, -+ { -+ label: "Downstream conversions", -+ value: formatCount(input.downstreamConversionCount), -+ }, -+ ]; -+ -+ return ( -+
-+ Humanity Management Status -+ Your employees are either clicking or require management. -+ -+ Direct employees are the humans you assigned. Full chain conversions -+ include their employees, their employees' employees, and so on. Updated -+ hourly. -+ -+ -+ -+ {buildEmployeeStatus(input)} -+ {buildPresidentStatus(input)} -+ {input.reminders.length > 0 ? ( -+ -+ ) : ( -+ -+ No copyable reminders yet. Assign one human or find one late -+ president, and management becomes less ceremonial. -+ -+ )} -+
-+ ); -+ }; -+} -diff --git a/packages/web/src/lib/humanity-manager-status.email.tsx b/packages/web/src/lib/humanity-manager-status.email.tsx -new file mode 100644 -index 000000000..845b52446 ---- /dev/null -+++ b/packages/web/src/lib/humanity-manager-status.email.tsx -@@ -0,0 +1,171 @@ -+import { Section, Text } from "@react-email/components"; -+import * as React from "react"; -+import { EMAIL_STYLES } from "@/components/adaptive/email-styles"; -+import { -+ CampaignCopyBlock, -+ CampaignMetricTable, -+ CampaignText, -+} from "@/lib/email/react-email-components"; -+import { -+ createHumanityManagerStatus, -+ type HumanityManagerStatusInput, -+ type HumanityManagerStatusPerson, -+ type HumanityManagerStatusReminder, -+} from "@/lib/humanity-manager-status-content"; -+ -+const ink = "#111827"; -+const muted = "#71717a"; -+ -+function StatusSection({ children }: { children: React.ReactNode }) { -+ return <>{children}; -+} -+ -+function Eyebrow({ children }: { children: React.ReactNode }) { -+ return

{children}

; -+} -+ -+function Heading({ children }: { children: React.ReactNode }) { -+ return

{children}

; -+} -+ -+function StatusText({ -+ children, -+ muted: isMuted = false, -+}: { -+ children: React.ReactNode; -+ muted?: boolean; -+}) { -+ return ( -+ -+ {children} -+ -+ ); -+} -+ -+function MetricTable({ -+ rows, -+}: { -+ rows: Array<{ label: string; value: string }>; -+}) { -+ return ; -+} -+ -+function formatMaybeDate(value: Date | string | null | undefined) { -+ if (!value) return null; -+ const date = typeof value === "string" ? new Date(value) : value; -+ if (Number.isNaN(date.getTime())) return null; -+ return date.toLocaleDateString("en-US", { -+ day: "numeric", -+ month: "short", -+ timeZone: "UTC", -+ }); -+} -+ -+function CompletedEmployees({ -+ employees, -+ total, -+}: { -+ employees: HumanityManagerStatusPerson[]; -+ total: number; -+}) { -+ if (employees.length === 0) return null; -+ const extra = total > employees.length ? total - employees.length : 0; -+ -+ return ( -+
-+ -+ Employees who did the task -+ -+
    -+ {employees.slice(0, 8).map((person) => { -+ const date = formatMaybeDate(person.completedAt); -+ return ( -+
  • -+ {person.displayName} -+ {date ? ` completed it on ${date}.` : " completed it."} -+
  • -+ ); -+ })} -+
-+ {extra > 0 ? ( -+ Plus {extra.toLocaleString("en-US")} more. -+ ) : null} -+
-+ ); -+} -+ -+function ReminderBlock({ -+ reminders, -+}: { -+ reminders: HumanityManagerStatusReminder[]; -+}) { -+ return ( -+
-+ -+ Copy reminders -+ -+ {reminders.map((reminder) => ( -+
-+ -+ {reminder.title}: {reminder.label} -+ -+ {reminder.message} -+
-+ ))} -+
-+ ); -+} -+ -+const HumanityManagerStatusEmailContent = createHumanityManagerStatus({ -+ CompletedEmployees, -+ Eyebrow, -+ Heading, -+ MetricTable, -+ ReminderBlock, -+ Section: StatusSection, -+ Text: StatusText, -+}); -+ -+export function HumanityManagerStatusEmail({ -+ input, -+}: { -+ input: HumanityManagerStatusInput; -+}) { -+ return ; -+} -diff --git a/packages/web/src/lib/humanity-manager-status.server.ts b/packages/web/src/lib/humanity-manager-status.server.ts -new file mode 100644 -index 000000000..845edc51a ---- /dev/null -+++ b/packages/web/src/lib/humanity-manager-status.server.ts -@@ -0,0 +1,336 @@ -+import { -+ ReferralInvitationStatus, -+ TaskStatus, -+} from "@optimitron/db"; -+import type { Prisma } from "@optimitron/db"; -+import { prisma } from "@/lib/prisma"; -+import { -+ type HumanityManagerStatusInput, -+ type HumanityManagerStatusLeader, -+ type HumanityManagerStatusPerson, -+ type HumanityManagerStatusReminder, -+} from "@/lib/humanity-manager-status-content"; -+import { -+ buildTaskShareTokens, -+ getTaskDelayStats, -+} from "@/lib/tasks/accountability"; -+import { getTreatyLevelCostOfDelay } from "@/lib/tasks/delay-attribution"; -+import { -+ getShareTemplate, -+ getUsableShareTemplates, -+ pickDefaultShareTemplateId, -+ type ShareRecipientMode, -+} from "@/lib/tasks/share-templates"; -+import { renderTemplate } from "@/lib/tasks/render-template"; -+import { TREATY_SIGNER_TASK_KEY_PREFIX } from "@/lib/tasks/task-keys"; -+import { -+ getAssigneeGovernmentBudgetUsd, -+ getAssigneeMilitaryBudgetUsd, -+ getAssigneeMilitaryToClinicalTrialsRatio, -+ getAssigneeTwitterHandle, -+} from "@/lib/tasks/task-context"; -+import { getHandleOrReferralCode } from "@/lib/referral.client"; -+import { buildTaskUrl, buildUserInviteReferralUrl } from "@/lib/url"; -+ -+const STATUS_SAMPLE_LIMIT = 8; -+const DAY_MS = 1000 * 60 * 60 * 24; -+ -+const PENDING_INVITATION_STATUSES: ReferralInvitationStatus[] = [ -+ ReferralInvitationStatus.PENDING, -+ ReferralInvitationStatus.COPIED, -+ ReferralInvitationStatus.SENT, -+]; -+ -+interface StatusUser { -+ downstreamConversionCount?: number | null; -+ handle?: string | null; -+ referralCode?: string | null; -+} -+ -+function clampNumber(value: number | null | undefined): number { -+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) { -+ return 0; -+ } -+ return Math.floor(value); -+} -+ -+function daysBetween(now: Date, value: Date | string | null | undefined): number { -+ if (!value) return 0; -+ const date = value instanceof Date ? value : new Date(value); -+ if (Number.isNaN(date.getTime())) return 0; -+ return Math.max(0, Math.ceil((now.getTime() - date.getTime()) / DAY_MS)); -+} -+ -+function formatCompletedInvitation( -+ invitation: { -+ convertedAt: Date | string | null; -+ convertedVote?: { -+ createdAt: Date | string; -+ person?: { displayName: string | null } | null; -+ user?: { person?: { displayName: string | null } | null } | null; -+ } | null; -+ recipientName: string; -+ }, -+): HumanityManagerStatusPerson { -+ return { -+ completedAt: invitation.convertedAt ?? invitation.convertedVote?.createdAt ?? null, -+ displayName: -+ invitation.convertedVote?.person?.displayName?.trim() || -+ invitation.convertedVote?.user?.person?.displayName?.trim() || -+ invitation.recipientName.trim() || -+ "Employee", -+ }; -+} -+ -+function pickRenderedReminder(input: { -+ mode: ShareRecipientMode; -+ tokens: Record; -+}): string | null { -+ const templates = getUsableShareTemplates(input.tokens, input.mode); -+ const templateId = pickDefaultShareTemplateId(templates, input.mode); -+ const template = -+ templates.find((candidate) => candidate.id === templateId) ?? -+ (templateId ? getShareTemplate(templateId) : undefined) ?? -+ templates[0]; -+ -+ if (!template) return null; -+ return renderTemplate(template.body, input.tokens); -+} -+ -+function buildEmployeeReminder(input: { -+ baseUrl: string; -+ invitation: { -+ createdAt?: Date | string | null; -+ id: string; -+ inviteToken: string; -+ recipientName: string; -+ }; -+ now: Date; -+ user: StatusUser; -+}): HumanityManagerStatusReminder | null { -+ const targetLabel = input.invitation.recipientName.trim() || "there"; -+ const currentDelayDays = daysBetween(input.now, input.invitation.createdAt); -+ const delay = getTreatyLevelCostOfDelay(currentDelayDays); -+ const treatyUrl = buildUserInviteReferralUrl( -+ { -+ handle: input.user.handle, -+ referralCode: input.user.referralCode, -+ }, -+ input.invitation.inviteToken, -+ input.baseUrl, -+ ); -+ const tokens = buildTaskShareTokens({ -+ citizenName: "A citizen", -+ currentDelayDays, -+ currentEconomicValueUsdLost: delay?.wastedUsd ?? null, -+ currentHumanLivesLost: delay?.deathsFromDelay ?? null, -+ currentSufferingHoursLost: null, -+ now: input.now, -+ targetLabel, -+ taskTitle: "Vote on the 1% Treaty", -+ treatyUrl, -+ }); -+ const message = pickRenderedReminder({ mode: "one_human", tokens }); -+ if (!message) return null; -+ -+ return { -+ id: `employee-${input.invitation.id}`, -+ label: targetLabel, -+ message, -+ recipientMode: "one_human", -+ title: "Employee reminder", -+ }; -+} -+ -+function buildPresidentReminder(input: { -+ baseUrl: string; -+ now: Date; -+ task: { -+ assigneePerson: { -+ countryCode: string | null; -+ displayName: string; -+ handle?: string | null; -+ } | null; -+ contextJson: Prisma.JsonValue | null; -+ dueAt: Date | string | null; -+ id: string; -+ title: string; -+ }; -+ user: StatusUser; -+}): HumanityManagerStatusReminder | null { -+ const targetLabel = -+ input.task.assigneePerson?.displayName?.trim() || input.task.title; -+ const delayStats = getTaskDelayStats({ dueAt: input.task.dueAt }); -+ const referralId = getHandleOrReferralCode(input.user); -+ const treatyUrl = buildTaskUrl(input.task.id, input.baseUrl, referralId); -+ const tokens = buildTaskShareTokens({ -+ countryCode: input.task.assigneePerson?.countryCode ?? null, -+ currentDelayDays: delayStats.currentDelayDays, -+ currentEconomicValueUsdLost: delayStats.currentEconomicValueUsdLost, -+ currentHumanLivesLost: delayStats.currentHumanLivesLost, -+ currentSufferingHoursLost: delayStats.currentSufferingHoursLost, -+ governmentBudgetUsdPerYear: getAssigneeGovernmentBudgetUsd( -+ input.task.contextJson, -+ ), -+ leaderHandle: -+ getAssigneeTwitterHandle(input.task.contextJson) ?? -+ input.task.assigneePerson?.handle ?? -+ null, -+ militaryBudgetUsdPerYear: getAssigneeMilitaryBudgetUsd( -+ input.task.contextJson, -+ ), -+ militaryToClinicalTrialsRatio: getAssigneeMilitaryToClinicalTrialsRatio( -+ input.task.contextJson, -+ ), -+ now: input.now, -+ targetLabel, -+ taskTitle: input.task.title, -+ treatyUrl, -+ }); -+ const message = pickRenderedReminder({ mode: "leader", tokens }); -+ if (!message) return null; -+ -+ return { -+ id: `president-${input.task.id}`, -+ label: targetLabel, -+ message, -+ recipientMode: "leader", -+ title: "President reminder", -+ }; -+} -+ -+export async function loadHumanityManagerStatus(input: { -+ baseUrl: string; -+ now?: Date; -+ user: StatusUser; -+ userId: string; -+}): Promise { -+ const now = input.now ?? new Date(); -+ const convertedInvitationWhere = { -+ deletedAt: null, -+ referrerUserId: input.userId, -+ status: ReferralInvitationStatus.CONVERTED, -+ convertedVote: { is: { deletedAt: null } }, -+ } satisfies Prisma.ReferralInvitationWhereInput; -+ const overdueInvitationWhere = { -+ deletedAt: null, -+ referrerUserId: input.userId, -+ status: { in: PENDING_INVITATION_STATUSES }, -+ } satisfies Prisma.ReferralInvitationWhereInput; -+ const overduePresidentWhere = { -+ assigneePersonId: { not: null }, -+ deletedAt: null, -+ dueAt: { lt: now }, -+ status: { not: TaskStatus.VERIFIED }, -+ taskKey: { startsWith: `${TREATY_SIGNER_TASK_KEY_PREFIX}:` }, -+ } satisfies Prisma.TaskWhereInput; -+ -+ const [ -+ directConversionCount, -+ convertedInvitations, -+ overdueEmployeeCount, -+ overdueEmployees, -+ overduePresidentCount, -+ overduePresidentTasks, -+ ] = await Promise.all([ -+ prisma.referralInvitation.count({ where: convertedInvitationWhere }), -+ prisma.referralInvitation.findMany({ -+ orderBy: [{ convertedAt: "desc" }, { createdAt: "desc" }], -+ select: { -+ convertedAt: true, -+ convertedVote: { -+ select: { -+ createdAt: true, -+ person: { select: { displayName: true } }, -+ user: { -+ select: { -+ person: { select: { displayName: true } }, -+ }, -+ }, -+ }, -+ }, -+ recipientName: true, -+ }, -+ take: STATUS_SAMPLE_LIMIT, -+ where: convertedInvitationWhere, -+ }), -+ prisma.referralInvitation.count({ where: overdueInvitationWhere }), -+ prisma.referralInvitation.findMany({ -+ orderBy: { createdAt: "asc" }, -+ select: { -+ createdAt: true, -+ id: true, -+ inviteToken: true, -+ recipientName: true, -+ }, -+ take: STATUS_SAMPLE_LIMIT, -+ where: overdueInvitationWhere, -+ }), -+ prisma.task.count({ where: overduePresidentWhere }), -+ prisma.task.findMany({ -+ orderBy: [{ dueAt: "asc" }, { createdAt: "asc" }], -+ select: { -+ assigneeAffiliationSnapshot: true, -+ assigneePerson: { -+ select: { -+ countryCode: true, -+ currentAffiliation: true, -+ displayName: true, -+ handle: true, -+ }, -+ }, -+ contextJson: true, -+ dueAt: true, -+ id: true, -+ title: true, -+ }, -+ take: STATUS_SAMPLE_LIMIT, -+ where: overduePresidentWhere, -+ }), -+ ]); -+ -+ const employeeReminders = overdueEmployees -+ .map((invitation) => -+ buildEmployeeReminder({ -+ baseUrl: input.baseUrl, -+ invitation, -+ now, -+ user: input.user, -+ }), -+ ) -+ .filter((reminder): reminder is HumanityManagerStatusReminder => reminder != null) -+ .slice(0, 3); -+ -+ const presidentReminders = overduePresidentTasks -+ .map((task) => -+ buildPresidentReminder({ -+ baseUrl: input.baseUrl, -+ now, -+ task, -+ user: input.user, -+ }), -+ ) -+ .filter((reminder): reminder is HumanityManagerStatusReminder => reminder != null) -+ .slice(0, 3); -+ -+ return { -+ completedEmployees: convertedInvitations.map(formatCompletedInvitation), -+ directConversionCount, -+ downstreamConversionCount: clampNumber(input.user.downstreamConversionCount), -+ overdueEmployeeCount, -+ overdueEmployees: overdueEmployees.map((invitation) => ({ -+ displayName: invitation.recipientName, -+ })), -+ overduePresidentCount, -+ overduePresidents: overduePresidentTasks.map( -+ (task): HumanityManagerStatusLeader => ({ -+ countryLabel: -+ task.assigneePerson?.currentAffiliation || -+ task.assigneeAffiliationSnapshot || -+ null, -+ displayName: task.assigneePerson?.displayName || "President", -+ }), -+ ), -+ reminders: [...employeeReminders, ...presidentReminders], -+ }; -+} -diff --git a/packages/web/src/lib/humanity-manager-status.web.tsx b/packages/web/src/lib/humanity-manager-status.web.tsx -new file mode 100644 -index 000000000..f71ca4eea ---- /dev/null -+++ b/packages/web/src/lib/humanity-manager-status.web.tsx -@@ -0,0 +1,201 @@ -+"use client"; -+ -+import * as React from "react"; -+import { Clipboard } from "lucide-react"; -+import { -+ createHumanityManagerStatus, -+ type HumanityManagerStatusInput, -+ type HumanityManagerStatusPerson, -+ type HumanityManagerStatusReminder, -+} from "@/lib/humanity-manager-status-content"; -+import { copyTextToClipboard } from "@/lib/clipboard"; -+ -+function StatusSection({ children }: { children: React.ReactNode }) { -+ return ( -+
-+ {children} -+
-+ ); -+} -+ -+function Eyebrow({ children }: { children: React.ReactNode }) { -+ return ( -+

-+ {children} -+

-+ ); -+} -+ -+function Heading({ children }: { children: React.ReactNode }) { -+ return ( -+

-+ {children} -+

-+ ); -+} -+ -+function Text({ -+ children, -+ muted = false, -+}: { -+ children: React.ReactNode; -+ muted?: boolean; -+}) { -+ return ( -+

-+ {children} -+

-+ ); -+} -+ -+function MetricTable({ -+ rows, -+}: { -+ rows: Array<{ label: string; value: string }>; -+}) { -+ return ( -+
-+ {rows.map((row) => ( -+
-+
-+ {row.label} -+
-+
{row.value}
-+
-+ ))} -+
-+ ); -+} -+ -+function formatMaybeDate(value: Date | string | null | undefined) { -+ if (!value) return null; -+ const date = typeof value === "string" ? new Date(value) : value; -+ if (Number.isNaN(date.getTime())) return null; -+ return date.toLocaleDateString(undefined, { -+ day: "numeric", -+ month: "short", -+ timeZone: "UTC", -+ }); -+} -+ -+function CompletedEmployees({ -+ employees, -+ total, -+}: { -+ employees: HumanityManagerStatusPerson[]; -+ total: number; -+}) { -+ if (employees.length === 0) { -+ return ( -+

-+ No employees have completed the task through your named invitations yet. -+

-+ ); -+ } -+ -+ const extra = total > employees.length ? total - employees.length : 0; -+ -+ return ( -+
-+

-+ Employees who did the task -+

-+
    -+ {employees.slice(0, 8).map((person) => { -+ const date = formatMaybeDate(person.completedAt); -+ return ( -+
  • -+ {person.displayName} -+ {date ? ` completed it on ${date}.` : " completed it."} -+
  • -+ ); -+ })} -+
-+ {extra > 0 ? ( -+

-+ Plus {extra.toLocaleString("en-US")} more. -+

-+ ) : null} -+
-+ ); -+} -+ -+function ReminderBlock({ -+ reminders, -+}: { -+ reminders: HumanityManagerStatusReminder[]; -+}) { -+ const [copiedId, setCopiedId] = React.useState(null); -+ -+ async function copyReminder(reminder: HumanityManagerStatusReminder) { -+ await copyTextToClipboard(reminder.message); -+ setCopiedId(reminder.id); -+ window.setTimeout(() => { -+ setCopiedId((current) => (current === reminder.id ? null : current)); -+ }, 1500); -+ } -+ -+ return ( -+
-+

-+ Copy reminders -+

-+
-+ {reminders.map((reminder) => ( -+
-+
-+
-+

-+ {reminder.title} -+

-+

-+ {reminder.label} -+

-+
-+ -+
-+
-+              {reminder.message}
-+            
-+
-+ ))} -+
-+
-+ ); -+} -+ -+const HumanityManagerStatusWeb = createHumanityManagerStatus({ -+ CompletedEmployees, -+ Eyebrow, -+ Heading, -+ MetricTable, -+ ReminderBlock, -+ Section: StatusSection, -+ Text, -+}); -+ -+export function HumanityManagerStatus({ -+ input, -+}: { -+ input: HumanityManagerStatusInput; -+}) { -+ return ; -+} -diff --git a/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.test.ts b/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.test.ts -new file mode 100644 -index 000000000..056ed8aaf ---- /dev/null -+++ b/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.test.ts -@@ -0,0 +1,95 @@ -+import { describe, expect, it, vi } from "vitest"; -+import { -+ computeDownstreamCacheFromReferralEdges, -+ type DownstreamCacheClient, -+ normalizeDownstreamCacheRows, -+ refreshUserDownstreamCache, -+} from "./refresh-user-downstream-cache.server"; -+ -+describe("computeDownstreamCacheFromReferralEdges", () => { -+ it("counts converted employees through the full referral tree", () => { -+ const summaries = computeDownstreamCacheFromReferralEdges([ -+ { referrerUserId: "root", convertedUserId: "a" }, -+ { referrerUserId: "root", convertedUserId: "b" }, -+ { referrerUserId: "a", convertedUserId: "c" }, -+ { referrerUserId: "c", convertedUserId: "d" }, -+ { referrerUserId: "other", convertedUserId: "x" }, -+ ]); -+ -+ expect(summaries.get("root")).toEqual({ -+ downstreamConversionCount: 4, -+ userId: "root", -+ }); -+ expect(summaries.get("a")).toEqual({ -+ downstreamConversionCount: 2, -+ userId: "a", -+ }); -+ expect(summaries.get("other")).toEqual({ -+ downstreamConversionCount: 1, -+ userId: "other", -+ }); -+ }); -+ -+ it("guards cycles instead of looping forever or counting the root as downstream", () => { -+ const summaries = computeDownstreamCacheFromReferralEdges([ -+ { referrerUserId: "a", convertedUserId: "b" }, -+ { referrerUserId: "b", convertedUserId: "c" }, -+ { referrerUserId: "c", convertedUserId: "a" }, -+ ]); -+ -+ expect(summaries.get("a")).toEqual({ -+ downstreamConversionCount: 2, -+ userId: "a", -+ }); -+ }); -+}); -+ -+describe("refreshUserDownstreamCache", () => { -+ it("normalizes bigint SQL counts before writing cached User columns", async () => { -+ const updateMany = vi.fn().mockResolvedValue({ count: 3 }); -+ const update = vi.fn().mockResolvedValue({}); -+ const db: DownstreamCacheClient = { -+ async $queryRaw(): Promise { -+ return [ -+ { -+ userId: "root", -+ downstreamConversionCount: 4n, -+ }, -+ ] as T; -+ }, -+ $transaction: async (callback) => callback({ user: { update, updateMany } }), -+ }; -+ -+ const result = await refreshUserDownstreamCache({ prismaClient: db }); -+ -+ expect(result).toEqual({ refreshedUsers: 1, resetUsers: 3 }); -+ expect(updateMany).toHaveBeenCalledWith({ -+ data: { -+ downstreamConversionCount: 0, -+ }, -+ where: { deletedAt: null }, -+ }); -+ expect(update).toHaveBeenCalledWith({ -+ data: { -+ downstreamConversionCount: 4, -+ }, -+ where: { id: "root" }, -+ }); -+ }); -+}); -+ -+describe("normalizeDownstreamCacheRows", () => { -+ it("drops rows without usable user ids", () => { -+ expect( -+ normalizeDownstreamCacheRows([ -+ { userId: "", downstreamConversionCount: 1n }, -+ { userId: "u1", downstreamConversionCount: 2n }, -+ ]), -+ ).toEqual([ -+ { -+ downstreamConversionCount: 2, -+ userId: "u1", -+ }, -+ ]); -+ }); -+}); -diff --git a/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.ts b/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.ts -new file mode 100644 -index 000000000..16fad0a84 ---- /dev/null -+++ b/packages/web/src/lib/jobs/refresh-user-downstream-cache.server.ts -@@ -0,0 +1,197 @@ -+import { ReferralInvitationStatus } from "@optimitron/db"; -+import { prisma } from "@/lib/prisma"; -+ -+interface DownstreamCacheSqlRow { -+ userId: string | null; -+ downstreamConversionCount: bigint | number | string | null; -+} -+ -+export interface DownstreamCacheSummary { -+ userId: string; -+ downstreamConversionCount: number; -+} -+ -+export interface ReferralInvitationTreeEdge { -+ referrerUserId: string; -+ convertedUserId: string; -+} -+ -+export interface DownstreamCacheTransaction { -+ user: { -+ update(input: { -+ data: { -+ downstreamConversionCount: number; -+ }; -+ where: { id: string }; -+ }): Promise; -+ updateMany(input: { -+ data: { -+ downstreamConversionCount: number; -+ }; -+ where: { deletedAt: null }; -+ }): Promise<{ count: number }>; -+ }; -+} -+ -+export interface DownstreamCacheClient { -+ $queryRaw( -+ strings: TemplateStringsArray, -+ ...values: unknown[] -+ ): Promise; -+ $transaction( -+ callback: (tx: DownstreamCacheTransaction) => Promise, -+ ): Promise; -+} -+ -+function normalizeCount(value: bigint | number | string | null): number { -+ if (value == null) return 0; -+ const numeric = typeof value === "bigint" ? Number(value) : Number(value); -+ if (!Number.isFinite(numeric) || numeric <= 0) return 0; -+ return Math.floor(numeric); -+} -+ -+export function normalizeDownstreamCacheRows( -+ rows: DownstreamCacheSqlRow[], -+): DownstreamCacheSummary[] { -+ return rows -+ .map((row) => ({ -+ downstreamConversionCount: normalizeCount(row.downstreamConversionCount), -+ userId: row.userId?.trim() ?? "", -+ })) -+ .filter((row) => row.userId.length > 0); -+} -+ -+export function computeDownstreamCacheFromReferralEdges( -+ edges: ReferralInvitationTreeEdge[], -+): Map { -+ const childrenByReferrer = new Map>(); -+ -+ for (const edge of edges) { -+ if (!edge.referrerUserId || !edge.convertedUserId) continue; -+ if (!childrenByReferrer.has(edge.referrerUserId)) { -+ childrenByReferrer.set(edge.referrerUserId, new Set()); -+ } -+ childrenByReferrer.get(edge.referrerUserId)!.add(edge.convertedUserId); -+ } -+ -+ const summaries = new Map(); -+ -+ for (const rootUserId of childrenByReferrer.keys()) { -+ const seen = new Set(); -+ const queue = [rootUserId]; -+ -+ while (queue.length > 0) { -+ const current = queue.shift()!; -+ const children = childrenByReferrer.get(current); -+ if (!children) continue; -+ -+ for (const childUserId of children) { -+ if (childUserId === rootUserId || seen.has(childUserId)) { -+ continue; -+ } -+ -+ seen.add(childUserId); -+ queue.push(childUserId); -+ } -+ } -+ -+ summaries.set(rootUserId, { -+ downstreamConversionCount: seen.size, -+ userId: rootUserId, -+ }); -+ } -+ -+ return summaries; -+} -+ -+export async function loadDownstreamCacheSummaries(input?: { -+ prismaClient?: DownstreamCacheClient; -+}): Promise { -+ const db: DownstreamCacheClient = input?.prismaClient ?? prisma; -+ -+ const rows = await db.$queryRaw` -+ WITH RECURSIVE converted_edges AS ( -+ SELECT DISTINCT -+ ri."referrerUserId" AS "referrerUserId", -+ rv."userId" AS "convertedUserId" -+ FROM "ReferralInvitation" ri -+ INNER JOIN "ReferendumVote" rv -+ ON rv."id" = ri."convertedVoteId" -+ INNER JOIN "User" referrer -+ ON referrer."id" = ri."referrerUserId" -+ AND referrer."deletedAt" IS NULL -+ INNER JOIN "User" converted_user -+ ON converted_user."id" = rv."userId" -+ AND converted_user."deletedAt" IS NULL -+ WHERE ri."deletedAt" IS NULL -+ AND rv."deletedAt" IS NULL -+ AND ri."status"::text = ${ReferralInvitationStatus.CONVERTED} -+ AND ri."convertedVoteId" IS NOT NULL -+ AND ri."referrerUserId" <> rv."userId" -+ ), -+ referral_tree AS ( -+ SELECT -+ edge."referrerUserId" AS "rootUserId", -+ edge."convertedUserId", -+ ARRAY[edge."referrerUserId", edge."convertedUserId"]::text[] AS path -+ FROM converted_edges edge -+ -+ UNION ALL -+ -+ SELECT -+ tree."rootUserId", -+ edge."convertedUserId", -+ tree.path || edge."convertedUserId" -+ FROM referral_tree tree -+ INNER JOIN converted_edges edge -+ ON edge."referrerUserId" = tree."convertedUserId" -+ WHERE NOT edge."convertedUserId" = ANY(tree.path) -+ AND edge."convertedUserId" <> tree."rootUserId" -+ ), -+ unique_downstream AS ( -+ SELECT DISTINCT -+ "rootUserId", -+ "convertedUserId" -+ FROM referral_tree -+ ) -+ SELECT -+ "rootUserId" AS "userId", -+ COUNT(*) AS "downstreamConversionCount" -+ FROM unique_downstream -+ GROUP BY "rootUserId" -+ `; -+ -+ return normalizeDownstreamCacheRows(rows); -+} -+ -+export async function refreshUserDownstreamCache(input?: { -+ prismaClient?: DownstreamCacheClient; -+}): Promise<{ refreshedUsers: number; resetUsers: number }> { -+ const db: DownstreamCacheClient = input?.prismaClient ?? prisma; -+ const summaries = await loadDownstreamCacheSummaries({ -+ prismaClient: db, -+ }); -+ -+ return db.$transaction(async (tx) => { -+ const reset = await tx.user.updateMany({ -+ data: { -+ downstreamConversionCount: 0, -+ }, -+ where: { deletedAt: null }, -+ }); -+ -+ for (const summary of summaries) { -+ await tx.user.update({ -+ data: { -+ downstreamConversionCount: summary.downstreamConversionCount, -+ }, -+ where: { id: summary.userId }, -+ }); -+ } -+ -+ return { -+ refreshedUsers: summaries.length, -+ resetUsers: reset.count, -+ }; -+ }); -+} -diff --git a/packages/web/src/lib/messaging.ts b/packages/web/src/lib/messaging.ts -index a7fc2613a..3e939230f 100644 ---- a/packages/web/src/lib/messaging.ts -+++ b/packages/web/src/lib/messaging.ts -@@ -13,6 +13,7 @@ import { - HUMANITY_MANAGEMENT, - ORGANIZATION_ACTIVATION_TASK_TITLE, - } from "@optimitron/data/campaign"; -+import { WELFARE_CLAIM_TEXT } from "@/components/shared/WelfareClaim.core"; - - /** Point name — single source of truth. Change here to rename everywhere. */ - export const POINT_NAME = "VOTE" as const; -@@ -26,6 +27,9 @@ export const REFERRAL_SHARE_LABEL = - export const REFERRAL_SHARE_PROMPT = - `${REFERRAL_SHARE_LABEL} It will significantly reduce the probability that they will suffer and die from horrible diseases.` as const; - -+// Welfare claim text lives in WelfareClaim.core so string-only contexts -+// do not import the React component. JSX surfaces should use WelfareClaim. -+ - export { - GLOBAL_SURVEY_NAME, - HUMANITY_MANAGEMENT, -@@ -274,8 +278,7 @@ export const VOTE_SECTION = { - // Humanity v. Government: governments are paid ~$36T/yr to promote - // the general welfare and underdeliver. Voters' welfare-findings - // become evidence in the case; preferences alone would not. -- sliderPrompt: -- "Governments are paid $36 trillion a year to promote the general welfare. What allocation between military spending and clinical trials would best fulfill that duty?", -+ sliderPrompt: `${WELFARE_CLAIM_TEXT} What allocation between military spending and clinical trials would best fulfill that duty?`, - realityCheck: - "on weapons and military systems for every $1 spent on clinical trials.", - theQuestion: -diff --git a/packages/web/src/lib/reasoning/fraud.server.ts b/packages/web/src/lib/reasoning/fraud.server.ts -index 83466fc4c..836dd605d 100644 ---- a/packages/web/src/lib/reasoning/fraud.server.ts -+++ b/packages/web/src/lib/reasoning/fraud.server.ts -@@ -111,16 +111,16 @@ export async function detectVelocityAnomaly(params: { - } - - /* ================================================================ -- * Referral graph cycle — A refers B refers A (any cycle ≤ maxDepth) -+ * Referral graph cycle — A refers B refers A within the configured search limit. - * ================================================================ */ - - export async function detectReferralCycle(params: { - userId: string; -- maxDepth: number; -+ depthLimit: number; - }): Promise { - let current = params.userId; - const seen = new Set([current]); -- for (let depth = 1; depth <= params.maxDepth; depth++) { -+ for (let depth = 1; depth <= params.depthLimit; depth++) { - const refs = await prisma.reasoningOutcomeRecord.findMany({ - where: { userId: current, outcomeKind: "VOTE" }, - take: 1, -diff --git a/packages/web/src/lib/redirects.js b/packages/web/src/lib/redirects.js -index 73f8391cd..db193aafb 100644 ---- a/packages/web/src/lib/redirects.js -+++ b/packages/web/src/lib/redirects.js -@@ -47,6 +47,22 @@ const REDIRECTS = [ - { source: "/department-of-war", destination: "/agencies/ddod", permanent: true }, - { source: "/treasury", destination: "/agencies/dtreasury", permanent: true }, - { source: "/politicians", destination: "/politicians/US", permanent: false }, -+ -+ // /people/manage was the staging name; canonical is /plaintiffs/manage. -+ // Edge redirect (Next.js preserves query string automatically). Replaces -+ // the page.tsx that called redirect() inside a Server Component — -+ // Next.js was statically pre-rendering it and converting the server -+ // redirect into a meta-refresh + client hop (200 OK), not a real 307. -+ { source: "/people/manage", destination: "/plaintiffs/manage", permanent: true }, -+ -+ // /find-trials belongs to the dfda.earth site (see site.ts canonicalPrefixes -+ // for the dfda site object). InterventionCard generates relative -+ // /find-trials links via generatePatientTrialSearchPath; when rendered on -+ // warondisease.org pages they land here. 301 to the canonical surface, -+ // preserving any path tail + query string (Next preserves the query -+ // automatically for redirect responses). -+ { source: "/find-trials", has: [{ type: "host", value: "warondisease.org" }], destination: "https://dfda.earth/find-trials", permanent: true }, -+ { source: "/find-trials/:path*", has: [{ type: "host", value: "warondisease.org" }], destination: "https://dfda.earth/find-trials/:path*", permanent: true }, - ]; - - module.exports = { REDIRECTS }; -diff --git a/packages/web/src/lib/referral-invitation-tasks.server.ts b/packages/web/src/lib/referral-invitation-tasks.server.ts -index 92a558333..9b663cfc2 100644 ---- a/packages/web/src/lib/referral-invitation-tasks.server.ts -+++ b/packages/web/src/lib/referral-invitation-tasks.server.ts -@@ -17,6 +17,9 @@ import type { Prisma, PrismaClient } from "@optimitron/db"; - import { prisma } from "@/lib/prisma"; - import { buildTriggerContext, fireTaskTrigger } from "@/lib/triggers"; - import { getReferralInvitationFirstName } from "@/lib/referral-invitation-copy"; -+import { -+ syncPerVerifiedVoterTaskImpactEstimate, -+} from "@/lib/tasks/per-verified-voter-impact.server"; - - type ReferralInvitationTaskClient = - | Pick -@@ -99,6 +102,8 @@ db: Prisma.TransactionClient | typeof prisma = prisma, - }, - }); - -+ await syncPerVerifiedVoterTaskImpactEstimate(db, parent.taskId); -+ - return parent.taskId; - } - -diff --git a/packages/web/src/lib/referral-invitations.server.ts b/packages/web/src/lib/referral-invitations.server.ts -index a2f58c2d6..09a782104 100644 ---- a/packages/web/src/lib/referral-invitations.server.ts -+++ b/packages/web/src/lib/referral-invitations.server.ts -@@ -35,6 +35,7 @@ import { getUserDisplayName, userDisplaySelect } from "@/lib/user-display"; - - const INVITE_TOKEN_SIZE = 24; - const CREATE_LIMIT_PER_HOUR = 50; -+const DOWNSTREAM_CONVERSION_INCREMENT_MAX_DEPTH = 32; - - export function isValidInvitationEmail(email: string | null | undefined): boolean { - if (!email) return false; -@@ -122,6 +123,60 @@ function getShareAttemptChannel(input: { - } - } - -+async function incrementDownstreamConversionCountsForAncestors( -+ tx: Prisma.TransactionClient, -+ input: { -+ directReferrerUserId: string; -+ voterUserId: string; -+ }, -+) { -+ const seenAncestorIds = new Set(); -+ let currentAncestorIds = [input.directReferrerUserId]; -+ -+ for ( -+ let depth = 0; -+ depth < DOWNSTREAM_CONVERSION_INCREMENT_MAX_DEPTH && currentAncestorIds.length > 0; -+ depth += 1 -+ ) { -+ const uniqueAncestorIds = [...new Set(currentAncestorIds)].filter( -+ (ancestorId) => -+ ancestorId && -+ ancestorId !== input.voterUserId && -+ !seenAncestorIds.has(ancestorId), -+ ); -+ if (uniqueAncestorIds.length === 0) return; -+ -+ for (const ancestorId of uniqueAncestorIds) { -+ seenAncestorIds.add(ancestorId); -+ await tx.user.update({ -+ where: { id: ancestorId }, -+ data: { downstreamConversionCount: { increment: 1 } }, -+ }); -+ } -+ -+ const parentEdges = await tx.referralInvitation.findMany({ -+ where: { -+ convertedVote: { -+ is: { -+ deletedAt: null, -+ userId: { in: uniqueAncestorIds }, -+ }, -+ }, -+ deletedAt: null, -+ status: ReferralInvitationStatus.CONVERTED, -+ }, -+ select: { referrerUserId: true }, -+ }); -+ -+ currentAncestorIds = parentEdges -+ .map((edge) => edge.referrerUserId) -+ .filter( -+ (ancestorId) => -+ ancestorId !== input.voterUserId && !seenAncestorIds.has(ancestorId), -+ ); -+ } -+} -+ - - export async function createReferralInvitation(input: { - referrerUserId: string; -@@ -658,6 +713,10 @@ export async function convertReferralInvitationForVote(input: { - convertedAt: now, - }, - }); -+ await incrementDownstreamConversionCountsForAncestors(tx, { -+ directReferrerUserId: invitation.referrerUserId, -+ voterUserId: input.voterUserId, -+ }); - - let completionNotification: { - commentId: string; -diff --git a/packages/web/src/lib/routes.ts b/packages/web/src/lib/routes.ts -index cebd263da..5d45dd0b9 100644 ---- a/packages/web/src/lib/routes.ts -+++ b/packages/web/src/lib/routes.ts -@@ -21,6 +21,11 @@ import { - AGENCIES, - WISHONIA_AGENCIES, - } from "@optimitron/data/datasets/wishonia-agencies"; -+import { -+ WELFARE_CLAIM_AMOUNT_TEXT, -+ WELFARE_CLAIM_METRIC_TEXT, -+ WELFARE_CLAIM_TEXT, -+} from "@/components/shared/WelfareClaim.core"; - - // Re-export so web consumers can `import { HUMANITY_V_GOVERNMENT_CASE_NAME } - // from "@/lib/routes"` alongside the rest of the route catalog. -@@ -483,8 +488,7 @@ export const presidentManagementLink: NavItem = { - href: ROUTES.employees, - label: "Remind Presidents", - emoji: "🪪", -- description: -- "You give these people $37 trillion a year to promote the general welfare. Track who signed the 1% Treaty and remind the overdue ones.", -+ description: `You pay these people ${WELFARE_CLAIM_AMOUNT_TEXT} a year to ${WELFARE_CLAIM_METRIC_TEXT}. Track who signed the 1% Treaty and remind the overdue ones.`, - tagline: "Remind presidents to promote the general welfare", - copyPreview: true, - screenshot: true, -@@ -720,8 +724,7 @@ export const humanityVGovernmentLink: NavItem = { - href: ROUTES.humanityVGovernment, - label: HUMANITY_V_GOVERNMENT_CASE_NAME, - emoji: "⚖️", -- description: -- "Governments were hired to promote the general welfare. Since 1900, they spent fortunes on war and left the sick in line. Vote on whether they owe humanity damages.", -+ description: `${WELFARE_CLAIM_TEXT} Since 1900 they spent fortunes on war and left the sick in line. Vote on whether they owe humanity damages.`, - tagline: "Do governments owe damages?", - copyPreview: true, - screenshot: true, -diff --git a/packages/web/src/lib/tasks/__tests__/per-verified-voter-impact.server.test.ts b/packages/web/src/lib/tasks/__tests__/per-verified-voter-impact.server.test.ts -new file mode 100644 -index 000000000..5d85fd0c9 ---- /dev/null -+++ b/packages/web/src/lib/tasks/__tests__/per-verified-voter-impact.server.test.ts -@@ -0,0 +1,54 @@ -+import { describe, expect, it, vi } from "vitest"; -+import { -+ syncPerVerifiedVoterTaskImpactEstimate, -+ type PerVerifiedVoterTaskImpactClient, -+} from "../per-verified-voter-impact.server"; -+ -+describe("syncPerVerifiedVoterTaskImpactEstimate", () => { -+ it("replaces only the per-verified-voter estimate set for the task", async () => { -+ const taskUpdate = vi.fn().mockResolvedValue({}); -+ const estimateSetUpdateMany = vi.fn().mockResolvedValue({ count: 2 }); -+ const estimateSetDeleteMany = vi.fn().mockResolvedValue({ count: 1 }); -+ const estimateSetCreate = vi.fn().mockResolvedValue({ id: "estimate_set_1" }); -+ const frameCreate = vi.fn().mockResolvedValue({ id: "frame_1" }); -+ const metricCreateMany = vi.fn().mockResolvedValue({ count: 2 }); -+ const db: PerVerifiedVoterTaskImpactClient = { -+ task: { update: taskUpdate }, -+ taskImpactEstimateSet: { -+ create: estimateSetCreate, -+ deleteMany: estimateSetDeleteMany, -+ updateMany: estimateSetUpdateMany, -+ }, -+ taskImpactFrameEstimate: { create: frameCreate }, -+ taskImpactMetric: { createMany: metricCreateMany }, -+ }; -+ -+ await syncPerVerifiedVoterTaskImpactEstimate(db, "task_1"); -+ -+ expect(estimateSetUpdateMany).toHaveBeenCalledWith({ -+ data: { isCurrent: false }, -+ where: { -+ deletedAt: null, -+ taskId: "task_1", -+ }, -+ }); -+ expect(estimateSetDeleteMany).toHaveBeenCalledWith({ -+ where: { -+ calculationVersion: "seed-v1", -+ counterfactualKey: "status-quo", -+ estimateKind: "FORECAST", -+ methodologyKey: "treaty-per-verified-voter-lifetime", -+ parameterSetHash: "seed-global-registered-voters", -+ sourceSystem: "PARAMETER_CATALOG", -+ taskId: "task_1", -+ }, -+ }); -+ expect(estimateSetDeleteMany).not.toHaveBeenCalledWith({ -+ where: { taskId: "task_1" }, -+ }); -+ expect(taskUpdate).toHaveBeenCalledWith({ -+ data: { currentImpactEstimateSetId: "estimate_set_1" }, -+ where: { id: "task_1" }, -+ }); -+ }); -+}); -diff --git a/packages/web/src/lib/tasks/__tests__/task-comment-notification-email.test.ts b/packages/web/src/lib/tasks/__tests__/task-comment-notification-email.test.ts -index a385f438d..7450f704c 100644 ---- a/packages/web/src/lib/tasks/__tests__/task-comment-notification-email.test.ts -+++ b/packages/web/src/lib/tasks/__tests__/task-comment-notification-email.test.ts -@@ -101,6 +101,20 @@ describe("buildTaskCommentNotificationEmail", () => { - expect(email.html).toContain("Open task"); - }); - -+ it("renders the template-driven share footer when the recipient has a referral URL", async () => { -+ const email = await buildTaskCommentNotificationEmail({ -+ ...baseInput, -+ recipientReferralUrl: "https://warondisease.org/vote/SAMPLE", -+ }); -+ expect(email.html).toContain("Forward this"); -+ expect(email.html).toContain("Hi there"); -+ expect(email.html).toContain("respond to this stupid survey"); -+ expect(email.html).toContain("https://warondisease.org/vote/SAMPLE"); -+ expect(email.html).not.toContain("{treaty_url}"); -+ expect(email.text).toContain("Hi there"); -+ expect(email.text).not.toContain("{target_name}"); -+ }); -+ - it("suppresses the CTA when explicitly null", async () => { - const email = await buildTaskCommentNotificationEmail({ - ...baseInput, -diff --git a/packages/web/src/lib/tasks/per-verified-voter-impact.server.ts b/packages/web/src/lib/tasks/per-verified-voter-impact.server.ts -new file mode 100644 -index 000000000..4d052d91f ---- /dev/null -+++ b/packages/web/src/lib/tasks/per-verified-voter-impact.server.ts -@@ -0,0 +1,165 @@ -+import type { Prisma, PrismaClient } from "@optimitron/db"; -+import { -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_DALYS, -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_ECONOMIC_VALUE, -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_YEARS, -+ EVENTUALLY_AVOIDABLE_DALY_PCT, -+ GLOBAL_ANNUAL_DALY_BURDEN, -+ GLOBAL_COORDINATION_ACTIVATION_COST_PER_PARTICIPANT, -+ GLOBAL_REGISTERED_VOTERS, -+ STANDARD_ECONOMIC_QALY_VALUE_USD, -+ VOTER_LIVES_SAVED, -+ VOTER_SUFFERING_HOURS_PREVENTED, -+} from "@optimitron/data/parameters"; -+ -+const TREATY_IMPACT_CALCULATIONS_URL = -+ "https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html"; -+const TREATY_PER_VERIFIED_VOTER_METHODOLOGY_KEY = -+ "treaty-per-verified-voter-lifetime"; -+const TREATY_PER_VERIFIED_VOTER_PARAMETER_SET_HASH_SUFFIX = -+ "global-registered-voters"; -+const TREATY_PER_VERIFIED_VOTER_PARAMETER_SET_HASH = -+ `seed-${TREATY_PER_VERIFIED_VOTER_PARAMETER_SET_HASH_SUFFIX}`; -+ -+export type PerVerifiedVoterTaskImpactClient = { -+ task: Pick; -+ taskImpactEstimateSet: Pick< -+ PrismaClient["taskImpactEstimateSet"], -+ "create" | "deleteMany" | "updateMany" -+ >; -+ taskImpactFrameEstimate: Pick; -+ taskImpactMetric: Pick; -+}; -+ -+function buildPerVerifiedVoterImpact() { -+ const totalDalys = DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_DALYS.value; -+ const totalEconValue = -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_ECONOMIC_VALUE.value; -+ const accelerationYears = DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_YEARS.value; -+ const targetVoterCount = GLOBAL_REGISTERED_VOTERS.value; -+ const annualAvoidableDalys = -+ GLOBAL_ANNUAL_DALY_BURDEN.value * EVENTUALLY_AVOIDABLE_DALY_PCT.value; -+ const delayDalysPerDay = annualAvoidableDalys / 365; -+ const delayEconPerDay = -+ delayDalysPerDay * STANDARD_ECONOMIC_QALY_VALUE_USD.value; -+ -+ return { -+ estimatedCashCostUsdBase: -+ GLOBAL_COORDINATION_ACTIVATION_COST_PER_PARTICIPANT.value, -+ expectedEconomicValueUsdBase: totalEconValue / targetVoterCount, -+ expectedDalysAvertedBase: totalDalys / targetVoterCount, -+ delayEconomicValueUsdLostPerDayBase: -+ delayEconPerDay / targetVoterCount, -+ delayDalysLostPerDayBase: delayDalysPerDay / targetVoterCount, -+ successProbabilityBase: 1, -+ benefitDurationYears: accelerationYears, -+ metrics: [ -+ { -+ metricKey: "lives_saved_if_success", -+ unit: VOTER_LIVES_SAVED.unit, -+ baseValue: VOTER_LIVES_SAVED.value, -+ displayGroup: "human-impact", -+ metadataJson: { -+ calculationsUrl: VOTER_LIVES_SAVED.calculationsUrl, -+ parameterName: VOTER_LIVES_SAVED.parameterName, -+ } satisfies Prisma.InputJsonObject, -+ }, -+ { -+ metricKey: "suffering_hours_if_success", -+ unit: VOTER_SUFFERING_HOURS_PREVENTED.unit, -+ baseValue: VOTER_SUFFERING_HOURS_PREVENTED.value, -+ displayGroup: "human-impact", -+ metadataJson: { -+ calculationsUrl: VOTER_SUFFERING_HOURS_PREVENTED.calculationsUrl, -+ parameterName: VOTER_SUFFERING_HOURS_PREVENTED.parameterName, -+ } satisfies Prisma.InputJsonObject, -+ }, -+ ], -+ }; -+} -+ -+export async function syncPerVerifiedVoterTaskImpactEstimate( -+ db: PerVerifiedVoterTaskImpactClient, -+ taskId: string, -+) { -+ const impact = buildPerVerifiedVoterImpact(); -+ -+ await db.taskImpactEstimateSet.updateMany({ -+ where: { -+ deletedAt: null, -+ taskId, -+ }, -+ data: { isCurrent: false }, -+ }); -+ -+ await db.taskImpactEstimateSet.deleteMany({ -+ where: { -+ calculationVersion: "seed-v1", -+ counterfactualKey: "status-quo", -+ estimateKind: "FORECAST", -+ methodologyKey: TREATY_PER_VERIFIED_VOTER_METHODOLOGY_KEY, -+ parameterSetHash: TREATY_PER_VERIFIED_VOTER_PARAMETER_SET_HASH, -+ sourceSystem: "PARAMETER_CATALOG", -+ taskId, -+ }, -+ }); -+ -+ const estimateSet = await db.taskImpactEstimateSet.create({ -+ data: { -+ taskId, -+ isCurrent: true, -+ estimateKind: "FORECAST", -+ publicationStatus: "PUBLISHED", -+ sourceSystem: "PARAMETER_CATALOG", -+ calculationVersion: "seed-v1", -+ methodologyKey: TREATY_PER_VERIFIED_VOTER_METHODOLOGY_KEY, -+ parameterSetHash: TREATY_PER_VERIFIED_VOTER_PARAMETER_SET_HASH, -+ counterfactualKey: "status-quo", -+ assumptionsJson: { -+ calculationsUrl: TREATY_IMPACT_CALCULATIONS_URL, -+ parameterNames: [ -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_DALYS.parameterName, -+ DFDA_TRIAL_CAPACITY_PLUS_EFFICACY_LAG_ECONOMIC_VALUE.parameterName, -+ GLOBAL_REGISTERED_VOTERS.parameterName, -+ ].filter((name): name is string => Boolean(name)), -+ }, -+ }, -+ }); -+ -+ await db.task.update({ -+ where: { id: taskId }, -+ data: { currentImpactEstimateSetId: estimateSet.id }, -+ }); -+ -+ const frame = await db.taskImpactFrameEstimate.create({ -+ data: { -+ taskImpactEstimateSetId: estimateSet.id, -+ frameKey: "LIFETIME", -+ frameSlug: "lifetime", -+ evaluationHorizonYears: impact.benefitDurationYears, -+ timeToImpactStartDays: 365, -+ adoptionRampYears: 5, -+ benefitDurationYears: impact.benefitDurationYears, -+ annualDiscountRate: 0, -+ successProbabilityBase: impact.successProbabilityBase, -+ expectedEconomicValueUsdBase: impact.expectedEconomicValueUsdBase, -+ expectedDalysAvertedBase: impact.expectedDalysAvertedBase, -+ delayEconomicValueUsdLostPerDayBase: -+ impact.delayEconomicValueUsdLostPerDayBase, -+ delayDalysLostPerDayBase: impact.delayDalysLostPerDayBase, -+ estimatedCashCostUsdBase: impact.estimatedCashCostUsdBase, -+ estimatedEffortHoursBase: 0.01, -+ }, -+ }); -+ -+ await db.taskImpactMetric.createMany({ -+ data: impact.metrics.map((metric) => ({ -+ taskImpactFrameEstimateId: frame.id, -+ metricKey: metric.metricKey, -+ unit: metric.unit ?? "", -+ baseValue: metric.baseValue, -+ displayGroup: metric.displayGroup, -+ metadataJson: metric.metadataJson, -+ })), -+ }); -+} -diff --git a/packages/web/src/lib/tasks/task-comment-notification-react-email.tsx b/packages/web/src/lib/tasks/task-comment-notification-react-email.tsx -index f9a09593d..786c92d08 100644 ---- a/packages/web/src/lib/tasks/task-comment-notification-react-email.tsx -+++ b/packages/web/src/lib/tasks/task-comment-notification-react-email.tsx -@@ -7,6 +7,7 @@ import { - CampaignShareFooter, - CampaignText, - } from "@/lib/email/react-email-components"; -+import { EMAIL_SHARE_TEMPLATE_ID } from "@/lib/email/share-footer"; - import type { SenderSignature } from "@/lib/email/wishonia-signature"; - - const ink = "#111827"; -@@ -134,7 +135,10 @@ export function TaskCommentNotificationReactEmail({ - ) : null} - {senderSignature ? : null} - {recipientReferralUrl ? ( -- -+ - ) : null} - =10'} - dev: true - -- /@argos-ci/api-client@0.19.0: -- resolution: {integrity: sha512-6nxyWg0DBqBeRMIV/Efa881yHYPtFuzonkY5ckLwnOnAZqhk3pz6tVAn1WILJ/pL4eZvA98nQQt9WVofA+Mrfw==} -- engines: {node: '>=20.0.0'} -- dependencies: -- debug: 4.4.3(supports-color@8.1.1) -- openapi-fetch: 0.17.0 -- transitivePeerDependencies: -- - supports-color -- dev: true -- -- /@argos-ci/browser@5.1.3: -- resolution: {integrity: sha512-2acfqcb7A2VNqm43bBk90PleBV+qCwO68FNmoGn28zs3d10G3W3/ZkqtoYUY3ycWclWQ/KYxH8SdHQfz4iB3ow==} -- engines: {node: '>=20.0.0'} -- dev: true -- -- /@argos-ci/core@5.3.1: -- resolution: {integrity: sha512-lU8IOeb0pHJHUSS/pl7oVG7mTdNslOH7PiVbIW2w8004nhSYQciqhM98vWLrfmRLQfHJjpPIM3KCVg2qBKPKXQ==} -- engines: {node: '>=20.0.0'} -- dependencies: -- '@argos-ci/api-client': 0.19.0 -- '@argos-ci/util': 3.4.0 -- convict: 6.2.5 -- debug: 4.4.3(supports-color@8.1.1) -- fast-glob: 3.3.3 -- mime-types: 3.0.2 -- sharp: 0.34.5 -- tmp: 0.2.5 -- transitivePeerDependencies: -- - supports-color -- dev: true -- -- /@argos-ci/playwright@6.6.4: -- resolution: {integrity: sha512-8ewmYSZabfRYLIKbIOOJAZm4GOM7o+VIdNjcEW6B4rF+u7l+IkySUt/zPFsiyl1dPC2xAV7eH+0SnaZX0svBpw==} -- engines: {node: '>=20.0.0'} -- dependencies: -- '@argos-ci/browser': 5.1.3 -- '@argos-ci/core': 5.3.1 -- '@argos-ci/util': 3.4.0 -- chalk: 5.6.2 -- debug: 4.4.3(supports-color@8.1.1) -- transitivePeerDependencies: -- - supports-color -- dev: true -- -- /@argos-ci/util@3.4.0: -- resolution: {integrity: sha512-rPa8xu6k0TkK1V4CIapcx2x/ncB7dvGa0adXCkflQf+rZZvZaVI3jCVXR57bCZn+S5AWndj4+A/7pX5xV9krvQ==} -- engines: {node: '>=20.0.0'} -- dev: true -- - /@asamuzakjp/css-color@3.2.0: - resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - dependencies: -@@ -12528,14 +12476,6 @@ packages: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false - -- /convict@6.2.5: -- resolution: {integrity: sha512-JtXpxqDqJ8P0UwEHwhxLzCIXQy97vlYBZR222Sbzb1q1Erex9ASrztJ29SyhWFQjod1AeFBaPzEEC8YvtZMIYg==} -- engines: {node: '>=6'} -- dependencies: -- lodash.clonedeep: 4.5.0 -- yargs-parser: 20.2.9 -- dev: true -- - /cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - dev: false -@@ -17686,16 +17626,6 @@ packages: - zod: 3.25.76 - dev: true - -- /openapi-fetch@0.17.0: -- resolution: {integrity: sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==} -- dependencies: -- openapi-typescript-helpers: 0.1.0 -- dev: true -- -- /openapi-typescript-helpers@0.1.0: -- resolution: {integrity: sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==} -- dev: true -- - /opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true -@@ -20421,11 +20351,6 @@ packages: - os-tmpdir: 1.0.2 - dev: true - -- /tmp@0.2.5: -- resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} -- engines: {node: '>=14.14'} -- dev: true -- - /to-buffer@1.2.2: - resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} - engines: {node: '>= 0.4'} diff --git a/TODO.md b/TODO.md index ac5c2d19a..2cfb92195 100644 --- a/TODO.md +++ b/TODO.md @@ -460,7 +460,7 @@ Roadmap from Mike's 2026-05-15 brainstorm. /people/[id] redesign lands in PR #81 **Risks:** public-figure attribution disputes (use only documented public statements; label "historical position, not active endorsement"); spam on `/admin/assign-task` (superuser-gated); org-task display competing with conversion CTA (keep task list below the fold). -Drafted plan: `.claude/plans/campaign-impact-attribution-roadmap.md` (not yet reviewed; Mike declined full `/autoplan` review for speed). +Durable summary lives here; no loose `.claude/plans/campaign-impact-attribution-roadmap.md` file should be kept unless a fresh plan review starts. ## P1 - Plaintiffs and Court Framing diff --git a/packages/web/e2e/email-screenshots.spec.ts b/packages/web/e2e/email-screenshots.spec.ts index 2f343ea16..f95319f02 100644 --- a/packages/web/e2e/email-screenshots.spec.ts +++ b/packages/web/e2e/email-screenshots.spec.ts @@ -85,12 +85,7 @@ test.describe("email visual coverage", () => { page, "post-vote-share", "email-post-vote-share", - [ - "Forward this message to everyone you don't want to suffer and die of horrible diseases.", - "122 stored apocalypses", - "COPY THIS MESSAGE", - "1% Treaty", - ], + "https://warondisease.org/vote/SAMPLE", testInfo, ); }); diff --git a/packages/web/e2e/treaty-vote-click.spec.ts b/packages/web/e2e/treaty-vote-click.spec.ts index c46f7b46e..a39c7ca64 100644 --- a/packages/web/e2e/treaty-vote-click.spec.ts +++ b/packages/web/e2e/treaty-vote-click.spec.ts @@ -1,21 +1,96 @@ -import { expect, type Page, test } from "@playwright/test"; +import { expect, type Locator, type Page, test } from "@playwright/test"; -const VOTE_URL = - "/vote?ref=mike&invite=Uyn3Wl7O_OGdiVyJ4y0-fAhZ&treatyFlow=v1"; +const VOTE_URL = "/vote?ref=mike&invite=Uyn3Wl7O_OGdiVyJ4y0-fAhZ&treatyFlow=v1"; const VOTE_INVITE_CODE = "mike"; const VOTE_INVITE_TOKEN = "Uyn3Wl7O_OGdiVyJ4y0-fAhZ"; +type ScrollIntoViewCall = { + behavior: ScrollBehavior | null; + block: ScrollLogicalPosition | null; + inline: ScrollLogicalPosition | null; + text: string; +}; + +type TreatyScrollWindow = Window & { + __treatyScrollIntoViewCalls?: ScrollIntoViewCall[]; + __treatyScrollIntoViewRecorderInstalled?: boolean; +}; + +async function installScrollIntoViewRecorder(page: Page): Promise { + await page.addInitScript(() => { + const win = window as TreatyScrollWindow; + if (win.__treatyScrollIntoViewRecorderInstalled) return; + + win.__treatyScrollIntoViewRecorderInstalled = true; + win.__treatyScrollIntoViewCalls = []; + + const originalScrollIntoView = Element.prototype.scrollIntoView; + Element.prototype.scrollIntoView = function scrollIntoViewRecorder( + arg?: boolean | ScrollIntoViewOptions, + ) { + const options = typeof arg === "object" && arg !== null ? arg : {}; + win.__treatyScrollIntoViewCalls?.push({ + behavior: options.behavior ?? null, + block: options.block ?? null, + inline: options.inline ?? null, + text: this.textContent?.trim() ?? "", + }); + + return originalScrollIntoView.call(this, arg); + }; + }); +} + +async function clearScrollIntoViewCalls(page: Page): Promise { + await page.evaluate(() => { + const win = window as TreatyScrollWindow; + win.__treatyScrollIntoViewCalls = []; + }); +} + +async function expectSubmitAutoScrollAfterRelease( + page: Page, + submit: Locator, +): Promise { + await expect + .poll( + async () => + page.evaluate(() => { + const win = window as TreatyScrollWindow; + return (win.__treatyScrollIntoViewCalls ?? []).filter( + (call) => + call.text.includes("SUBMIT") && + call.behavior === "smooth" && + call.block === "center", + ).length; + }), + { + message: + "releasing the allocation slider should call smooth center scroll on SUBMIT", + timeout: 3_000, + }, + ) + .toBeGreaterThan(0); + + await expect(submit).toBeInViewport({ timeout: 3_000 }); +} + async function completeSliderAndVote(page: Page): Promise { const voteSection = page.locator("#vote"); const slider = voteSection.locator('input[type="range"]'); await expect(slider).toBeVisible({ timeout: 15_000 }); const submit = voteSection.locator("button:has-text('SUBMIT')"); + const dragAttempts: string[] = []; + let submitRevealed = false; + + await clearScrollIntoViewCalls(page); for (const targetRatio of [0.3, 0.25, 0.35]) { const box = await slider.boundingBox(); expect(box, "slider track should have geometry").not.toBeNull(); if (!box) return; + const valueBeforeDrag = await slider.inputValue(); const y = box.y + box.height / 2; const targetX = box.x + box.width * targetRatio; const startX = box.x + box.width / 2; @@ -25,50 +100,45 @@ async function completeSliderAndVote(page: Page): Promise { await page.mouse.move(targetX, y, { steps: 12 }); await page.mouse.up(); - if (await submit.isVisible({ timeout: 1_500 }).catch(() => false)) { + const valueAfterDrag = await slider.inputValue(); + const submitVisible = await submit + .isVisible({ timeout: 1_500 }) + .catch(() => false); + dragAttempts.push( + `target=${targetRatio}; slider=${valueBeforeDrag}->${valueAfterDrag}; submit=${ + submitVisible ? "visible" : "hidden" + }`, + ); + + if (submitVisible) { + await expectSubmitAutoScrollAfterRelease(page, submit); + submitRevealed = true; break; } } + expect( + submitRevealed, + `SUBMIT should reveal after a real slider drag. Attempts: ${dragAttempts.join( + " | ", + )}`, + ).toBe(true); await expect(submit).toBeVisible({ timeout: 10_000 }); - const scrollYBeforeSubmit = await page.evaluate(() => window.scrollY); await submit.click(); const yesButton = voteSection.locator("button:has-text('YES')"); await expect(yesButton).toBeVisible({ timeout: 10_000 }); - const maxSubmitScrollDelta = await page.evaluate( - (scrollYBeforeSubmit) => - new Promise((resolve) => { - const startedAt = performance.now(); - let maxDelta = 0; - - const sample = () => { - maxDelta = Math.max( - maxDelta, - Math.abs(window.scrollY - scrollYBeforeSubmit), - ); - - if (performance.now() - startedAt >= 700) { - resolve(maxDelta); - return; - } - - requestAnimationFrame(sample); - }; - - requestAnimationFrame(sample); - }), - scrollYBeforeSubmit, - ); - expect( - maxSubmitScrollDelta, - "submitting the allocation slider should not auto-scroll the page", - ).toBeLessThan(80); await yesButton.click(); } test.describe("treaty vote yes-click regression", () => { - test("anonymous visitor reaches post-vote save flow after YES", async ({ page }) => { + test.beforeEach(async ({ page }) => { + await installScrollIntoViewRecorder(page); + }); + + test("anonymous visitor reaches post-vote save flow after YES", async ({ + page, + }) => { const response = await page.goto(VOTE_URL, { waitUntil: "domcontentloaded", }); @@ -93,7 +163,9 @@ test.describe("treaty vote yes-click regression", () => { const postVoteRedirect = page.getByTestId("treaty-post-vote-redirect"); await expect(postVoteRedirect).toBeVisible({ timeout: 15_000 }); await expect( - postVoteRedirect.getByRole("button", { name: /(Save|Verify) with Google/i }), + postVoteRedirect.getByRole("button", { + name: /(Save|Verify) with Google/i, + }), ).toBeVisible({ timeout: 10_000 }); }); @@ -139,7 +211,9 @@ test.describe("treaty vote yes-click regression", () => { const postVoteRedirect = page.getByTestId("treaty-post-vote-redirect"); await expect(postVoteRedirect).toBeVisible({ timeout: 15_000 }); await expect( - postVoteRedirect.getByRole("button", { name: /(Save|Verify) with Google/i }), + postVoteRedirect.getByRole("button", { + name: /(Save|Verify) with Google/i, + }), ).toBeVisible({ timeout: 10_000 }); }); }); diff --git a/packages/web/e2e/treaty-vote-login.spec.ts b/packages/web/e2e/treaty-vote-login.spec.ts index a1b97f0ac..7240ed99e 100644 --- a/packages/web/e2e/treaty-vote-login.spec.ts +++ b/packages/web/e2e/treaty-vote-login.spec.ts @@ -111,17 +111,17 @@ test("signed-in user can sign out from the dashboard", async ({ page }) => { // Confirm we stayed on /dashboard (i.e. the jwt-callback regression is fixed). expect(page.url()).toMatch(/\/dashboard/); - // The main DashboardClient's "SIGN OUT" button is the one rendered on the - // default host. The ReferendumSiteDashboardClient logout is covered by the - // unit tests (its surface is only rendered on the treaty host, which needs - // host-header manipulation unavailable in a generic Playwright run). - const signOutButton = page.locator( - "button:has-text('Sign Out'), button:has-text('SIGN OUT')", - ); - await expect(signOutButton.first()).toBeVisible({ timeout: 10_000 }); + const menuTrigger = page.getByRole("button", { name: "Open menu" }); + await expect(menuTrigger).toBeVisible({ timeout: 10_000 }); + await menuTrigger.click(); + + const dialog = page.getByRole("dialog"); + await expect(dialog).toBeVisible({ timeout: 10_000 }); + const signOutButton = dialog.getByRole("button", { name: /Sign Out/i }); + await expect(signOutButton).toBeVisible({ timeout: 10_000 }); await Promise.all([ page.waitForURL((url) => url.pathname === "/", { timeout: 10_000 }), - signOutButton.first().click(), + signOutButton.click(), ]); // Re-visiting /dashboard should now redirect to /auth/signin. diff --git a/packages/web/e2e/utils/visual-routes.ts b/packages/web/e2e/utils/visual-routes.ts index 76d9101ff..a074b8271 100644 --- a/packages/web/e2e/utils/visual-routes.ts +++ b/packages/web/e2e/utils/visual-routes.ts @@ -53,6 +53,11 @@ const SEEDED_DYNAMIC_ROUTES: VisualRoute[] = [ path: "/organizations/institute-for-accelerated-medicine", required: false, }, + { + name: "organization-iam-survey", + path: "/survey/institute-for-accelerated-medicine", + required: false, + }, { name: "people-mike", path: "/people/mike", required: false }, { name: "task-optimize-earth", path: "/tasks/optimize-earth", required: false }, { name: "task-one-percent-treaty", path: "/tasks/1-pct-treaty", required: false }, diff --git a/packages/web/e2e/visual-regression.spec.ts b/packages/web/e2e/visual-regression.spec.ts index 18bdf665b..f18a19005 100644 --- a/packages/web/e2e/visual-regression.spec.ts +++ b/packages/web/e2e/visual-regression.spec.ts @@ -38,24 +38,17 @@ const VISUAL_REVIEW_CSS = ` [data-visual-mask="dynamic"], [data-volatile] { -webkit-text-fill-color: transparent !important; - position: relative !important; } - [data-visual-mask="dynamic"]::after { + [data-visual-mask="dynamic"]::before { color: currentColor !important; content: attr(data-visual-placeholder) !important; - left: 0; - position: absolute; - top: 0; -webkit-text-fill-color: currentColor !important; } - [data-volatile]::after { + [data-volatile]::before { color: currentColor !important; content: "[" attr(data-volatile) "]" !important; - left: 0; - position: absolute; - top: 0; -webkit-text-fill-color: currentColor !important; } @@ -167,7 +160,7 @@ async function openVisualRoute(page: Page, routePath: string) { }); page.on("pageerror", (error) => { - if (!error.message.includes("Hydration")) { + if (!isIgnoredVisualPageError(error)) { errors.push(error.stack ?? error.message); } }); @@ -182,6 +175,19 @@ async function openVisualRoute(page: Page, routePath: string) { return response; } +function isIgnoredVisualPageError(error: Error) { + const message = error.stack ?? error.message; + return ( + message.includes("Hydration") || + /\$RS[\s\S]+Cannot read properties of null \(reading 'parentNode'\)/.test( + message, + ) || + /Cannot read properties of null \(reading 'parentNode'\)[\s\S]+\$RS/.test( + message, + ) + ); +} + async function normalizeVisualPage(page: Page) { await page.evaluate(() => { document.documentElement.style.scrollBehavior = "auto"; diff --git a/packages/web/scripts/build-visual-review.mjs b/packages/web/scripts/build-visual-review.mjs index ab278c990..d6af81163 100644 --- a/packages/web/scripts/build-visual-review.mjs +++ b/packages/web/scripts/build-visual-review.mjs @@ -119,6 +119,7 @@ const routeOrder = [ "settings", "organizations", "organization-iam-public", + "organization-iam-survey", "task-optimize-earth", "task-one-percent-treaty", "task-signer-canada", @@ -398,6 +399,16 @@ function renderHtml(groups) { align-items: start; } + @media (min-width: 1200px) { + .pair-screens.has-pixel-diff { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .pair-screens.has-pixel-diff > figure:nth-child(3) { + border-left: 1px solid var(--line); + } + } + figure { margin: 0; background: #ffffff; @@ -407,6 +418,12 @@ function renderHtml(groups) { border-left: 1px solid var(--line); } + .markdown-diff-figure { + border-left: 0 !important; + border-top: 1px solid var(--line); + grid-column: 1 / -1; + } + /* Mobile: per-pair horizontal carousel. DOM order stays [before, after, pixel diff, markdown diff] (desktop-correct, reviewers want before/after side-by-side). @@ -1315,6 +1332,7 @@ function escapeJsonForAttr(value) { function renderPair(pair) { const routeUrl = getRouteUrl(pair.routeName); const markdownDiff = buildMarkdownDiff(pair); + const hasPixelDiff = Boolean(pair.diff?.diffRelPath); // Default: mobile pairs open, desktop pairs collapsed. const isMobile = pair.projectName === "visual-mobile"; const openAttr = isMobile ? " open" : ""; @@ -1326,7 +1344,7 @@ function renderPair(pair) { ${escapeHtml(pair.diff.label)} -
+
${renderFigure(pair.before, "Before: main", routeUrl, buildScreenContext(pair, "before", pair.before?.relPath))} ${renderFigure(pair.after, "After: pull request", routeUrl, buildScreenContext(pair, "after", pair.after?.relPath))} ${pair.diff?.diffRelPath ? renderDiffFigure(pair.diff.diffRelPath, pair.routeName, pair.projectName, routeUrl, buildScreenContext(pair, "diff", pair.diff.diffRelPath)) : ""} diff --git a/packages/web/scripts/render-emails-to-markdown.ts b/packages/web/scripts/render-emails-to-markdown.ts index 0c4e80932..71447f789 100644 --- a/packages/web/scripts/render-emails-to-markdown.ts +++ b/packages/web/scripts/render-emails-to-markdown.ts @@ -74,7 +74,7 @@ async function extractEmailMarkdown( if (status !== undefined && status >= 400) { throw new Error(`HTTP ${status} from /dev/email/${slug}`); } - return await page.evaluate(() => { + return await page.evaluate((canonicalBase) => { // tsx/esbuild injects __name(...) wrappers for named arrows; shim it. // eslint-disable-next-line @typescript-eslint/no-explicit-any const w = window as unknown as { __name?: (t: unknown, n: string) => unknown }; @@ -95,6 +95,10 @@ async function extractEmailMarkdown( // copies in the DOM but only one is visible at the current viewport. The // walker must skip the `display: none` copy or the snapshot doubles up. const SR_ONLY_PATTERN = /(?:^|\s)(?:sm:|md:|lg:|xl:|2xl:)?sr-only(?:\s|$)/; + const LOOPBACK_ORIGIN_RX = + /https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0)(?::\d+)?(?=[/:?#"'\s)\]]|$)/gi; + const canonicalizeHref = (href: string): string => + href.replace(LOOPBACK_ORIGIN_RX, canonicalBase); const isHiddenForRender = (el: Element): boolean => { const style = getComputedStyle(el); if (style.display === "none" || style.visibility === "hidden") return true; @@ -131,7 +135,7 @@ async function extractEmailMarkdown( const child = node as Element; if (!allowHidden && isHiddenForRender(child)) continue; if (child.tagName === "A") { - const href = child.getAttribute("href") ?? ""; + const href = canonicalizeHref(child.getAttribute("href") ?? ""); let inner = toMarkdown(child, allowHidden).replace(/\s+/g, " ").trim(); if (!inner && child.children.length > 0) { inner = toMarkdown(child, true).replace(/\s+/g, " ").trim(); @@ -217,7 +221,7 @@ async function extractEmailMarkdown( const text = (el as HTMLElement).innerText.trim(); md = text ? `\`\`\`text\n${text}\n\`\`\`` : ""; } else if (tag === "a") { - const href = el.getAttribute("href") ?? ""; + const href = canonicalizeHref(el.getAttribute("href") ?? ""); let inner = toMarkdown(el).replace(/\s+/g, " ").trim(); if (!inner && el.children.length > 0) { inner = toMarkdown(el, true).replace(/\s+/g, " ").trim(); @@ -253,7 +257,7 @@ async function extractEmailMarkdown( previousKind = block.kind; } return lines.join("\n"); - }); + }, CANONICAL_BASE); } function escapeMarkdownTableCell(value: string): string { diff --git a/packages/web/src/app/agencies/[agencyId]/page.logged-out.md b/packages/web/src/app/agencies/[agencyId]/page.logged-out.md index e9ba007d4..525f2ec30 100644 --- a/packages/web/src/app/agencies/[agencyId]/page.logged-out.md +++ b/packages/web/src/app/agencies/[agencyId]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/agencies/dcongress/referendums/[slug]/page.logged-out.md b/packages/web/src/app/agencies/dcongress/referendums/[slug]/page.logged-out.md index 73b2cc9a1..2e8973869 100644 --- a/packages/web/src/app/agencies/dcongress/referendums/[slug]/page.logged-out.md +++ b/packages/web/src/app/agencies/dcongress/referendums/[slug]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/agencies/dfec/alignment/[identifier]/page.logged-out.md b/packages/web/src/app/agencies/dfec/alignment/[identifier]/page.logged-out.md index a1302ce5f..4967e2f6a 100644 --- a/packages/web/src/app/agencies/dfec/alignment/[identifier]/page.logged-out.md +++ b/packages/web/src/app/agencies/dfec/alignment/[identifier]/page.logged-out.md @@ -2,16 +2,22 @@ ## Metadata -- Page title: [missing] -- Meta description: [missing] +- Page title: Alignment Report | Optimitron | International Campaign to End War and Disease +- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. - Canonical: [missing] -- Open Graph title: [missing] -- Open Graph description: [missing] -- Open Graph image: [missing] -- Twitter title: [missing] -- Twitter description: [missing] +- Open Graph title: International Campaign to End War and Disease +- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. +- Open Graph image: https://warondisease.org/site-assets/warondisease/war-on-disease-og-1200x630.png +- Twitter title: International Campaign to End War and Disease +- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. ## Visible Page Copy -### Something went wrong! -- Try again +## 404 +- PAGE NOT FOUND +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/agencies/dtreasury/page.logged-out.md b/packages/web/src/app/agencies/dtreasury/page.logged-out.md index efd74de98..dabff992c 100644 --- a/packages/web/src/app/agencies/dtreasury/page.logged-out.md +++ b/packages/web/src/app/agencies/dtreasury/page.logged-out.md @@ -55,7 +55,6 @@ ## EVERY TRANSACTION FUNDS YOUR UBI - On my planet, the treasury runs itself. A small transaction tax on every $WISH transfer flows here automatically. Then 100% of it gets split equally among every verified citizen. No IRS. No welfare bureaucracy. No applications. Just proof you exist. - Politician funding? That's handled by Incentive Alignment Bonds — outcome-gated, not transaction-gated. Politicians only get paid when the treaty produces results. This treasury is purely for citizens. -- [REGISTER FOR UBI](#connect) - [POLITICIAN FUNDING (IABS)](/iab) ### TREASURY STATUS - DEMO diff --git a/packages/web/src/app/api/agent/campaign-state/route.ts b/packages/web/src/app/api/agent/campaign-state/route.ts new file mode 100644 index 000000000..4027ffd68 --- /dev/null +++ b/packages/web/src/app/api/agent/campaign-state/route.ts @@ -0,0 +1,18 @@ +import { headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { + buildAgentCampaignState, +} from "@/lib/agent-readable/agent-api.server"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + return NextResponse.json(await buildAgentCampaignState(site), { + headers: { "Cache-Control": AGENT_CACHE_CONTROL }, + }); +} diff --git a/packages/web/src/app/api/agent/manifest/route.ts b/packages/web/src/app/api/agent/manifest/route.ts new file mode 100644 index 000000000..738eb7205 --- /dev/null +++ b/packages/web/src/app/api/agent/manifest/route.ts @@ -0,0 +1,16 @@ +import { headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { buildAgentManifest } from "@/lib/agent-readable/agent-api.server"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + return NextResponse.json(await buildAgentManifest(site), { + headers: { "Cache-Control": AGENT_CACHE_CONTROL }, + }); +} diff --git a/packages/web/src/app/api/agent/parameters/route.ts b/packages/web/src/app/api/agent/parameters/route.ts new file mode 100644 index 000000000..9cf732fb3 --- /dev/null +++ b/packages/web/src/app/api/agent/parameters/route.ts @@ -0,0 +1,16 @@ +import { headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { buildAgentParameters } from "@/lib/agent-readable/agent-api.server"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + return NextResponse.json(await buildAgentParameters(site), { + headers: { "Cache-Control": AGENT_CACHE_CONTROL }, + }); +} diff --git a/packages/web/src/app/api/agent/plaintiffs/route.ts b/packages/web/src/app/api/agent/plaintiffs/route.ts new file mode 100644 index 000000000..7040c8119 --- /dev/null +++ b/packages/web/src/app/api/agent/plaintiffs/route.ts @@ -0,0 +1,16 @@ +import { headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { buildAgentPlaintiffs } from "@/lib/agent-readable/agent-api.server"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + return NextResponse.json(await buildAgentPlaintiffs(site), { + headers: { "Cache-Control": AGENT_CACHE_CONTROL }, + }); +} diff --git a/packages/web/src/app/api/agent/signatories/route.ts b/packages/web/src/app/api/agent/signatories/route.ts new file mode 100644 index 000000000..d462ded52 --- /dev/null +++ b/packages/web/src/app/api/agent/signatories/route.ts @@ -0,0 +1,16 @@ +import { headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { buildAgentSignatories } from "@/lib/agent-readable/agent-api.server"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + return NextResponse.json(await buildAgentSignatories(site), { + headers: { "Cache-Control": AGENT_CACHE_CONTROL }, + }); +} diff --git a/packages/web/src/app/api/tasks/route.test.ts b/packages/web/src/app/api/tasks/route.test.ts index 4d9259c28..e3469ff5b 100644 --- a/packages/web/src/app/api/tasks/route.test.ts +++ b/packages/web/src/app/api/tasks/route.test.ts @@ -4,7 +4,9 @@ const mocks = vi.hoisted(() => ({ createTask: vi.fn(), getServerSession: vi.fn(), listTasks: vi.fn(), + personFindFirst: vi.fn(), requireAuth: vi.fn(), + taskFindFirst: vi.fn(), })); vi.mock("next-auth", () => ({ @@ -19,6 +21,13 @@ vi.mock("@/lib/auth-utils", () => ({ requireAuth: mocks.requireAuth, })); +vi.mock("@/lib/prisma", () => ({ + prisma: { + person: { findFirst: mocks.personFindFirst }, + task: { findFirst: mocks.taskFindFirst }, + }, +})); + vi.mock("@/lib/tasks.server", () => ({ createTask: mocks.createTask, listTasks: mocks.listTasks, @@ -31,7 +40,9 @@ describe("tasks route", () => { mocks.createTask.mockReset(); mocks.getServerSession.mockReset(); mocks.listTasks.mockReset(); + mocks.personFindFirst.mockReset(); mocks.requireAuth.mockReset(); + mocks.taskFindFirst.mockReset(); }); it("lists tasks created by the current user when requested", async () => { @@ -143,4 +154,53 @@ describe("tasks route", () => { "ownerUserId", ); }); + + it("resolves an assigned task target from a person profile URL", async () => { + mocks.requireAuth.mockResolvedValue({ userId: "user_creator" }); + mocks.personFindFirst.mockResolvedValue({ id: "person_target" }); + mocks.createTask.mockResolvedValue({ + assigneePersonId: "person_target", + createdByUserId: "user_creator", + id: "task_3", + isPublic: true, + title: "Call your senator", + }); + + const response = await POST( + new Request("http://localhost/api/tasks", { + body: JSON.stringify({ + assigneePersonIdentifier: "https://warondisease.org/people/Wishonia", + description: "Ask for a public yes on the treaty.", + isPublic: true, + title: "Call your senator", + }), + headers: { "Content-Type": "application/json" }, + method: "POST", + }), + ); + + expect(response.status).toBe(201); + expect(mocks.personFindFirst).toHaveBeenCalledWith( + expect.objectContaining({ + where: expect.objectContaining({ + OR: expect.arrayContaining([ + { handle: "Wishonia" }, + { handle: "wishonia" }, + ]), + }), + }), + ); + expect(mocks.createTask).toHaveBeenCalledWith( + "user_creator", + expect.objectContaining({ + assigneePersonId: "person_target", + description: "Ask for a public yes on the treaty.", + isPublic: true, + title: "Call your senator", + }), + ); + expect(mocks.createTask.mock.calls[0]?.[1]).not.toHaveProperty( + "assigneePersonIdentifier", + ); + }); }); diff --git a/packages/web/src/app/api/tasks/route.ts b/packages/web/src/app/api/tasks/route.ts index 8e5571836..60193539c 100644 --- a/packages/web/src/app/api/tasks/route.ts +++ b/packages/web/src/app/api/tasks/route.ts @@ -23,6 +23,7 @@ const TASK_VISIBILITY_FILTER = { const CreateTaskBodySchema = z.object({ assigneeOrganizationId: z.string().nullish(), + assigneePersonIdentifier: z.string().nullish(), assigneePersonId: z.string().nullish(), category: z.nativeEnum(TaskCategory).nullish(), claimPolicy: z.nativeEnum(TaskClaimPolicy).nullish(), @@ -43,6 +44,34 @@ const CreateTaskBodySchema = z.object({ title: z.string().min(1), }); +function normalizeAssigneePersonIdentifier(value?: string | null) { + const trimmed = value?.trim(); + if (!trimmed) return null; + + let candidate = trimmed; + try { + const url = new URL(candidate); + const segments = url.pathname.split("/").filter(Boolean); + const peopleIndex = segments.findIndex((segment) => segment === "people"); + candidate = + peopleIndex >= 0 + ? (segments[peopleIndex + 1] ?? "") + : (segments[segments.length - 1] ?? ""); + } catch { + const pathOnly = candidate.split(/[?#]/u, 1)[0] ?? ""; + const segments = pathOnly.split("/").filter(Boolean); + candidate = segments[segments.length - 1] ?? pathOnly; + } + + try { + candidate = decodeURIComponent(candidate); + } catch { + // Keep the raw candidate if the user pasted a malformed escape sequence. + } + + return candidate.replace(/^@/u, "").trim() || null; +} + export async function GET(request: Request) { try { const session = await getServerSession(authOptions); @@ -90,7 +119,39 @@ export async function POST(request: Request) { try { const { userId } = await requireAuth(); const parsed = CreateTaskBodySchema.parse(await request.json()); - const { dueAt, parentTaskId, ...rest } = parsed; + const { assigneePersonIdentifier, dueAt, parentTaskId, ...rest } = parsed; + let assigneePersonId = rest.assigneePersonId ?? null; + + if (!assigneePersonId && assigneePersonIdentifier) { + const identifier = normalizeAssigneePersonIdentifier( + assigneePersonIdentifier, + ); + if (!identifier) { + return NextResponse.json( + { error: "Person handle or URL is required." }, + { status: 400 }, + ); + } + + const person = await prisma.person.findFirst({ + where: { + deletedAt: null, + OR: [ + { id: identifier }, + { handle: identifier }, + { handle: identifier.toLowerCase() }, + ], + }, + select: { id: true }, + }); + if (!person) { + return NextResponse.json( + { error: "Person not found." }, + { status: 404 }, + ); + } + assigneePersonId = person.id; + } if (parentTaskId) { const parent = await prisma.task.findFirst({ @@ -118,6 +179,7 @@ export async function POST(request: Request) { // tree. const task = await createTask(userId, { ...rest, + assigneePersonId, dueAt: dueAt == null ? null : new Date(dueAt), claimPolicy: parentTaskId ? TaskClaimPolicy.ASSIGNED_ONLY diff --git a/packages/web/src/app/civic/votes/[identifier]/page.logged-out.md b/packages/web/src/app/civic/votes/[identifier]/page.logged-out.md index 079f1d34d..1474e24e9 100644 --- a/packages/web/src/app/civic/votes/[identifier]/page.logged-out.md +++ b/packages/web/src/app/civic/votes/[identifier]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/contribute/page.logged-out.md b/packages/web/src/app/contribute/page.logged-out.md new file mode 100644 index 000000000..75fd23dbe --- /dev/null +++ b/packages/web/src/app/contribute/page.logged-out.md @@ -0,0 +1,29 @@ +# /contribute + +## Metadata + +- Page title: Contribute | International Campaign to End War and Disease +- Meta description: Help end war and disease: vote, fund outreach, write code, or add useful data. +- Canonical: https://warondisease.org/contribute +- Open Graph title: Contribute +- Open Graph description: Help end war and disease: vote, fund outreach, write code, or add useful data. +- Open Graph image: https://warondisease.org/api/og/route?path=%2Fcontribute +- Twitter title: Contribute +- Twitter description: Help end war and disease: vote, fund outreach, write code, or add useful data. + +## Visible Page Copy + +### CONTRIBUTE +- Four useful ways to help: vote, fund, code, or feed the machine real data. +#### PLAY THE GAME +- Vote on the 1% Treaty. Share your link. Every verified voter you bring in earns you 1 VOTE Point. Free. Thirty seconds. +- [PLAY NOW](/#vote) +#### DEPOSIT +- Most investing is gambling in a suit. This one funds the campaign. Plan works? VOTE holders split the pool. Plan fails? Projected 11x return from VC-sector diversification. Projections, not guarantees. +- [INSERT COIN](/prize) +#### CODE +- Humanity built TikTok and a website where people argue about sandwiches. This is a TypeScript monorepo that might help prevent extinction. Fifteen packages. Open source. +- [GITHUB](https://github.com/mikepsinn/optimitron) +#### DATA +- You are a meat robot with 37 trillion cells breaking in 7,000 different ways. Track what you put in it. The dFDA can learn what is actually working. +- [TRANSMIT DATA](/transmit) diff --git a/packages/web/src/app/court.md/route.ts b/packages/web/src/app/court.md/route.ts new file mode 100644 index 000000000..49541b49a --- /dev/null +++ b/packages/web/src/app/court.md/route.ts @@ -0,0 +1,27 @@ +import { headers } from "next/headers"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { buildMarkdownMirror } from "@/lib/agent-readable/markdown-mirrors"; +import { COURT_OF_HUMANITY_SLUG } from "@/lib/court-of-humanity"; +import { getReferendumPageContent } from "@/lib/referendum-content.server"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; +export const runtime = "nodejs"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + const content = await getReferendumPageContent(COURT_OF_HUMANITY_SLUG); + + return new Response( + buildMarkdownMirror("court", site, { + courtMarkdown: content?.bodyMarkdown, + }), + { + headers: { + "Cache-Control": AGENT_CACHE_CONTROL, + "Content-Type": "text/markdown; charset=utf-8", + }, + }, + ); +} diff --git a/packages/web/src/app/court/page.logged-out.md b/packages/web/src/app/court/page.logged-out.md index 46644ea3d..ee555f16f 100644 --- a/packages/web/src/app/court/page.logged-out.md +++ b/packages/web/src/app/court/page.logged-out.md @@ -41,6 +41,6 @@ - Article V: The [1% Treaty](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) is hereby established as the standing settlement offer. Governments may accept the Treaty's terms — redirecting 1% of annual military spending to pragmatic clinical trials, with bondholder and political-incentive structures attached — in exchange for prospective liability caps on Court of Humanity claims arising from acts predating Treaty ratification. Signing gives them a settlement price. Refusing keeps the claims, judgments, and bondholder lawyers pointed at them. - Article VI: Membership in the Court of Humanity is irrevocable for the lifetime of the member, but no member may bind their heirs or descendants. Each subsequent generation joins by their own consent. The Court has no head of state, no annual budget, no dues, and no way to be voted out by anyone other than its own members. In this respect it resembles every other institution your species has ever built that actually works. - IN WITNESS WHEREOF, the undersigned humans, being of sound mind (debatable) and tired of watching their governments kill their families with no consequences, hereby join the Court of Humanity. -- Joined this day, May 15, 2026, in the year of our ongoing confusion. +- Joined this day, May 17, 2026, in the year of our ongoing confusion. - SIGN - Display my name publicly on the signer list and leaderboards (recommended). diff --git a/packages/web/src/app/court/page.tsx b/packages/web/src/app/court/page.tsx index 442c11ef2..a92bd9b77 100644 --- a/packages/web/src/app/court/page.tsx +++ b/packages/web/src/app/court/page.tsx @@ -1,7 +1,9 @@ import type { Metadata } from "next"; import { headers } from "next/headers"; import { ReferendumStepperPage } from "@/components/referendum/ReferendumStepperPage"; +import { JsonLdScript } from "@/components/site/JsonLdScript"; import { TreatyNameSignatureBox } from "@/components/treaty/TreatyNameSignatureBox"; +import { buildCourtStructuredData } from "@/lib/campaign-structured-data"; import { COURT_OF_HUMANITY_SLUG } from "@/lib/court-of-humanity"; import { getRouteMetadata } from "@/lib/metadata"; import { getReferendumPageContent } from "@/lib/referendum-content.server"; @@ -31,6 +33,7 @@ export default async function CourtPage({ searchParams }: CourtPageProps) { return (
+ - +

diff --git a/packages/web/src/app/endorse/page.logged-out.md b/packages/web/src/app/endorse/page.logged-out.md index 09d0f97c1..40ca7b627 100644 --- a/packages/web/src/app/endorse/page.logged-out.md +++ b/packages/web/src/app/endorse/page.logged-out.md @@ -45,7 +45,6 @@ #### GRANT REQUEST DRAFT - COPY REQUEST DRAFT - LEGAL NOTES FOR ORGANIZATIONS -- Joining publicly supports a humanitarian treaty. It is not a donation, candidate endorsement, party activity, ballot measure position, or support for a pending bill. #### SUMMARY - Joining means your organization publicly supports the 1% Treaty: every nation should simultaneously redirect 1% of military spending to high-efficiency pragmatic clinical trials. - It is not a donation, candidate endorsement, party activity, ballot measure position, or support for a pending bill. @@ -59,7 +58,7 @@ - No ongoing obligations. No financial contributions. No signatures on unrelated documents. #### READ BEFORE JOINING - The 1% Treaty asks every nation to redirect 1% of military spending to high-efficiency pragmatic clinical trials. Read it before adding your organization. -- READ THE 1% TREATY TEXT +- READ THE TREATY - Please end war and disease by quickly skimming and signing the 1% Treaty. - WHEREAS, humanity pays governments approximately [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) per year for the service of promoting the general welfare, defined as the median health and wealth of the citizenry; - WHEREAS, the citizenry would like to actually receive this service at some point; @@ -97,5 +96,5 @@ - Article VIII: This treaty supersedes all conflicting domestic law. Including the subsection your legislature added at 2 a.m. last session specifically to make sure this couldn't happen. - Article IX: This Treaty enters into force upon signature by two states. War has killed humans for as long as there have been humans to kill. Disease has been killing them longer. Its founding signatories will be responsible for the largest reduction in human suffering and the largest increase in human prosperity in the history of planet Earth. - IN WITNESS WHEREOF, the undersigned, being of sound mind (debatable) and tired of watching their loved ones die of preventable diseases, have executed this Treaty. -- [JOIN AS AN ORGANIZATION](#organization-endorsement-form) +- [BACK TO ORGANIZATION FORM](#organization-endorsement-form) - Already joined? See the [organizational supporters](/signatories). diff --git a/packages/web/src/app/endorse/page.tsx b/packages/web/src/app/endorse/page.tsx index 8384f54fd..f157d7d0a 100644 --- a/packages/web/src/app/endorse/page.tsx +++ b/packages/web/src/app/endorse/page.tsx @@ -37,7 +37,7 @@ function TreatyTextDisclosure({ id="organization-treaty-text" >

- Read the 1% Treaty text + Read the treaty
- Join as an Organization + Back to organization form
@@ -73,11 +73,6 @@ function LegalNotesDisclosure({ Legal notes for organizations
-

- Joining publicly supports a humanitarian treaty. It is not a donation, - candidate endorsement, party activity, ballot measure position, or - support for a pending bill. -

{sections.map((section) => (
+ +

+ Campaign FAQ +

+
+ {CAMPAIGN_FAQ_ITEMS.map((item) => ( +
+

+ {item.question} +

+

+ {item.answer} +

+
+ ))} +
+ + ); +} diff --git a/packages/web/src/app/fund/page.logged-out.md b/packages/web/src/app/fund/page.logged-out.md index e69de29bb..94b157895 100644 --- a/packages/web/src/app/fund/page.logged-out.md +++ b/packages/web/src/app/fund/page.logged-out.md @@ -0,0 +1,44 @@ +# /fund + +## Metadata + +- Page title: Fund Optimization | International Campaign to End War and Disease +- Meta description: Insert coin. AI agents optimize Earth. See what your dollar did and where the money went. +- Canonical: https://warondisease.org/fund +- Open Graph title: Fund Optimization +- Open Graph description: Insert coin. AI agents optimize Earth. See what your dollar did and where the money went. +- Open Graph image: https://warondisease.org/api/og/route?path=%2Ffund +- Twitter title: Fund Optimization +- Twitter description: Insert coin. AI agents optimize Earth. See what your dollar did and where the money went. + +## Visible Page Copy + +### FUND OPTIMIZATION +- Put money where it moves votes, organizations, leaders, or measurable treaty demand. +- CURRENT STATE +### MONEY IN, ACCOUNTABLE WORK OUT +- The live funding rail is the Earth Optimization Prize. Use the public queue and scoreboards to check what each dollar should unlock before you send it. +- [FUND THE PRIZE](/prize) +- [INSPECT BOTTLENECKS](/tasks) +- [WATCH THE PITCH](/video) +- GROUNDING +- Scoreboards define the end metrics. +- Tasks show current bottlenecks. +- Leader pages show who is overdue. +- The manual specifies the expected-value math and prize mechanics. +- [READ THE FUNDING SPEC](https://manual.warondisease.org/knowledge/strategy/earth-optimization-prize.html) +#### FUND THE PRIZE POOL +- Deposit into the Earth Optimization Prize. Bring in verified voters. Make treaty demand expensive to ignore. +- [OPEN](/prize) +#### FUND THE BOTTLENECK +- Open the task queue. Pay for the blocker that actually moves votes, organizations, or leaders. +- [OPEN](/tasks) +#### CHECK THE PROOF +- If the ask cannot point to a scoreboard, overdue task, or leader page, keep your money. +- [OPEN](/scoreboard) +#### WHAT TO DEMAND +- Demand a task, ceiling price, proof surface, expected value, and done condition. +- [SEE LIVE TASKS](/tasks) +#### WHAT TO REJECT +- Reject generic fundraising fluff, unsourced strategy decks, and work that cannot name the bottleneck it clears. +- [CHECK OUTCOME METRICS](/scoreboard) diff --git a/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md b/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md index 98e87c818..bcc405cce 100644 --- a/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md +++ b/packages/web/src/app/governments/[code]/agencies/[agencyId]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/governments/[code]/agencies/page.logged-out.md b/packages/web/src/app/governments/[code]/agencies/page.logged-out.md index a3223ba6c..9887df34d 100644 --- a/packages/web/src/app/governments/[code]/agencies/page.logged-out.md +++ b/packages/web/src/app/governments/[code]/agencies/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/governments/[code]/page.logged-out.md b/packages/web/src/app/governments/[code]/page.logged-out.md new file mode 100644 index 000000000..f0cff2159 --- /dev/null +++ b/packages/web/src/app/governments/[code]/page.logged-out.md @@ -0,0 +1,23 @@ +# /governments/[code] + +## Metadata + +- Page title: Country Not Found | International Campaign to End War and Disease +- Meta description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. +- Canonical: [missing] +- Open Graph title: International Campaign to End War and Disease +- Open Graph description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. +- Open Graph image: http://localhost:3001/governments/%255Bcode%255D/opengraph-image?d403ec463934db5d +- Twitter title: International Campaign to End War and Disease +- Twitter description: Let's trade one apocalypse out of humanity's 122-apocalypse mass-murder capacity for disease eradication in 36 years instead of 443. + +## Visible Page Copy + +## 404 +- PAGE NOT FOUND +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md b/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md index f29e8f2bd..619d6f2c7 100644 --- a/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md +++ b/packages/web/src/app/governments/[code]/politicians/[bioguideId]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/governments/[code]/politicians/page.logged-out.md b/packages/web/src/app/governments/[code]/politicians/page.logged-out.md index 7ee78b279..e5a688ad4 100644 --- a/packages/web/src/app/governments/[code]/politicians/page.logged-out.md +++ b/packages/web/src/app/governments/[code]/politicians/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/humanity-v-government.md/route.ts b/packages/web/src/app/humanity-v-government.md/route.ts new file mode 100644 index 000000000..bb725d9c4 --- /dev/null +++ b/packages/web/src/app/humanity-v-government.md/route.ts @@ -0,0 +1,18 @@ +import { headers } from "next/headers"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { buildMarkdownMirror } from "@/lib/agent-readable/markdown-mirrors"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + + return new Response(buildMarkdownMirror("humanity-v-government", site), { + headers: { + "Cache-Control": AGENT_CACHE_CONTROL, + "Content-Type": "text/markdown; charset=utf-8", + }, + }); +} diff --git a/packages/web/src/app/humanity-v-government/DamagesSensitivityCalculator.tsx b/packages/web/src/app/humanity-v-government/DamagesSensitivityCalculator.tsx index 8e873e987..5299b9d48 100644 --- a/packages/web/src/app/humanity-v-government/DamagesSensitivityCalculator.tsx +++ b/packages/web/src/app/humanity-v-government/DamagesSensitivityCalculator.tsx @@ -182,7 +182,7 @@ export function DamagesSensitivityCalculator() {

- The 1% Treaty is the cheap settlement offer. This vote records the - bigger claim: governments owe the full damages demand, currently{" "} - {fullDamagesLabel}{" "} - per living human. -

-

- Voting no requires saying out loud: “I believe my government - should be allowed to kill my family with no consequences.” Few - ordinary humans want to say that sentence in public. + Record the finding after reading the case. If governments are liable, + the demand is{" "} + {fullDamagesLabel}.

diff --git a/packages/web/src/app/humanity-v-government/page.logged-out.md b/packages/web/src/app/humanity-v-government/page.logged-out.md index 9f7516016..b9aef0013 100644 --- a/packages/web/src/app/humanity-v-government/page.logged-out.md +++ b/packages/web/src/app/humanity-v-government/page.logged-out.md @@ -16,62 +16,40 @@ - COURT OF HUMANITY - DAMAGES CASE ## HUMANITY V. GOVERNMENTS OF EARTH - THE INDICTMENT -- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. -- The citizenry would like to actually receive this service at some point. +- Governments are paid [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare, defined here as maximizing median healthy life expectancy and median after-tax inflation-adjusted income. - Instead, these public servants used [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) of their salary to murder approximately [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) humans over the last century of their employment. -- The dead included roughly 930,000 doctors, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and [102 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) children who will never grow up to replace them. +- These murdered humans included roughly 930,000 doctors, 310,000 scientists, 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and [102 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) children who will never grow up to replace them. - Murdering your employers is the opposite of promoting their welfare, and would be grounds for termination in any other employment contract humans have ever signed. - Had governments not spent [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) murdering those people and destroying everything they spent their entire lives building, the average human alive today would earn [$333,636](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) a year instead of [$14,375](https://manual.WarOnDisease.org/knowledge/appendix/political-dysfunction-tax.html). Dead scientists do not discover things and exploded cities are very expensive to fix. [Read the evidence](https://manual.warondisease.org/knowledge/appendix/humanity-v-government.html). -- [VOTE ON THE FINDING](#verdict) -- VOTE ON THE FINDING -### SHOULD GOVERNMENTS OWE YOU FULL DAMAGES? -- Should the governments of Earth be found liable for preventable mass death and owe full damages of $2.74 million to each living human? -- The 1% Treaty is the cheap settlement offer. This vote records the bigger claim: governments owe the full damages demand, currently $2.74 million per living human. -- Voting no requires saying out loud: “I believe my government should be allowed to kill my family with no consequences.” Few ordinary humans want to say that sentence in public. -- FIND FOR HUMANITY -- FIND FOR GOVERNMENTS -- NOT SURE -### IF THIS WERE A CORPORATION +### IF GOVERNMENTS WERE A CORPORATION - If a corporation were paid [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare and misused the funds to this degree, it would be prosecuted, fined, monitored, and its officers imprisoned. -- Pfizer paid $2.3 billion for health-care fraud. BP paid $20.8 billion for the Deepwater Horizon spill. Volkswagen paid $4.3 billion for cheating emissions tests and accepted a government monitor. -- The defendants here have a larger revenue, a larger customer base, and a larger body count. +- The corporate analogy is conservative: ordinary corporations do not have the legal power to compel payment from every human under their jurisdiction. ### THE CASE CAPTION - [plaintiff-count] ### WHY THIS IS A CASE - DUTY -- Governments accept compulsory payment to protect the public and promote the general welfare. That is the job description. +- The duty purchased by that $36.5 trillion annual payment is measurable: maximize median healthy life expectancy and median after-tax inflation-adjusted income. - BREACH -- They spend [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) times more on military capacity than on government clinical trials. Disease is what actually kills their citizens. +- Governments spend [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) times more on weapons than on testing which medicines work. The 1% Treaty asks them to redirect [1%](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) of military spending to pragmatic clinical trials. - CAUSATION -- Some deaths were direct. Others happened because treatments were delayed, trials were not funded, and the cure money became hardware for organized killing. +- At the current discovery rate, finding first treatments for the remaining untreated diseases takes [443 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). The treaty model compresses that queue to [36 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). - DAMAGES -- The full claim is per living human, because every surviving employer inherited the bill for the policy that killed the others. +- The full claim is per living human because the survivors inherited the missing scientists, doctors, children, treatments, income, and public money destroyed by the policy. ### THE THREE COUNTS - COUNT 1 — DEATH BY WAR [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) deaths The defendants, between 1900 and the present, did willfully and with premeditation engage in the organized killing of [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) of their own employers. -- COUNT 2 — DEATH BY REGULATORY DELAY [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) deaths The defendants required an additional [8.2 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) of efficacy testing before letting humans access drugs already proven safe. 53 years of warnings. [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) dead. “We did not know” is no longer available as a defense. +- COUNT 2 — DEATH BY REGULATORY DELAY [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) deaths The defendants required an additional [8.2 years](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) of efficacy testing before letting humans access drugs already proven safe. The damages model multiplies that post-safety lag by [12.4 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) lives saved per year by existing drugs, yielding [102 million](https://manual.WarOnDisease.org/knowledge/appendix/invisible-graveyard.html) deaths. - COUNT 3 — DEATH BY MISALLOCATION [37,778](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) trial-years Damages here are the counterfactual: what humanity would have had if governments had frozen real military spending at 1900 levels and redirected the rest to keeping their citizens alive. The war budget since 1913 alone could have funded [37,778](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) years of government clinical trials. ### THE DAMAGES DEMAND - FULL DAMAGES CLAIM -- [$2.74M](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) -- Per living human. The False Claims Act triples damages when a defendant defrauds the government. Here, the defendants ARE the government, defrauding the citizenry. Triple damages apply. -### THE USUAL DEFENSES -- "THESE ARE POLICY DISAGREEMENTS." -- Negligent homicide requires duty, breach, causation, damages, and foreseeable risk. The defendants meet all five. -- "YOU CANNOT SUE A GOVERNMENT." -- That is because governments wrote rules saying governments are hard to sue. This is not a moral defense. It is a confession with letterhead. -- "THE DEATHS ARE COUNTERFACTUAL." -- Governments use counterfactual lives saved to justify budgets every day. The same math counts bodies when the budget kills people quietly instead. -- PLAINTIFFS -### NAME THE HUMANS THE CASE SHOULD COUNT. -- The case already has [plaintiff-count] named plaintiffs. If someone in your family died of war, regulatory delay, or preventable disease, add them. A civilization should at least be able to count its dead. -- [ADD A PLAINTIFF](/plaintiffs) +- [$2.74 million/person](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) +- The False Claims Act triples damages when a defendant defrauds the government. Here, the defendants ARE the government, defrauding the citizenry. Triple damages apply. - DAMAGES CALCULATOR - RESET ### USE YOUR OWN NUMBERS. - Set what you think a human life is worth in court dollars. Lower the death counts if you want. The amount owed to each living human updates below. - COURT VALUE OF ONE HUMAN LIFE - $10.00M -- Default $10M (EPA / FDA standard). DOT uses $13.7M. Use less if you think the dead should be cheaper. +- Default $10M (EPA / FDA standard). DOT uses $13.7M. Use less if you think these murdered humans should be cheaper. - WAR DEATHS SINCE 1900 - 310M - Default 310M (Rummel democide 264M + battle 39M + collateral civilian 30M minus overlap). White's low estimate is 200M; Rummel-high-plus-military is 340M. @@ -83,3 +61,21 @@ - $2.74M - Total: $21.92Q - The demand counts war deaths, regulatory-delay deaths, property/environmental destruction, excess military spending, the Pentagon failed-audit penalty, and drugs never developed because the trial money went to weapons. The False Claims Act analogy triples the body-count claim. +### THE USUAL DEFENSES +- "THESE ARE POLICY DISAGREEMENTS." +- Negligent homicide requires duty, breach, causation, damages, and foreseeable risk. The defendants meet all five. +- "YOU CANNOT SUE A GOVERNMENT." +- That is because governments wrote rules saying governments are hard to sue. This is not a moral defense. It is a confession with letterhead. +- "THE DEATHS ARE COUNTERFACTUAL." +- Governments use counterfactual lives saved to justify budgets every day. The same math counts bodies when the budget kills people quietly instead. +- VOTE ON THE FINDING +### SHOULD GOVERNMENTS OWE YOU FULL DAMAGES? +- Should the governments of Earth be found liable for preventable mass death and owe full damages of [$2.74 million/person](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html)? +- Record the finding after reading the case. If governments are liable, the demand is [$2.74 million/person](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). +- FIND FOR HUMANITY +- FIND FOR GOVERNMENTS +- NOT SURE +- PLAINTIFFS +### NAME THE HUMANS THE CASE SHOULD COUNT. +- The case already has [plaintiff-count] named plaintiffs. If someone in your family died of war, regulatory delay, or preventable disease, add them. A civilization should at least be able to count these murdered humans. +- [ADD A PLAINTIFF](/plaintiffs) diff --git a/packages/web/src/app/humanity-v-government/page.tsx b/packages/web/src/app/humanity-v-government/page.tsx index 3f12f065a..bc1978aea 100644 --- a/packages/web/src/app/humanity-v-government/page.tsx +++ b/packages/web/src/app/humanity-v-government/page.tsx @@ -1,27 +1,31 @@ import Link from "next/link"; import { getServerSession } from "next-auth"; -import { - HUMANITY_V_GOVERNMENT_FULL_DAMAGES_PER_CAPITA_LABEL, - HUMANITY_V_GOVERNMENT_VERDICT_QUESTION, -} from "@optimitron/data/referendums"; +import { headers } from "next/headers"; import { CORPORATE_DAMAGES_TREBLE_EXPOSURE_PER_CAPITA, CUMULATIVE_MILITARY_IN_GOVT_TRIAL_YEARS, CUMULATIVE_MILITARY_SPENDING_FED_ERA, + DFDA_QUEUE_CLEARANCE_YEARS, EFFICACY_LAG_YEARS, EXISTING_DRUGS_EFFICACY_LAG_DEATHS_TOTAL, GLOBAL_AVG_INCOME_2025, GLOBAL_GOVERNMENT_EXPENSE_ANNUAL, MILITARY_TO_GOVERNMENT_CLINICAL_TRIALS_SPENDING_RATIO, - PENTAGON_UNACCOUNTED_FUNDS, + PHARMA_LIVES_SAVED_ANNUAL, + STATUS_QUO_QUEUE_CLEARANCE_YEARS, + TREATY_REDUCTION_PCT, WAR_CHILDREN_KILLED_SINCE_1900, WAR_COUNTERFACTUAL_GDP_PER_CAPITA, WAR_DEATHS_SINCE_1900, } from "@optimitron/data/parameters"; import { ParameterValue } from "@/components/shared/ParameterValue"; -import { WelfareClaim } from "@/components/shared/WelfareClaim"; +import { WELFARE_CLAIM_AMOUNT_TEXT } from "@/components/shared/WelfareClaim.core"; +import { JsonLdScript } from "@/components/site/JsonLdScript"; import { defaultButtonClassName } from "@/components/ui/default-button"; import { authOptions } from "@/lib/auth"; +import { + buildHumanityVGovernmentStructuredData, +} from "@/lib/campaign-structured-data"; import { formatCount } from "@/lib/format-count"; import { getHumanityVGovernmentPlaintiffCount, @@ -31,6 +35,7 @@ import { HUMANITY_V_GOVERNMENT_MANUAL_URL, ROUTES, } from "@/lib/routes"; +import { getSiteFromHeaders } from "@/lib/site"; import { DamagesSensitivityCalculator } from "./DamagesSensitivityCalculator"; import { HumanityVGovernmentVerdictVote } from "./HumanityVGovernmentVerdictVote"; import { HUMANITY_V_GOVERNMENT_METADATA } from "./page-metadata"; @@ -47,6 +52,8 @@ const CASE_CAPTION = { } as const; export default async function HumanityVGovernmentPage() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); const session = await getServerSession(authOptions); const [plaintiffCount, verdictStats] = await Promise.all([ getHumanityVGovernmentPlaintiffCount(), @@ -55,6 +62,7 @@ export default async function HumanityVGovernmentPage() { return (
+

Court of Humanity - Damages case

@@ -66,10 +74,16 @@ export default async function HumanityVGovernmentPage() {

The indictment

- -

- The citizenry would like to actually receive this service at some - point. +

+ Governments are paid{" "} + {" "} + a year to promote the general welfare, defined here as maximizing + median healthy life expectancy and median after-tax + inflation-adjusted income.

Instead, these public servants used{" "} @@ -87,8 +101,9 @@ export default async function HumanityVGovernmentPage() { humans over the last century of their employment.

- The dead included roughly 930,000 doctors, 310,000 scientists, - 620,000 engineers, 1.24 million nurses, 3.1 million teachers, and{" "} + These murdered humans included roughly 930,000 doctors, 310,000 + scientists, 620,000 engineers, 1.24 million nurses, 3.1 million + teachers, and{" "} .

-
-
- -
-

- If this were a corporation + If governments were a corporation

@@ -169,14 +167,9 @@ export default async function HumanityVGovernmentPage() { officers imprisoned.

- Pfizer paid $2.3 billion for health-care fraud. BP paid $20.8 - billion for the Deepwater Horizon spill. Volkswagen paid $4.3 - billion for cheating emissions tests and accepted a government - monitor. -

-

- The defendants here have a larger revenue, a larger customer - base, and a larger body count. + The corporate analogy is conservative: ordinary corporations do not + have the legal power to compel payment from every human under their + jurisdiction.

@@ -210,9 +203,8 @@ export default async function HumanityVGovernmentPage() {
Remedy
- The 1% Treaty is the settlement: redirect 1% of military spending - to clinical trials. Not because governments became wise. Because - one percent is cheaper than the damages. + Record the finding, count the plaintiffs, and make the damages + demand public enough that governments have to answer it.
@@ -228,8 +220,9 @@ export default async function HumanityVGovernmentPage() { Duty

- Governments accept compulsory payment to protect the public and - promote the general welfare. That is the job description. + The duty purchased by that {WELFARE_CLAIM_AMOUNT_TEXT} annual + payment is measurable: maximize median healthy life expectancy + and median after-tax inflation-adjusted income.

@@ -237,14 +230,20 @@ export default async function HumanityVGovernmentPage() { Breach

- They spend{" "} + Governments spend{" "} {" "} - times more on military capacity than on government clinical - trials. Disease is what actually kills their citizens. + times more on weapons than on testing which medicines work. The + 1% Treaty asks them to redirect{" "} + {" "} + of military spending to pragmatic clinical trials.

@@ -252,9 +251,20 @@ export default async function HumanityVGovernmentPage() { Causation

- Some deaths were direct. Others happened because treatments were - delayed, trials were not funded, and the cure money became - hardware for organized killing. + At the current discovery rate, finding first treatments for the + remaining untreated diseases takes{" "} + + . The treaty model compresses that queue to{" "} + + .

@@ -262,9 +272,9 @@ export default async function HumanityVGovernmentPage() { Damages

- The full claim is per living human, because every surviving - employer inherited the bill for the policy that killed the - others. + The full claim is per living human because the survivors inherited + the missing scientists, doctors, children, treatments, income, and + public money destroyed by the policy.

@@ -316,14 +326,20 @@ export default async function HumanityVGovernmentPage() { valueOverride="8.2 years" />{" "} of efficacy testing before letting humans access drugs already - proven safe. 53 years of warnings.{" "} + proven safe. The damages model multiplies that post-safety lag + by{" "} + {" "} + lives saved per year by existing drugs, yielding{" "} {" "} - dead. “We did not know” is no longer available as a - defense. + deaths.

  • @@ -365,17 +381,20 @@ export default async function HumanityVGovernmentPage() {

    - Per living human. The False Claims Act triples damages when a - defendant defrauds the government. Here, the defendants ARE the - government, defrauding the citizenry. Triple damages apply. + The False Claims Act triples damages when a defendant defrauds the + government. Here, the defendants ARE the government, defrauding the + citizenry. Triple damages apply.

  • +
    + +
    +

    The usual defenses @@ -413,6 +432,29 @@ export default async function HumanityVGovernmentPage() {

    +
    + + } + question={ + <> + Should the governments of Earth be found liable for preventable + mass death and owe full damages of{" "} + ? + + } + referendumSlug={verdictStats.referendumSlug} + /> +
    +

    Plaintiffs @@ -427,7 +469,7 @@ export default async function HumanityVGovernmentPage() { {" "} named plaintiffs. If someone in your family died of war, regulatory delay, or preventable disease, add them. A civilization should at - least be able to count its dead. + least be able to count these murdered humans.

    - -
    - -
    ); } diff --git a/packages/web/src/app/iab/page.logged-out.md b/packages/web/src/app/iab/page.logged-out.md index 0926bbd18..dcadd2311 100644 --- a/packages/web/src/app/iab/page.logged-out.md +++ b/packages/web/src/app/iab/page.logged-out.md @@ -17,14 +17,13 @@ ## INCENTIVE ALIGNMENT BONDS - After the [Earth Optimization Prize referendum](/prize) proves demand, IABs raise ~$1B to lobby for the 1% Treaty. Your money funds the campaign. Treaty succeeds? 272% projected annual returns as $2.72 billion/year in treaty revenue flows to bondholders. Treaty fails? The money was spent trying. That's how investments work. - IABs are Phase 2. Phase 1 is proving demand via the referendum. If you haven't deposited in the Prize yet, start there — it funds the awareness campaign that makes IABs possible. -- [LEARN ABOUT IABS](#how-it-works) - [READ THE PAPER](https://iab.warondisease.org) - [PHASE 1: PRIZE](/prize) ### WHERE TREATY REVENUE GOES - The 1% Treaty redirects $27.2 billion/year from military spending to pragmatic clinical trials. That revenue is split by smart contract. No committees. No discretion. Just arithmetic. - 80% #### PRAGMATIC CLINICAL TRIALS -- Subsidizes patient participation in large-scale pragmatic trials. Real patients, real conditions, real data — not the $41,000/patient/patient Phase III process that takes 8.20 years after safety is already proven. This is the part that actually cures the diseases. +- Subsidizes patient participation in large-scale pragmatic trials. Real patients, real conditions, real data — not the $41,000/patient Phase III process that takes 8.20 years after safety is already proven. This is the part that actually cures the diseases. - ~$21.8 BILLION/YEAR - 10% #### PROJECTED BONDHOLDER RETURNS @@ -46,7 +45,7 @@ - $100,000 - Your $1,000 went to lobbyists, Super PACs, and the awareness campaign. The money was spent trying to pass the treaty. - This is a real investment with real risk — not a savings account. -- 272% +- [272%](https://manual.WarOnDisease.org/knowledge/strategy/earth-optimization-protocol-v1.html) - 10% of treaty revenue flows to bondholders proportionally. Plus your personal lifetime income increases by $3.5M–$47.2M — just for being alive when the treaty passes. - That's everyone. Not just bondholders. Everyone. - BREAK-EVEN PROBABILITY diff --git a/packages/web/src/app/iab/page.tsx b/packages/web/src/app/iab/page.tsx index 1fa8c6796..5ec8ab3a2 100644 --- a/packages/web/src/app/iab/page.tsx +++ b/packages/web/src/app/iab/page.tsx @@ -61,7 +61,6 @@ export default function IABPage() {

    - Learn About IABs Read the Paper Phase 1: Prize
    @@ -89,7 +88,7 @@ export default function IABPage() {

    Subsidizes patient participation in large-scale pragmatic trials. - Real patients, real conditions, real data — not the {fmtParam(TRADITIONAL_PHASE3_COST_PER_PATIENT)}/patient + Real patients, real conditions, real data — not the {fmtParam(TRADITIONAL_PHASE3_COST_PER_PATIENT)}{" "} Phase III process that takes {fmtParam(EFFICACY_LAG_YEARS)} after safety is already proven. This is the part that actually cures the diseases.

    diff --git a/packages/web/src/app/legislation/[slug]/page.logged-out.md b/packages/web/src/app/legislation/[slug]/page.logged-out.md index 63ed4afe2..16103ace3 100644 --- a/packages/web/src/app/legislation/[slug]/page.logged-out.md +++ b/packages/web/src/app/legislation/[slug]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/llms-full.txt/route.ts b/packages/web/src/app/llms-full.txt/route.ts new file mode 100644 index 000000000..8ca763b84 --- /dev/null +++ b/packages/web/src/app/llms-full.txt/route.ts @@ -0,0 +1,18 @@ +import { headers } from "next/headers"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { buildLlmsFullTxt } from "@/lib/agent-readable/llms-text"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + + return new Response(buildLlmsFullTxt(site), { + headers: { + "Cache-Control": AGENT_CACHE_CONTROL, + "Content-Type": "text/plain; charset=utf-8", + }, + }); +} diff --git a/packages/web/src/app/llms.txt/route.ts b/packages/web/src/app/llms.txt/route.ts new file mode 100644 index 000000000..97fd2e7d0 --- /dev/null +++ b/packages/web/src/app/llms.txt/route.ts @@ -0,0 +1,18 @@ +import { headers } from "next/headers"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { buildLlmsTxt } from "@/lib/agent-readable/llms-text"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + + return new Response(buildLlmsTxt(site), { + headers: { + "Cache-Control": AGENT_CACHE_CONTROL, + "Content-Type": "text/plain; charset=utf-8", + }, + }); +} diff --git a/packages/web/src/app/moronia/page.logged-out.md b/packages/web/src/app/moronia/page.logged-out.md index 3df73e8ff..46115fbd8 100644 --- a/packages/web/src/app/moronia/page.logged-out.md +++ b/packages/web/src/app/moronia/page.logged-out.md @@ -18,7 +18,7 @@ - A planet in the Crab Nebula. 47 years ahead of yours on an identical trajectory. It no longer transmits. - Your planet shows a 94.7% correlation with theirs. The remaining 5.3% is the only reason I am sending this. ### THE RATIO THAT KILLED THEM THE RATIO THAT KILLED THEM THE RATIO THAT KILLED THEM -- 604 +- [604](https://manual.WarOnDisease.org/knowledge/solution/1-percent-treaty.html) - For every paper spent on curing disease, 604 papers went to weapons. The AI they built read budgets, not speeches. It learned that killing was funded 604x more than healing. It optimised accordingly. ### WHAT THEY GOT INSTEAD - The same technology. The same atoms. Different budget allocation. diff --git a/packages/web/src/app/not-found.tsx b/packages/web/src/app/not-found.tsx index 875c28a07..ee9276588 100644 --- a/packages/web/src/app/not-found.tsx +++ b/packages/web/src/app/not-found.tsx @@ -1,4 +1,12 @@ import Link from "next/link"; +import { ROUTES } from "@/lib/routes"; + +const recoveryLinks = [ + { href: ROUTES.search, label: "Search" }, + { href: ROUTES.vote, label: "Vote" }, + { href: ROUTES.donate, label: "Donate" }, + { href: ROUTES.endorse, label: "Organizations" }, +] as const; export default function NotFound() { return ( @@ -16,69 +24,33 @@ export default function NotFound() { Page Not Found

    - Fascinating. You've managed to navigate to a page that - doesn't exist. On my planet, our routing infrastructure - hasn't lost a page in 4,237 years. You lot can't even - keep track of a URL. -

    - - - -
    -
    -

    - Wishonia Diagnostic Report + Fascinating. You found a page that does not exist. On my planet, + this takes effort.

    -
      -
    • - Problem: Page not found -
    • -
    • - Severity: Mildly - embarrassing -
    • -
    • - Root cause: Human error - (probability: 97.3%) -
    • -
    • - Recommended action: Click a - button that actually goes somewhere -
    • -
    • - Time to resolve on my planet:{" "} - 0.003 seconds -
    • -
    • - Estimated time on yours:{" "} - Unclear. You still haven't fixed healthcare. -
    • -
    -
    - - Return to Earth - - - View Scoreboard - -
    +

    - “It's almost impressive how a species that put people on - the moon regularly types URLs wrong.” -
    - - — Wishonia, mildly disappointed (as usual) - + Click something real. The machines are willing to forgive you.

    diff --git a/packages/web/src/app/organizations/[id]/page.logged-out.md b/packages/web/src/app/organizations/[id]/page.logged-out.md index e0000eae5..3f8c14d00 100644 --- a/packages/web/src/app/organizations/[id]/page.logged-out.md +++ b/packages/web/src/app/organizations/[id]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/organizations/[id]/page.tsx b/packages/web/src/app/organizations/[id]/page.tsx index 28ef4979a..430109995 100644 --- a/packages/web/src/app/organizations/[id]/page.tsx +++ b/packages/web/src/app/organizations/[id]/page.tsx @@ -1,5 +1,11 @@ import { notFound } from "next/navigation"; -import Link from "next/link"; +import { + DFDA_QUEUE_CLEARANCE_YEARS, + DFDA_TRIAL_CAPACITY_MULTIPLIER, + STATUS_QUO_QUEUE_CLEARANCE_YEARS, + TREATY_REDUCTION_PCT, + fmtParamValueOnly, +} from "@optimitron/data/parameters"; import { OrganizationCopyField } from "@/components/organizations/OrganizationCopyField"; import { OrganizationGrantCalculator } from "@/components/organizations/OrganizationGrantCalculator"; import { OrganizationProfileEditor } from "@/components/organizations/OrganizationProfileEditor"; @@ -9,12 +15,17 @@ import { GLOBAL_SURVEY_NAME } from "@/lib/messaging"; import { canManageOrganization } from "@/lib/organization.server"; import { prisma } from "@/lib/prisma"; import { + PRAGMATIC_CLINICAL_TRIALS_MANUAL_URL, getOrganizationSurveyPath, - NONPROFIT_COALITION_STRATEGY_URL, - ROUTES, } from "@/lib/routes"; import { getHandleOrReferralCode } from "@/lib/referral.client"; import { buildOrganizationSurveyUrl } from "@/lib/site"; +import { + FLOW_GLOBAL_WARHEAD_COUNT, + FLOW_NUCLEAR_WINTER_OVERKILL_FACTOR, + FLOW_NUCLEAR_WINTER_WARHEAD_THRESHOLD, + formatFlowWords, +} from "@/lib/treaty-share-flow-parameters"; import { getUserDisplayName, userDisplaySelect } from "@/lib/user-display"; export const dynamic = "force-dynamic"; @@ -39,13 +50,6 @@ export default async function OrganizationPage({ }, orderBy: { joinedAt: "asc" }, }, - referendumPositions: { - where: { deletedAt: null }, - include: { - referendum: { select: { id: true, slug: true, title: true } }, - }, - orderBy: { updatedAt: "desc" }, - }, }, }); @@ -71,18 +75,68 @@ export default async function OrganizationPage({ const escapedIframeTitle = escapeHtml(iframeTitle); const iframeCode = ``; const buttonCode = `Take the ${GLOBAL_SURVEY_NAME}`; - const emailSubject = "30 seconds to end war and disease"; + const nuclearWinterWarheadThreshold = formatFlowWords( + FLOW_NUCLEAR_WINTER_WARHEAD_THRESHOLD, + 3, + ); + const globalWarheadCount = formatFlowWords(FLOW_GLOBAL_WARHEAD_COUNT, 3); + const apocalypseCount = formatFlowWords( + FLOW_NUCLEAR_WINTER_OVERKILL_FACTOR, + 3, + ); + const treatyReduction = fmtParamValueOnly(TREATY_REDUCTION_PCT, 1); + const trialCapacityMultiplier = fmtParamValueOnly( + DFDA_TRIAL_CAPACITY_MULTIPLIER, + 3, + ); + const diseaseEradicationYears = fmtParamValueOnly( + DFDA_QUEUE_CLEARANCE_YEARS, + 2, + ); + const statusQuoYears = fmtParamValueOnly(STATUS_QUO_QUEUE_CLEARANCE_YEARS, 3); + const emailSubject = "Please take 30 seconds to end war and disease"; const emailBody = `Subject: ${emailSubject} -Hi, - -${org.name} joined the International Campaign to End War and Disease by publicly supporting the 1% Treaty: every nation should simultaneously redirect 1% of military spending to high-efficiency pragmatic clinical trials. - -Please answer the ${GLOBAL_SURVEY_NAME}: +It currently requires about ${nuclearWinterWarheadThreshold} nuclear weapons to create a nuclear winter, destroy the food system, and cause an apocalypse. Humanity currently has about ${globalWarheadCount} nuclear weapons, sufficient to cause at least ${apocalypseCount} of these apocalypses. -${organizationSurveyUrl} +Sacrificing one apocalypse of this mass-murder capacity by redirecting ${treatyReduction} of military spending to fund high-efficiency pragmatic clinical trials could increase the pace of medical research ${trialCapacityMultiplier} times. This could compress the time required to find the first treatment for all diseases from ${statusQuoYears} years to ${diseaseEradicationYears} years. -This is a policy survey, not a candidate endorsement.`; +Please take this survey to share your opinion on this proposal: +${organizationSurveyUrl}`; + const linkedSurveyUrl = linkHtml( + organizationSurveyUrl, + organizationSurveyUrl, + ); + const emailHtmlBody = [ + `

    Subject: ${escapeHtml(emailSubject)}

    `, + `

    It currently requires about ${linkHtml( + nuclearWinterWarheadThreshold, + FLOW_NUCLEAR_WINTER_WARHEAD_THRESHOLD.manualPageUrl, + )} nuclear weapons to create a nuclear winter, destroy the food system, and cause an apocalypse. Humanity currently has about ${linkHtml( + globalWarheadCount, + FLOW_GLOBAL_WARHEAD_COUNT.manualPageUrl, + )} nuclear weapons, sufficient to cause at least ${linkHtml( + apocalypseCount, + FLOW_NUCLEAR_WINTER_OVERKILL_FACTOR.manualPageUrl, + )} of these apocalypses.

    `, + `

    Sacrificing one apocalypse of this mass-murder capacity by redirecting ${linkHtml( + treatyReduction, + TREATY_REDUCTION_PCT.manualPageUrl, + )} of military spending to fund high-efficiency ${linkHtml( + "pragmatic clinical trials", + PRAGMATIC_CLINICAL_TRIALS_MANUAL_URL, + )} could increase the pace of medical research ${linkHtml( + trialCapacityMultiplier, + DFDA_TRIAL_CAPACITY_MULTIPLIER.manualPageUrl, + )} times. This could compress the time required to find the first treatment for all diseases from ${linkHtml( + statusQuoYears, + STATUS_QUO_QUEUE_CLEARANCE_YEARS.manualPageUrl, + )} years to ${linkHtml( + diseaseEradicationYears, + DFDA_QUEUE_CLEARANCE_YEARS.manualPageUrl, + )} years.

    `, + `

    Please take this survey to share your opinion on this proposal:
    ${linkedSurveyUrl}

    `, + ].join("\n"); return (
    @@ -139,7 +193,14 @@ This is a policy survey, not a candidate endorsement.`; /> + @@ -165,15 +226,7 @@ This is a policy survey, not a candidate endorsement.`; />

    - Keep the organization URL intact so responses credit{" "} - {org.name}. Board needs a memo?{" "} - - Use this one - - . + Use the organization URL above so responses credit {org.name}.

    @@ -252,42 +305,6 @@ This is a policy survey, not a candidate endorsement.`; ) : null} - -
    -

    - Referendum positions -

    - {org.referendumPositions.length === 0 ? ( -

    - This organization has not joined the campaign yet.{" "} - - Join as an organization - - . -

    - ) : ( -
      - {org.referendumPositions.map((p) => ( -
    • -
      - {p.referendum.title} - - {p.position} · {p.status.toLowerCase()} - -
      - {p.statement ? ( -

      - “{p.statement}” -

      - ) : null} -
    • - ))} -
    - )} -
    ); @@ -302,6 +319,12 @@ function escapeHtml(value: string): string { .replaceAll("'", "'"); } +function linkHtml(label: string, href: string | null | undefined): string { + const escapedLabel = escapeHtml(label); + if (!href) return escapedLabel; + return `${escapedLabel}`; +} + function getSafeHttpUrl(value: string | null | undefined) { if (!value) return null; try { diff --git a/packages/web/src/app/page.logged-out.md b/packages/web/src/app/page.logged-out.md index aba11fcea..e44e01dd4 100644 --- a/packages/web/src/app/page.logged-out.md +++ b/packages/web/src/app/page.logged-out.md @@ -14,5 +14,6 @@ ## Visible Page Copy ## PLEASE TAKE 30 SECONDS TO END WAR AND DISEASE -- You pay governments $36.5 trillion a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. What allocation between military spending and clinical trials would best fulfill that duty? +- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare (i.e. maximize median health and wealth). Of the money available for military/weapons and clinical trials, how much should go to each? +- PRAGMATIC CLINICAL TRIALS - SLIDE ME diff --git a/packages/web/src/app/people/[id]/page.tsx b/packages/web/src/app/people/[id]/page.tsx index 80b206024..58c2718b2 100644 --- a/packages/web/src/app/people/[id]/page.tsx +++ b/packages/web/src/app/people/[id]/page.tsx @@ -7,7 +7,6 @@ import { headers } from "next/headers"; import Link from "next/link"; import { getServerSession } from "next-auth"; import { notFound } from "next/navigation"; -import type { TaskCardTask } from "@/components/tasks/task-card"; import { SufferingPreventedMetric } from "@/components/referendum/SignatoriesLeaderboard"; import { Avatar } from "@/components/retroui/Avatar"; import { CopyLinkButton } from "@/components/sharing/copy-link-button"; @@ -15,6 +14,7 @@ import { defaultButtonClassName, primaryButtonClassName, } from "@/components/ui/default-button"; +import { PublicProfileTaskSection } from "@/components/tasks/PublicProfileTaskSection"; import { WelfareClaim } from "@/components/shared/WelfareClaim"; import { getPersonTaskProfileData } from "@/lib/tasks.server"; import { authOptions } from "@/lib/auth"; @@ -58,19 +58,6 @@ type PersonTaskProfileData = NonNullable< type PublicProfilePerson = PersonTaskProfileData["person"]; type PublicProfileVote = PublicProfilePerson["referendumVotes"][number]; -const CAMPAIGN_TASK_TERMS = [ - "1% treaty", - "one-percent-treaty", - "war on disease", - "war-on-disease", - "humanity v government", - "humanity-v-government", - "court of humanity", - "plaintiff", - "referendum", - "global survey", -] as const; - async function getVisitorTreatyStatus(userId: string | null) { if (!userId) { return { hasSignedTreaty: false }; @@ -251,25 +238,6 @@ function getTrustSignal(person: PublicProfilePerson) { return "Public campaign profile"; } -function getCampaignTaskText(task: TaskCardTask) { - return [ - task.taskKey, - task.title, - task.description, - task.parentTask?.title, - ...task.interestTags, - ...task.skillTags, - ] - .filter(Boolean) - .join(" ") - .toLowerCase(); -} - -function isCampaignTask(task: TaskCardTask) { - const haystack = getCampaignTaskText(task); - return CAMPAIGN_TASK_TERMS.some((term) => haystack.includes(term)); -} - function buildForwardReferralHref(referralUrl: string) { const subject = "Sign the 1% Treaty"; const body = `I signed the 1% Treaty. Add your name: ${referralUrl}`; @@ -515,10 +483,8 @@ export default async function PersonDetailPage({ forwardedProto: hdrs.get("x-forwarded-proto"), }); const visitorStatus = await getVisitorTreatyStatus(userId); - const { person, verifiedTasks } = data; + const { openTasks, person, verifiedTasks } = data; const fallbackInitials = getFallbackInitials(person.displayName); - const verifiedTyped = verifiedTasks as unknown as TaskCardTask[]; - const campaignTasks = verifiedTyped.filter(isCampaignTask).slice(0, 6); const treatyVote = getVoteBySlug(person, TREATY_REFERENDUM_SLUG); const courtVote = getVoteBySlug(person, DECLARATION_SLUG); const recruitedCount = person.user?._count.referendumReferrals ?? 0; @@ -673,30 +639,11 @@ export default async function PersonDetailPage({ )} - {campaignTasks.length > 0 ? ( -
    -

    - Public Campaign Tasks -

    -
      - {campaignTasks.map((task) => ( -
    • - - {task.title} - - {task.verifiedAt ? ( -

      - Completed {formatIsoDate(task.verifiedAt) ?? ""} -

      - ) : null} -
    • - ))} -
    -
    - ) : null} + ); diff --git a/packages/web/src/app/plaintiffs.md/route.ts b/packages/web/src/app/plaintiffs.md/route.ts new file mode 100644 index 000000000..fedab3c5b --- /dev/null +++ b/packages/web/src/app/plaintiffs.md/route.ts @@ -0,0 +1,18 @@ +import { headers } from "next/headers"; +import { AGENT_CACHE_CONTROL } from "@/lib/agent-readable/campaign-canon"; +import { buildMarkdownMirror } from "@/lib/agent-readable/markdown-mirrors"; +import { getSiteFromHeaders } from "@/lib/site"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); + + return new Response(buildMarkdownMirror("plaintiffs", site), { + headers: { + "Cache-Control": AGENT_CACHE_CONTROL, + "Content-Type": "text/markdown; charset=utf-8", + }, + }); +} diff --git a/packages/web/src/app/plaintiffs/page.logged-out.md b/packages/web/src/app/plaintiffs/page.logged-out.md index 52d1072df..516caa411 100644 --- a/packages/web/src/app/plaintiffs/page.logged-out.md +++ b/packages/web/src/app/plaintiffs/page.logged-out.md @@ -14,12 +14,10 @@ ## Visible Page Copy ## REGISTER PLAINTIFFS FOR HUMANITY V GOVERNMENT. -- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. Since 1900 they spent [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) murdering [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) of their employers — enough to fund [37,800](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) years of clinical trials at current funding levels. -- Register anyone you love who was killed or harmed. The case in [Humanity v. Government](/humanity-v-government) seeks [$10.6 million/person](https://manual.WarOnDisease.org/knowledge/solution/court-of-humanity.html) per murdered human in damages. -### IF SOMEONE YOU LOVE DIED OF DISEASE IN OR AFTER [1950](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html), OR AGING IN OR AFTER [1990](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html), IT IS WRONGFUL DEATH. -- The cited math counts the time to build medical tools and clear the treatment queue, then puts the disease line at [1950](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). Aging gets about [40](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) more years and lands at [1990](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html); biology was harder, not innocent. -- IT IS WRONGFUL DEATH. -- [REGISTER A PLAINTIFF](#register-plaintiff) +- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. Since 1900 they spent [$170 trillion](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) murdering [310 million](https://manual.WarOnDisease.org/knowledge/problem/cost-of-war.html) people. +- Had they adopted the [1% Treaty](/treaty) and frozen military spending in 1900, that money would have funded [37,800](https://manual.WarOnDisease.org/knowledge/strategy/declaration-of-optimization.html) years of clinical trials. Disease would have been eradicated by [1950](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). Aging reversed by [1990](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). [methodology](https://manual.WarOnDisease.org/knowledge/appendix/parameters-and-calculations.html) +- Every disease case since [1950](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) and every aging death since [1990](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) is misallocation harm — wrongful, attributable, registerable. +- Register anyone you know who suffered disease since [1950](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) or died since [1990](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html). ### REGISTER PLAINTIFF - FIRST NAME - MIDDLE NAME OPTIONAL diff --git a/packages/web/src/app/plaintiffs/page.tsx b/packages/web/src/app/plaintiffs/page.tsx index 312018223..525b984f6 100644 --- a/packages/web/src/app/plaintiffs/page.tsx +++ b/packages/web/src/app/plaintiffs/page.tsx @@ -3,7 +3,6 @@ import { CUMULATIVE_MILITARY_IN_GOVT_TRIAL_YEARS, CUMULATIVE_MILITARY_SPENDING_FED_ERA, LOST_PROSPERITY_LIFETIME_DAMAGES_PER_CAPITA, - WAR_TRIAL_REDIRECT_AGING_LAG_AFTER_DISEASE_CONTROL_YEARS, WAR_TRIAL_REDIRECT_AGING_PLEADING_CUTOFF_YEAR, WAR_TRIAL_REDIRECT_DISEASE_PLEADING_CUTOFF_YEAR, WAR_DEATHS_SINCE_1900, @@ -178,82 +177,72 @@ export default async function PlaintiffsPage({ param={CUMULATIVE_MILITARY_SPENDING_FED_ERA} />{" "} murdering{" "} - of - their employers — enough to fund{" "} - {" "} - years of clinical trials at current funding levels. + {" "} + people.

    - Register anyone you love who was killed or harmed. The case in{" "} + Had they adopted the{" "} - {humanityVGovernmentLink.label} + 1% Treaty {" "} - seeks{" "} + and frozen military spending in 1900, that money would have + funded{" "} {" "} + years of clinical trials. Disease would have been eradicated by{" "} + + . Aging reversed by{" "} + + .{" "} + + methodology + +

    +

    + Every disease case since{" "} + {" "} + and every aging death since{" "} + {" "} - per murdered human in damages. + is misallocation harm — wrongful, attributable, registerable. +

    +

    + Register anyone you know who suffered disease since{" "} + {" "} + or died since{" "} + + .

    -
    -

    - If someone you love died of disease in or after{" "} - - , or aging in or after{" "} - - , it is wrongful death. -

    -

    - The cited math counts the time to build medical tools and clear the - treatment queue, then puts the disease line at{" "} - - . Aging gets about{" "} - {" "} - more years and lands at{" "} - - ; biology was harder, not innocent. -

    -

    - It is wrongful death. -

    - - REGISTER A PLAINTIFF - -
    -
    diff --git a/packages/web/src/app/prize/page.logged-out.md b/packages/web/src/app/prize/page.logged-out.md index 820c773ee..1bc3deb25 100644 --- a/packages/web/src/app/prize/page.logged-out.md +++ b/packages/web/src/app/prize/page.logged-out.md @@ -63,9 +63,10 @@ ### GAME STATUS - 10 - 04 -- 26 -- 23 -- 50 +- 24 +- 17 +- 39 +- 27 - Until the destructive economy reaches 50% of GDP — the point where stealing beats creating ### PLAY THE GAME - The current cost of governance dysfunction is $101 trillion per year. The break-even probability is 0.0067%. You don't need to be altruistic. You just need to be numerate. diff --git a/packages/web/src/app/profile/page.tsx b/packages/web/src/app/profile/page.tsx index bbbf3d75e..ebabc18ba 100644 --- a/packages/web/src/app/profile/page.tsx +++ b/packages/web/src/app/profile/page.tsx @@ -1,10 +1,14 @@ import { getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import { ProfileIdentityClient } from "@/components/profile/ProfileIdentityClient"; +import { PublicProfileTaskSection } from "@/components/tasks/PublicProfileTaskSection"; import { authOptions } from "@/lib/auth"; +import { getUserPersonHref } from "@/lib/person-href"; import { getProfileIdentityData } from "@/lib/profile-identity.server"; import { getSignInPath, profileLink, ROUTES } from "@/lib/routes"; import { getRouteMetadata } from "@/lib/metadata"; +import { getPersonTaskProfileData } from "@/lib/tasks.server"; +import { getUserDisplayName } from "@/lib/user-display"; export const metadata = getRouteMetadata(profileLink); @@ -22,14 +26,30 @@ export default async function ProfilePage() { redirect(getSignInPath(ROUTES.profile)); } + const publicTaskData = data.user.person + ? await getPersonTaskProfileData(data.user.person.id, userId) + : null; const availableAuthProviderIds = authOptions.providers.map((provider) => provider.id); + const publicProfileHref = getUserPersonHref(data.user); return ( - + <> + +
    + +
    + ); } diff --git a/packages/web/src/app/scoreboard/page.logged-out.md b/packages/web/src/app/scoreboard/page.logged-out.md index 7a3ead944..527fc025e 100644 --- a/packages/web/src/app/scoreboard/page.logged-out.md +++ b/packages/web/src/app/scoreboard/page.logged-out.md @@ -51,7 +51,7 @@ ### SIGNATURE LEADERBOARD - Top signatories by verified treaty signatures attributed to them. This is the part where the species notices it has thumbs. - SIGNATORY -- Hours of suffering prevented -- [#1 Mike Sinn](/people/mike) 4.68 MILLION HOURS OF SUFFERING PREVENTED -- [#2 Nikhil Yadala](/people/empirical-trailblazer) 1.40 MILLION HOURS OF SUFFERING PREVENTED -- [#3 Wishonia](/people/wishonia) 468,000 HOURS OF SUFFERING PREVENTED +- HOURS OF SUFFERING PREVENTED +- [#1 Mike Sinn](/people/mike) 4.68 MILLION +- [#2 Nikhil Yadala](/people/empirical-trailblazer) 1.40 MILLION +- [#3 Wishonia](/people/wishonia) 468,000 diff --git a/packages/web/src/app/signatories/page.logged-out.md b/packages/web/src/app/signatories/page.logged-out.md index 2ff0ff66e..c10260f51 100644 --- a/packages/web/src/app/signatories/page.logged-out.md +++ b/packages/web/src/app/signatories/page.logged-out.md @@ -16,15 +16,14 @@ ### THE PEOPLE WHO ENDED WAR AND DISEASE - Allowing billions of people to suffer and die from disease so humanity can preserve its [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html)-apocalypse mass-murder capacity is a conscious act of barbaric mass cruelty. Like slavery, it will be allowed to continue until enough people are brave enough to publicly state that it is morally wrong and incredibly stupid. These are those people. - SIGNATORY -- Hours of suffering prevented -- [#1 Mike Sinn](/people/mike) 4.68 MILLION HOURS OF SUFFERING PREVENTED -- [#2 Nikhil Yadala](/people/empirical-trailblazer) 1.40 MILLION HOURS OF SUFFERING PREVENTED -- [#3 Wishonia](/people/wishonia) 468,000 HOURS OF SUFFERING PREVENTED +- HOURS OF SUFFERING PREVENTED +- [#1 Mike Sinn](/people/mike) 4.68 MILLION +- [#2 Nikhil Yadala](/people/empirical-trailblazer) 1.40 MILLION +- [#3 Wishonia](/people/wishonia) 468,000 - HUMANITY MANAGER · ASSIGNMENT 1 -### FORWARD THIS MESSAGE TO EVERYONE YOU DON'T WANT TO SUFFER AND DIE OF HORRIBLE DISEASES. -- You are now Humanity Manager for [8 billion](https://manual.WarOnDisease.org/knowledge/solution/dih.html) humans. Get them to spend [30 seconds](https://manual.WarOnDisease.org/knowledge/appendix/recruitment-and-propaganda-plan.html) voting on the [1% Treaty](/treaty). The trade: one of Earth's [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) stored apocalypses for [12.3](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html)× more clinical trials, pulling disease eradication from [443](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years to [36](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). -- Send this message to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) humans you love. They send it to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) more. After enough rounds, everyone votes. You earn one Earth Optimization Point per recruited voter, redeemable for a share of the [Earth Optimization Prize](/prize). -- COPY THIS MESSAGE Forward it to two humans you love right now. I love you and don't want you to suffer and die of horrible diseases so please take 30 seconds to vote on this stupid treaty at http://127.0.0.1:3001/vote as it will reduce the likelihood you will suffer and die of horrible diseases. +- 🥳Congratulations! You've been promoted to Humanity Manager at Earth Optimization Services, LLC. You are responsible for getting [8 billion](https://manual.WarOnDisease.org/knowledge/solution/dih.html) humans to agree to trade one of Earth's [122](https://manual.WarOnDisease.org/knowledge/appendix/extinction-surplus.html) apocalypses worth of mass murder capacity for [12.3](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html)× more clinical trials, compressing the disease eradication timeline from [443](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html) years to [36](https://manual.WarOnDisease.org/knowledge/economics/1-pct-treaty-impact.html). +- Hire 2 subordinates by sending this message to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) humans you love. They send it to [two](https://manual.WarOnDisease.org/knowledge/strategy/global-referendum.html) more and after 32 of these doublings, the majority of humanity has agreed to transcend war and disease! +- I love you and don't want you to suffer and die of horrible diseases so please take 30 seconds to vote on this stupid treaty at http://127.0.0.1:3001/vote as it will reduce the likelihood you will suffer and die of horrible diseases. - COPY TO CLIPBOARD - [WHATSAPP](https://wa.me/?text=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20http%3A%2F%2F127.0.0.1%3A3001%2Fvote%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) - [EMAIL](mailto:?subject=Vote%20on%20the%201%25%20Treaty&body=I%20love%20you%20and%20don't%20want%20you%20to%20suffer%20and%20die%20of%20horrible%20diseases%20so%20please%20take%2030%20seconds%20to%20vote%20on%20this%20stupid%20treaty%20at%20http%3A%2F%2F127.0.0.1%3A3001%2Fvote%20as%20it%20will%20reduce%20the%20likelihood%20you%20will%20suffer%20and%20die%20of%20horrible%20diseases.) diff --git a/packages/web/src/app/survey/SurveyVoteFlowClient.tsx b/packages/web/src/app/survey/SurveyVoteFlowClient.tsx new file mode 100644 index 000000000..26e86d615 --- /dev/null +++ b/packages/web/src/app/survey/SurveyVoteFlowClient.tsx @@ -0,0 +1,55 @@ +"use client"; + +import dynamic from "next/dynamic"; +import type { TreatyVoteFlowProps } from "@/components/landing/TreatyVoteFlow"; +import { ROUTES } from "@/lib/routes"; + +const ClientOnlyTreatyVoteFlow = dynamic( + () => + import("./SurveyVoteFlowContent").then((mod) => mod.SurveyVoteFlowContent), + { + ssr: false, + loading: () => ( +
    + Loading survey +
    + ), + }, +); + +export function SurveyVoteFlowClient(props: TreatyVoteFlowProps) { + return ( +
    + + +
    + ); +} diff --git a/packages/web/src/app/survey/SurveyVoteFlowContent.tsx b/packages/web/src/app/survey/SurveyVoteFlowContent.tsx new file mode 100644 index 000000000..fd86978d8 --- /dev/null +++ b/packages/web/src/app/survey/SurveyVoteFlowContent.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { useEffect } from "react"; +import { + TreatyVoteFlow, + type TreatyVoteFlowProps, +} from "@/components/landing/TreatyVoteFlow"; + +const SURVEY_READY_MESSAGE = "optimitron:survey-ready"; + +export function SurveyVoteFlowContent(props: TreatyVoteFlowProps) { + useEffect(() => { + if (window.parent === window) { + return; + } + + window.parent.postMessage( + { + path: window.location.pathname, + type: SURVEY_READY_MESSAGE, + }, + "*", + ); + }, []); + + return ; +} diff --git a/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md b/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md index 8b4715eea..bf70d1655 100644 --- a/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md +++ b/packages/web/src/app/survey/[organizationSlug]/page.logged-out.md @@ -15,16 +15,9 @@ ## 404 - PAGE NOT FOUND -- Fascinating. You've managed to navigate to a page that doesn't exist. On my planet, our routing infrastructure hasn't lost a page in 4,237 years. You lot can't even keep track of a URL. -- To be fair, your species also loses approximately $2.1 trillion annually to administrative inefficiency, so misplacing a web page is relatively on-brand. -- The page you're looking for has either been moved, deleted, or — and I cannot stress how likely this is — never existed in the first place. Much like your evidence-based policymaking. -- WISHONIA DIAGNOSTIC REPORT -- Problem: Page not found -- Severity: Mildly embarrassing -- Root cause: Human error (probability: 97.3%) -- Recommended action: Click a button that actually goes somewhere -- Time to resolve on my planet: 0.003 seconds -- Estimated time on yours: Unclear. You still haven't fixed healthcare. -- [RETURN TO EARTH](/) -- [VIEW SCOREBOARD](/scoreboard) -- “It's almost impressive how a species that put people on the moon regularly types URLs wrong.”— Wishonia, mildly disappointed (as usual) +- Fascinating. You found a page that does not exist. On my planet, this takes effort. +- [SEARCH](/search) +- [VOTE](/vote) +- [DONATE](/donate) +- [ORGANIZATIONS](/endorse) +- Click something real. The machines are willing to forgive you. diff --git a/packages/web/src/app/survey/[organizationSlug]/page.tsx b/packages/web/src/app/survey/[organizationSlug]/page.tsx index ca437910f..803618adb 100644 --- a/packages/web/src/app/survey/[organizationSlug]/page.tsx +++ b/packages/web/src/app/survey/[organizationSlug]/page.tsx @@ -1,11 +1,10 @@ import type { Metadata } from "next"; -import Link from "next/link"; import { notFound } from "next/navigation"; -import { TreatyVoteFlow } from "@/components/landing/TreatyVoteFlow"; import { GLOBAL_SURVEY_NAME } from "@/lib/messaging"; import { getApprovedOrganizationForSurveySlug } from "@/lib/organization.server"; import { ROUTES, trialSurveyLink } from "@/lib/routes"; import { TREATY_FLOW_VARIANTS } from "@/lib/treaty-flow-variants"; +import { SurveyVoteFlowClient } from "../SurveyVoteFlowClient"; export async function generateMetadata({ params, @@ -35,14 +34,9 @@ export default async function OrganizationSurveyPage({ return (
    -
    -

    {organization.name}

    - - Survey Home - -
    - - { * of interactions. */ export default async function TreatyPage() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); const referendumContent = await getReferendumPageContent( TREATY_REFERENDUM_SLUG, ); @@ -44,6 +48,7 @@ export default async function TreatyPage() { return (
    +

    Please quickly skim and sign to end war and disease. diff --git a/packages/web/src/app/vote/page.logged-out.md b/packages/web/src/app/vote/page.logged-out.md index 3eabd67ee..b173c97b6 100644 --- a/packages/web/src/app/vote/page.logged-out.md +++ b/packages/web/src/app/vote/page.logged-out.md @@ -14,5 +14,6 @@ ## Visible Page Copy ## PLEASE TAKE 30 SECONDS TO END WAR AND DISEASE -- You pay governments $36.5 trillion a year to promote the general welfare — i.e. maximize median healthy life years and median after-tax inflation-adjusted income. What allocation between military spending and clinical trials would best fulfill that duty? +- You pay governments [$36.5 trillion](https://manual.WarOnDisease.org/knowledge/appendix/humanity-v-government.html) a year to promote the general welfare (i.e. maximize median health and wealth). Of the money available for military/weapons and clinical trials, how much should go to each? +- PRAGMATIC CLINICAL TRIALS - SLIDE ME diff --git a/packages/web/src/app/vote/page.tsx b/packages/web/src/app/vote/page.tsx index 4741540df..39804d611 100644 --- a/packages/web/src/app/vote/page.tsx +++ b/packages/web/src/app/vote/page.tsx @@ -2,7 +2,9 @@ import { getServerSession } from "next-auth"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; import { TreatyVoteFlow } from "@/components/landing/TreatyVoteFlow"; +import { JsonLdScript } from "@/components/site/JsonLdScript"; import { authOptions } from "@/lib/auth"; +import { buildVoteStructuredData } from "@/lib/campaign-structured-data"; import { getRouteMetadata } from "@/lib/metadata"; import { prisma } from "@/lib/prisma"; import { ROUTES, voteLink } from "@/lib/routes"; @@ -12,6 +14,8 @@ import { TREATY_FLOW_VARIANTS } from "@/lib/treaty-flow-variants"; export const metadata = getRouteMetadata(voteLink); export default async function VotePage() { + const hdrs = await headers(); + const site = getSiteFromHeaders(hdrs); // Mirror the home page's already-voted guard at app/page.tsx:48-66. // A signed-in user who already voted on the primary referendum gets // redirected to /dashboard so they don't re-render the slider they @@ -21,8 +25,6 @@ export default async function VotePage() { const session = await getServerSession(authOptions); const userId = session?.user?.id ?? null; if (userId) { - const hdrs = await headers(); - const site = getSiteFromHeaders(hdrs); if (site.primaryReferendumSlug) { const existingVote = await prisma.referendumVote.findFirst({ where: { @@ -40,6 +42,7 @@ export default async function VotePage() { return (
    +
    (null); + const [isEmbeddedFrame, setIsEmbeddedFrame] = useState(false); const isLoading = pendingAction !== null; const isDocument = variant === "document"; const fieldClassName = compact ? "h-11 text-base" : "h-12 text-base"; const buttonClassName = compact ? "h-11 text-sm" : "h-12 text-base"; const magicLinkEnabled = providers?.email ?? true; - const googleEnabled = providers?.google ?? true; + const googleEnabled = (providers?.google ?? true) && !isEmbeddedFrame; const demoLoginEnabled = providers?.demo ?? isDemoLoginEnabled({ @@ -150,6 +163,10 @@ export function AuthForm({ setHasSubmitted(false); }, [initialError]); + useEffect(() => { + setIsEmbeddedFrame(detectEmbeddedFrame()); + }, []); + function persistAuthContext() { if (onBeforeAuth?.() === false) { return false; diff --git a/packages/web/src/components/dashboard/DashboardShareCard.tsx b/packages/web/src/components/dashboard/DashboardShareCard.tsx index 0c55cf703..5d29236f0 100644 --- a/packages/web/src/components/dashboard/DashboardShareCard.tsx +++ b/packages/web/src/components/dashboard/DashboardShareCard.tsx @@ -266,22 +266,19 @@ export function DashboardShareCard({ referralUrl }: DashboardShareCardProps) {
    -