data.ts (4599B)
1 export interface ChecklistItem { 2 category: string; 3 question: string; 4 applies: boolean; 5 answer: boolean; 6 justification: string; 7 } 8 9 export interface Claim { 10 claim: string; 11 supported: string; 12 } 13 14 export interface RedFlag { 15 flag: string; 16 detail: string; 17 } 18 19 export interface PaperIndex { 20 id: string; 21 title: string; 22 year: number; 23 venue: string; 24 tags: string[]; 25 score: number | null; 26 archetype: string | null; 27 games: string[]; 28 arxiv_id: string; 29 doi: string; 30 code_url: string | null; 31 dna: (number | null)[] | null; 32 paper_type: string | null; 33 engagement: (number | null)[] | null; 34 } 35 36 export interface PaperDetail extends PaperIndex { 37 category_scores: Record<string, number>; 38 claims: Claim[]; 39 red_flags: RedFlag[]; 40 checklist: ChecklistItem[]; 41 key_findings: string; 42 active_modules: string[]; 43 source_url: string; 44 } 45 46 export interface HistBin { 47 lo: number; 48 hi: number; 49 count: number; 50 } 51 52 export interface Pipeline { 53 registry_total: number; 54 v5_opus: number; 55 v5_haiku: number; 56 deprecated_scan: number; 57 not_scanned: number; 58 } 59 60 export interface Dashboard { 61 n: number; 62 median: number; 63 mean: number; 64 full_reproducibility_pct: number; 65 histogram: HistBin[]; 66 category_rates: Record<string, number>; 67 year_trends: Record<string, { n: number; mean: number; median: number }>; 68 game_pcts: Record<string, number>; 69 archetype_counts: Record<string, number>; 70 tag_counts: Record<string, number>; 71 pipeline: Pipeline; 72 } 73 74 export interface QuestionRate { 75 rate: number; 76 n: number; 77 } 78 79 export interface GroupStat { 80 n: number; 81 mean: number; 82 median: number; 83 } 84 85 export interface Findings { 86 question_rates: Record<string, QuestionRate>; 87 year_category_trends: Record<string, Record<string, number>>; 88 venue_stats: Record<string, GroupStat>; 89 citation_band_stats: Record<string, GroupStat>; 90 optimism_rigor: Record<string, { positive_n: number; positive_mean: number; nuanced_n: number; nuanced_mean: number; gap: number }>; 91 homophily: { threshold: number; baseline_pct: number; high_cite_high_pct: number; high_cite_total: number }; 92 sampling_effect: { checkpoints: { n: number; median: number }[] }; 93 benchmark_monoculture: Record<string, { benchmark_only: number; total: number; pct: number }>; 94 funding_gap: Record<string, GroupStat>; 95 repro_detail: Record<string, QuestionRate | number> & { full_pass_count: number; full_pass_pct: number }; 96 game_pcts: Record<string, number>; 97 network_insights: { 98 foundational: { id: string; title: string; in_degree: number; score: number | null }[]; 99 quality_contagion: Record<string, { n: number; mean: number }>; 100 rigor_diffusion: { id: string; title: string; score: number | null; in_degree: number; citer_mean: number | null; citer_n: number }[]; 101 }; 102 correlation: { 103 categories: string[]; 104 matrix: { r: number | null; n: number }[][]; 105 }; 106 pca: { 107 points: { id: string; x: number; y: number; archetype: string; score: number }[]; 108 categories: string[]; 109 pc1_loadings: number[]; 110 pc2_loadings: number[]; 111 pc1_variance_pct: number; 112 pc2_variance_pct: number; 113 }; 114 } 115 116 export interface TensionClaim { 117 paper_id: string; 118 claim: string; 119 supported: string; 120 score: number; 121 year: number | null; 122 } 123 124 export interface TensionSides { 125 positive: TensionClaim[]; 126 nuanced: TensionClaim[]; 127 } 128 129 export interface Tensions { 130 productivity: TensionSides; 131 benchmarks: TensionSides; 132 agents: TensionSides; 133 security: TensionSides; 134 code_quality: TensionSides; 135 scaling: TensionSides; 136 [key: string]: TensionSides; 137 } 138 139 export interface NetNode { 140 id: string; 141 title: string; 142 score: number | null; 143 year: number | null; 144 in_degree: number; 145 out_degree: number; 146 has_scan: boolean; 147 } 148 149 export interface CitationNetwork { 150 nodes: NetNode[]; 151 edges: [string, string][]; 152 } 153 154 const cache: Record<string, unknown> = {}; 155 156 async function fetchJson<T>(path: string): Promise<T> { 157 if (cache[path]) return cache[path] as T; 158 const resp = await fetch(path); 159 const data = await resp.json(); 160 cache[path] = data; 161 return data as T; 162 } 163 164 export const loadDashboard = () => fetchJson<Dashboard>('/data/dashboard.json'); 165 export const loadFindings = () => fetchJson<Findings>('/data/findings.json'); 166 export const loadPapersIndex = () => fetchJson<PaperIndex[]>('/data/papers-index.json'); 167 export const loadPaperDetail = (slug: string) => fetchJson<PaperDetail>(`/data/papers/${slug}.json`); 168 export const loadNetwork = () => fetchJson<CitationNetwork>('/data/network.json'); 169 export const loadTensions = () => fetchJson<Tensions>('/data/tensions.json');