From c6e3b3cd3f8208ee850a0c3d9a69fc5ad3b8624d Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Mon, 31 Aug 2026 12:08:09 -0400 Subject: [PATCH 1/4] =?UTF-8?q?batches:=20packets/=20and=20reviews/=20?= =?UTF-8?q?=E2=80=94=20the=20archived=20review=20surface=20and=20the=20hum?= =?UTF-8?q?an's=20verdicts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit packet: and review: join the batch-record schema. batches/packets/ holds one self-contained HTML review page per slot (written at dispatch with PENDING members, refreshed at collect, never rewritten after submission); commits of actual pages are held pending the human's public-vs-private ruling — this repo is public. batches/reviews/ holds the human's submitted review markdown, the file the orchestrator parses at close-out; follow-ups it names are queued for the NEXT batch, never executed in-review. Both dirs are already ledger-side (the batches/ prefix in scripts/ledger_merge.py), so they auto-merge. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01DxyfT7AWrBrmKQZiRE2HAN --- batches/AGENTS.md | 14 ++++++++++++++ batches/packets/AGENTS.md | 34 ++++++++++++++++++++++++++++++++++ batches/reviews/AGENTS.md | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 batches/packets/AGENTS.md create mode 100644 batches/reviews/AGENTS.md diff --git a/batches/AGENTS.md b/batches/AGENTS.md index 477e61ee8..4197bb573 100644 --- a/batches/AGENTS.md +++ b/batches/AGENTS.md @@ -27,6 +27,8 @@ record it. - reviewed-at: 2026-09-04T08:30Z # when they actually sat down - usage-window-at-collect: <5h %, weekly %, opus %> - delivered: / +- packet: batches/packets/-.html +- review: batches/reviews/-.md - review-minutes-actual: - notes: | What actually happened. Anything that stalled, and why. @@ -49,6 +51,18 @@ standing one, which doctrine voids. is a seed from the sizing faculty; this is what the slot really cost. Without it the estimate never improves, and the whole batch size rests on it. +**`packet:` is the page the human actually reviewed, archived.** One +self-contained HTML file per slot under `batches/packets/` (see that folder's +`AGENTS.md`), written at dispatch with PENDING members and refreshed at +collect. It is the historical record of what the human was shown; a batch +whose packet was never archived cannot be audited against what they ruled on. + +**`review:` is what the human said, verbatim.** The markdown their packet-page +submission produced (or the orchestrator transcribed), one file per slot under +`batches/reviews/`. The orchestrator parses it at close-out — merges, rulings, +queued follow-ups all trace back to a line in this file, not to a memory of a +conversation. + **`review-at:` is the shift, and it is the human's to declare.** There is no schedule: a slot is whenever they come in, so at dispatch they state when they expect to be back and **the shift is dispatch → `review-at:`**. The batch's diff --git a/batches/packets/AGENTS.md b/batches/packets/AGENTS.md new file mode 100644 index 000000000..d59d7d3d6 --- /dev/null +++ b/batches/packets/AGENTS.md @@ -0,0 +1,34 @@ +# Batch packets — the review pages, archived + +One **self-contained** HTML page per slot: `-.html`. This is +the page the human actually opens to review a batch — every member with its +question, witness, health evidence, readout, ruling block, follow-ups, local +"where to look" pointers and figures — and, once the slot is over, the +permanent record of what they were shown. The batch record's `packet:` field +points here. + +Rules (2026-08-31): + +- **Self-contained means self-contained.** Figures are embedded as data URIs, + styles and script are inline; the archive must render identically in ten + years with no external fetch. Keep a page under ~5 MB; downsize figures. +- **Written at dispatch, refreshed at collect.** The page opens with every + member present — overnight runs as PENDING entries — and carries + `generated:` / `refreshed:` stamps. The morning collect fills the PENDING + members in, normally while the human is already reading the finished ones. +- **Never rewritten after the review is submitted.** The archived page plus + the `batches/reviews/` file together are the audit pair: what was shown, + what was ruled. A correction gets a new dated page, not an edit. +- **Pointers are local paths** (the laptop mirror each project's + `hpc/sync pull` fills, e.g. `/mnt/c/.../Science//`), because the + review happens at the laptop. A pointer may stay remote only when the pull + cannot fetch it by design, and must say so. + +**Visibility — decision pending.** This repository is public. Until the human +rules on public-vs-private for packets (they carry science readouts, run +paths and figures), pages are NOT committed here; the working copies live in +the local Science mirror (e.g. `Science/inference_programme/packets/`). If the +ruling is public, packets land here and the Pages build can serve them; if +private, this folder holds only this doc and the archive stays in a private +home (a private repo, or the Science mirror) with the batch record's `packet:` +field pointing at it. diff --git a/batches/reviews/AGENTS.md b/batches/reviews/AGENTS.md new file mode 100644 index 000000000..d4950b33e --- /dev/null +++ b/batches/reviews/AGENTS.md @@ -0,0 +1,33 @@ +# Batch reviews — what the human ruled, verbatim + +One markdown file per slot: `-.md` — the review the human +submitted from the packet page (its "submit" step produces exactly this file, +committed via the page's GitHub button or pasted to the orchestrator), or the +same content dictated in-chat and transcribed. The batch record's `review:` +field points here. + +The orchestrator parses this file at close-out (2026-08-31): every merge +(`/prm`), every science ruling written into a project ledger, and every +follow-up queued at the top of `queue.md` traces back to a line here — not to +a memory of a conversation. Follow-ups are enacted in the **next** batch; a +review never executes its own follow-ups. + +## Schema + +```markdown +# Review 2026-09-04 am +- packet: batches/packets/2026-09-04-am.html +- reviewed-at: 2026-09-04T08:30Z +- review-minutes-actual: 55 + +## +- decision: merge | tweak | reject | defer # science members: accept | rerun | drop +- note: | + The human's words, verbatim. For tweak/rerun this line becomes the + follow-up prompt's seed. +``` + +Members the human left untouched are listed with `decision: defer` by the +orchestrator, never silently dropped. Like every file in `batches/`, this is +ledger-side: it auto-merges, because a review that cannot land unattended +cannot close a batch unattended. From 92e60daf6775855e7255d6795bf55a346092afdb Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Mon, 31 Aug 2026 12:39:04 -0400 Subject: [PATCH 2/4] batches: archive the first packet and serve packets/ on Pages (ruled public 2026-08-31) The human ruled packets and reviews public in this repo, served on Pages, aware the science numbers and run paths go on the open internet. The 2026-08-31 am packet and the packet template land in batches/packets/; the page's Permanent-home line links its Pages URL; pages_dashboard.yml stages batches/packets/*.html under _site/packets/ and triggers on that path. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01DxyfT7AWrBrmKQZiRE2HAN --- .github/workflows/pages_dashboard.yml | 4 + batches/packets/2026-08-31-am.html | 2070 +++++++++++++++++++++++++ batches/packets/AGENTS.md | 13 +- batches/packets/TEMPLATE.md | 93 ++ 4 files changed, 2172 insertions(+), 8 deletions(-) create mode 100644 batches/packets/2026-08-31-am.html create mode 100644 batches/packets/TEMPLATE.md diff --git a/.github/workflows/pages_dashboard.yml b/.github/workflows/pages_dashboard.yml index 49efd5edf..3c332d622 100644 --- a/.github/workflows/pages_dashboard.yml +++ b/.github/workflows/pages_dashboard.yml @@ -20,6 +20,7 @@ on: branches: [main] paths: - "dashboard.html" + - "batches/packets/**" workflow_dispatch: permissions: @@ -48,6 +49,9 @@ jobs: run: | mkdir -p _site cp dashboard.html _site/index.html + # Batch review packets (ruled public 2026-08-31) — served under /packets/ + mkdir -p _site/packets + find batches/packets -maxdepth 1 -name "*.html" -exec cp {} _site/packets/ \; - uses: actions/upload-pages-artifact@v3 with: path: _site diff --git a/batches/packets/2026-08-31-am.html b/batches/packets/2026-08-31-am.html new file mode 100644 index 000000000..8337d8f6a --- /dev/null +++ b/batches/packets/2026-08-31-am.html @@ -0,0 +1,2070 @@ +Slot Review 31 Aug 2026 + + + +
+ +
+

31 Aug 2026 · local-dev lane · RAL harvest + one retrospective

+

Slot Review

+

This is the review packet for the runs that came back — eight members, each with the question it was submitted to answer, its pre-registered witness, the health evidence, the numbers, and the one decision waiting on you; nothing was edited, committed, submitted or cancelled in building it. Choose a decision and leave a note on each member, then Submit review at the bottom — the review lands in PyAutoMind/batches/reviews/ for the orchestrator chat to enact.

+

Run outputs and logs are mirrored at /mnt/c/Users/Jammy/Science/inference_programme/ (pulled 2026-08-31 11:42 EDT via the autolens_profiling repo’s hpc/sync pull).

+

Generated 2026-08-31 10:46 · refreshed 2026-08-31 11:42

+

Permanent home: pyautolabs.github.io/PyAutoMind/packets/2026-08-31-am.html

+
+ +
+
8Members
+
2Failed
+
1Suspect
+
3Healthy
+
1Running
+
1Merged
+
+ 121 + Est. review-minutes + 1 + 25 + 15 + 15 + 12 + 10 + 8 + 35 + against a 45-minute slot +
+
+ + +
+
+ + +
+
+ + +
+

The minutes figure is the only calibration the review-cost estimate ever gets.

+
+ +
+

Most important finding

+

The Phase 7 SMC probe (342018) did not fail loudly — all three arms report converged: true and valid: true while sitting 106,000–163,600 nats from the Nautilus bar on the same cell; the pre-registered validity rule (λ→1.0 + final ESS ≥ 10% of particles) passes a frozen particle cloud, and the warm arms have regressed from the parked prototype's ±0.8-nat bridge (job 331058) to −74k/−76k.

+
+ +
+

Rulings needed

+
    +
  1. SMC probe — record Phase 7 as a failed probe and rewrite the validity rule, or re-run first?
  2. +
  3. refs 5 & 6 — certify against provenance despite Δmax logL of −773 / −116 nats vs a 2-nat registry tolerance?
  4. +
  5. knn task 7 — the 480-nat deficit did not close; withdraw permanently, re-run the Phase 8B Prodigy arm on the corrected target, or accept?
  6. +
  7. slogdet A/B — call the DECISIONS verdict “no difference” (Δlog Z 0.50 nats) given the arms ran on two different PyAutoFit trees?
  8. +
  9. subhalo_validation — accept pl_sersic_0's witness (−0.30, PASS) and rule on the 2×2 subhalo grid.
  10. +
  11. euclid-dr1-prep phase 2 — structure sound → phase 3 dispatchable as-is; bundle the three tidy-ups into phase 3's PR or file them separately; make euclid CI release-blocking before phase 4?
  12. +
+
+ +
+ + + +
+ +
+
+
+

autolens_profiling · inference programme

+

342008 / 342009 / 342010 — the 1-second FAILED submissions

+

342008 · 342009 · 342010

+
+
+ Failed + +
+
+
+ +
+

Question this run was submitted to answer

+

The same three questions as 342016/17/18: they are the identical submissions (sacct SubmitLine: sbatch --array=5,6,7 --requeue hpc/batch_gpu/submit_search_nautilus_inference_refs_v1_array.sh, then the slogdet A/B submit, then the SMC probe), resubmitted 78 s later as 342016/17/18.

+
+ +
+

Witness

+

n/a — submission-time failure, no science content.

+
+ +
+

Health evidence

+

sacct FAILED at 00:00:01, batch step CANCELLED, ExitCode 0:53, Reason: None. There is no .err to read: that is the failure. WorkDir=/mnt/ral/jnightin/autolens_profiling for 342008-10 vs .../hpc/batch_gpu for 342016-18, and /mnt/ral/jnightin/autolens_profiling/error does not exist — the #SBATCH -e error/error.%A_%a.err path is relative to the submit CWD, so SLURM could not open the error file and killed the batch step before Python ever started. Resubmitting from hpc/batch_gpu/ (where output/ and error/ both exist) fixed it.

+
+ +
+

Readout

+

No numbers; nothing ran. This is the known sbatch-CWD trap, third occurrence.

+
+ +
+

Ruling

+

Nothing scientific to rule on; optionally, make the submit scripts self-locating — #SBATCH -o/-e cannot be computed, so a cd $(dirname $0) guard or an absolute path is the only fix.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [autolens_profiling]Convert every hpc/batch_gpu/submit_* -o/-e to an absolute /mnt/ral/jnightin/autolens_profiling/hpc/batch_gpu/{output,error}/… path so submit CWD stops mattering.
  • +
  • [autolens_profiling]Add a one-line “submit from hpc/batch_gpu/” banner to hpc/README / the WALL-BASIS header block.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/home/jammy/Code/PyAutoLabs/autolens_profiling
+
Submit scripts (the -o/-e lines)
+
/home/jammy/Code/PyAutoLabs/autolens_profiling/hpc/batch_gpu/submit_search_nautilus_inference_refs_v1_array.sh
+
The missing directory
+
RAL only/mnt/ral/jnightin/autolens_profiling/error (absent) vs /mnt/ral/jnightin/autolens_profiling/hpc/batch_gpu/error (present)
+
Open in order
+
  1. The #SBATCH -o/-e block of the submit script.
  2. ssh euclid_jump 'ls -d /mnt/ral/jnightin/autolens_profiling/error' to see it is not there.
+
+
+ + Est. review-minutes 1 +
+
+ +
+
+
+

autolens_profiling · Phase 7

+

Phase 7 SMC probe — mala_warm / hmc_warm / mala_cold

+

342018_[0,1,2]

+
+
+ Failed + +
+
+
+ +
+

Question this run was submitted to answer

+

“FIRST PROBE of af.SMC in this framework… it measures a rate, an acceptance/ESS schedule and — from the cold arm — the evidence bridge against Nautilus's 31690.42 nats on imaging/mge/hst, which is the first independent (gradient-side) check this programme has ever had on a log_evidence” (PROGRAMME.md §“Phase 7 — SMC and other high-dimensional candidates”, STATUS 2026-08-29).

+
+ +
+

Witness

+

Pre-registered in PROGRAMME.md's risk table: “SMC particle impoverishment / silent λ=1 garbage — judge by acceptance traces + ESS schedule, never 'Converged: yes'; independent-run logZ variance.” The submit script's own coded rule: valid: false on a partial tempering path or a final ESS below 10 % of the particle count. Bar to beat: Nautilus imaging/mge/hst logZ 31,690.42, maxL 31,786.80 (targets/REFS_V1_HARVEST.md); truth logL 31,521.74.

+
+ +
+

Health evidence

+

