You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
prompt: complete claude-session-python-312-default — 35/37 repos on 3.12
Every Claude Code web/mobile session container now defaults to Python
3.12 instead of the image's 3.11, in 35 of the 37 repos in the body map:
one canonical policy/session_start_hook.sh, installed and drift-checked
by repos_sync.py, carrying blob f2d3154 identically everywhere.
Records what shipped, what was deliberately left alone (the /usr/bin
alternatives — conan is 3.11-only there), and the two repos this
session's credential cannot reach (euclid_assistant, admin_jammy), which
stay on 3.11 until someone with access runs --write against a checkout.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NcfSv6NpEuQcApGCZME3uW
- issue: none — filed, planned and shipped inside one mobile session (2026-08-25); no GitHub issue was opened.
2
+
- completed: 2026-08-25
3
+
- prompt: draft/maintenance/ci/claude_session_python_311_default.md (audit + plan; removed by this record)
4
+
- what shipped: every Claude Code web/mobile session container now runs Python 3.12 instead of the image's 3.11 default, in 35 of the 37 repos in `repos.yaml`. `policy/session_start_hook.sh` is the single source; `scripts/repos_sync.py --write` installs it as `<repo>/.claude/hooks/session-start.sh` (mode 100755) plus a `.claude/settings.json` SessionStart registration, and `--check` fails on a missing, non-executable, edited or unregistered copy ("session-start hooks (generated)"). Same one-source/N-copies shape as `policy/never_rewrite_history.md`. Every repo carries blob f2d3154 — identical everywhere by construction.
5
+
- what the hook does, on three surfaces: (1) a 3.12 venv at `$HOME/.pyauto/session-py312` first on PATH — `python`, `python3`, `pip`, `pytest`; (2) `/usr/local/bin/python{,3}` repointed at 3.12, so a subprocess with a scrubbed environment gets 3.12 too; (3) the uv-managed tools (black, flake8, mypy, poetry, pyright, ruff) rebuilt on 3.12 **pinned to their installed versions** — an unpinned `uv tool install --force` moved mypy 1.19 -> 2.3 on the first run, a lint-behaviour change riding in on a Python upgrade.
6
+
- deliberately NOT touched: the `update-alternatives` links under `/usr/bin`. Scripts with a literal `#!/usr/bin/python3` shebang follow those, and some image tools (conan) are installed for 3.11 only — flipping breaks them for no gain the three surfaces above don't already give. Verified after the change: `conan --version` still works.
7
+
- why it mattered: the container's `pytest` was a uv tool on 3.11 with **no PyYAML**, so the Brain suite could not even be collected (`agents/faculties/sizing/_sizing.py` reads the body map at import). Sessions were the organism's only 3.11 surface — Mind CI runs 3.12/3.13, Brain CI 3.12+3.13 — i.e. the place code is written sat below the floor its own gates enforce.
8
+
- the image's own switcher is a trap: `use-python 3.12` moves the alternatives under `/usr/bin` and prints `Switched to Python 3.12` followed by its own check reading `Python 3.11.15`, because `/usr/local/bin/python{,3}` (PATH slot 10) shadow `/usr/bin` (slot 12). Measured, not inferred.
9
+
- per-repo dependencies: a repo needing more than pytest + PyYAML declares them in its own `.claude/session-python.txt` (one pip argument per line; `-e .`, a spec, `-r requirements.txt`), which the hook installs additively into the shared venv behind a checksum marker. Deliberately outside the hook so the copies stay byte-identical and the drift check stays meaningful. No repo declares one yet — that is the open follow-up for the library/workspace repos, whose suites need more than the base pair.
10
+
- validation: cold run 16.7s, warm rerun 0.6s (second repo in the same session); after it, `python3`/`python`/`pip`/`pytest`/`black`/`flake8`/`mypy`/`poetry`/`pyright`/`ruff` all report 3.12 and `python3 -m venv` builds 3.12 venvs. Mind 197 passed (10 new drift-check tests, each proven to fail against the unfixed state), Brain 494 passed — the latter having been uncollectable on 3.11. Remote spot-check: mode 100755 survived the push.
11
+
- NOT covered — needs access, not work: `euclid_assistant` and `admin_jammy` (2 of 37) — this session's GitHub credential has no access to either, so their sessions stay on 3.11 until someone with access runs `repos_sync.py --write` against a checkout.
12
+
- follow-ups (unclaimed): (i) `.claude/session-python.txt` for the library and workspace repos once someone measures a real install (JAX/numpy sets will not be free at session start, and may want async mode); (ii) an environment-level setup script on the Claude Code web environment would make the per-repo file unnecessary — worth checking whether that surface exists before the next repo joins the map; (iii) a new repo added to `repos.yaml` gets the hook only when someone runs `--write` with it checked out — the drift check catches the omission but only for checked-out repos.
-[circular-ell-comps-image-gradient](2026/08/circular-ell-comps-image-gradient.md) — Replaced the Sersic image path's Cartesian-to-polar ellipticity conversion with an algebraically equivalent Ca…
Copy file name to clipboardExpand all lines: dashboard.html
+10-11Lines changed: 10 additions & 11 deletions
Original file line number
Diff line number
Diff line change
@@ -185,7 +185,7 @@
185
185
</head>
186
186
<body>
187
187
<headerclass="hero"><spanclass="orb"><svgclass="mark" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circlecx="24" cy="24" r="20.4"/><pathd="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"/><circlecx="24.6" cy="19.6" r="4.4"/><pathd="M22.5,19.7 L24.0,21.3 L26.8,18.1"/><pathd="M34.2,16.5 L38.8,16.5 M35.2,21.0 L39.4,21.0 M33.6,25.5 L37.2,25.5"/><gfill="currentColor" stroke="none"><circlecx="40.1" cy="16.5" r="1.4"/><circlecx="40.7" cy="21.0" r="1.4"/><circlecx="38.5" cy="25.5" r="1.4"/></g></svg></span><h1>PyAuto<b>Mind</b><spanclass="kind">Dashboard</span></h1><divclass="rule"></div><pclass="tag">Intent. Priority. Flow.</p></header><pclass="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. <ahref="#recent">Recent</a> is the same work by date — what has been happening rather than what to do next.</p>
<divclass="fresh"><p><b>Last updated 2026-08-25.</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>
190
190
<divclass="task"><buttonclass="copy" data-cmd="Bring the PyAutoMind dashboard up to date. Work in the PyAutoMind checkout:
<divclass="task"><buttonclass="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><spanclass="facets"> — planned 2026-07-22</span></p></div>
<pclass="muted">141 filed prompts, not started — sorted most-pickable first (priority, then size). 25 of them belong to an epic and are listed only under Epics below.</p>
254
+
<pclass="muted">140 filed prompts, not started — sorted most-pickable first (priority, then size). 25 of them belong to an epic and are listed only under Epics below.</p>
255
255
<details>
256
256
<summary>feature — 27</summary>
257
257
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/feature/autoarray/numba_cpu_likelihood_mge_convolution_and_caching.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/feature/autoarray/numba_cpu_likelihood_mge_convolution_and_caching.md">Numba CPU likelihood phase 1: batched MGE convolution + operated-matrix caching</a><spanclass="tags"><spanclass="pill w">✨ feature</span><spanclass="pill">autoarray</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill r">high</span></span></p></div>
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/bug/autolens/interferometer_release_leg_oom.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/bug/autolens/interferometer_release_leg_oom.md">interferometer/start_here.py OOM in nightly release-validation integrate leg</a><spanclass="tags"><spanclass="pill w">🐛 bug</span><spanclass="pill">autolens</span></span></p></div>
309
309
</details>
310
310
<details>
311
-
<summary>maintenance — 26</summary>
311
+
<summary>maintenance — 25</summary>
312
312
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/autocti_workspace_navigator_check.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/autocti_workspace_navigator_check.md">autocti_workspace has no Navigator Check, so its CI can never roll…</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill r">high</span></span></p></div>
313
313
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/libraries/untrack_generated_fits_test_artifacts.md">Untrack the generated FITS test artifacts in autoarray</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">libraries</span><spanclass="pill n">small</span><spanclass="pill n">supervised</span><spanclass="pill n">medium</span></span></p></div>
314
314
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/smoke_install_stale_jax_pin.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/smoke_install_stale_jax_pin.md">smoke_install.sh's stale <code>jax<0.7</code> pin — CI is on the right jax…</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">low</span><spanclass="pill n">supervised</span><spanclass="pill n">medium</span></span></p></div>
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/workspaces/unpark_imaging_scaling_relation_slam.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/workspaces/unpark_imaging_scaling_relation_slam.md">Un-park imaging/features/scaling_relation/slam once PyAutoArray#431 merges</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">workspaces</span><spanclass="pill n">small</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
320
320
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/workspaces/unpark_multi_galaxy_scaling_relation_slam.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/workspaces/unpark_multi_galaxy_scaling_relation_slam.md">Un-park multi_galaxy/features/scaling_relation/slam once a capped run passes</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">workspaces</span><spanclass="pill n">small</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
321
321
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/autolens_workspace_developer/stale_api_rot_audit.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/autolens_workspace_developer/stale_api_rot_audit.md">autolens_workspace_developer: broad stale-API rot (56 symbols, no CI)</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">autolens_workspace_developer</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
322
-
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/claude_session_python_311_default.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/claude_session_python_311_default.md">Claude web/mobile session containers default to Python 3.11 — below the organism's…</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
323
322
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/heart_smoke_table_autocti.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/heart_smoke_table_autocti.md">Heart's local smoke runner cannot run any CTI workspace — no autocti…</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
324
323
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/run_smoke_copy_drift.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/run_smoke_copy_drift.md">run_smoke.py: three runner variants across 10 repos, no sync mechanism</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
325
324
<divclass="task"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/wiki_currency_check_version_gate.md" aria-label="Copy the Claude command">📋</button><p><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/wiki_currency_check_version_gate.md">wiki-currency's --check-version gate rots on every library main merge</a><spanclass="tags"><spanclass="pill w">🧹 maintenance</span><spanclass="pill">ci</span><spanclass="pill n">medium</span><spanclass="pill n">supervised</span><spanclass="pill n">normal</span></span></p></div>
<pclass="muted">The 50 newest things to happen to the work in hand, newest first — issued, parked, filed. Every other section on this page is laid out by state, which is exactly why none of them can answer “what has been happening?”. Shipped work is not here: it is read from <code>complete/index.md</code>, and a thousand records deep it would crowd out everything anyone can still act on. Showing the newest 10; … opens the next 10.</p>
400
399
<tableclass="recent">
401
400
<tr>
402
-
<tdclass="when">2026-08-25</td>
403
-
<tdclass="what">filed</td>
404
-
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/claude_session_python_311_default.md">Claude web/mobile session containers default to Python 3.11 — below…</a></td>
405
-
<tdclass="pick"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/ci/claude_session_python_311_default.md" aria-label="Copy the Claude command">📋</button></td>
406
-
</tr>
407
-
<tr>
408
401
<tdclass="when">2026-08-24</td>
409
402
<tdclass="what">filed</td>
410
403
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/ci/wiki_currency_check_version_gate.md">wiki-currency's --check-version gate rots on every library main merge</a></td>
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/workspaces/pynufft_removal_downstream_residue.md">pynufft removal: unswept downstream residue (1 hard break + stale…</a></td>
459
452
<tdclass="pick"><buttonclass="copy" data-cmd="/start_dev draft/maintenance/workspaces/pynufft_removal_downstream_residue.md" aria-label="Copy the Claude command">📋</button></td>
460
453
</tr>
461
-
<trhidden>
454
+
<tr>
462
455
<tdclass="when">2026-08-23</td>
463
456
<tdclass="what">filed</td>
464
457
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/maintenance/workspaces/pynufft_removal_downstream_residue_phase_3_ci_install_docs.md">Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI…</a></td>
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/triage/nightly_release_blocked_eight_nights.md">Nightly release has been blocked 8 nights running — triage the streak</a></td>
699
692
<tdclass="pick"><buttonclass="copy" data-cmd="/start_dev draft/triage/nightly_release_blocked_eight_nights.md" aria-label="Copy the Claude command">📋</button></td>
700
693
</tr>
694
+
<trhidden>
695
+
<tdclass="when">2026-08-04</td>
696
+
<tdclass="what">filed</td>
697
+
<td><ahref="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/docs/howtolens/ch4_mask_overlay_never_drawn.md">HowToLens ch4 tutorial 3: mask overlay is never actually drawn</a></td>
698
+
<tdclass="pick"><buttonclass="copy" data-cmd="/start_dev draft/docs/howtolens/ch4_mask_overlay_never_drawn.md" aria-label="Copy the Claude command">📋</button></td>
699
+
</tr>
701
700
</table>
702
701
<buttonclass="more" data-page="10">… 10 more (40 left)</button>
0 commit comments