diff --git a/active.md b/active.md index a3234376..7e67cf98 100644 --- a/active.md +++ b/active.md @@ -1,21 +1,5 @@ # Active Tasks -## board-github-data-seam -- issue: https://github.com/PyAutoLabs/PyAutoBrain/issues/303 (issued 2026-08-27) -- issued: 2026-08-27 -- prompt: active/board_without_gh_phase1_seam.md -- status: library-dev — not started; routed by /start_dev, no worktree claimed yet - (this session is remote: no ~/Code/PyAutoLabs-wt, so /start_library runs on the - machine that picks the task up). -- worktree: ~/Code/PyAutoLabs-wt/board-github-data-seam/ (to be created by /start_library) -- repos: PyAutoBrain -- phase: 1 of 2 — phase 2 is draft/feature/pyautobrain/board_without_gh_phase2_legs.md, - blocked-by this one; parent design + probe evidence in - draft/feature/pyautobrain/board_without_gh.md -- why: the board is the morning door and eleven legs are dark on the surface it is - read from. The 2026-08-27 probe closed the two cheaper options — $GH_TOKEN 403s - every repo path — so the injection seam is the design. - ## transformed-message-factor-gradient-unpack - issue: https://github.com/PyAutoLabs/PyAutoFit/issues/1501 (issued 2026-08-19) - issued: 2026-08-19 diff --git a/active/board_without_gh_phase1_seam.md b/active/board_without_gh_phase1_seam.md deleted file mode 100644 index 4b4d6417..00000000 --- a/active/board_without_gh_phase1_seam.md +++ /dev/null @@ -1,47 +0,0 @@ -# Board phase 1: the injection seam, proven on the overnight legs - -Type: feature -Target: pyautobrain -Repos: -- PyAutoBrain -Difficulty: medium -Autonomy: supervised -Priority: normal -Status: formalised -Filed: 2026-08-27 -Issued: 2026-08-27 -Parent: draft/feature/pyautobrain/board_without_gh.md - -Phase 1 of the board's gh-less work. The parent prompt holds the design, the -measurements and the 2026-08-27 probe that selected this option; read it first -and do not re-derive them. - -## Scope - -Build the seam and prove it on **one** leg family — the seven `overnight: -could not read /` rows, the largest block of the eleven. - -- `board/_board.py` accepts pre-fetched GitHub JSON (`--github-data `), - and `gh_json()` reads from it when present. The `gh` path is untouched, so a - dev box behaves exactly as today. -- The `/board` skill — which *is* the agent, and so is the only thing that can - call `mcp__github__*` — gathers that JSON when `command -v gh` fails, writes - it, and invokes the renderer with the flag. `_board.py` stays a pure - renderer; a subprocess cannot reach MCP tools and this is the whole reason - the seam exists. -- The file's shape is a documented contract in `board/AGENTS.md` (extend - "Reading the board in a remote session"), because it outlives whoever writes - it. - -## Guards - -- Tests drive the seam from a **fixture file**, never a live call. -- A leg with no injected data still reports `could not read` — the invariant - from the 2026-08-26 work: no leg may substitute an empty answer for an - unasked question. A green badge still requires a render that read everything. - -## Done when - -The overnight rows are live in a remote render, the degraded count drops by -seven, the dev-box path is byte-identical, and `tests/test_board_degraded.py` -plus the new fixture tests pass. diff --git a/complete/2026/08/board-github-data-seam.md b/complete/2026/08/board-github-data-seam.md new file mode 100644 index 00000000..76964b61 --- /dev/null +++ b/complete/2026/08/board-github-data-seam.md @@ -0,0 +1,157 @@ +- completed: 2026-08-27 +- issue: https://github.com/PyAutoLabs/PyAutoBrain/issues/303 (closed) +- prs: + - https://github.com/PyAutoLabs/PyAutoBrain/pull/305 (merged, `ef887f8`) +- classification: feature (PyAutoBrain; phase 1 of 2) +- summary: | + The Brain board is the morning door, and on the surface it is actually read + from — a session on a phone — eleven of its legs were dark: they read GitHub + through `gh api`, and a remote session has no `gh`. Phase 1 gives the + renderer a way to be handed what it cannot fetch, and proves it on the seven + overnight rows. + +## The shape, and why it is a seam + +`mcp__github__*` is an **agent** capability. `board/_board.py` is a subprocess +and cannot reach it however it is invoked — which is why "port the board to +MCP" was never a substitution and always a seam: + +``` +pyauto-brain board --github-data # {endpoint: response} +``` + +Keyed by the endpoint string exactly as `gh_json()` receives it, so injected and +live data are interchangeable by construction rather than by convention: a key +that drifts from its call site simply misses, and a miss is a state the board +already renders honestly. The `gh` path is untouched — no flag, no injected map, +identical behaviour on a developer box. + +The `/board` skill (which *is* the agent) gathers when `command -v gh` fails, +writes the file, and invokes the renderer. The file's shape is a documented +contract in `board/AGENTS.md`, because it outlives whoever wrote it. + +## The three rules, all one invariant + +Restatements of what the 2026-08-26 degraded-render work established: + +1. A **miss is *could not ask*** (`None`) — never an empty answer. That is + exactly how a board goes green by never looking. +2. An explicit **`null` means the gatherer's own fetch failed** — same outcome, + stated rather than implied. `{"workflow_runs": []}` is the opposite: a real + answer that happens to be empty. +3. A **malformed or missing file is fatal, not degrading.** Every leg reading + `could not read` renders as a GitHub outage; if the truth is that the + gatherer wrote a broken file, the board must say so instead. + +## Key traps + +- **The contract includes the field names.** Store each response as GitHub + returns it. The overnight row's age reads `created_at`; the first + hand-written fixture used `updated_at`, and the row rendered `success (?)` — + which reads as a rendering bug rather than a bad input file. Documented in + both places and asserted in the tests, because the next gatherer will guess + the same way. + +- **Phase 0 was a probe, not a design.** The prompt offered three options and + said to probe before building; the probe (2026-08-27) returned 200 on `/user` + and `/rate_limit` and **403 on every repo-scoped path**, which killed options + 2 and 3 and selected this one. Recorded in the parent prompt so the next + session starts at the design. If an org admin ever connects the Claude GitHub + App, `gh_json()` becomes a plain REST helper on every surface and this seam is + deletable — which is why it is small. + +- **Proved on the surface it exists for.** The end-to-end check ran in this + session, which has no `gh`: one injected endpoint rendered + `✓ PyAutoLabs/PyAutoBrain/nightly-release.yml — success (6h)` with its run + link while the six uninjected legs still said `could not read`, and the render + stayed degraded and non-green. + +- **PyAutoMind's PR-open event fired no workflows — twice, in one session.** + Both close-out PRs (#354, #357) showed **zero** check runs at open, on diffs + matching three path filters plus `spawn_drift.yml`, which has none. Actions + was healthy throughout: other PRs on the repo ran normally in the same + minutes, and a `workflow_dispatch` started instantly. #354 recovered the + moment an unrelated push produced a `synchronize` event, which fired all four + at once. + + The 2026-08-26 record logged this as a one-off GitHub-side miss; at two + occurrences it is worth treating as a repeatable condition on this repo + rather than a blip, and the response is the one that record named: **verify + by dispatch, never merge unchecked**. Note that only `firewall_gate.yml` is + safely dispatchable here — `lifecycle_drift.yml` and `dashboard_refresh.yml` + self-heal `main` on a manual dispatch (they reset to `origin/main` and push), + so dispatching them proves nothing about the branch and writes to main. + Where they cannot be dispatched, run their commands locally — they are the + same four: `lifecycle.py check`, `lifecycle.py index --check`, + `registry_toc.py --check`, `intake dashboard --check`. + +## Validation + +569 PyAutoBrain tests (`-n auto`), `ruff` clean. 8 new tests, fixture-driven, +with `BOARD_GH` pointed at a nonexistent command so a leak to a live `gh` fails +loudly rather than answering. + +## Scope note + +A full seven-row live render was not demonstrable from the shipping session: +three of the watched repos (PyAutoHeart, PyAutoHands, autolens_assistant) were +outside its repository scope, so the gatherer could not reach them. The +mechanism is identical per leg. + +## Follow-up + +`draft/feature/pyautobrain/board_without_gh_phase2_legs.md` — the remaining four +legs (versions, community, resume, upkeep), now unblocked. Two of them live in +scripts rather than in `_board.py`, so the phase's real question is whether each +script grows its own seam or the board gathers for them; answer it in this +contract's terms rather than inventing a second shape. + +## Original prompt + +# Board phase 1: the injection seam, proven on the overnight legs + +Type: feature +Target: pyautobrain +Repos: +- PyAutoBrain +Difficulty: medium +Autonomy: supervised +Priority: normal +Status: formalised +Filed: 2026-08-27 +Issued: 2026-08-27 +Parent: draft/feature/pyautobrain/board_without_gh.md + +Phase 1 of the board's gh-less work. The parent prompt holds the design, the +measurements and the 2026-08-27 probe that selected this option; read it first +and do not re-derive them. + +## Scope + +Build the seam and prove it on **one** leg family — the seven `overnight: +could not read /` rows, the largest block of the eleven. + +- `board/_board.py` accepts pre-fetched GitHub JSON (`--github-data `), + and `gh_json()` reads from it when present. The `gh` path is untouched, so a + dev box behaves exactly as today. +- The `/board` skill — which *is* the agent, and so is the only thing that can + call `mcp__github__*` — gathers that JSON when `command -v gh` fails, writes + it, and invokes the renderer with the flag. `_board.py` stays a pure + renderer; a subprocess cannot reach MCP tools and this is the whole reason + the seam exists. +- The file's shape is a documented contract in `board/AGENTS.md` (extend + "Reading the board in a remote session"), because it outlives whoever writes + it. + +## Guards + +- Tests drive the seam from a **fixture file**, never a live call. +- A leg with no injected data still reports `could not read` — the invariant + from the 2026-08-26 work: no leg may substitute an empty answer for an + unasked question. A green badge still requires a render that read everything. + +## Done when + +The overnight rows are live in a remote render, the degraded count drops by +seven, the dev-box path is byte-identical, and `tests/test_board_degraded.py` +plus the new fixture tests pass. diff --git a/complete/index.md b/complete/index.md index cf173ac2..e5e4fe1b 100644 --- a/complete/index.md +++ b/complete/index.md @@ -6,7 +6,7 @@ Token-light navigation over the finished-work records (schema: only then grep a dated bucket. Curators: edit the band between the CURATED markers; everything below GENERATED is rebuilt. -1163 records across 7 buckets. +1164 records across 7 buckets. ## Highlights @@ -42,6 +42,7 @@ _(curate hard-won records here — survives regeneration.)_ - [autolens-tracer-validation-guards](2026/08/autolens-tracer-validation-guards.md) - [autoreduce-pypi-name-collision](2026/08/autoreduce-pypi-name-collision.md) - [blackjax-16-upgrade-smoke](2026/08/blackjax-16-upgrade-smoke.md) +- [board-github-data-seam](2026/08/board-github-data-seam.md) - [border-relocator-backend-parity](2026/08/border-relocator-backend-parity.md) — Isolated the native NumPy/JAX likelihood gap to mathematically non-unique PCA axes for a near-isotropic border… - [border-relocator-degenerate-pca](2026/08/border-relocator-degenerate-pca.md) — Stabilized near-isotropic border PCA axes with a deterministic axis-aligned branch at a scale-aware eigenvalue… - [brain-readability-pass](2026/08/brain-readability-pass.md) — auto-closed on merge diff --git a/dashboard.html b/dashboard.html index 7907ba5a..36f58be7 100644 --- a/dashboard.html +++ b/dashboard.html @@ -204,7 +204,7 @@

