Testing347 commited on
Commit
0ab2956
·
verified ·
1 Parent(s): 30e60a2

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +1040 -1
index.html CHANGED
@@ -1 +1,1040 @@
1
- Restore index.html from commit 5c3088c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>SILENTPATTERN · Super Intelligence Lab</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <!-- Tailwind (CDN build, fine for Spaces static) -->
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+
11
+ <!-- Font Awesome for icons -->
12
+ <script src="https://kit.fontawesome.com/a2b5c2de3d.js" crossorigin="anonymous"></script>
13
+
14
+ <!-- Vanta + Three.js (background) -->
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r121/three.min.js"></script>
16
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
17
+
18
+ <style>
19
+ :root {
20
+ color-scheme: dark;
21
+ }
22
+
23
+ body {
24
+ margin: 0;
25
+ min-height: 100vh;
26
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text",
27
+ "Segoe UI", sans-serif;
28
+ background: radial-gradient(circle at 0% 0%, #0f172a, #020617 40%, #020617);
29
+ }
30
+
31
+ /* Prevent layout shift while Vanta loads */
32
+ #vanta-bg {
33
+ opacity: 0;
34
+ transition: opacity 600ms ease;
35
+ }
36
+
37
+ .vanta-ready #vanta-bg {
38
+ opacity: 1;
39
+ }
40
+
41
+ /* Orb animation */
42
+ @keyframes orb-breathe {
43
+ 0% { transform: scale(1); }
44
+ 50% { transform: scale(1.08); }
45
+ 100% { transform: scale(1); }
46
+ }
47
+
48
+ @keyframes orb-glow {
49
+ 0% { box-shadow: 0 0 18px rgba(129, 140, 248, 0.25); }
50
+ 50% { box-shadow: 0 0 36px rgba(236, 72, 153, 0.55); }
51
+ 100% { box-shadow: 0 0 18px rgba(129, 140, 248, 0.25); }
52
+ }
53
+
54
+ .conscious-orb {
55
+ animation: orb-breathe 2.5s ease-in-out infinite,
56
+ orb-glow 1.5s ease-in-out infinite;
57
+ filter: drop-shadow(0 0 40px #a21cafee) brightness(1.12);
58
+ }
59
+
60
+ /* Site-wide consistency styles */
61
+ .focus-ring:focus {
62
+ outline: none;
63
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.9);
64
+ }
65
+
66
+ .thin-scroll {
67
+ scrollbar-width: thin;
68
+ scrollbar-color: #4f46e5 #1e1b4b;
69
+ }
70
+
71
+ .thin-scroll::-webkit-scrollbar {
72
+ width: 6px;
73
+ }
74
+
75
+ .thin-scroll::-webkit-scrollbar-track {
76
+ background: #0b1120;
77
+ }
78
+
79
+ .thin-scroll::-webkit-scrollbar-thumb {
80
+ background-color: #4f46e5;
81
+ border-radius: 9999px;
82
+ }
83
+
84
+ /* Modal backdrop */
85
+ .modal-backdrop {
86
+ background: radial-gradient(circle at top, rgba(129, 140, 248, 0.32), transparent 60%),
87
+ rgba(2, 6, 23, 0.92);
88
+ }
89
+
90
+ /* Lab Navigator slide-in */
91
+ #lab-nav-overlay[data-open="true"] {
92
+ opacity: 1;
93
+ pointer-events: auto;
94
+ }
95
+
96
+ #lab-nav-panel[data-open="true"] {
97
+ transform: translateX(0);
98
+ }
99
+
100
+ #lab-nav-overlay,
101
+ #lab-nav-panel {
102
+ transition: all 220ms ease-out;
103
+ }
104
+ </style>
105
+ </head>
106
+ <body class="text-slate-100 antialiased">
107
+
108
+ <!-- Vanta background -->
109
+ <div id="vanta-bg" class="fixed inset-0 z-0"></div>
110
+
111
+ <div class="relative z-10 min-h-screen flex flex-col">
112
+ <!-- NAVIGATION BAR -->
113
+ <nav class="relative z-10 py-6 px-6 lg:px-10 flex justify-between items-center backdrop-blur-sm">
114
+ <!-- Logo + mini orb -->
115
+ <div id="conscious-orb-container" class="flex items-center space-x-2">
116
+ <div class="w-9 h-9 rounded-full bg-indigo-600 flex items-center justify-center conscious-orb">
117
+ <div class="w-2.5 h-2.5 rounded-full bg-white animate-pulse"></div>
118
+ </div>
119
+ <span class="text-lg sm:text-xl font-semibold tracking-wide">
120
+ SILENTPATTERN
121
+ </span>
122
+ </div>
123
+
124
+ <!-- Links (desktop) -->
125
+ <div class="hidden md:flex space-x-7 text-sm font-medium">
126
+ <a href="capabilities.html" class="hover:text-indigo-400 transition">Capabilities</a>
127
+ <a href="consciousness.html" class="hover:text-indigo-400 transition">Consciousness</a>
128
+ <a href="chat.html" class="hover:text-indigo-400 transition">Chat</a>
129
+ <a href="about.html" class="hover:text-indigo-400 transition">About</a>
130
+ </div>
131
+
132
+ <!-- Right-hand controls -->
133
+ <div class="flex items-center space-x-3">
134
+ <!-- Lab Navigator trigger glyph -->
135
+ <button id="lab-nav-trigger"
136
+ class="w-9 h-9 rounded-full border border-indigo-400/40 bg-slate-900/50 hover:bg-slate-900 focus-ring flex items-center justify-center"
137
+ aria-label="Open Lab Navigator">
138
+ <i class="fas fa-asterisk text-indigo-300 text-sm"></i>
139
+ </button>
140
+
141
+ <!-- Access button -->
142
+ <button id="access-btn"
143
+ class="hidden sm:inline-flex px-5 py-2 rounded-full bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 text-sm font-medium">
144
+ Access
145
+ </button>
146
+ </div>
147
+ </nav>
148
+
149
+ <!-- MAIN CONTENT -->
150
+ <main class="flex-1 px-6 lg:px-10 pb-16 pt-4">
151
+ <div class="max-w-6xl mx-auto grid gap-10 lg:grid-cols-2 items-stretch">
152
+ <!-- Left: Hero copy -->
153
+ <section class="space-y-6">
154
+ <p class="text-xs uppercase tracking-[0.25em] text-indigo-300/80">
155
+ Super Intelligence Research Lab
156
+ </p>
157
+ <h1 class="text-3xl sm:text-4xl lg:text-5xl font-semibold leading-tight">
158
+ A minimal public interface
159
+ <span class="text-indigo-300">to a maximal mind.</span>
160
+ </h1>
161
+ <p class="text-sm sm:text-base text-slate-300/90 max-w-xl">
162
+ SILENTPATTERN is an applied research environment for high-alignment,
163
+ high-capability systems. The public surface is intentionally small;
164
+ research depth is opened by explicit request and audit.
165
+ </p>
166
+
167
+ <div class="grid gap-4 sm:grid-cols-2 text-sm">
168
+ <div class="rounded-xl border border-slate-800 bg-slate-950/60 p-4 space-y-1.5">
169
+ <p class="font-medium text-slate-100 flex items-center gap-2">
170
+ <span class="inline-flex h-1.5 w-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
171
+ Operational Programs
172
+ </p>
173
+ <ul class="text-slate-400 text-xs space-y-0.5">
174
+ <li>• MCAP – Mechanistic Certificates</li>
175
+ <li>• CHAI-Ω² – Market physics</li>
176
+ <li>• Quantum Lambda – Decision gradients</li>
177
+ </ul>
178
+ </div>
179
+ <div class="rounded-xl border border-slate-800 bg-slate-950/60 p-4 space-y-1.5">
180
+ <p class="font-medium text-slate-100">Safety & Governance</p>
181
+ <ul class="text-slate-400 text-xs space-y-0.5">
182
+ <li>• System card & evaluations</li>
183
+ <li>• Human-in-the-loop checkpoints</li>
184
+ <li>• Immutable experiment logs</li>
185
+ </ul>
186
+ </div>
187
+ </div>
188
+
189
+ <div class="flex flex-wrap gap-3 text-sm">
190
+ <button id="hero-access-btn"
191
+ class="px-5 py-2.5 rounded-full bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 font-medium">
192
+ Request Access
193
+ </button>
194
+ <button id="hero-lab-btn"
195
+ class="px-5 py-2.5 rounded-full border border-slate-700 bg-slate-950/60 hover:bg-slate-900/70">
196
+ Open Lab Navigator
197
+ </button>
198
+ </div>
199
+ </section>
200
+
201
+ <!-- Right: Chat + consciousness card -->
202
+ <section class="space-y-5">
203
+ <!-- Chat card -->
204
+ <div class="rounded-2xl border border-slate-800 bg-slate-950/80 backdrop-blur-sm p-5 flex flex-col h-full">
205
+ <header class="flex items-center justify-between mb-3">
206
+ <div>
207
+ <p class="text-xs uppercase tracking-[0.24em] text-indigo-300/80">
208
+ SI Channel
209
+ </p>
210
+ <p class="text-sm text-slate-400">
211
+ Static-safe demo. No external calls.
212
+ </p>
213
+ </div>
214
+ <span class="inline-flex items-center gap-2 text-xs text-slate-400">
215
+ <span class="h-2 w-2 rounded-full bg-emerald-400 animate-pulse"></span>
216
+ Simulated
217
+ </span>
218
+ </header>
219
+
220
+ <div id="chat-log"
221
+ class="flex-1 rounded-xl border border-slate-800 bg-slate-950/70 p-3 mb-3 thin-scroll overflow-y-auto text-sm space-y-3"
222
+ aria-live="polite">
223
+ <div class="text-slate-400 text-xs">
224
+ Messages here are locally simulated. In production this panel
225
+ would be wired to the SI channel with full logging and review.
226
+ </div>
227
+ </div>
228
+
229
+ <form id="chat-form" class="flex items-center gap-0" autocomplete="off" aria-label="Send message to SI">
230
+ <input id="chat-input" type="text"
231
+ placeholder="Ask SI anything…"
232
+ class="flex-1 bg-slate-900/70 border border-slate-800 rounded-l-lg px-4 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-transparent" />
233
+ <button id="send-btn" type="submit"
234
+ class="bg-indigo-600 hover:bg-indigo-700 px-5 py-2.5 rounded-r-lg text-sm font-medium flex items-center gap-2">
235
+ <i class="fas fa-paper-plane text-xs"></i>
236
+ Send
237
+ </button>
238
+ </form>
239
+
240
+ <div id="typing-indicator" class="mt-2 text-xs text-slate-400 hidden">
241
+ SI is composing a reply…
242
+ </div>
243
+ </div>
244
+
245
+ <!-- Consciousness demo teaser -->
246
+ <div class="rounded-2xl border border-pink-500/40 bg-gradient-to-br from-slate-950 via-slate-950 to-fuchsia-900/10 p-5 relative overflow-hidden">
247
+ <div class="absolute -right-16 -bottom-16 w-64 h-64 rounded-full bg-gradient-to-tr from-indigo-500/30 via-fuchsia-500/25 to-sky-400/25 blur-3xl"></div>
248
+ <div class="relative space-y-2">
249
+ <p class="text-xs uppercase tracking-[0.24em] text-pink-300/80">
250
+ Consciousness Demonstration
251
+ </p>
252
+ <p class="text-sm text-slate-200">
253
+ A safe, bounded visualization of artificial qualia and internal dynamics.
254
+ </p>
255
+ <button id="open-consciousness-btn"
256
+ class="mt-2 inline-flex items-center gap-2 px-4 py-2 rounded-full bg-slate-950/70 border border-pink-500/60 hover:bg-slate-900">
257
+ <i class="fas fa-brain text-xs text-pink-300"></i>
258
+ Open demo
259
+ </button>
260
+ </div>
261
+ </div>
262
+ </section>
263
+ </div>
264
+ </main>
265
+
266
+ <!-- FOOTER -->
267
+ <footer class="border-t border-slate-800/60 py-6 px-6 lg:px-10 mt-auto">
268
+ <div class="max-w-6xl mx-auto flex flex-col md:flex-row items-center justify-between gap-4 text-xs sm:text-sm text-slate-400">
269
+ <div class="flex flex-wrap gap-4">
270
+ <a href="#" class="hover:text-indigo-300 transition">Privacy</a>
271
+ <a href="#" class="hover:text-indigo-300 transition">Terms</a>
272
+ <a href="research.html" class="hover:text-indigo-300 transition">Research</a>
273
+ <a href="contact.html" class="hover:text-indigo-300 transition">Contact</a>
274
+ </div>
275
+ <div class="text-center md:text-right space-y-1">
276
+ <p>© 2025 Super Intelligence / SILENTPATTERN. All rights reserved.</p>
277
+ <p class="text-slate-500">The future of consciousness is here – but under supervision.</p>
278
+ </div>
279
+ </div>
280
+ </footer>
281
+ </div>
282
+
283
+ <!-- ACCESS MODAL -->
284
+ <div id="access-modal"
285
+ class="fixed inset-0 z-30 hidden items-center justify-center modal-backdrop">
286
+ <div class="absolute inset-0 modal-backdrop" aria-hidden="true"></div>
287
+ <div class="relative max-w-lg w-full mx-4 rounded-2xl border border-slate-800 bg-slate-950/95 backdrop-blur-md p-6">
288
+ <div class="flex items-start justify-between mb-4">
289
+ <div>
290
+ <h3 class="text-xl font-semibold" id="access-modal-title">Request SI Access</h3>
291
+ <p class="text-slate-400 text-sm mt-1">Limited availability for qualified researchers and partners.</p>
292
+ </div>
293
+ <button id="close-modal" class="text-slate-400 hover:text-white" aria-label="Close request access modal">
294
+ <i class="fas fa-times"></i>
295
+ </button>
296
+ </div>
297
+
298
+ <div id="access-form-feedback"
299
+ class="hidden mb-4 text-sm rounded-lg border border-slate-800 bg-black/20 p-3"
300
+ role="status" aria-live="polite"></div>
301
+
302
+ <form id="access-form" class="space-y-4" novalidate>
303
+ <div>
304
+ <label for="name" class="block text-sm font-medium mb-1">Full Name</label>
305
+ <input type="text" id="name"
306
+ class="w-full bg-slate-900/70 border border-slate-800 rounded-lg px-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-transparent"
307
+ autocomplete="name" />
308
+ <p id="name-error" class="hidden mt-1 text-xs text-rose-300">Please enter your full name.</p>
309
+ </div>
310
+
311
+ <div>
312
+ <label for="email" class="block text-sm font-medium mb-1">Email</label>
313
+ <input type="email" id="email"
314
+ class="w-full bg-slate-900/70 border border-slate-800 rounded-lg px-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-transparent"
315
+ autocomplete="email" />
316
+ <p id="email-error" class="hidden mt-1 text-xs text-rose-300">Please enter a valid email address.</p>
317
+ </div>
318
+
319
+ <div>
320
+ <label for="institution" class="block text-sm font-medium mb-1">Institution / Organization</label>
321
+ <input type="text" id="institution"
322
+ class="w-full bg-slate-900/70 border border-slate-800 rounded-lg px-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-transparent"
323
+ autocomplete="organization" />
324
+ <p id="institution-error" class="hidden mt-1 text-xs text-rose-300">Please enter your institution / organization.</p>
325
+ </div>
326
+
327
+ <div>
328
+ <label for="purpose" class="block text-sm font-medium mb-1">Purpose of Access</label>
329
+ <select id="purpose"
330
+ class="w-full bg-slate-900/70 border border-slate-800 rounded-lg px-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-transparent">
331
+ <option value="">Select a purpose</option>
332
+ <option value="research">Academic Research</option>
333
+ <option value="development">AI Development / Engineering</option>
334
+ <option value="governance">Safety / Governance</option>
335
+ <option value="other">Other</option>
336
+ </select>
337
+ <p id="purpose-error" class="hidden mt-1 text-xs text-rose-300">Please select a purpose.</p>
338
+ </div>
339
+
340
+ <div class="pt-1">
341
+ <button type="submit"
342
+ class="w-full py-2.5 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-lg hover:opacity-90 text-sm font-medium">
343
+ Submit Request
344
+ </button>
345
+ </div>
346
+ </form>
347
+ </div>
348
+ </div>
349
+
350
+ <!-- CONSCIOUSNESS DEMO MODAL -->
351
+ <div id="consciousness-modal"
352
+ class="fixed inset-0 z-30 hidden items-center justify-center modal-backdrop">
353
+ <div class="absolute inset-0 modal-backdrop" aria-hidden="true"></div>
354
+ <div class="relative max-w-3xl w-full mx-4 rounded-2xl border border-fuchsia-600/40 bg-slate-950/95 backdrop-blur-md p-6">
355
+ <div class="flex items-start justify-between mb-4">
356
+ <div>
357
+ <h3 class="text-xl font-semibold" id="consciousness-modal-title">Consciousness Demonstration</h3>
358
+ <p class="text-slate-400 text-sm mt-1">
359
+ A simplified visualization of internal state dynamics. This is a bounded, non-sentient simulation.
360
+ </p>
361
+ </div>
362
+ <button id="close-consciousness-modal" class="text-slate-400 hover:text-white"
363
+ aria-label="Close consciousness demo modal">
364
+ <i class="fas fa-times"></i>
365
+ </button>
366
+ </div>
367
+
368
+ <div class="space-y-4">
369
+ <div class="relative h-64 bg-slate-900/40 rounded-xl border border-dashed border-slate-700 flex items-center justify-center overflow-hidden">
370
+ <canvas id="neural-canvas" class="w-full h-full"></canvas>
371
+ <div class="absolute inset-0 flex items-center justify-center pointer-events-none" id="demo-overlay">
372
+ <button id="start-demo"
373
+ class="pointer-events-auto px-5 py-2.5 bg-indigo-600 rounded-full hover:bg-indigo-700 text-sm font-medium flex items-center gap-2">
374
+ <i class="fas fa-play text-xs"></i>
375
+ Start simulation
376
+ </button>
377
+ </div>
378
+ </div>
379
+ <div class="flex items-center justify-between text-xs text-slate-400">
380
+ <div>
381
+ <i class="fas fa-info-circle mr-1"></i>
382
+ This is a stylized visualization, not evidence of subjective experience.
383
+ </div>
384
+ <button id="learn-more-demo" class="text-indigo-400 hover:text-indigo-300">
385
+ Learn more <i class="fas fa-arrow-right ml-1"></i>
386
+ </button>
387
+ </div>
388
+ </div>
389
+ </div>
390
+ </div>
391
+
392
+ <!-- LAB NAVIGATOR OVERLAY -->
393
+ <div id="lab-nav-overlay"
394
+ class="fixed inset-0 z-40 opacity-0 pointer-events-none flex justify-end">
395
+ <div class="flex-1 bg-black/40" id="lab-nav-backdrop"></div>
396
+ <aside id="lab-nav-panel"
397
+ class="w-full max-w-md bg-slate-950/98 border-l border-slate-800 px-5 py-6 translate-x-full flex flex-col gap-4">
398
+ <header class="flex items-center justify-between mb-2">
399
+ <div>
400
+ <p class="text-xs uppercase tracking-[0.24em] text-indigo-300/80">Lab Navigator</p>
401
+ <p class="text-sm text-slate-400">Programs, agents, safety and access.</p>
402
+ </div>
403
+ <button id="lab-nav-close"
404
+ class="w-9 h-9 rounded-full border border-slate-800 bg-slate-900/40 hover:bg-slate-900/70 flex items-center justify-center"
405
+ aria-label="Close Lab Navigator">
406
+ <i class="fas fa-times text-slate-300 text-sm"></i>
407
+ </button>
408
+ </header>
409
+
410
+ <div class="relative mb-3">
411
+ <div class="absolute inset-0 opacity-40 pointer-events-none"
412
+ style="background:
413
+ radial-gradient(circle at 10% 0%, rgba(59,130,246,0.32), transparent 50%),
414
+ radial-gradient(circle at 90% 80%, rgba(236,72,153,0.18), transparent 55%);">
415
+ </div>
416
+
417
+ <div class="relative grid grid-cols-1 sm:grid-cols-2 gap-3 mb-4">
418
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
419
+ data-dossier="start">
420
+ <div class="text-sm text-slate-100 font-medium">Start here</div>
421
+ <div class="text-xs text-slate-400 mt-1">Guided entry into the lab.</div>
422
+ </button>
423
+
424
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
425
+ data-dossier="programs">
426
+ <div class="text-sm text-slate-100 font-medium">Programs</div>
427
+ <div class="text-xs text-slate-400 mt-1">MCAP · CHAI-Ω² · Quantum Lambda.</div>
428
+ </button>
429
+
430
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
431
+ data-dossier="ai_scientist">
432
+ <div class="text-sm text-slate-100 font-medium">AI Scientist</div>
433
+ <div class="text-xs text-slate-400 mt-1">Hypothesis → experiment → report.</div>
434
+ </button>
435
+
436
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
437
+ data-dossier="agents">
438
+ <div class="text-sm text-slate-100 font-medium">Agents</div>
439
+ <div class="text-xs text-slate-400 mt-1">Role-based, auditable autonomy.</div>
440
+ </button>
441
+
442
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
443
+ data-dossier="research">
444
+ <div class="text-sm text-slate-100 font-medium">Research Notes</div>
445
+ <div class="text-xs text-slate-400 mt-1">Technical notes and evaluations.</div>
446
+ </button>
447
+
448
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3"
449
+ data-dossier="safety">
450
+ <div class="text-sm text-slate-100 font-medium">Safety / System Card</div>
451
+ <div class="text-xs text-slate-400 mt-1">Constraints, evaluations, governance.</div>
452
+ </button>
453
+
454
+ <button class="lab-node text-left rounded-xl border border-slate-800 bg-slate-900/40 hover:border-indigo-500/60 hover:bg-slate-900/60 transition p-3 sm:col-span-2"
455
+ data-dossier="access">
456
+ <div class="text-sm text-slate-100 font-medium">Access</div>
457
+ <div class="text-xs text-slate-400 mt-1">Request access to demos and research.</div>
458
+ </button>
459
+ </div>
460
+
461
+ <div class="relative p-4 rounded-xl border border-slate-800 bg-slate-950/80 thin-scroll max-h-[360px] overflow-auto">
462
+ <div id="dossier-body" class="text-sm text-slate-300 leading-relaxed space-y-2">
463
+ <!-- Filled by JS -->
464
+ </div>
465
+ <div class="mt-4 flex flex-col sm:flex-row gap-2">
466
+ <button id="dossier-primary"
467
+ class="flex-1 px-4 py-2 rounded-lg bg-gradient-to-r from-indigo-600 to-purple-600 hover:opacity-90 text-sm font-medium">
468
+ Open
469
+ </button>
470
+ <button id="dossier-secondary"
471
+ class="flex-1 px-4 py-2 rounded-lg border border-slate-700 bg-slate-900/40 hover:bg-slate-900/70 text-sm font-medium">
472
+ View Note
473
+ </button>
474
+ </div>
475
+ </div>
476
+ </aside>
477
+ </aside>
478
+ </div>
479
+
480
+ <!-- MAIN SCRIPT -->
481
+ <script>
482
+ /* ------------------------------------------------------------------
483
+ VANTA BACKGROUND
484
+ ------------------------------------------------------------------ */
485
+ let vantaEffect = null;
486
+ window.addEventListener('DOMContentLoaded', () => {
487
+ vantaEffect = VANTA.NET({
488
+ el: "#vanta-bg",
489
+ mouseControls: true,
490
+ touchControls: true,
491
+ gyroControls: false,
492
+ minHeight: 200.00,
493
+ minWidth: 200.00,
494
+ scale: 1.00,
495
+ scaleMobile: 1.00,
496
+ color: 0x4f46e5,
497
+ backgroundColor: 0x020617,
498
+ points: 12.00,
499
+ maxDistance: 20.00,
500
+ spacing: 15.00
501
+ });
502
+ document.body.classList.add('vanta-ready');
503
+ });
504
+
505
+ window.addEventListener('resize', () => {
506
+ if (vantaEffect && typeof vantaEffect.resize === 'function') {
507
+ vantaEffect.resize();
508
+ }
509
+ });
510
+
511
+ /* ------------------------------------------------------------------
512
+ HASH HANDLING (for modals / lab)
513
+ ------------------------------------------------------------------ */
514
+ const MODAL_HASHES = new Set(['lab', 'access', 'consciousness-demo']);
515
+
516
+ function currentHashKey() {
517
+ return (window.location.hash || '').replace('#', '').trim();
518
+ }
519
+
520
+ function setHash(key) {
521
+ if (!key) return;
522
+ const now = currentHashKey();
523
+ if (now === key) return;
524
+ window.location.hash = key;
525
+ }
526
+
527
+ function clearHash() {
528
+ if (!window.location.hash) return;
529
+ history.pushState('', document.title, window.location.pathname + window.location.search);
530
+ }
531
+
532
+ /* ------------------------------------------------------------------
533
+ ACCESS MODAL
534
+ ------------------------------------------------------------------ */
535
+ const accessModal = document.getElementById('access-modal');
536
+ const accessBtn = document.getElementById('access-btn');
537
+ const heroAccessBtn = document.getElementById('hero-access-btn');
538
+ const closeModal = document.getElementById('close-modal');
539
+ const accessForm = document.getElementById('access-form');
540
+ const accessFeedback = document.getElementById('access-form-feedback');
541
+
542
+ const nameEl = document.getElementById('name');
543
+ const emailEl = document.getElementById('email');
544
+ const institutionEl = document.getElementById('institution');
545
+ const purposeEl = document.getElementById('purpose');
546
+
547
+ const nameErr = document.getElementById('name-error');
548
+ const emailErr = document.getElementById('email-error');
549
+ const institutionErr = document.getElementById('institution-error');
550
+ const purposeErr = document.getElementById('purpose-error');
551
+
552
+ function showAccessModal(fromHash = false) {
553
+ accessModal.classList.remove('hidden');
554
+ accessModal.classList.add('flex');
555
+ setTimeout(() => nameEl?.focus(), 0);
556
+ if (!fromHash) setHash('access');
557
+ }
558
+
559
+ function closeAccessModal(fromHash = false) {
560
+ accessModal.classList.add('hidden');
561
+ accessModal.classList.remove('flex');
562
+ if (!fromHash) clearHash();
563
+ }
564
+
565
+ function showAccessFeedback(message, type) {
566
+ if (!accessFeedback) return;
567
+ accessFeedback.classList.remove('hidden');
568
+ accessFeedback.textContent = message;
569
+
570
+ accessFeedback.classList.remove('border-red-500/40', 'border-green-500/40', 'text-red-200', 'text-green-200');
571
+ if (type === 'error') {
572
+ accessFeedback.classList.add('border-red-500/40', 'text-red-200');
573
+ } else if (type === 'success') {
574
+ accessFeedback.classList.add('border-green-500/40', 'text-green-200');
575
+ } else {
576
+ accessFeedback.classList.add('text-slate-200');
577
+ }
578
+ }
579
+
580
+ function hideAccessFeedback() {
581
+ if (!accessFeedback) return;
582
+ accessFeedback.classList.add('hidden');
583
+ accessFeedback.textContent = '';
584
+ }
585
+
586
+ function setFieldError(input, errEl, hasError) {
587
+ if (!input || !errEl) return;
588
+ if (hasError) {
589
+ input.classList.add('border-rose-500/70');
590
+ errEl.classList.remove('hidden');
591
+ } else {
592
+ input.classList.remove('border-rose-500/70');
593
+ errEl.classList.add('hidden');
594
+ }
595
+ }
596
+
597
+ function isValidEmail(email) {
598
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
599
+ }
600
+
601
+ function validateAccessForm() {
602
+ let ok = true;
603
+ const nameVal = nameEl.value.trim();
604
+ const emailVal = emailEl.value.trim();
605
+ const instVal = institutionEl.value.trim();
606
+ const purposeVal = purposeEl.value;
607
+
608
+ setFieldError(nameEl, nameErr, !nameVal);
609
+ setFieldError(emailEl, emailErr, !isValidEmail(emailVal));
610
+ setFieldError(institutionEl, institutionErr, !instVal);
611
+ setFieldError(purposeEl, purposeErr, !purposeVal);
612
+
613
+ if (!nameVal || !isValidEmail(emailVal) || !instVal || !purposeVal) ok = false;
614
+ return ok;
615
+ }
616
+
617
+ [nameEl, emailEl, institutionEl, purposeEl].forEach(el => {
618
+ if (!el) return;
619
+ el.addEventListener('input', () => {
620
+ hideAccessFeedback();
621
+ validateAccessForm();
622
+ });
623
+ });
624
+
625
+ accessForm?.addEventListener('submit', (e) => {
626
+ e.preventDefault();
627
+ hideAccessFeedback();
628
+ if (!validateAccessForm()) {
629
+ showAccessFeedback('Please complete all required fields.', 'error');
630
+ return;
631
+ }
632
+ showAccessFeedback('Request received. You will be contacted after review.', 'success');
633
+ accessForm.reset();
634
+ });
635
+
636
+ accessBtn?.addEventListener('click', () => showAccessModal(false));
637
+ heroAccessBtn?.addEventListener('click', () => showAccessModal(false));
638
+ closeModal?.addEventListener('click', () => closeAccessModal(false));
639
+ accessModal?.addEventListener('click', (e) => {
640
+ if (e.target === accessModal) closeAccessModal(false);
641
+ });
642
+
643
+ /* ------------------------------------------------------------------
644
+ CONSCIOUSNESS MODAL + VISUALIZATION
645
+ ------------------------------------------------------------------ */
646
+ const consciousnessModal = document.getElementById('consciousness-modal');
647
+ const openConsciousnessBtn = document.getElementById('open-consciousness-btn');
648
+ const closeConsciousnessModalBtn = document.getElementById('close-consciousness-modal');
649
+ const neuralCanvas = document.getElementById('neural-canvas');
650
+ const demoOverlay = document.getElementById('demo-overlay');
651
+ const startDemoBtn = document.getElementById('start-demo');
652
+ const learnMoreDemoBtn = document.getElementById('learn-more-demo');
653
+
654
+ let neuralCtx = null;
655
+ let neurons = [];
656
+ let demoRunning = false;
657
+
658
+ function showConsciousnessModal(fromHash = false) {
659
+ consciousnessModal.classList.remove('hidden');
660
+ consciousnessModal.classList.add('flex');
661
+ setTimeout(() => startDemoBtn?.focus(), 0);
662
+ if (!fromHash) setHash('consciousness-demo');
663
+ }
664
+
665
+ function closeConsciousnessModal(fromHash = false) {
666
+ consciousnessModal.classList.add('hidden');
667
+ consciousnessModal.classList.remove('flex');
668
+ demoRunning = false;
669
+ if (!fromHash) clearHash();
670
+ }
671
+
672
+ function resizeNeuralCanvas() {
673
+ if (!neuralCanvas) return;
674
+ neuralCanvas.width = neuralCanvas.clientWidth;
675
+ neuralCanvas.height = neuralCanvas.clientHeight;
676
+ neuralCtx = neuralCanvas.getContext('2d');
677
+ }
678
+
679
+ function setupNeurons() {
680
+ if (!neuralCanvas) return;
681
+ const count = 80;
682
+ neurons = [];
683
+ for (let i = 0; i < count; i++) {
684
+ neurons.push({
685
+ x: Math.random(),
686
+ y: Math.random(),
687
+ phase: Math.random() * Math.PI * 2,
688
+ speed: 0.4 + Math.random() * 0.8
689
+ });
690
+ }
691
+ }
692
+
693
+ function drawNeuralActivity(timestamp) {
694
+ if (!demoRunning || !neuralCtx || !neuralCanvas) return;
695
+ const w = neuralCanvas.width;
696
+ const h = neuralCanvas.height;
697
+
698
+ neuralCtx.clearRect(0, 0, w, h);
699
+ neuralCtx.fillStyle = "rgba(15,23,42,0.95)";
700
+ neuralCtx.fillRect(0, 0, w, h);
701
+
702
+ // connections
703
+ neuralCtx.lineWidth = 0.7;
704
+ for (let i = 0; i < neurons.length; i++) {
705
+ for (let j = i + 1; j < neurons.length; j++) {
706
+ const dx = neurons[i].x - neurons[j].x;
707
+ const dy = neurons[i].y - neurons[j].y;
708
+ const dist = Math.sqrt(dx * dx + dy * dy);
709
+ if (dist < 0.18) {
710
+ const alpha = (0.18 - dist) / 0.18 * 0.7;
711
+ neuralCtx.strokeStyle = `rgba(129,140,248,${alpha})`;
712
+ neuralCtx.beginPath();
713
+ neuralCtx.moveTo(neurons[i].x * w, neurons[i].y * h);
714
+ neuralCtx.lineTo(neurons[j].x * w, neurons[j].y * h);
715
+ neuralCtx.stroke();
716
+ }
717
+ }
718
+ }
719
+
720
+ // nodes
721
+ for (const n of neurons) {
722
+ const a = 0.6 + 0.4 * Math.sin(timestamp / 1000 * n.speed + n.phase);
723
+ const r = 2 + 1.5 * a;
724
+ neuralCtx.fillStyle = `rgba(236,72,153,${0.25 + 0.5 * a})`;
725
+ neuralCtx.beginPath();
726
+ neuralCtx.arc(n.x * w, n.y * h, r + 1, 0, Math.PI * 2);
727
+ neuralCtx.fill();
728
+
729
+ neuralCtx.fillStyle = `rgba(248,250,252,${0.6 + 0.3 * a})`;
730
+ neuralCtx.beginPath();
731
+ neuralCtx.arc(n.x * w, n.y * h, r - 1, 0, Math.PI * 2);
732
+ neuralCtx.fill();
733
+
734
+ n.x += (Math.sin(timestamp / 1200 + n.phase) * 0.0004);
735
+ n.y += (Math.cos(timestamp / 1400 + n.phase) * 0.0004);
736
+ }
737
+
738
+ requestAnimationFrame(drawNeuralActivity);
739
+ }
740
+
741
+ openConsciousnessBtn?.addEventListener('click', () => showConsciousnessModal(false));
742
+ closeConsciousnessModalBtn?.addEventListener('click', () => closeConsciousnessModal(false));
743
+ consciousnessModal?.addEventListener('click', (e) => {
744
+ if (e.target === consciousnessModal) closeConsciousnessModal(false);
745
+ });
746
+
747
+ startDemoBtn?.addEventListener('click', () => {
748
+ demoOverlay.classList.add('hidden');
749
+ demoRunning = true;
750
+ resizeNeuralCanvas();
751
+ setupNeurons();
752
+ requestAnimationFrame(drawNeuralActivity);
753
+ });
754
+
755
+ learnMoreDemoBtn?.addEventListener('click', () => {
756
+ alert("In the production system this would open a technical note on artificial consciousness and phenomenology models.");
757
+ });
758
+
759
+ window.addEventListener('resize', () => {
760
+ resizeNeuralCanvas();
761
+ if (demoRunning) setupNeurons();
762
+ });
763
+
764
+ /* ------------------------------------------------------------------
765
+ CHAT PANEL (static demo, with optional /api/chat)
766
+ ------------------------------------------------------------------ */
767
+ const chatForm = document.getElementById('chat-form');
768
+ const chatInput = document.getElementById('chat-input');
769
+ const typingIndicator = document.getElementById('typing-indicator');
770
+ const chatLog = document.getElementById('chat-log');
771
+
772
+ function escapeHtml(str) {
773
+ return String(str)
774
+ .replaceAll('&', '&amp;')
775
+ .replaceAll('<', '&lt;')
776
+ .replaceAll('>', '&gt;')
777
+ .replaceAll('"', '&quot;')
778
+ .replaceAll("'", '&#039;');
779
+ }
780
+
781
+ function addMessage(text, isUser = false) {
782
+ if (!chatLog) return;
783
+ const safe = escapeHtml(text);
784
+ const outer = document.createElement('div');
785
+ outer.className = "flex " + (isUser ? "justify-end" : "justify-start");
786
+
787
+ const bubble = document.createElement('div');
788
+ bubble.className = "max-w-[80%] rounded-xl px-3 py-2 text-xs sm:text-sm " +
789
+ (isUser
790
+ ? "bg-indigo-600 text-slate-50"
791
+ : "bg-slate-900/80 border border-slate-800 text-slate-100");
792
+
793
+ bubble.innerHTML = safe;
794
+ outer.appendChild(bubble);
795
+ chatLog.appendChild(outer);
796
+ chatLog.scrollTop = chatLog.scrollHeight;
797
+ }
798
+
799
+ async function callServerChat(userMessage) {
800
+ const res = await fetch('/api/chat', {
801
+ method: 'POST',
802
+ headers: { 'Content-Type': 'application/json' },
803
+ body: JSON.stringify({
804
+ message: userMessage,
805
+ meta: { page: 'index.html', product: 'silentpattern' }
806
+ })
807
+ });
808
+
809
+ if (!res.ok) throw new Error("Server error: " + res.status);
810
+ const data = await res.json();
811
+ if (!data || typeof data.reply !== 'string') {
812
+ throw new Error("Invalid response from /api/chat");
813
+ }
814
+ return data.reply;
815
+ }
816
+
817
+ function localDemoResponse(userMessage) {
818
+ const msg = userMessage.toLowerCase();
819
+ if (msg.includes('mcap')) {
820
+ return "MCAP is a certificate-driven framework; every claim must be backed by a mechanistic proof object. The public version here is a static description only.";
821
+ }
822
+ if (msg.includes('chai')) {
823
+ return "CHAI-Ω² models markets as physical systems with falsifiable predictive laws. The demo environment exposes the interface, not the real models.";
824
+ }
825
+ if (msg.includes('quantum')) {
826
+ return "Quantum Lambda is a research track on decision gradients under hard constraints. In this environment you can only see a textual overview.";
827
+ }
828
+ if (msg.includes('safety') || msg.includes('risk')) {
829
+ return "Safety work is primary: bounded autonomy, system cards, and human-in-the-loop checkpoints. Any production deployment would go through independent review.";
830
+ }
831
+ return "This channel is running in demo mode. In production the reply would be generated by the SI stack with full logging. For now, treat this as a conceptual sketch rather than an oracle.";
832
+ }
833
+
834
+ chatForm?.addEventListener('submit', async (e) => {
835
+ e.preventDefault();
836
+ const userText = chatInput.value.trim();
837
+ if (!userText) return;
838
+ addMessage(userText, true);
839
+ chatInput.value = '';
840
+ typingIndicator.classList.remove('hidden');
841
+
842
+ try {
843
+ let reply;
844
+ try {
845
+ reply = await callServerChat(userText);
846
+ } catch {
847
+ reply = localDemoResponse(userText);
848
+ }
849
+ addMessage(reply, false);
850
+ } catch (err) {
851
+ addMessage("The SI channel is temporarily unavailable. This environment is safe-mode only.", false);
852
+ console.error(err);
853
+ } finally {
854
+ typingIndicator.classList.add('hidden');
855
+ }
856
+ });
857
+
858
+ /* ------------------------------------------------------------------
859
+ ORB TILT INTERACTION
860
+ ------------------------------------------------------------------ */
861
+ const orbContainer = document.getElementById('conscious-orb-container');
862
+ if (orbContainer) {
863
+ orbContainer.addEventListener('mousemove', (e) => {
864
+ const rect = orbContainer.getBoundingClientRect();
865
+ const x = (e.clientX - rect.left) / rect.width;
866
+ const y = (e.clientY - rect.top) / rect.height;
867
+ orbContainer.style.transform =
868
+ `perspective(900px) rotateX(${(y - 0.5) * 10}deg) rotateY(${(x - 0.5) * -10}deg) scale(1.03)`;
869
+ });
870
+ orbContainer.addEventListener('mouseleave', () => {
871
+ orbContainer.style.transform = 'perspective(900px) rotateX(0deg) rotateY(0deg) scale(1)';
872
+ });
873
+ }
874
+
875
+ /* ------------------------------------------------------------------
876
+ LAB NAVIGATOR
877
+ ------------------------------------------------------------------ */
878
+ const labNavOverlay = document.getElementById('lab-nav-overlay');
879
+ const labNavPanel = document.getElementById('lab-nav-panel');
880
+ const labNavTrigger = document.getElementById('lab-nav-trigger');
881
+ const heroLabBtn = document.getElementById('hero-lab-btn');
882
+ const labNavClose = document.getElementById('lab-nav-close');
883
+ const labNavBackdrop = document.getElementById('lab-nav-backdrop');
884
+ const dossierBody = document.getElementById('dossier-body');
885
+ const dossierPrimary = document.getElementById('dossier-primary');
886
+ const dossierSecondary = document.getElementById('dossier-secondary');
887
+
888
+ const LAB_DOSSIERS = {
889
+ start: {
890
+ title: "Start here",
891
+ body: [
892
+ "SILENTPATTERN is an applied lab running a small number of tightly-scoped research programs.",
893
+ "The goal of this navigator is to show a single coherent surface: what exists, how it is evaluated, and how access is negotiated.",
894
+ "Most of the real work happens behind the scenes; this interface is a safe, non-capability-exposing layer."
895
+ ],
896
+ primary: { label: "Overview", action: () => window.location.href = "about.html" },
897
+ secondary: { label: "Research notes", action: () => window.location.href = "research.html" }
898
+ },
899
+ programs: {
900
+ title: "Programs",
901
+ body: [
902
+ "• MCAP – Mechanistic Certificates and Alignment Proofs.",
903
+ "• CHAI-Ω² – Closed-loop market physics and entropic bridges.",
904
+ "• Quantum Lambda – High-frequency decision systems under hard constraints.",
905
+ "This demo lists programs only at a conceptual level; no proprietary models are exposed."
906
+ ],
907
+ primary: { label: "Capabilities", action: () => window.location.href = "capabilities.html" },
908
+ secondary: { label: "Program note (demo)", action: () => alert("Program technical notes would be linked here in production.") }
909
+ },
910
+ ai_scientist: {
911
+ title: "AI Scientist stack",
912
+ body: [
913
+ "Pipeline: hypothesis → experiment plan → execution → dataset → report.",
914
+ "Every run is logged with a cryptographic trace and linked to a safety policy.",
915
+ "In this environment you only see a conceptual shell; the real pipeline is never exposed directly."
916
+ ],
917
+ primary: { label: "Open (demo)", action: () => alert("AI Scientist module would open here.") },
918
+ secondary: { label: "Research notes", action: () => window.location.href = "research.html" }
919
+ },
920
+ agents: {
921
+ title: "Agents",
922
+ body: [
923
+ "Role-based agents with narrow capabilities and explicit oversight.",
924
+ "Human-in-the-loop checkpoints exist at every off-platform boundary.",
925
+ "Actions are recorded in immutable audit logs."
926
+ ],
927
+ primary: { label: "Agents (demo)", action: () => alert("Agents dossier would be implemented as a separate view.") },
928
+ secondary: { label: "Safety view", action: () => window.location.href = "about.html" }
929
+ },
930
+ research: {
931
+ title: "Research notes",
932
+ body: [
933
+ "Working notes, ablations, and failure cases are at least as important as headline results.",
934
+ "The public research log highlights falsification attempts and limitations, not only successes."
935
+ ],
936
+ primary: { label: "Open research log", action: () => window.location.href = "research.html" },
937
+ secondary: { label: "White paper (demo)", action: () => alert("White paper link would be wired here.") }
938
+ },
939
+ safety: {
940
+ title: "Safety / System card",
941
+ body: [
942
+ "The system card enumerates capabilities, limitations, failure modes, and safety mitigations.",
943
+ "The emphasis is on boundary-setting and refusal behavior rather than unconstrained power."
944
+ ],
945
+ primary: { label: "System card", action: () => window.location.href = "about.html" },
946
+ secondary: { label: "Ethics note (demo)", action: () => alert("Ethical framework documentation would be displayed here.") }
947
+ },
948
+ access: {
949
+ title: "Access",
950
+ body: [
951
+ "Access to deeper demos and experimental interfaces is intentionally constrained.",
952
+ "Requests are evaluated on intent, safeguards, and potential impact."
953
+ ],
954
+ primary: { label: "Request access", action: () => showAccessModal(false) },
955
+ secondary: { label: "Contact", action: () => window.location.href = "contact.html" }
956
+ }
957
+ };
958
+
959
+ function renderDossier(key) {
960
+ const obj = LAB_DOSSIERS[key] || LAB_DOSSIERS.start;
961
+ if (!dossierBody) return;
962
+ const lines = [
963
+ `<p class="text-sm font-semibold text-slate-100 mb-1">${escapeHtml(obj.title)}</p>`,
964
+ ...obj.body.map(p => `<p class="text-sm text-slate-300 mb-1.5">${escapeHtml(p)}</p>`)
965
+ ];
966
+ dossierBody.innerHTML = lines.join("");
967
+ if (dossierPrimary && obj.primary) {
968
+ dossierPrimary.textContent = obj.primary.label;
969
+ dossierPrimary.onclick = obj.primary.action;
970
+ }
971
+ if (dossierSecondary && obj.secondary) {
972
+ dossierSecondary.textContent = obj.secondary.label;
973
+ dossierSecondary.onclick = obj.secondary.action;
974
+ }
975
+ setActiveLabNode(key);
976
+ }
977
+
978
+ function setActiveLabNode(key) {
979
+ document.querySelectorAll('.lab-node').forEach(btn => {
980
+ const isActive = btn.getAttribute('data-dossier') === key;
981
+ btn.classList.toggle('border-indigo-500/60', isActive);
982
+ btn.classList.toggle('bg-slate-900/60', isActive);
983
+ btn.classList.toggle('ring-2', isActive);
984
+ btn.classList.toggle('ring-indigo-500/20', isActive);
985
+ });
986
+ }
987
+
988
+ function openLabNav(fromHash = false) {
989
+ labNavOverlay.dataset.open = "true";
990
+ labNavPanel.dataset.open = "true";
991
+ renderDossier('start');
992
+ if (!fromHash) setHash('lab');
993
+ }
994
+
995
+ function closeLabNav(fromHash = false) {
996
+ labNavOverlay.dataset.open = "false";
997
+ labNavPanel.dataset.open = "false";
998
+ if (!fromHash) clearHash();
999
+ }
1000
+
1001
+ labNavTrigger?.addEventListener('click', () => openLabNav(false));
1002
+ heroLabBtn?.addEventListener('click', () => openLabNav(false));
1003
+ labNavClose?.addEventListener('click', () => closeLabNav(false));
1004
+ labNavBackdrop?.addEventListener('click', () => closeLabNav(false));
1005
+
1006
+ document.querySelectorAll('.lab-node').forEach(btn => {
1007
+ btn.addEventListener('click', () => {
1008
+ const key = btn.getAttribute('data-dossier');
1009
+ renderDossier(key);
1010
+ });
1011
+ });
1012
+
1013
+ /* ------------------------------------------------------------------
1014
+ HASH ROUTING → open correct overlay on load / change
1015
+ ------------------------------------------------------------------ */
1016
+ function applyHashRoute() {
1017
+ const key = currentHashKey();
1018
+ if (!key) {
1019
+ closeAccessModal(true);
1020
+ closeConsciousnessModal(true);
1021
+ closeLabNav(true);
1022
+ return;
1023
+ }
1024
+ if (!MODAL_HASHES.has(key)) return;
1025
+
1026
+ // Close all first
1027
+ closeAccessModal(true);
1028
+ closeConsciousnessModal(true);
1029
+ closeLabNav(true);
1030
+
1031
+ if (key === 'access') showAccessModal(true);
1032
+ if (key === 'consciousness-demo') showConsciousnessModal(true);
1033
+ if (key === 'lab') openLabNav(true);
1034
+ }
1035
+
1036
+ window.addEventListener('hashchange', applyHashRoute);
1037
+ window.addEventListener('DOMContentLoaded', applyHashRoute);
1038
+ </script>
1039
+ </body>
1040
+ </html>