Lê Đăng Khoa (Liam) commited on
Commit
a747c59
·
verified ·
1 Parent(s): 3e00f57

Upload 6 files

Browse files
Files changed (7) hide show
  1. .gitattributes +1 -0
  2. assets/.DS_Store +0 -0
  3. assets/app.js +558 -267
  4. assets/logo.png +3 -0
  5. assets/logo.svg +16 -7
  6. assets/style.css +668 -0
  7. index.html +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ assets/logo.png filter=lfs diff=lfs merge=lfs -text
assets/.DS_Store CHANGED
Binary files a/assets/.DS_Store and b/assets/.DS_Store differ
 
assets/app.js CHANGED
@@ -1,296 +1,587 @@
1
- // Enhanced theme toggle with smooth transitions
2
- const toggle = document.getElementById('themeToggle');
3
- const root = document.documentElement;
4
- const saved = localStorage.getItem('theme') || 'dark';
5
 
6
- // Apply saved theme
7
- if (saved === 'light') {
8
- document.documentElement.classList.remove('dark');
9
- } else {
10
- document.documentElement.classList.add('dark');
11
- }
12
 
13
- // Update theme toggle icon
14
- const updateThemeIcon = () => {
15
- const icon = toggle?.querySelector('i');
16
- if (icon) {
17
- icon.setAttribute('data-lucide', document.documentElement.classList.contains('dark') ? 'sun-medium' : 'moon');
18
- if (window.lucide) {
19
- lucide.createIcons();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  }
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  };
23
 
24
- // Initialize theme icon
25
- updateThemeIcon();
 
 
26
 
27
- toggle?.addEventListener('click', () => {
28
- const isDark = document.documentElement.classList.toggle('dark');
29
- localStorage.setItem('theme', isDark ? 'dark' : 'light');
30
- updateThemeIcon();
31
-
32
- // Add smooth transition effect
33
- document.body.style.transition = 'background-color 0.3s ease, color 0.3s ease';
34
- setTimeout(() => {
35
- document.body.style.transition = '';
36
- }, 300);
37
- });
38
 
39
- // Enhanced tabs logic with smooth transitions and ARIA support
40
- document.querySelectorAll('.tab').forEach(btn => {
41
- btn.addEventListener('click', () => {
42
- // Remove active class and ARIA attributes from all tabs
43
- document.querySelectorAll('.tab').forEach(b => {
44
- b.classList.remove('active');
45
- b.setAttribute('aria-selected', 'false');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  });
47
-
48
- // Add active class and ARIA attributes to clicked tab
49
- btn.classList.add('active');
50
- btn.setAttribute('aria-selected', 'true');
51
-
52
- // Get target diagram
53
- const target = btn.getAttribute('data-target');
54
- const targetDiagram = document.querySelector(target);
55
-
56
- if (targetDiagram) {
57
- // Hide all diagrams completely and update ARIA
58
- document.querySelectorAll('.diagram').forEach(d => {
59
- d.style.opacity = '0';
60
- d.style.transform = 'translateY(20px)';
61
- d.style.display = 'none';
62
- d.setAttribute('aria-hidden', 'true');
63
- d.classList.remove('visible');
64
- });
65
-
66
- // Show target diagram with fade in and update ARIA
67
- setTimeout(() => {
68
- targetDiagram.style.display = 'block';
69
- targetDiagram.classList.add('visible');
70
- targetDiagram.style.opacity = '1';
71
- targetDiagram.style.transform = 'translateY(0)';
72
- targetDiagram.setAttribute('aria-hidden', 'false');
73
- }, 150);
74
- }
75
  });
76
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
78
- // Initialize first tab as active and show first diagram
79
- document.addEventListener('DOMContentLoaded', () => {
80
- // Hide all diagrams except the first one
81
- document.querySelectorAll('.diagram').forEach((diagram, index) => {
82
- if (index === 0) {
83
- // First diagram should be visible
84
- diagram.style.display = 'block';
85
- diagram.style.opacity = '1';
86
- diagram.style.transform = 'translateY(0)';
87
- diagram.classList.add('visible');
88
- diagram.setAttribute('aria-hidden', 'false');
89
- } else {
90
- // Other diagrams should be hidden
91
- diagram.style.display = 'none';
92
- diagram.style.opacity = '0';
93
- diagram.style.transform = 'translateY(20px)';
94
- diagram.classList.remove('visible');
95
- diagram.setAttribute('aria-hidden', 'true');
96
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  });
98
-
99
- // Ensure Mermaid diagrams are properly initialized
100
- if (window.mermaid) {
101
- mermaid.init(undefined, document.querySelectorAll('.mermaid'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
103
- });
 
 
 
 
 
 
 
 
 
 
104
 
105
- // Enhanced metric counters with better performance
106
- const counters = document.querySelectorAll('.metric-value');
107
- const easeOutCubic = t => 1 - Math.pow(1 - t, 3);
108
- const easeOutQuart = t => 1 - Math.pow(1 - t, 4);
 
 
 
 
 
 
109
 
110
- const animateCount = (el, to, duration = 1200) => {
111
- const start = performance.now();
112
- const from = 0;
113
- const isLargeNumber = to > 1000;
114
- const easing = isLargeNumber ? easeOutQuart : easeOutCubic;
115
-
116
- // Ensure the element has proper positioning
117
- el.style.position = 'relative';
118
- el.style.zIndex = '2';
119
- el.style.width = '100%';
120
- el.style.textAlign = 'center';
121
- el.style.display = 'block';
122
-
123
- const step = (now) => {
124
- const p = Math.min(1, (now - start) / duration);
125
- const v = Math.floor(from + (to - from) * easing(p));
126
-
127
- // Format number with appropriate separators
128
- if (to >= 1000000) {
129
- el.textContent = (v / 1000000).toFixed(1) + 'M';
130
- } else if (to >= 1000) {
131
- el.textContent = (v / 1000).toFixed(1) + 'K';
132
- } else {
133
- el.textContent = v.toLocaleString();
134
- }
135
-
136
- if (p < 1) {
137
- requestAnimationFrame(step);
138
- } else {
139
- // Ensure final value is exact
140
- if (to >= 1000000) {
141
- el.textContent = (to / 1000000).toFixed(1) + 'M';
142
- } else if (to >= 1000) {
143
- el.textContent = (to / 1000).toFixed(1) + 'K';
144
- } else {
145
- el.textContent = to.toLocaleString();
146
- }
147
- }
148
  };
149
- requestAnimationFrame(step);
150
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
- // Enhanced intersection observer with better performance
153
- const observer = new IntersectionObserver(entries => {
154
- entries.forEach(e => {
155
- if (e.isIntersecting) {
156
- const el = e.target;
157
- const count = parseInt(el.dataset.count, 10) || 0;
158
-
159
- // Add loading state
160
- el.classList.add('loading');
161
-
162
- // Animate with slight delay for better visual effect
163
- setTimeout(() => {
164
- animateCount(el, count);
165
- el.classList.remove('loading');
166
- }, 200);
167
-
168
- observer.unobserve(el);
169
- }
170
  });
171
- }, {
172
- threshold: 0.3,
173
- rootMargin: '0px 0px -50px 0px'
174
- });
175
 
176
- // Observe counters
177
- counters.forEach(c => observer.observe(c));
 
 
 
 
 
 
 
178
 
179
- // Enhanced VanillaTilt initialization with error handling
180
- const initTilt = () => {
181
- if (window.VanillaTilt) {
182
- try {
183
- document.querySelectorAll('[data-tilt]').forEach(el => {
184
- VanillaTilt.init(el, {
185
- max: 6,
186
- speed: 400,
187
- glare: true,
188
- 'max-glare': 0.1,
189
- scale: 1.02,
190
- gyroscope: false
191
- });
192
- });
193
- } catch (error) {
194
- console.warn('VanillaTilt initialization failed:', error);
195
- }
196
- }
197
- };
198
 
199
- // Initialize tilt effects
200
- initTilt();
 
 
 
 
 
 
 
 
 
 
 
201
 
202
- // Smooth scrolling for navigation links
203
- document.querySelectorAll('a[href^="#"]').forEach(link => {
204
- link.addEventListener('click', (e) => {
205
- e.preventDefault();
206
- const targetId = link.getAttribute('href');
207
- const targetElement = document.querySelector(targetId);
208
-
209
- if (targetElement) {
210
- const headerHeight = document.querySelector('header')?.offsetHeight || 0;
211
- const targetPosition = targetElement.offsetTop - headerHeight - 20;
212
-
213
- window.scrollTo({
214
- top: targetPosition,
215
- behavior: 'smooth'
216
- });
217
- }
218
- });
219
- });
220
 
221
- // Enhanced error handling for external resources
222
- const handleResourceError = (resource, fallback) => {
223
- resource.addEventListener('error', () => {
224
- console.warn(`Failed to load resource, using fallback`);
225
- if (fallback) {
226
- resource.src = fallback;
227
- }
 
 
 
228
  });
229
- };
230
 
231
- // Handle external script loading errors
232
- window.addEventListener('error', (e) => {
233
- if (e.target.tagName === 'SCRIPT' && e.target.src) {
234
- console.warn(`Script failed to load: ${e.target.src}`);
235
- }
236
- });
 
 
237
 
238
- // Performance monitoring
239
- const logPerformance = () => {
240
- if ('performance' in window) {
241
- window.addEventListener('load', () => {
242
- setTimeout(() => {
243
- const perfData = performance.getEntriesByType('navigation')[0];
244
- console.log(`Page load time: ${perfData.loadEventEnd - perfData.loadEventStart}ms`);
245
- }, 0);
246
- });
247
- }
248
- };
249
 
250
- // Initialize performance monitoring
251
- logPerformance();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
 
253
- // Add keyboard navigation support
254
- document.addEventListener('keydown', (e) => {
255
- // Tab navigation for architecture tabs
256
- if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
257
- const activeTab = document.querySelector('.tab.active');
258
- if (activeTab) {
259
- const tabs = Array.from(document.querySelectorAll('.tab'));
260
- const currentIndex = tabs.indexOf(activeTab);
261
- let nextIndex;
262
-
263
- if (e.key === 'ArrowLeft') {
264
- nextIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;
265
- } else {
266
- nextIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;
267
- }
268
-
269
- tabs[nextIndex].click();
270
- tabs[nextIndex].focus();
271
- }
272
- }
273
- });
274
 
275
- // Add loading states for dynamic content
276
- const addLoadingState = (element, duration = 1000) => {
277
- element.classList.add('loading');
278
- setTimeout(() => {
279
- element.classList.remove('loading');
280
- }, duration);
281
- };
 
 
 
 
 
 
 
 
 
 
282
 
283
- // Initialize all interactive elements
284
- document.addEventListener('DOMContentLoaded', () => {
285
- // Add loading states to cards that might load content dynamically
286
- document.querySelectorAll('.card').forEach(card => {
287
- card.addEventListener('mouseenter', () => {
288
- addLoadingState(card, 500);
289
- });
290
- });
291
-
292
- // Initialize tooltips for chips
293
- document.querySelectorAll('.chip').forEach(chip => {
294
- chip.setAttribute('title', chip.textContent);
295
- });
296
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const $ = (selector, scope = document) => scope.querySelector(selector);
2
+ const $$ = (selector, scope = document) => [...scope.querySelectorAll(selector)];
 
 
3
 
4
+ const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
 
 
 
 
 
5
 
6
+ const data = {
7
+ architecture: [
8
+ ['Input', 'Clinician input and case question are normalised before retrieval.'],
9
+ ['Patient context', 'EMR history, medications, labs, allergies, and provenance metadata shape the query.'],
10
+ ['Guidelines', 'CPG passages are retrieved with section, version, and update metadata.'],
11
+ ['Orchestrator', 'Typed artifacts coordinate retrieval sets, summaries, guideline extracts, and safety critiques.'],
12
+ ['Candidate pool', 'Dense ANN and BM25 lexical recall are unioned to protect rare terms and semantic matches.'],
13
+ ['Reranking', 'A long-context biomedical reranker scores each query-passage pair and supports calibrated thresholds.'],
14
+ ['Sufficiency', 'Facet coverage, entropy, contradictions, and marginal utility govern retrieve-more evidence actions.'],
15
+ ['Answer', 'Final output includes a grounded answer.']
16
+ ],
17
+ datasets: [
18
+ ['HealthCareMagic', 100, 'forum QA'],
19
+ ['iCliniq', 10, 'forum QA'],
20
+ ['PubMedQA labelled', 1, 'research QA'],
21
+ ['PubMedQA unlabelled', 61.2, 'KD prompts'],
22
+ ['PubMedQA synthetic', 211.3, 'multi-variant']
23
+ ],
24
+ merges: [
25
+ ['Task arithmetic', 'Adds SFT and KD deltas with magnitude control.', '#33d7ff', 'θ = θ₀ + λ(ΔSFT + ΔKD)', 'Vector addition preserves both task updates but can amplify shared directions.'],
26
+ ['NuSLERP', 'Interpolates normalised update directions to reduce norm dominance.', '#5ef7d8', 'θ = θ₀ + slerp(norm(ΔSFT), norm(ΔKD); t)', 'Normalise first, then follow the spherical arc between update directions.'],
27
+ ['DARE', 'Drops and rescales redundant update coordinates.', '#ffd166', 'θ = θ₀ + m ⊙ Δ / p', 'A Bernoulli mask removes coordinates, then rescales the survivors to preserve expectation.'],
28
+ ['TIES', 'Trims weak updates and resolves sign conflicts.', '#9b7cff', 'θᵢ = θ₀ᵢ + sign_vote(top_k(Δᵢ))', 'Weak coordinates are trimmed; conflicting signs are resolved by consensus before merging.'],
29
+ ['DARE–TIES', 'Combines stochastic sparsity with sign consensus.', '#ff6f91', 'θ = θ₀ + TIES(DARE(ΔSFT), DARE(ΔKD))', 'Sparsify noisy updates first, then merge only the agreed surviving directions.']
30
+ ],
31
+ retrievalStages: [
32
+ {
33
+ key: 'Candidate pool',
34
+ title: 'Stage 1: dense + lexical recall',
35
+ body: 'The system retrieves a broad candidate set with dense ANN search and BM25 union. This protects exact clinical terms while preserving semantic recall.',
36
+ nodes: [
37
+ ['Clinical query q', 70, 190], ['Dense ANN', 370, 105], ['BM25 lexical', 370, 275], ['Union C(q)', 660, 190]
38
+ ],
39
+ lines: [[225, 220, 360, 140], [225, 220, 360, 308], [520, 135, 650, 205], [520, 300, 650, 225]]
40
+ },
41
+ {
42
+ key: 'Biomedical rerank',
43
+ title: 'Stage 2: long-context pointwise reranking',
44
+ body: 'Each query-passage pair receives a logit and calibrated relevance probability, enabling auditable thresholds instead of uncalibrated top-K truncation.',
45
+ nodes: [
46
+ ['q + passage d', 80, 160], ['LLM reranker', 350, 205], ['Temp scaling', 620, 135], ['p̂θ(q,d)', 650, 285]
47
+ ],
48
+ lines: [[250, 190, 340, 230], [510, 230, 610, 168], [510, 245, 640, 315]]
49
+ },
50
+ {
51
+ key: 'Evidence grade',
52
+ title: 'Evidence hierarchy + source validity',
53
+ body: 'Guidelines, systematic reviews, RCTs, observational evidence, case evidence, EMR evidence, and safety evidence are separated so patient context is not confused with generalisable treatment efficacy.',
54
+ nodes: [
55
+ ['CPG / SR / RCT', 85, 115], ['EMR applicability', 105, 295], ['gEBM(d)', 410, 205], ['noise penalty', 660, 250]
56
+ ],
57
+ lines: [[255, 145, 405, 218], [285, 320, 405, 255], [555, 230, 650, 270]]
58
+ },
59
+ {
60
+ key: 'Budgeted bundle',
61
+ title: 'Utility selection under token budget B',
62
+ body: 'The bundle maximises clinical utility: facet coverage, source quality, safety relevance, contradiction resolution, and redundancy penalties under a hard token budget.',
63
+ nodes: [
64
+ ['Facet set F(q)', 90, 150], ['Utility U(q,M)', 390, 185], ['M* bundle', 650, 145], ['Audit trace', 650, 290]
65
+ ],
66
+ lines: [[250, 180, 380, 215], [550, 215, 640, 180], [550, 225, 640, 320]]
67
  }
68
+ ],
69
+ facets: [
70
+ ['Guideline concordance', 42, true],
71
+ ['Contraindications', 35, true],
72
+ ['Patient applicability', 40, true],
73
+ ['Medication interactions', 28, true],
74
+ ['Outcome evidence', 52, false],
75
+ ['Audit provenance', 58, false]
76
+ ],
77
+ retrievalEvents: [
78
+ 'Guideline agent retrieved a current CPG recommendation with section and version metadata.',
79
+ 'Safety agent added contraindication evidence with severity tags.',
80
+ 'Patient-context agent aligned lab trend and comorbidity constraints from EMR.',
81
+ 'Contradiction critic preserved a population-exclusion conflict for adjudication.',
82
+ 'Evidence-quality agent upgraded source grade using systematic-review support.',
83
+ 'Orchestrator accepted bundle after marginal utility saturated under token budget.'
84
+ ],
85
+ agents: [
86
+ ['⌁', 'Exploration agent', 'Maximises recall through dense retrieval, lexical retrieval, synonym expansion, abbreviation expansion, and specialty reformulation.', 84],
87
+ ['§', 'Guideline agent', 'Prioritises CPG and consensus recommendations, extracting strength, population, exclusions, and update date.', 91],
88
+ ['◆', 'Evidence-quality agent', 'Assigns EBM grade, study design, provenance, sample relevance, outcome relevance, and recency.', 87],
89
+ ['◈', 'Patient-context agent', 'Aligns evidence with EMR-derived comorbidities, demographics, medications, allergies, labs, and prior treatment history.', 85],
90
+ ['!', 'Safety agent', 'Searches for contraindications, adverse events, drug-drug interactions, dose restrictions, and exclusion criteria.', 93],
91
+ ['⇄', 'Contradiction critic', 'Separates true clinical conflict from population mismatch and routes unresolved high-severity conflicts forward.', 88]
92
+ ],
93
+ qa: {
94
+ medquad: [
95
+ { model: 'DaRE-TIES-KD-0.7', rouge: 0.17, bert: 0.8501, tok: 0.22, uni: 0.47, bi: 0.14 },
96
+ { model: 'NuSL-KD-0.7', rouge: 0.17, bert: 0.8500, tok: 0.21, uni: 0.47, bi: 0.11 },
97
+ { model: 'DaRE-Linear-KD-0.7', rouge: 0.17, bert: 0.8494, tok: 0.22, uni: 0.45, bi: 0.14 },
98
+ { model: 'TA-SFT-0.7', rouge: 0.16, bert: 0.8491, tok: 0.18, uni: 0.51, bi: 0.20 },
99
+ { model: '7B-KD', rouge: 0.18, bert: 0.8441, tok: 0.26, uni: 0.46, bi: 0.12 },
100
+ { model: '7B-SFT', rouge: 0.15, bert: 0.8396, tok: 0.18, uni: 0.52, bi: 0.21 },
101
+ { model: 'KD-SFT-PubMed-l', rouge: 0.17, bert: 0.8341, tok: 0.24, uni: 0.44, bi: 0.11 },
102
+ { model: 'KD-SFT-PubMed-map', rouge: 0.17, bert: 0.8297, tok: 0.22, uni: 0.47, bi: 0.12 },
103
+ { model: 'MedGemma-27b-it', rouge: 0.19, bert: 0.8465, tok: 0.27, uni: 0.40, bi: 0.09 },
104
+ { model: 'MedGemma-1.5-4b', rouge: 0.18, bert: 0.8449, tok: 0.26, uni: 0.40, bi: 0.08 },
105
+ { model: 'Gemini 3.1', rouge: 0.15, bert: 0.8490, tok: 0.26, uni: 0.36, bi: 0.08 },
106
+ { model: 'Gemini 2.5 Flash', rouge: 0.09, bert: 0.8390, tok: 0.11, uni: 0.55, bi: 0.28 },
107
+ { model: 'GPT 5.4', rouge: 0.13, bert: 0.8450, tok: 0.21, uni: 0.31, bi: 0.05 },
108
+ { model: 'Claude Sonnet 4.6', rouge: 0.12, bert: 0.8470, tok: 0.19, uni: 0.28, bi: 0.05 },
109
+ { model: 'Mistral Small', rouge: 0.14, bert: 0.8450, tok: 0.23, uni: 0.34, bi: 0.07 },
110
+ { model: 'BioMistral-7B', rouge: 0.18, bert: 0.8460, tok: 0.25, uni: 0.45, bi: 0.11 },
111
+ { model: 'MediPhi', rouge: 0.18, bert: 0.8479, tok: 0.27, uni: 0.40, bi: 0.09 },
112
+ { model: 'Meditron-7B', rouge: 0.16, bert: 0.8240, tok: 0.22, uni: 0.47, bi: 0.13 },
113
+ { model: 'MedAlpaca-7B', rouge: 0.16, bert: 0.8196, tok: 0.18, uni: 0.50, bi: 0.20 }
114
+ ],
115
+ healthbench: [
116
+ { model: 'TIES-KD-0.7-0.6', rouge: 0.16, bert: 0.8411, tok: 0.22, uni: 0.35, bi: 0.08 },
117
+ { model: 'TA-SFT-0.7', rouge: 0.16, bert: 0.8410, tok: 0.23, uni: 0.35, bi: 0.08 },
118
+ { model: 'NuSL-KD-0.7', rouge: 0.16, bert: 0.8403, tok: 0.24, uni: 0.34, bi: 0.07 },
119
+ { model: 'DaRE-TIES-KD-0.7', rouge: 0.16, bert: 0.8392, tok: 0.24, uni: 0.34, bi: 0.07 },
120
+ { model: 'DaRE-Linear-KD-0.7', rouge: 0.16, bert: 0.8388, tok: 0.24, uni: 0.34, bi: 0.07 },
121
+ { model: '7B-KD', rouge: 0.15, bert: 0.8314, tok: 0.23, uni: 0.32, bi: 0.06 },
122
+ { model: '7B-SFT', rouge: 0.13, bert: 0.8299, tok: 0.17, uni: 0.31, bi: 0.07 },
123
+ { model: 'KD-SFT-PubMed-l', rouge: 0.13, bert: 0.8186, tok: 0.20, uni: 0.32, bi: 0.06 },
124
+ { model: 'KD-SFT-PubMed-map', rouge: 0.12, bert: 0.8088, tok: 0.16, uni: 0.31, bi: 0.06 },
125
+ { model: 'MedGemma-27b-it', rouge: 0.17, bert: 0.8342, tok: 0.26, uni: 0.32, bi: 0.07 },
126
+ { model: 'MedGemma-1.5-4b', rouge: 0.16, bert: 0.8326, tok: 0.25, uni: 0.32, bi: 0.06 },
127
+ { model: 'Gemini 3.1', rouge: 0.14, bert: 0.8480, tok: 0.26, uni: 0.33, bi: 0.06 },
128
+ { model: 'Gemini 2.5 Flash', rouge: 0.08, bert: 0.8230, tok: 0.13, uni: 0.47, bi: 0.18 },
129
+ { model: 'GPT 5.4', rouge: 0.12, bert: 0.8460, tok: 0.22, uni: 0.27, bi: 0.04 },
130
+ { model: 'Claude Sonnet 4.6', rouge: 0.11, bert: 0.8440, tok: 0.20, uni: 0.24, bi: 0.04 },
131
+ { model: 'Mistral Small', rouge: 0.13, bert: 0.8470, tok: 0.23, uni: 0.30, bi: 0.06 },
132
+ { model: 'BioMistral-7B', rouge: 0.16, bert: 0.8404, tok: 0.23, uni: 0.35, bi: 0.08 },
133
+ { model: 'Meditron-7B', rouge: 0.12, bert: 0.8068, tok: 0.15, uni: 0.31, bi: 0.06 },
134
+ { model: 'MedAlpaca-7B', rouge: 0.11, bert: 0.7946, tok: 0.21, uni: 0.34, bi: 0.07 }
135
+ ]
136
+ },
137
+ reranker: [
138
+ ['MRR@10', '0.9771', 97.71, 'Relevant passages are placed extremely close to the top.'],
139
+ ['nDCG@10', '0.9826', 98.26, 'Position-sensitive ranking quality remains high after biomedical adaptation.'],
140
+ ['Recall@10', '1.0000', 100, 'The positive passage is present in the first ten results.'],
141
+ ['MAP@10', '0.9771', 97.71, 'Average precision across the ranked evidence set is high.'],
142
+ ['p95 latency', '3895.1 ms', 74, 'Long-context scoring trades latency for calibrated clinical auditability.']
143
+ ],
144
+ audit: [
145
+ ['Facet recall', 92], ['Citation precision', 88], ['Trace completeness', 96], ['Sufficiency decision', 90], ['Groundedness proxy', 86], ['Unsafe omission control', 84]
146
+ ],
147
+ release: [
148
+ ['01', 'Data engineering filters', 'License-aware fetchers, PHI scrubbing, MD5 deduplication, medically invariant augmentation filters, and dataset manifests.'],
149
+ ['02', 'Teacher-label utilities', 'Logged prompts and decoding parameters for hard-label generation plus top-k soft-label serialization.'],
150
+ ['03', 'QLoRA training scripts', '4-bit NF4, LoRA rank configuration, optimizer schedules, gradient checkpointing, early stopping, and checkpoint reconstruction.'],
151
+ ['04', 'Merge specifications', 'MergeKit YAML recipes for TA, SLERP, NuSLERP, DARE, TIES, and DARE-TIES.'],
152
+ ['05', 'Retrieval policy package', 'Dense + lexical union, long-context biomedical reranker inference, calibrated scoring hooks, evidence hierarchy, and index parameters.'],
153
+ ['06', 'Evaluation and audit harness', 'Deterministic prompting, benchmarks, trace export, policy rates, penalties, and MSAS reporting.']
154
+ ]
155
  };
156
 
157
+ let activeStage = 0;
158
+ let activeMerge = 4;
159
+ let retrievalStep = 0;
160
+ const coverageHistory = [34];
161
 
162
+ function setHTML(el, html) { if (el) el.innerHTML = html; }
163
+ function clamp(n, min, max) { return Math.max(min, Math.min(max, n)); }
164
+ function fmtScore(value, metric) {
165
+ if (metric === 'bert') return `${(value * 100).toFixed(2)}%`;
166
+ return value.toFixed(3);
167
+ }
 
 
 
 
 
168
 
169
+ function initCanvas() {
170
+ const canvas = $('#abyssCanvas');
171
+ if (!canvas || prefersReducedMotion) return;
172
+ const ctx = canvas.getContext('2d');
173
+ let w = 0, h = 0, dpr = 1;
174
+ const particles = Array.from({ length: 130 }, () => ({
175
+ x: Math.random(), y: Math.random(), r: Math.random() * 1.7 + .35,
176
+ vx: (Math.random() - .5) * .00008, vy: Math.random() * .00012 + .000035,
177
+ a: Math.random() * .45 + .12
178
+ }));
179
+ const caustics = Array.from({ length: 10 }, (_, i) => ({
180
+ y: .12 + i * .095,
181
+ speed: .00016 + Math.random() * .00018,
182
+ amp: 8 + Math.random() * 14,
183
+ alpha: .018 + Math.random() * .024
184
+ }));
185
+ function resize() {
186
+ dpr = Math.min(window.devicePixelRatio || 1, 2);
187
+ w = canvas.width = Math.floor(innerWidth * dpr);
188
+ h = canvas.height = Math.floor(innerHeight * dpr);
189
+ canvas.style.width = `${innerWidth}px`;
190
+ canvas.style.height = `${innerHeight}px`;
191
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
192
+ w = innerWidth; h = innerHeight;
193
+ }
194
+ function draw(t) {
195
+ ctx.clearRect(0, 0, w, h);
196
+ const grad = ctx.createLinearGradient(0, 0, 0, h);
197
+ grad.addColorStop(0, '#04142b'); grad.addColorStop(.48, '#020b1b'); grad.addColorStop(1, '#00040d');
198
+ ctx.fillStyle = grad; ctx.fillRect(0, 0, w, h);
199
+ // Motivation vs Logic: the page theme should feel like deep water, but the animation must stay calm enough for reading. We layer slow caustic curves and small particulate drift instead of large distracting motion.
200
+ caustics.forEach((line, i) => {
201
+ ctx.beginPath();
202
+ ctx.strokeStyle = `rgba(101,231,255,${line.alpha})`;
203
+ ctx.lineWidth = i % 3 === 0 ? 1.4 : .8;
204
+ const base = h * line.y;
205
+ for (let x = 0; x <= w; x += 18) {
206
+ const y = base + Math.sin(x * .006 + t * line.speed + i) * line.amp + Math.sin(x * .019 + t * .00011) * 3;
207
+ x ? ctx.lineTo(x, y) : ctx.moveTo(x, y);
208
+ }
209
+ ctx.stroke();
210
  });
211
+ particles.forEach(p => {
212
+ p.x += p.vx; p.y += p.vy;
213
+ if (p.x < 0) p.x = 1; if (p.x > 1) p.x = 0; if (p.y > 1) p.y = 0;
214
+ ctx.beginPath();
215
+ ctx.fillStyle = `rgba(224,250,255,${p.a})`;
216
+ ctx.arc(p.x * w, p.y * h, p.r, 0, Math.PI * 2);
217
+ ctx.fill();
218
+ });
219
+ requestAnimationFrame(draw);
220
+ }
221
+ resize();
222
+ addEventListener('resize', resize, { passive: true });
223
+ requestAnimationFrame(draw);
224
+ }
225
+
226
+ function initNavigation() {
227
+ const navToggle = $('#navToggle');
228
+ const nav = $('#siteNav');
229
+ navToggle?.addEventListener('click', () => {
230
+ const open = nav.classList.toggle('open');
231
+ navToggle.setAttribute('aria-expanded', open ? 'true' : 'false');
 
 
 
 
 
 
 
232
  });
233
+ const links = [...$$('.nav a'), ...$$('.depth-map a')];
234
+ const sections = links.map(a => $(a.getAttribute('href'))).filter(Boolean);
235
+ const observer = new IntersectionObserver(entries => {
236
+ entries.forEach(entry => {
237
+ if (!entry.isIntersecting) return;
238
+ links.forEach(a => a.classList.toggle('active', a.getAttribute('href') === `#${entry.target.id}`));
239
+ });
240
+ }, { rootMargin: '-40% 0px -55% 0px', threshold: 0.01 });
241
+ sections.forEach(s => observer.observe(s));
242
+ addEventListener('scroll', () => {
243
+ const max = document.documentElement.scrollHeight - innerHeight;
244
+ $('#readProgress').style.width = `${max > 0 ? (scrollY / max) * 100 : 0}%`;
245
+ }, { passive: true });
246
+ // Root Cause vs Logic: anchor jumps could land headings under the sticky header or leave hash targets unrevealed after a deep link. CSS sets the normal margin; this correction settles hash targets after layout finishes.
247
+ function settleHashTarget() {
248
+ const id = decodeURIComponent(location.hash.slice(1));
249
+ if (!id) return;
250
+ const target = document.getElementById(id);
251
+ if (!target) return;
252
+ const header = $('.site-header');
253
+ const offset = (header?.getBoundingClientRect().height || 0) + 34 + (id === 'architecture' ? 120 : 0);
254
+ const top = target.getBoundingClientRect().top + scrollY - offset;
255
+ window.scrollTo({ top: Math.max(0, top), behavior: prefersReducedMotion ? 'auto' : 'smooth' });
256
+ $$('.reveal', target).forEach(el => el.classList.add('visible'));
257
+ }
258
+ addEventListener('hashchange', () => setTimeout(settleHashTarget, 60));
259
+ setTimeout(settleHashTarget, 180);
260
+ }
261
 
262
+ function initRevealAndCounters() {
263
+ const observer = new IntersectionObserver(entries => {
264
+ entries.forEach(entry => {
265
+ if (!entry.isIntersecting) return;
266
+ entry.target.classList.add('visible');
267
+ observer.unobserve(entry.target);
268
+ });
269
+ }, { threshold: 0.12 });
270
+ $$('.reveal').forEach(el => observer.observe(el));
271
+ const countObserver = new IntersectionObserver(entries => {
272
+ entries.forEach(entry => {
273
+ if (!entry.isIntersecting) return;
274
+ const el = entry.target;
275
+ const target = Number(el.dataset.target || 0);
276
+ const duration = 1100;
277
+ const start = performance.now();
278
+ function tick(now) {
279
+ const p = clamp((now - start) / duration, 0, 1);
280
+ const eased = 1 - Math.pow(1 - p, 3);
281
+ el.textContent = Math.round(target * eased).toString();
282
+ if (p < 1) requestAnimationFrame(tick);
283
+ }
284
+ requestAnimationFrame(tick);
285
+ countObserver.unobserve(el);
286
+ });
287
+ }, { threshold: .3 });
288
+ $$('.counter').forEach(el => countObserver.observe(el));
289
+ }
290
+
291
+ function initSonar() {
292
+ const readout = $('#sonarReadout');
293
+ $$('.sonar-node').forEach(btn => {
294
+ const update = () => { readout.textContent = btn.dataset.copy; };
295
+ btn.addEventListener('mouseenter', update);
296
+ btn.addEventListener('focus', update);
297
  });
298
+ }
299
+
300
+ function initArchitecture() {
301
+ const caption = $('#archCaption');
302
+ const notes = $('#architectureNotes');
303
+ const paths = $$('#architectureSvg .flow-path');
304
+ const nodes = $$('#architectureSvg .arch-node');
305
+ const evidenceFlows = $$('#architectureSvg .arch-evidence-flow');
306
+ let step = 1;
307
+ let timer = null;
308
+ function render(next = step) {
309
+ step = next;
310
+ paths.forEach(p => p.classList.toggle('active', Number(p.dataset.step) <= step));
311
+ nodes.forEach(n => n.classList.toggle('active', Number(n.dataset.step) <= step));
312
+ evidenceFlows.forEach(flow => flow.classList.toggle('active', Number(flow.dataset.step) <= step));
313
+ caption.textContent = data.architecture[step - 1]?.[1] || 'Grounded answer leaves with audit trace.';
314
+ const cards = data.architecture.slice(Math.max(0, step - 4), step).map(([title, body]) => `<div><strong>${title}</strong>${body}</div>`).join('');
315
+ setHTML(notes, cards);
316
  }
317
+ $('#playArchitecture')?.addEventListener('click', () => {
318
+ clearInterval(timer); step = 1; render(step);
319
+ timer = setInterval(() => {
320
+ step += 1; render(step);
321
+ if (step >= 8) clearInterval(timer);
322
+ }, prefersReducedMotion ? 0 : 720);
323
+ });
324
+ $('#resetArchitecture')?.addEventListener('click', () => { clearInterval(timer); render(1); });
325
+ nodes.forEach(n => n.addEventListener('click', () => render(Number(n.dataset.step))));
326
+ render(1);
327
+ }
328
 
329
+ function initDatasets() {
330
+ const max = Math.max(...data.datasets.map(d => d[1]));
331
+ setHTML($('#datasetBars'), data.datasets.map(([name, value, note]) => `
332
+ <div class="dataset-row">
333
+ <div class="dataset-name">${name}<br><span style="color:var(--muted);font-weight:700;font-size:.84rem">${note}</span></div>
334
+ <div class="dataset-track"><div class="dataset-fill" data-width="${(value / max) * 100}"></div></div>
335
+ <div class="dataset-value">${value}k</div>
336
+ </div>`).join(''));
337
+ setTimeout(() => $$('.dataset-fill').forEach(el => el.style.width = `${el.dataset.width}%`), 150);
338
+ }
339
 
340
+ function renderMerge() {
341
+ const svg = $('#mergeSvg');
342
+ const op = data.merges[activeMerge];
343
+ const color = op[2];
344
+ const values = [
345
+ [68, 76, 64, 82, 58, 70],
346
+ [54, 68, 62, 64, 60, 66],
347
+ [0, 84, 0, 76, 0, 70],
348
+ [58, 0, 72, 0, 66, 0],
349
+ [0, 78, 0, 82, 62, 0]
350
+ ][activeMerge];
351
+ const wrap = (text, x, y, width = 30, cls = 'merge-sub') => {
352
+ const words = text.split(' ');
353
+ const lines = words.reduce((acc, word) => {
354
+ const last = acc[acc.length - 1] || '';
355
+ if (`${last} ${word}`.trim().length > width) acc.push(word);
356
+ else acc[acc.length - 1] = `${last} ${word}`.trim();
357
+ return acc;
358
+ }, ['']);
359
+ return `<text class="${cls}" x="${x}" y="${y}">${lines.map((line, i) => `<tspan x="${x}" dy="${i ? 19 : 0}">${line}</tspan>`).join('')}</text>`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  };
361
+ const miniBars = values.map((v, i) => {
362
+ const x = 720 + i * 34;
363
+ return `<rect class="merge-weight" x="${x}" y="${294 - v}" width="20" height="${v}" rx="10" fill="${color}"/>`;
364
+ }).join('');
365
+ const mechanism = [
366
+ ['Add deltas', 'Sum both update vectors, then scale the total update before applying it to the base model.'],
367
+ ['Normalize direction', 'Convert updates to directions, interpolate on the sphere, then restore a controlled magnitude.'],
368
+ ['Drop + rescale', 'Mask redundant coordinates and rescale the surviving coordinates to preserve the expected update.'],
369
+ ['Trim + sign vote', 'Keep strong coordinates, resolve sign conflicts, and merge only the agreed directions.'],
370
+ ['Sparse consensus', 'Apply DARE sparsity first, then use TIES sign consensus on the surviving update set.']
371
+ ][activeMerge];
372
+ // Motivation vs Logic: the merge panel needs to teach the operator rather than decorate it. Each mode now shows a formula, weight coordinates, and the exact transformation metaphor used by that merge technique.
373
+ svg.innerHTML = `
374
+ <defs>
375
+ <marker id="mergeArrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" fill="${color}"/></marker>
376
+ </defs>
377
+ <rect class="merge-panel" x="48" y="58" width="220" height="132" rx="22"/>
378
+ <text class="merge-kicker" x="76" y="96">Input update</text>
379
+ <text class="merge-label" x="76" y="132">ΔSFT</text>
380
+ <text class="merge-sub" x="76" y="164">format instruction</text>
381
+ <rect class="merge-panel" x="48" y="246" width="220" height="132" rx="22"/>
382
+ <text class="merge-kicker" x="76" y="284">Input update</text>
383
+ <text class="merge-label" x="76" y="320">ΔKD</text>
384
+ <text class="merge-sub" x="76" y="352">teacher semantics</text>
385
+ <path class="merge-vector active" d="M278 124 L356 124"/>
386
+ <path class="merge-vector active kd" d="M278 312 L356 312"/>
387
+ <rect class="merge-panel active" x="356" y="84" width="300" height="270" rx="26"/>
388
+ <text class="merge-kicker" x="392" y="126">Merge operator</text>
389
+ <text class="merge-label" x="392" y="164">${op[0]}</text>
390
+ ${wrap(op[3], 392, 212, 30, 'merge-formula')}
391
+ <text class="merge-kicker" x="392" y="272">${mechanism[0]}</text>
392
+ ${wrap(mechanism[1], 392, 306, 32)}
393
+ <path class="merge-vector active out" d="M656 220 L704 220" marker-end="url(#mergeArrow)"/>
394
+ <rect class="merge-panel active" x="704" y="110" width="248" height="220" rx="26"/>
395
+ <text class="merge-kicker" x="738" y="154">Merged model</text>
396
+ <text class="merge-label" x="738" y="194">θ specialist</text>
397
+ ${miniBars}
398
+ <text class="merge-sub" x="738" y="314">conflict-aware 7B update</text>
399
+ <text x="54" y="444" class="merge-sub">Selected operator: ${op[0]} · ${op[1]}</text>`;
400
+ }
401
 
402
+ function initMerge() {
403
+ const controls = $('#mergeControls');
404
+ setHTML(controls, data.merges.map((m, i) => `<button class="merge-button ${i === activeMerge ? 'active' : ''}" data-i="${i}"><strong>${m[0]}</strong><span>${m[1]}</span></button>`).join(''));
405
+ controls.addEventListener('click', e => {
406
+ const btn = e.target.closest('.merge-button');
407
+ if (!btn) return;
408
+ activeMerge = Number(btn.dataset.i);
409
+ $$('.merge-button', controls).forEach(b => b.classList.toggle('active', b === btn));
410
+ renderMerge();
 
 
 
 
 
 
 
 
 
411
  });
412
+ renderMerge();
413
+ }
 
 
414
 
415
+ function renderRetrievalStage() {
416
+ const stage = data.retrievalStages[activeStage];
417
+ $$('.stage-tab').forEach((btn, i) => btn.classList.toggle('active', i === activeStage));
418
+ $('#stageCaption').innerHTML = `<strong>${stage.title}</strong>${stage.body}`;
419
+ const svg = $('#retrievalSvg');
420
+ svg.innerHTML = `
421
+ ${stage.lines.map((l, i) => `<path class="diagram-line ${i % 2 ? 'secondary' : ''}" d="M${l[0]} ${l[1]} C ${(l[0] + l[2]) / 2} ${l[1]} ${(l[0] + l[2]) / 2} ${l[3]} ${l[2]} ${l[3]}"/>`).join('')}
422
+ ${stage.nodes.map((n, i) => `<g class="diagram-node ${i === 0 ? 'active' : ''}" transform="translate(${n[1]} ${n[2]})"><rect width="210" height="88" rx="20"/><text x="24" y="39">${n[0]}</text><text class="sub" x="24" y="65">${stage.key}</text></g>`).join('')}`;
423
+ }
424
 
425
+ function initRetrieval() {
426
+ const tabs = $('#retrievalTabs');
427
+ setHTML(tabs, data.retrievalStages.map((s, i) => `<button class="stage-tab ${i === activeStage ? 'active' : ''}" data-i="${i}" role="tab">${s.key}</button>`).join(''));
428
+ tabs.addEventListener('click', e => {
429
+ const btn = e.target.closest('.stage-tab');
430
+ if (!btn) return;
431
+ activeStage = Number(btn.dataset.i);
432
+ renderRetrievalStage();
433
+ });
434
+ renderRetrievalStage();
435
+ }
 
 
 
 
 
 
 
 
436
 
437
+ function renderFacets() {
438
+ const threshold = 80;
439
+ setHTML($('#facetBars'), data.facets.map(([name, value, critical]) => `
440
+ <div class="facet-row">
441
+ <div class="facet-top"><span>${name}${critical ? ' <small style="color:var(--amber)">critical</small>' : ''}</span><span>${Math.round(value)}%</span></div>
442
+ <div class="facet-track"><div class="facet-fill ${critical ? '' : 'safe'}" style="width:${value}%"></div></div>
443
+ </div>`).join(''));
444
+ renderCoverage();
445
+ const accepted = data.facets.filter(f => f[2]).every(f => f[1] >= threshold);
446
+ const status = $('#policyStatus');
447
+ status.classList.toggle('accepted', accepted);
448
+ status.textContent = accepted ? 'Evidence bundle accepted: critical facets clear threshold and marginal utility is saturated.' : 'Critical facets are still below acceptance threshold; targeted retrieve-more action required.';
449
+ }
450
 
451
+ function renderCoverage() {
452
+ const svg = $('#coverageSvg');
453
+ const values = coverageHistory;
454
+ const w = 760, h = 210, pad = 34;
455
+ const x = i => pad + (i / Math.max(1, values.length - 1)) * (w - pad * 2);
456
+ const y = v => h - pad - (v / 100) * (h - pad * 2);
457
+ const points = values.map((v, i) => `${x(i)},${y(v)}`).join(' ');
458
+ const bars = values.map((v, i) => `<rect x="${x(i) - 13}" y="${y(v)}" width="26" height="${h - pad - y(v)}" rx="13" fill="url(#coverageGrad)" opacity=".88"/>`).join('');
459
+ svg.innerHTML = `<defs><linearGradient id="coverageGrad" x1="0" x2="0" y1="1" y2="0"><stop offset="0" stop-color="#4f85ff"/><stop offset="1" stop-color="#5ef7d8"/></linearGradient></defs>
460
+ <line x1="${pad}" y1="${h-pad}" x2="${w-pad}" y2="${h-pad}" stroke="rgba(115,202,255,.18)"/>
461
+ <line x1="${pad}" y1="${h-pad-0.8*(h-pad*2)}" x2="${w-pad}" y2="${h-pad-0.8*(h-pad*2)}" stroke="rgba(255,209,102,.45)" stroke-dasharray="8 8"/>
462
+ <text x="${w-pad-85}" y="${h-pad-0.8*(h-pad*2)-8}" fill="#ffd166" font-size="13" font-weight="800">80% threshold</text>
463
+ ${bars}
464
+ <polyline points="${points}" fill="none" stroke="#5ef7d8" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
465
+ ${values.map((v,i)=>`<circle cx="${x(i)}" cy="${y(v)}" r="5" fill="#eaffff"/>`).join('')}`;
466
+ }
 
 
467
 
468
+ function initSufficiency() {
469
+ renderFacets();
470
+ const list = $('#bundleList');
471
+ $('#retrieveMore')?.addEventListener('click', () => {
472
+ retrievalStep += 1;
473
+ data.facets.forEach((f, i) => { f[1] = clamp(f[1] + [12, 15, 13, 14, 8, 7][i], 0, 96); });
474
+ coverageHistory.push(Math.round(data.facets.reduce((s, f) => s + f[1], 0) / data.facets.length));
475
+ const message = data.retrievalEvents[Math.min(retrievalStep - 1, data.retrievalEvents.length - 1)];
476
+ list.insertAdjacentHTML('afterbegin', `<div><strong>Step ${retrievalStep}</strong>: ${message}</div>`);
477
+ renderFacets();
478
  });
479
+ }
480
 
481
+ function initAgents() {
482
+ setHTML($('#agentHive'), data.agents.map(([icon, name, text, rel]) => `
483
+ <article class="agent-card">
484
+ <div class="agent-head"><span class="agent-icon">${icon}</span><h3>${name}</h3></div>
485
+ <p>${text}</p>
486
+ <div class="reliability" aria-label="Reliability ${rel}%"><i style="--w:${rel}%"></i></div>
487
+ </article>`).join(''));
488
+ }
489
 
490
+ function metricScale(metric, rows) {
491
+ const values = rows.map(r => r[metric]);
492
+ if (metric === 'bert') return { min: 0.80, max: 0.86 };
493
+ if (metric === 'uni') return { min: 0.20, max: 0.58 };
494
+ if (metric === 'bi') return { min: 0.00, max: 0.30 };
495
+ const min = Math.max(0, Math.floor((Math.min(...values) - 0.02) * 100) / 100);
496
+ const max = Math.ceil((Math.max(...values) + 0.03) * 100) / 100;
497
+ return { min, max };
498
+ }
 
 
499
 
500
+ function renderQA() {
501
+ const dataset = $('#datasetSelect').value;
502
+ const metric = $('#metricSort').value;
503
+ const lowFirst = metric === 'uni' || metric === 'bi';
504
+ const rows = [...data.qa[dataset]].sort((a, b) => lowFirst ? a[metric] - b[metric] : b[metric] - a[metric]);
505
+ const { min, max } = metricScale(metric, rows);
506
+ const metricNames = { bert: 'BERTScore-F1', rouge: 'ROUGE-L F1', tok: 'Token F1', uni: 'Unigram precision', bi: 'Bigram precision' };
507
+ const tick = metric === 'bert' ? v => `${(v * 100).toFixed(0)}%` : v => v.toFixed(2);
508
+ $('#chartMeta').innerHTML = `<span class="axis-note"><b>${metricNames[metric]}</b>${lowFirst ? ' · lower better' : ' · higher better'}</span><span></span>`;
509
+ const axis = `<div class="axis-row"><span></span><div class="axis-track"><span>${tick(min)}</span><span>${tick((min+max)/2)}</span><span>${tick(max)}</span></div><span></span></div>`;
510
+ const bars = rows.slice(0, 10).map((r, i) => {
511
+ const pct = clamp(((r[metric] - min) / (max - min)) * 100, 0, 100);
512
+ return `<div class="bar-row" style="--delay:${i * 70}ms">
513
+ <div class="bar-name" title="${r.model}">${i + 1}. ${r.model}</div>
514
+ <div class="bar-track"><div class="bar-fill" data-width="${pct}"></div></div>
515
+ <div class="bar-value">${fmtScore(r[metric], metric)}</div>
516
+ </div>`;
517
+ }).join('');
518
+ $('#metricBars').innerHTML = axis + bars;
519
+ requestAnimationFrame(() => $$('#metricBars .bar-fill').forEach((el, i) => {
520
+ el.style.transitionDelay = `${i * 70}ms`;
521
+ el.style.width = `${el.dataset.width}%`;
522
+ }));
523
+ $('#qaTable tbody').innerHTML = rows.map(r => `<tr><td>${r.model}</td><td>${r.rouge.toFixed(2)}</td><td>${r.bert.toFixed(4)}</td><td>${r.tok.toFixed(2)}</td><td>${r.uni.toFixed(2)}</td><td>${r.bi.toFixed(2)}</td></tr>`).join('');
524
+ }
525
 
526
+ function renderReranker() {
527
+ setHTML($('#rerankGrid'), data.reranker.map(([metric, value, score, text]) => `
528
+ <article class="rerank-card">
529
+ <h3>${metric}</h3>
530
+ <div class="ring-meter" style="--pct:${score}%"><b>${value}</b></div>
531
+ <p>${text}</p>
532
+ </article>`).join(''));
533
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
534
 
535
+ function renderAudit() {
536
+ const svg = $('#auditSvg');
537
+ const cx = 280, cy = 260, r = 185;
538
+ const angles = data.audit.map((_, i) => -Math.PI / 2 + i * Math.PI * 2 / data.audit.length);
539
+ const point = (val, angle) => [cx + Math.cos(angle) * r * val / 100, cy + Math.sin(angle) * r * val / 100];
540
+ const rings = [20,40,60,80,100].map(v => {
541
+ const pts = angles.map(a => point(v, a).join(',')).join(' ');
542
+ return `<polygon points="${pts}" fill="none" stroke="rgba(115,202,255,.14)"/>`;
543
+ }).join('');
544
+ const axes = angles.map((a,i) => {
545
+ const [x,y] = point(100, a); const [lx,ly] = point(115, a);
546
+ return `<line x1="${cx}" y1="${cy}" x2="${x}" y2="${y}" stroke="rgba(115,202,255,.12)"/><text x="${lx}" y="${ly}" fill="#c6d9ea" font-size="14" text-anchor="middle">${data.audit[i][0]}</text>`;
547
+ }).join('');
548
+ const pts = data.audit.map(([_, v], i) => point(v, angles[i]).join(',')).join(' ');
549
+ svg.innerHTML = `<defs><linearGradient id="radarGrad" x1="0" x2="1"><stop offset="0" stop-color="#33d7ff" stop-opacity=".55"/><stop offset="1" stop-color="#5ef7d8" stop-opacity=".45"/></linearGradient></defs>${rings}${axes}<polygon points="${pts}" fill="url(#radarGrad)" stroke="#5ef7d8" stroke-width="3"/>${data.audit.map(([_, v], i) => { const [x,y]=point(v,angles[i]); return `<circle cx="${x}" cy="${y}" r="5" fill="#eff8ff"/>`; }).join('')}`;
550
+ $('#auditMetrics').innerHTML = data.audit.map(([name, v]) => `<li><strong>${name}:</strong> ${v}%</li>`).join('');
551
+ }
552
 
553
+ function initEvaluation() {
554
+ $$('.tab').forEach(btn => btn.addEventListener('click', () => {
555
+ $$('.tab').forEach(b => { b.classList.toggle('active', b === btn); b.setAttribute('aria-selected', b === btn ? 'true' : 'false'); });
556
+ $$('.tab-panel').forEach(p => p.classList.toggle('active', p.id === `tab-${btn.dataset.tab}`));
557
+ $('#qaControls').style.display = btn.dataset.tab === 'qa' ? '' : 'none';
558
+ if (btn.dataset.tab === 'qa') renderQA();
559
+ if (btn.dataset.tab === 'rerank') renderReranker();
560
+ if (btn.dataset.tab === 'audit') renderAudit();
561
+ }));
562
+ $('#datasetSelect').addEventListener('change', renderQA);
563
+ $('#metricSort').addEventListener('change', renderQA);
564
+ renderQA(); renderReranker(); renderAudit();
565
+ }
566
+
567
+ function initRelease() {
568
+ setHTML($('#releaseTimeline'), data.release.map(([num, title, text]) => `
569
+ <article class="release-item"><strong>${num}</strong><div><h3>${title}</h3><p>${text}</p></div></article>`).join(''));
570
+ }
571
+
572
+ function init() {
573
+ initCanvas();
574
+ initNavigation();
575
+ initRevealAndCounters();
576
+ initSonar();
577
+ initArchitecture();
578
+ initDatasets();
579
+ initMerge();
580
+ initRetrieval();
581
+ initSufficiency();
582
+ initAgents();
583
+ initEvaluation();
584
+ initRelease();
585
+ }
586
+
587
+ document.addEventListener('DOMContentLoaded', init);
assets/logo.png ADDED

Git LFS Details

  • SHA256: 523c8eebaa654171e1956ddd80054555987f52c0570a582cfe201497371122da
  • Pointer size: 132 Bytes
  • Size of remote file: 5.97 MB
assets/logo.svg CHANGED
assets/style.css ADDED
@@ -0,0 +1,668 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root{
2
+ --navy-950:#010712;
3
+ --navy-900:#031125;
4
+ --navy-850:#061a33;
5
+ --navy-800:#082345;
6
+ --navy-700:#0d315b;
7
+ --ink:#eff8ff;
8
+ --ink-soft:#c6d9ea;
9
+ --muted:#8ca7bf;
10
+ --cyan:#33d7ff;
11
+ --aqua:#5ef7d8;
12
+ --blue:#4f85ff;
13
+ --violet:#9b7cff;
14
+ --coral:#ff6f91;
15
+ --amber:#ffd166;
16
+ --green:#67f2aa;
17
+ --line:rgba(115,202,255,.22);
18
+ --line-strong:rgba(94,247,216,.48);
19
+ --glass:rgba(5,18,39,.72);
20
+ --glass-heavy:rgba(3,13,29,.90);
21
+ --radius:28px;
22
+ --radius-md:20px;
23
+ --max:1280px;
24
+ --shadow:0 26px 70px rgba(0,0,0,.44), inset 0 1px 0 rgba(255,255,255,.08);
25
+ --font:"Aptos","Segoe UI Variable","Segoe UI",Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;
26
+ --mono:"Cascadia Mono","SFMono-Regular",Consolas,monospace;
27
+ }
28
+ *{box-sizing:border-box}
29
+ html{scroll-behavior:smooth;background:var(--navy-950)}
30
+ html{scroll-padding-top:132px}
31
+ body{
32
+ margin:0;
33
+ min-height:100vh;
34
+ color:var(--ink);
35
+ font-family:var(--font);
36
+ background:
37
+ radial-gradient(circle at 50% -10%, rgba(51,215,255,.22), transparent 35rem),
38
+ radial-gradient(circle at 4% 14%, rgba(94,247,216,.10), transparent 28rem),
39
+ radial-gradient(circle at 92% 24%, rgba(79,133,255,.16), transparent 30rem),
40
+ linear-gradient(180deg,var(--navy-900),var(--navy-950));
41
+ overflow-x:hidden;
42
+ text-rendering:geometricPrecision;
43
+ -webkit-font-smoothing:antialiased;
44
+ }
45
+ body::before{
46
+ content:"";
47
+ position:fixed;
48
+ inset:0;
49
+ pointer-events:none;
50
+ z-index:-4;
51
+ background:
52
+ linear-gradient(rgba(115,202,255,.035) 1px, transparent 1px),
53
+ linear-gradient(90deg,rgba(115,202,255,.027) 1px, transparent 1px);
54
+ background-size:74px 74px;
55
+ mask-image:linear-gradient(180deg,rgba(0,0,0,.75),rgba(0,0,0,.22),transparent 88%);
56
+ }
57
+ button,select,input{font:inherit;color:inherit}
58
+ button{cursor:pointer}
59
+ a{color:inherit;text-decoration:none}
60
+ img{display:block;max-width:100%}
61
+ h1,h2,h3,p{margin-top:0}
62
+ h1{font-size:clamp(3.5rem,8vw,7.7rem);line-height:.88;letter-spacing:-.078em;margin-bottom:28px;text-wrap:balance}
63
+ h2{font-size:clamp(2.2rem,4.8vw,5rem);line-height:.96;letter-spacing:-.058em;margin-bottom:20px;text-wrap:balance}
64
+ h3{font-size:clamp(1.18rem,2.2vw,1.85rem);line-height:1.08;letter-spacing:-.035em;margin-bottom:12px}.lede,.section-heading p{color:var(--ink-soft);font-size:1.14rem;line-height:1.75}.lede{font-size:1.22rem;max-width:780px}.eyebrow{margin:0 0 12px;font-size:.76rem;font-weight:850;letter-spacing:.2em;text-transform:uppercase;color:var(--aqua)}
65
+ .abyss-canvas{position:fixed;inset:0;width:100%;height:100%;z-index:-6;background:var(--navy-950)}
66
+ .deep-glow{position:fixed;inset:-25%;pointer-events:none;z-index:-5;background:radial-gradient(ellipse at 22% 8%,rgba(51,215,255,.18),transparent 36%),radial-gradient(ellipse at 72% 12%,rgba(155,124,255,.12),transparent 34%),radial-gradient(ellipse at 50% 80%,rgba(94,247,216,.08),transparent 40%);filter:blur(18px);animation:drift 18s ease-in-out infinite alternate}.grid-noise{position:fixed;inset:0;pointer-events:none;z-index:100;opacity:.045;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 240 240' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}.read-progress{position:fixed;top:0;left:0;z-index:90;height:3px;width:0;background:linear-gradient(90deg,var(--cyan),var(--aqua),var(--violet));box-shadow:0 0 24px rgba(51,215,255,.65)}@keyframes drift{to{transform:translate3d(2%,2%,0) scale(1.06)}}
67
+ .site-header{position:sticky;top:14px;z-index:80;width:min(var(--max),calc(100% - 36px));margin:14px auto 0;padding:10px 14px 10px 16px;border:1px solid rgba(115,202,255,.18);border-radius:999px;display:flex;align-items:center;justify-content:space-between;gap:18px;background:rgba(2,12,28,.76);backdrop-filter:blur(18px);box-shadow:0 18px 60px rgba(0,0,0,.35)}.brand{display:flex;align-items:center;gap:12px}.brand-orb{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;overflow:hidden;background:radial-gradient(circle,rgba(94,247,216,.88),rgba(51,215,255,.18) 62%,transparent 72%);box-shadow:0 0 30px rgba(94,247,216,.26)}.brand-orb img{width:100%;height:100%;object-fit:cover;object-position:center;display:block}.brand b{display:block;font-weight:900;letter-spacing:.05em;text-transform:uppercase}.brand small{display:block;color:var(--muted);font-size:.72rem;letter-spacing:.04em}.nav{display:flex;align-items:center;gap:3px}.nav a{padding:10px 12px;border-radius:999px;color:var(--ink-soft);font-size:.87rem;font-weight:700;transition:.22s ease}.nav a:hover,.nav a.active{background:rgba(51,215,255,.12);color:#fff;box-shadow:inset 0 0 0 1px rgba(94,247,216,.18)}.nav-toggle{display:none;border:1px solid var(--line);background:rgba(7,27,55,.78);border-radius:999px;padding:10px 14px;font-weight:850}
68
+ .depth-map{position:fixed;left:18px;top:50%;transform:translateY(-50%);z-index:55;display:flex;flex-direction:column;gap:10px;padding:14px;border:1px solid rgba(115,202,255,.14);border-radius:22px;background:rgba(2,11,26,.58);backdrop-filter:blur(18px);box-shadow:0 18px 58px rgba(0,0,0,.32)}.depth-map span{font-size:.68rem;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);writing-mode:vertical-rl;text-orientation:mixed;margin:auto}.depth-map a{width:32px;height:32px;display:grid;place-items:center;border-radius:50%;font-size:.76rem;font-weight:900;color:var(--muted);border:1px solid rgba(115,202,255,.16);background:rgba(8,27,54,.52);transition:.2s}.depth-map a.active,.depth-map a:hover{color:#02101f;background:linear-gradient(135deg,var(--cyan),var(--aqua));box-shadow:0 0 24px rgba(94,247,216,.34)}
69
+ main{position:relative;z-index:1}.section{width:min(var(--max),calc(100% - 44px));margin:0 auto;padding:120px 0 28px}.hero{min-height:calc(100vh - 90px);display:grid;grid-template-columns:minmax(0,1.05fr) minmax(420px,.75fr);gap:46px;align-items:center;padding-top:70px}.reveal{opacity:0;transform:translateY(24px);transition:opacity .68s ease,transform .68s ease}.reveal.visible{opacity:1;transform:translateY(0)}
70
+ .button{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(115,202,255,.22);border-radius:999px;padding:14px 19px;font-weight:900;transition:.22s ease;background:rgba(9,28,58,.75);white-space:nowrap}.button:hover{transform:translateY(-2px);box-shadow:0 16px 36px rgba(0,0,0,.26)}.button.primary{background:linear-gradient(135deg,var(--cyan),var(--aqua) 52%,var(--violet));color:#06101f;border-color:transparent;box-shadow:0 18px 42px rgba(51,215,255,.25)}.button.secondary{color:#eaf8ff}.button.small{padding:9px 14px;font-size:.86rem}.button-row{display:flex;gap:10px;flex-wrap:wrap}.hero-actions{display:flex;gap:14px;flex-wrap:wrap;margin-top:32px}
71
+ .card{position:relative;overflow:hidden;border:1px solid var(--line);border-radius:var(--radius);background:linear-gradient(180deg,rgba(8,30,62,.72),rgba(3,13,29,.86));box-shadow:var(--shadow);backdrop-filter:blur(18px)}.card::before{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(115deg,rgba(255,255,255,.08),transparent 25%,transparent 70%,rgba(94,247,216,.05))}.card>*{position:relative}.compact{padding:28px}.panel-title{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:24px}.panel-title h2,.panel-title h3{margin:0}.chip,.depth-pill{display:inline-flex;align-items:center;border:1px solid rgba(115,202,255,.22);border-radius:999px;background:rgba(2,13,29,.68);padding:8px 12px;color:#dffaff;font-size:.72rem;font-weight:850;letter-spacing:.09em;text-transform:uppercase;white-space:nowrap}.depth-pill{color:var(--aqua)}
72
+ .high-impact{padding:22px}.sonar{position:relative;width:min(100%,470px);aspect-ratio:1/1;margin:8px auto 18px;border-radius:50%;border:1px solid rgba(115,202,255,.22);background:radial-gradient(circle,rgba(94,247,216,.18) 0 7%,rgba(51,215,255,.09) 8% 26%,rgba(3,14,31,.76) 27% 100%);box-shadow:inset 0 0 90px rgba(51,215,255,.12),0 0 60px rgba(51,215,255,.1);overflow:hidden}.sonar-sweep{position:absolute;inset:5%;border-radius:50%;background:conic-gradient(from 0deg,rgba(94,247,216,.55),rgba(51,215,255,.14) 24deg,transparent 62deg);animation:rotate 5.2s linear infinite}.sonar-ring{position:absolute;left:50%;top:50%;border-radius:50%;border:1px solid rgba(94,247,216,.28);transform:translate(-50%,-50%);animation:sonarPulse 3.8s ease-out infinite}.ring-1{width:32%;height:32%}.ring-2{width:58%;height:58%;animation-delay:.8s}.ring-3{width:84%;height:84%;animation-delay:1.6s}.sonar-core{position:absolute;z-index:4;inset:35%;border-radius:50%;display:grid;place-items:center;text-align:center;background:rgba(2,11,26,.86);border:1px solid rgba(255,255,255,.12);box-shadow:0 0 48px rgba(94,247,216,.22)}.sonar-core img{width:100%;height:100%;object-fit:cover;object-position:center;display:block}.sonar-core b{font-size:.96rem}.sonar-core span{font-size:.68rem;color:var(--muted)}.sonar-node{position:absolute;z-index:5;border:1px solid rgba(94,247,216,.48);background:rgba(4,18,39,.92);border-radius:999px;padding:10px 12px;color:#f2fcff;font-weight:900;font-size:.78rem;box-shadow:0 0 26px rgba(94,247,216,.16);transition:.2s}.sonar-node:hover,.sonar-node:focus{transform:scale(1.07);outline:none;background:rgba(51,215,255,.18)}.node-emr{left:10%;top:24%}.node-cpg{right:8%;top:28%}.node-safety{right:12%;bottom:17%}.node-audit{left:12%;bottom:19%}.sonar-readout{min-height:64px;padding:14px 16px;border:1px solid rgba(115,202,255,.16);border-radius:18px;background:rgba(2,11,26,.55);color:var(--ink-soft);line-height:1.55}.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.stat-grid div{border:1px solid rgba(115,202,255,.16);border-radius:18px;background:rgba(2,11,26,.42);padding:14px;text-align:center}.stat-grid strong{display:block;font-size:2.1rem;letter-spacing:-.05em}.stat-grid span{display:block;color:var(--muted);font-size:.78rem;font-weight:800}.section-heading{max-width:920px;margin-bottom:28px}.principle-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.card-index{display:inline-grid;place-items:center;width:38px;height:38px;border-radius:13px;background:rgba(94,247,216,.12);border:1px solid rgba(94,247,216,.28);color:var(--aqua);font-weight:900;margin-bottom:18px}.compact p{color:var(--muted);line-height:1.65;margin:0}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes sonarPulse{from{opacity:.5;transform:translate(-50%,-50%) scale(.82)}to{opacity:0;transform:translate(-50%,-50%) scale(1.18)}}
73
+ .architecture-card,.retrieval-card,.sufficiency-card,.evaluation-card,.merge-card,.ledger-card,.caveat,.closing-card{padding:28px}.svg-frame{width:100%;border:1px solid rgba(115,202,255,.14);border-radius:24px;background:linear-gradient(180deg,rgba(2,13,29,.62),rgba(2,10,24,.82));overflow:visible;box-shadow:inset 0 0 70px rgba(51,215,255,.05)}.svg-frame svg{display:block;width:100%;height:auto;overflow:visible}.flow-path{fill:none;stroke:url(#lineGradient);stroke-width:6;stroke-linecap:round;stroke-dasharray:14 18;opacity:.28;marker-end:url(#arrow);transition:opacity .3s,stroke-width .3s}.flow-path.active{opacity:1;stroke-width:8;animation:dash 1.2s linear infinite}.flow-path.feedback{stroke:#cdbb66}.arch-node rect,.diagram-node rect{rx:22;fill:rgba(10,36,72,.74);stroke:rgba(115,202,255,.36);stroke-width:1.6}.arch-node.active rect,.diagram-node.active rect{stroke:rgba(94,247,216,.86);filter:drop-shadow(0 0 18px rgba(94,247,216,.35))}.arch-node text,.diagram-node text{font-size:24px;font-weight:900;fill:#eef8ff}.arch-node .sub,.diagram-node .sub{font-size:17px;font-weight:650;fill:#adc4d9}.architecture-notes{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:16px}.architecture-notes div{padding:14px;border:1px solid rgba(115,202,255,.14);border-radius:18px;background:rgba(2,11,26,.42);color:var(--muted);line-height:1.45}.architecture-notes strong{display:block;color:#fff;margin-bottom:4px}.flow-path.trace{stroke-dasharray:900;stroke-dashoffset:900;animation:drawPath 1.1s ease forwards}.flow-path.trace.active{animation:drawPath 1.1s ease forwards,dash 1.5s linear infinite}@keyframes drawPath{to{stroke-dashoffset:0}}@keyframes dash{to{stroke-dashoffset:-64}}
74
+ .two-column{display:grid;grid-template-columns:1fr 1fr;gap:20px}.dataset-bars{display:grid;gap:14px}.dataset-row{display:grid;grid-template-columns:minmax(170px,210px) 1fr 72px;gap:14px;align-items:center}.dataset-name{font-weight:900;color:#f5fbff}.dataset-track{height:14px;border-radius:999px;background:rgba(115,202,255,.12);overflow:hidden}.dataset-fill{height:100%;width:0;border-radius:999px;background:linear-gradient(90deg,var(--blue),var(--cyan),var(--aqua));transition:width 1.2s cubic-bezier(.2,.8,.2,1)}.dataset-value{font-family:var(--mono);color:var(--ink-soft);text-align:right}.distill-card{padding:28px}.transfer-diagram{display:grid;grid-template-columns:170px 1fr 170px;gap:18px;align-items:center;margin-top:16px}.orb{aspect-ratio:1/1;border-radius:50%;display:grid;place-items:center;text-align:center;padding:22px;background:radial-gradient(circle at 35% 30%,rgba(255,255,255,.18),rgba(7,27,58,.82) 58%,rgba(2,11,26,.95));border:1px solid rgba(115,202,255,.22);box-shadow:inset 0 0 60px rgba(51,215,255,.1)}.orb strong{font-size:3rem;letter-spacing:-.06em}.orb span{color:var(--muted);font-weight:800}.transfer-lines{position:relative;display:grid;gap:12px}.transfer-lines::before{content:"";position:absolute;left:0;right:0;top:50%;height:2px;background:linear-gradient(90deg,var(--cyan),var(--aqua));box-shadow:0 0 24px rgba(94,247,216,.45);animation:pulseLine 2.5s ease-in-out infinite}.transfer-lines span{position:relative;justify-self:center;border:1px solid rgba(94,247,216,.2);border-radius:999px;background:rgba(2,11,26,.78);padding:8px 12px;color:var(--ink-soft);font-weight:850}.formula{margin-top:18px;border:1px solid rgba(115,202,255,.16);border-radius:18px;padding:16px;background:rgba(2,11,26,.52);font-family:var(--mono);color:#defcff}.merge-layout{display:grid;grid-template-columns:285px 1fr;gap:20px;align-items:stretch}.merge-controls{display:grid;gap:10px;align-content:start}.merge-button{width:100%;text-align:left;border:1px solid rgba(115,202,255,.16);border-radius:18px;background:rgba(2,11,26,.48);padding:14px 16px;transition:.2s}.merge-button strong{display:block}.merge-button span{display:block;margin-top:4px;color:var(--muted);font-size:.9rem;line-height:1.4}.merge-button.active{border-color:var(--line-strong);background:rgba(94,247,216,.10);box-shadow:0 0 26px rgba(94,247,216,.1)}.merge-frame{min-height:420px}.merge-path{fill:none;stroke-linecap:round;stroke-width:20;opacity:.18}.merge-path.active{opacity:.96;filter:drop-shadow(0 0 16px rgba(94,247,216,.32));stroke-dasharray:900;stroke-dashoffset:900;animation:drawPath 1s ease forwards}.merge-label{font-size:22px;font-weight:900;fill:#f6fbff}.merge-sub{font-size:15px;font-weight:650;fill:#abc4d9}.merge-node{fill:rgba(10,36,72,.86);stroke:rgba(115,202,255,.32);stroke-width:1.5}.merge-node.active{stroke:rgba(94,247,216,.9);filter:drop-shadow(0 0 18px rgba(94,247,216,.3))}@keyframes pulseLine{50%{opacity:.52;filter:blur(.3px)}}
75
+ .retrieval-grid{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(360px,.9fr);gap:20px;align-items:start}.stage-tabs{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px}.stage-tab{border:1px solid rgba(115,202,255,.16);border-radius:999px;background:rgba(2,11,26,.44);padding:10px 14px;color:var(--ink-soft);font-weight:900;transition:.2s}.stage-tab.active{border-color:var(--line-strong);color:#06101f;background:linear-gradient(135deg,var(--cyan),var(--aqua))}.retrieval-frame{min-height:430px}.diagram-line{fill:none;stroke:#46e4ff;stroke-width:7;stroke-linecap:round;stroke-dasharray:20 18;opacity:.9;animation:dash 2s linear infinite}.diagram-line.secondary{stroke:#5ef7d8}.stage-caption{margin-top:14px;padding:16px;border:1px solid rgba(115,202,255,.14);border-radius:18px;background:rgba(2,11,26,.42);color:var(--ink-soft);line-height:1.65}.stage-caption strong{display:block;color:#fff;font-size:1.1rem;margin-bottom:4px}.facet-bars{display:grid;gap:15px}.facet-row{display:grid;gap:7px}.facet-top{display:flex;align-items:center;justify-content:space-between;gap:10px;font-weight:900}.facet-top span:last-child{font-family:var(--mono);color:var(--ink-soft)}.facet-track{height:14px;border-radius:999px;background:rgba(115,202,255,.13);overflow:hidden}.facet-fill{height:100%;width:0;border-radius:999px;background:linear-gradient(90deg,var(--coral),var(--amber),var(--aqua));transition:width .85s cubic-bezier(.2,.8,.2,1)}.facet-fill.safe{background:linear-gradient(90deg,var(--blue),var(--cyan),var(--aqua))}.mini-chart-shell{margin-top:20px;border:1px solid rgba(115,202,255,.14);border-radius:20px;background:rgba(2,11,26,.34);padding:10px}.bundle-list{display:grid;gap:9px;margin-top:16px;max-height:220px;overflow:auto;padding-right:4px}.bundle-list div{border:1px solid rgba(115,202,255,.14);border-radius:16px;padding:12px 14px;background:rgba(2,11,26,.38);color:var(--ink-soft)}.policy-status{margin-top:16px;border-radius:18px;padding:15px 16px;font-weight:900;border:1px solid rgba(255,209,102,.22);background:rgba(255,209,102,.1);color:#ffe6a3}.policy-status.accepted{border-color:rgba(94,247,216,.3);background:rgba(94,247,216,.12);color:#d8fff7}
76
+ .agent-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(470px,.8fr);gap:20px}.agent-hive{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.agent-card{padding:22px;border:1px solid var(--line);border-radius:24px;background:linear-gradient(180deg,rgba(8,30,62,.68),rgba(3,13,29,.82));box-shadow:var(--shadow)}.agent-head{display:flex;gap:14px;align-items:center}.agent-icon{width:48px;height:48px;border-radius:16px;display:grid;place-items:center;background:rgba(94,247,216,.12);border:1px solid rgba(94,247,216,.25);font-weight:950;color:var(--aqua)}.agent-card p{color:var(--muted);line-height:1.58}.reliability{height:10px;border-radius:999px;background:rgba(115,202,255,.12);overflow:hidden}.reliability i{display:block;height:100%;width:var(--w);background:linear-gradient(90deg,var(--blue),var(--aqua));border-radius:inherit}.table-wrap{overflow:auto;border:1px solid rgba(115,202,255,.14);border-radius:20px}table{width:100%;border-collapse:collapse;min-width:720px;background:rgba(2,11,26,.36)}th,td{padding:14px 16px;text-align:left;border-bottom:1px solid rgba(115,202,255,.12);vertical-align:middle}th{color:#d9f8ff;font-size:.76rem;letter-spacing:.12em;text-transform:uppercase}td{color:var(--ink-soft)}tr:last-child td{border-bottom:0}.pill{display:inline-flex;border-radius:999px;padding:6px 9px;font-size:.76rem;font-weight:900}.support{background:rgba(94,247,216,.13);color:#aaffef}.qualify{background:rgba(255,209,102,.12);color:#ffe4a3}.contradict{background:rgba(255,111,145,.12);color:#ffc1ce}.preserve{background:rgba(155,124,255,.14);color:#dfd6ff}.notice{margin-top:16px;border:1px solid rgba(115,202,255,.14);border-radius:18px;background:rgba(2,11,26,.42);padding:14px 16px;display:grid;gap:4px}.notice span{color:var(--muted);line-height:1.5}
77
+ .eval-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:22px}.tabs{display:flex;gap:10px;flex-wrap:wrap}.tab{border:1px solid rgba(115,202,255,.18);background:rgba(2,11,26,.44);border-radius:999px;padding:12px 17px;color:var(--ink-soft);font-weight:950}.tab.active{color:#06101f;border-color:transparent;background:linear-gradient(135deg,var(--cyan),var(--aqua));box-shadow:0 14px 36px rgba(51,215,255,.18)}.select-group{display:flex;gap:14px;flex-wrap:wrap}.select-group label{display:grid;gap:7px;font-size:.72rem;font-weight:950;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}select{min-width:190px;border:1px solid rgba(115,202,255,.22);border-radius:16px;background:#061a33;color:#edf8ff;padding:12px 14px;font-weight:850}.tab-panel{display:none}.tab-panel.active{display:block}.chart-meta{display:flex;align-items:center;justify-content:space-between;gap:16px;border:1px solid rgba(115,202,255,.14);border-radius:18px;background:rgba(2,11,26,.42);padding:12px 14px;margin-bottom:14px;color:var(--ink-soft);font-size:.94rem}.axis-note b{color:#fff}.metric-bars{display:grid;gap:10px;margin-bottom:22px}.bar-row{display:grid;grid-template-columns:minmax(170px,250px) minmax(360px,1fr) 98px;gap:16px;align-items:center;padding:13px 14px;border:1px solid rgba(115,202,255,.13);border-radius:18px;background:rgba(2,11,26,.38)}.bar-name{font-weight:950;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-track{height:18px;border-radius:999px;background:linear-gradient(90deg,rgba(115,202,255,.10),rgba(115,202,255,.16));overflow:hidden;position:relative}.bar-track::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(255,255,255,.07) 1px,transparent 1px);background-size:20% 100%;opacity:.5}.bar-fill{height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,var(--blue),var(--cyan),var(--aqua));box-shadow:0 0 22px rgba(94,247,216,.26);transition:width 1.35s cubic-bezier(.17,.84,.28,1)}.bar-value{font-family:var(--mono);text-align:right;font-weight:950;color:#f1fbff}.axis-row{display:grid;grid-template-columns:minmax(170px,250px) minmax(360px,1fr) 98px;gap:16px;align-items:center;color:var(--muted);font-family:var(--mono);font-size:.78rem;margin:0 14px 8px}.axis-track{display:flex;justify-content:space-between}.compact-table{max-height:420px}.rerank-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}.rerank-card{border:1px solid rgba(115,202,255,.15);border-radius:22px;background:rgba(2,11,26,.44);padding:18px}.ring-meter{width:118px;aspect-ratio:1/1;margin:12px auto;border-radius:50%;display:grid;place-items:center;background:conic-gradient(var(--aqua) var(--pct), rgba(115,202,255,.12) 0);position:relative}.ring-meter::after{content:"";position:absolute;inset:10px;border-radius:50%;background:var(--navy-900);border:1px solid rgba(115,202,255,.1)}.ring-meter b{position:relative;z-index:1;font-family:var(--mono)}.rerank-card h3{font-size:1.1rem}.rerank-card p{color:var(--muted);line-height:1.45}.audit-layout{display:grid;grid-template-columns:minmax(360px,560px) 1fr;gap:24px;align-items:center}.audit-frame{padding:10px}.audit-list{margin:16px 0 0;padding-left:20px;color:var(--ink-soft);line-height:1.8}.caveat{margin-top:20px}.caveat p{color:var(--ink-soft);line-height:1.65;margin-bottom:0}.release-timeline{display:grid;gap:16px}.release-item{display:grid;grid-template-columns:80px 1fr;gap:18px;align-items:start;padding:22px;border:1px solid var(--line);border-radius:24px;background:linear-gradient(180deg,rgba(8,30,62,.66),rgba(3,13,29,.82));box-shadow:var(--shadow)}.release-item strong{width:56px;height:56px;display:grid;place-items:center;border-radius:18px;background:rgba(94,247,216,.12);border:1px solid rgba(94,247,216,.28);color:var(--aqua);font-size:1.2rem}.release-item p{color:var(--ink-soft);line-height:1.65;margin:0}.closing-card{text-align:center;padding:52px;max-width:920px;margin:0 auto}.closing-card p{color:var(--ink-soft);line-height:1.65}.footer{width:min(var(--max),calc(100% - 44px));margin:60px auto 30px;padding:20px 0;border-top:1px solid rgba(115,202,255,.13);display:flex;justify-content:space-between;gap:20px;color:var(--muted);font-size:.88rem}@media (max-width:1180px){.hero{grid-template-columns:1fr}.depth-map{display:none}.principle-grid{grid-template-columns:repeat(2,1fr)}.retrieval-grid,.agent-grid{grid-template-columns:1fr}.rerank-grid{grid-template-columns:repeat(3,1fr)}.architecture-notes{grid-template-columns:repeat(2,1fr)}}@media (max-width:900px){.site-header{border-radius:24px;align-items:flex-start}.nav-toggle{display:inline-flex}.nav{display:none;position:absolute;left:12px;right:12px;top:68px;border:1px solid rgba(115,202,255,.16);border-radius:22px;background:rgba(2,11,26,.95);padding:12px;flex-direction:column;align-items:stretch}.nav.open{display:flex}.nav a{text-align:center}.section{width:min(100% - 26px, var(--max));padding-top:88px}.hero{padding-top:42px}.two-column,.merge-layout,.audit-layout{grid-template-columns:1fr}.transfer-diagram{grid-template-columns:1fr}.transfer-lines::before{display:none}.bar-row,.axis-row{grid-template-columns:1fr}.bar-value{text-align:left}.stat-grid{grid-template-columns:repeat(2,1fr)}.agent-hive,.principle-grid{grid-template-columns:1fr}.rerank-grid{grid-template-columns:1fr}.eval-toolbar{display:grid}.select-group{display:grid}.select-group select{width:100%}h1{font-size:clamp(3rem,15vw,5.3rem)}}@media (max-width:560px){.panel-title{display:grid}.architecture-notes{grid-template-columns:1fr}.release-item{grid-template-columns:1fr}.svg-frame{border-radius:18px}.architecture-card,.retrieval-card,.sufficiency-card,.evaluation-card,.merge-card,.ledger-card,.caveat,.closing-card{padding:18px}.dataset-row{grid-template-columns:1fr 1fr}.dataset-track{grid-column:1/-1;grid-row:2}.footer{display:grid}.hero-actions .button{width:100%}}
78
+ .section{scroll-margin-top:120px}
79
+ #architecture{scroll-margin-top:180px}
80
+ @media (min-width:901px){.section{padding-top:140px}}
81
+ @media (max-width:1180px){table{min-width:620px}}
82
+
83
+ /* Final redesign overrides */
84
+ :root{
85
+ --navy-950:#00040d;
86
+ --navy-900:#020b1b;
87
+ --navy-850:#06162c;
88
+ --navy-800:#092544;
89
+ --ink:#f4f9ff;
90
+ --ink-soft:#bfd0df;
91
+ --muted:#819bb3;
92
+ --shadow:0 18px 54px rgba(0,0,0,.38), inset 0 1px 0 rgba(255,255,255,.07);
93
+ --radius:22px;
94
+ --radius-md:16px;
95
+ }
96
+
97
+ body{
98
+ background:
99
+ radial-gradient(circle at 45% -14%, rgba(46,142,214,.18), transparent 34rem),
100
+ radial-gradient(circle at 92% 12%, rgba(94,247,216,.07), transparent 25rem),
101
+ linear-gradient(180deg,#04142b 0%,#020b1b 44%,#00040d 100%);
102
+ }
103
+
104
+ h1{
105
+ font-size:clamp(3.35rem,6.4vw,6.25rem);
106
+ line-height:.94;
107
+ letter-spacing:-.045em;
108
+ }
109
+
110
+ h2{
111
+ font-size:clamp(2rem,3.9vw,4.1rem);
112
+ line-height:1.03;
113
+ letter-spacing:-.035em;
114
+ }
115
+
116
+ h3{
117
+ font-size:clamp(1.1rem,1.75vw,1.55rem);
118
+ line-height:1.14;
119
+ letter-spacing:-.018em;
120
+ }
121
+
122
+ .lede,.section-heading p{
123
+ font-size:1.04rem;
124
+ line-height:1.68;
125
+ }
126
+
127
+ .site-header{
128
+ top:12px;
129
+ background:rgba(1,9,22,.86);
130
+ border-color:rgba(125,206,255,.2);
131
+ }
132
+
133
+ .section{
134
+ padding:132px 0 44px;
135
+ scroll-margin-top:132px;
136
+ }
137
+
138
+ .hero{
139
+ min-height:calc(100vh - 86px);
140
+ padding-top:54px;
141
+ grid-template-columns:minmax(0,1fr) minmax(0,.72fr);
142
+ gap:42px;
143
+ }
144
+
145
+ .section-heading{
146
+ max-width:980px;
147
+ padding-left:0;
148
+ }
149
+
150
+ .card{
151
+ border-color:rgba(115,202,255,.18);
152
+ background:linear-gradient(180deg,rgba(8,28,55,.68),rgba(1,9,22,.9));
153
+ }
154
+
155
+ .card::before{
156
+ background:
157
+ linear-gradient(125deg,rgba(255,255,255,.065),transparent 24%,transparent 76%,rgba(94,247,216,.04)),
158
+ radial-gradient(circle at 18% 0,rgba(51,215,255,.08),transparent 28rem);
159
+ }
160
+
161
+ .high-impact{
162
+ padding:24px;
163
+ }
164
+
165
+ .sonar{
166
+ width:min(100%,390px);
167
+ }
168
+
169
+ .stat-grid strong{
170
+ font-size:1.7rem;
171
+ }
172
+
173
+ .architecture-frame{
174
+ overflow:hidden;
175
+ }
176
+
177
+ .architecture-frame svg{
178
+ aspect-ratio:1000/800;
179
+ }
180
+
181
+ #architectureSvg{
182
+ background:transparent;
183
+ }
184
+
185
+ #architectureSvg .arch-shell{
186
+ fill:rgba(3,13,29,.52);
187
+ stroke:rgba(115,202,255,.18);
188
+ stroke-width:1.4;
189
+ }
190
+
191
+ #architectureSvg .arch-lock path,
192
+ #architectureSvg .arch-lock rect{
193
+ fill:none;
194
+ stroke:#a7bed3;
195
+ stroke-width:2.5;
196
+ stroke-linejoin:round;
197
+ }
198
+
199
+ #architectureSvg .arch-caption,
200
+ #architectureSvg .arch-note{
201
+ fill:#dcecf7;
202
+ font-size:17px;
203
+ font-weight:850;
204
+ }
205
+
206
+ #architectureSvg .arch-node{
207
+ opacity:.72;
208
+ transition:opacity .25s ease;
209
+ }
210
+
211
+ #architectureSvg .arch-node.active{
212
+ opacity:1;
213
+ }
214
+
215
+ #architectureSvg .arch-node rect{
216
+ fill:url(#archPanel);
217
+ stroke-width:2.1;
218
+ filter:none;
219
+ }
220
+
221
+ #architectureSvg .arch-node text{
222
+ font-family:var(--font);
223
+ letter-spacing:0;
224
+ }
225
+
226
+ #architectureSvg .arch-node .title{
227
+ fill:#f5fbff;
228
+ font-size:19px;
229
+ font-weight:900;
230
+ }
231
+
232
+ #architectureSvg .arch-node .sub,
233
+ #architectureSvg .arch-mini text {
234
+ fill: #d2e4f0 !important; /* Forces solid color */
235
+ stroke: none !important; /* Removes the blurry outline */
236
+ font-size: 13.5px;
237
+ font-weight: 800;
238
+ }
239
+
240
+ #architectureSvg .arch-mini rect{
241
+ fill:rgba(1,9,22,.48);
242
+ stroke-width:1.5;
243
+ }
244
+
245
+ #architectureSvg .arch-icon,
246
+ #architectureSvg .arch-mini,
247
+ #architectureSvg .loop-arrows{
248
+ fill:none;
249
+ stroke:currentColor;
250
+ stroke-width:3;
251
+ stroke-linecap:round;
252
+ stroke-linejoin:round;
253
+ }
254
+
255
+ #architectureSvg .arch-icon.small{
256
+ stroke-width:2.4;
257
+ }
258
+
259
+ #architectureSvg .blue{color:#74dfff}
260
+ #architectureSvg .teal{color:#5ef7d8}
261
+ #architectureSvg .purple{color:#a99cff}
262
+ #architectureSvg .orange{color:#ffd166}
263
+ #architectureSvg .green{color:#67f2aa}
264
+
265
+ #architectureSvg .blue rect{stroke:#5acbff}
266
+ #architectureSvg .teal rect{stroke:#5ef7d8}
267
+ #architectureSvg .purple rect{stroke:#a99cff}
268
+ #architectureSvg .orange rect{stroke:#ffd166}
269
+ #architectureSvg .green rect{stroke:#67f2aa}
270
+
271
+ #architectureSvg .blue .title{fill:#dff8ff}
272
+ #architectureSvg .teal .title{fill:#d9fff7}
273
+ #architectureSvg .purple .title{fill:#eeeaff}
274
+ #architectureSvg .orange .title{fill:#fff0c9}
275
+ #architectureSvg .green .title{fill:#dbfff2}
276
+
277
+ #architectureSvg .flow-path{
278
+ opacity:.24;
279
+ stroke:currentColor;
280
+ stroke-width:4;
281
+ stroke-linecap:round;
282
+ stroke-dasharray:0;
283
+ filter:none;
284
+ transition:opacity .25s ease, stroke-width .25s ease;
285
+ }
286
+
287
+ #architectureSvg .flow-path.active{
288
+ opacity:1;
289
+ stroke-width:5.5;
290
+ filter:drop-shadow(0 0 10px rgba(94,247,216,.28));
291
+ animation:dash 1.8s linear infinite;
292
+ }
293
+
294
+ #architectureSvg .flow-path.feedback{
295
+ stroke-dasharray:14 14;
296
+ }
297
+
298
+ #architectureSvg .reasoning-loop .loop-arrows{
299
+ opacity:.68;
300
+ stroke-width:3.4;
301
+ }
302
+
303
+ #architectureSvg .reasoning-loop .loop-label {
304
+ fill: #fff7df;
305
+ font-size: 16px; /* Reduced from 20px */
306
+ font-weight: 900;
307
+ }
308
+
309
+ #architectureSvg .retrieve-note{
310
+ fill:#f2fbff;
311
+ paint-order:stroke;
312
+ stroke:rgba(2,11,26,.88);
313
+ stroke-width:5px;
314
+ stroke-linejoin:round;
315
+ }
316
+
317
+ /* Motivation vs Logic: the pipeline should remain readable as a static diagram while playback adds meaning. Evidence packets activate only during the retrieve-more stage and move along real source-to-loop routes. */
318
+ #architectureSvg .arch-evidence-flow{
319
+ opacity:0;
320
+ transition:opacity .25s ease;
321
+ pointer-events:none;
322
+ }
323
+
324
+ #architectureSvg .arch-evidence-flow.active{
325
+ opacity:1;
326
+ }
327
+
328
+ #architectureSvg .evidence-route{
329
+ fill:none;
330
+ stroke:rgba(255,255,255,.01);
331
+ stroke-width:1;
332
+ }
333
+
334
+ #architectureSvg .evidence-packet{
335
+ opacity:0;
336
+ filter:drop-shadow(0 0 9px currentColor);
337
+ }
338
+
339
+ #architectureSvg .arch-evidence-flow.active .evidence-packet{
340
+ opacity:1;
341
+ }
342
+
343
+ #architectureSvg .evidence-packet.emr{
344
+ color:#5ef7d8;
345
+ fill:#5ef7d8;
346
+ }
347
+
348
+ #architectureSvg .evidence-packet.cpg{
349
+ color:#a99cff;
350
+ fill:#a99cff;
351
+ }
352
+
353
+ #architectureSvg .evidence-packet.ghost{
354
+ opacity:.68;
355
+ }
356
+
357
+ #architectureSvg .arch-node.active rect{
358
+ filter:drop-shadow(0 0 16px rgba(94,247,216,.20));
359
+ }
360
+
361
+ #architectureSvg .flow-path.blue{color:#74dfff}
362
+ #architectureSvg .flow-path.teal{color:#5ef7d8}
363
+ #architectureSvg .flow-path.purple{color:#a99cff}
364
+ #architectureSvg .flow-path.orange{color:#ffd166}
365
+ #architectureSvg .flow-path.green{color:#67f2aa}
366
+ }
367
+
368
+ .flow-path{
369
+ stroke-width:4.5;
370
+ stroke-dasharray:11 14;
371
+ opacity:.24;
372
+ }
373
+
374
+ .flow-path.active{
375
+ stroke-width:6.5;
376
+ }
377
+
378
+ .flow-path.feedback{
379
+ stroke:#ead37a;
380
+ }
381
+
382
+ .arch-node rect,.diagram-node rect{
383
+ rx:18;
384
+ fill:rgba(7,26,52,.82);
385
+ stroke:rgba(118,214,255,.34);
386
+ }
387
+
388
+ .arch-node text,.diagram-node text{
389
+ font-size:18px;
390
+ letter-spacing:0;
391
+ }
392
+
393
+ .arch-node .sub,.diagram-node .sub{
394
+ font-size:12.5px;
395
+ }
396
+
397
+ .arch-node.answer text{
398
+ font-size:18px;
399
+ }
400
+
401
+ .architecture-notes{
402
+ grid-template-columns:repeat(4,minmax(0,1fr));
403
+ }
404
+
405
+ .two-column{
406
+ align-items:stretch;
407
+ }
408
+
409
+ .two-column>.card{
410
+ padding:28px;
411
+ }
412
+
413
+ .dataset-row{
414
+ grid-template-columns:minmax(170px,220px) minmax(180px,1fr) 76px;
415
+ }
416
+
417
+ .distill-card{
418
+ overflow:hidden;
419
+ }
420
+
421
+ .transfer-diagram{
422
+ grid-template-columns:210px minmax(170px,1fr) 145px;
423
+ min-height:250px;
424
+ }
425
+
426
+ .orb.teacher{
427
+ width:210px;
428
+ justify-self:center;
429
+ }
430
+
431
+ .orb.student{
432
+ width:145px;
433
+ justify-self:center;
434
+ padding:16px;
435
+ }
436
+
437
+ .orb.teacher strong{
438
+ font-size:3.6rem;
439
+ }
440
+
441
+ .orb.student strong{
442
+ font-size:2.65rem;
443
+ }
444
+
445
+ .orb span{
446
+ font-size:1.05rem;
447
+ color:#d2e3f2;
448
+ }
449
+
450
+ .transfer-lines span{
451
+ padding:9px 14px;
452
+ font-size:.95rem;
453
+ }
454
+
455
+ .formula{
456
+ font-size:.95rem;
457
+ line-height:1.55;
458
+ }
459
+
460
+ .merge-frame{
461
+ min-height:clamp(320px,42vw,430px);
462
+ overflow:auto;
463
+ }
464
+
465
+ .merge-panel{
466
+ fill:rgba(7,26,52,.78);
467
+ stroke:rgba(115,202,255,.22);
468
+ stroke-width:1.4;
469
+ }
470
+
471
+ .merge-panel.active{
472
+ stroke:rgba(94,247,216,.78);
473
+ filter:drop-shadow(0 0 16px rgba(94,247,216,.24));
474
+ }
475
+
476
+ .merge-kicker{
477
+ font-size:12px;
478
+ font-weight:900;
479
+ letter-spacing:.18em;
480
+ text-transform:uppercase;
481
+ fill:#66f4d8;
482
+ }
483
+
484
+ .merge-label{
485
+ font-size:22px;
486
+ letter-spacing:-.01em;
487
+ }
488
+
489
+ .merge-sub{
490
+ font-size:13px;
491
+ line-height:1.35;
492
+ }
493
+
494
+ .merge-formula{
495
+ font-family:var(--mono);
496
+ font-size:14px;
497
+ font-weight:800;
498
+ fill:#efffff;
499
+ }
500
+
501
+ .merge-weight{
502
+ opacity:.82;
503
+ filter:drop-shadow(0 0 10px rgba(94,247,216,.22));
504
+ animation:weightRise .9s cubic-bezier(.2,.8,.2,1) both;
505
+ }
506
+
507
+ .merge-weight.delay{
508
+ animation-delay:.12s;
509
+ }
510
+
511
+ .merge-vector,.merge-arc{
512
+ fill:none;
513
+ stroke:var(--aqua);
514
+ stroke-width:6;
515
+ stroke-linecap:round;
516
+ stroke-linejoin:round;
517
+ opacity:.92;
518
+ filter:drop-shadow(0 0 13px rgba(94,247,216,.28));
519
+ marker-end:url(#mergeArrow);
520
+ stroke-dasharray:420;
521
+ stroke-dashoffset:420;
522
+ animation:drawPath 1.1s ease forwards;
523
+ }
524
+
525
+ .merge-vector.kd{
526
+ stroke:var(--cyan);
527
+ }
528
+
529
+ .merge-vector.out{
530
+ stroke-width:5;
531
+ }
532
+
533
+ .merge-point{
534
+ fill:#efffff;
535
+ stroke:var(--aqua);
536
+ stroke-width:4;
537
+ }
538
+
539
+ .merge-drop,.merge-conflict{
540
+ stroke:#ffd166;
541
+ stroke-width:5;
542
+ stroke-linecap:round;
543
+ opacity:.78;
544
+ }
545
+
546
+ @keyframes weightRise{
547
+ from{transform:translateY(18px);opacity:0}
548
+ to{transform:translateY(0);opacity:.82}
549
+ }
550
+
551
+ .chart-meta{
552
+ justify-content:flex-start;
553
+ }
554
+
555
+ .chart-meta span:last-child{
556
+ color:var(--muted);
557
+ margin-left:auto;
558
+ }
559
+
560
+ @media (max-width:1360px){
561
+ .depth-map{display:none}
562
+ }
563
+
564
+ @media (min-width:1361px){
565
+ .section{
566
+ width:min(var(--max),calc(100% - 140px));
567
+ }
568
+ }
569
+
570
+ @media (max-width:1180px){
571
+ .section{
572
+ padding-top:112px;
573
+ scroll-margin-top:112px;
574
+ }
575
+ .two-column,.retrieval-grid,.agent-grid{
576
+ grid-template-columns:minmax(0,1fr);
577
+ }
578
+ .merge-layout{
579
+ grid-template-columns:minmax(0,1fr);
580
+ }
581
+ .merge-controls{
582
+ grid-template-columns:repeat(2,minmax(0,1fr));
583
+ }
584
+ .architecture-notes{
585
+ grid-template-columns:repeat(2,minmax(0,1fr));
586
+ }
587
+ }
588
+
589
+ @media (max-width:900px){
590
+ h1{font-size:clamp(2.7rem,13vw,4.6rem)}
591
+ h2{font-size:clamp(1.9rem,8vw,3.1rem)}
592
+ .hero{grid-template-columns:1fr}
593
+ .transfer-diagram{
594
+ grid-template-columns:1fr;
595
+ justify-items:center;
596
+ }
597
+ .orb.teacher{width:min(230px,70vw)}
598
+ .orb.student{width:min(170px,55vw)}
599
+ .architecture-notes{grid-template-columns:1fr 1fr}
600
+ .site-header{
601
+ width:min(var(--max),calc(100% - 24px));
602
+ }
603
+ .section{
604
+ width:min(100% - 24px,var(--max));
605
+ }
606
+ .panel-title,.eval-toolbar{
607
+ display:grid;
608
+ }
609
+ .architecture-card,.retrieval-card,.sufficiency-card,.evaluation-card,.merge-card,.ledger-card,.caveat,.closing-card{
610
+ padding:20px;
611
+ }
612
+ .architecture-frame svg,
613
+ .merge-frame svg {
614
+ width: 100%;
615
+ min-width: auto; /* Allows it to wrap inside the container */
616
+ height: auto;
617
+ }
618
+ .bar-row,.axis-row{
619
+ grid-template-columns:minmax(0,1fr);
620
+ }
621
+ .bar-track{
622
+ min-width:0;
623
+ }
624
+ }
625
+
626
+ @media (max-width:560px){
627
+ .section{
628
+ width:min(100% - 28px,var(--max));
629
+ padding-top:96px;
630
+ scroll-margin-top:96px;
631
+ }
632
+ .architecture-notes{grid-template-columns:1fr}
633
+ .transfer-lines span{width:100%;text-align:center}
634
+ .merge-frame{min-height:320px}
635
+ .merge-controls{
636
+ grid-template-columns:1fr;
637
+ }
638
+ .stat-grid{
639
+ grid-template-columns:1fr 1fr;
640
+ }
641
+ .dataset-row{
642
+ grid-template-columns:minmax(0,1fr) auto;
643
+ }
644
+ .dataset-name{
645
+ min-width:0;
646
+ }
647
+ .dataset-track{
648
+ grid-column:1/-1;
649
+ }
650
+ .table-wrap{
651
+ max-width:100%;
652
+ }
653
+ }
654
+
655
+ @media (max-width:420px){
656
+ h1{font-size:clamp(2.25rem,12vw,3.2rem)}
657
+ h2{font-size:clamp(1.7rem,9vw,2.45rem)}
658
+ .button-row,.hero-actions,.tabs,.select-group{
659
+ display:grid;
660
+ grid-template-columns:1fr;
661
+ }
662
+ .button,.tab,select{
663
+ width:100%;
664
+ }
665
+ .sonar-readout{
666
+ min-height:auto;
667
+ }
668
+ }
index.html CHANGED
The diff for this file is too large to render. See raw diff