PyAutoMindDashboard

Intent. Priority. Flow.

Every task the Mind is holding. Tap a task's 📋 and its /start_dev command is on your clipboard — paste it into a Claude Code chat to route Claude straight to that task. Recent is the same work by date — what has been happening rather than what to do next.

-
  • 3In flight
  • 3Parked
  • 5Planned
  • 134Backlog
+
  • 2In flight
  • 3Parked
  • 5Planned
  • 134Backlog

Last updated 2026-08-27. This page is generated from active/, draft/ and the registry files, so it is only as current as they are. dashboard_refresh.yml re-renders it on every push to main — that heals a stale page, but not a stale prompt: a task that shipped without its prompt advancing to complete/ keeps rendering here as pickable backlog. Reconciling those is the refresh below.

@PyAutoFit TransformedMessage.factor_gradient crashes on first callissue #1501 — issued 2026-08-19HOLD — do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract

-

Board phase 1: the injection seam, proven on the overnight legsissue #303 — issued 2026-08-27library-dev — not started; routed by /start_dev, no worktree claimed yet

Why does XLA CPU's Eigen thread pool wedge on the multi_dataset vmap…issue #1530 — issued 2026-08-27not started — research follow-up to the shipped jax-compile-stall epic

Parked markdown version

@@ -467,12 +466,6 @@