sacct COMPLETED for all three; walls 10:34 / 12:19 / 31:23 against a 2 h budget (9–26 %); .err files contain only the benign mask-padding UserWarning; 0 tracebacks in all three .out; 0 resume markers; version stamp 2026.8.17.1 in all three JSONs. Finite-log_l scan: no sample above 1e10 — but the log-likelihoods are catastrophically low, not high. No checkpoint.hdf5 (SMC does not write one; the tempering schedule in the JSON is the equivalent). PyAutoFit version stamp MISMATCH — see the cross-cutting note.

+
+ +
+

Readout

+
+ + + + + + + + + + + +
Three SMC arms against the Nautilus bar
armtasklogZmaxLn_smc_stepsλ path (last two)acceptance finalESS finalwallderived evalsms/evalconvergedvalid
mala_warm342018_0−74,306.46−74,278.1394.6e-4 → 1.03.3e-35212/256623.5 s11,77652.9truetrue
hmc_warm342018_1−75,721.88−75,695.2483.9e-4 → 1.06.1e-29210/256727.3 s82,1768.85truetrue
mala_cold342018_2−131,885.99−131,858.45164.6e-3 → 1.01.7e-179225/2561,867.3 s20,73690.1truetrue
Nautilus bar341879-era ref+31,690.42+31,786.80————1,015 s————
+
+

Three independent readings all say the same thing:

+
    +
  1. Acceptance collapses to exactly 0.0 by step 5–6 (MALA warm), step 6 (HMC warm) and step 12 (cold), and stays there. The cloud stops moving. max_log_likelihood_list is frozen from step 2 onward in the HMC arm (−75,695.24 repeated six times).
  2. +
  3. The whole evidence is one temperature jump. log_likelihood_increment_list is ≈ −3 nats per step until the last, which is −74,215 / −75,639 / −131,249. λ goes 4.6e-4 → 1.0 in a single step. That is the “silent λ=1 garbage” the PROGRAMME names.
  4. +
  5. The recorded ESS is meaningless here — 210–225 of 256 is high because a frozen, resampled cloud has near-uniform weights. The coded valid rule tests exactly this quantity and therefore passes all three.
  6. +
+
    +
  • The warm start did not land on the MAP. Both warm arms were to be centred on the completed Prodigy MGE MAP fit, yet max_log_likelihood_list[0] is −92,559 (mala_warm) / −89,777 (hmc_warm) — ~124,000 nats below that MAP. The submit header calls a warm arm that was actually cold “the one failure this must not permit”.
  • +
  • Label mismatch: the submit exports SEARCHES_SMC_MASS=prior_scaled and its header promises the artifact will record that so the row “cannot be mistaken for a covariance-informed one”; the JSON records whitening_kind: "diagonal covariance", inverse_mass_matrix_kind: "array", warm_start_source: InitializerParamStartPoints.
  • +
  • Regression vs the parked prototype: PROGRAMME.md line 29 records job 331058 — “bridge validated: warm logZ within ±0.8 nats of the Nautilus bar; cold arm −179k with 'Converged: yes'”. The cold arm here reproduces the known cold pathology (−131.9k); the warm arms have gone from ±0.8 nats to ≈ −106,000 nats.
  • +
  • Do not put these in rates.py. The derived eval counts are kernel-inconsistent (HMC 82,176 evals in 727 s = 8.85 ms/eval; MALA warm 11,776 in 623 s = 52.9 ms/eval — a 6× spread on the same likelihood), and a frozen cloud's cost is not a working run's cost.
  • +
  • Raw result JSONs, local after the pull: packet/smc_probe/hpc_hpc_a100_fp64_n256_{mala_warm,hmc_warm,mala_cold}.json. They are not in the local repo — the local autolens_profiling/results/searches/smc/ tree does not exist yet.
  • +
+
+
+ Bar chart, truth vs best-fit, MALA warm arm +
smc_probe/hpc_hpc_a100_fp64_n256_mala_warm.png — truth vs best-fit
+
+
+ Bar chart, truth vs best-fit, HMC warm arm +
smc_probe/hpc_hpc_a100_fp64_n256_hmc_warm.png — truth vs best-fit
+
+
+ Bar chart, truth vs best-fit, MALA cold arm +
smc_probe/hpc_hpc_a100_fp64_n256_mala_cold.png — truth vs best-fit
+
+
+
+ +
+

Ruling

+

Record Phase 7 as a failed probe (Gate D not callable, no rate ingested) and fix the validity rule + warm-start path before any re-run — or treat this as a run-configuration miss and re-run once first.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [autolens_profiling]Add an acceptance floor and a final-λ-jump ceiling to the SMC valid rule — a row whose last temperature carries >90 % of the log-evidence, or whose acceptance is 0.0 for ≥2 consecutive steps, is valid: false.
  • +
  • [PyAutoFit]Investigate why an SMC warm start from a completed MAP fit begins 124,000 nats below that MAP (InitializerParamStartPoints + prior_scaled mass path).
  • +
  • [autolens_profiling]Reconcile whitening_kind with SEARCHES_SMC_MASS — the artifact must say prior_scaled when that is what was asked for.
  • +
  • [autolens_profiling]Do not add an SMC row to scripts/misc/wall/rates.py; keep the cell at source: unmeasured probe-first: yes.
  • +
  • [autolens_profiling]Re-derive likelihood_evals_derived per kernel so MALA and HMC rates are comparable.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/home/jammy/Code/PyAutoLabs/autolens_profiling
