KrazyKitty commited on
Commit
e8efd69
·
verified ·
1 Parent(s): df2ddad

Convert NEURAL LAB to public static dashboard

Browse files
Files changed (8) hide show
  1. README.md +8 -11
  2. app.js +108 -0
  3. app.py +0 -516
  4. index.html +128 -0
  5. portfolio.py +0 -111
  6. style.css +456 -0
  7. tests/test_portfolio.py +0 -49
  8. tests/test_static_dashboard.py +76 -0
README.md CHANGED
@@ -3,10 +3,8 @@ title: KRAZYKITTY // NEURAL LAB
3
  emoji: 🐱
4
  colorFrom: purple
5
  colorTo: purple
6
- sdk: gradio
7
- sdk_version: 6.30.0
8
- python_version: 3.12
9
- app_file: app.py
10
  pinned: false
11
  license: apache-2.0
12
  short_description: KrazyKitty's ultraviolet AI research dashboard
@@ -15,13 +13,13 @@ fullWidth: true
15
 
16
  # KRAZYKITTY // NEURAL LAB
17
 
18
- NEURAL LAB is the standalone dashboard for KrazyKitty's Hugging Face research portfolio. It links
19
  KittyLM, DATA LAB, NEKO//AGENT, curated research Collections, and future demos through a consistent
20
  ultraviolet interface.
21
 
22
  ## Current behaviour
23
 
24
- - Presents an interactive project explorer built with Gradio.
25
  - Links to the verified public KittyLM research Space.
26
  - Links to the verified private DATA LAB and NEKO//AGENT review repositories, clearly labelled as
27
  owner-only destinations while their visibility remains private.
@@ -30,13 +28,12 @@ ultraviolet interface.
30
  - Loads no model, dataset, retrieval index, telemetry service, or external API.
31
  - Does not present generated text or canned content as model output.
32
 
33
- ## Local run
34
 
35
- Use Python 3.12 with the Gradio version pinned in the Space metadata:
36
 
37
  ```text
38
- python -m pip install gradio==6.30.0
39
- python app.py
40
  ```
41
 
42
  ## Accessibility and responsive design
@@ -52,6 +49,6 @@ python app.py
52
 
53
  ## Publication status
54
 
55
- This Gradio dashboard is prepared for the public `KrazyKitty/Neural-Lab` Space. KittyLM is public;
56
  DATA LAB, NEKO//AGENT, and the four Research Collections remain private review resources until the
57
  owner makes a separate visibility decision.
 
3
  emoji: 🐱
4
  colorFrom: purple
5
  colorTo: purple
6
+ sdk: static
7
+ app_file: index.html
 
 
8
  pinned: false
9
  license: apache-2.0
10
  short_description: KrazyKitty's ultraviolet AI research dashboard
 
13
 
14
  # KRAZYKITTY // NEURAL LAB
15
 
16
+ NEURAL LAB is the standalone static dashboard for KrazyKitty's Hugging Face research portfolio. It links
17
  KittyLM, DATA LAB, NEKO//AGENT, curated research Collections, and future demos through a consistent
18
  ultraviolet interface.
19
 
20
  ## Current behaviour
21
 
22
+ - Presents an interactive, dependency-free project explorer using accessible HTML, CSS, and JavaScript.
23
  - Links to the verified public KittyLM research Space.
24
  - Links to the verified private DATA LAB and NEKO//AGENT review repositories, clearly labelled as
25
  owner-only destinations while their visibility remains private.
 
28
  - Loads no model, dataset, retrieval index, telemetry service, or external API.
29
  - Does not present generated text or canned content as model output.
30
 
31
+ ## Local preview
32
 
33
+ Serve the directory with any local static-file server, for example:
34
 
35
  ```text
36
+ python -m http.server 7860
 
37
  ```
38
 
39
  ## Accessibility and responsive design
 
49
 
50
  ## Publication status
51
 
52
+ This static dashboard is prepared for the public `KrazyKitty/Neural-Lab` Space. KittyLM is public;
53
  DATA LAB, NEKO//AGENT, and the four Research Collections remain private review resources until the
54
  owner makes a separate visibility decision.