Backlog -2026-08-27 -issued -Board phase 1: the injection seam, proven on the overnight legs - - - 2026-08-26 filed jax_profiling/gradient/imaging/pixelization.py: 3.2% of its pin move… @@ -712,6 +705,12 @@

Backlog autolens_workspace_developer: broad stale-API rot (56 symbols, no CI) + +2026-08-04 +filed +Nightly release has been blocked 8 nights running — triage the streak + +

Epics markdown version

diff --git a/dashboard.md b/dashboard.md index d32f4dc2..5db0b35b 100644 --- a/dashboard.md +++ b/dashboard.md @@ -42,7 +42,7 @@ anything you could not verify. | Where | Count | |-------|------:| -| [In flight](#in-flight) (`active/`) | 3 | +| [In flight](#in-flight) (`active/`) | 2 | | [Parked](#parked) (`parked.md`) | 3 | | [Planned](#planned) (`planned.md`) | 5 | | [Backlog](#backlog) (`draft/`) | 134 | @@ -163,14 +163,6 @@ Issued — each has an open GitHub issue and usually a branch. The full record f
-
📋 Board phase 1: the injection seam, proven on the overnight legsissue #303 — issued 2026-08-27 — library-dev — not started; routed by /start_dev, no worktree claimed yet - -``` -/start_dev active/board_without_gh_phase1_seam.md -``` - -
-
📋 Why does XLA CPU's Eigen thread pool wedge on the multi_dataset vmap…issue #1530 — issued 2026-08-27 — not started — research follow-up to the shipped jax-compile-stall epic ``` @@ -1205,13 +1197,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par | 2026-08-27 | filed | LensCalc NumPy Hessian step is too coarse for multi-plane tracers | | 2026-08-27 | filed | Cross-validate multi-plane ray tracing | | 2026-08-27 | filed | Board phase 2: the remaining four legs onto the seam | -| 2026-08-27 | issued | Board phase 1: the injection seam, proven on the overnight legs | +| 2026-08-26 | filed | jax_profiling/gradient/imaging/pixelization.py: 3.2% of its pin move… |
… 10 more (40 left) | Date | Event | Task | |------|-------|------| -| 2026-08-26 | filed | jax_profiling/gradient/imaging/pixelization.py: 3.2% of its pin move… | | 2026-08-26 | filed | The Brain board should work in a session that has no gh | | 2026-08-24 | filed | wiki-currency's --check-version gate rots on every library main merge | | 2026-08-24 | filed | interferometer/jax_grad/gradient.py: eager and jitted likelihoods… | @@ -1221,12 +1212,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par | 2026-08-23 | filed | pynufft removal: unswept downstream residue (1 hard break + stale… | | 2026-08-23 | filed | Phase 3: stop installing pynufft in Hands/Heart CI and PyAutoCTI… | | 2026-08-23 | filed | Brain board follow-ups: what real mornings surface | +| 2026-08-22 | filed | smoke_install.sh's stale jax<0.7 pin — CI is on the right jax… |
… 10 more (30 left) | Date | Event | Task | |------|-------|------| -| 2026-08-22 | filed | smoke_install.sh's stale jax<0.7 pin — CI is on the right jax… | | 2026-08-22 | filed | The reconstruction noise map describes a different estimator than the… | | 2026-08-22 | filed | Point-source JSON datasets record no resolution regime | | 2026-08-22 | filed | Is Intel macOS a supported platform, and what is the numpy-only… | @@ -1236,12 +1227,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par | 2026-08-19 | filed | autofit_profiling: bootstrap the repo + general PyAutoFit profiling… | | 2026-08-19 | issued | @PyAutoFit TransformedMessage.factor_gradient crashes on first… | | 2026-08-19 | filed | Release board: local run_logs enrichment | +| 2026-08-19 | filed | RTD organism docs currency: Nerves page, organ-count drift, hands.md… |
… 10 more (20 left) | Date | Event | Task | |------|-------|------| -| 2026-08-19 | filed | RTD organism docs currency: Nerves page, organ-count drift, hands.md… | | 2026-08-19 | filed | Deduplicate repos_sync.py's check/write pairs | | 2026-08-19 | filed | Bug in autocti_workspace: the dataset_1d results/database example… | | 2026-08-18 | parked | single-source-density-design | @@ -1251,12 +1242,12 @@ The 50 newest things to happen to the work in hand, newest first — issued, par | 2026-08-17 | filed | Teach repos_sync --write to stamp organ config surfaces | | 2026-08-14 | filed | Three jax_likelihood pins are stale by ~1.24e-4 and fail the smoke… | | 2026-08-09 | found | isothermal-ell-sph-oversampling-at-the-cusp | +| 2026-08-08 | parked | pyautoreduce-slacs1430-acs-comparison |
… 10 more (10 left) | Date | Event | Task | |------|-------|------| -| 2026-08-08 | parked | pyautoreduce-slacs1430-acs-comparison | | 2026-08-08 | filed | Regenerate autolens_workspace markdown/ so the MGE pages show… | | 2026-08-07 | filed | Regenerate setup_notebook-drifted notebooks in… | | 2026-08-06 | filed | Triage: Convolver "No blurring_image provided" warning in canonical… | @@ -1266,6 +1257,7 @@ The 50 newest things to happen to the work in hand, newest first — issued, par | 2026-08-04 | filed | dataset/imaging/jwst_lw is untracked because the gitignore was never… | | 2026-08-04 | filed | cosmos_web_ring stores boolean masks as float64, wasting ~3.4 MB of… | | 2026-08-04 | filed | autolens_workspace_developer: broad stale-API rot (56 symbols, no CI) | +| 2026-08-04 | filed | Nightly release has been blocked 8 nights running — triage the streak |
diff --git a/draft/feature/pyautobrain/board_without_gh.md b/draft/feature/pyautobrain/board_without_gh.md index 665a90cc..6d141110 100644 --- a/draft/feature/pyautobrain/board_without_gh.md +++ b/draft/feature/pyautobrain/board_without_gh.md @@ -8,7 +8,7 @@ Difficulty: large Autonomy: supervised Priority: normal Status: phased -Split-into: draft/feature/pyautobrain/board_without_gh_phase1_seam.md, draft/feature/pyautobrain/board_without_gh_phase2_legs.md +Split-into: complete/2026/08/board-github-data-seam.md (phase 1, shipped 2026-08-27), draft/feature/pyautobrain/board_without_gh_phase2_legs.md Filed: 2026-08-26 The board is the morning door, and on mobile it is mostly blind. Eleven of its diff --git a/draft/feature/pyautobrain/board_without_gh_phase2_legs.md b/draft/feature/pyautobrain/board_without_gh_phase2_legs.md index 49e37529..35164d05 100644 --- a/draft/feature/pyautobrain/board_without_gh_phase2_legs.md +++ b/draft/feature/pyautobrain/board_without_gh_phase2_legs.md @@ -10,9 +10,9 @@ Priority: normal Status: formalised Filed: 2026-08-27 Parent: draft/feature/pyautobrain/board_without_gh.md -Blocked-by: draft/feature/pyautobrain/board_without_gh_phase1_seam.md +After: complete/2026/08/board-github-data-seam.md (phase 1 shipped 2026-08-27, PyAutoBrain#303 — this is unblocked) -Phase 2: port the four legs phase 1 did not cover onto the seam it built — +Phase 2: port the four legs phase 1 did not cover onto the seam it built (`--github-data`; the contract is `PyAutoBrain/board/AGENTS.md` → "Reading the board in a remote session") — `versions: no stamps resolved` (`bin/version_drift.sh`), `community: scan unavailable (exit 4)` (`agents/conductors/community/_community.py`), `resume: pending-release PR search failed`, and `upkeep: open-issue count unavailable`.