+
Pulled artefacts (local)
+
…/scratchpad/packet/smc_probe/ (3 JSONs + 3 PNGs)
+
Output folders
+
/mnt/c/Users/Jammy/Science/inference_programme/output/searches/smc/imaging/mge/hst/n256_mala_m5_seed0_warmebe2e28d_massprior_scaled/hpc_a100_fp64_n256_mala_warm/
+
…/n256_hmc_m5_i8_seed0_warmebe2e28d_massprior_scaled/hpc_a100_fp64_n256_hmc_warm/
+
…/n256_mala_m5_seed0_cold/hpc_a100_fp64_n256_mala_cold/ — each holds model.results, image/, files/
+
Batch logs
+
/mnt/c/Users/Jammy/Science/inference_programme/logs/output/output.342018_{0,1,2}.out
+
Scripts
+
submit /home/jammy/Code/PyAutoLabs/autolens_profiling/hpc/batch_gpu/submit_search_smc_imaging_mge_a100_hst_fp64_probe
+
entry point /home/jammy/Code/PyAutoLabs/autolens_profiling/scripts/imaging/searches/smc/mge.py
+
Ruling lands in
+
/home/jammy/Code/PyAutoLabs/autolens_profiling/results/notes/inference/DECISIONS.md (Phase 7 / Gate D)
+
the Phase 7 row of /home/jammy/Code/PyAutoLabs/autolens_profiling/results/notes/inference/PROGRAMME.md
+
Open in order
+
    +
  1. packet/smc_probe/hpc_hpc_a100_fp64_n256_mala_cold.json → the diagnostics.acceptance_rate_list / lambda_list / log_likelihood_increment_list triple.
  2. +
  3. PROGRAMME.md line 928 (the pre-registered “never 'Converged: yes'” rule) and line 29 (job 331058's ±0.8-nat warm bridge).
  4. +
  5. Compare its log_evidence against the imaging/mge/hst row in results/notes/inference/targets/REFS_V1_HARVEST.md.
  6. +
  7. The submit script's “READ THE SCHEDULE, NOT THE FLAG” header block.
  8. +
+
+
+ + Est. review-minutes 25 +
+
+ +
+
+
+

autolens_profiling · InferenceRefs_v1

+

Task 7 — knn re-run on the corrected target

+

342016_7

+
+
+ Suspect + +
+
+
+ +
+

Question this run was submitted to answer

+

“task 7 knn, positions off — 341879_7 LANDED and is CERTIFIED, but its maxL (30,077.028) sits 480 nats below a same-target_id Phase 8B Prodigy arm (30,557.03). That is the same overflow signature at lower amplitude” — re-run on the corrected AdaptSplitPower / capped-LogUniform(1e-6,1e4) target to replace the withdrawn row (submit-script header, RESUBMIT 2026-08-29; REFS_V1_HARVEST.md “FLAG — do not score against the knn reference”).

+
+ +
+

Witness

+

Certification is the three human provenance checks in REFS_V1_HARVEST.md (“Rows certified”): version stamp 2026.8.17.1, wall consistent with the cell's recorded cost, no resume marker. The registry tolerance (targets/TOLERANCES.md, knn_fp64) is Δmax logL ≤ 2 nats vs the truth bar, mean shift ≤ 0.2σ, σ-ratio in [0.8, 1.25]. The scientific witness is the 480-nat deficit: does the corrected target close it?

+
+ +
+

Health evidence

+

sacct COMPLETED, wall 58:37 of a 6 h budget; .err is one benign mask-padding UserWarning; 0 tracebacks; 0 resume markers; version stamp 2026.8.17.1 ✓; ran cold in a new identifier dir 39b5ccc228ad4b4389b1129a7e5cf605 (the predicted new hash — the old 36d5967e91391122bff82e879c619548 sits beside it untouched), so the resume-collision check in the submit header held. No checkpoint.hdf5 (search_internal removed on completion). Finite-log_l scan over samples.csv: n=34,544, max 30,062.67, min 30,021.18, 0 samples > 1e10.

+
+ +
+

Readout

+
+ + + + + + + + + + + + + + +
Withdrawn row vs the new row
withdrawn row (341879_7, legacy target)new row (342016_7, corrected target)Δ
target_idsha256:84c0d88d3032sha256:ccafb8b191bcnew target class
logZ30,010.17029,995.887−14.28
maxL30,077.02830,062.672−14.36
Δmax logL vs truth (31,521.74)−1,444.7−1,459.07−14.4 (tolerance is 2)
total wall3,343.6 s3,507.2 s+163.6
Kish ESS4,848.85,334.7+485.9
evals / ms-per-eval—66,600 / 51.80—
+
+

The corrected target did not close the 480-nat deficit — the new row is 14.4 nats lower still, putting it ~494 nats below the Phase 8B Prodigy log_reg arm's 30,557.03. Caveat that matters: the Prodigy arm was measured on the legacy sha256:84c0d88d3032 target, so it is no longer a same-target_id comparison — the deficit is now unscorable rather than confirmed. The run replaces one broken comparison with another.

+

Watch out: /home/jammy/Code/PyAutoLabs/autolens_profiling/results/searches/nautilus/imaging/knn/hst/hpc_hpc_a100_fp64_ref.json is still the old withdrawn row (30,010.17); the new one is uncommitted on RAL (git status shows it as M). Raw JSON local: packet/refs_v1/knn_hpc_a100_fp64_ref.json.

+
+
+ Bar chart, truth vs best-fit, knn reference re-run +
refs_v1/knn_hpc_a100_fp64_ref.png — truth vs best-fit, 342016_7
+
+
+
+ +
+

Ruling

+

Certify the new knn row as the replacement bar / keep it withdrawn pending a Prodigy re-run on the corrected target / drop the knn cell from InferenceRefs_v1.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [autolens_profiling]Re-run the Phase 8B Prodigy knn · log_reg arm on target sha256:ccafb8b191bc so the 494-nat deficit becomes scorable again.
  • +
  • [autolens_profiling]Decide whether a 1,459-nat Δmax-logL row can sit in a registry whose tolerance is 2 nats, or whether the truth bar for pixelized cells needs its own tolerance.
  • +
  • [autolens_profiling]Sync results/searches/…/knn/hst/hpc_hpc_a100_fp64_ref.json from RAL and update REFS_V1_HARVEST.md + results/baselines/InferenceRefs_v1/INDEX.json (which still lists only 2 of the 9 rows).
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/home/jammy/Code/PyAutoLabs/autolens_profiling
+
Pulled artefacts (local)
+
…/scratchpad/packet/refs_v1/knn_hpc_a100_fp64_ref.{json,png}
+
Output folder
+
/mnt/c/Users/Jammy/Science/inference_programme/output/searches/nautilus/imaging/knn/hst/hpc_a100_fp64_ref/39b5ccc228ad4b4389b1129a7e5cf605/ (+ its .zip; the legacy 36d5967e… dir beside it is the withdrawn row)
+
Batch log
+
/mnt/c/Users/Jammy/Science/inference_programme/logs/output/output.342016_7.out
+
Scripts
+
submit …/hpc/batch_gpu/submit_search_nautilus_inference_refs_v1_array.sh (task 7)
+
entry point …/scripts/imaging/searches/nautilus/knn.py
+
target definition …/scripts/misc/searches/_setup.py
+
Ruling lands in
+
…/results/notes/inference/targets/REFS_V1_HARVEST.md (the “Rows certified” table + the FLAG section)
+
…/results/baselines/InferenceRefs_v1/INDEX.json
+
Open in order
+
    +
  1. The FLAG paragraph in REFS_V1_HARVEST.md.
  2. +
  3. packet/refs_v1/knn_hpc_a100_fp64_ref.json (results.max_log_likelihood = 30,062.67).
  4. +
  5. Compare against …/results/notes/inference/phase_08_regularization/RESULTS.md “8B — run history and harvest” (Prodigy 30,557.03) and note the target_id differs.
  6. +
  7. targets/TOLERANCES.md row knn_fp64.
  8. +
+
+
+ + Est. review-minutes 15 +
+
+ +
+
+
+

autolens_profiling · InferenceRefs_v1

+

Tasks 5 & 6 — slam_source_pix_nn pos-off / pos-on

+

342016_[5,6]

+
+
+ Healthy + +
+
+
+ +
+

Question this run was submitted to answer

+

Produce the two missing imaging/slam_source_pix_nn/hst reference rows on the corrected target. Task 5 replaces RAL 341908_5, which was ledgered as “0 Nautilus calls in 6 h” but had actually made 90,000 calls and died in a likelihood-overflow flood (finite log_l to 3e+303); task 6 was never submitted because task 5 was misread as “this cell is unaffordable” (submit-script header, RESUBMIT 2026-08-29; DECISIONS.md 2026-08-29).

+
+ +
+

Witness

+

The three provenance checks in REFS_V1_HARVEST.md; registry tolerance slam_source_pix_nn_fp64 / _pos_fp64 = Δmax logL ≤ 2 nats, mean shift ≤ 0.2σ, σ-ratio [0.8, 1.25] (targets/TOLERANCES.md). And the implicit witness of the whole overflow-flood wave: does the capped AdaptSplitPower target now terminate, with no finite garbage?

+
+ +
+

Health evidence

+

sacct COMPLETED both; walls 1:21:57 and 1:14:55 of a 6 h budget (23 % / 21 %) against a cell whose only prior run never terminated in 6 h; .err = one benign mask-padding warning (task 5 also two blurring_image warnings); 0 tracebacks, 0 resume markers in both .out; version stamp 2026.8.17.1 ✓; task 5 ran cold in the predicted-new identifier 7ced3989425354c2a53d4a79d7da2b11. checkpoint.hdf5 is not available — the run removes search_internal on completion and zips the rest, so n_like/explored cannot be read post-hoc; samples_info.json stands in (73,500–73,700 samples, acceptance ratio 1.0, no truncation). Finite-log_l scan over samples.csv: task 5 n=35,948, max 30,748.58, min 30,710.09; task 6 n=20,775, max 31,406.12, min 31,369.29 — 0 samples > 1e10 in either. The 3e+303 flood is gone. PyAutoFit version stamp MISMATCH — see the cross-cutting note.

+
+ +
+

Readout

+
+ + + + + + + + + +
Both reference rows
rowtaskconfigtarget_idwallsampler walllogZmaxLΔmax logL vs truthevalsms/evalKish ESSfree params
ref (positions off)342016_5hpc_a100_fp64_refsha256:ad291b57fc624,891.4 s4,833.3 s30,684.61530,748.575−773.1773,70065.587,215.114
ref_pos_tauto0.2_f1e8 (positions on, auto)342016_6hpc_a100_fp64_ref_pos_tauto0.2_f1e8sha256:8021b4b697ff4,483.2 s4,426.8 s31,324.89731,406.116−115.6373,50060.234,606.114
+
+

Context from the certified table: the sibling imaging/slam_source_pix/hst rows are logZ 30,718.02 / maxL 30,809.46 (pos off) and 31,305.06 / 31,411.38 (pos on). So slam_source_pix_nn sits 33 nats below its Rectangular sibling with positions off and 20 nats above it with positions on — comfortably inside the family, and both rows land in ~80 min on a cell that previously could not terminate at all. Both Δmax-logL values are far outside the 2-nat registry tolerance, as is the already-certified mge row (+265 nats).

+

Raw JSONs local: packet/refs_v1/hpc_hpc_a100_fp64_ref.json, packet/refs_v1/hpc_hpc_a100_fp64_ref_pos_tauto0.2_f1e8.json. Neither exists in the local repo (autolens_profiling/results/searches/nautilus/imaging/slam_source_pix_nn/ is absent locally); they are on RAL, uncommitted.

+
+
+ Bar chart, truth vs best-fit, task 5 positions off +
refs_v1/hpc_hpc_a100_fp64_ref.png — task 5, positions off
+
+
+ Bar chart, truth vs best-fit, task 6 positions on +
refs_v1/hpc_hpc_a100_fp64_ref_pos_tauto0.2_f1e8.png — task 6, positions on
+
+
+
+ +
+

Ruling

+

Certify rows 5 and 6 into REFS_V1_HARVEST.md + INDEX.json as-is / certify with a recorded Δmax-logL blemish like the mge row / re-run before certifying.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [autolens_profiling]Sync both JSONs+PNGs from RAL into results/searches/nautilus/imaging/slam_source_pix_nn/hst/ and add the two rows to REFS_V1_HARVEST.md.
  • +
  • [autolens_profiling]Bring results/baselines/InferenceRefs_v1/INDEX.json up to the registry's real state (it still lists only the 2 retro-certified rows against 9–11 actual).
  • +
  • [autolens_profiling]Decide the registry-wide question the mge row already raised: a 2-nat Δmax-logL tolerance is violated by every pixelized reference row — retune it per cell family or drop it from the certification story.
  • +
  • [autolens_profiling]Stop deleting search_internal on reference rows, or archive checkpoint.hdf5 into the zip — n_like / explored are named provenance checks and are currently unrecoverable after the fact.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/home/jammy/Code/PyAutoLabs/autolens_profiling
+
Pulled artefacts (local)
+
…/scratchpad/packet/refs_v1/hpc_hpc_a100_fp64_ref.{json,png} and …_ref_pos_tauto0.2_f1e8.{json,png}
+
Output folders
+
/mnt/c/Users/Jammy/Science/inference_programme/output/searches/nautilus/imaging/slam_source_pix_nn/hst/hpc_a100_fp64_ref/7ced3989425354c2a53d4a79d7da2b11/
+
…/hst/pos_tauto0.2_f1e8/hpc_a100_fp64_ref_pos_tauto0.2_f1e8/35b83ae5f6eab98575809e7c5dc5f3af/ — both hold model.results, search.summary, image/, latent.results; search_internal already deleted
+
Batch logs
+
/mnt/c/Users/Jammy/Science/inference_programme/logs/output/output.342016_{5,6}.out
+
Scripts
+
submit …/hpc/batch_gpu/submit_search_nautilus_inference_refs_v1_array.sh (tasks 5, 6)
+
entry point …/scripts/imaging/searches/nautilus/slam_source_pix_nn.py
+
target/model …/scripts/misc/searches/_setup.py (_slam_source_pix_nn_model, _free_adapt_split)
+
Ruling lands in
+
…/results/notes/inference/targets/REFS_V1_HARVEST.md and …/results/baselines/InferenceRefs_v1/INDEX.json
+
Open in order
+
    +
  1. REFS_V1_HARVEST.md “Rows certified” + “What 'certified' does and does not mean”.
  2. +
  3. packet/refs_v1/hpc_hpc_a100_fp64_ref.json (results + performance blocks).
  4. +
  5. Compare its log_evidence 30,684.6 against the imaging/slam_source_pix/hst ref row (30,718.02) in that same table.
  6. +
  7. targets/TOLERANCES.md rows slam_source_pix_nn_fp64 / _pos_fp64.
  8. +
+
+
+ + Est. review-minutes 15 +
+
+ +
+
+
+

autolens_profiling · overflow-flood wave, rung 4 · issue #196

+

slogdet A/B on slam_source_pix_nn

+

342017_[0,1]

+
+
+ Healthy + +
+
+
+ +
+

Question this run was submitted to answer

+

“on the corrected target, does log_det_method='slogdet' change anything a nested sampler can see? … the honest answer here may well be 'no difference, because the cap already removed the failure' — which is a real finding, not a failed experiment. What it must NOT be is unmeasured while a slogdet default is being argued for elsewhere (W9, #166)” (submit-script header, rung 4 of the overflow-flood wave, autolens_profiling#196). Nothing had ever run a nested sampler with slogdet on a free-adapt-split cell.

+
+ +
+

Witness

+

A DECISIONS verdict on whether the two log-det tiers agree: logZ, wall, NaN counts. (The pre-registered CP-4 criteria from 2026-08-24 are about equality where the Cholesky succeeded; here the capped prior means the Cholesky never fails, so equality is the whole test.) Collision-safety witness from the header: both …_ld_cholesky and …_ld_slogdet output directories must exist — “if only one does, this submit measured nothing”.

+
+ +
+

Health evidence

+

sacct COMPLETED both; walls 1:23:58 and 1:14:37 of an 8 h budget (17 % / 16 %); .err files = mask-padding + two blurring_image UserWarnings each, nothing else; 0 tracebacks, 0 resume markers; version stamp 2026.8.17.1 ✓; collision safety confirmed — two distinct identifier dirs under two distinct name dirs (ld_cholesky/…/ae454f54e14847ca62929c70033c11a5, ld_slogdet/…/7eb80135de1db2112c5bb5383b32bc49), both carrying .completed. checkpoint.hdf5 unavailable (removed on completion); samples_info.json shows acceptance ratio 1.0 and no truncation on both. Finite-log_l scan: cholesky n=39,742 max 30,749.00 min 30,709.36; slogdet n=27,133 max 30,747.18 min 30,707.67; 0 samples > 1e10 in either arm, and no -inf/NaN rows recorded in either. PyAutoFit version stamp MISMATCH, and the two arms ran on different PyAutoFit trees — see the cross-cutting note; this is the one member where it is a genuine confound.

+
+ +
+

Readout

+
+ + + + + + + + + + + + + + + + + +
cholesky vs slogdet, same cell and target
cholesky (342017_0)slogdet (342017_1)Δ (slogdet − cholesky)
logZ30,684.313630,683.8129−0.50
maxL30,749.003930,747.1781−1.83
Δmax logL vs truth−772.740−774.566−1.83
total wall5,027.90 s4,467.09 s−560.8 s (−11.2 %)
likelihood evals77,90063,700−14,200
ms / eval64.5470.13+5.59 (+8.7 %)
Kish ESS8,726.54,903.5−3,823.0
samples > 1e10 (finite-garbage scan)00—
NaN / −inf samples recorded00—
vizdisableddisabled—
+
+

The two tiers agree. Δlog Z = 0.50 nats, Δmax logL = 1.83 nats. slogdet is 8.7 % slower per evaluation but finished 11 % sooner because it needed 18 % fewer evaluations — i.e. the wall difference is sampler-path noise, not a tier speed-up. Neither arm produced a single NaN, a single -inf, or a single finite-garbage sample: on the capped AdaptSplitPower target, the cholesky failure that motivated slogdet does not occur, so slogdet has nothing to rescue here.

+

Bonus — the programme's first same-configuration repeat. The cholesky arm and refs task 5 are the same cell, target (sha256:ad291b57fc62), n_live (300), seed (0) and positions (off): logZ 30,684.615 vs 30,684.314 (Δ 0.30 nats), maxL 30,748.575 vs 30,749.004 (Δ 0.43 nats), evals 73,700 vs 77,900 (5.7 % apart). That gives a ~0.3-nat empirical logZ reproducibility scale for this cell — directly usable wherever Gate A/C readings are quoted. Caveats: task 5 had visualization enabled (58 s) and the arms imported different PyAutoFit trees.

+

Raw JSONs local: packet/slogdet_ab/hpc_hpc_a100_fp64_slogdet_ab_{cholesky,slogdet}.json. Not present in the local repo; RAL-side and uncommitted.

+
+
+ Bar chart, truth vs best-fit, cholesky arm +
slogdet_ab/hpc_hpc_a100_fp64_slogdet_ab_cholesky.png — 342017_0
+
+
+ Bar chart, truth vs best-fit, slogdet arm +
slogdet_ab/hpc_hpc_a100_fp64_slogdet_ab_slogdet.png — 342017_1
+
+
+
+ +
+

Ruling

+

Write the DECISIONS verdict — “the two log-det tiers agree on the corrected target (Δlog Z 0.50 nats, zero NaN in either), so slogdet has nothing to rescue here” — or hold the verdict until the arms are re-run on one PyAutoFit tree.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [autolens_profiling]Record the ~0.3-nat same-configuration logZ reproducibility figure in PROGRAMME.md §3 as the programme's first independent-run variance measurement.
  • +
  • [autolens_profiling]Feed this into the W9 / #166 “make slogdet standard” argument: on a capped free-adapt-split target the tiers are indistinguishable, so the case for slogdet rests entirely on uncapped cells.
  • +
  • [PyAuto stack]Freeze the RAL PyAuto checkout for the duration of a campaign (tag + git -C … status echo into every .out) so two arms of one A/B cannot import two different trees.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/home/jammy/Code/PyAutoLabs/autolens_profiling
+
Pulled artefacts (local)
+
…/scratchpad/packet/slogdet_ab/ (2 JSONs + 2 PNGs)
+
Output folders
+
/mnt/c/Users/Jammy/Science/inference_programme/output/searches/nautilus/imaging/slam_source_pix_nn/hst/ld_cholesky/hpc_a100_fp64_slogdet_ab_cholesky/ae454f54e14847ca62929c70033c11a5/
+
…/ld_slogdet/hpc_a100_fp64_slogdet_ab_slogdet/7eb80135de1db2112c5bb5383b32bc49/ — each with model.results, search.summary, .completed, image/
+
Batch logs
+
/mnt/c/Users/Jammy/Science/inference_programme/logs/output/output.342017_{0,1}.out
+
Scripts
+
submit …/hpc/batch_gpu/submit_search_nautilus_slogdet_ab_imaging_slam_source_pix_nn_a100_hst_fp64
+
entry point …/scripts/imaging/searches/nautilus/slam_source_pix_nn.py
+
arm tagging …/scripts/misc/searches/_samplers.py (log_det_arm_tag)
+
Ruling lands in
+
…/results/notes/inference/DECISIONS.md — a new dated entry beside the 2026-08-24 CP-4 / Phase 8A entry at line 291 and the 2026-08-24 W7 re-score at line 401
+
Open in order
+
    +
  1. packet/slogdet_ab/hpc_hpc_a100_fp64_slogdet_ab_cholesky.json and …_slogdet.json side by side — results.log_evidence and performance.
  2. +
  3. DECISIONS.md line 291 (“CP-4 / Phase 8A: slogdet FAILS the pre-registered A/B”) to see what the old verdict was scored on.
  4. +
  5. The submit script's “COLLISION SAFETY — READ THIS BEFORE ADDING AN ARM” block, then confirm both ld_* dirs exist on RAL.
  6. +
  7. packet/refs_v1/hpc_hpc_a100_fp64_ref.json for the same-configuration repeat comparison.
  8. +
+
+
+ + Est. review-minutes 12 +
+
+ +
+
+
+

subhalo_validation

+

pl_sersic_0 no-subhalo — the false-positive null

+

342027_0

+
+
+ Healthy + +
+
+
+ +
+

Question this run was submitted to answer

+

“run the full end-to-end SLaM chain (source_lp → source_pix → light → mass → subhalo grid search + refine) … on data that contains no subhalo … the validation quantity is the Δ log-evidence the subhalo stage reports — it should be small” (wiki/project/state.md §“Science goal”), with the hand-off instruction “read results/delaunay_adapt_split/*.json (Δlog-evidence no-subhalo — expect < 5; anything larger is a false positive to investigate)” (state.md §“Next session”, item 1).

+
+ +
+

Witness

+

evidence_increase < 5 for a no-subhalo lens. Larger ⇒ false positive to investigate.

+
+ +
+

Health evidence

+

sacct COMPLETED, wall 1-10:08:32 of a 2-day budget (70 %); error.342027_0.err is 0 bytes; 0 tracebacks in the 4.1 MB .out; the log ends on the real terminator (“Results written to … / Finished sample: pl_sersic_0”); all seven stage directories present with .zip archives and the final subhalo[2] zip written at 13:03:02. No huge finite log_l anywhere — every stage logZ is ~2.1e4. MaxRSS 27.0 GB against a 96 GB request (28 %). Stack: autolens 2026.8.17.1; PyAutoFit imported at 02:54 on the 30th, i.e. 56fb8b63b (the PR #1548 pool fix) — which was merged to main as e6ff1e654 at 03:52 the same night, so the run carries the intended fix. source_lp[1] reloaded from the shared output dir as designed (the “Fit Already Completed” reload is expected here, unlike the profiling reference rows).

+
+ +
+

Readout

+
+ + + + + + + + + + + + + +
The witness
quantityvalue
log_evidence_mass_total (no subhalo)21,377.0355
log_evidence_subhalo_refine21,376.7347
evidence_increase (the witness)−0.3009 → PASS (< 5, and negative)
log_likelihood_mass_total21,419.2107
log_likelihood_subhalo_refine21,420.1775
log_likelihood_increase+0.9668
spurious subhalo mass_at_2001.493e9 M⊙
spurious subhalo centre(2.1457, −0.2410) arcsec
+
+

This is the textbook null: the subhalo buys +0.97 nats of likelihood for 3 extra parameters and the evidence falls by 0.30 nats. The nuisance subhalo parks itself 2.16″ from the centre — outside the Einstein ring, where it does nothing.

+
+ + + + + + + + + + + +
Stage timeline, from the run-directory zip mtimes — the grid search is the whole cost
stageendedduration
source_lp[1] (reloaded)30 Aug 02:54:43—
source_pix[1]30 Aug 03:23:4329 min
source_pix[2]30 Aug 03:33:2910 min
light[1]30 Aug 04:47:0474 min
mass_total[1]30 Aug 07:35:57169 min
subhalo[1] grid + subhalo[2] refine31 Aug 13:03:0229.4 h (85 % of the run)
+
+

The subhalo grid is 2×2. scripts/imaging.py:94-95 sets subhalo_grid_dimension_arcsec: 3.0 and subhalo_number_of_steps: 2, so the “grid search” is four 3″-wide cells centred at (±3, ±3)-ish corners. All four agree (results.csv):

+
+ + + + + + + + + +
Grid cells vs the no-subhalo baseline
cellcentre_0centre_1log_evidencevs no-subhalo baseline 21,377.04
0−3.0−3.021,376.245−0.79
1−3.00.021,376.368−0.67
20.0−3.021,376.420−0.62
30.00.021,376.438−0.60
+
+

Every cell is below the baseline. The null is uniform across the grid — reassuring — but a 4-cell scan at 3″ resolution is a very coarse detection experiment for a lens with a ~1″ Einstein radius, and it costs ~29 h.

+

Figures: none pulled for this lens (hpc/sync pull excludes search_internal and this run's image/ directories are inside the per-stage .zip archives). See the two RUNNING lenses' dataset.png for what the data look like.

+

Raw result JSON: packet/subhalo_validation/pl_sersic_0_no_subhalo.json; grid CSV packet/subhalo_validation/pl_sersic_0_grid_results.csv. hpc/sync pull did not bring the witness JSON down — pull() iterates PULL_DIRS (output/, logs), not results/, so /mnt/c/Users/Jammy/Science/subhalo_validation/results/delaunay_adapt_split/ still does not exist locally. Both files above were scp'd into the packet directly.

+
+ +
+

Ruling

+

Accept pl_sersic_0 as a passed no-false-positive witness and record it in results_summary.md, and rule on whether a 2×2 / 3″-step subhalo grid is the intended detection experiment or a smoke-test leftover.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [subhalo_validation]Fix hpc/sync pull to include results/ — the pre-registered witness lives there and the documented pull does not fetch it.
  • +
  • [subhalo_validation]Raise subhalo_number_of_steps (2 → 5) for the science runs, or record explicitly that the 2×2 grid is deliberate; at ~7 h per cell, cost the change first.
  • +
  • [subhalo_validation]Fill wiki/project/results_summary.md with evidence_increase for pl_sersic_0 once the other two lenses land, so all three go in together.
  • +
  • [autolens]Silence or fix the latent.yaml lists 'total_galaxy_0_flux' but no such latent is registered warning — it is emitted once per sample and is ~95 % of the 4.1 MB batch log.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/mnt/c/Users/Jammy/Science/subhalo_validation
+
Pulled artefacts (local)
+
…/scratchpad/packet/subhalo_validation/pl_sersic_0_no_subhalo.json and pl_sersic_0_grid_results.csv
+
Output folder (pulled locally, stage dirs hold .zip archives)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/output/subhalo/detect/delaunay_adapt_split/pl_sersic_0_no_subhalo/ — in particular subhalo[2]_[single_plane_refine]/f5149ca75c58d241c808938aff23a21e.zip (holds model.results, image/) and subhalo[1]_[search_lens_plane]/ae37aada789b983fcd5dc54f9d6ef440/results.csv
+
Batch log (4.1 MB)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/hpc/batch_cpu/output/output.342027_0.out
+
Witness JSON (now pulled — hpc/sync pull fixed)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/results/delaunay_adapt_split/pl_sersic_0_no_subhalo.json
+
Scripts / recipe
+
submit /mnt/c/Users/Jammy/Science/subhalo_validation/hpc/batch_cpu/submit_source_pix (array index 0 → pl_sersic_0)
+
entry point /mnt/c/Users/Jammy/Science/subhalo_validation/scripts/imaging.py (grid settings at lines 94–95, subhalo_grid_search at line 472)
+
pipeline …/scripts/pipelines/ (delaunay_adapt_split)
+
Ruling lands in
+
/mnt/c/Users/Jammy/Science/subhalo_validation/wiki/project/results_summary.md (and the “Open, carried forward” list in wiki/project/state.md)
+
Open in order
+
    +
  1. packet/subhalo_validation/pl_sersic_0_no_subhalo.json — evidence_increase is the whole witness.
  2. +
  3. packet/subhalo_validation/pl_sersic_0_grid_results.csv — four rows is the surprise.
  4. +
  5. scripts/imaging.py lines 94–95 to see where four comes from.
  6. +
  7. wiki/project/state.md §“Next session” item 1, which is the instruction this member answers.
  8. +
+
+
+ + Est. review-minutes 10 +
+
+ +
+
+
+

subhalo_validation

+

pl_eff_0 and pl_eff_1_outer — still in the refine

+

342027_[1,2] · euclid-ral-compute-21 · wall 2026-09-01 02:54

+
+
+ Running + +
+
+
+ +
+

Question this run was submitted to answer

+

The same false-positive witness as above, on the two clumpy ElsonFreeFall sources: pl_eff_0 (six components) and pl_eff_1_outer (a seventh compact component outside the tangential caustic, giving an extra doubly-imaged pair) — wiki/project/state.md §“Data on hand”.

+
+ +
+

Witness

+

evidence_increase < 5 per lens, from results/delaunay_adapt_split/{pl_eff_0,pl_eff_1_outer}_no_subhalo.json. Not yet written — both are in the final stage.

+
+ +
+

Health evidence

+

squeue: both RUNNING on euclid-ral-compute-21, elapsed 1-12:37:32 of a 2-00:00:00 budget (75 %), wall at 2026-09-01 02:54. error.342027_{1,2}.err are 0 bytes; 0 tracebacks in either .out. Both are in the last stage — subhalo[1] grid search is complete for both (results.csv written, all four cells) and subhalo[2]_[single_plane_refine] started 31 Aug 13:49:37 (pl_eff_0) and 14:31:09 (pl_eff_1_outer). Live checkpoint.hdf5 (mtime 15:33, minutes old):

+
+ + + + + + + +
Live checkpoint read
tasklensstageboundsn_likeexploredn_live / n_dimrefine elapsed
342027_1pl_eff_0subhalo[2]_[single_plane_refine]1616,060False600 / 111 h 48 m
342027_2pl_eff_1_outersubhalo[2]_[single_plane_refine]1210,480False600 / 111 h 06 m
+
+

Both are advancing (~150 likelihood calls/min); late bounds show 99.0–99.5 % proposal rejection, which is normal nautilus shell-narrowing, not a stall.

+

Memory is flat, and the “6–9 GB healthy” baseline was a stage-1 reading. sstat: 342027.batch MaxRSS 32.82 GB / AveRSS 32.06 GB; 342029.batch (the second array task's underlying job id) MaxRSS 29.91 GB / AveRSS 28.91 GB. Ave within 3 % of Max ⇒ the footprint stepped up early and has been flat since, not creeping. Both are 31–34 % of the 96 GB request, and the completed task 0 finished at MaxRSS 27.0 GB — so ~27–33 GB is this chain's real plateau. The hand-off's 5.9–6.4 GB was measured 13 minutes in, during source_pix[1]. This is not the PR #1548 leak returning.

+

CPU: AveCPU 9-19:39 and 9-18:44 over 1-12:37 elapsed ⇒ 6.4 of 8 cores busy on both, matching the hand-off's ~6 cores.

+
+ +
+

Readout

+

No science numbers yet. ETA: task 0's subhalo[1]+subhalo[2] legs took 29.4 h combined and its grid alone ran ~28 h; these two grids took 28.9 h and 29.9 h, and task 0's refine leg was therefore ~1.5 h. pl_eff_0 is 1.8 h into its refine, pl_eff_1_outer 1.1 h, with ~11 h of budget left. Both should finish well inside the wall unless the clumpy source makes the refine several times slower than the smooth one — worth one more check this evening rather than a pre-emptive requeue.

+

Raw JSONs after the pull: not yet written — they will appear on RAL at /mnt/ral/jnightin/subhalo_validation/results/delaunay_adapt_split/{pl_eff_0,pl_eff_1_outer}_no_subhalo.json and land at /mnt/c/Users/Jammy/Science/subhalo_validation/results/delaunay_adapt_split/ on the next hpc/sync pull. The pull() gap noted above is fixed: that project’s PULL_DIRS now includes results, and the zip counter no longer aborts the pull part-way.

+
+
+ Masked imaging data going into the pl_eff_0 refine +
subhalo_validation/pl_eff_0_refine_dataset.jpg — masked data going into the refine
+
+
+ Masked imaging data going into the pl_eff_1_outer refine +
subhalo_validation/pl_eff_1_outer_refine_dataset.jpg — masked data going into the refine
+
+
+ light[1] fit for pl_eff_0 +
subhalo_validation/pl_eff_0_light1_fit.jpg — the light[1] fit, the most recent completed-stage fit image available locally
+
+
+

Figures pulled from the live image/ dirs, which hpc/sync pull did fetch.

+
+ +
+

Ruling

+

Leave both to finish on the current wall (recommended) / requeue with a longer --time now, before the 2026-09-01 02:54 deadline forces the choice.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [subhalo_validation]Re-poll checkpoint.hdf5 explored on both tasks around 20:00 tonight; if either is still explored: False past ~22:00, decide requeue vs let-it-wall while there is still time.
  • +
  • [subhalo_validation]Once both land, read all three evidence_increase values into wiki/project/results_summary.md in one edit (state.md “Open, carried forward” item 1).
  • +
  • [subhalo_validation]Record the measured stage costs (grid search ≈ 29 h of a ≈ 34 h chain) in the project so the next --time and the rectangular_adapt comparison run are sized from data, not from the 48 h guess.
  • +
  • [subhalo_validation]hpc/batch_cpu/template and subhalo_simulations/hpc/batch_cpu/submit_imaging still say --partition=cpu and lack PyAutoNerves on PYTHONPATH (state.md §“Next session” 3d) — fix before the rectangular_adapt run reuses them.
  • +
+
+ +
+

Where to look yourself

+
+
Project root
+
/mnt/c/Users/Jammy/Science/subhalo_validation
+
Output folders (pulled locally, live)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/output/subhalo/detect/delaunay_adapt_split/pl_eff_0_no_subhalo/subhalo[2]_[single_plane_refine]/2429cc0206b60e10da18b7c950f9804f/
+
…/pl_eff_1_outer_no_subhalo/subhalo[2]_[single_plane_refine]/6f9d0ee150e8eba94a0797ed1061e63c/ — each has image/dataset.png, image/image_with_positions.png, files/; search_internal/ is excluded by the pull
+
Live checkpoints (excluded from the pull by design)
+
RAL only…/2429cc0206b60e10da18b7c950f9804f/files/search_internal/checkpoint.hdf5 and …/6f9d0ee150e8eba94a0797ed1061e63c/files/search_internal/checkpoint.hdf5 under /mnt/ral/jnightin/subhalo_validation/output/subhalo/detect/delaunay_adapt_split/
+
Completed grid searches (pulled)
+
…/pl_eff_0_no_subhalo/subhalo[1]_[search_lens_plane]/fe8dd2650a5531db17a336821aa52b98/results.csv
+
…/pl_eff_1_outer_no_subhalo/subhalo[1]_[search_lens_plane]/814f813355599c8ce590014ec8de6c7f/results.csv
+
Batch logs (4.0–4.3 MB; the Nautilus progress line is block-buffered and only flushes on exit, so read the checkpoint, not the log)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/hpc/batch_cpu/output/output.342027_{1,2}.out
+
Scripts / recipe
+
/mnt/c/Users/Jammy/Science/subhalo_validation/hpc/batch_cpu/submit_source_pix (array indices 1, 2)
+
/mnt/c/Users/Jammy/Science/subhalo_validation/scripts/imaging.py
+
/mnt/c/Users/Jammy/Science/subhalo_validation/hpc/sync (jobs, pull)
+
Ruling lands in
+
/mnt/c/Users/Jammy/Science/subhalo_validation/wiki/project/state.md §“Next session” (rewrite at hand-off) and, once the numbers land, …/wiki/project/results_summary.md
+
Open in order
+
    +
  1. hpc/sync jobs to confirm both are still R.
  2. +
  3. packet/subhalo_validation/pl_eff_0_refine_dataset.jpg to see the clumpy-source data the refine is fitting.
  4. +
  5. The two subhalo[1] results.csv files above — the grid legs are already done and their four cells are the pre-refine read of the same witness.
  6. +
  7. wiki/project/state.md §“Next session” item 1 for the instruction, and its “Confirmed 2026-08-30 03:07 BST” note for the 6–9 GB figure this packet revises.
  8. +
+
+
+ + Est. review-minutes 8 +
+
+ +
+
+
+

euclid_strong_lens_modeling_pipeline · retrospective

+

euclid-dr1-prep — retrospective of phase 2

+

PR #46 · issue #45 · main @ 361e83b

+
+
+ Merged + +
+
+
+ +
+

Question — what it set out to do

+

Give euclid_strong_lens_modeling_pipeline its first CI: TEST-mode smoke over every example script running on committed simulated data (deliberately not the auto-simulate convention every other PyAuto workspace uses, because this repo's users fit real Euclid data), plus known-answer unit tests on every Analysis latent and a run-level check that a fit actually writes them.

+
+ +
+

Witness

+

The epic ledger's phase-2 decision checklist — each decision resolved to a path and a pattern in the live repo (the table under Readout) — together with the phase's own CI: 9/9 checks green on the PR head and green again on main after the merge.

+
+ +
+

Health evidence — what shipped

+

PR #46 test: TEST-mode CI on committed simulated data + latent known-answer tests (epic phase 2), merged 2026-08-29 23:24 as 361e83b, 55 files, +3670 / −472 text lines (gh reports −7741 because it counts the deleted binary datasets). Four commits, staged A–D: c78f789 simulator + dataset, a8ce0c3 tests, ceba36b CI, 2633e00 docs. CI: 9/9 checks green on the PR head (Smoke Tests run 33278353869, Tests run 33278353935), and both re-ran green on main after the merge (33280913921, 33280913907). Nothing has pushed to main since, so those are still the live green runs. Issue #45 closed on merge.

+

Phase 1 for context (the structural review spans it): PR #44, merged 4a0d9c5, 63 files, +4484 / −531; issue #43 closed. It ran zero checks — the repo had no .github/workflows/ at all — so it merged on local evidence only. That gap is exactly what #46 closed.

+
+ +
+

Readout — glance at the PR, the hunks worth your eyes

+
    +
  • tests/test_compute_latent_variable.py:254 (_assert_replays) — the shape of the whole latent suite. Each of the 12 latents gets two assertions: a replay against truth.json, and an independent check against the simulator's separately-recorded truth block. The replay leg compares the pipeline's computation to a number the same pipeline wrote, so it would pass a consistently-wrong formula; the independent leg is the one with teeth. For the 4 aperture latents that independent leg is monotonic scaling with FWHM (:352, parametrized k=1..4), not an absolute flux — the weakest rung in an otherwise strong suite. Worth knowing before you trust “12/12 known-answer”.
  • +
  • tests/test_latent_run_level.py:34 and :262 — the NaN check is a key-count assertion, because a NaN latent is dropped from latent_summary.json entirely rather than written as NaN. Clever and correct, but it means the test hard-codes == 12; enabling a latent in config/latent.yaml breaks CI by design. Science-adjacent: this is the only check that the pipeline still emits the DR1 catalogue columns at all.
  • +
  • scripts/simulator.py:558 (apply_sersic_index_prior_edge_rule) — a behaviour change with science consequences downstream. When a --from-result resimulation finds the lens-light sersic_index pinned at the prior edge of 5, it silently lowers it to a chosen replacement and records both sersic_index_inferred and sersic_index_simulated in truth.json. That is the epic's phase-5 instruction implemented early; phase 6a's whole question (“do we recover Sersic indices?”) reads those two fields. Check the replacement default matches what you meant.
  • +
  • scripts/simulator.py:70 (docstring) — --from-result applies the same fitted intensities to every band, i.e. a flat SED, recorded as sed: "flat" in truth.json. Documented and deliberate, but phase 5 inherits it, and a flat SED is not a Euclid colour. This is the single largest known simplification in the phase-2 deliverable.
  • +
  • config/build/no_run.yaml (+41 lines, 17 new reasoned exclusions) — this is what “CI over every example script” actually means. The smoke gate runs 9 entries; the repo has 49 tracked .py files. Everything excluded (7 catalogue producers, 6 workflow/aggregator examples, 4 GUIs, 3 preprocess/one-off tools, 2 CI runners, 2 shared modules) carries a written reason, and tests/test_repo_invariants.py enforces that every script is in one list or the other. The exclusions are honest, but the headline “every script” is really “every script on the fit chain”.
  • +
+

All five paths are under /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/.

+
+ +
+

Readout — repo structure (main @ 361e83b, 221 tracked files, 5.0 MB, 3.9 MB of it data)

+
(root)                    start_here.py (63-line shim) · util.py (989 L) · __init__.py ·
+                          smoke_tests.txt · pytest.ini · activate.sh · AGENTS/README/CLAUDE/AI_POLICY ·
+                          test_report.md (generated, stale) · sie_fit.png (stray)
+.github/    5 files       2 workflows (Smoke Tests, Tests) + 3 runner scripts — the whole of phase 2's CI
+scripts/    13 files      the fit chain: initial → sersic → waveband → sersic_waveband, plus full_model,
+                          mge_lens_only, simulator, 2 latent diagnostics, build_inspect + bundle .sh
+catalogue/  10 files      7 producers of the DR1 reference-tile CSVs + catalogue_util.py + README
+                          (13-file → producer table lives here)
+config/     92 files      77 of them priors/; build/ (no_run.yaml, profile_smoke.yaml), latent.yaml,
+                          visualize/, non_linear/
+dataset/    20 files      q1_walsmley/ (1 real lens, 6 files) + simulated/euclid_dr1_like/ (13 files,
+                          incl. truth.json + segmentation/) + README
+tests/      9 files       5 test modules + 4 checked-in DR1 header fixtures
+workflow/   33 files      aggregator examples (csv/png/fits) + their reference outputs — all no_run
+hpc/        12 files      batch_cpu (1 submit + template), batch_gpu (3 submits), sync + example conf
+preprocess/ 5 files       segmentation, mask GUIs, one-off migration
+tools/      4 files       3 GUI/PSF utilities
+docs/       1 file        drift_report.md — the phase-1 port record, 11 sections
+
+ + + + + + + + + + + + + + + +
Decision checklist
Decision (from the ledger)LandedPath / evidence
full_model.py Delaunay, matching autolens_workspace .../pixelization/delaunay.pyYscripts/full_model.py:499 (stage 1 Delaunay + AdaptSplit, Overlay(26,26)+30 edge pts) and :567 (stage 2). Matches the workspace file's SLaM stages (delaunay.py:685, :770), not its standalone example at :376 which uses ConstantSplit
Hilbert pixels=500Yscripts/full_model.py:524-527; deviation from the workspace's 1000 documented in docs/drift_report.md §4 (VIS cut-outs are small; VRAM)
Critical-path scripts only (initial → sersic → waveband → sersic_waveband)Yall four in scripts/; _pix variants, galaxy_sersic_model.py, audit_*, reorganize_normies.py absent and listed in docs/drift_report.md §10
util.py latents + WORST_PSF_* machineryYutil.py:290 (psf_fwhm_arcsec_from_primary_header, WORST_PSF_MER/_HDR/_PSF with the −99 sentinel), :831 (WORST_BAND degradation path), :459 LatentEuclid (8 library + 4 aperture = 12). 989 L vs the science tree's 978
13-file reference-tile bundle + build_inspect.py / bundle .shY (with a deliberate override)scripts/build_inspect.py, scripts/build_inspection_bundle.sh, producer table in catalogue/README.md:26. Note the ledger's phase-1 user decision listed build_inspect.py as not to port; it was ported anyway to reach 13/13, and that reversal is documented in docs/drift_report.md §9 rather than hidden
start_here.py as a shimY63 lines, forwards to scripts.initial_lens_model.fit; docs/drift_report.md §2
mge_lens_only.py keptYscripts/mge_lens_only.py, in smoke_tests.txt
dataset/simulated/euclid_dr1_like/ with truth.jsonY13 files, 883 KB, incl. segmentation/, positions.json, truth.json (250 L)
CI: Smoke Tests + Tests via Heart's reusable workflowY.github/workflows/smoke_tests.yml, tests.yml — both uses: PyAutoLabs/PyAutoHeart/.github/workflows/smoke-tests.yml@main; Tests splits unit / slow
config/priors/mesh/voronoi.yaml naming an absent classN/A — already fixedThe file was deleted in phase 1's config drift sweep (90955ac), with priors/hyper_data.yaml and image_mesh/kmeans.yaml; reasons in docs/drift_report.md §8. config/priors/mesh/ now holds only classes that exist
+
+
+ +
+

Readout — things that look off

+
    +
  • The new CI gates nothing. PyAutoHeart/config/repos.yaml:97 required_workflows has keys for libraries, workspaces, workspaces_test, howto — but no pipelines, and euclid is in the pipelines group (:70). So the two workflows this phase built are polled but cannot turn Heart red. Why it matters: the phase's own value proposition (don't debug science and software at once in phase 4) is only half-delivered until a red euclid CI blocks something. Follow-up already filed at PyAutoMind/draft/test/pyautoheart/euclid_pipeline_release_blocking_gate.md — unstarted.
  • +
  • test_report.md is tracked, generated, stale, and carries absolute local paths — /home/jammy/Code/PyAutoLabs/... on lines 47–51, and its table covers 5 scripts when smoke_tests.txt lists 9. Its own header admits both. Why it matters: it is the only file in the repo with a machine-specific path, it is the first “did this pass?” artifact a new reader opens, and it currently reports a full_model.py PASS recorded against a version of the script that could not run.
  • +
  • sie_fit.png is tracked at the repo root while .gitignore has a rule (# Loose image at project root) written specifically to exclude it. Committed 2025-11-29 in a commit called “fixes”; ignore rules do not apply to already-tracked files, so the guard is inert. Why it matters: a contradiction between the ignore file and reality, and an undocumented artifact at the top level of a first-class public repo.
  • +
  • workflow/fits/hi_0.fits.fits — doubled extension, tracked past the *.fits ignore. Why it matters: cosmetic, but it is a reference output that someone will eventually try to match by name.
  • +
  • AGENTS.md's structure block omits four tracked root entries — test_report.md, sie_fit.png, AI_POLICY.md, CLAUDE.md, plus root __init__.py and .claude/. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/AGENTS.md:27-73. Why it matters: the block is the repo's map; the two undocumented entries are exactly the two above that shouldn't be there.
  • +
  • hpc/batch_cpu/ holds one submit script and a template, against 18 in the source-of-truth tree, and has none of the vis_lp_cpu_jax / vis_pix_cpu_nojax pair. Why it matters: not a defect — that pair is literally phase 3's deliverable — but if you read the repo today expecting the DR1 CPU route to be reproducible, it is not yet.
  • +
  • Duplicated utilities: nothing found. util.py (pipeline: dataset loading, analysis, latents) and catalogue/scripts/catalogue_util.py (arg parsing, path resolution, per-tile CSV splitting) share no function names.
  • +
  • Scripts outside the documented layout: nothing found.
  • +
  • Leftover _pix variants meant to be skipped: nothing found. The only _pix file is scripts/diagnose_latent_vis_pix.py, which is a latent diagnostic the decision explicitly asked for, correctly excluded from smoke with a reason.
  • +
  • Dead configs: nothing found beyond the voronoi/hyper_data/kmeans sweep already done in phase 1.
  • +
  • Missing __init__.py: nothing found that matters — scripts/, catalogue/, catalogue/scripts/, preprocess/, tools/, workflow/ and the root all have one; tests/ deliberately does not (rootdir collection, and the suite passes).
  • +
  • Test dirs vs CI mismatch: nothing found. pytest.ini testpaths = tests; the slow marker is applied module-wide at tests/test_latent_run_level.py:69 and CI's slow job passes --slow to .github/scripts/run_tests.py.
  • +
  • CRLF: nothing found — zero CRLF files, and .gitattributes pins eol=lf with *.fits/*.png opted out after the * rule (order is correct and commented).
  • +
  • Both completion records say a worktree was “deliberately left in place”; both are already gone (git worktree list shows only the canonical checkout). That follow-up is discharged — the records just haven't been updated.
  • +
+
+ +
+

Ruling

+

Structure is sound → phase 3 is dispatchable as-is. Nothing found blocks it; the only judgement call is whether to fold the three tidy-ups (delete sie_fit.png, regenerate-or-untrack test_report.md, sync AGENTS.md's structure block) into phase 3's PR or file them separately — and whether the euclid CI should become release-blocking before the phase-4 science run rather than after.

+
+ +
+

Your review

+
+ + + + +
+ +
+ +
+

Follow-ups

+
    +
  • [PyAutoHeart]Ship PyAutoMind/draft/test/pyautoheart/euclid_pipeline_release_blocking_gate.md — add a pipelines: ["Smoke Tests", "Tests"] key to Heart's required_workflows and put euclid in the weekly sweep. Small, and it is what makes phase 2 real.
  • +
  • [euclid_pipeline]Hygiene one-off: untrack sie_fit.png, regenerate or untrack test_report.md (it is the only source of hard-coded local paths), fix workflow/fits/hi_0.fits.fits, add the four missing root entries to AGENTS.md:27.
  • +
  • [euclid_pipeline]Strengthen the 4 aperture latents' independent leg from monotonic-scaling to an absolute µJy value against truth.json's aperture block (the data is already there).
  • +
  • [PyAutoMind]Note in the phase-5 prompt that simulator.py --from-result writes a flat SED; decide whether a colour-correct SED is in scope before the resimulations run.
  • +
  • [PyAutoMind]Housekeeping: both completion records claim a worktree was left in place; both are gone — correct the records or leave them, but don't act on them.
  • +
+
+ +
+

Where to look yourself, in order

+
+
Open in order
+
    +
  1. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/ — repo root, main @ 361e83b, clean.
  2. +
  3. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/AGENTS.md — the structure block at :27 and the CI section at :229; this is the map.
  4. +
  5. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/docs/drift_report.md — 11 sections; §4 (Delaunay), §9 (13/13 coverage), §10 (what was deliberately not ported). This is the phase-1 audit trail and it is genuinely good.
  6. +
  7. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/scripts/full_model.py and /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/scripts/simulator.py — the two files that define what the pipeline fits and what it simulates.
  8. +
  9. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/.github/workflows/tests.yml — the CI file with the reasoning in it (why unit and slow are separate jobs).
  10. +
  11. /home/jammy/Code/PyAutoLabs/euclid_strong_lens_modeling_pipeline/dataset/simulated/euclid_dr1_like/truth.json — the number every latent test is measured against.
  12. +
  13. /home/jammy/Code/PyAutoLabs/PyAutoMind/draft/feature/euclid/euclid_dr1_prep_epic.md — the ledger. Phase 3 starts from line 197: draft/feature/euclid/cpu_vis_lp_jax_vis_pix_numba_submission.md — preserve and document the two-stage vis_lp (JAX) → vis_pix (numba + multiprocessing) CPU route and the full-JAX-GPU route. Gate 1 (satisfied); can overlap 2 (shipped).
  14. +
+
+
+ +
+

Est. review-minutes

+

~10 to skim PR #46's five flagged hunks, ~15 in the repo tree with AGENTS.md and drift_report.md open side by side, ~10 to rule on the Heart gate and the tidy-up bundling. Add 20 if you also want to read phase 1's PR #44 diff rather than trusting its drift report.

+ Est. review-minutes 35 +
+
+
+ +
+
+
+

Applies to every profiling member

+

Cross-cutting: the RAL PyAutoFit stack moved during the campaign

+

342016_[5,6,7] · 342017_[0,1] · 342018_[0,1,2]

+
+
+ Provenance +
+
+
+ +
+

This applies to every profiling member and is the reason none of them can be stamped “version match Y” without qualification.

+

Expected stamps at submission: Fit b70cf7fc3 / Array 302d5df32 / Galaxy 2ee44d507 / Lens af514d179. PyAutoArray, PyAutoGalaxy and PyAutoLens match exactly and did not move after 2026-08-29 23:40. PyAutoFit moved four times overnight (git -C /mnt/ral/jnightin/PyAuto/PyAutoFit reflog --date=iso):

+
+ + + + + + + + + +
PyAutoFit on disk, overnight
time (BST)PyAutoFit on disk
29 Aug 23:38:11b70cf7fc3 (main) — the expected stamp
29 Aug 23:50:381f7808e69 (feature/nautilus-serial-bound-training)
30 Aug 02:53:0756fb8b63b (same branch, pool fix)
30 Aug 03:51:53 → 03:52:45b70cf7fc3 → e6ff1e654 (main, PR #1548 merged)
+
+

Mapping onto import time (each job imports in its first ~30 s):

+
+ + + + + + + + + + + +
Which tree each task actually imported
taskwindowPyAutoFit importedmatches expected?
342016_523:44–01:06b70cf7fc3Y
342016_601:06–02:211f7808e69N
342016_702:21–03:201f7808e69N
342017_0 (cholesky)03:20–04:4456fb8b63bN
342017_1 (slogdet)04:44–05:58e6ff1e654N
342018_0/1/2 (SMC)05:58–06:52e6ff1e654N
+
+
+ +
+

Two separate consequences

+
    +
  1. b70cf7fc3 → 1f7808e69 → 56fb8b63b touch only nautilus/search.py (serial bound training, then the _LikelihoodWorkerPool fix). Every profiling run here is number_of_cores: 1 / force_x1_cpu: true, so no pool is built and the change is plausibly inert — but that is a reading of the diff, not a verified equivalence.
  2. +
  3. b70cf7fc3 → e6ff1e654 additionally carries dc53a2597 / f661b75c9 “ship log_likelihood_ceiling disabled by default”, which flips autofit/config/general.yaml from log_likelihood_ceiling: 1.0e+20 to blank. So 342016_* and 342017_0 ran with the overflow backstop and 342017_1 + 342018_* ran without it. Worse: the repo-level opt-in was not there either — the local repo added log_likelihood_ceiling: 1.0e+20 to autolens_profiling/config/general.yaml in dfeafbf (merged 6fe8f72), but the RAL checkout is at f284f24, one merge behind, and grep log_likelihood_ceiling /mnt/ral/jnightin/autolens_profiling/config/ returns nothing. No task in this campaign had the repo-level ceiling the submit headers assume. +

    Mitigation, and it is a strong one: the samples.csv scan over all five nautilus runs found zero samples above 1e10 (largest finite log_l anywhere: 31,406.12). The ceiling never had anything to clip, so the difference is a provenance defect rather than a numerical one. The one place it still bites is the slogdet A/B, whose two arms differ in log_det_method and in whether the guard was armed — the confound is inert on this evidence, but it is not clean.

    +
  4. +
+
+
+
+ +
+ Packet-building notes +
+ +
+

What took the time — science-run packet

+
    +
  • Reconstructing the PyAutoFit timeline. sacct says COMPLETED and every JSON says "version": "2026.8.17.1", so the recorded stamp is identical across all six tasks and looks fine. The drift only surfaces from git reflog --date=iso on the RAL checkout cross-referenced against per-task start/end times. That was ~20 minutes and it changed the reading of two members.
  • +
  • Chasing the ceiling. Finding that general.yaml's ceiling had been switched off upstream mid-campaign, and that the repo-level opt-in had not reached RAL, took three separate checks (PyAutoFit diff → PyAutoFit config diff → RAL autolens_profiling/config/). Neither fact is visible from any artefact the runs produced.
  • +
  • The SMC diagnostics. The top-line JSON fields (converged: true, valid: true, ESS 210/256) all look healthy; the failure is only legible in acceptance_rate_list, lambda_list and log_likelihood_increment_list read together, plus the comparison against a number that lives in a different file (REFS_V1_HARVEST.md's 31,690.42) and a sentence in PROGRAMME.md line 29.
  • +
  • RAL NFS. Batching remote commands kept this to ~15 ssh round-trips; find over output/ was avoided except at -maxdepth 2/3.
  • +
+
+ +
+

What could not be verified, and why

+
    +
  • checkpoint.hdf5 n_like / explored for all five profiling nautilus runs. The runs log “Removing search internal folder” then “Removing all files except for .zip file” on completion, and search_internal/ is not in the resulting zip. The named provenance check is therefore unrecoverable after the fact; files/samples_info.json (total samples, acceptance ratio, no truncation) and the samples.csv finite-log_l scan were substituted. This is exactly the check the harvest rules ask for, and it is being deleted.
  • +
  • NaN / -inf counts for the slogdet arms. samples.csv only records accepted samples, so “0 NaN” here means “no NaN reached the posterior”, not “the likelihood never returned NaN”. A true resample/NaN count needs the sampler-internal state that was deleted with search_internal.
  • +
  • Whether the nautilus/search.py changes between b70cf7fc3 and 56fb8b63b are truly inert at number_of_cores: 1. The diff was read; no equivalence test was run.
  • +
  • Task 0's per-stage sampler timings in subhalo_validation — unzip -p <zip> files/samples_info.json did not resolve inside the archives, so the stage table is built from zip mtimes (correct for durations, but it gives no total_samples or per-stage logZ).
  • +
  • Why the SMC warm arms start 124,000 nats below their MAP source. Diagnosed from the artefacts as a broken warm start; the actual cause is inside af.SMC's InitializerParamStartPoints / prior_scaled path and needs a local reproduction, which is development work, not harvest.
  • +
+
+ +
+

What a batch collect for science runs would need to automate

+
    +
  1. Never trust State. For every task: .err tail, .out traceback/resume-marker grep, wall-vs-Timelimit ratio, ExitCode (and specifically flag 0:53, which means SLURM could not open the log path and no .err exists to read).
  2. +
  3. Stamp the stack per task, at import time, into the artefact. "version": "2026.8.17.1" is not a provenance stamp — a package version cannot see a git checkout. Every submit should echo git -C $PyAutoX rev-parse HEAD for all five repos into the .out and the results JSON, and the collector should diff them against the campaign's declared stamps and against each other across tasks of the same array. This one check would have caught both cross-cutting findings automatically.
  4. +
  5. Preserve, don't delete, the sampler state on reference-grade runs — or at minimum copy checkpoint.hdf5's sampler attributes (n_like, explored, shell_log_l, shell_n_eff) into the results JSON before the folder is removed. Half the harvest rules currently cannot be applied to a completed run.
  6. +
  7. Run the finite-log_l scan automatically over samples.csv (max, min, count > ceiling, count non-finite) and put the four numbers in the results JSON. It is cheap and it is the failure signature the whole overflow-flood wave exists for.
  8. +
  9. Score against the pre-registered witness, not the sampler's own flag. The collector should read the witness out of the notes (REFS_V1_HARVEST bar, TOLERANCES.md row, state.md's “< 5”) and print witness / observed / PASS-FAIL. And it should treat a sampler's self-reported converged / valid as input, never as verdict — Phase 7 is the proof.
  10. +
  11. Pull the witness file. subhalo_validation's documented hpc/sync pull fetches output/ and logs but not results/, which is where the pre-registered number is written. Any collector must fetch the results directory explicitly.
  12. +
  13. Diff sibling arms of an A/B before reporting them. Same target_id, same seed, same n_live, same imported stack — and say so, or say which of those does not hold. The slogdet pair failed the last of those four and nothing in the artefacts said so.
  14. +
+
+ +
+

What a future automated retrospective for a merged phase would need — Euclid member

+
    +
  1. gh pr diff N --stat does not exist on gh 2.x — the reliable stat is git diff --stat <merge-parent-1> <merge-parent-2> from a local clone, and it disagrees with gh pr view --json additions,deletions whenever binaries move (here 472 vs 7741 deletions). Report the git number and say why.
  2. +
  3. The retrospective's spine is the completion record in PyAutoMind/complete/YYYY/MM/, not the PR — it already carries commits, verification, scope-vs-filed, traps, follow-ups and the heart-ack. A generator should diff the record's claims against the live repo and report only the deltas; that is where all six findings above came from.
  4. +
  5. Ledger decisions need a machine-checkable form. Every check here was a bespoke grep (“does full_model.py contain Hilbert(pixels=500)”). A Verify: block in the phase prompt listing path:pattern pairs would turn the checklist table into a script, and would have caught the build_inspect.py decision-reversal automatically instead of by eye.
  6. +
  7. Follow-ups filed as Mind drafts (draft/test/pyautoheart/...) are invisible from the shipped repo. A retrospective must resolve each record's follow-ups: line to a file and report its state (filed / issued / shipped) — an unstarted follow-up is the most common reason a “merged” phase is not actually finished.
  8. +
  9. Record-vs-reality drift is normal and cheap to detect: both records here claim worktrees still exist that were removed. Check the small factual claims (worktrees, CI run ids, file counts) mechanically before quoting the record to a human.
  10. +
+
+ +
+
+ +
+ +
+ Sources: /tmp/claude-1000/-home-jammy-Code-PyAutoLabs/7130ec3d-8b5a-4b7d-884f-26c6c3f0da1d/scratchpad/packet/REVIEW_PACKET.md
+ /tmp/claude-1000/-home-jammy-Code-PyAutoLabs/7130ec3d-8b5a-4b7d-884f-26c6c3f0da1d/scratchpad/packet/EUCLID_MEMBER.md
+ Figures: .../scratchpad/packet/{refs_v1,slogdet_ab,smc_probe,subhalo_validation}/ +
+ +
+

Ruled 0 of 8 · decisions 0 of 8

+ +
+ + + + +
+
+
+ + diff --git a/batches/packets/AGENTS.md b/batches/packets/AGENTS.md index d59d7d3d6..c0a8eaa19 100644 --- a/batches/packets/AGENTS.md +++ b/batches/packets/AGENTS.md @@ -24,11 +24,8 @@ Rules (2026-08-31): review happens at the laptop. A pointer may stay remote only when the pull cannot fetch it by design, and must say so. -**Visibility — decision pending.** This repository is public. Until the human -rules on public-vs-private for packets (they carry science readouts, run -paths and figures), pages are NOT committed here; the working copies live in -the local Science mirror (e.g. `Science/inference_programme/packets/`). If the -ruling is public, packets land here and the Pages build can serve them; if -private, this folder holds only this doc and the archive stays in a private -home (a private repo, or the Science mirror) with the batch record's `packet:` -field pointing at it. +**Visibility — ruled public, 2026-08-31.** The human ruled packets and reviews +public in this repository, served on its Pages site, aware that the science +numbers, figures and run paths in a packet are thereby on the open internet. +Pages land here as `-.html`; `pages_dashboard.yml` serves +them at `https://pyautolabs.github.io/PyAutoMind/packets/.html`. diff --git a/batches/packets/TEMPLATE.md b/batches/packets/TEMPLATE.md new file mode 100644 index 000000000..e13f83328 --- /dev/null +++ b/batches/packets/TEMPLATE.md @@ -0,0 +1,93 @@ +# Review-packet page template + +Spec for emitting a slot-review page (the surface a `batch collect` — or the session driving one — +hands the human). Reference implementation: `PyAutoMind/batches/packets/2026-08-31-am.html`. + +## File + +- One self-contained HTML file: `PyAutoMind/batches/packets/-.html` + (`` is the human's free-text label, e.g. `am`, `pm`, `night`). +- No wrappers (``/``/``/``): `` first, one `<style>`, markup, + one `<script>` last. One external resource only: the IBM Plex Google-Fonts stylesheet link. +- Figures embedded as base64 data URIs, ≤ 720 px wide, JPEG q80; page ≤ 3 MB. +- The archive URL/path must stay **stable across refreshes** — the page's notes and decisions live + in `localStorage` keyed by origin+page, and a moved file orphans them. + +## Page structure, in order + +1. **Header** — eyebrow (date · lane · what came back), title, one-sentence lede, + mirror-note (where run outputs were pulled locally), stamp line + (`Generated <ts> · refreshed <ts>`), `Permanent home: <code>path</code>`. +2. **Stat tiles** — members by health + `Est. review-minutes <sum>` with the addition shown. +3. **Inputs bar** — `Reviewed at` (text, auto-filled, editable) and `Review-minutes-actual` + (number). Both persist; both go into the submit markdown. +4. **Most-important-finding callout.** +5. **Rulings needed** — a real `<ol>`, one line per decision, each linking to its member. +6. **Members** (sticky sidenav beside them), ordered: failures → rulings-required → clean → + running → retrospectives. Cross-cutting sections and a closed `<details>` of packet-building + notes follow the members. +7. **Fixed submit bar** — live progress (`Ruled r of N · decisions d of N`) + `Submit review`. + +## Member block order + +Question · Witness · Health evidence · Readout (tables in `overflow-x:auto` wrappers; figures) · +**Ruling** (accent border, the one-line decision) · **Your review** (see below) · Follow-ups +(`[repo]`-tagged) · Where to look yourself (`<dl>`; local mirror paths; `RAL only` tag **only** +when the artefact genuinely cannot be mirrored) · Est. review-minutes chip. + +**Your review** = radio chips `Accept / Tweak / Reject / Defer` (first chip renamed to fit the +member: `Leave to finish` for RUNNING, `Structure OK` for merged retrospectives) + one +auto-growing textarea. All state (chips, notes, Ruled ticks, the two top inputs) persists to +`localStorage` under one versioned key, every access in try/catch, saves debounced. + +## PENDING members (evening dispatch → morning fill-in) + +A member whose run had not finished at generation time is emitted as +`<section class="member pending" id="…">` with a `chip-pending` chip reading +`PENDING — refreshed during your read`, showing only Question, Witness and a status line. +The morning refresh **regenerates that section in place** (same `id`, full block set), bumps the +header's `refreshed` stamp, and republishes to the **same path** — never a new file, so stored +notes survive. Never touch other members' markup during a refresh. + +## Submit markdown schema (parse-stable) + +The submit button assembles exactly: + +```markdown +# Batch review <YYYY-MM-DD>-<slot> + +- packet: PyAutoMind/batches/packets/<YYYY-MM-DD>-<slot>.html +- reviewed-at: <free text> +- review-minutes-actual: <integer or (not given)> + +## <member-slug> — <HEALTH> +- decision: accept|tweak|reject|defer|leave-to-finish|structure-ok|UNREVIEWED +- ruled: yes|no + +<note verbatim, or (no note)> + +## Follow-ups accepted +<!-- orchestrator: fill from the tweak notes and the packet's proposed follow-ups --> +``` + +One `## <member-slug> — <HEALTH>` section per member, in page order; slugs are stable +kebab-case identifiers chosen at generation (embed them in the page's `MEMBERS` JS array). +The orchestrator parses on those exact heading forms and the two `- key:` lines. + +Delivery affordances, in this order: **Copy to clipboard** (always works; clipboard API with +`execCommand` fallback), **Download .md** (inert inside a Claude-artifact sandbox — say so in +small print), **Commit on GitHub** — a link to +`https://github.com/PyAutoLabs/PyAutoMind/new/main?filename=batches/reviews/<slot>.md&value=<urlencoded>`, +disabled with a use-Copy hint when the URL exceeds 7,500 chars. Close with: "tell the +orchestrator chat 'review submitted'." The committed file lands at +`PyAutoMind/batches/reviews/<YYYY-MM-DD>-<slot>.md`. + +## Design tokens (brief) + +Light on bare `:root`, dark redefined under `@media (prefers-color-scheme: dark)` guarded +`:root:not([data-theme="light"])` and again under `:root[data-theme="dark"]`; body background +always `var(--ground)`. Ground `#eef1f4` / surface white / ink `#17202b` / accent teal `#0f6e73`; +semantic (separate from accent): failed `#b3261e`, suspect `#a65f00`, healthy `#2c7a4b`, +running `#2f5fc4`, merged `#5b4bb5`, each with a `-soft` tint; dark equivalents lifted for +contrast. Type: IBM Plex Serif (headings) / Sans (body) / Mono (paths, ids, table numerals with +`tabular-nums`). No emoji, no decorative numbering; only real sequences get an `<ol>`. From 879777ed57415465ee40687ebedfaf69b2c1bbea Mon Sep 17 00:00:00 2001 From: Jammy2211 <JNightingale2211@gmail.com> Date: Mon, 31 Aug 2026 13:10:04 -0400 Subject: [PATCH 3/4] epic: reconcile the ledger with development through use; queue the next batch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Development through use — 2026-08-31 section: phase verdicts (collect spec-complete and top of queue, dispatcher deferred, board re-scoped, phase 8 half-shipped via the laptop mirror), what use built that the plan never had, dead-do-not-resurrect list. - Status headers reconciled for shipped 0a/0c prompts. - batch_board.md re-scoped per the human: a Batches strip on the Mind dashboard above 'Start here', small. - witness_campaign.md filed (owned work, human-declared witnesses only). - queue.md gains its first four entries (board, witnesses, collect, euclid Lane recut). - batches/AGENTS.md: expected-effects: — the only licence for 'generated by an earlier member' at leg 4. Dashboard NOT regenerated on this branch: the regen tool writes only to the canonical checkout (attempted; side-effect reverted there). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DxyfT7AWrBrmKQZiRE2HAN --- batches/AGENTS.md | 10 +++ draft/feature/pyautobrain/batch_board.md | 86 +++++++------------ .../pyautobrain/batch_grade_faculty.md | 2 +- .../feature/pyautomind/batch_grade_backlog.md | 2 +- .../pyautomind/two_slot_batching_epic.md | 55 ++++++++++++ draft/feature/pyautomind/witness_campaign.md | 51 +++++++++++ queue.md | 21 ++++- 7 files changed, 171 insertions(+), 56 deletions(-) create mode 100644 draft/feature/pyautomind/witness_campaign.md diff --git a/batches/AGENTS.md b/batches/AGENTS.md index 4197bb573..09e7efbd5 100644 --- a/batches/AGENTS.md +++ b/batches/AGENTS.md @@ -21,6 +21,8 @@ record it. - usage-window-at-dispatch: <5h %, weekly %, opus %> - heart-ack: # the reason set acknowledged FOR THIS SHIFT - <reason line> +- expected-effects: # human-written at dispatch, one line per member with reach + - <member>: <what it may legitimately change, e.g. "merges into PyAutoArray and may stale release validation"> - members: - <slug>: <prompt path> — <tier> — <review-minutes> — <outcome> - collected: 2026-09-04T08:30Z @@ -72,3 +74,11 @@ measured rather than promised — the pair is what the human's own estimates are calibrated against, exactly as `review-minutes-actual:` calibrates the cost. A `review-at:` that passes with nobody there dispatches nothing; the grant just expires. + +**`expected-effects:` is the only licence for "generated by an earlier member".** +Leg 4 lets a new YELLOW reason pass as *generated by an earlier member of this +batch* — but only where it matches an `expected-effects:` line the **human** +wrote here at dispatch. A run classifying a new reason as its sibling's doing on +its own authority is an autonomous acknowledgement, which the hard invariants +forbid (`AUTONOMY.md`, "Leg 4 under a batch launch", 2026-08-31 amendment). No +line, no match, the run parks. diff --git a/draft/feature/pyautobrain/batch_board.md b/draft/feature/pyautobrain/batch_board.md index 88fb4f2ca..60223b845 100644 --- a/draft/feature/pyautobrain/batch_board.md +++ b/draft/feature/pyautobrain/batch_board.md @@ -1,4 +1,4 @@ -# Batch phase 6 — the batch board +# Batch phase 6 — the Batches strip on the Mind dashboard Type: feature Target: pyautobrain @@ -8,72 +8,52 @@ Repos: Themes: - dashboard - mind-workflow -Difficulty: medium +Difficulty: small Autonomy: safe -Priority: normal Status: draft Consequence: judge -Review-minutes: 20 +Review-minutes: 10 Unattended: ready Epic: two-slot-batching Phase: 6 Parent: draft/feature/pyautomind/two_slot_batching_epic.md Filed: 2026-08-30 -The surface the human opens at the top of a slot. The second dashboard: the Mind -dashboard is *everything that could be done*, this is *everything currently in -flight and what it produced*. +**Re-scoped by the human 2026-08-31 (see the epic's "Development through use" +section): not a second published surface.** The batch state is a strip on the +Mind dashboard, placed **above the "Start here" section** — the first thing the +human sees when they open the dashboard. The original standalone-board scope is +recorded in the epic and closed; do not rebuild it. -## The contract +## What the strip renders -Same doctrine as the Brain board: a **thin collect feeding pure renders**, -composing signals that already have an owner, never recomputing and never -mutating. It decides nothing; every chip routes back through a real door. +A single compact "Batches" block, generated by the same collect the dashboard +already runs (`_intake.py` — the markdown section builder near the "## Start +here" emit at `agents/conductors/intake/_intake.py:2027` and its HTML twin at +`:2325`; the strip is emitted immediately before both): -## What it renders +- **Latest packet** — link to the newest `batches/packets/<date>-<slot>.html` + (the Pages URL `https://pyautolabs.github.io/PyAutoMind/packets/…`), with its + `generated:` stamp. +- **Review state** — whether `batches/reviews/<date>-<slot>.md` exists for that + packet: `review submitted` or `awaiting your review`. +- **In-flight batch** — if the newest batch record has no `collected:` yet: its + member count, `review-at:`, and a PENDING note. +- **Archive** — one link to `batches/packets/` (the history). -One card per member of the open batch, ordered **failures first, then -decisions-taken, then clean**: +Pure render over files that already exist; it decides nothing and recomputes +nothing. Every chip routes to the packet, the review file, or the batch record. -- one line: what changed and why -- delivery: PR link, `+n/-m`, files touched -- the four gate legs, each shown as *ran and passed* / *ran and failed* / **did - not run** — never a single green tick. Absence of a finding is not a finding. -- `## Decisions taken` from the PR body, if any (phase 3) -- what the run flagged as uncertain -- actions: **Merge** (`/prm <PR>`), **Tweak** (one line of human text → an agent - drafts the follow-up prompt and puts it at the top of `queue.md`), **Reject** - (route to `condemned.md`) - -Then a footer strip: batch points, delivered count, usage-window reading, and -the backpressure state — is the next batch clear to launch? - -The **Tweak** path is the one that must be one tap. The human types "the guard -should be at the caller, not inside the loop" and never writes a prompt file; -drafting it is the machine's job. - -## Built before the slot, not during it - -A scheduled run 30 minutes before each slot executes `batch collect` and -publishes, so the board is finished when the human opens it. Waiting for a -surface to assemble is exactly the attention cost this epic exists to remove. - -## Where it renders - -Two viable targets; pick by measurement, not taste. - -- **GitHub Pages**, exactly like `dashboard.html` and the Brain board — the - known-good path: phone-first, copy chips, already-solved publishing. -- **A Claude Code Artifact** — available on Pro/Max, published from a session, - updatable in place at a stable URL. The documentation's own first listed use - case is walking a reviewer through a pull request with annotated diffs. - Caveat that decides it: **comments on artifacts require Team/Enterprise**, so - on Max the board can render but cannot collect the human's replies; every - action must still route to GitHub or to a Claude session. +## Not in scope -Default to Pages. Prototype the Artifact only if the Pages version proves too -static. +Review actions (merge/tweak/reject live on the packet page and in the +orchestrator chat), gate-leg rendering, usage-window readings, any scheduled +pre-slot publish. If the strip ever needs its own collect, that is the +`batch collect` verb's job, not the dashboard's. -## Not in scope +## Done when -Review itself. The board orders and presents; the human judges. +- The dashboard (markdown and HTML) opens with the Batches strip above "Start + here", correct with zero packets (strip says so), with a packet awaiting + review, and with an in-flight batch. +- Regen is idempotent and the existing dashboard tests pass. diff --git a/draft/feature/pyautobrain/batch_grade_faculty.md b/draft/feature/pyautobrain/batch_grade_faculty.md index 8314fea0c..525863f3e 100644 --- a/draft/feature/pyautobrain/batch_grade_faculty.md +++ b/draft/feature/pyautobrain/batch_grade_faculty.md @@ -9,7 +9,7 @@ Themes: Difficulty: medium Autonomy: supervised Priority: high -Status: draft +Status: shipped 2026-08-30 — PyAutoBrain main e755ddd (review-cost model in the sizing faculty) Consequence: judge Witness: the grade for a fixed set of sample prompts, pinned as a golden file; plus a case proving no-witness ⇒ judge, and a case proving declared beats derived. Review-minutes: 20 diff --git a/draft/feature/pyautomind/batch_grade_backlog.md b/draft/feature/pyautomind/batch_grade_backlog.md index df9ee9c08..26d13993d 100644 --- a/draft/feature/pyautomind/batch_grade_backlog.md +++ b/draft/feature/pyautomind/batch_grade_backlog.md @@ -11,7 +11,7 @@ Themes: Difficulty: medium Autonomy: safe Priority: high -Status: draft +Status: shipped 2026-08-30 — PyAutoMind main 1a70a6fb, merged via #374 Consequence: notify Witness: the before/after distribution of `Autonomy:`, `Consequence:` and `Unattended:` across every draft prompt, plus `lifecycle.py check` clean and a dashboard regeneration whose only diff is the new pick list and the new facets. Review-minutes: 0 diff --git a/draft/feature/pyautomind/two_slot_batching_epic.md b/draft/feature/pyautomind/two_slot_batching_epic.md index d24d62b22..b1ca89abb 100644 --- a/draft/feature/pyautomind/two_slot_batching_epic.md +++ b/draft/feature/pyautomind/two_slot_batching_epic.md @@ -427,6 +427,57 @@ safe 24 on 63% keyword firing; 31 of 101 ready resolve safe). What did not: library-touching members per slot until `review-minutes-actual:` says otherwise. +## Development through use — 2026-08-31 + +The first review session was run for real (packet `batches/packets/2026-08-31-am.html`), +and use redrew the build order the plan guessed at. Recorded here so the ledger +tracks reality, not the plan-as-imagined. + +**What use built that the plan never had:** the review surface itself — per-member +decisions and notes on the packet page, submit → `batches/reviews/<date>-<slot>.md`; +science-run members scored against pre-registered witnesses (health evidence ≠ +sacct COMPLETED); retrospective members for merged phases the human skipped; the +laptop mirror (`Science/inference_programme/` + `autolens_profiling hpc/sync pull`) +so every pointer is a local path; the public packet archive on Pages; and +`review-at:` (see "Slot timing"). + +**Phase verdicts, measured against what shipped:** + +- **0, 1, 3 — shipped** (0a `PyAutoBrain` main `e755ddd`, 0c `PyAutoMind` main + `1a70a6fb`; status headers reconciled today). +- **2 — `plan` shipped; `collect` is now the top build item and is + spec-complete from use**: the spec is `batches/packets/TEMPLATE.md` plus the + 2026-08-31 packet's "what a `batch collect` for science runs would need to + automate" list (stamp the stack per task at import time; never trust State; + preserve sampler state on reference runs; score against the pre-registered + witness, never the sampler's flag; pull the witness file; diff A/B siblings). + `slice` waits. +- **4 — shadow running**, window closes 2026-09-27. Untouched. +- **5 — dispatcher deferred.** The orchestrator-chat model (one chat plans and + collects; cloud members get their own sessions; local-dev members are + paste-lines, dispatched first in the evening while the laptop is on) + supersedes it in spirit. Revisit only if dispatch tapping becomes the + measured bottleneck. +- **6 — board re-scoped by the human 2026-08-31, and wanted soon:** not a + second published surface — a "Batches" strip near the top of the Mind + dashboard, ABOVE "Start here". Prompt re-cut accordingly + (`draft/feature/pyautobrain/batch_board.md`, now `small`). +- **7 — slimmed**: the 100%-allowance decision stands; the burn-up read is + unbuilt; the one-slot-a-day sizing went with the floor. +- **8 — half-shipped through use**: the mirror + routine pull is a stronger + mechanism than the planned manifest-first transport (full outputs on the + laptop, not manifests). Still owed: leg A, the `Lane:` recut of the remaining + euclid phases. Leg B survives only for the laptop-off cloud-reasoning case. + +**Dead — do not resurrect:** the floor (closed, "Slot timing"); the dispatcher, +for now; the standalone board surface; manifest-first-as-transport. + +**Still live from the independent review:** amendment 1's leg-4 holes (closed in +PyAutoBrain PR #323 alongside this edit: members read the batch record at leg 4; +"generated by an earlier member" must match a human-written `expected-effects:` +line) and amendment 2, the witness campaign — now owned work, +`draft/feature/pyautomind/witness_campaign.md`, queued. + ## Slot timing — 2026-08-31 **Decided: the human declares the review horizon at dispatch; the floor is @@ -461,3 +512,7 @@ a day" sizing assumption that rode along with it goes. - 2026-08-31: slot timing moved to the human — `review-at:` declared at dispatch, the shift is dispatch → `review-at:`, the per-slot budget is the human's, and the floor is closed. See "Slot timing — 2026-08-31". +- 2026-08-31: development through use redrew the build order — collect + spec-complete and top of the queue, dispatcher deferred, board re-scoped to a + dashboard strip, phase 8 half-shipped via the laptop mirror. See "Development + through use — 2026-08-31". diff --git a/draft/feature/pyautomind/witness_campaign.md b/draft/feature/pyautomind/witness_campaign.md new file mode 100644 index 000000000..64b62777f --- /dev/null +++ b/draft/feature/pyautomind/witness_campaign.md @@ -0,0 +1,51 @@ +# Witness campaign — make the backlog reviewable by construction + +Type: feature +Target: pyautomind +Repos: +- PyAutoMind +Themes: +- mind-workflow +Difficulty: medium +Autonomy: safe +Priority: high +Status: draft +Consequence: judge +Review-minutes: 15 +Unattended: ready +Epic: two-slot-batching +Parent: draft/feature/pyautomind/two_slot_batching_epic.md +Filed: 2026-08-31 + +The single highest-leverage item in the batch design, promoted from a fill +remark to owned work (epic, independent review amendment 2). Today 151 of 153 +backlog prompts grade `judge` because they carry no `Witness:`; the epic's dry +run showed a witnessed backlog grades 33/104/16 — the whole distance between +two-member batches and real ones. The 2026-08-31 review session measured the +same thing from the other side: the members that reviewed in minutes were the +ones with pre-registered witnesses. + +## The work + +Sweep the `Unattended: ready` prompts in `draft/`, adding a `Witness:` line — +a machine-checkable claim whose truth makes the task reviewable in minutes +("ids bit-identical", "31-rule byte-equality", "smoke suite green with the new +default", "Δlog-evidence < 5") — in batches of ~15 prompts per pass, proposed +to the human for approval before any header is written. + +**The no-invention rule stands and is the whole point: witnesses are +human-declared.** A pass proposes candidate witnesses where the prompt's own +text implies one; the human accepts, edits, or strikes each. A prompt whose +witness cannot be stated stays `judge` — that is a finding about the prompt, +not a failure of the sweep. + +This is fill work: zero review-minutes at dispatch (the review is the human's +accept/strike pass, which is the approval itself), and it directly grows every +future batch. + +## Done when + +- Every `Unattended: ready` prompt either carries a human-approved `Witness:` + or a one-line `Witness: none —` reason. +- The regrade (`sizing` faculty) is re-run and the glance/notify counts are + recorded in the epic ledger. diff --git a/queue.md b/queue.md index 90303c88c..677ba7101 100644 --- a/queue.md +++ b/queue.md @@ -45,4 +45,23 @@ endpoint, or the human at the machine. A cloud session detects its own lane and will not plan the other one — it reports the count instead, so nothing is silently dropped. One queue holds both lanes; the planner filters. -<!-- No entries yet. Add them in the slot, in the order you want them. --> +## 1. Batches strip on the dashboard +- kind: prompt +- ref: draft/feature/pyautobrain/batch_board.md +- note: human 2026-08-31 — important, do soon; strip above "Start here", not a standalone surface + +## 2. Witness campaign +- kind: prompt +- ref: draft/feature/pyautomind/witness_campaign.md +- note: highest-leverage backlog item (151/153 judge); human-declared witnesses only; fill work + +## 3. batch collect +- kind: prompt +- ref: draft/feature/pyautobrain/batch_conductor.md +- note: next verb = collect; spec = batches/packets/TEMPLATE.md + the 2026-08-31 packet's collect-needs list + +## 4. Euclid Lane: recut +- kind: prompt +- ref: draft/research/euclid/batch_science_lane.md +- note: leg A only — Lane: header on every remaining euclid phase, queue the `any` halves + From f9a20c808d2eccc97a46e91bb9b8e1f71066da91 Mon Sep 17 00:00:00 2001 From: Jammy2211 <JNightingale2211@gmail.com> Date: Mon, 31 Aug 2026 13:18:31 -0400 Subject: [PATCH 4/4] mind: regenerate dashboard for the review-surface branch (refresh check) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DxyfT7AWrBrmKQZiRE2HAN --- dashboard.html | 11 +++++++---- dashboard.md | 22 ++++++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/dashboard.html b/dashboard.html index cb300cda6..b33a433da 100644 --- a/dashboard.html +++ b/dashboard.html @@ -222,7 +222,7 @@ </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="M20.2,37.6 L20.2,33.6 C20.2,32.4 19.4,31.6 18.4,30.8 C16.8,29.6 15.8,28.2 15.6,26.6 C15.5,25.6 14.9,25.2 13.9,24.9 C12.6,24.5 12.3,23.7 13.0,22.7 C13.8,21.6 14.5,20.6 14.6,19.4 C15.0,15.4 18.2,12.2 22.4,11.8 C27.2,11.3 31.6,14.6 32.3,19.2 C32.8,22.4 31.6,25.0 30.6,27.0 C29.9,28.4 29.6,29.6 29.6,31.2 L29.6,37.6"/><circle cx="24.6" cy="19.6" r="4.4"/><path d="M22.5,19.7 L24.0,21.3 L26.8,18.1"/><path d="M34.2,16.5 L38.8,16.5 M35.2,21.0 L39.4,21.0 M33.6,25.5 L37.2,25.5"/><g fill="currentColor" stroke="none"><circle cx="40.1" cy="16.5" r="1.4"/><circle cx="40.7" cy="21.0" r="1.4"/><circle cx="38.5" cy="25.5" r="1.4"/></g></svg></span><h1>PyAuto<b>Mind</b><span class="kind">Dashboard</span></h1><div class="rule"></div><p class="tag">Intent. Priority. Flow.</p></header><p class="lede">Every task the Mind is holding. Tap a task's 📋 and its <code>/start_dev</code> command is on your clipboard — paste it into a Claude Code chat to route Claude straight to that task. <a href="#recent">Recent</a> is the same work by date — what has been happening rather than what to do next.</p> -<ul class="stats"><li><b>0</b><span>In flight</span></li><li><b>2</b><span>Human review</span></li><li><b>3</b><span>Parked</span></li><li><b>5</b><span>Planned</span></li><li><b>153</b><span>Backlog</span></li></ul> +<ul class="stats"><li><b>0</b><span>In flight</span></li><li><b>2</b><span>Human review</span></li><li><b>3</b><span>Parked</span></li><li><b>5</b><span>Planned</span></li><li><b>154</b><span>Backlog</span></li></ul> <div class="fresh"><p><b>Last updated 2026-08-31.</b> This page is generated from <code>active/</code>, <code>draft/</code> and the registry files, so it is only as current as they are. <code>dashboard_refresh.yml</code> re-renders it on every push to <code>main</code> — that heals a stale page, but not a stale prompt: a task that shipped without its prompt advancing to <code>complete/</code> keeps rendering here as pickable backlog. Reconciling those is the refresh below.</p> <div class="task"><button class="copy" data-cmd="Bring the PyAutoMind dashboard up to date. Work in the PyAutoMind checkout: @@ -255,7 +255,9 @@ <ul> <li><code>draft/feature/pyautobrain/batch_conductor.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> <li><code>draft/feature/pyautobrain/batch_gate_unattended.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> +<li><code>draft/feature/pyautobrain/batch_grade_faculty.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> <li><code>draft/feature/pyautobrain/batch_grade_intake.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> +<li><code>draft/feature/pyautomind/batch_grade_backlog.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> <li><code>draft/feature/pyautomind/batch_queue_and_records.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)</code></li> </ul> <h2>Start here</h2> @@ -335,7 +337,7 @@ <h2>Planned <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob <div class="task"><button class="copy" data-cmd="/route start the planned PyAutoMind task latent-nan-guard-honest-run — its record is in planned.md" aria-label="Copy the Claude command">📋</button><p><b>latent-nan-guard-honest-run</b><span class="facets"> — planned 2026-07-22</span></p></div> </details> <h2>Backlog <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/tree/main/draft">markdown version</a></h2> -<p class="muted">153 filed prompts, not started — sorted most-pickable first (priority, then size). 46 of them belong to an epic and are listed only under Epics below.</p> +<p class="muted">154 filed prompts, not started — sorted most-pickable first (priority, then size). 47 of them belong to an epic and are listed only under Epics below.</p> <details> <summary>feature — 27</summary> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/autofit/prior_exit_sampler_coverage.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/autofit/prior_exit_sampler_coverage.md">Which other searches need prior-support handling — coverage audit after Prodigy</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">autofit</span><span class="pill n">medium</span><span class="pill g">safe</span><span class="pill n">medium</span></span></p></div> @@ -1205,7 +1207,7 @@ <h2>Epics <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob/m <div class="task"><button class="copy" data-cmd="/start_dev draft/test/pyautoheart/euclid_pipeline_release_blocking_gate.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/test/pyautoheart/euclid_pipeline_release_blocking_gate.md">Make the Euclid pipeline's new CI release-blocking and add…</a><span class="tags"><span class="pill w">🧪 test</span><span class="pill">pyautoheart</span><span class="pill n">small</span><span class="pill g">safe</span><span class="pill n">medium</span></span></p></div> </details> <details> -<summary>Two slots a day — the batch workflow — 12 queued prompt(s), in order</summary> +<summary>Two slots a day — the batch workflow — 13 queued prompt(s), in order</summary> <div class="task"><button class="copy" data-cmd="Continue the 'Two slots a day — the batch workflow' epic. Its canonical state lives in draft/feature/pyautomind/two_slot_batching_epic.md — read that ledger (and any DECISIONS/RESULTS files beside it) first. Cross-check this epic's entry in PyAutoMind/epics.md, any related rows in PyAutoMind/active.md, and the referenced repos' open issues and PRs, to work out the last completed phase and what is currently in flight. Then pick the next logical step and continue it through the normal workflow (/start_dev — filing the phase's prompt first if none exists), updating the ledger as the work advances. Note: 11 phased prompts (0a/0b/0c, then 1-8) across draft/feature/pyautomind/," aria-label="Copy the Claude command">📋</button><p><b>Two slots a day — the batch workflow</b> — <span class="facets">ledger: <code>draft/feature/pyautomind/two_slot_batching_epic.md</code></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_grade_faculty.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_grade_faculty.md">Batch phase 0a — the review-cost grader (sizing faculty)</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill n">medium</span><span class="pill n">supervised</span><span class="pill r">high</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_grade_intake.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_grade_intake.md">Batch phase 0b — intake writes the grades, and the autonomy experiment</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill n">medium</span><span class="pill g">safe</span><span class="pill r">high</span></span></p></div> @@ -1215,10 +1217,11 @@ <h2>Epics <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob/m <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_gate_unattended.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_gate_unattended.md">Batch phase 3 — the gate under unattended conditions</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill y">large</span><span class="pill r">human-required</span><span class="pill r">high</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_notify_tier_merge.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_notify_tier_merge.md">Batch phase 4 — the tier-A merge tier: shadow window…</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill n">medium</span><span class="pill r">human-required</span><span class="pill r">high</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_dispatch.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_dispatch.md">Batch phase 5 — dispatch</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill y">large</span><span class="pill n">supervised</span><span class="pill n">normal</span></span></p></div> -<div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_board.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_board.md">Batch phase 6 — the batch board</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill n">medium</span><span class="pill g">safe</span><span class="pill n">normal</span></span></p></div> +<div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/batch_board.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautobrain/batch_board.md">Batch phase 6 — the Batches strip on the Mind dashboard</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautobrain</span><span class="pill n">small</span><span class="pill g">safe</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautomind/batch_budget_loop.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautomind/batch_budget_loop.md">Batch phase 7 — spend the whole allowance</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautomind</span><span class="pill n">medium</span><span class="pill n">supervised</span><span class="pill n">normal</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/research/euclid/batch_science_lane.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/euclid/batch_science_lane.md">Batch phase 8 — the laptop lane</a><span class="tags"><span class="pill w">🔬 research</span><span class="pill">euclid</span><span class="pill n">medium</span><span class="pill g">safe</span><span class="pill n">normal</span></span></p></div> <div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautomind/two_slot_batching_epic.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautomind/two_slot_batching_epic.md">Two slots a day — the batch workflow</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautomind</span><span class="pill r">too-large</span><span class="pill n">supervised</span><span class="pill r">high</span></span></p></div> +<div class="task"><button class="copy" data-cmd="/start_dev draft/feature/pyautomind/witness_campaign.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/pyautomind/witness_campaign.md">Witness campaign — make the backlog reviewable by construction</a><span class="tags"><span class="pill w">✨ feature</span><span class="pill">pyautomind</span><span class="pill n">medium</span><span class="pill g">safe</span><span class="pill r">high</span></span></p></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="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="memory" href="https://pyautolabs.github.io/PyAutoMemory/">Memory</a></li><li><a data-organ="organism" href="https://pyautolabs.github.io/PyAutoScientist/">Scientist</a></li></ul> <script>async function copyCmd(b){ diff --git a/dashboard.md b/dashboard.md index 13f923463..5288a814d 100644 --- a/dashboard.md +++ b/dashboard.md @@ -46,13 +46,15 @@ anything you could not verify. | [Human review](#human-review) (`draft/human_review/`) | 2 | | [Parked](#parked) (`parked.md`) | 3 | | [Planned](#planned) (`planned.md`) | 5 | -| [Backlog](#backlog) (`draft/`) | 153 | +| [Backlog](#backlog) (`draft/`) | 154 | > ⚠️ **Needs lifecycle reconciliation** — these draft prompts record a fix PR in their body: the work looks done, but the prompt never advanced, so it still renders as backlog: > - `draft/feature/pyautobrain/batch_conductor.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` > - `draft/feature/pyautobrain/batch_gate_unattended.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` +> - `draft/feature/pyautobrain/batch_grade_faculty.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` > - `draft/feature/pyautobrain/batch_grade_intake.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` +> - `draft/feature/pyautomind/batch_grade_backlog.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` > - `draft/feature/pyautomind/batch_queue_and_records.md — its own `Status:` says shipped, but the prompt never left draft/ (reconcile its lifecycle)` ## Start here @@ -389,7 +391,7 @@ Scoped but not started; some are not yet prompt files. Full detail in [`planned. ## Backlog -**153** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **46** of them belong to an epic and are listed only under [Epics](#epics) below. +**154** filed prompts, not started. Each section is sorted most-pickable first (priority, then size). **47** of them belong to an epic and are listed only under [Epics](#epics) below. <details> <summary><b>feature</b> — 27</summary> @@ -1993,7 +1995,7 @@ Continue the 'Euclid DR1 preparation — 15k-lens modelling prep' epic. Its cano </details> <details> -<summary><b>Two slots a day — the batch workflow</b> — 12 queued prompt(s), in order</summary> +<summary><b>Two slots a day — the batch workflow</b> — 13 queued prompt(s), in order</summary> <details><summary>📋 <b>Two slots a day — the batch workflow</b> — ledger: `draft/feature/pyautomind/two_slot_batching_epic.md`</summary> @@ -2067,7 +2069,7 @@ Continue the 'Two slots a day — the batch workflow' epic. Its canonical state </details> -<details><summary>📋 <a href="draft/feature/pyautobrain/batch_board.md">Batch phase 6 — the batch board</a> — pyautobrain · medium · safe · normal</summary> +<details><summary>📋 <a href="draft/feature/pyautobrain/batch_board.md">Batch phase 6 — the Batches strip on the Mind dashboard</a> — pyautobrain · small · safe</summary> ``` /start_dev draft/feature/pyautobrain/batch_board.md @@ -2099,6 +2101,14 @@ Continue the 'Two slots a day — the batch workflow' epic. Its canonical state </details> +<details><summary>📋 <a href="draft/feature/pyautomind/witness_campaign.md">Witness campaign — make the backlog reviewable by construction</a> — pyautomind · medium · safe · high</summary> + +``` +/start_dev draft/feature/pyautomind/witness_campaign.md +``` + +</details> + </details> ## Hygiene @@ -2114,7 +2124,7 @@ Continue the 'Two slots a day — the batch workflow' epic. Its canonical state </details> -150 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time. +151 prompt(s) with no `Witness:` — the machine-checkable claim that would make the work reviewable in minutes. Absent, a prompt grades `judge` (a PI's quarter-hour) whatever its size, which is the intended default and not a bug. Nothing derives or backfills a witness — an invented one is plausible prose with nothing behind it — so this is a human writing one, a prompt at a time. <details> <summary>Prompts with no witness</summary> @@ -2159,7 +2169,7 @@ Continue the 'Two slots a day — the batch workflow' epic. Its canonical state - `draft/feature/pyautomind/batch_budget_loop.md` - `draft/feature/pyautomind/batch_queue_and_records.md` - `draft/feature/pyautomind/bundle_nightly_claude_pass.md` -- _… and 110 more_ +- _… and 111 more_ </details>