app.js ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+
3
+ const projects = {
4
+ kittylm: {
5
+ eyebrow: "Language model research",
6
+ title: "KittyLM",
7
+ status: "Verified public",
8
+ visibility: "public",
9
+ summary: "A modular language-model research platform presented without weights, datasets, or inflated capability claims.",
10
+ evidence: [
11
+ "Public Static Space verified on the KrazyKitty account",
12
+ "Published README, HTML, and mark match the reviewed artifacts",
13
+ "No model weights or approved KittyLM training dataset are claimed"
14
+ ],
15
+ gate: "Future model artifacts require trained checkpoints, provenance, evaluation, limitations, and explicit release approval.",
16
+ url: "https://huggingface.co/spaces/KrazyKitty/KittyLM-Research",
17
+ link: "Open the verified KittyLM Space"
18
+ },
19
+ "data-lab": {
20
+ eyebrow: "Dataset documentation research",
21
+ title: "KRAZYKITTY // DATA LAB",
22
+ status: "Verified private",
23
+ visibility: "private",
24
+ summary: "Dataset-card practice, source provenance, licensing and privacy gates, deterministic preprocessing, and evaluation-resource governance.",
25
+ evidence: [
26
+ "Private dataset repository verified on the KrazyKitty account",
27
+ "Manifest validator and approval-gated preprocessing reference are published and tested",
28
+ "No dataset rows, corpus files, or invented release are included"
29
+ ],
30
+ gate: "Public visibility remains an owner decision after final review of the repository card, workflows, and source-governance boundaries.",
31
+ url: "https://huggingface.co/datasets/KrazyKitty/Data-Lab",
32
+ link: "Open DATA LAB (owner access while private)"
33
+ },
34
+ "neko-agent": {
35
+ eyebrow: "Agent systems research",
36
+ title: "NEKO//AGENT",
37
+ status: "Verified private",
38
+ visibility: "private",
39
+ summary: "Research into tool use, retrieval, bounded task execution, assistant architecture, reproducible evaluation, and sandboxed safety.",
40
+ evidence: [
41
+ "Private Static Space verified and running on the KrazyKitty account",
42
+ "Trace schemas and deterministic offline evaluator are published and tested",
43
+ "No live autonomous runtime, model endpoint, or fake demo is presented"
44
+ ],
45
+ gate: "Public visibility remains an owner decision; any future live agent demo still requires separately verified sandbox enforcement.",
46
+ url: "https://huggingface.co/spaces/KrazyKitty/NEKO-Agent-Research",
47
+ link: "Open NEKO//AGENT (owner access while private)"
48
+ },
49
+ collections: {
50
+ eyebrow: "Curated research library",
51
+ title: "Research Collections",
52
+ status: "Verified private",
53
+ visibility: "private",
54
+ summary: "Four evidence-linked study tracks for transformers, training, data provenance and evaluation, and agent systems.",
55
+ evidence: [
56
+ "Four private Collections are verified on the KrazyKitty account",
57
+ "All 26 entries match the reviewed manifest in exact order",
58
+ "Resources are curated for relevance, not endorsed for unrestricted reuse"
59
+ ],
60
+ gate: "Review the four Collections as a complete library before any separate public-visibility decision.",
61
+ url: "https://huggingface.co/KrazyKitty/collections",
62
+ link: "Open the Collection index (owner access while private)"
63
+ }
64
+ };
65
+
66
+ const buttons = Array.from(document.querySelectorAll("[data-project]"));
67
+ const detail = {
68
+ eyebrow: document.querySelector("#detail-eyebrow"),
69
+ status: document.querySelector("#detail-status"),
70
+ title: document.querySelector("#detail-title"),
71
+ summary: document.querySelector("#detail-summary"),
72
+ evidence: document.querySelector("#detail-evidence"),
73
+ gate: document.querySelector("#detail-gate"),
74
+ link: document.querySelector("#detail-link")
75
+ };
76
+
77
+ function renderProject(key) {
78
+ const project = projects[key] || projects.kittylm;
79
+ detail.eyebrow.textContent = project.eyebrow;
80
+ detail.status.textContent = project.status;
81
+ detail.status.className = `status ${project.visibility}`;
82
+ detail.title.textContent = project.title;
83
+ detail.summary.textContent = project.summary;
84
+ detail.evidence.replaceChildren(...project.evidence.map((item) => {
85
+ const entry = document.createElement("li");
86
+ entry.textContent = item;
87
+ return entry;
88
+ }));
89
+ detail.gate.textContent = project.gate;
90
+ detail.link.href = project.url;
91
+ detail.link.replaceChildren(document.createTextNode(`${project.link} `));
92
+ const arrow = document.createElement("span");
93
+ arrow.setAttribute("aria-hidden", "true");
94
+ arrow.textContent = "↗";
95
+ detail.link.append(arrow);
96
+
97
+ buttons.forEach((button) => {
98
+ const active = button.dataset.project === key;
99
+ button.classList.toggle("is-active", active);
100
+ button.setAttribute("aria-pressed", String(active));
101
+ });
102
+ }
103
+
104
+ buttons.forEach((button) => {
105
+ button.addEventListener("click", () => renderProject(button.dataset.project));
106
+ });
107
+
108
+ renderProject("kittylm");
app.py DELETED
@@ -1,516 +0,0 @@
1
- """KRAZYKITTY // NEURAL LAB — Hugging Face research portfolio dashboard."""
2
-
3
- from __future__ import annotations
4
-
5
- import gradio as gr
6
-
7
- from portfolio import project_choices, render_project
8
-
9
- CSS = """
10
- :root {
11
- --kk-void: #090611;
12
- --kk-surface: #170D2B;
13
- --kk-deep: #6D28D9;
14
- --kk-violet: #8B5CF6;
15
- --kk-ultraviolet: #A855F7;
16
- --kk-lavender: #D8B4FE;
17
- --kk-mist: #E2E0F0;
18
- }
19
-
20
- body,
21
- .gradio-container {
22
- color: var(--kk-mist) !important;
23
- background: linear-gradient(145deg, var(--kk-void), var(--kk-surface), var(--kk-void)) !important;
24
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif !important;
25
- }
26
-
27
- .gradio-container {
28
- --body-background-fill: var(--kk-void);
29
- --body-text-color: var(--kk-mist);
30
- --block-background-fill: var(--kk-surface);
31
- --block-border-color: var(--kk-deep);
32
- --block-label-text-color: var(--kk-lavender);
33
- --input-background-fill: var(--kk-void);
34
- --input-border-color: var(--kk-violet);
35
- --input-placeholder-color: var(--kk-lavender);
36
- --button-primary-background-fill: var(--kk-deep);
37
- --button-primary-text-color: var(--kk-mist);
38
- --button-secondary-background-fill: var(--kk-surface);
39
- --button-secondary-text-color: var(--kk-lavender);
40
- max-width: 100% !important;
41
- padding: 0 !important;
42
- }
43
-
44
- .gradio-container::before {
45
- position: fixed;
46
- inset: 0;
47
- z-index: -1;
48
- background-image:
49
- linear-gradient(var(--kk-deep) 1px, transparent 1px),
50
- linear-gradient(90deg, var(--kk-deep) 1px, transparent 1px);
51
- background-size: 52px 52px;
52
- content: "";
53
- opacity: 0.08;
54
- pointer-events: none;
55
- }
56
-
57
- .gradio-container a {
58
- color: var(--kk-lavender) !important;
59
- text-underline-offset: 0.2em;
60
- }
61
-
62
- .gradio-container :where(a, button, input, [tabindex]):focus-visible {
63
- outline: 3px solid var(--kk-lavender) !important;
64
- outline-offset: 4px !important;
65
- }
66
-
67
- .gradio-container ::selection {
68
- color: var(--kk-void);
69
- background: var(--kk-lavender);
70
- }
71
-
72
- .lab-shell {
73
- inline-size: min(calc(100% - 2rem), 1180px);
74
- margin-inline: auto;
75
- }
76
-
77
- .lab-header {
78
- border-block-end: 1px solid var(--kk-deep);
79
- background: var(--kk-void);
80
- }
81
-
82
- .lab-nav {
83
- display: flex;
84
- align-items: center;
85
- justify-content: space-between;
86
- min-block-size: 4.8rem;
87
- gap: 1rem;
88
- }
89
-
90
- .lab-brand {
91
- color: var(--kk-mist);
92
- font-family: "Cascadia Code", Consolas, monospace;
93
- font-weight: 900;
94
- letter-spacing: 0.08em;
95
- }
96
-
97
- .lab-nav span:last-child {
98
- color: var(--kk-lavender);
99
- font-family: "Cascadia Code", Consolas, monospace;
100
- font-size: 0.74rem;
101
- letter-spacing: 0.08em;
102
- }
103
-
104
- .lab-hero {
105
- display: grid;
106
- grid-template-columns: minmax(0, 1.35fr) minmax(17rem, 0.65fr);
107
- align-items: center;
108
- min-block-size: 650px;
109
- padding-block: clamp(4.5rem, 10vw, 7.5rem);
110
- gap: clamp(2rem, 7vw, 6rem);
111
- }
112
-
113
- .lab-kicker,
114
- .section-kicker,
115
- .detail-eyebrow {
116
- color: var(--kk-lavender);
117
- font-family: "Cascadia Code", Consolas, monospace;
118
- font-size: 0.76rem;
119
- font-weight: 900;
120
- letter-spacing: 0.15em;
121
- text-transform: uppercase;
122
- }
123
-
124
- .lab-hero h1 {
125
- max-inline-size: 10ch;
126
- margin-block: 0.7rem 1.3rem;
127
- color: var(--kk-mist);
128
- font-size: clamp(3.4rem, 9.5vw, 7.7rem);
129
- line-height: 0.96;
130
- letter-spacing: -0.075em;
131
- }
132
-
133
- .lab-hero h1 span {
134
- display: block;
135
- color: var(--kk-lavender);
136
- }
137
-
138
- .lab-lede {
139
- max-inline-size: 62ch;
140
- color: var(--kk-lavender);
141
- font-size: clamp(1.05rem, 2.2vw, 1.4rem);
142
- line-height: 1.65;
143
- }
144
-
145
- .hero-console {
146
- padding: 1.3rem;
147
- border: 1px solid var(--kk-violet);
148
- border-radius: 28px;
149
- background: var(--kk-surface);
150
- box-shadow: 0 2rem 5rem var(--kk-void);
151
- }
152
-
153
- .console-mark {
154
- display: grid;
155
- place-items: center;
156
- min-block-size: 15rem;
157
- border: 1px solid var(--kk-deep);
158
- border-radius: 18px;
159
- background: linear-gradient(145deg, var(--kk-deep), var(--kk-surface));
160
- color: var(--kk-mist);
161
- font-size: clamp(3rem, 8vw, 5.2rem);
162
- font-weight: 950;
163
- letter-spacing: -0.08em;
164
- }
165
-
166
- .console-mark span {
167
- color: var(--kk-lavender);
168
- }
169
-
170
- .console-list {
171
- display: grid;
172
- margin-block-start: 1rem;
173
- gap: 0.55rem;
174
- }
175
-
176
- .console-list span {
177
- display: flex;
178
- justify-content: space-between;
179
- padding-block: 0.55rem;
180
- border-block-start: 1px solid var(--kk-deep);
181
- color: var(--kk-lavender);
182
- font-family: "Cascadia Code", Consolas, monospace;
183
- font-size: 0.76rem;
184
- }
185
-
186
- .console-list strong {
187
- color: var(--kk-mist);
188
- }
189
-
190
- .lab-section {
191
- padding-block: clamp(4rem, 9vw, 7rem);
192
- border-block-start: 1px solid var(--kk-deep);
193
- }
194
-
195
- .lab-section h2 {
196
- margin-block: 0.5rem 1rem;
197
- color: var(--kk-mist);
198
- font-size: clamp(2rem, 5vw, 4rem);
199
- line-height: 1.05;
200
- letter-spacing: -0.05em;
201
- }
202
-
203
- .section-lede {
204
- max-inline-size: 68ch;
205
- color: var(--kk-lavender);
206
- font-size: 1.05rem;
207
- line-height: 1.7;
208
- }
209
-
210
- .portfolio-grid,
211
- .principle-grid,
212
- .collection-grid {
213
- display: grid;
214
- grid-template-columns: repeat(2, minmax(0, 1fr));
215
- margin-block-start: 2rem;
216
- gap: 1rem;
217
- }
218
-
219
- .portfolio-card,
220
- .principle-card,
221
- .collection-card {
222
- min-block-size: 13rem;
223
- padding: clamp(1.25rem, 3vw, 2rem);
224
- border: 1px solid var(--kk-deep);
225
- border-radius: 18px;
226
- background: var(--kk-surface);
227
- box-shadow: 0 1rem 2.5rem var(--kk-void);
228
- }
229
-
230
- .portfolio-card h3,
231
- .principle-card h3,
232
- .collection-card h3,
233
- .project-detail h2,
234
- .project-detail h3 {
235
- margin-block: 0.5rem 0.7rem;
236
- color: var(--kk-mist);
237
- line-height: 1.15;
238
- }
239
-
240
- .portfolio-card p,
241
- .principle-card p,
242
- .collection-card p,
243
- .project-detail p,
244
- .project-detail li {
245
- color: var(--kk-lavender);
246
- line-height: 1.65;
247
- }
248
-
249
- .state-badge {
250
- display: inline-flex;
251
- padding: 0.3rem 0.65rem;
252
- border: 1px solid var(--kk-violet);
253
- border-radius: 999px;
254
- color: var(--kk-lavender);
255
- font-family: "Cascadia Code", Consolas, monospace;
256
- font-size: 0.67rem;
257
- font-weight: 900;
258
- letter-spacing: 0.08em;
259
- }
260
-
261
- .state-badge.verified {
262
- border-color: var(--kk-lavender);
263
- color: var(--kk-mist);
264
- }
265
-
266
- .state-badge.private {
267
- border-style: dashed;
268
- border-color: var(--kk-lavender);
269
- color: var(--kk-mist);
270
- }
271
-
272
- .state-badge.proposed,
273
- .state-badge.planned {
274
- border-style: dashed;
275
- }
276
-
277
- .explorer-wrap {
278
- inline-size: min(calc(100% - 2rem), 1180px) !important;
279
- margin-inline: auto !important;
280
- padding-block-end: clamp(4rem, 9vw, 7rem) !important;
281
- gap: 1rem !important;
282
- }
283
-
284
- .explorer-panel {
285
- border: 1px solid var(--kk-deep) !important;
286
- border-radius: 18px !important;
287
- background: var(--kk-surface) !important;
288
- }
289
-
290
- .project-detail {
291
- min-block-size: 31rem;
292
- padding: clamp(1.3rem, 3vw, 2.2rem);
293
- border: 1px solid var(--kk-violet);
294
- border-radius: 18px;
295
- background: var(--kk-surface);
296
- }
297
-
298
- .detail-topline {
299
- display: flex;
300
- align-items: center;
301
- justify-content: space-between;
302
- gap: 1rem;
303
- }
304
-
305
- .project-detail h2 {
306
- font-size: clamp(2rem, 4vw, 3.2rem);
307
- letter-spacing: -0.04em;
308
- }
309
-
310
- .project-detail h3 {
311
- margin-block-start: 1.5rem;
312
- }
313
-
314
- .project-detail ul {
315
- padding-inline-start: 1.2rem;
316
- }
317
-
318
- .project-detail li + li {
319
- margin-block-start: 0.4rem;
320
- }
321
-
322
- .next-gate {
323
- margin-block: 1.5rem;
324
- padding: 1rem;
325
- border-inline-start: 0.35rem solid var(--kk-ultraviolet);
326
- background: var(--kk-void);
327
- }
328
-
329
- .next-gate p {
330
- margin-block-end: 0;
331
- }
332
-
333
- .project-link {
334
- display: inline-flex;
335
- align-items: center;
336
- min-block-size: 3rem;
337
- padding-inline: 1rem;
338
- border: 1px solid var(--kk-violet);
339
- border-radius: 999px;
340
- background: var(--kk-deep);
341
- color: var(--kk-mist) !important;
342
- font-weight: 850;
343
- text-decoration: none;
344
- }
345
-
346
- a.collection-card {
347
- display: block;
348
- color: var(--kk-mist) !important;
349
- text-decoration: none;
350
- }
351
-
352
- a.collection-card:hover {
353
- border-color: var(--kk-lavender);
354
- }
355
-
356
- .truth-banner {
357
- margin-block-start: 2rem;
358
- padding: 1rem;
359
- border: 1px solid var(--kk-lavender);
360
- border-radius: 10px;
361
- color: var(--kk-mist);
362
- background: var(--kk-deep);
363
- font-family: "Cascadia Code", Consolas, monospace;
364
- font-size: 0.76rem;
365
- font-weight: 900;
366
- letter-spacing: 0.07em;
367
- text-align: center;
368
- }
369
-
370
- .lab-footer {
371
- padding-block: 2rem;
372
- border-block-start: 1px solid var(--kk-violet);
373
- background: var(--kk-void);
374
- }
375
-
376
- .footer-row {
377
- display: flex;
378
- justify-content: space-between;
379
- gap: 1rem;
380
- color: var(--kk-lavender);
381
- font-family: "Cascadia Code", Consolas, monospace;
382
- font-size: 0.75rem;
383
- }
384
-
385
- @media (max-width: 800px) {
386
- .lab-hero,
387
- .portfolio-grid,
388
- .principle-grid,
389
- .collection-grid {
390
- grid-template-columns: 1fr;
391
- }
392
-
393
- .lab-hero {
394
- min-block-size: auto;
395
- }
396
-
397
- .lab-nav,
398
- .detail-topline,
399
- .footer-row {
400
- align-items: flex-start;
401
- flex-direction: column;
402
- }
403
- }
404
-
405
- @media (prefers-reduced-motion: reduce) {
406
- *,
407
- *::before,
408
- *::after {
409
- scroll-behavior: auto !important;
410
- transition-duration: 0.01ms !important;
411
- }
412
- }
413
-
414
- @media (prefers-contrast: more) {
415
- :root {
416
- --kk-deep: #8B5CF6;
417
- --kk-violet: #D8B4FE;
418
- }
419
- }
420
- """
421
-
422
- HERO = """
423
- <header class="lab-header">
424
- <div class="lab-shell lab-nav">
425
- <span class="lab-brand">KRAZYKITTY // NEURAL LAB</span>
426
- <span>RESEARCH PORTFOLIO // READ-ONLY DASHBOARD</span>
427
- </div>
428
- </header>
429
- <main>
430
- <section class="lab-shell lab-hero" aria-labelledby="lab-title">
431
- <div>
432
- <span class="lab-kicker">Ultraviolet research interface</span>
433
- <h1 id="lab-title">NEURAL<span>LAB</span></h1>
434
- <p class="lab-lede">A navigable map of KrazyKitty's language-model, dataset, and agent-systems research—built around provenance, reproducibility, and honest evidence boundaries.</p>
435
- </div>
436
- <aside class="hero-console" aria-label="Dashboard state">
437
- <div class="console-mark">K<span>//</span>K</div>
438
- <div class="console-list">
439
- <span>LIVE MODEL <strong>NONE</strong></span>
440
- <span>DATA UPLOAD <strong>NONE</strong></span>
441
- <span>EXTERNAL TOOLS <strong>NONE</strong></span>
442
- <span>DASHBOARD <strong>INTERACTIVE</strong></span>
443
- </div>
444
- </aside>
445
- </section>
446
- <section class="lab-section">
447
- <div class="lab-shell">
448
- <span class="section-kicker">01 // Portfolio map</span>
449
- <h2>One lab. Distinct research boundaries.</h2>
450
- <p class="section-lede">Each node distinguishes public artifacts from private review resources. Select a node below for its current evidence and next approval gate.</p>
451
- <div class="portfolio-grid">
452
- <article class="portfolio-card"><span class="state-badge verified">VERIFIED PUBLIC</span><h3>KittyLM</h3><p>Independent language-model research from tokenizer and architecture through training and evaluation engineering.</p></article>
453
- <article class="portfolio-card"><span class="state-badge private">VERIFIED PRIVATE</span><h3>DATA LAB</h3><p>Dataset provenance, permission, preprocessing, quality, and evaluation-resource research.</p></article>
454
- <article class="portfolio-card"><span class="state-badge private">VERIFIED PRIVATE</span><h3>NEKO//AGENT</h3><p>Tool use, retrieval, task execution, agent evaluation, and sandboxed safety boundaries.</p></article>
455
- <article class="portfolio-card"><span class="state-badge private">VERIFIED PRIVATE</span><h3>Research Collections</h3><p>Curated Hugging Face repositories and papers grouped into four research tracks.</p></article>
456
- </div>
457
- </div>
458
- </section>
459
- </main>
460
- """
461
-
462
- LOWER_SECTIONS = """
463
- <section class="lab-section">
464
- <div class="lab-shell">
465
- <span class="section-kicker">03 // Operating principles</span>
466
- <h2>Claims follow evidence.</h2>
467
- <div class="principle-grid">
468
- <article class="principle-card"><h3>Provenance first</h3><p>Sources, revisions, licences, permissions, transformations, and integrity hashes remain attached to research artifacts.</p></article>
469
- <article class="principle-card"><h3>Smallest trustworthy step</h3><p>Complexity enters only when a controlled experiment or architectural boundary justifies it.</p></article>
470
- <article class="principle-card"><h3>Human authority</h3><p>Publishing, external writes, personal data, and consequential actions stay behind explicit approval gates.</p></article>
471
- <article class="principle-card"><h3>Measured status</h3><p>Verified, proposed, planned, failed, and unknown are visible states—not interchangeable marketing language.</p></article>
472
- </div>
473
- <div class="truth-banner">NO MODEL LOADED // NO GENERATED RESPONSE // NO TELEMETRY // NO FAKE LIVE STATUS</div>
474
- </div>
475
- </section>
476
- <section class="lab-section">
477
- <div class="lab-shell">
478
- <span class="section-kicker">04 // Research library</span>
479
- <h2>Four curated study tracks.</h2>
480
- <p class="section-lede">Collection contents are real Hugging Face repositories and papers. Inclusion supports study; it does not replace each resource's licence, access, or usage review.</p>
481
- <div class="collection-grid">
482
- <a class="collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-transformer-foundations-6acbaca0f392f5a1fc1e9650" target="_blank" rel="noreferrer"><span class="state-badge private">PRIVATE REVIEW</span><h3>Transformer Foundations</h3><p>Attention, bidirectional pretraining, autoregressive modelling, and compact open baselines.</p></a>
483
- <a class="collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-model-training-6acbacafe431a8f2d5adcb5f" target="_blank" rel="noreferrer"><span class="state-badge private">PRIVATE REVIEW</span><h3>Model Training</h3><p>Compute allocation, parameter-efficient adaptation, quantised finetuning, and preference optimisation.</p></a>
484
- <a class="collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-data-provenance-and-evaluation-6acbacbf0fdd3575a61550e6" target="_blank" rel="noreferrer"><span class="state-badge private">PRIVATE REVIEW</span><h3>Data Provenance &amp; Evaluation</h3><p>Open corpus construction, transparent filtering, benchmark governance, and contamination awareness.</p></a>
485
- <a class="collection-card" href="https://huggingface.co/collections/KrazyKitty/neko-agent-agent-systems-6acbacd0a0d63e6bb904c0e2" target="_blank" rel="noreferrer"><span class="state-badge private">PRIVATE REVIEW</span><h3>Agent Systems</h3><p>Reasoning with actions, tool learning, reflective agents, and executable software-engineering evaluation.</p></a>
486
- </div>
487
- </div>
488
- </section>
489
- <footer class="lab-footer">
490
- <div class="lab-shell footer-row"><span>KRAZYKITTY // NEURAL LAB</span><span>BUILD // MEASURE // VERIFY // SHARE DELIBERATELY</span></div>
491
- </footer>
492
- """
493
-
494
-
495
- with gr.Blocks(title="KRAZYKITTY // NEURAL LAB") as demo:
496
- gr.HTML(HERO, container=False)
497
- with gr.Row(elem_classes=["explorer-wrap"]):
498
- with gr.Column(scale=1, min_width=260, elem_classes=["explorer-panel"]):
499
- gr.Markdown(
500
- "## 02 // Project explorer\nChoose a research node. Status labels are evidence states, not live service indicators."
501
- )
502
- project_picker = gr.Dropdown(
503
- choices=project_choices(),
504
- value="KittyLM",
505
- label="Research node",
506
- info="Opens a read-only evidence summary.",
507
- interactive=True,
508
- )
509
- with gr.Column(scale=2, min_width=320):
510
- project_detail = gr.HTML(render_project("KittyLM"), container=False)
511
- project_picker.change(render_project, inputs=project_picker, outputs=project_detail)
512
- gr.HTML(LOWER_SECTIONS, container=False)
513
-
514
-
515
- if __name__ == "__main__":
516
- demo.launch(css=CSS)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
index.html ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="description" content="KrazyKitty's ultraviolet AI research dashboard for KittyLM, DATA LAB, NEKO//AGENT, and curated research Collections.">
7
+ <title>KRAZYKITTY // NEURAL LAB</title>
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="app.js" defer></script>
10
+ </head>
11
+ <body>
12
+ <a class="skip-link" href="#main">Skip to main content</a>
13
+ <header class="site-header">
14
+ <nav class="shell nav" aria-label="Primary navigation">
15
+ <a class="brand" href="#top">KRAZYKITTY // NEURAL LAB</a>
16
+ <div class="nav-links">
17
+ <a href="#portfolio">Portfolio</a>
18
+ <a href="#principles">Principles</a>
19
+ <a href="#library">Library</a>
20
+ </div>
21
+ </nav>
22
+ </header>
23
+
24
+ <main id="main">
25
+ <section class="shell hero" id="top" aria-labelledby="page-title">
26
+ <div class="hero-copy">
27
+ <p class="eyebrow">Ultraviolet research interface</p>
28
+ <h1 id="page-title">NEURAL <span>LAB</span></h1>
29
+ <p class="lede">A navigable map of KrazyKitty's language-model, dataset, and agent-systems research—built around provenance, reproducibility, and honest evidence boundaries.</p>
30
+ <a class="primary-link" href="#portfolio">Explore the research map</a>
31
+ </div>
32
+ <aside class="console" aria-label="Dashboard capability boundaries">
33
+ <div class="console-mark" aria-hidden="true">K<span>//</span>K</div>
34
+ <dl class="console-list">
35
+ <div><dt>Live model</dt><dd>None</dd></div>
36
+ <div><dt>Data upload</dt><dd>None</dd></div>
37
+ <div><dt>External tools</dt><dd>None</dd></div>
38
+ <div><dt>Dashboard</dt><dd>Interactive</dd></div>
39
+ </dl>
40
+ </aside>
41
+ </section>
42
+
43
+ <section class="section" id="portfolio" aria-labelledby="portfolio-title">
44
+ <div class="shell">
45
+ <p class="eyebrow">01 // Portfolio map</p>
46
+ <h2 id="portfolio-title">One lab. Distinct research boundaries.</h2>
47
+ <p class="section-lede">Each node distinguishes public artifacts from private review resources. Choose a node for its current evidence and next approval gate.</p>
48
+
49
+ <div class="project-layout">
50
+ <div class="project-picker" role="list" aria-label="Research projects">
51
+ <button class="project-card is-active" type="button" data-project="kittylm" aria-pressed="true">
52
+ <span class="status public">Verified public</span>
53
+ <strong>KittyLM</strong>
54
+ <span>Language-model research</span>
55
+ </button>
56
+ <button class="project-card" type="button" data-project="data-lab" aria-pressed="false">
57
+ <span class="status private">Verified private</span>
58
+ <strong>DATA LAB</strong>
59
+ <span>Dataset governance research</span>
60
+ </button>
61
+ <button class="project-card" type="button" data-project="neko-agent" aria-pressed="false">
62
+ <span class="status private">Verified private</span>
63
+ <strong>NEKO//AGENT</strong>
64
+ <span>Bounded agent-systems research</span>
65
+ </button>
66
+ <button class="project-card" type="button" data-project="collections" aria-pressed="false">
67
+ <span class="status private">Verified private</span>
68
+ <strong>Research Collections</strong>
69
+ <span>Four curated study tracks</span>
70
+ </button>
71
+ </div>
72
+
73
+ <article class="project-detail" aria-live="polite" aria-labelledby="detail-title">
74
+ <div class="detail-topline">
75
+ <p class="eyebrow" id="detail-eyebrow">Language model research</p>
76
+ <span class="status public" id="detail-status">Verified public</span>
77
+ </div>
78
+ <h3 id="detail-title">KittyLM</h3>
79
+ <p class="detail-summary" id="detail-summary"></p>
80
+ <h4>Current evidence</h4>
81
+ <ul id="detail-evidence"></ul>
82
+ <div class="next-gate">
83
+ <strong>Next gate</strong>
84
+ <p id="detail-gate"></p>
85
+ </div>
86
+ <a class="primary-link" id="detail-link" href="https://huggingface.co/spaces/KrazyKitty/KittyLM-Research" target="_blank" rel="noreferrer">Open the verified KittyLM Space <span aria-hidden="true">↗</span></a>
87
+ </article>
88
+ </div>
89
+ </div>
90
+ </section>
91
+
92
+ <section class="section" id="principles" aria-labelledby="principles-title">
93
+ <div class="shell">
94
+ <p class="eyebrow">02 // Operating principles</p>
95
+ <h2 id="principles-title">Claims follow evidence.</h2>
96
+ <div class="card-grid">
97
+ <article class="info-card"><h3>Provenance first</h3><p>Sources, revisions, licences, permissions, transformations, and integrity hashes remain attached to research artifacts.</p></article>
98
+ <article class="info-card"><h3>Smallest trustworthy step</h3><p>Complexity enters only when a controlled experiment or architectural boundary justifies it.</p></article>
99
+ <article class="info-card"><h3>Human authority</h3><p>Publishing, external writes, personal data, and consequential actions stay behind explicit approval gates.</p></article>
100
+ <article class="info-card"><h3>Measured status</h3><p>Public, private, proposed, failed, and unknown are visible states—not interchangeable marketing language.</p></article>
101
+ </div>
102
+ <p class="truth-banner">NO MODEL LOADED // NO GENERATED RESPONSE // NO TELEMETRY // NO FAKE LIVE STATUS</p>
103
+ </div>
104
+ </section>
105
+
106
+ <section class="section" id="library" aria-labelledby="library-title">
107
+ <div class="shell">
108
+ <p class="eyebrow">03 // Research library</p>
109
+ <h2 id="library-title">Four curated study tracks.</h2>
110
+ <p class="section-lede">Every entry is a real Hugging Face repository or paper. Inclusion supports study; it does not replace each resource's licence, access, or usage review. These Collections remain private during portfolio review.</p>
111
+ <div class="card-grid collection-grid">
112
+ <a class="info-card collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-transformer-foundations-6acbaca0f392f5a1fc1e9650" target="_blank" rel="noreferrer"><span class="status private">Private review</span><h3>Transformer Foundations</h3><p>Attention, bidirectional pretraining, autoregressive modelling, and compact open baselines.</p></a>
113
+ <a class="info-card collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-model-training-6acbacafe431a8f2d5adcb5f" target="_blank" rel="noreferrer"><span class="status private">Private review</span><h3>Model Training</h3><p>Compute allocation, parameter-efficient adaptation, quantised finetuning, and preference optimisation.</p></a>
114
+ <a class="info-card collection-card" href="https://huggingface.co/collections/KrazyKitty/krazykitty-data-provenance-and-evaluation-6acbacbf0fdd3575a61550e6" target="_blank" rel="noreferrer"><span class="status private">Private review</span><h3>Data Provenance &amp; Evaluation</h3><p>Open corpus construction, transparent filtering, benchmark governance, and contamination awareness.</p></a>
115
+ <a class="info-card collection-card" href="https://huggingface.co/collections/KrazyKitty/neko-agent-agent-systems-6acbacd0a0d63e6bb904c0e2" target="_blank" rel="noreferrer"><span class="status private">Private review</span><h3>Agent Systems</h3><p>Reasoning with actions, tool learning, reflective agents, and executable software-engineering evaluation.</p></a>
116
+ </div>
117
+ </div>
118
+ </section>
119
+ </main>
120
+
121
+ <footer class="site-footer">
122
+ <div class="shell footer-row">
123
+ <span>KRAZYKITTY // NEURAL LAB</span>
124
+ <span>BUILD // MEASURE // VERIFY // SHARE DELIBERATELY</span>
125
+ </div>
126
+ </footer>
127
+ </body>
128
+ </html>
portfolio.py DELETED
@@ -1,111 +0,0 @@
1
- """Content model for the KRAZYKITTY // NEURAL LAB dashboard."""
2
-
3
- from __future__ import annotations
4
-
5
- from dataclasses import dataclass
6
- from html import escape
7
-
8
-
9
- @dataclass(frozen=True)
10
- class Project:
11
- key: str
12
- eyebrow: str
13
- title: str
14
- state: str
15
- state_class: str
16
- summary: str
17
- evidence: tuple[str, ...]
18
- next_gate: str
19
- url: str
20
- link_label: str
21
-
22
-
23
- PROJECTS: dict[str, Project] = {
24
- "KittyLM": Project(
25
- key="KittyLM",
26
- eyebrow="LANGUAGE MODEL RESEARCH",
27
- title="KittyLM",
28
- state="VERIFIED PUBLIC",
29
- state_class="verified",
30
- summary="A modular language-model research platform presented without weights, datasets, or inflated capability claims.",
31
- evidence=(
32
- "Public Static Space verified on the KrazyKitty account",
33
- "Published README, HTML, and mark match the reviewed local artifacts",
34
- "No model weights or approved KittyLM training dataset are claimed",
35
- ),
36
- next_gate="Future model artifacts require trained checkpoints, provenance, evaluation, limitations, and explicit release approval.",
37
- url="https://huggingface.co/spaces/KrazyKitty/KittyLM-Research",
38
- link_label="Open the verified KittyLM Space",
39
- ),
40
- "DATA LAB": Project(
41
- key="DATA LAB",
42
- eyebrow="DATASET DOCUMENTATION RESEARCH",
43
- title="KRAZYKITTY // DATA LAB",
44
- state="VERIFIED PRIVATE",
45
- state_class="private",
46
- summary="Dataset-card practice, source provenance, licensing and privacy gates, deterministic preprocessing, and evaluation-resource governance.",
47
- evidence=(
48
- "Private dataset repository verified on the KrazyKitty account",
49
- "Manifest validator and approval-gated preprocessing reference are published and tested",
50
- "No dataset rows, corpus files, or invented release are included",
51
- ),
52
- next_gate="Public visibility remains an owner decision after final review of the repository card, workflows, and source-governance boundaries.",
53
- url="https://huggingface.co/datasets/KrazyKitty/Data-Lab",
54
- link_label="Open DATA LAB (owner access while private)",
55
- ),
56
- "NEKO//AGENT": Project(
57
- key="NEKO//AGENT",
58
- eyebrow="AGENT SYSTEMS RESEARCH",
59
- title="NEKO//AGENT",
60
- state="VERIFIED PRIVATE",
61
- state_class="private",
62
- summary="Research into tool use, retrieval, bounded task execution, assistant architecture, reproducible evaluation, and sandboxed safety.",
63
- evidence=(
64
- "Private Static Space verified and running on the KrazyKitty account",
65
- "Trace schemas and deterministic offline evaluator are published and tested",
66
- "No live autonomous runtime, model endpoint, or fake demo is presented",
67
- ),
68
- next_gate="Public visibility remains an owner decision; any future live agent demo still requires separately verified sandbox enforcement.",
69
- url="https://huggingface.co/spaces/KrazyKitty/NEKO-Agent-Research",
70
- link_label="Open NEKO//AGENT (owner access while private)",
71
- ),
72
- "Research Collections": Project(
73
- key="Research Collections",
74
- eyebrow="CURATED RESEARCH LIBRARY",
75
- title="Research Collections",
76
- state="VERIFIED PRIVATE",
77
- state_class="private",
78
- summary="Four evidence-linked reading and artifact tracks for transformers, training, data provenance and evaluation, and agent systems.",
79
- evidence=(
80
- "Four private Collections are verified on the KrazyKitty account",
81
- "All 26 entries match the reviewed manifest in exact order",
82
- "Resources are curated for relevance, not endorsed for unrestricted reuse",
83
- ),
84
- next_gate="Review the four Collections as a complete library before any separate public-visibility decision.",
85
- url="https://huggingface.co/KrazyKitty/collections",
86
- link_label="Open the Collection index (owner access while private)",
87
- ),
88
- }
89
-
90
-
91
- def project_choices() -> list[str]:
92
- return list(PROJECTS)
93
-
94
-
95
- def render_project(project_key: str) -> str:
96
- project = PROJECTS.get(project_key, PROJECTS["KittyLM"])
97
- evidence = "".join(f"<li>{escape(item)}</li>" for item in project.evidence)
98
- return f"""
99
- <article class="project-detail" aria-live="polite">
100
- <div class="detail-topline">
101
- <span class="detail-eyebrow">{escape(project.eyebrow)}</span>
102
- <span class="state-badge {escape(project.state_class)}">{escape(project.state)}</span>
103
- </div>
104
- <h2>{escape(project.title)}</h2>
105
- <p class="detail-summary">{escape(project.summary)}</p>
106
- <h3>Current evidence</h3>
107
- <ul>{evidence}</ul>
108
- <div class="next-gate"><strong>Next gate</strong><p>{escape(project.next_gate)}</p></div>
109
- <a class="project-link" href="{escape(project.url)}" target="_blank" rel="noreferrer">{escape(project.link_label)} <span aria-hidden="true">↗</span></a>
110
- </article>
111
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
style.css ADDED
@@ -0,0 +1,456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ color-scheme: dark;
3
+ --void: #090611;
4
+ --surface: #170D2B;
5
+ --deep: #6D28D9;
6
+ --violet: #8B5CF6;
7
+ --ultraviolet: #A855F7;
8
+ --lavender: #D8B4FE;
9
+ --mist: #E2E0F0;
10
+ }
11
+
12
+ * {
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ html {
17
+ scroll-behavior: smooth;
18
+ }
19
+
20
+ body {
21
+ margin: 0;
22
+ color: var(--mist);
23
+ background: linear-gradient(145deg, var(--void), var(--surface), var(--void));
24
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
25
+ line-height: 1.6;
26
+ }
27
+
28
+ body::before {
29
+ position: fixed;
30
+ inset: 0;
31
+ z-index: -1;
32
+ background-image: linear-gradient(var(--deep) 1px, transparent 1px), linear-gradient(90deg, var(--deep) 1px, transparent 1px);
33
+ background-size: 52px 52px;
34
+ content: "";
35
+ opacity: 0.08;
36
+ pointer-events: none;
37
+ }
38
+
39
+ a {
40
+ color: var(--lavender);
41
+ text-underline-offset: 0.2em;
42
+ }
43
+
44
+ :where(a, button):focus-visible {
45
+ outline: 3px solid var(--lavender);
46
+ outline-offset: 4px;
47
+ }
48
+
49
+ ::selection {
50
+ color: var(--void);
51
+ background: var(--lavender);
52
+ }
53
+
54
+ .skip-link {
55
+ position: fixed;
56
+ inset-block-start: 0.75rem;
57
+ inset-inline-start: 0.75rem;
58
+ z-index: 20;
59
+ padding: 0.7rem 1rem;
60
+ border: 2px solid var(--lavender);
61
+ border-radius: 0.5rem;
62
+ color: var(--void);
63
+ background: var(--lavender);
64
+ font-weight: 800;
65
+ transform: translateY(-180%);
66
+ }
67
+
68
+ .skip-link:focus {
69
+ transform: translateY(0);
70
+ }
71
+
72
+ .shell {
73
+ width: min(calc(100% - 2rem), 1180px);
74
+ margin-inline: auto;
75
+ }
76
+
77
+ .site-header {
78
+ position: sticky;
79
+ inset-block-start: 0;
80
+ z-index: 10;
81
+ border-block-end: 1px solid var(--deep);
82
+ background: var(--void);
83
+ }
84
+
85
+ .nav,
86
+ .footer-row {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ gap: 1rem;
91
+ }
92
+
93
+ .nav {
94
+ min-height: 4.8rem;
95
+ }
96
+
97
+ .brand,
98
+ .nav-links a,
99
+ .footer-row {
100
+ font-family: "Cascadia Code", Consolas, monospace;
101
+ font-weight: 850;
102
+ letter-spacing: 0.07em;
103
+ }
104
+
105
+ .brand {
106
+ color: var(--mist);
107
+ text-decoration: none;
108
+ }
109
+
110
+ .nav-links {
111
+ display: flex;
112
+ gap: 1rem;
113
+ }
114
+
115
+ .nav-links a {
116
+ font-size: 0.75rem;
117
+ text-decoration: none;
118
+ text-transform: uppercase;
119
+ }
120
+
121
+ .hero {
122
+ display: grid;
123
+ grid-template-columns: minmax(0, 1.35fr) minmax(17rem, 0.65fr);
124
+ align-items: center;
125
+ min-height: 650px;
126
+ padding-block: clamp(4.5rem, 10vw, 7.5rem);
127
+ gap: clamp(2rem, 7vw, 6rem);
128
+ }
129
+
130
+ .eyebrow {
131
+ margin: 0;
132
+ color: var(--lavender);
133
+ font-family: "Cascadia Code", Consolas, monospace;
134
+ font-size: 0.76rem;
135
+ font-weight: 900;
136
+ letter-spacing: 0.15em;
137
+ text-transform: uppercase;
138
+ }
139
+
140
+ h1 {
141
+ max-width: 10ch;
142
+ margin-block: 0.7rem 1.3rem;
143
+ font-size: clamp(3.5rem, 10vw, 8rem);
144
+ line-height: 0.92;
145
+ letter-spacing: -0.075em;
146
+ }
147
+
148
+ h1 span {
149
+ display: block;
150
+ color: var(--lavender);
151
+ }
152
+
153
+ .lede,
154
+ .section-lede,
155
+ .detail-summary,
156
+ .info-card p,
157
+ .project-detail li,
158
+ .next-gate p {
159
+ color: var(--lavender);
160
+ }
161
+
162
+ .lede {
163
+ max-width: 62ch;
164
+ font-size: clamp(1.05rem, 2.2vw, 1.4rem);
165
+ }
166
+
167
+ .primary-link {
168
+ display: inline-flex;
169
+ align-items: center;
170
+ min-height: 3rem;
171
+ margin-block-start: 1rem;
172
+ padding-inline: 1rem;
173
+ border: 1px solid var(--violet);
174
+ border-radius: 999px;
175
+ color: var(--mist);
176
+ background: var(--deep);
177
+ font-weight: 850;
178
+ text-decoration: none;
179
+ }
180
+
181
+ .primary-link:hover {
182
+ border-color: var(--lavender);
183
+ background: var(--violet);
184
+ }
185
+
186
+ .console {
187
+ padding: 1.3rem;
188
+ border: 1px solid var(--violet);
189
+ border-radius: 28px;
190
+ background: var(--surface);
191
+ box-shadow: 0 2rem 5rem var(--void);
192
+ }
193
+
194
+ .console-mark {
195
+ display: grid;
196
+ place-items: center;
197
+ min-height: 15rem;
198
+ border: 1px solid var(--deep);
199
+ border-radius: 18px;
200
+ color: var(--mist);
201
+ background: linear-gradient(145deg, var(--deep), var(--surface));
202
+ font-size: clamp(3rem, 8vw, 5.2rem);
203
+ font-weight: 950;
204
+ letter-spacing: -0.08em;
205
+ }
206
+
207
+ .console-mark span {
208
+ color: var(--lavender);
209
+ }
210
+
211
+ .console-list {
212
+ margin: 1rem 0 0;
213
+ }
214
+
215
+ .console-list div {
216
+ display: flex;
217
+ justify-content: space-between;
218
+ padding-block: 0.55rem;
219
+ border-block-start: 1px solid var(--deep);
220
+ font-family: "Cascadia Code", Consolas, monospace;
221
+ font-size: 0.76rem;
222
+ text-transform: uppercase;
223
+ }
224
+
225
+ .console-list dt {
226
+ color: var(--lavender);
227
+ }
228
+
229
+ .console-list dd {
230
+ margin: 0;
231
+ color: var(--mist);
232
+ font-weight: 900;
233
+ }
234
+
235
+ .section {
236
+ padding-block: clamp(4rem, 9vw, 7rem);
237
+ border-block-start: 1px solid var(--deep);
238
+ }
239
+
240
+ .section h2 {
241
+ max-width: 18ch;
242
+ margin-block: 0.5rem 1rem;
243
+ font-size: clamp(2.2rem, 6vw, 4.5rem);
244
+ line-height: 1.02;
245
+ letter-spacing: -0.055em;
246
+ }
247
+
248
+ .section-lede {
249
+ max-width: 68ch;
250
+ font-size: 1.05rem;
251
+ }
252
+
253
+ .project-layout {
254
+ display: grid;
255
+ grid-template-columns: minmax(15rem, 0.75fr) minmax(0, 1.5fr);
256
+ margin-block-start: 2rem;
257
+ gap: 1rem;
258
+ }
259
+
260
+ .project-picker {
261
+ display: grid;
262
+ align-content: start;
263
+ gap: 0.75rem;
264
+ }
265
+
266
+ .project-card {
267
+ display: grid;
268
+ justify-items: start;
269
+ width: 100%;
270
+ padding: 1.1rem;
271
+ border: 1px solid var(--deep);
272
+ border-radius: 14px;
273
+ color: var(--mist);
274
+ background: var(--surface);
275
+ font: inherit;
276
+ text-align: start;
277
+ cursor: pointer;
278
+ gap: 0.35rem;
279
+ }
280
+
281
+ .project-card:hover,
282
+ .project-card.is-active {
283
+ border-color: var(--lavender);
284
+ background: var(--deep);
285
+ }
286
+
287
+ .project-card strong {
288
+ font-size: 1.05rem;
289
+ }
290
+
291
+ .project-card > span:last-child {
292
+ color: var(--lavender);
293
+ }
294
+
295
+ .status {
296
+ display: inline-flex;
297
+ width: fit-content;
298
+ padding: 0.28rem 0.62rem;
299
+ border: 1px solid var(--lavender);
300
+ border-radius: 999px;
301
+ color: var(--mist);
302
+ font-family: "Cascadia Code", Consolas, monospace;
303
+ font-size: 0.65rem;
304
+ font-weight: 900;
305
+ letter-spacing: 0.07em;
306
+ text-transform: uppercase;
307
+ }
308
+
309
+ .status.private {
310
+ border-style: dashed;
311
+ }
312
+
313
+ .project-detail {
314
+ min-height: 34rem;
315
+ padding: clamp(1.3rem, 3vw, 2.2rem);
316
+ border: 1px solid var(--violet);
317
+ border-radius: 18px;
318
+ background: var(--surface);
319
+ }
320
+
321
+ .detail-topline {
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: space-between;
325
+ gap: 1rem;
326
+ }
327
+
328
+ .project-detail h3 {
329
+ margin-block: 0.7rem;
330
+ font-size: clamp(2.1rem, 5vw, 3.6rem);
331
+ line-height: 1.05;
332
+ letter-spacing: -0.045em;
333
+ }
334
+
335
+ .project-detail h4 {
336
+ margin-block-end: 0.4rem;
337
+ font-size: 1rem;
338
+ }
339
+
340
+ .project-detail ul {
341
+ padding-inline-start: 1.2rem;
342
+ }
343
+
344
+ .project-detail li + li {
345
+ margin-block-start: 0.4rem;
346
+ }
347
+
348
+ .next-gate {
349
+ margin-block: 1.5rem;
350
+ padding: 1rem;
351
+ border-inline-start: 0.35rem solid var(--ultraviolet);
352
+ background: var(--void);
353
+ }
354
+
355
+ .next-gate p {
356
+ margin-block-end: 0;
357
+ }
358
+
359
+ .card-grid {
360
+ display: grid;
361
+ grid-template-columns: repeat(2, minmax(0, 1fr));
362
+ margin-block-start: 2rem;
363
+ gap: 1rem;
364
+ }
365
+
366
+ .info-card {
367
+ min-height: 13rem;
368
+ padding: clamp(1.25rem, 3vw, 2rem);
369
+ border: 1px solid var(--deep);
370
+ border-radius: 18px;
371
+ background: var(--surface);
372
+ box-shadow: 0 1rem 2.5rem var(--void);
373
+ }
374
+
375
+ .info-card h3 {
376
+ margin-block: 0.7rem;
377
+ color: var(--mist);
378
+ }
379
+
380
+ .collection-card {
381
+ display: block;
382
+ color: var(--mist);
383
+ text-decoration: none;
384
+ }
385
+
386
+ .collection-card:hover {
387
+ border-color: var(--lavender);
388
+ }
389
+
390
+ .truth-banner {
391
+ margin-block-start: 2rem;
392
+ padding: 1rem;
393
+ border: 1px solid var(--lavender);
394
+ border-radius: 10px;
395
+ color: var(--mist);
396
+ background: var(--deep);
397
+ font-family: "Cascadia Code", Consolas, monospace;
398
+ font-size: 0.76rem;
399
+ font-weight: 900;
400
+ letter-spacing: 0.07em;
401
+ text-align: center;
402
+ }
403
+
404
+ .site-footer {
405
+ padding-block: 2rem;
406
+ border-block-start: 1px solid var(--violet);
407
+ background: var(--void);
408
+ }
409
+
410
+ .footer-row {
411
+ color: var(--lavender);
412
+ font-size: 0.75rem;
413
+ }
414
+
415
+ @media (max-width: 800px) {
416
+ .nav,
417
+ .footer-row,
418
+ .detail-topline {
419
+ align-items: flex-start;
420
+ flex-direction: column;
421
+ }
422
+
423
+ .nav {
424
+ padding-block: 1rem;
425
+ }
426
+
427
+ .nav-links {
428
+ flex-wrap: wrap;
429
+ }
430
+
431
+ .hero,
432
+ .project-layout,
433
+ .card-grid {
434
+ grid-template-columns: 1fr;
435
+ }
436
+
437
+ .hero {
438
+ min-height: auto;
439
+ }
440
+ }
441
+
442
+ @media (prefers-reduced-motion: reduce) {
443
+ *,
444
+ *::before,
445
+ *::after {
446
+ scroll-behavior: auto !important;
447
+ transition-duration: 0.01ms !important;
448
+ }
449
+ }
450
+
451
+ @media (prefers-contrast: more) {
452
+ :root {
453
+ --deep: #8B5CF6;
454
+ --violet: #D8B4FE;
455
+ }
456
+ }
tests/test_portfolio.py DELETED
@@ -1,49 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import sys
4
- import unittest
5
- from pathlib import Path
6
-
7
- ROOT = Path(__file__).resolve().parents[1]
8
- sys.path.insert(0, str(ROOT))
9
-
10
- from portfolio import PROJECTS, project_choices, render_project # noqa: E402
11
-
12
-
13
- class PortfolioContentTests(unittest.TestCase):
14
- def test_all_required_nodes_exist_in_order(self) -> None:
15
- self.assertEqual(
16
- project_choices(),
17
- ["KittyLM", "DATA LAB", "NEKO//AGENT", "Research Collections"],
18
- )
19
-
20
- def test_repository_states_match_live_visibility(self) -> None:
21
- self.assertEqual(
22
- {key: project.state for key, project in PROJECTS.items()},
23
- {
24
- "KittyLM": "VERIFIED PUBLIC",
25
- "DATA LAB": "VERIFIED PRIVATE",
26
- "NEKO//AGENT": "VERIFIED PRIVATE",
27
- "Research Collections": "VERIFIED PRIVATE",
28
- },
29
- )
30
-
31
- def test_rendered_projects_expose_state_and_next_gate(self) -> None:
32
- for key, project in PROJECTS.items():
33
- rendered = render_project(key)
34
- self.assertIn(project.state, rendered)
35
- self.assertIn("Next gate", rendered)
36
- self.assertIn(project.url, rendered)
37
-
38
- def test_unknown_key_falls_back_without_reflecting_input(self) -> None:
39
- rendered = render_project("<script>alert(1)</script>")
40
- self.assertIn("KittyLM", rendered)
41
- self.assertNotIn("<script>", rendered)
42
-
43
- def test_private_links_are_labelled_as_owner_access(self) -> None:
44
- for key in ("DATA LAB", "NEKO//AGENT", "Research Collections"):
45
- self.assertIn("owner access while private", PROJECTS[key].link_label)
46
-
47
-
48
- if __name__ == "__main__":
49
- unittest.main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/test_static_dashboard.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ import unittest
5
+ from html.parser import HTMLParser
6
+ from pathlib import Path
7
+
8
+ ROOT = Path(__file__).resolve().parents[1]
9
+
10
+
11
+ class DashboardParser(HTMLParser):
12
+ def __init__(self) -> None:
13
+ super().__init__()
14
+ self.lang: str | None = None
15
+ self.ids: set[str] = set()
16
+ self.links: list[str] = []
17
+ self.has_main = False
18
+ self.has_h1 = False
19
+
20
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
21
+ values = dict(attrs)
22
+ if tag == "html":
23
+ self.lang = values.get("lang")
24
+ if tag == "main":
25
+ self.has_main = True
26
+ if tag == "h1":
27
+ self.has_h1 = True
28
+ if values.get("id"):
29
+ self.ids.add(str(values["id"]))
30
+ if tag == "a" and values.get("href"):
31
+ self.links.append(str(values["href"]))
32
+
33
+
34
+ class StaticDashboardTests(unittest.TestCase):
35
+ def setUp(self) -> None:
36
+ self.html = (ROOT / "index.html").read_text(encoding="utf-8")
37
+ self.css = (ROOT / "style.css").read_text(encoding="utf-8")
38
+ self.javascript = (ROOT / "app.js").read_text(encoding="utf-8")
39
+
40
+ def test_document_landmarks_and_local_assets(self) -> None:
41
+ parser = DashboardParser()
42
+ parser.feed(self.html)
43
+ self.assertEqual(parser.lang, "en")
44
+ self.assertTrue(parser.has_main)
45
+ self.assertTrue(parser.has_h1)
46
+ self.assertIn("main", parser.ids)
47
+ self.assertTrue((ROOT / "style.css").is_file())
48
+ self.assertTrue((ROOT / "app.js").is_file())
49
+
50
+ def test_only_approved_palette_is_used(self) -> None:
51
+ approved = {"#090611", "#170D2B", "#6D28D9", "#8B5CF6", "#A855F7", "#D8B4FE", "#E2E0F0"}
52
+ colors = {value.upper() for value in re.findall(r"#[0-9A-Fa-f]{6}\b", self.css)}
53
+ self.assertLessEqual(colors, approved)
54
+
55
+ def test_accessibility_styles_are_present(self) -> None:
56
+ self.assertIn(":focus-visible", self.css)
57
+ self.assertIn("prefers-reduced-motion", self.css)
58
+ self.assertIn("aria-live=\"polite\"", self.html)
59
+ self.assertIn("class=\"skip-link\"", self.html)
60
+
61
+ def test_live_destinations_and_private_labels_are_present(self) -> None:
62
+ combined = self.html + self.javascript
63
+ self.assertIn("KrazyKitty/KittyLM-Research", combined)
64
+ self.assertIn("KrazyKitty/Data-Lab", combined)
65
+ self.assertIn("KrazyKitty/NEKO-Agent-Research", combined)
66
+ self.assertEqual(self.html.count("huggingface.co/collections/KrazyKitty/"), 4)
67
+ self.assertIn("Verified private", combined)
68
+
69
+ def test_dashboard_does_not_claim_live_ai(self) -> None:
70
+ self.assertIn("NO MODEL LOADED", self.html)
71
+ self.assertIn("NO FAKE LIVE STATUS", self.html)
72
+ self.assertNotIn("@spaces.GPU", self.html + self.javascript)
73
+
74
+
75
+ if __name__ == "__main__":
76
+ unittest.main()