Repository navigation
Expand file tree
/
Copy pathdashboard.html
More file actions
703 lines (690 loc) · 75.7 KB
/
Copy pathdashboard.html
File metadata and controls
703 lines (690 loc) · 75.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PyAutoCortex Dashboard</title>
<!-- generated by `pyauto-brain cortex dashboard --apply` on 2026-10-07 — regenerate, do not hand-edit -->
<style>:root{color-scheme:light dark;--bg:#fff;--fg:#1f2328;--muted:#59636e;
--board-max:77.5rem;--board-gutter:1rem;--board-measure:65ch;
--line:#d8dee4;--btn:#f6f8fa;--ok:#1a7f37;--warn:#9a6700;--bad:#d1242f;
--accent:#a5177d;--tint:#a5177d14;--edge:#a5177d3d;
/* the ink that READS on a solid --accent fill: the accent is a dark ink on
the light scheme, so white sits on it; on the dark scheme the accent is
the bright end of the pair and the page's own ground is what reads. */
--accent-ink:#fff;
--hero-lift:#340a2a;--hero-base:#000000;--glow:#ff4fc3;
--glow2:#ff4fc3}
@media(prefers-color-scheme:dark){:root{--bg:#0d1117;--fg:#f0f6fc;
--muted:#9198a1;--line:#2c333c;--btn:#151b23;--ok:#3fb950;--warn:#d29922;
--bad:#f85149;--accent:#ff7ad9;--tint:#ff7ad91f;
--edge:#ff7ad947;--accent-ink:#0d1117}}
*{box-sizing:border-box}
/* Wrapping is the page DEFAULT, not a per-component opt-in. These boards are
read on phones, and every one of them prints run URLs, dotted test ids and
long file paths — a single unbreakable token in any element a renderer adds
itself (a reasons list, a footer, a details block) spills past the right
edge and gives the WHOLE page a horizontal scroll. `overflow-wrap` is
inherited, so setting it here covers markup this module has never seen.
The three max-width/overflow rules do the same job for the things that
cannot be wrapped: an image, a table, a code block. */
body{margin:0 auto;max-width:var(--board-max);padding:0 var(--board-gutter) 4rem;background:var(--bg);
color:var(--fg);font:16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",
Helvetica,Arial,sans-serif;-webkit-text-size-adjust:100%;
overflow-wrap:anywhere}
/* The outer maximum includes gutters (border-box); it never sets a minimum
viewport width. Data uses the available space, prose has its own measure.
Match the existing inset-hero breakpoint rather than adding another step.
See docs/board-sizing.md for consumer responsibilities and adoption. */
@media(min-width:46rem){:root{--board-gutter:1.5rem}}
:where(p,.board-prose){max-width:var(--board-measure)}
/* Masthead text and status panels occupy their full component width. */
.hero p,.verdict{max-width:none}
img,svg,table{max-width:100%}
pre{overflow-x:auto}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
/* The accent is the page's *type* colour, not just its link colour: the
things that give a page its shape — headings, disclosure summaries, code
spans, the emphasised head of a row — are all set in the organ's hue, so
the page reads as its organ instead of as grey GitHub chrome. Semantics
are untouched: anything carrying a class (ok/warn/bad, the pills, muted)
keeps the colour that class means. */
b:not([class]),strong:not([class]){color:var(--accent)}
.muted{color:var(--muted)}
.ok{color:var(--ok)}.warn{color:var(--warn)}.bad{color:var(--bad)}
/* A bare list is page text, not a quotation. The UA's 40px indent steps it in
from every other block on the page — measured on the Heart board, the
evidence-gap bullets started at x=56 against a 16px body margin, which
reads as a stray inset column on a phone. The lists that are layout rather
than prose (.stats, .boards, ul.det) set their own padding and win on
specificity. */
ul,ol{padding-left:1.15rem}
code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em;
color:var(--accent);background:var(--tint);border:1px solid var(--edge);
padding:.05em .35em;border-radius:5px}
/* --- hero: the logo, rendered as type ---------------------------------- */
.hero{margin:0 calc(-1 * var(--board-gutter)) 1.4rem;padding:2.1rem 1.4rem 1.7rem;position:relative;
overflow:hidden;text-align:center;color:#fff;background:var(--hero-base);
background-image:radial-gradient(78% 104% at 50% 14%,
var(--hero-lift) 0%,var(--hero-base) 72%)}
@media(min-width:46rem){.hero{margin:1rem 0 1.6rem;border-radius:16px}}
.hero::after{content:"";position:absolute;left:12%;right:12%;bottom:0;
height:2px;background:linear-gradient(90deg,transparent,var(--glow),
transparent);opacity:.75}
/* The mark carries its own ring, so the frame is light and glow only —
the logos set their glyph on black with a halo, not in a chip. */
.orb{display:block;width:5.6rem;height:5.6rem;margin:0 auto .75rem;
color:var(--glow);filter:drop-shadow(0 0 9px #ff4fc37a)}
.orb svg{display:block;width:100%;height:100%}
.hero h1{margin:0;font-size:1.85rem;line-height:1.1;font-weight:700;
letter-spacing:-.022em;color:#fff}
/* Two wordmarks run their organ name as a gradient; for the rest --glow2
repeats --glow, so the same rule paints a flat colour. */
.hero h1 b{font-weight:700;color:var(--glow);
background:linear-gradient(96deg,var(--glow),var(--glow2));
-webkit-background-clip:text;background-clip:text}
@supports(-webkit-background-clip:text){
.hero h1 b{-webkit-text-fill-color:transparent}}
.hero .kind{display:block;margin-top:.5rem;font-size:.66rem;font-weight:600;
letter-spacing:.26em;text-transform:uppercase;color:#ffffffa6}
/* The hairline with a lit dot at its centre: every logo separates wordmark
from tagline with one, and it is the detail that reads as "same mark". */
.hero .rule{position:relative;width:11.5rem;height:1px;margin:1rem auto .75rem;
background:linear-gradient(90deg,transparent,var(--glow),transparent);
opacity:.7}
.hero .rule::after{content:"";position:absolute;left:50%;top:50%;
width:.4rem;height:.4rem;margin:-.2rem 0 0 -.2rem;border-radius:50%;
background:var(--glow);box-shadow:0 0 7px 1px var(--glow)}
.hero .tag{margin:0;font-size:.63rem;font-weight:600;
letter-spacing:.3em;text-transform:uppercase;color:var(--glow);opacity:.9}
.lede{margin:0 0 .9rem}
/* Section links share a shape whether or not the owner has a useful count. */
.board-nav{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,10rem),1fr));
gap:.75rem;margin:1.5rem 0;min-width:0}
@media(min-width:64rem){
.board-nav[style]{grid-template-columns:repeat(var(--nav-columns),minmax(0,1fr))}}
.board-nav-card{display:flex;flex-direction:column;justify-content:center;gap:.25rem;
min-width:0;min-height:5.5rem;padding:1rem;border:1px solid var(--line);
border-top:3px solid var(--accent);border-radius:12px;background:var(--btn);
color:var(--fg);text-decoration:none}
.board-nav-card:hover{background:var(--tint);text-decoration:none;border-color:var(--accent)}
.board-nav-card:focus-visible{outline:3px solid var(--accent);outline-offset:3px}
.board-nav-count{font-size:1.8rem;font-weight:700;line-height:1.15;color:var(--accent)}
.board-nav-label{font-weight:650}.board-nav-context{font-size:.8rem;color:var(--muted)}
/* Shared major-section disclosures; owner-provided summaries stay visible. */
details.board-section{margin:1rem 0;border:1px solid var(--line);border-radius:10px;padding:0}
.board-section>summary{display:flex;align-items:center;gap:.65rem;flex-wrap:wrap;padding:1rem;cursor:pointer;list-style:none;min-height:48px}
.board-section>summary::-webkit-details-marker{display:none}
.board-section>summary::before{content:"▸";color:var(--accent);flex:none}
.board-section[open]>summary::before{content:"▾"}
.board-section>summary>h2{display:inline;margin:0;padding:0;border:0;flex:1;min-width:0;font-size:1.15rem}
.board-section>summary>h2::after{display:none}
.board-section>summary:focus-visible{outline:3px solid var(--accent);outline-offset:3px}
.board-section-body{padding:0 1rem 1rem;min-width:0}
.section-badge{font-size:.8rem;border:1px solid currentColor;border-radius:999px;padding:.15rem .55rem;white-space:normal}
.section-status-red{color:#b42318}.section-status-yellow{color:#8a5700}.section-status-green{color:#18733c}
.section-status-stale,.section-status-unknown{color:var(--muted)}
@media(prefers-color-scheme:dark){.section-status-red{color:#ff9188}.section-status-yellow{color:#eac15c}.section-status-green{color:#7bd49c}}
@media print{.board-section-body{display:block!important}.board-section>summary{break-after:avoid}}
/* --- sections ---------------------------------------------------------- */
h2{font-size:1.1rem;margin:2.1rem 0 .3rem;padding:0 0 .35rem;font-weight:650;
position:relative;color:var(--accent);border-bottom:2px solid var(--edge)}
/* The hero's lit rule, quieted and reused: the hairline under a section
starts at full accent and fades into the edge tone. Purely the ::after,
so a browser that skips it still gets the plain hairline. */
h2::after{content:"";position:absolute;left:0;bottom:-2px;width:44%;height:2px;
background:linear-gradient(90deg,var(--accent),var(--accent) 15%,transparent)}
h2 a{color:inherit}
/* The heading is the accent; its parenthetical stays a quiet aside rather
than competing at the same weight. */
h2 .muted{font-weight:400}
h3{font-size:.98rem;margin:1.3rem 0 .2rem;font-weight:650;color:var(--accent)}
/* --- rows -------------------------------------------------------------- */
.task{display:flex;gap:.6rem;align-items:flex-start;padding:.45rem .35rem;
margin:0 -.35rem;border-bottom:1px solid var(--line);border-radius:7px}
.task:hover{background:var(--tint);box-shadow:inset 2px 0 0 var(--accent)}
.task p{margin:.25rem 0 0;flex:1;min-width:0}
button.copy{flex:0 0 auto;width:2.6rem;height:2.6rem;font-size:1.1rem;
border:1px solid var(--edge);border-radius:9px;background:var(--tint);
cursor:pointer;color:var(--accent);transition:border-color .12s,color .12s}
button.copy:hover{border-color:var(--accent);color:var(--accent)}
button.copy.ok{color:var(--ok);border-color:var(--ok);background:transparent}
button.copy.term{font-size:.95rem}
/* The owner supplies meaning and destinations; the family owns the controls. */
.orchestration-panel{border:1px solid var(--line);border-radius:16px;padding:1.5rem;
margin:1.5rem 0;background:linear-gradient(120deg,var(--tint),var(--bg));min-width:0}
.orchestration-head{display:flex;flex-wrap:wrap;gap:1.25rem;justify-content:space-between;align-items:start}
.orchestration-panel h2{margin:0;border:0;padding:0;font-size:1.45rem}
.orchestration-panel h2:after{display:none}
h2.prompt-heading.prompt-heading{font-size:clamp(.875rem,3.2vw,1.45rem);font-weight:400;
line-height:1.35;white-space:nowrap;letter-spacing:normal;border:0;padding:0;margin:1rem 0}
h2.prompt-heading strong{font-weight:700}
h2.prompt-heading:after{display:none}
.orchestration-panel h2.prompt-heading{margin:0}
.orchestration-head p{margin:.5rem 0 1rem}
.orchestration-links{display:flex;flex-wrap:wrap;gap:.5rem;max-width:100%}
.orchestration-links a{display:inline-block;padding:.5rem .75rem;border:1px solid var(--line);
border-radius:8px;background:var(--bg);font-weight:600}
.orchestration-controls{display:flex;gap:1rem;align-items:end;flex-wrap:wrap;margin:.75rem 0}
.orchestration-direction{flex:1;min-width:min(100%,15rem)}
.orchestration-panel label{display:block;font-weight:600;margin-bottom:.35rem}
.orchestration-panel textarea{display:block;width:100%;max-width:100%;resize:vertical;
box-sizing:border-box;font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--line);
border-radius:8px;padding:.75rem;white-space:pre-wrap}
.orchestration-panel [data-orchestration-prompt]{margin-top:.75rem;font-size:.9rem}
.orchestration-copy{font:inherit;font-weight:650;background:var(--accent);color:var(--bg);
border:0;border-radius:8px;padding:.85rem 1rem;cursor:pointer;min-height:44px;max-width:100%}
.orchestration-panel :focus-visible{outline:3px solid var(--accent);outline-offset:3px}
.orchestration-status{margin:.5rem 0 0;color:var(--muted)}
.orchestration-status:empty{display:none}
.orchestration-footer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.5rem 1rem;font-size:.8rem}
.orchestration-footer>[data-orchestration-preview]{grid-column:1/-1;grid-row:1;margin:0}
.orchestration-footer>[data-orchestration-preview]>summary{width:max-content;max-width:100%}
.orchestration-freshness{grid-column:2;grid-row:1;align-self:start;display:flex;flex-wrap:wrap;gap:.35rem .75rem;align-items:baseline}
.orchestration-freshness details{margin:0;padding:0;border:0;background:none}
.orchestration-freshness summary{font:inherit;color:inherit;cursor:pointer}
.orchestration-freshness time{display:block;font-size:.75rem}
.orchestration-freshness[data-freshness="green"]{color:var(--ok)}
.orchestration-freshness[data-freshness="yellow"]{color:var(--warn)}
.orchestration-freshness[data-freshness="red"]{color:var(--bad)}
.orchestration-freshness[data-freshness="grey"]{color:var(--muted)}
.orchestration-freshness a{font:inherit}
@media(max-width:46rem){.orchestration-panel{padding:1rem}.orchestration-head{display:block}
.orchestration-copy{width:100%}.orchestration-links{margin-bottom:1rem}
.orchestration-footer{display:block}.orchestration-freshness{margin-top:.5rem}}
/* A copy button with a WORDED face is a chip, not an icon. The rule above is
a fixed 2.6rem square — right for a bare clipboard glyph, a trap for a
label: the text wraps inside 42px into a one-word-per-line column and
spills out of its own box (observed on the health board's "clear them all"
line). Size to the label instead, and hold it on one line the way `.pill`
does — a chip that will not fit is elided, never allowed to push the page
sideways. `vertical-align:bottom` because `overflow:hidden` moves an
inline-block's baseline to its bottom edge. */
button.copy.text{width:auto;height:auto;max-width:100%;padding:.34rem .62rem;
font-size:.85rem;font-weight:600;white-space:nowrap;overflow:hidden;
text-overflow:ellipsis;vertical-align:bottom}
button.more{display:block;width:100%;margin:.7rem 0;padding:.55rem;
border:1px dashed var(--edge);border-radius:9px;background:transparent;
color:var(--muted);cursor:pointer;font:inherit;font-size:.9em}
button.more:hover{color:var(--accent);border-style:solid}
details{margin:.5rem 0}
summary{cursor:pointer;font-weight:600;padding:.4rem 0;color:var(--accent)}
summary::marker{color:var(--accent)}
/* --- facet pills: the backlog, scannable by colour --------------------- */
.facets{color:var(--muted);font-size:.85em}
.tags{display:block;margin-top:.32rem;line-height:1.9}
/* A pill is a LABEL, and a label that will not fit is elided, never allowed
to push the page sideways. `nowrap` is what makes a chip read as a chip, so
it is also the one thing the page-wide wrap guard above cannot reach: an
over-long value (a board handing a whole log sentence to a facet) used to
run a chip a thousand pixels wide. The row's prose carries the meaning; the
chip carries the word. `vertical-align:bottom` because `overflow:hidden`
moves an inline-block's baseline to its bottom edge. */
.pill{display:inline-block;max-width:100%;padding:.06em .5em;border-radius:999px;
font-size:.74em;font-weight:650;letter-spacing:.015em;white-space:nowrap;
overflow:hidden;text-overflow:ellipsis;
vertical-align:bottom;border:1px solid var(--edge);background:var(--tint);
color:var(--accent)}
.pill+.pill{margin-left:.28rem}
.pill.n{border-color:var(--line);background:var(--btn);color:var(--muted)}
.pill.w{border-color:transparent;background:var(--btn);color:var(--muted);
font-size:.7em;letter-spacing:.09em;text-transform:uppercase}
.pill.w.y{color:var(--warn);border-color:var(--warn);background:transparent}
.pill.g{border-color:var(--ok);background:transparent;color:var(--ok)}
.pill.y{border-color:var(--warn);background:transparent;color:var(--warn)}
.pill.r{border-color:var(--bad);background:transparent;color:var(--bad)}
/* --- stat strip -------------------------------------------------------- */
.stats{display:flex;flex-wrap:wrap;gap:.4rem;margin:0 0 1rem;padding:0;
list-style:none}
.stats li{flex:1 1 auto;min-width:5.2rem;padding:.5rem .6rem;text-align:center;
border:1px solid var(--line);border-radius:10px;background:var(--btn)}
.stats b{display:block;font-size:1.15rem;line-height:1.2;color:var(--accent);
font-variant-numeric:tabular-nums}
.stats span{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;
color:var(--accent);opacity:.75}
/* --- verdict banner ---------------------------------------------------- */
.verdict{margin:0 0 1rem;padding:.7rem .85rem;border-radius:10px;
border:1px solid var(--line);border-left:4px solid var(--muted);
background:var(--btn)}
.verdict.ok{border-left-color:var(--ok)}
.verdict.warn{border-left-color:var(--warn)}
.verdict.bad{border-left-color:var(--bad)}
.verdict b{display:block;font-size:1.02rem}
.verdict.ok b{color:var(--ok)}
.verdict.warn b{color:var(--warn)}
.verdict.bad b{color:var(--bad)}
/* --- tables ------------------------------------------------------------ */
table.recent{width:100%;border-collapse:collapse;font-size:.95em}
table.recent td{border-bottom:1px solid var(--line);
padding:.45rem .4rem .45rem 0;vertical-align:top}
table.recent tr:hover td{background:var(--tint)}
table.recent td.when{white-space:nowrap;color:var(--muted);
font-variant-numeric:tabular-nums}
table.recent td.what{white-space:nowrap;color:var(--accent);font-size:.85em;
padding-top:.58rem;opacity:.8}
table.recent td.pick{width:2.6rem;padding-right:0}
table.recent button.copy{width:2.2rem;height:2.2rem;font-size:.95rem}
/* On a phone a four-column row is not a row, it is a ribbon. Measured at a
375px viewport: the meta columns took 156px and the text was left 187 — half
the screen — so every entry wrapped into a tall thin column down the right
while the meta cells sat beside it as empty height. Below 34rem the row
stacks: the meta reads as one small header line with the button at its end,
and the text takes the full width underneath. */
@media(max-width:34rem){
/* `:not([hidden])` is load-bearing: `display:flex` here outranks the UA
sheet's `[hidden]{display:none}`, which would reveal the whole paged
Recent feed at once. */
table.recent tr:not([hidden]){display:flex;flex-wrap:wrap;align-items:baseline;gap:0 .5rem;
padding:.5rem 0;border-bottom:1px solid var(--line)}
table.recent td{display:block;width:auto;border-bottom:0;padding:0}
table.recent td.what{padding-top:0}
table.recent td.pick{width:auto;margin-left:auto}
table.recent td:not([class]){flex:1 0 100%;margin-top:.15rem}
}
/* --- the family footer: one chip per sibling board, in its own colour --- */
.boards{display:flex;flex-wrap:wrap;gap:.4rem;margin:2.4rem 0 0;padding:0;
list-style:none;border-top:1px solid var(--line);padding-top:1rem}
.boards a{display:inline-block;padding:.3rem .7rem;border-radius:999px;
font-size:.82em;font-weight:600;border:1px solid currentColor;opacity:.85}
.boards a:hover{opacity:1;text-decoration:none}
/* --- the review button: the batch-status box's `_status.render_html` ---- */
a.go{display:inline-block;margin-top:.15rem;padding:.35rem .8rem;
border-radius:999px;font-size:.85em;font-weight:600;color:#fff;
background:var(--warn)}
a.go:hover{opacity:.9;text-decoration:none}
.mdsrc{font-size:.85em}
.board-source-link{display:inline-flex;align-items:center;justify-content:center;flex:none;width:44px;height:44px;border-radius:6px;color:var(--muted);text-decoration:none}
.board-source-link:hover{color:var(--accent);background:var(--btn)}
.board-source-link:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.board-source-link svg{width:18px;height:18px;pointer-events:none}
p:has(>.board-source-link){display:flex;align-items:center;gap:.5rem;max-width:none}
p>.board-source-link{order:1;margin-left:auto}
.board-section>summary>.board-source-link{margin-left:auto}
.boards a[data-organ="brain"]{color:#2159c9}@media(prefers-color-scheme:dark){.boards a[data-organ="brain"]{color:#6f9dff}}.boards a[data-organ="mind"]{color:#0a7d72}@media(prefers-color-scheme:dark){.boards a[data-organ="mind"]{color:#2ee6cf}}.boards a[data-organ="cortex"]{color:#a5177d}@media(prefers-color-scheme:dark){.boards a[data-organ="cortex"]{color:#ff7ad9}}.boards a[data-organ="memory"]{color:#6b34d6}@media(prefers-color-scheme:dark){.boards a[data-organ="memory"]{color:#b37eff}}.boards a[data-organ="eyes"]{color:#7d6300}@media(prefers-color-scheme:dark){.boards a[data-organ="eyes"]{color:#f5c518}}.boards a[data-organ="ears"]{color:#96520b}@media(prefers-color-scheme:dark){.boards a[data-organ="ears"]{color:#ffc078}}.boards a[data-organ="heart"]{color:#b50f1a}@media(prefers-color-scheme:dark){.boards a[data-organ="heart"]{color:#ff6b73}}.boards a[data-organ="hands"]{color:#9a5400}@media(prefers-color-scheme:dark){.boards a[data-organ="hands"]{color:#ffa733}}.boards a[data-organ="pulse"]{color:#0b7a4b}@media(prefers-color-scheme:dark){.boards a[data-organ="pulse"]{color:#34d399}}.boards a[data-organ="insight"]{color:#995500}@media(prefers-color-scheme:dark){.boards a[data-organ="insight"]{color:#ffc163}}.boards a[data-organ="nerves"]{color:#6420e0}@media(prefers-color-scheme:dark){.boards a[data-organ="nerves"]{color:#a27aff}}.boards a[data-organ="gut"]{color:#3f7a00}@media(prefers-color-scheme:dark){.boards a[data-organ="gut"]{color:#8fe01a}}.boards a[data-organ="organism"]{color:#0b6fa4}@media(prefers-color-scheme:dark){.boards a[data-organ="organism"]{color:#5ec7f5}}
.fresh{padding:.1rem .9rem;margin:1.2rem 0;background:var(--tint)}.fresh p{margin:.5rem 0}table.map{width:100%;border-collapse:collapse;font-size:.95em}table.map th{text-align:left;color:var(--muted);font-weight:600}table.map td,table.map th{border-bottom:1px solid var(--line);padding:.4rem .5rem .4rem 0;vertical-align:top}.checkin{display:flex;gap:.9rem;align-items:center;padding:.9rem 1.2rem;border:2px solid var(--line);border-radius:.6rem;margin:.2rem 0 1.4rem}.checkin .mark{font-size:2rem;line-height:1}.checkin .label{display:block;font-size:.75rem;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.checkin time{font-size:1.6rem;font-weight:700;font-variant-numeric:tabular-nums;display:block}.checkin .note{font-size:.85rem;color:var(--muted)}.checkin.fresh-ok{border-color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent)}.checkin.fresh-ok .mark{color:var(--ok)}.checkin.fresh-bad{border-color:var(--bad);background:color-mix(in srgb,var(--bad) 12%,transparent)}.checkin.fresh-bad .mark{color:var(--bad)}.project h3{font-size:1.35rem;font-weight:700;padding-bottom:.2rem;border-bottom:2px solid var(--accent);letter-spacing:.01em;margin-top:1.6rem}.pathchip{display:inline-block;background:var(--accent);color:#fff;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88em;padding:.12em .5em;border-radius:.3rem;overflow-wrap:anywhere}@media(prefers-color-scheme:dark){.pathchip{background:color-mix(in srgb,var(--accent) 55%,#000)}}.stale{color:var(--bad);font-weight:600}</style>
</head>
<body>
<header class="hero"><span class="orb"><svg class="mark" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="24" cy="24" r="20.4"/><path d="M11.8,18.6 C14.4,14.8 17.8,14.4 20.1,17.1 C22.4,19.8 25.8,20.2 28.5,17.9 C31.2,15.6 34.4,16.2 36.1,19.1"/><path d="M11.6,24.6 C14.2,20.8 17.6,20.4 19.9,23.1 C22.2,25.8 25.6,26.2 28.3,23.9 C31.0,21.6 34.2,22.2 35.9,25.1"/><path d="M12.8,30.6 C15.3,27.2 18.4,26.8 20.5,29.4 C22.6,32.0 25.7,32.4 28.2,30.2"/><circle cx="32.6" cy="33.0" r="3.8"/><g fill="currentColor" stroke="none"><circle cx="32.6" cy="33.0" r="1.5"/><circle cx="11.7" cy="18.6" r="1.2"/><circle cx="11.5" cy="24.6" r="1.2"/></g></svg></span><h1>PyAuto<b>Cortex</b><span class="kind">Dashboard</span></h1><div class="rule"></div><p class="tag">Question. Run. Rule.</p></header><section class="orchestration-panel" id="orchestration-cortex" aria-labelledby="orchestration-cortex-heading" data-orchestration-panel><div class="orchestration-head"><div><h2 class="prompt-heading" id="orchestration-cortex-heading">Explore science with your <strong>Cortex</strong></h2></div><nav class="orchestration-links" aria-label="Work on GitHub"><a href="https://github.com/PyAutoLabs/PyAutoCortex">Open Cortex repository</a><a href="https://github.com/PyAutoLabs/subhalo_validation">Open subhalo_validation</a><a href="https://github.com/PyAutoLabs/ep_toy_gaussian">Open ep_toy_gaussian</a><a href="https://github.com/PyAutoLabs/slope_hierarchy_scale">Open slope_hierarchy_scale</a><a href="https://github.com/Jammy2211/ic50_workspace">Open ic50_workspace</a><a href="https://github.com/PyAutoLabs/autolens_inference">Open autolens_inference</a></nav></div><div class="orchestration-controls"><div class="orchestration-direction"><label for="orchestration-cortex-direction">Optional direction</label><textarea id="orchestration-cortex-direction" rows="2" data-orchestration-direction placeholder="Focus on a task, project or question"></textarea></div><button type="button" class="orchestration-copy" data-orchestration-copy>check in since last time</button></div><div class="orchestration-footer"><details data-orchestration-preview><summary>Read the prompt</summary><label class="sr-only" for="orchestration-cortex-prompt">Exact prompt to copy</label><textarea id="orchestration-cortex-prompt" data-orchestration-prompt readonly rows="8">Use the cortex skill and treat this chat as an ongoing place to review scientific projects, discuss results and decide what to investigate next. Read PyAutoCortex/AGENTS.md, its project registry and the relevant project ledgers. Follow project-specific instructions when working within a project.
When I give no particular direction, check in across active projects. On the laptop, use the Cortex pull procedure to retrieve updates through each project’s own sync CLI and report run status. Where that access is unavailable, use the available evidence and state what could not be checked. Follow the Cortex check-in procedure to refresh the board and read back each project’s current position, recent activity, outstanding questions and recorded next steps.
When I name a project, result, question or idea, make that the main focus. Help me recall where we left off, inspect available results, compare measured outputs and retrieve relevant records. Help develop scientific questions or explore explanations only when I ask. Bring in other projects where relevant; do not repeat the full project review on every follow-up.
Present factual results, run status and my previously recorded conclusions. Do not offer scientific interpretations, explanations or hypotheses unless I explicitly ask. When I request interpretation, distinguish evidence from speculation and keep proposed interpretations separate from my accepted conclusions. Record scientific conclusions only when I tell you what to preserve.
Record the observations, conclusions and decisions I ask you to preserve using the Cortex ledger procedures. Keep run records, dated discussion notes and next steps consistent, with links to supporting evidence. Keep scientific records in Cortex and bounded development tasks in Mind.
Help plan follow-up analyses or runs when requested, using the project’s own execution workflow. Submit compute only when I explicitly ask, and preserve the applicable resource and approval requirements. Route implementation changes through the development workflow.
Continue from decisions and authorizations already established in this conversation. After taking action, report what changed, what was recorded and what remains unresolved.
Last check-in: 2026-09-30T09:51Z.
Work on GitHub:
- Open Cortex repository: https://github.com/PyAutoLabs/PyAutoCortex
- Open subhalo_validation: https://github.com/PyAutoLabs/subhalo_validation
- Open ep_toy_gaussian: https://github.com/PyAutoLabs/ep_toy_gaussian
- Open slope_hierarchy_scale: https://github.com/PyAutoLabs/slope_hierarchy_scale
- Open ic50_workspace: https://github.com/Jammy2211/ic50_workspace
- Open autolens_inference: https://github.com/PyAutoLabs/autolens_inference</textarea></details><div class="orchestration-freshness" data-freshness="grey"><details data-freshness-stamp data-refreshed-at="2026-10-07T20:42:16Z"><summary><span data-freshness-label>Last updated 2026-10-07 20:42:16 UTC</span></summary><time datetime="2026-10-07T20:42:16Z">2026-10-07 20:42:16 UTC</time></details><a data-refresh-link href="https://github.com/PyAutoLabs/PyAutoCortex/actions/workflows/dashboard_refresh.yml" title="Open the dashboard refresh controls">↻ Update</a></div></div><p class="orchestration-status" role="status" aria-live="polite"></p></section>
<nav class="board-nav" aria-label="Board sections"><a class="board-nav-card" href="#summary"><span class="board-nav-count">21</span><span class="board-nav-label">Running</span></a><a class="board-nav-card" href="#summary"><span class="board-nav-count">38</span><span class="board-nav-label">Open</span></a><a class="board-nav-card" href="#projects"><span class="board-nav-count">7</span><span class="board-nav-label">Projects</span></a><a class="board-nav-card" href="#checkin-box"><span class="board-nav-label">Check in</span></a></nav>
<p class="muted mdsrc"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/dashboard.md" class="board-source-link" title="Markdown version" aria-label="Markdown version"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M14 3H6a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8Z"/><path d="M14 3v5h5M8 12h8M8 16h6"/></svg></a><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/README.md">GitHub Page</a></p>
<div class="checkin" id="checkin-box"><span class="mark" id="checkin-mark"></span><div><span class="label">Last check-in</span><time id="checkin" datetime="2026-09-30T09:51Z">2026-09-30T09:51Z</time><span class="note" id="checkin-note"></span></div></div>
<details class="board-section"><summary><h2>Summary</h2><span class="section-badge">21 Running · 38 Open</span></summary><div class="board-section-body"><a id="summary"></a>
<table class="map">
<tr><th>Project</th><th>Running</th><th>Open</th><th>Last update</th></tr>
<tr><td><b>subhalo_validation</b></td><td>0</td><td>5</td><td>2026-09-07</td></tr>
<tr><td><b>euclid_dr1</b></td><td>15</td><td>33</td><td>2026-09-30</td></tr>
<tr><td><b>analytic_gaussian</b></td><td>0</td><td>0</td><td>2026-09-30</td></tr>
<tr><td><b>ep_toy_gaussian</b></td><td>0</td><td>0</td><td>2026-09-30</td></tr>
<tr><td><b>slope_hierarchy_scale</b></td><td>0</td><td>0</td><td>2026-09-30</td></tr>
<tr><td><b>ic50_workspace</b></td><td>0</td><td>0</td><td>2026-09-30</td></tr>
<tr><td><b>autolens_inference</b></td><td>6</td><td>0</td><td>2026-09-24</td></tr>
</table>
</div></details><details class="board-section"><summary><h2>Projects</h2><span class="section-badge">7</span></summary><div class="board-section-body"><a id="projects"></a>
<section class="project">
<h3>subhalo_validation — Do the SLaM subhalo pipelines false-detect on lenses with no subhalo</h3>
<p class="muted">active · ral · <a href="https://github.com/PyAutoLabs/subhalo_validation/issues/2">subhalo_validation#2</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/subhalo_validation.md">projects/subhalo_validation.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/subhalo_validation</span> · RAL <span class="pathchip">/mnt/ral/jnightin/subhalo_validation</span></p>
<p><b>Now</b></p>
<p>Five chains on RAL under the corrected adapt settings: rectangular_adapt on pl_eff_0 / pl_eff_1_outer (job A done, job B 342311 submitted) and the delaunay_adapt_split reruns plus rectangular_adapt on pl_sersic_0. pl_sersic_0 on delaunay_adapt_split is accepted (no false detection, +2.557).<br>Next: pull when the numba chains land and read the evidence_increase of each; no more 1000-pixel runs.</p>
<p><b>Runs</b></p>
<ul>
<li>342299_1 — open — ral — 2026-09-07 — delaunay_adapt_split_pl_eff_0: job B, numba chain at the standard 1250-pixel Delaunay mesh (8c / 96gb / 48 h); reloads job A 342231_1; the 09-07 ruling: run al…</li>
<li>342299_2 — open — ral — 2026-09-07 — delaunay_adapt_split_pl_eff_1_outer: job B, numba chain at the standard 1250-pixel Delaunay mesh (8c / 96gb / 48 h); reloads job A 342231_2; the 09-07 ruling:…</li>
<li>342311_1 — open — ral — 2026-09-07 — rectangular_adapt_pl_eff_0: job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_1; the…</li>
<li>342311_2 — open — ral — 2026-09-07 — rectangular_adapt_pl_eff_1_outer: job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_…</li>
<li>342311_0 — open — ral — 2026-09-07 — rectangular_adapt_pl_sersic_0: job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_0;…</li>
</ul>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-07 — <i>result</i> — accepted delaunay_adapt_split_pl_sersic_0 (R-20260907-01): Accepted. The numba delaunay_adapt_split chain on pl_sersic_0 (job 342273_0, 22 h 08 m, 1250 Hilbert / 1310 Delaunay pixels) lands evidence_increase +2.557 (< 5): no false detectio…</li>
<li>2026-09-07 — <i>run</i> — 342311_0 submitted: rectangular_adapt_pl_sersic_0 — job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_0; the 09-07 ask: submit the rectangular runs too</li>
<li>2026-09-07 — <i>run</i> — 342311_2 submitted: rectangular_adapt_pl_eff_1_outer — job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_2; the 09-07 ask: submit the rectangular runs too</li>
<li>2026-09-07 — <i>run</i> — 342311_1 submitted: rectangular_adapt_pl_eff_0 — job B, numba chain (8c / 96gb / 48 h) at the standard 1250-pixel mesh under PIPELINE=rectangular_adapt; reloads job A 342237_1; the 09-07 ask: submit the rectangular runs too</li>
<li>2026-09-07 — <i>run</i> — 342299_2 submitted: delaunay_adapt_split_pl_eff_1_outer — job B, numba chain at the standard 1250-pixel Delaunay mesh (8c / 96gb / 48 h); reloads job A 342231_2; the 09-07 ruling: run all datasets at 1250, no more pix1000</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/subhalo_validation.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume subhalo_validation: read PyAutoCortex projects/subhalo_validation.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/subhalo_validation/wiki/project/state.md and the assistant autolens_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume subhalo_validation</p></div>
</section>
<section class="project">
<h3>euclid_dr1 — Does the sep1 DR1 delivery reproduce the ten prelim lenses by eye</h3>
<p class="muted">active · ral · no issue yet · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid_dr1.md">projects/euclid_dr1.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/euclid_dr1</span> · RAL <span class="pathchip">/mnt/ral/jnightin/euclid_dr1</span></p>
<p><b>Now</b></p>
<p>The top-1000 DR1 sep1 vis_lp array finished 971 of 1000; 29 hit the 18-hour walltime. Array 344645 is now running vis_pix with the Numba CPU sparse route for those 971 completed lenses only.</p>
<p><b>Runs</b></p>
<ul>
<li>342650 — open — ral — 2026-09-11 — euclid_dr1 sep1 reproduction: the ten euclid_dr1_prelim lenses refitted from the sep1 delivery through prelim's route (hpc/batch_cpu/submit_initial_lens_model_…</li>
<li>345279 — running — ral — 2026-09-20 — VIS-LP JAX CPU pilot for the nine remainder tiles completing the first ten sorted DR1 lenses; single RGB thumbnails uploaded</li>
<li>345305 — running — ral — 2026-09-20 — DR1 full vis_lp production batch 1/5: rest_01, 1000 lenses, output root dr1_full</li>
<li>345669 — open — ral — 2026-09-20 — DR1 full vis_lp production batch 2/5: rest_02, 1000 lenses, output root dr1_full</li>
<li>345670 — open — ral — 2026-09-20 — DR1 full vis_lp production batch 3/5: rest_03, 1000 lenses, output root dr1_full</li>
<li>345671 — open — ral — 2026-09-20 — DR1 full vis_lp production batch 4/5: rest_04, 1000 lenses, output root dr1_full</li>
<li>345672 — open — ral — 2026-09-20 — DR1 full vis_lp production batch 5/5: rest_05, 1000 lenses, output root dr1_full</li>
<li>349353 — open — ral — 2026-09-21 — 100-tile dr1_sep1_rest SED array: Sersic VIS with lens-light n~Uniform(0.5,10.0), then NIR Y/J/H and EXT DECam g/r/i/z; output_sed; max 20 concurrent</li>
<li>350581 — open — ral — 2026-09-23 — vis_lp-only inspection bundle over 4,912 completed dr1_sep1_rest tiles (vislp_full_20260923, OUTPUT_DIR=dr1_full, single 24 h CPU job)</li>
<li>350804 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest priority-250 vis_lp array (euclid_dr1_vis_lp_prio250), 0-249, manifest hpc/run_manifests/positions_priority_250.txt, positions finder 2.1 pos…</li>
<li>351085 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest next-5000 vis_lp batch 1/5 (euclid_dr1_vis_lp_n5k_p01), 1000 lenses, manifest hpc/run_manifests/vis_lp_next5000_20260925_part01.txt</li>
<li>351086 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest next-5000 vis_lp batch 2/5 (euclid_dr1_vis_lp_n5k_p02), 1000 lenses, manifest hpc/run_manifests/vis_lp_next5000_20260925_part02.txt</li>
<li>351087 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest next-5000 vis_lp batch 3/5 (euclid_dr1_vis_lp_n5k_p03), 1000 lenses, manifest hpc/run_manifests/vis_lp_next5000_20260925_part03.txt</li>
<li>351088 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest next-5000 vis_lp batch 4/5 (euclid_dr1_vis_lp_n5k_p04), 1000 lenses, manifest hpc/run_manifests/vis_lp_next5000_20260925_part04.txt</li>
<li>351089 — running — ral — 2026-09-25 — DR1 dr1_sep1_rest next-5000 vis_lp batch 5/5 (euclid_dr1_vis_lp_n5k_p05), 1000 lenses, manifest hpc/run_manifests/vis_lp_next5000_20260925_part05.txt</li>
<li>351090 — open — ral — 2026-09-25 — DR1 priority-250 vis_pix array (euclid_dr1_vis_pix_prio250), 0-249, dependency afterany:350804</li>
<li>351091 — open — ral — 2026-09-25 — DR1 priority-250 SED array (euclid_dr1_sed_prio250), 0-249 max 60 concurrent, output_sed, dependency afterany:351090</li>
<li>356227 — running — ral — 2026-09-26 — DR1 priority-250 vis_pix by-eye test: tasks 0-9 of submit_initial_lens_model_vis_pix_priority250 (euclid_dr1_vis_pix_prio250_test10), no dependency; full array…</li>
<li>356319 — running — ral — 2026-09-26 — DR1 priority-250 SED rerun, tasks 0-9: the ten tiles with no EXT/DECam imaging, VIS + NIR Y/J/H only (euclid_dr1_sed_prio250_nironly); SED scripts no longer re…</li>
<li>356390 — open — ral — 2026-09-26 — DR1 next-5000 vis_pix part 01/05 (euclid_dr1_vis_pix_n5k, PART=01): 992 lenses whose 351085 vis_lp log ended Finished vis_lp, manifest hpc/run_manifests/vis_pi…</li>
<li>356447 — open — ral — 2026-09-26 — DR1 next-5000 vis_pix part 02/05 (euclid_dr1_vis_pix_n5k, PART=02): 996 lenses whose 351086 vis_lp log ended Finished vis_lp, manifest hpc/run_manifests/vis_pi…</li>
<li>356448 — open — ral — 2026-09-26 — DR1 next-5000 vis_pix part 03/05 (euclid_dr1_vis_pix_n5k, PART=03): 997 lenses whose 351087 vis_lp log ended Finished vis_lp, manifest hpc/run_manifests/vis_pi…</li>
<li>356449 — open — ral — 2026-09-26 — DR1 next-5000 vis_pix part 04/05 (euclid_dr1_vis_pix_n5k, PART=04): 996 lenses whose 351088 vis_lp log ended Finished vis_lp, manifest hpc/run_manifests/vis_pi…</li>
<li>356450 — open — ral — 2026-09-26 — DR1 next-5000 vis_pix part 05/05 (euclid_dr1_vis_pix_n5k, PART=05): 994 lenses whose 351089 vis_lp log ended Finished vis_lp, manifest hpc/run_manifests/vis_pi…</li>
<li>356451 — open — ral — 2026-09-26 — DR1 next-5000 SED part 01/05 (euclid_dr1_sed_n5k, PART=01): same 992-lens manifest vis_pix_sed_next5000_20260926_part01.txt, vis_lp seed from output/, output_s…</li>
<li>356452 — open — ral — 2026-09-26 — DR1 next-5000 SED part 02/05 (euclid_dr1_sed_n5k, PART=02): same 996-lens manifest vis_pix_sed_next5000_20260926_part02.txt, vis_lp seed from output/, output_s…</li>
<li>356453 — open — ral — 2026-09-26 — DR1 next-5000 SED part 03/05 (euclid_dr1_sed_n5k, PART=03): same 997-lens manifest vis_pix_sed_next5000_20260926_part03.txt, vis_lp seed from output/, output_s…</li>
<li>356555 — open — ral — 2026-09-26 — DR1 next-5000 SED part 04/05 (euclid_dr1_sed_n5k, PART=04): same 996-lens manifest vis_pix_sed_next5000_20260926_part04.txt, vis_lp seed from output/, output_s…</li>
<li>356556 — open — ral — 2026-09-26 — DR1 next-5000 SED part 05/05 (euclid_dr1_sed_n5k, PART=05): same 994-lens manifest vis_pix_sed_next5000_20260926_part05.txt, vis_lp seed from output/, output_s…</li>
<li>366938 — running — ral — 2026-09-28 — DR1 dr1_sep1_rest v2-grade vis_lp batch 1/5 (euclid_dr1_vis_lp_v2g_p01): 1000 v2 Grade A unmodelled, manifest hpc/run_manifests/vis_lp_v2grade_20260928_part01.…</li>
<li>367039 — running — ral — 2026-09-28 — DR1 dr1_sep1_rest v2-grade vis_lp batch 2/5 (euclid_dr1_vis_lp_v2g_p02): 1000 v2 Grade A, manifest vis_lp_v2grade_20260928_part02.txt, array 0-999%100, 4 CPU/1…</li>
<li>367141 — running — ral — 2026-09-28 — DR1 dr1_sep1_rest v2-grade vis_lp batch 3/5 (euclid_dr1_vis_lp_v2g_p03): 1000 v2 Grade A, manifest vis_lp_v2grade_20260928_part03.txt, array 0-999%100, 4 CPU/1…</li>
<li>367243 — running — ral — 2026-09-28 — DR1 dr1_sep1_rest v2-grade vis_lp batch 4/5 (euclid_dr1_vis_lp_v2g_p04): 410 v2 Grade A then 590 top-score Grade B, manifest vis_lp_v2grade_20260928_part04.txt…</li>
<li>367244 — running — ral — 2026-09-28 — DR1 dr1_sep1_rest v2-grade vis_lp batch 5/5 (euclid_dr1_vis_lp_v2g_p05): 1000 top-score v2 Grade B (score 2.50-2.01), manifest vis_lp_v2grade_20260928_part05.t…</li>
<li>374848 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest v2-grade SED chain batch 01/5 (euclid_dr1_sed_v2g), 998 tiles whose vis_lp 366938 completed, manifest hpc/run_manifests/sed_v2grade_20260930_…</li>
<li>374849 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest v2-grade SED chain batch 02/5 (euclid_dr1_sed_v2g), 998 tiles whose vis_lp 367039 completed, manifest hpc/run_manifests/sed_v2grade_20260930_…</li>
<li>374850 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest v2-grade SED chain batch 03/5 (euclid_dr1_sed_v2g), 995 tiles whose vis_lp 367141 completed, manifest hpc/run_manifests/sed_v2grade_20260930_…</li>
<li>374851 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest v2-grade SED chain batch 04/5 (euclid_dr1_sed_v2g), 995 tiles whose vis_lp 367243 completed, manifest hpc/run_manifests/sed_v2grade_20260930_…</li>
<li>374852 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest v2-grade SED chain batch 05/5 (euclid_dr1_sed_v2g), 996 tiles whose vis_lp 367244 completed, manifest hpc/run_manifests/sed_v2grade_20260930_…</li>
<li>375700 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest remaining-lens vis_lp batch 01/4 (euclid_dr1_vis_lp_rest_p01), 945 tiles, v2 B, v2_score 2.040->1.983, manifest hpc/run_manifests/vis_lp_rest…</li>
<li>375701 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest remaining-lens vis_lp batch 02/4 (euclid_dr1_vis_lp_rest_p02), 945 tiles, v2 B, v2_score 1.983->1.899, manifest hpc/run_manifests/vis_lp_rest…</li>
<li>375702 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest remaining-lens vis_lp batch 03/4 (euclid_dr1_vis_lp_rest_p03), 945 tiles, v2 B, v2_score 1.898->1.649, manifest hpc/run_manifests/vis_lp_rest…</li>
<li>375703 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest remaining-lens vis_lp batch 04/4 (euclid_dr1_vis_lp_rest_p04), 944 tiles, v2 B 366 / C 577 / X 1, v2_score 1.648->0.247, manifest hpc/run_man…</li>
<li>376091 — open — ral — 2026-09-30 — DR1 dr1_sep1_rest rest-batch vis_pix immediate array part 01/4 (euclid_dr1_vis_pix_rest_p01): tasks 0-1%60, the 2 indices whose vis_lp 375700 had COMPLETED at…</li>
<li>376092 — open — ral — 2026-09-30 — DR1 rest-batch vis_pix part 01/4 dependent singles (euclid_dr1_vis_pix_rest_p01): 943 single-task jobs ids 376092-377037, each --array=N --dependency=afterok:3…</li>
<li>377038 — open — ral — 2026-09-30 — DR1 rest-batch vis_pix part 02/4 dependent singles (euclid_dr1_vis_pix_rest_p02): 945 single-task jobs ids 377038-377987, afterok:375701_N each (indices 0-944)…</li>
<li>377988 — open — ral — 2026-09-30 — DR1 rest-batch vis_pix part 03/4 dependent singles (euclid_dr1_vis_pix_rest_p03): 945 single-task jobs ids 377988-378936, afterok:375702_N each (indices 0-944)…</li>
<li>378940 — open — ral — 2026-09-30 — DR1 rest-batch vis_pix part 04/4 dependent singles (euclid_dr1_vis_pix_rest_p04): 944 single-task jobs ids 378940-379889, afterok:375703_N each (indices 0-943)…</li>
</ul>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-30 — <i>run</i> — 378940 submitted: DR1 rest-batch vis_pix part 04/4 dependent singles (euclid_dr1_vis_pix_rest_p04): 944 single-task jobs ids 378940-379889, afterok:375703_N each (indices 0-943); 8 CPU/16 GB/24 h, partitions ral+gpu; driver submit_vis_pix_…</li>
<li>2026-09-30 — <i>run</i> — 377988 submitted: DR1 rest-batch vis_pix part 03/4 dependent singles (euclid_dr1_vis_pix_rest_p03): 945 single-task jobs ids 377988-378936, afterok:375702_N each (indices 0-944); 8 CPU/16 GB/24 h, partitions ral+gpu; driver submit_vis_pix_…</li>
<li>2026-09-30 — <i>run</i> — 377038 submitted: DR1 rest-batch vis_pix part 02/4 dependent singles (euclid_dr1_vis_pix_rest_p02): 945 single-task jobs ids 377038-377987, afterok:375701_N each (indices 0-944); 8 CPU/16 GB/24 h, partitions ral+gpu; driver submit_vis_pix_…</li>
<li>2026-09-30 — <i>run</i> — 376092 submitted: DR1 rest-batch vis_pix part 01/4 dependent singles (euclid_dr1_vis_pix_rest_p01): 943 single-task jobs ids 376092-377037, each --array=N --dependency=afterok:375700_N --kill-on-invalid-dep=yes (indices 2-944); 8 CPU/16 GB…</li>
<li>2026-09-30 — <i>run</i> — 376091 submitted: DR1 dr1_sep1_rest rest-batch vis_pix immediate array part 01/4 (euclid_dr1_vis_pix_rest_p01): tasks 0-1%60, the 2 indices whose vis_lp 375700 had COMPLETED at submit; Numba sparse CPU, 8 CPU/16 GB/24 h, partitions ral+gpu…</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid_dr1.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume euclid_dr1: read PyAutoCortex projects/euclid_dr1.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/euclid_dr1/wiki/project/state.md and the assistant autolens_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume euclid_dr1</p></div>
</section>
<section class="project">
<h3>analytic_gaussian — Graphical and EP against a closed-form Gaussian posterior, at ensemble scale</h3>
<p class="muted">active · ral · <a href="https://github.com/PyAutoLabs/PyAutoCortex/issues/34">PyAutoCortex#34</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/analytic_gaussian.md">projects/analytic_gaussian.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/analytic_gaussian</span> · RAL <span class="pathchip">/mnt/ral/jnightin/analytic_gaussian</span></p>
<p><b>Now</b></p>
<p>Wave 1 (342413, 200 seeds at N=5) is accepted as the baseline: autofit EP is exact on the Gaussian leg, leg B sigma misses as pre-registered (78/200), collapse rate 0/200. On criterion 2, astra and an independent Opus review both favour an under-calibrated mu threshold (calibrated on five unrepresentative seeds) and found no defect in the minimal-EP control; both flag the per-site sigma>0 clip (analytic_ep_minimal.py:333) as the one audit target, and astra will not clear the control without an independent reconstruction of the EP fixed point. Next: run the planned diagnostic (archive/tasks/analytic_gaussian/minimal_ep_legb_mu_threshold.md) on a passing, an edge and the worst mu seed; the N=25 rung stays written but unsubmitted until it lands.</p>
<p><b>Runs</b></p>
<p class="muted">nothing on the cluster</p>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-30 — <i>note</i> — astra (Codex gpt-6-astra) on criterion 2, verbatim: 'Neither is established as "wrong" by this result alone. I favour inadequate calibration of the threshold, with moderate confidence, but would not yet certify the control.' Decisive diagn…</li>
<li>2026-09-10 — <i>result</i> — accepted ensemble_parity (R-20260910-04): ok accept and intake the things to address. we can do another run down the line so also achieve the results in the analytic_gaussian project for future comparison</li>
<li>2026-09-10 — <i>note</i> — question: Is criterion 2's mu threshold or the minimal-EP control wrong — planned, never run [archive/tasks/analytic_gaussian/minimal_ep_legb_mu_threshold.md]</li>
<li>2026-09-09 — <i>run</i> — 342413_[0-199] submitted (done, wall 0:05): ensemble_parity — the N=5 seed ensemble, 200 seeds, 50 concurrent, `hpc/batch_cpu/submit_ensemble_n5`, sample `ens_n5`. RAL PyAuto mirror verified at PyAutoFit `66f9f8d5d` before submission, whic…</li>
<li>2026-09-09 — <i>note</i> — question: Do graphical and EP recover closed-form means and errors [archive/tasks/analytic_gaussian/ensemble_parity.md]</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/analytic_gaussian.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume analytic_gaussian: read PyAutoCortex projects/analytic_gaussian.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/analytic_gaussian/wiki/project/state.md and the assistant autofit_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume analytic_gaussian</p></div>
</section>
<section class="project">
<h3>ep_toy_gaussian — NUTS versus three EP fits on the #1405 collapse toy at N=50</h3>
<p class="muted">active · ral · <a href="https://github.com/PyAutoLabs/ep_toy_gaussian/issues/1">ep_toy_gaussian#1</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/ep_toy_gaussian.md">projects/ep_toy_gaussian.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/ep_toy_gaussian</span> · RAL <span class="pathchip">/mnt/ral/jnightin/ep_toy_gaussian</span></p>
<p><b>Now</b></p>
<p>Wave 1 (n50_seed42: 342639 + 342640_[0-2]) failed on infrastructure — EP x3 on EMFILE (fixed by PyAutoFit#1632/#1634, both in the RAL mirror at 404b3e5f7), NUTS on OOM at the 8 GB cap while XLA compiled the 50-factor window-adaptation scan, which grows with N (≥5.4 GB at N=20 locally). Wave 2 is prepared but not submitted: sample n50_seed42_w2 (free locally and on RAL; still needs its toy.SAMPLES entry), submit_nuts raised to 64 GB, submit_ep unchanged at 8 GB (peak ~590 MB). The collapse question at N=50 is unanswered; only n5_smoke speaks (EP RECOVER 3/3, NUTS 49.89/11.14). Next: human go, add the sample entry, push and submit NUTS then EP with SAMPLE=n50_seed42_w2 exported.</p>
<p><b>Runs</b></p>
<p class="muted">nothing on the cluster</p>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-30 — <i>note</i> — RAL mirror PyAutoFit now 404b3e5f7 (2026-09-27), contains #1632 (b82fb3f69) and #1634 (fa2d540ac); 5 commits behind origin/main, none in blackjax/graphical/dynesty; deps at floor except anesthetic 2.8.14 < 2.9.0 (plots only). Sample n50_se…</li>
<li>2026-09-30 — <i>note</i> — wave-2 prep: 342639 NUTS OOM was XLA compilation of the vmapped window-adaptation scan, not sampling (sacct MaxRSS 8,180,536K at ReqMem 8G; py-spy on a local N=50 run sits in backend_compile_and_load; local probes N=10 3.2 GB peak / 132 s…</li>
<li>2026-09-24 — <i>note</i> — per-search overhead profile on this toy (2026-09-24, laptop, N=5, max_steps=3): 2.45 s per Dynesty factor search, ~1.47 s dynesty run_nested + ~0.98 s autofit wrapper (plots, a redundant second run_nested pass, samples writes); inside run_…</li>
<li>2026-09-24 — <i>run</i> — 342640 failed — wall 0:14: nuts_vs_ep_x3_n50: EP x3 on identical data, array 0-2 — all three array tasks [0-2] CRASH OSError [Errno 24] Too many open files after ~126 Dynesty factor fits each (wall ~860-880 s), no ep_history.csv; results/n…</li>
<li>2026-09-24 — <i>run</i> — 342639 failed: nuts_vs_ep_x3_n50: one_by_one + BlackJAX NUTS, partition ral — one_by_one completed 50/50 in 319 s (naive parent 52.470 ± 1.260, deconvolved scatter 3.142); NUTS leg OUT_OF_MEMORY at the 8 GB SBATCH cap during window adaptat…</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/ep_toy_gaussian.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume ep_toy_gaussian: read PyAutoCortex projects/ep_toy_gaussian.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/ep_toy_gaussian/wiki/project/state.md and the assistant autofit_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume ep_toy_gaussian</p></div>
</section>
<section class="project">
<h3>slope_hierarchy_scale — Hierarchical slope recovery with graphical and EP at N=25 to 50</h3>
<p class="muted">active · both · <a href="https://github.com/PyAutoLabs/slope_hierarchy_scale/issues/2">slope_hierarchy_scale#2</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/slope_hierarchy_scale.md">projects/slope_hierarchy_scale.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/slope_hierarchy_scale</span> · RAL <span class="pathchip">/mnt/ral/jnightin/slope_hierarchy_scale</span></p>
<p><b>Now</b></p>
<p>The N=25 graphical baselines are in. The per-lens fits (342348) give a naive parent of 1.999 / 0.089 (deconvolved 0.085), and the joint NUTS fit (342350_0) recovers mean 1.994 [1.976, 2.014] and sigma 0.087 [0.074, 0.104] with 0 divergences, against truth 2.0 / 0.1 (draws 1.992 / 0.086). Its OOM came after sampling, so samples.csv is good on RAL, but the summary JSON still needs pulling and writing. The EP arm is the gap: with the Laplace projection its hierarchical factor never updates (343299: 0/50 SUCCESS), so it returns the prior. The moment-matching cure (draft/feature/autofit/ep_hierarchical_scatter_moment_matching.md) is approved and starting through start_dev; until it lands EP cannot produce the scatter it is meant to be compared on.</p>
<p><b>Runs</b></p>
<p class="muted">nothing on the cluster</p>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-30 — <i>note</i> — graphical baselines recorded late at the 2026-09-30 check-in. 342348_[0-24] per-lens (one_by_one Nautilus, A100, 25/25, 6.9-8.8 min/task, 0 float32 truncations): naive parent mean 1.9992 +/- 0.0178 (SEM), std of medians 0.0889, deconvolved…</li>
<li>2026-09-30 — <i>run</i> — 342351_0 failed — wall 27:41: n25_scale_up: EP arm on the CPU partition, hpc/batch_cpu/submit_ep, max_steps 12; RAL PyAutoFit mirror 68ff9bd57 predates PyAutoFit#1580, so this arm runs without the stale-mask fixed-point fix — CANCELLED 202…</li>
<li>2026-09-30 — <i>run</i> — 342350_0 failed — wall 16:29: n25_scale_up: joint hierarchical NUTS fit, hpc/batch_gpu/submit_graphical — OUT_OF_MEMORY 2026-09-09 13:06:31 BST (sacct 0:125, cgroup oom-kill): NUTS warm-up 500 + sampling 1000 steps completed and samples.cs…</li>
<li>2026-09-30 — <i>run</i> — 342348_[0-24] finished — wall 3:22: n25_scale_up: one lens per array task, hpc/batch_gpu/submit_one_by_one, sample_n25_seed42 — all 25 tasks COMPLETED 2026-09-08 17:14-20:37 BST (sacct, 6:54-8:50 per task, serial on the GPU): per-lens one_…</li>
<li>2026-09-24 — <i>note</i> — 343299 finding: BAD_PROJECTION = Hessian at the mode not finite or not negative-definite (scale parameter driven to a limit); FAILURE = line search failed and the mean field was handed back unchanged. This is the Laplace-on-scatter caveat…</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/slope_hierarchy_scale.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume slope_hierarchy_scale: read PyAutoCortex projects/slope_hierarchy_scale.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/slope_hierarchy_scale/wiki/project/state.md and the assistant autolens_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume slope_hierarchy_scale</p></div>
</section>
<section class="project">
<h3>ic50_workspace — EP against the graphical joint fit on IC50 dose-response data, scaling up</h3>
<p class="muted">active · ral · <a href="https://github.com/PyAutoLabs/PyAutoCortex/issues/36">PyAutoCortex#36</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/ic50_workspace.md">projects/ic50_workspace.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/ic50_workspace</span> · RAL <span class="pathchip">/mnt/ral/jnightin/ic50_workspace</span></p>
<p><b>Now</b></p>
<p>The scale ladder is in. EP passes N=5/10/25 with coef_mean within 3σ and cost growing about linearly per sweep (26/50/140 s). It died at N=50 on a projection assert the library should have recovered from (Mind bug prompt draft/bug/autofit/ep_project_nonfinite_suff_stats_ic50_n50.md, approved for start_dev; a local rerun converged, so the trigger is stochastic). Graphical is cheaper but overconfident beyond N=25, and the EP hill_coef widths are not yet comparable because util.py reports factor-message widths. Next: land the projection fix, rerun the EP ladder with output on and a fixed seed, report hill_coef from the mean field, then give ep_lbfgs_jax a witness as the scale lever.</p>
<p><b>Runs</b></p>
<p class="muted">nothing on the cluster</p>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-30 — <i>note</i> — Ladder read: EP s/sweep 26/50/140/~300 s at N=5/10/25/50 vs graphical wall 21/42/119/281 s. EP hill_coef widths flat at ~0.8 because util.py reports factor-message (likelihood) widths and the global factor freezes hill_coef; graphical widt…</li>
<li>2026-09-30 — <i>note</i> — 342411 N=50 failure diagnosed: AssertionError at autofit/messages/abstract.py:316 while projecting the global factor after EP sweep 4 (mirror 66f9f8d5d); the 4th global search had max logL -337 (vs -69 at sweep 3) and logz +/- nan. Library…</li>
<li>2026-09-09 — <i>run</i> — 342411 failed — wall 0:38: ep_scale_up: EP scale ladder, sim rungs 5/10/25/50, nlive 150 max_steps 12 — finished 2026-09-09 23:19:29 BST (sacct COMPLETED 00:38:49, the ladder catches rung failures): rungs N=5/10/25 passed the global coef_m…</li>
<li>2026-09-09 — <i>run</i> — 342412 finished — wall 0:07: ep_scale_up: graphical scale ladder, sim rungs 5/10/25/50, nlive 150 — COMPLETED 2026-09-09 22:48:42 BST (sacct 00:07:59): all four rungs N=5/10/25/50 passed the global coef_mean assertions (within 3σ); results…</li>
<li>2026-09-09 — <i>run</i> — 342408 finished — wall 0:01: ep_scale_up: EP sim, nlive 150, max_steps 12 — COMPLETED 2026-09-09 22:17:29 BST (sacct 00:01:03): N=5 EP parity, all global coef_mean assertions passed (within 3σ); results/ep_sim_summary.{txt,json}</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/ic50_workspace.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume ic50_workspace: read PyAutoCortex projects/ic50_workspace.md (Now, Runs, Log) and then /mnt/c/Users/Jammy/Science/ic50_workspace/NOTES.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume ic50_workspace</p></div>
</section>
<section class="project">
<h3>autolens_inference — Do the PyAutoLens inference backends agree on the HST SLaM posterior</h3>
<p class="muted">active · both · <a href="https://github.com/PyAutoLabs/autolens_inference/issues/4">autolens_inference#4</a> · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/autolens_inference.md">projects/autolens_inference.md</a> · local <span class="pathchip">/home/jammy/Code/PyAutoLabs/lens/autolens_inference</span> · RAL <span class="pathchip">/mnt/ral/jnightin/autolens_inference</span></p>
<p><b>Now</b></p>
<p>All pre-likelihood-speedup SLaM HST rows (slam_base A100 dense/sparse, the 342695 rate probe, delaunay_1250 A100 dense/sparse 343143/343145) are archived under results|output/archive/2026-09-24_pre_likelihood_speedup/ (autolens_inference#12). Running since 2026-09-24 on today's library mains: slam_base A100 dense 350674 / sparse 350675, delaunay_1250 A100 dense 350678 / sparse 350679, and the first CPU leg, slam_base numba_cpu sparse 350682 on ral; seeds 0-1 each. Next: pull the rows, commit them live, and read the new-vs-archived per-stage walls as the inference-level speedup; then the fixed-lens-light variant resumes from these output trees.</p>
<p><b>Runs</b></p>
<ul>
<li>350674_[0-1] — running — gpu — 2026-09-24 — slam_hst_base: A100 leg, dense inversion, seeds 0-1, hpc/batch_gpu/submit_slam_hst_jax_gpu_dense (config hpc_a100_jax_gpu_dense_fp64, variant slam_base) — re-r…</li>
<li>350675_[0-1] — running — gpu — 2026-09-24 — slam_hst_base: A100 leg, sparse inversion, seeds 0-1, hpc/batch_gpu/submit_slam_hst_jax_gpu_sparse (config hpc_a100_jax_gpu_sparse_fp64, variant slam_base) — r…</li>
<li>350678_[0-1] — running — gpu — 2026-09-24 — slam_hst_delaunay_1250: A100 leg, dense inversion, seeds 0-1, hpc/batch_gpu/submit_slam_delaunay1250_hst_jax_gpu_dense (config hpc_a100_jax_gpu_dense_fp64, var…</li>
<li>350679_[0-1] — running — gpu — 2026-09-24 — slam_hst_delaunay_1250: A100 leg, sparse inversion, seeds 0-1, hpc/batch_gpu/submit_slam_delaunay1250_hst_jax_gpu_sparse (config hpc_a100_jax_gpu_sparse_fp64,…</li>
<li>350682_[0-1] — running — ral — 2026-09-24 — slam_hst_base: numba_cpu leg, sparse inversion, seeds 0-1, 8 cpus, hpc/batch_cpu/submit_slam_hst_numba_cpu_sparse (config hpc_a100_numba_cpu_sparse_fp64, varia…</li>
<li>350684_[0-1] — running — ral — 2026-09-24 — slam_hst_delaunay_1250: numba_cpu leg, sparse inversion, seeds 0-1, hpc/batch_cpu/submit_slam_delaunay1250_hst_numba_cpu_sparse (config hpc_a100_numba_cpu_spar…</li>
</ul>
<p><b>Last 5</b></p>
<ul>
<li>2026-09-24 — <i>run</i> — 350684_[0-1] submitted: slam_hst_delaunay_1250: numba_cpu leg, sparse inversion, seeds 0-1, hpc/batch_cpu/submit_slam_delaunay1250_hst_numba_cpu_sparse (config hpc_a100_numba_cpu_sparse_fp64, variant delaunay_1250) on the post-speedup libr…</li>
<li>2026-09-24 — <i>run</i> — 350682_[0-1] submitted: slam_hst_base: numba_cpu leg, sparse inversion, seeds 0-1, 8 cpus, hpc/batch_cpu/submit_slam_hst_numba_cpu_sparse (config hpc_a100_numba_cpu_sparse_fp64, variant slam_base), 5-day containment — first CPU leg of the…</li>
<li>2026-09-24 — <i>run</i> — 350679_[0-1] submitted: slam_hst_delaunay_1250: A100 leg, sparse inversion, seeds 0-1, hpc/batch_gpu/submit_slam_delaunay1250_hst_jax_gpu_sparse (config hpc_a100_jax_gpu_sparse_fp64, variant delaunay_1250) — re-run on the post-speedup libr…</li>
<li>2026-09-24 — <i>run</i> — 350678_[0-1] submitted: slam_hst_delaunay_1250: A100 leg, dense inversion, seeds 0-1, hpc/batch_gpu/submit_slam_delaunay1250_hst_jax_gpu_dense (config hpc_a100_jax_gpu_dense_fp64, variant delaunay_1250) — re-run on the post-speedup library…</li>
<li>2026-09-24 — <i>run</i> — 350675_[0-1] submitted: slam_hst_base: A100 leg, sparse inversion, seeds 0-1, hpc/batch_gpu/submit_slam_hst_jax_gpu_sparse (config hpc_a100_jax_gpu_sparse_fp64, variant slam_base) — re-run on the post-speedup library mains (Array 3de624b5,…</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/autolens_inference.md">full log</a></p>
<div class="task"><button class="copy" data-cmd="Use the cortex skill. — resume autolens_inference: read PyAutoCortex projects/autolens_inference.md (Now, Runs, Log) and then /home/jammy/Code/PyAutoLabs/lens/autolens_inference/wiki/project/state.md and the assistant autolens_assistant's AGENTS.md; tell me where I left off and what I said I would do next. Submit nothing and log nothing until I say." aria-label="Copy the AI command">📋</button><p>resume autolens_inference</p></div>
</section>
<section class="project">
<h3>euclid — The original Euclid DR1 grade-AB catalogue project, superseded by euclid_dr1_prelim</h3>
<p class="muted">dormant · both · no issue yet · <a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid.md">projects/euclid.md</a> · local <span class="pathchip">/mnt/c/Users/Jammy/Science/euclid</span> · RAL <span class="pathchip">/mnt/ral/jnightin/euclid_strong_lens_modeling_pipeline</span></p>
<p><b>Now</b></p>
<p>Dormant since 2026-09-07: superseded by euclid_dr1_prelim. Three questions were planned and never run (see the archive).</p>
<p><b>Runs</b></p>
<p class="muted">nothing on the cluster</p>
<p><b>Last 5</b></p>
<ul>
<li>2026-08-28 — <i>note</i> — question: Do we recover Sersic indices or is prior pile-up artefact — planned, never run [archive/tasks/euclid/sersic_index_recovery.md]</li>
<li>2026-08-28 — <i>note</i> — question: Can a fitted Euclid lens be resimulated and recovered — planned, never run [archive/tasks/euclid/resimulate_fitted_lens_simulator.md]</li>
<li>2026-08-28 — <i>note</i> — question: How robust are magnification estimates under model match and mismatch — planned, never run [archive/tasks/euclid/magnification_robustness.md]</li>
</ul>
<p class="muted"><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid.md">full log</a></p>
</section>
<details><summary>4 retired</summary><ul>
<li><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/inference_programme.md">inference_programme</a> — The first inference programme, retired and restarted as autolens_inference — retired 2026-09-07: restarting from scratch: the project setup was unsatisfactory and it informed how the Cortex manages projects; RAL outputs stashed at /mnt/ral/jnightin/inference_programme_retired_2026-09-07</li>
<li><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid_dr1_prelim.md">euclid_dr1_prelim</a> — Refit the ten DR1-prelim tiles and rebuild the catalogue on RAL — retired 2026-09-25: retire euclid_dr1_prelim; I will move it to z_vault manually but I don't want it to eat up download time</li>
<li><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/slope_hierarchy.md">slope_hierarchy</a> — Hierarchical slope recovery at N=5, wrapped up and succeeded by slope_hierarchy_scale — retired 2026-09-08: wrapped up 2026-07-22 at N=5; succeeded by slope_hierarchy_scale; tree vaulted under z_projects_complete/</li>
<li><a href="https://github.com/PyAutoLabs/PyAutoCortex/blob/main/projects/euclid_sersics.md">euclid_sersics</a> — Why does the lens-light Sersic index pile up at the n=5 prior edge — retired 2026-09-25: retire euclid_sersics as well</li>
</ul></details>
<h4>No ledger</h4>
<table class="map">
<tr><th>Project</th><th>Status</th><th>Note</th></tr>
<tr><td>profiling</td><td>dormant</td><td>2026-05 checkpointed sweep harness, PyAutoNSS venv; name collides with autolens_profiling; ral_root planned, sync_verbs unverified</td></tr>
<tr><td>cowls_diana</td><td>dormant</td><td>local git, no remote; ral_root planned, sync_verbs unverified</td></tr>
<tr><td>subhalo_simulations</td><td>dormant</td><td>git init, zero commits, 21 GB; ral_root planned, sync_verbs unverified</td></tr>
<tr><td>pj011646</td><td>dormant</td><td>personal remote, recorded as a fact — not a PyAutoLabs repo; ral_root planned, sync_verbs unverified</td></tr>
<tr><td>concr</td><td>dormant</td><td>personal remote Jammy2211/cosmology_and_cancer, recorded as a fact; ral_root planned, sync_verbs unverified</td></tr>
<tr><td>autofit_inference</td><td>planned</td><td>born 2026-10-07 as search-extensibility B1 (PyAutoMind#492); harness B2, first runs (wave-1 pilot) B3 flip this to active via cortex.py new</td></tr>
</table>
</div></details><ul class="boards"><li class="muted" style="padding:.3rem 0">Boards:</li><li><a data-organ="brain" href="https://pyautolabs.github.io/PyAutoBrain/">Brain</a></li><li><a data-organ="mind" href="https://pyautolabs.github.io/PyAutoMind/">Mind</a></li><li><a data-organ="memory" href="https://pyautolabs.github.io/PyAutoMemory/">Memory</a></li><li><a data-organ="eyes" href="https://pyautolabs.github.io/PyAutoEyes/">Eyes</a></li><li><a data-organ="ears" href="https://pyautolabs.github.io/PyAutoEars/">Ears</a></li><li><a data-organ="heart" href="https://pyautolabs.github.io/PyAutoHeart/">Heart</a></li><li><a data-organ="hands" href="https://pyautolabs.github.io/PyAutoHands/">Hands</a></li><li><a data-organ="pulse" href="https://pyautolabs.github.io/PyAutoPulse/">Pulse</a></li><li><a data-organ="insight" href="https://pyautolabs.github.io/PyAutoInsight/">Insight</a></li><li><a data-organ="nerves" href="https://pyautolabs.github.io/PyAutoNerves/">Nerves</a></li><li><a data-organ="gut" href="https://pyautolabs.github.io/PyAutoGut/">Gut</a></li><li><a data-organ="organism" href="https://pyautolabs.github.io/PyAutoScientist/">Scientist</a></li></ul>
<script>const MAX_PROMPT_CHARS = 50000;
function promptFits(text){
let count=0;for(const character of text){if(++count>MAX_PROMPT_CHARS)return false;}
return true;
}
function guardPrompt(text, button){
const panel=button.closest('[data-orchestration-panel]');
const statusId=panel?panel.id+'-budget-status':'prompt-budget-status';
let status=document.getElementById(statusId);
if(promptFits(text)){
if(status){if(status.dataset.url)URL.revokeObjectURL(status.dataset.url);status.remove();}
return true;
}
if(!status){status=document.createElement('p');status.id=statusId;
status.setAttribute('role','status');status.setAttribute('aria-live','polite');
button.insertAdjacentElement('afterend',status);}
if(status.dataset.url)URL.revokeObjectURL(status.dataset.url);
status.textContent='Not copied: this request exceeds the 50,000-character budget. '+
'Download the complete request and attach the file to your coding chat. Nothing was cut off. ';
const link=document.createElement('a');
link.href=URL.createObjectURL(new Blob([text],{type:'text/plain;charset=utf-8'}));
status.dataset.url=link.href;link.download='dashboard-request.txt';
link.textContent='Download complete request';status.appendChild(link);
return false;
}
async function copyCmd(b){
const cmd=b.dataset.cmd;
if(!guardPrompt(cmd,b))return;
let copied=false;
try{await navigator.clipboard.writeText(cmd);copied=true;}
catch(e){const t=document.createElement("textarea");t.value=cmd;
document.body.appendChild(t);
try{t.select();copied=document.execCommand("copy")===true;}
catch(e){copied=false;}finally{t.remove();}}
const old=b.textContent;
b.textContent=copied?"\u2713":"Copy failed";
if(copied)b.classList.add("ok");
setTimeout(()=>{b.textContent=old;b.classList.remove("ok");},1200);}
document.addEventListener("click",e=>{
const b=e.target.closest("button.copy");
if(b && guardPrompt(b.dataset.cmd,b))copyCmd(b);});
function orchestrationSync(panel){
const preview=panel.querySelector('[data-orchestration-prompt]');
const direction=panel.querySelector('[data-orchestration-direction]').value.trim();
preview.value=preview.defaultValue+(direction?'\n\nOptional direction (user context):\n'+direction:'');
panel.querySelector('.orchestration-status').textContent='';
return preview.value;
}
document.addEventListener('input',event=>{
if(event.target.matches('[data-orchestration-direction]')){
orchestrationSync(event.target.closest('[data-orchestration-panel]'));
}
});
document.addEventListener('click',async event=>{
const button=event.target.closest('[data-orchestration-copy]');
if(!button)return;
const panel=button.closest('[data-orchestration-panel]');
const text=orchestrationSync(panel);
const status=panel.querySelector('.orchestration-status');
if(!guardPrompt(text,button))return;
let copied=false;
try{await navigator.clipboard.writeText(text);copied=true;}
catch(error){
const preview=panel.querySelector('[data-orchestration-prompt]');
panel.querySelector('[data-orchestration-preview]').open=true;
preview.focus();preview.select();
try{copied=document.execCommand('copy')===true;}catch(error){copied=false;}
}
// A slow permission response must not claim a subsequently edited prompt was copied.
if(panel.querySelector('[data-orchestration-prompt]').value!==text){
status.textContent=copied?'The previous prompt was copied. Copy again to include your latest direction.':
'Copy unavailable. Open the preview and select the current prompt to copy manually.';
}else{
status.textContent=copied?'Prompt copied. Paste it into your coding chat.':
'Copy unavailable. The full prompt is selected below; copy it manually.';
}
});
function updateDashboardFreshness(now=Date.now()){
document.querySelectorAll('.orchestration-freshness').forEach(footer=>{
const stamp=footer.querySelector('[data-refreshed-at]');
if(!stamp)return;
const age=now-Date.parse(stamp.dataset.refreshedAt);
const label=stamp.querySelector('[data-freshness-label]');
if(!Number.isFinite(age)||age<0){
footer.dataset.freshness='grey';
label.textContent='Last updated unavailable';
return;
}
const minutes=Math.floor(age/60000),hours=Math.floor(age/3600000),days=Math.floor(age/86400000);
const amount=days||hours||minutes;
const unit=days?'day':hours?'hour':'minute';
label.textContent='Last updated '+(minutes===0?'just now':amount+' '+unit+(amount===1?'':'s')+' ago');
footer.dataset.freshness=age<3600000?'green':age<86400000?'yellow':'red';
});
}
function startDashboardFreshness(){
updateDashboardFreshness();
if(document.querySelector('[data-refreshed-at]'))setInterval(updateDashboardFreshness,30000);
}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',startDashboardFreshness,{once:true});
else startDashboardFreshness();
document.addEventListener('visibilitychange',()=>{if(!document.hidden)updateDashboardFreshness();});
(function(){
if(typeof window==='undefined') return;
function reveal(){
var id;
try { id=decodeURIComponent(location.hash.slice(1)); } catch(e) { return; }
var target=id && document.getElementById(id);
if(!target) return;
for(var p=target;p;p=p.parentElement) if(p.tagName==='DETAILS') p.open=true;
requestAnimationFrame(function(){target.scrollIntoView({block:'start'});});
}
window.addEventListener('hashchange',reveal);
document.addEventListener('click',function(event){
var link=event.target.closest('a[href]');
if(link && link.hash && link.origin===location.origin && link.pathname===location.pathname)
setTimeout(reveal,0);
});
if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',reveal);
else reveal();
var printed=[];
window.addEventListener('beforeprint',function(){
printed=Array.from(document.querySelectorAll('details:not([open])'));
printed.forEach(function(node){node.open=true;});
});
window.addEventListener('afterprint',function(){
printed.forEach(function(node){node.open=false;}); printed=[];
});
})();
</script>
<script>(function(){var e=document.getElementById('checkin'),b=document.getElementById('checkin-box'),m=document.getElementById('checkin-mark'),n=document.getElementById('checkin-note');if(!e||!b)return;var t=e.getAttribute('datetime'),d=t?new Date(t):null;if(!d||isNaN(d.getTime())||(Date.now()-d.getTime())/60000>180){b.classList.add('fresh-bad');e.classList.add('stale');if(m)m.textContent='✗';if(n)n.textContent=t?'stale, paste the check-in':'never checked in';}else{b.classList.add('fresh-ok');if(m)m.textContent='✓';var a=Math.round((Date.now()-d.getTime())/60000);if(n)n.textContent='fresh · '+(a<60?a+' min':Math.round(a/60)+' h')+' ago';}})();</script>
</body>
</html>