## Phase 8: Enterprise Extractor Improvements ✅ - 14 security extractors (TLS, JWT, SQL injection, XSS, etc.) - 10 framework-specific extractors (Spring, Django, Rails, etc.) - Config file security detection (YAML, TOML) ## Phase 9: Autonomous Extractor Generation ✅ - Shadow mode executor with TP/FP tracking - Graduation pipeline with confidence thresholds - Auto-rollback on regression detection - Cross-project pattern syncing ## UAT Suite Complete (14 scripts, 90 tests) - test-core-detection.sh (6 tests) - test-declarative-extractors.sh (5 tests) - test-domain-frameworks.sh (5 tests) - test-domain-unreal.sh (3 tests) - test-llm-extraction.sh (6 tests) - test-eval-harness.sh (5 tests) - test-cross-language.sh (3 tests) - test-precommit-performance.sh (4 tests) - test-output-formats.sh (8 tests) - test-drift-detection.sh (6 tests) - test-exit-codes.sh (12 tests) + 3 more scripts ## Other Changes - Updated roadmap to mark Phase 8-9 complete - Added .gitignore entries for build artifacts - Updated pre-commit: 800 line limit, exclude tests/data/cmd Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2704 lines
103 KiB
Go
2704 lines
103 KiB
Go
// Package main provides drug assertion builders for P2.2 Conflict Scenarios.
|
||
//
|
||
// This file contains builders for 3 GLP-1 drugs with genuine pharmaceutical
|
||
// data conflicts. The data is based on real FDA labels, clinical trials, and
|
||
// patient reports, showcasing how StemeDB handles disagreements between
|
||
// authoritative sources.
|
||
//
|
||
// Target: 150+ assertions across 3 drugs with conflict scores ~0.3-0.8
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"log"
|
||
|
||
"github.com/orchard9/stemedb-go/steme"
|
||
)
|
||
|
||
// DrugAssertionConfig holds configuration for building drug assertions.
|
||
type DrugAssertionConfig struct {
|
||
// Agent is the agent name from the registry
|
||
Agent string
|
||
|
||
// Subject is the assertion subject (e.g., "Semaglutide:ChronicWeightManagement")
|
||
Subject string
|
||
|
||
// Predicate is the assertion predicate (e.g., "weight_loss_percent")
|
||
Predicate string
|
||
|
||
// Value is the assertion value (Number, Text, or Boolean)
|
||
Value steme.ObjectValue
|
||
|
||
// Confidence is the confidence score (0.0 to 1.0)
|
||
Confidence float64
|
||
|
||
// Lifecycle is the assertion lifecycle stage
|
||
Lifecycle steme.LifecycleStage
|
||
|
||
// Source is the source from the registry
|
||
Source Source
|
||
}
|
||
|
||
// populateDrugConflicts populates all 3 drug conflict scenarios.
|
||
func populateDrugConflicts(ctx context.Context, registry *AgentRegistry, baseURL string) {
|
||
fmt.Println("=== P2.2: Populating Drug Conflict Scenarios ===")
|
||
fmt.Println()
|
||
|
||
// Semaglutide (core assertions)
|
||
semaglutideCount := populateSemaglutide(ctx, registry, baseURL)
|
||
fmt.Printf(" Semaglutide: %d assertions\n", semaglutideCount)
|
||
|
||
// Tirzepatide (core assertions)
|
||
tirzepatideCount := populateTirzepatide(ctx, registry, baseURL)
|
||
fmt.Printf(" Tirzepatide: %d assertions\n", tirzepatideCount)
|
||
|
||
// Liraglutide (core assertions)
|
||
liraglutideCount := populateLiraglutide(ctx, registry, baseURL)
|
||
fmt.Printf(" Liraglutide: %d assertions\n", liraglutideCount)
|
||
|
||
// Head-to-head comparisons
|
||
comparisonCount := populateComparisons(ctx, registry, baseURL)
|
||
fmt.Printf(" Comparisons: %d assertions\n", comparisonCount)
|
||
|
||
// Mechanism/Pharmacology details
|
||
mechanismCount := populateMechanismData(ctx, registry, baseURL)
|
||
fmt.Printf(" Mechanism: %d assertions\n", mechanismCount)
|
||
|
||
// Community/Real-world data
|
||
communityCount := populateCommunityData(ctx, registry, baseURL)
|
||
fmt.Printf(" Community: %d assertions\n", communityCount)
|
||
|
||
// P2.4: Historical data with lifecycle evolution
|
||
historicalCount := populateHistoricalData(ctx, registry, baseURL)
|
||
fmt.Printf(" Historical: %d assertions\n", historicalCount)
|
||
|
||
// P2.3: Cascade invalidation demo data
|
||
cascadeCount := populateCascadeData(ctx, registry, baseURL)
|
||
fmt.Printf(" Cascade Demo: %d assertions\n", cascadeCount)
|
||
|
||
total := semaglutideCount + tirzepatideCount + liraglutideCount + comparisonCount + mechanismCount + communityCount + historicalCount + cascadeCount
|
||
fmt.Printf("\n Total: %d assertions\n", total)
|
||
fmt.Println()
|
||
}
|
||
|
||
// submitAssertion submits a single assertion and returns success.
|
||
func submitAssertion(ctx context.Context, registry *AgentRegistry, baseURL string, cfg DrugAssertionConfig) bool {
|
||
signer, ok := registry.signers[cfg.Agent]
|
||
if !ok {
|
||
log.Printf("Warning: Unknown agent %s", cfg.Agent)
|
||
return false
|
||
}
|
||
|
||
client := steme.NewClient(baseURL, signer)
|
||
|
||
assertion := steme.NewAssertion(cfg.Subject, cfg.Predicate).
|
||
WithObject(cfg.Value).
|
||
WithConfidence(cfg.Confidence).
|
||
WithLifecycle(cfg.Lifecycle).
|
||
WithSourceClass(cfg.Source.Class).
|
||
WithSourceHash(cfg.Source.Hash()).
|
||
Build()
|
||
|
||
_, err := client.Assert(ctx, assertion)
|
||
if err != nil {
|
||
log.Printf("Warning: Failed to create assertion %s/%s: %v", cfg.Subject, cfg.Predicate, err)
|
||
return false
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// submitAssertions submits a batch of assertions and returns the count.
|
||
func submitAssertions(ctx context.Context, registry *AgentRegistry, baseURL string, configs []DrugAssertionConfig) int {
|
||
count := 0
|
||
for _, cfg := range configs {
|
||
if submitAssertion(ctx, registry, baseURL, cfg) {
|
||
count++
|
||
}
|
||
}
|
||
return count
|
||
}
|
||
|
||
// =============================================================================
|
||
// SEMAGLUTIDE (Ozempic, Wegovy, Rybelsus)
|
||
// =============================================================================
|
||
|
||
func populateSemaglutide(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CONFLICT 1: Weight Loss % (The Flagship Demo)
|
||
// This is the killer conflict - same metric, different values from different tiers
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Wegovy Label (T0): 14.9% from STEP 1 pivotal
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(14.9),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// STEP 1 Trial (T1): 14.9% (CI 13.5-16.4)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(14.9),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
// STEP UP Trial (T1): 20.7% at 7.2mg dose (higher dose study)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(20.7),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_UP"],
|
||
})
|
||
|
||
// Expert (T3): ~15% typical in practice
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(15.0),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// Reddit (T5): Anecdotal reports vary wildly
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("Reports range 10-25%, highly variable"),
|
||
Confidence: 0.70,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CONFLICT 2: Gastroparesis Risk (Real-World vs Clinical Trial)
|
||
// This demonstrates how clinical trials underreport vs real-world evidence
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Label (T0): 0.2% trial incidence
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewNumberValue(0.002), // 0.2%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// UBC Study (T2): 3x risk vs bupropion-naltrexone
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("3.67x increased risk vs bupropion-naltrexone (HR 3.67, 95% CI 1.15-11.90)"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_UBC_GASTROPARESIS"],
|
||
})
|
||
|
||
// FAERS Data (T2): Higher signal
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Elevated reporting rate vs background (PRR 2.8)"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["RWE_FAERS_SEMAGLUTIDE"],
|
||
})
|
||
|
||
// Expert (T3): Acknowledgment of signal
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Risk signal acknowledged; monitor patients with pre-existing GI conditions"),
|
||
Confidence: 0.80,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
// Reddit (T5): High patient-reported incidence
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Many users report stomach paralysis symptoms; underreported in trials"),
|
||
Confidence: 0.70,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CONFLICT 3: Nausea Rate (Investigator vs Patient-Reported)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Label (T0): 44% from clinical trials
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewNumberValue(0.44), // 44%
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// STEP 1 Trial (T1): 44.2%
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewNumberValue(0.442),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
// Real-World (T2): More disruptive
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewTextValue("Real-world: nausea more severe/disruptive than trial reports suggest"),
|
||
Confidence: 0.78,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_TRINETX_GLP1"],
|
||
})
|
||
|
||
// Reddit (T5): Debilitating for some
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewTextValue("Debilitating for first weeks; many struggle with dose titration"),
|
||
Confidence: 0.68,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Efficacy: HbA1c Reduction (T2D indication)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Ozempic Label (T0)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(1.5),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_OZEMPIC_LABEL"],
|
||
})
|
||
|
||
// SUSTAIN-6 Trial (T1)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(1.4),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SUSTAIN_6"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Safety: Cardiovascular Benefit (SELECT Trial)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// SELECT Trial (T1): 20% CV event reduction
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "cardiovascular_events_reduction",
|
||
Value: steme.NewNumberValue(0.20), // 20% reduction
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SELECT"],
|
||
})
|
||
|
||
// FDA Label updated (T0)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "cardiovascular_events_reduction",
|
||
Value: steme.NewTextValue("Approved for CV risk reduction in adults with obesity"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Safety: Discontinuation Rate
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Label (T0)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "discontinuation_rate_adverse_events",
|
||
Value: steme.NewNumberValue(0.07), // 7%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Real-World (T2): Higher in practice
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "discontinuation_rate_adverse_events",
|
||
Value: steme.NewNumberValue(0.15), // 15% in real-world
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_IQVIA_ADHERENCE"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Additional Safety Predicates
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Vomiting rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "vomiting_rate",
|
||
Value: steme.NewNumberValue(0.24), // 24%
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Diarrhea rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "diarrhea_rate",
|
||
Value: steme.NewNumberValue(0.30), // 30%
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Constipation rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "constipation_rate",
|
||
Value: steme.NewNumberValue(0.24), // 24%
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Pancreatitis risk (boxed warning)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "pancreatitis_risk",
|
||
Value: steme.NewTextValue("Warning: acute pancreatitis observed; discontinue if suspected"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Thyroid C-cell tumor warning
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "has_boxed_warning",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "boxed_warning_text",
|
||
Value: steme.NewTextValue("Thyroid C-Cell Tumors: contraindicated in MTC or MEN 2"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Gallbladder disease risk
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gallbladder_disease_risk",
|
||
Value: steme.NewTextValue("Cholelithiasis/cholecystitis reported; monitor for symptoms"),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Hypoglycemia risk
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "hypoglycemia_risk",
|
||
Value: steme.NewTextValue("Low risk alone; increased when combined with insulin or sulfonylureas"),
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_OZEMPIC_LABEL"],
|
||
})
|
||
|
||
// Injection site reactions
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "injection_site_reaction_rate",
|
||
Value: steme.NewNumberValue(0.02), // 2%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Muscle loss concerns (emerging)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "muscle_loss_observed",
|
||
Value: steme.NewTextValue("39% of weight loss from lean mass in STEP 1"),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide",
|
||
Predicate: "muscle_loss_observed",
|
||
Value: steme.NewTextValue("'Ozempic face' and muscle wasting commonly reported"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// Hair loss reports (anecdotal)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide",
|
||
Predicate: "hair_loss_reported",
|
||
Value: steme.NewTextValue("Many users report hair thinning/loss, possibly from rapid weight loss"),
|
||
Confidence: 0.60,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Mechanism / Pharmacology
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Primary target
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:GLP1R",
|
||
Predicate: "primary_target",
|
||
Value: steme.NewTextValue("GLP-1 receptor agonist (94% homology to native GLP-1)"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Half-life
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "half_life_hours",
|
||
Value: steme.NewNumberValue(168), // ~7 days
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Bioavailability (oral)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "bioavailability_percent",
|
||
Value: steme.NewNumberValue(0.89), // 89% for injection
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Regulatory / Approval
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA approval date (Wegovy for obesity)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "fda_approval_date",
|
||
Value: steme.NewTextValue("2021-06-04 (Wegovy for chronic weight management)"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Approved indications
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("Chronic weight management (BMI >=30 or >=27 with comorbidity); Type 2 diabetes; CV risk reduction"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Max approved dose
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "max_approved_dose_mg",
|
||
Value: steme.NewNumberValue(2.4), // Wegovy max
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// STEP 2 Trial Data (T2D population)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(9.6), // Lower in T2D population
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_2"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Expert Guidelines Integration
|
||
// -------------------------------------------------------------------------
|
||
|
||
// ADA recommendation
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Recommended as first-line injectable for patients with T2D and obesity (ADA 2024)"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// =============================================================================
|
||
// TIRZEPATIDE (Mounjaro, Zepbound)
|
||
// =============================================================================
|
||
|
||
func populateTirzepatide(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CONFLICT 3: Weight Loss % (Highest Efficacy GLP-1)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Zepbound Label (T0): 20.9% at 15mg
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(20.9),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// SURMOUNT-1 Trial (T1): 22.5% at 72 weeks
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(22.5),
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// 3-Year Extension (T1): 22.9% sustained
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(22.9),
|
||
Confidence: 0.93,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_3YR"],
|
||
})
|
||
|
||
// Expert (T3): Best-in-class
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("Highest efficacy among GLP-1s; ~22% typical at max dose"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_AACE_OBESITY"],
|
||
})
|
||
|
||
// Reddit (T5): Variable reports
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("Users report 15-30% loss; 'game changer' for some"),
|
||
Confidence: 0.68,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_MOUNJARO"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CONFLICT 4: Nausea/GI Side Effects (Trade-off)
|
||
// Tirzepatide has highest efficacy but also GI issues
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Label (T0): 17% nausea (lower than reported in practice)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewNumberValue(0.17), // 17%
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// SURMOUNT-1 (T1): 29.3% all GI AEs
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "adverse_event_rate",
|
||
Value: steme.NewTextValue("GI AEs: nausea 24.6%, diarrhea 21.1%, constipation 17.1%"),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// Real-World (T2): Higher GI issues
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewTextValue("Real-world GI AE rates higher than trials; dose titration critical"),
|
||
Confidence: 0.80,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_OPTUM_TIRZEPATIDE"],
|
||
})
|
||
|
||
// Reddit (T5): Trade-off discussion
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewTextValue("'Worth it for the weight loss' but GI sides are real; slow titration helps"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_MOUNJARO"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Gastroparesis Risk (Tirzepatide)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Delayed gastric emptying observed; caution with preexisting GI disorders"),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Similar risk profile to semaglutide; may be higher due to dual agonism"),
|
||
Confidence: 0.78,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["RWE_UBC_GASTROPARESIS"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Efficacy: HbA1c Reduction (T2D)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Mounjaro Label (T0): Best HbA1c reduction
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(2.4), // Best in class
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_MOUNJARO_LABEL"],
|
||
})
|
||
|
||
// SURMOUNT-2 (T1): T2D population
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(2.1),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_2"],
|
||
})
|
||
|
||
// Weight loss in T2D
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(15.7), // 15.7% in T2D (lower than non-T2D)
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_2"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Safety Predicates
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Vomiting rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "vomiting_rate",
|
||
Value: steme.NewNumberValue(0.12), // 12%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Diarrhea rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "diarrhea_rate",
|
||
Value: steme.NewNumberValue(0.21), // 21%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Constipation rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "constipation_rate",
|
||
Value: steme.NewNumberValue(0.17), // 17%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Discontinuation rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "discontinuation_rate_adverse_events",
|
||
Value: steme.NewNumberValue(0.06), // 6%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Boxed warning (same class)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "has_boxed_warning",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "boxed_warning_text",
|
||
Value: steme.NewTextValue("Thyroid C-Cell Tumors: contraindicated in MTC or MEN 2"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Pancreatitis risk
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "pancreatitis_risk",
|
||
Value: steme.NewTextValue("Acute pancreatitis reported; discontinue if suspected"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Injection site reactions
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "injection_site_reaction_rate",
|
||
Value: steme.NewNumberValue(0.07), // 7%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Muscle loss observation
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "lean_mass_preserved",
|
||
Value: steme.NewTextValue("Better lean mass preservation than semaglutide (~65% fat loss)"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Mechanism / Pharmacology
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Primary target (dual agonist - unique!)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide:GLP1R",
|
||
Predicate: "primary_target",
|
||
Value: steme.NewTextValue("Dual GIP/GLP-1 receptor agonist - first in class"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Half-life
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "half_life_hours",
|
||
Value: steme.NewNumberValue(120), // ~5 days
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Regulatory / Approval
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA approval date (Zepbound)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "fda_approval_date",
|
||
Value: steme.NewTextValue("2023-11-08 (Zepbound for chronic weight management)"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Approved indications
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("Chronic weight management (BMI >=30 or >=27 with comorbidity); Type 2 diabetes"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Max approved dose
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "max_approved_dose_mg",
|
||
Value: steme.NewNumberValue(15.0),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Expert Guidelines
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Preferred for maximum weight loss; consider for patients who failed semaglutide"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_AACE_OBESITY"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// =============================================================================
|
||
// LIRAGLUTIDE (Victoza, Saxenda)
|
||
// =============================================================================
|
||
|
||
func populateLiraglutide(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Weight Loss % (Established, lower than newer agents)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Saxenda Label (T0): 5-10% range
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(8.0),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// SCALE Trial (T1): 8% at 56 weeks
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Liraglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewNumberValue(8.0),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SCALE_OBESITY"],
|
||
})
|
||
|
||
// Expert (T3): Established but modest
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Liraglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("5-10% typical; less effective than semaglutide/tirzepatide"),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// Reddit (T5): Mixed reviews
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Liraglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("Results vary 5-15%; many switch to Ozempic for better results"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_SAXENDA"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Nausea Rate (Generally better tolerated)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA Label (T0): 39%
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewNumberValue(0.39), // 39%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// SCALE Trial (T1)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Liraglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewNumberValue(0.40), // 40%
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SCALE_OBESITY"],
|
||
})
|
||
|
||
// Reddit (T5): Manageable
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Liraglutide",
|
||
Predicate: "nausea_rate",
|
||
Value: steme.NewTextValue("Generally manageable; easier titration than newer GLP-1s"),
|
||
Confidence: 0.68,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_SAXENDA"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Gastroparesis Risk (Lower signal)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Delayed gastric emptying; lower signal than semaglutide"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Liraglutide",
|
||
Predicate: "gastroparesis_risk",
|
||
Value: steme.NewTextValue("Similar risk profile but fewer reports than semaglutide (shorter half-life)"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_UBC_GASTROPARESIS"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Cardiovascular Outcomes (LEADER Trial)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// LEADER Trial (T1): CV benefit demonstrated
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Liraglutide:CardiovascularDisease",
|
||
Predicate: "cardiovascular_events_reduction",
|
||
Value: steme.NewNumberValue(0.13), // 13% MACE reduction
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_LEADER"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Liraglutide:CardiovascularDisease",
|
||
Predicate: "all_cause_mortality_reduction",
|
||
Value: steme.NewNumberValue(0.15), // 15% mortality reduction
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_LEADER"],
|
||
})
|
||
|
||
// FDA Label (T0)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide:CardiovascularDisease",
|
||
Predicate: "cardiovascular_events_reduction",
|
||
Value: steme.NewTextValue("Approved for CV risk reduction in T2D with established CVD"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_VICTOZA_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Efficacy: HbA1c Reduction (T2D)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(1.2),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_VICTOZA_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Liraglutide:Type2Diabetes",
|
||
Predicate: "hba1c_reduction_percent",
|
||
Value: steme.NewNumberValue(1.1),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_LEADER"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Safety Predicates
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Vomiting rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "vomiting_rate",
|
||
Value: steme.NewNumberValue(0.16), // 16%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Diarrhea rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "diarrhea_rate",
|
||
Value: steme.NewNumberValue(0.21), // 21%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Constipation rate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "constipation_rate",
|
||
Value: steme.NewNumberValue(0.19), // 19%
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Discontinuation rate (lower than newer agents)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "discontinuation_rate_adverse_events",
|
||
Value: steme.NewNumberValue(0.10), // 10%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Boxed warning
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "has_boxed_warning",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "boxed_warning_text",
|
||
Value: steme.NewTextValue("Thyroid C-Cell Tumors: contraindicated in MTC or MEN 2"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Pancreatitis risk
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "pancreatitis_risk",
|
||
Value: steme.NewTextValue("Acute pancreatitis reported; discontinue if suspected"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Injection site reactions
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "injection_site_reaction_rate",
|
||
Value: steme.NewNumberValue(0.02), // 2%
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Mechanism / Pharmacology
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Primary target
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide:GLP1R",
|
||
Predicate: "primary_target",
|
||
Value: steme.NewTextValue("GLP-1 receptor agonist (97% homology to native GLP-1)"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Half-life (shorter than semaglutide)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "half_life_hours",
|
||
Value: steme.NewNumberValue(13), // ~13 hours (daily dosing)
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Regulatory / Approval (First-mover advantage)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA approval date (Saxenda)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "fda_approval_date",
|
||
Value: steme.NewTextValue("2014-12-23 (Saxenda for chronic weight management)"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Approved indications
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("Chronic weight management; Type 2 diabetes; CV risk reduction in T2D"),
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// Max approved dose
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "max_approved_dose_mg",
|
||
Value: steme.NewNumberValue(3.0), // Saxenda 3.0mg
|
||
Confidence: 1.0,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Established Safety Profile (Advantage)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Liraglutide",
|
||
Predicate: "serious_adverse_event_rate",
|
||
Value: steme.NewTextValue("Longest post-market safety record among GLP-1s; well-characterized profile"),
|
||
Confidence: 0.90,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Comparison Assertions
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Liraglutide:Placebo:ChronicWeightManagement",
|
||
Predicate: "superiority_demonstrated",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SCALE_OBESITY"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Additional Community and Anecdotal Data
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Community perspective on tolerability
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Liraglutide",
|
||
Predicate: "adverse_event_rate",
|
||
Value: steme.NewTextValue("Daily dosing annoying but side effects manageable for most"),
|
||
Confidence: 0.62,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_SAXENDA"],
|
||
})
|
||
|
||
// Discontinuation perspective
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Liraglutide",
|
||
Predicate: "discontinuation_rate_adverse_events",
|
||
Value: steme.NewNumberValue(0.12), // Real-world slightly higher
|
||
Confidence: 0.80,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_IQVIA_ADHERENCE"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// =============================================================================
|
||
// ADDITIONAL COMPARISON AND CROSS-DRUG ASSERTIONS
|
||
// =============================================================================
|
||
|
||
// populateComparisons adds head-to-head comparison assertions.
|
||
func populateComparisons(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Semaglutide vs Placebo
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:Placebo:ChronicWeightManagement",
|
||
Predicate: "superiority_demonstrated",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:Placebo:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("12.4% greater weight loss vs placebo (STEP 1)"),
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Tirzepatide vs Placebo
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Placebo:ChronicWeightManagement",
|
||
Predicate: "superiority_demonstrated",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Placebo:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("19.5% greater weight loss vs placebo (SURMOUNT-1, 15mg)"),
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Tirzepatide vs Semaglutide (Head-to-Head - Real Data!)
|
||
// This is the SURPASS-2 equivalent conflict
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Semaglutide:Type2Diabetes",
|
||
Predicate: "superiority_demonstrated",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Semaglutide:Type2Diabetes",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("Superior HbA1c and weight reduction vs semaglutide 1mg"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// Expert perspective on comparison
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("Tirzepatide shows ~5-7% greater weight loss; dual mechanism may explain"),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// Anecdotal comparison
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("Many switchers report better results on Mounjaro; YMMV"),
|
||
Confidence: 0.60,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_MOUNJARO"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Liraglutide vs Semaglutide (Older vs Newer)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Liraglutide:ChronicWeightManagement",
|
||
Predicate: "superiority_demonstrated",
|
||
Value: steme.NewBooleanValue(true),
|
||
Confidence: 0.90,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_AACE_OBESITY"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Liraglutide:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("Semaglutide ~7% more effective; weekly vs daily dosing preferred"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// Reddit perspective
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide:Liraglutide:ChronicWeightManagement",
|
||
Predicate: "relative_efficacy",
|
||
Value: steme.NewTextValue("Most who tried both prefer Ozempic for convenience and results"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Cost-Effectiveness Comparisons (Real-World Consideration)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Placebo:ChronicWeightManagement",
|
||
Predicate: "cost_effectiveness_ratio",
|
||
Value: steme.NewTextValue("$13,000-$24,000 per QALY gained (varies by payer perspective)"),
|
||
Confidence: 0.75,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Placebo:ChronicWeightManagement",
|
||
Predicate: "cost_effectiveness_ratio",
|
||
Value: steme.NewTextValue("Higher acquisition cost but potentially better ICER due to efficacy"),
|
||
Confidence: 0.70,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["EXPERT_AACE_OBESITY"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Safety Comparisons
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "relative_safety",
|
||
Value: steme.NewTextValue("Similar GI AE profile; tirzepatide may have slightly higher initial GI burden"),
|
||
Confidence: 0.80,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "relative_safety",
|
||
Value: steme.NewTextValue("Discontinuation rates similar (~5-7%); lean mass preservation may favor tirzepatide"),
|
||
Confidence: 0.78,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_TRINETX_GLP1"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// =============================================================================
|
||
// ADDITIONAL MECHANISM AND PHARMACOLOGY DATA
|
||
// =============================================================================
|
||
|
||
// populateMechanismData adds mechanism of action and pharmacology assertions.
|
||
func populateMechanismData(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Semaglutide Mechanism Details
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:GLP1R",
|
||
Predicate: "mechanism_of_action",
|
||
Value: steme.NewTextValue("Activates GLP-1 receptors; increases insulin secretion, decreases glucagon, slows gastric emptying, reduces appetite"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide:GLP1R",
|
||
Predicate: "receptor_binding_affinity",
|
||
Value: steme.NewTextValue("High affinity GLP-1R agonist; 94% sequence homology to native GLP-1"),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Tirzepatide Dual Mechanism (Unique!)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide:GIPR",
|
||
Predicate: "mechanism_of_action",
|
||
Value: steme.NewTextValue("Dual GIP/GLP-1 receptor agonist; GIP activation may enhance insulin sensitivity and fat metabolism"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Tirzepatide:GIPR",
|
||
Predicate: "receptor_binding_affinity",
|
||
Value: steme.NewTextValue("Imbalanced agonist: higher affinity for GIP (5x) than GLP-1 receptor"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
// Expert interpretation of dual mechanism
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:GIPR",
|
||
Predicate: "mechanism_of_action",
|
||
Value: steme.NewTextValue("GIP component may explain superior efficacy; mechanism still being elucidated"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Liraglutide Mechanism
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide:GLP1R",
|
||
Predicate: "mechanism_of_action",
|
||
Value: steme.NewTextValue("GLP-1 receptor agonist; 97% homology to native GLP-1; acylated for albumin binding"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Additional Pharmacokinetic Data
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Semaglutide PK
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "peak_plasma_concentration_hours",
|
||
Value: steme.NewNumberValue(24), // 1-3 days
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "protein_binding_percent",
|
||
Value: steme.NewNumberValue(99.0),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// Tirzepatide PK
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "peak_plasma_concentration_hours",
|
||
Value: steme.NewNumberValue(24), // ~24 hours
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "protein_binding_percent",
|
||
Value: steme.NewNumberValue(99.0),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// Liraglutide PK
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "peak_plasma_concentration_hours",
|
||
Value: steme.NewNumberValue(11), // 8-12 hours
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Liraglutide",
|
||
Predicate: "protein_binding_percent",
|
||
Value: steme.NewNumberValue(98.0),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_SAXENDA_LABEL"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// =============================================================================
|
||
// ADDITIONAL COMMUNITY AND REAL-WORLD DATA
|
||
// =============================================================================
|
||
|
||
// populateCommunityData adds community and real-world experience assertions.
|
||
func populateCommunityData(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Semaglutide Community Insights
|
||
// -------------------------------------------------------------------------
|
||
|
||
// PatientsLikeMe data
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Community reports: ~70% achieve >10% weight loss; 30% non-responders"),
|
||
Confidence: 0.72,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["COMMUNITY_PATIENTS_LIKE_ME"],
|
||
})
|
||
|
||
// Time to response (real-world)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "time_to_response_weeks",
|
||
Value: steme.NewTextValue("Most see results by week 4-8; full effect at maintenance dose ~4-6 months"),
|
||
Confidence: 0.70,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// Food aversion reports
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide",
|
||
Predicate: "adverse_event_rate",
|
||
Value: steme.NewTextValue("'Food noise' silencing reported; some develop aversions to fatty/sweet foods"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_OZEMPIC"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Tirzepatide Community Insights
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Community reports: higher super-responder rate (>20% loss) than semaglutide"),
|
||
Confidence: 0.68,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["COMMUNITY_PATIENTS_LIKE_ME"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "time_to_response_weeks",
|
||
Value: steme.NewTextValue("Rapid initial response; some report 10lbs first month even at 2.5mg"),
|
||
Confidence: 0.66,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_MOUNJARO"],
|
||
})
|
||
|
||
// Supply issues (real-world challenge)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "adverse_event_rate",
|
||
Value: steme.NewTextValue("Sulfur burps common; injection site reactions more frequent than semaglutide"),
|
||
Confidence: 0.62,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_MOUNJARO"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Liraglutide Community Insights
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Liraglutide:ChronicWeightManagement",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Older but proven; many report steady 1-2 lbs/week loss with diet"),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["COMMUNITY_DIABETES_FORUM"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Liraglutide",
|
||
Predicate: "adverse_event_rate",
|
||
Value: steme.NewTextValue("Daily injection burden cited as main drawback vs weekly alternatives"),
|
||
Confidence: 0.68,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_REDDIT_SAXENDA"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Real-World Adherence Data (Key for Demo)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// Semaglutide adherence
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("12-month persistence: ~55-60% (real-world); higher than liraglutide"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_IQVIA_ADHERENCE"],
|
||
})
|
||
|
||
// Tirzepatide adherence (newer, less data)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("Early real-world data: similar or better persistence than semaglutide"),
|
||
Confidence: 0.75,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["RWE_OPTUM_TIRZEPATIDE"],
|
||
})
|
||
|
||
// Liraglutide adherence
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Liraglutide",
|
||
Predicate: "response_rate",
|
||
Value: steme.NewTextValue("12-month persistence: ~40-45%; daily dosing impacts adherence"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["RWE_IQVIA_ADHERENCE"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Twitter/TikTok Anecdotal (Tier 5 - Important for Demo)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("#OzempicJourney: viral weight loss stories; often unrealistic expectations set"),
|
||
Confidence: 0.55,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_TIKTOK_WEIGHTLOSS"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "weight_loss_percent",
|
||
Value: steme.NewTextValue("#Mounjaro trending: dramatic before/after; selection bias evident"),
|
||
Confidence: 0.52,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["ANECDOTAL_TWITTER_GLP1"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Additional Guideline Recommendations
|
||
// -------------------------------------------------------------------------
|
||
|
||
// ADA 2024 recommendations
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("ADA 2024: Preferred GLP-1 for T2D with obesity or established CVD"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("ADA 2024: Option for T2D when maximum weight loss desired"),
|
||
Confidence: 0.90,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Liraglutide:Type2Diabetes",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("ADA 2024: Established option; consider when daily dosing preferred"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
// ACC/AHA cardiovascular recommendations
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("ACC/AHA 2023: Recommended for CV risk reduction in obesity with established CVD"),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ACC_AHA"],
|
||
})
|
||
|
||
// Endocrine Society obesity guidelines
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:ChronicWeightManagement",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("Endocrine Society 2023: First-line pharmacotherapy for obesity with comorbidities"),
|
||
Confidence: 0.91,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:ChronicWeightManagement",
|
||
Predicate: "approved_indications",
|
||
Value: steme.NewTextValue("Endocrine Society 2023: Consider for maximum efficacy; monitor for GI AEs"),
|
||
Confidence: 0.89,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Kidney Outcomes (Emerging Data)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:ChronicKidneyDisease",
|
||
Predicate: "kidney_disease_progression_reduction",
|
||
Value: steme.NewTextValue("FLOW trial: 24% reduction in kidney disease progression"),
|
||
Confidence: 0.93,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SELECT"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Liraglutide:ChronicKidneyDisease",
|
||
Predicate: "kidney_disease_progression_reduction",
|
||
Value: steme.NewTextValue("LEADER secondary: kidney composite endpoint reduced 22%"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_LEADER"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// Remission Data (T2D)
|
||
// -------------------------------------------------------------------------
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "remission_rate",
|
||
Value: steme.NewNumberValue(0.52), // 52% achieved remission at 15mg
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_2"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "remission_rate",
|
||
Value: steme.NewNumberValue(0.32), // 32% achieved remission
|
||
Confidence: 0.90,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_STEP_2"],
|
||
})
|
||
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Type2Diabetes",
|
||
Predicate: "remission_rate",
|
||
Value: steme.NewTextValue("Highest remission rates among GLP-1s; ~50% at max dose"),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// printConflictDemoCommands prints curl commands for the P2.2 conflict scenarios.
|
||
func printConflictDemoCommands() {
|
||
fmt.Println("--- P2.2: Drug Conflict Scenarios ---")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# CONFLICT 1: Semaglutide Weight Loss (The Flagship Demo)")
|
||
fmt.Println("# Expect: 5 claims, conflict_score ~0.4-0.6, T0-T5 tiers represented")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide:ChronicWeightManagement&predicate=weight_loss_percent" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# CONFLICT 2: Semaglutide Gastroparesis Risk (Clinical vs Real-World)")
|
||
fmt.Println("# Expect: 5 claims, conflict_score ~0.6-0.8, genuine disagreement")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide&predicate=gastroparesis_risk" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# CONFLICT 3: Tirzepatide Weight Loss (Highest Efficacy)")
|
||
fmt.Println("# Expect: 5 claims, conflict_score ~0.3-0.5, values cluster higher")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Tirzepatide:ChronicWeightManagement&predicate=weight_loss_percent" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# CONFLICT 4: Nausea Rates (All GLP-1s)")
|
||
fmt.Println("# Compare side effect profiles across drugs")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide&predicate=nausea_rate" | jq`)
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Tirzepatide&predicate=nausea_rate" | jq`)
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Liraglutide&predicate=nausea_rate" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Compare weight loss across all 3 drugs")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Liraglutide:ChronicWeightManagement&predicate=weight_loss_percent" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Check assertion count (expect 150+)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/health" | jq '.assertions_count'`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Layered view (per-tier consensus)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/layered?subject=Semaglutide:ChronicWeightManagement&predicate=weight_loss_percent" | jq`)
|
||
fmt.Println()
|
||
}
|
||
|
||
// =============================================================================
|
||
// P2.4: HISTORICAL DATA (TIME-TRAVEL VIA LIFECYCLE EVOLUTION)
|
||
// =============================================================================
|
||
|
||
// populateHistoricalData creates assertions with lifecycle progression to
|
||
// demonstrate time-travel queries. The key demo scenario is the Wegovy CV
|
||
// indication change in March 2024 - before SELECT trial results, semaglutide
|
||
// was not approved for cardiovascular risk reduction.
|
||
//
|
||
// Demo Scenario:
|
||
// - June 2021: Wegovy approved for weight management only
|
||
// - November 2023: SELECT trial published (CV benefit proven)
|
||
// - March 2024: FDA adds CV risk reduction indication
|
||
//
|
||
// This creates assertions showing:
|
||
// - DEPRECATED: "Semaglutide not approved for CV risk reduction" (pre-2024)
|
||
// - APPROVED: "Semaglutide approved for CV risk reduction" (post-2024)
|
||
//
|
||
// Query with as_of parameter to see historical state vs current state.
|
||
func populateHistoricalData(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 1: Wegovy CV Indication Evolution (The Flagship Time-Travel Demo)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// DEPRECATED: Pre-SELECT era claim (what we "knew" before March 2024)
|
||
// This was the truth until SELECT trial changed everything
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "fda_cv_indication",
|
||
Value: steme.NewTextValue("Not approved for cardiovascular risk reduction (obesity indication only)"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleDeprecated, // Was true, now superseded
|
||
Source: Sources["FDA_WEGOVY_LABEL_2021"],
|
||
})
|
||
|
||
// APPROVED: Post-SELECT era claim (current truth)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "fda_cv_indication",
|
||
Value: steme.NewTextValue("Approved for cardiovascular risk reduction in adults with obesity and established CVD"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL_2024_CV"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 2: SELECT Trial Knowledge Evolution
|
||
// -------------------------------------------------------------------------
|
||
|
||
// DEPRECATED: Interim data (what experts believed before final results)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "cv_benefit_evidence",
|
||
Value: steme.NewTextValue("SELECT trial ongoing; interim analysis suggests potential CV benefit (unpublished)"),
|
||
Confidence: 0.75,
|
||
Lifecycle: steme.LifecycleDeprecated, // Superseded by final results
|
||
Source: Sources["TRIAL_SELECT_INTERIM"],
|
||
})
|
||
|
||
// APPROVED: Final published results
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "Semaglutide:CardiovascularDisease",
|
||
Predicate: "cv_benefit_evidence",
|
||
Value: steme.NewTextValue("SELECT trial final: 20% reduction in MACE (HR 0.80, 95% CI 0.72-0.90, p<0.001)"),
|
||
Confidence: 0.97,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SELECT_FINAL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 3: ADA Guidelines Evolution (Pre/Post SELECT)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// DEPRECATED: 2023 ADA guidelines (before SELECT results influenced guidelines)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "guideline_cv_recommendation",
|
||
Value: steme.NewTextValue("ADA 2023: GLP-1 agonists preferred for T2D with established ASCVD (based on SUSTAIN-6/LEADER data)"),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleDeprecated,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES_2023"],
|
||
})
|
||
|
||
// APPROVED: 2024 ADA guidelines (stronger CV recommendation post-SELECT)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide:Type2Diabetes",
|
||
Predicate: "guideline_cv_recommendation",
|
||
Value: steme.NewTextValue("ADA 2024: Semaglutide now recommended FIRST for obesity with established CVD, even without T2D"),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["EXPERT_ADA_GUIDELINES_2024"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 4: Tirzepatide Indication Evolution (T2D → Obesity)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// DEPRECATED: Original T2D-only approval
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "fda_approved_indications_history",
|
||
Value: steme.NewTextValue("Approved for type 2 diabetes only (not yet approved for weight management)"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleDeprecated,
|
||
Source: Sources["FDA_MOUNJARO_LABEL_2022"],
|
||
})
|
||
|
||
// APPROVED: Current dual indication
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Tirzepatide",
|
||
Predicate: "fda_approved_indications_history",
|
||
Value: steme.NewTextValue("Approved for type 2 diabetes (Mounjaro) AND chronic weight management (Zepbound)"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_ZEPBOUND_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 5: Semaglutide Initial Approval History
|
||
// -------------------------------------------------------------------------
|
||
|
||
// DEPRECATED: Original 2017 approval (T2D only, no weight indication)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "fda_approved_indications_history",
|
||
Value: steme.NewTextValue("2017: Approved for type 2 diabetes only (Ozempic 0.5mg and 1mg)"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleDeprecated,
|
||
Source: Sources["FDA_OZEMPIC_LABEL_2017"],
|
||
})
|
||
|
||
// UNDER_REVIEW: 2021 expansion (weight added, CV pending)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "fda_approved_indications_history",
|
||
Value: steme.NewTextValue("2021: Added chronic weight management indication (Wegovy 2.4mg)"),
|
||
Confidence: 0.98,
|
||
Lifecycle: steme.LifecycleDeprecated, // Also superseded by 2024
|
||
Source: Sources["FDA_WEGOVY_LABEL_2021"],
|
||
})
|
||
|
||
// APPROVED: Current full indication set
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "fda_approved_indications_history",
|
||
Value: steme.NewTextValue("2024: T2D (Ozempic) + Weight Management (Wegovy) + CV Risk Reduction in Obesity (Wegovy)"),
|
||
Confidence: 0.99,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL_2024_CV"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 6: Gastroparesis Warning Evolution
|
||
// -------------------------------------------------------------------------
|
||
|
||
// PROPOSED: Early signal (before formal FDA acknowledgment)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_fda_warning_status",
|
||
Value: steme.NewTextValue("Signal detected in FAERS; no formal FDA warning yet"),
|
||
Confidence: 0.78,
|
||
Lifecycle: steme.LifecycleDeprecated,
|
||
Source: Sources["RWE_FAERS_SEMAGLUTIDE"],
|
||
})
|
||
|
||
// APPROVED: Current FDA acknowledgment
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: "Semaglutide",
|
||
Predicate: "gastroparesis_fda_warning_status",
|
||
Value: steme.NewTextValue("FDA added gastroparesis to adverse reactions; investigating serious GI events"),
|
||
Confidence: 0.95,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["FDA_WEGOVY_LABEL"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 7: Expert Opinion Evolution on Muscle Loss
|
||
// -------------------------------------------------------------------------
|
||
|
||
// PROPOSED: Initial concern (raised after early data)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "lean_mass_concern_status",
|
||
Value: steme.NewTextValue("Emerging concern: 39% of weight loss from lean mass (STEP 1); needs monitoring"),
|
||
Confidence: 0.80,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: Sources["TRIAL_STEP_1"],
|
||
})
|
||
|
||
// UNDER_REVIEW: Current active debate
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Semaglutide",
|
||
Predicate: "lean_mass_concern_status",
|
||
Value: steme.NewTextValue("Active debate: resistance exercise recommended; protein intake guidance being developed"),
|
||
Confidence: 0.82,
|
||
Lifecycle: steme.LifecycleUnderReview,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// -------------------------------------------------------------------------
|
||
// SCENARIO 8: Tirzepatide vs Semaglutide Comparative Evolution
|
||
// -------------------------------------------------------------------------
|
||
|
||
// PROPOSED: Early comparison (before head-to-head data)
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "comparative_efficacy_status",
|
||
Value: steme.NewTextValue("Cross-trial comparison suggests tirzepatide may be more effective; no head-to-head data"),
|
||
Confidence: 0.70,
|
||
Lifecycle: steme.LifecycleDeprecated,
|
||
Source: Sources["EXPERT_ENDOCRINE_SOCIETY"],
|
||
})
|
||
|
||
// APPROVED: Now with more robust comparison
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Tirzepatide:Semaglutide:ChronicWeightManagement",
|
||
Predicate: "comparative_efficacy_status",
|
||
Value: steme.NewTextValue("Tirzepatide demonstrates ~5-7% greater weight loss vs semaglutide at max doses; dual mechanism confirmed"),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: Sources["TRIAL_SURMOUNT_1"],
|
||
})
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// printHistoricalDemoCommands prints curl commands for the P2.4 time-travel demos.
|
||
func printHistoricalDemoCommands() {
|
||
fmt.Println("--- P2.4: Historical Data (Time-Travel) Demo ---")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# THE FLAGSHIP TIME-TRAVEL DEMO: Semaglutide CV Indication")
|
||
fmt.Println("# Before March 2024: Not approved for CV risk reduction")
|
||
fmt.Println("# After March 2024: Approved for CV risk reduction")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query CURRENT state (should show CV indication APPROVED)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide:CardiovascularDisease&predicate=fda_cv_indication" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query HISTORICAL state (before March 2024 - should show DEPRECATED claim)")
|
||
fmt.Println("# Note: as_of uses Unix timestamp. 1704067200 = Jan 1, 2024")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide:CardiovascularDisease&predicate=fda_cv_indication&as_of=1704067200" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query SELECT trial knowledge evolution")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide:CardiovascularDisease&predicate=cv_benefit_evidence" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query guideline evolution (ADA 2023 vs 2024)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide:Type2Diabetes&predicate=guideline_cv_recommendation" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query Semaglutide indication history (shows lifecycle progression)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Semaglutide&predicate=fda_approved_indications_history" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# Query Tirzepatide indication evolution (T2D → Obesity)")
|
||
fmt.Println(`curl -s "http://localhost:18180/v1/skeptic?subject=Tirzepatide&predicate=fda_approved_indications_history" | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# AUDIT TRAIL: See lifecycle stages with timestamps")
|
||
fmt.Println("# Each claim shows when it was proposed, approved, or deprecated")
|
||
fmt.Println("# This is the regulatory audit answer: 'What did your system know on Date X?'")
|
||
fmt.Println()
|
||
}
|
||
|
||
// =============================================================================
|
||
// P2.3: CASCADE INVALIDATION DEMO DATA (Retractable Sources)
|
||
// =============================================================================
|
||
|
||
// populateCascadeData creates 110 assertions across 8 categories, all citing
|
||
// the CARDIOVASC_MEGA_TRIAL landmark study. When this source is quarantined,
|
||
// all 110 assertions are affected, demonstrating the "visceral cascade effect."
|
||
//
|
||
// This enables "Aha Moment #2: Cascade invalidation when source retracted."
|
||
//
|
||
// Categories (110 total):
|
||
// - Primary CV Outcomes: 15 (3 drugs × 5 predicates)
|
||
// - Secondary CV Outcomes: 15 (3 drugs × 5 predicates)
|
||
// - CV Biomarkers: 15 (3 drugs × 5 predicates)
|
||
// - Subgroup Analyses: 20 (4 populations × 5 results)
|
||
// - Expert Guidelines: 15 (5 bodies × 3 recommendations)
|
||
// - Real-World Evidence: 15 (3 databases × 5 outcomes)
|
||
// - Comparative Efficacy: 10 (5 FDA + 5 expert comparisons)
|
||
// - Community Reactions: 5 (social media awareness)
|
||
//
|
||
// Agent Distribution:
|
||
// - clinicaltrials:study-importer (T1): 50 assertions
|
||
// - pubmed:abstract-indexer (T2): 30 assertions
|
||
// - internal:clinical-ops-reviewer (T3): 20 assertions
|
||
// - fda:drug-label-ingestor (T0): 5 assertions
|
||
// - reddit:health-discussion-scraper (T5): 5 assertions
|
||
func populateCascadeData(ctx context.Context, registry *AgentRegistry, baseURL string) int {
|
||
configs := []DrugAssertionConfig{}
|
||
source := Sources["CARDIOVASC_MEGA_TRIAL"]
|
||
|
||
// Drug names for iteration
|
||
drugs := []string{"Semaglutide", "Liraglutide", "Tirzepatide"}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 1: Primary CV Outcomes (15 assertions - 3 drugs × 5 predicates)
|
||
// Agent: clinicaltrials:study-importer (T1)
|
||
// -------------------------------------------------------------------------
|
||
primaryPredicates := []struct {
|
||
predicate string
|
||
description string
|
||
value float64
|
||
}{
|
||
{"mace_reduction_percent", "Major adverse cardiovascular events reduction", 0.18},
|
||
{"cv_death_reduction_percent", "Cardiovascular death reduction", 0.15},
|
||
{"mi_reduction_percent", "Myocardial infarction reduction", 0.21},
|
||
{"stroke_reduction_percent", "Stroke reduction", 0.17},
|
||
{"hospitalization_hf_reduction_percent", "Heart failure hospitalization reduction", 0.24},
|
||
}
|
||
|
||
drugEffects := map[string]float64{"Semaglutide": 1.0, "Liraglutide": 0.85, "Tirzepatide": 1.1}
|
||
|
||
for _, drug := range drugs {
|
||
for _, pred := range primaryPredicates {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: drug + ":CardiovascularOutcomes:MEGA",
|
||
Predicate: pred.predicate,
|
||
Value: steme.NewNumberValue(pred.value * drugEffects[drug]),
|
||
Confidence: 0.94,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 2: Secondary CV Outcomes (15 assertions - 3 drugs × 5 predicates)
|
||
// Agent: clinicaltrials:study-importer (T1)
|
||
// -------------------------------------------------------------------------
|
||
secondaryPredicates := []struct {
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"all_cause_mortality_reduction", "12% reduction in all-cause mortality"},
|
||
{"revascularization_reduction", "19% reduction in coronary revascularization"},
|
||
{"cardiovascular_mortality_hr", "HR 0.83 (95% CI 0.72-0.96)"},
|
||
{"time_to_first_mace_days", "Extended time to first MACE event by 47 days median"},
|
||
{"composite_renal_cv_endpoint", "22% reduction in composite renal-cardiovascular endpoint"},
|
||
}
|
||
|
||
for _, drug := range drugs {
|
||
for _, pred := range secondaryPredicates {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: drug + ":CardiovascularOutcomes:MEGA",
|
||
Predicate: pred.predicate,
|
||
Value: steme.NewTextValue(fmt.Sprintf("%s: %s", drug, pred.value)),
|
||
Confidence: 0.92,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 3: CV Biomarkers (15 assertions - 3 drugs × 5 predicates)
|
||
// Agent: pubmed:abstract-indexer (T2)
|
||
// -------------------------------------------------------------------------
|
||
biomarkerPredicates := []struct {
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"systolic_bp_reduction_mmhg", "Systolic BP reduced by 5.2 mmHg"},
|
||
{"ldl_cholesterol_reduction_percent", "LDL-C reduced by 8%"},
|
||
{"triglycerides_reduction_percent", "Triglycerides reduced by 15%"},
|
||
{"hscrp_reduction_percent", "hs-CRP reduced by 22%"},
|
||
{"hba1c_improvement_percent", "HbA1c improved by 0.8%"},
|
||
}
|
||
|
||
for _, drug := range drugs {
|
||
for _, pred := range biomarkerPredicates {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: drug + ":Biomarkers:MEGA",
|
||
Predicate: pred.predicate,
|
||
Value: steme.NewTextValue(fmt.Sprintf("%s: %s", drug, pred.value)),
|
||
Confidence: 0.88,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 4: Subgroup Analyses (20 assertions - 4 populations × 5 combos)
|
||
// Agent: clinicaltrials:study-importer (T1)
|
||
// -------------------------------------------------------------------------
|
||
subgroups := []string{
|
||
"PriorMI",
|
||
"HeartFailure",
|
||
"CKD_Stage3plus",
|
||
"Elderly65plus",
|
||
}
|
||
|
||
subgroupResults := []struct {
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"subgroup_mace_benefit", "Consistent MACE benefit observed"},
|
||
{"subgroup_mortality_benefit", "Mortality benefit maintained"},
|
||
{"subgroup_interaction_pvalue", "No significant interaction (p>0.05)"},
|
||
{"subgroup_safety_profile", "Safety profile consistent with overall population"},
|
||
{"subgroup_efficacy_maintained", "Efficacy maintained across baseline characteristics"},
|
||
}
|
||
|
||
for _, subgroup := range subgroups {
|
||
for _, result := range subgroupResults {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "clinicaltrials:study-importer",
|
||
Subject: "GLP1:Subgroup:" + subgroup + ":MEGA",
|
||
Predicate: result.predicate,
|
||
Value: steme.NewTextValue(fmt.Sprintf("%s in %s: %s", "GLP-1 class", subgroup, result.value)),
|
||
Confidence: 0.90,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 5: Expert Guidelines (15 assertions - 5 bodies × 3 recommendations)
|
||
// Agent: internal:clinical-ops-reviewer (T3)
|
||
// -------------------------------------------------------------------------
|
||
guidelineBodies := []string{
|
||
"ADA",
|
||
"ACC_AHA",
|
||
"ESC",
|
||
"EndocrineSociety",
|
||
"AACE",
|
||
}
|
||
|
||
recommendations := []struct {
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"cv_indication_recommendation", "Recommends GLP-1 for CV risk reduction based on CARDIOVASC-MEGA"},
|
||
{"first_line_cv_therapy", "Elevated to first-line therapy for patients with established CVD"},
|
||
{"guideline_update_2024", "2024 guideline update incorporates CARDIOVASC-MEGA findings"},
|
||
}
|
||
|
||
for _, body := range guidelineBodies {
|
||
for _, rec := range recommendations {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: "Guideline:" + body + ":GLP1:MEGA",
|
||
Predicate: rec.predicate,
|
||
Value: steme.NewTextValue(fmt.Sprintf("%s: %s", body, rec.value)),
|
||
Confidence: 0.91,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 6: Real-World Evidence (15 assertions - 3 databases × 5 outcomes)
|
||
// Agent: pubmed:abstract-indexer (T2)
|
||
// -------------------------------------------------------------------------
|
||
rweDatabases := []string{
|
||
"TriNetX",
|
||
"Optum",
|
||
"IQVIA",
|
||
}
|
||
|
||
rweOutcomes := []struct {
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"rwe_mace_validation", "Real-world MACE reduction consistent with CARDIOVASC-MEGA trial"},
|
||
{"rwe_adherence_cv_benefit", "Higher adherence correlated with greater CV benefit"},
|
||
{"rwe_mortality_signal", "Real-world mortality reduction observed"},
|
||
{"rwe_hospitalization_reduction", "Reduced CV hospitalizations in real-world cohort"},
|
||
{"rwe_cost_effectiveness", "Cost-effective at current pricing when CV benefits included"},
|
||
}
|
||
|
||
for _, db := range rweDatabases {
|
||
for _, outcome := range rweOutcomes {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "pubmed:abstract-indexer",
|
||
Subject: "RWE:" + db + ":GLP1:MEGA",
|
||
Predicate: outcome.predicate,
|
||
Value: steme.NewTextValue(fmt.Sprintf("%s analysis: %s", db, outcome.value)),
|
||
Confidence: 0.85,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// CATEGORY 7: Comparative Efficacy (10 assertions - head-to-head comparisons)
|
||
// Mixed agents: fda:drug-label-ingestor (T0), internal:clinical-ops-reviewer (T3)
|
||
// -------------------------------------------------------------------------
|
||
|
||
// FDA-derived comparisons (5 assertions)
|
||
fdaComparisons := []struct {
|
||
subject string
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"Tirzepatide:Semaglutide:CV", "comparative_mace_reduction", "Tirzepatide showed numerically greater MACE reduction (22% vs 18%)"},
|
||
{"Semaglutide:Liraglutide:CV", "comparative_mace_reduction", "Semaglutide showed greater CV benefit than liraglutide (18% vs 13%)"},
|
||
{"GLP1:Placebo:CV", "class_effect_mace", "GLP-1 class demonstrates consistent MACE reduction vs placebo"},
|
||
{"Tirzepatide:Placebo:CV", "mace_superiority", "Tirzepatide superior to placebo for MACE prevention"},
|
||
{"Semaglutide:Placebo:CV", "mace_superiority", "Semaglutide superior to placebo for MACE prevention"},
|
||
}
|
||
|
||
for _, comp := range fdaComparisons {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "fda:drug-label-ingestor",
|
||
Subject: comp.subject + ":MEGA",
|
||
Predicate: comp.predicate,
|
||
Value: steme.NewTextValue(comp.value),
|
||
Confidence: 0.96,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
|
||
// Expert-derived comparisons (5 assertions)
|
||
expertComparisons := []struct {
|
||
subject string
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"GLP1:DualAgonist:CV", "mechanism_comparison", "Dual GIP/GLP-1 agonism may provide additional CV benefit"},
|
||
{"GLP1:SGLT2:CV", "combination_benefit", "GLP-1 + SGLT2 combination shows additive CV protection"},
|
||
{"GLP1:WeightLoss:CV", "mediation_analysis", "~40% of CV benefit mediated through weight loss"},
|
||
{"GLP1:GlycemicControl:CV", "mediation_analysis", "~30% of CV benefit independent of glycemic control"},
|
||
{"GLP1:ClassEffect:CV", "heterogeneity_assessment", "No significant heterogeneity across GLP-1 agents"},
|
||
}
|
||
|
||
for _, comp := range expertComparisons {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "internal:clinical-ops-reviewer",
|
||
Subject: comp.subject + ":MEGA",
|
||
Predicate: comp.predicate,
|
||
Value: steme.NewTextValue(comp.value),
|
||
Confidence: 0.87,
|
||
Lifecycle: steme.LifecycleApproved,
|
||
Source: source,
|
||
})
|
||
}
|
||
|
||
// -------------------------------------------------------------------------
|
||
// BONUS: Reddit/Community reactions (5 assertions)
|
||
// Agent: reddit:health-discussion-scraper (T5)
|
||
// These show even anecdotal sources citing the landmark study
|
||
// -------------------------------------------------------------------------
|
||
communityReactions := []struct {
|
||
subject string
|
||
predicate string
|
||
value string
|
||
}{
|
||
{"Semaglutide:Community:MEGA", "patient_awareness", "CARDIOVASC-MEGA results widely discussed; patients asking doctors about CV benefits"},
|
||
{"Tirzepatide:Community:MEGA", "patient_interest", "High patient interest in tirzepatide following MEGA trial results"},
|
||
{"GLP1:Community:MEGA", "insurance_impact", "Patients reporting improved insurance coverage citing CV outcomes data"},
|
||
{"Ozempic:Community:MEGA", "prescription_trends", "Increased prescriptions for CV protection, not just weight loss"},
|
||
{"Mounjaro:Community:MEGA", "comparative_discussions", "Community debates tirzepatide vs semaglutide CV benefits"},
|
||
}
|
||
|
||
for _, reaction := range communityReactions {
|
||
configs = append(configs, DrugAssertionConfig{
|
||
Agent: "reddit:health-discussion-scraper",
|
||
Subject: reaction.subject,
|
||
Predicate: reaction.predicate,
|
||
Value: steme.NewTextValue(reaction.value),
|
||
Confidence: 0.65,
|
||
Lifecycle: steme.LifecycleProposed,
|
||
Source: source,
|
||
})
|
||
}
|
||
|
||
return submitAssertions(ctx, registry, baseURL, configs)
|
||
}
|
||
|
||
// printCascadeDemoCommands prints curl commands for the P2.3 cascade invalidation demo.
|
||
func printCascadeDemoCommands() {
|
||
// Get the source hash for the landmark study
|
||
sourceHash := Sources["CARDIOVASC_MEGA_TRIAL"].Hash()
|
||
|
||
fmt.Println("--- P2.3: CASCADE INVALIDATION DEMO ---")
|
||
fmt.Println()
|
||
fmt.Printf("Source: CARDIOVASC_MEGA_TRIAL\n")
|
||
fmt.Printf("Hash: %s\n", sourceHash)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# THE VISCERAL MOMENT: 110 assertions depend on one landmark study")
|
||
fmt.Println("# When the study is retracted, ALL 110 are instantly affected")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 1. Check impact BEFORE quarantine")
|
||
fmt.Println("# Shows: 110 assertions from 5 agents will be affected")
|
||
fmt.Printf("curl -s 'http://localhost:18180/v1/sources/%s/impact' | jq\n", sourceHash)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 2. See the assertions citing this source")
|
||
fmt.Println(`curl -s 'http://localhost:18180/v1/query?subject=Semaglutide:CardiovascularOutcomes:MEGA' | jq`)
|
||
fmt.Println(`curl -s 'http://localhost:18180/v1/query?subject=Guideline:ADA:GLP1:MEGA' | jq`)
|
||
fmt.Println(`curl -s 'http://localhost:18180/v1/query?subject=RWE:TriNetX:GLP1:MEGA' | jq`)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 3. Preview quarantine (dry run - shows what WOULD happen)")
|
||
fmt.Printf("curl -X POST 'http://localhost:18180/v1/sources/%s/quarantine' \\\n", sourceHash)
|
||
fmt.Println(" -H 'Content-Type: application/json' \\")
|
||
fmt.Println(" -d '{\"preview\": true, \"reason\": \"Data integrity concerns - methodology under review\"}' | jq")
|
||
fmt.Println()
|
||
fmt.Println("# Expected: \"Preview: Quarantining would affect 110 assertions\"")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 4. Execute the quarantine (THE MAGIC MOMENT)")
|
||
fmt.Printf("curl -X POST 'http://localhost:18180/v1/sources/%s/quarantine' \\\n", sourceHash)
|
||
fmt.Println(" -H 'Content-Type: application/json' \\")
|
||
fmt.Println(" -d '{\"preview\": false, \"reason\": \"Study retracted: data fabrication confirmed\"}' | jq")
|
||
fmt.Println()
|
||
fmt.Println("# Expected: status: \"quarantined\", affected_assertions: 105")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 5. Verify the cascade - queries now exclude quarantined source assertions")
|
||
fmt.Println(`curl -s 'http://localhost:18180/v1/skeptic?subject=Semaglutide:CardiovascularOutcomes:MEGA&predicate=mace_reduction_percent' | jq`)
|
||
fmt.Println()
|
||
fmt.Println("# Expected: Empty or reduced results (assertions quarantined)")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 6. Check quarantine impact across all affected subjects")
|
||
fmt.Printf("curl -s 'http://localhost:18180/v1/sources/%s/impact' | jq '.affected_subjects'\n", sourceHash)
|
||
fmt.Println()
|
||
|
||
fmt.Println("# 7. Restore the source (if the study is later cleared)")
|
||
fmt.Printf("curl -X POST 'http://localhost:18180/v1/sources/%s/restore' \\\n", sourceHash)
|
||
fmt.Println(" -H 'Content-Type: application/json' \\")
|
||
fmt.Println(" -d '{\"reason\": \"Independent review complete - data integrity confirmed\"}' | jq")
|
||
fmt.Println()
|
||
fmt.Println("# Expected: status: \"active\", 110 assertions restored")
|
||
fmt.Println()
|
||
|
||
fmt.Println("# TALKING POINTS:")
|
||
fmt.Println("# - \"One source retraction, 110 assertions instantly affected\"")
|
||
fmt.Println("# - \"Preview mode shows impact BEFORE you commit\"")
|
||
fmt.Println("# - \"Restore capability for false positives\"")
|
||
fmt.Println("# - \"Full audit trail: who quarantined, when, why\"")
|
||
fmt.Println("# - \"Your regulatory team can answer: 'Which assertions cited that retracted study?'\"")
|
||
fmt.Println()
|
||
}
|