Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions active.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
47 changes: 0 additions & 47 deletions active/board_without_gh_phase1_seam.md

This file was deleted.

157 changes: 157 additions & 0 deletions complete/2026/08/board-github-data-seam.md
Original file line number Diff line number Diff line change
@@ -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 <file> # {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 <repo>/<workflow>` rows, the largest block of the eleven.

- `board/_board.py` accepts pre-fetched GitHub JSON (`--github-data <file>`),
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.
3 changes: 2 additions & 1 deletion complete/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

<!-- CURATED:START -->
## Highlights
Expand Down Expand Up @@ -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
Expand Down
15 changes: 7 additions & 8 deletions dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,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>3</b><span>In flight</span></li><li><b>3</b><span>Parked</span></li><li><b>5</b><span>Planned</span></li><li><b>134</b><span>Backlog</span></li></ul>
<ul class="stats"><li><b>2</b><span>In flight</span></li><li><b>3</b><span>Parked</span></li><li><b>5</b><span>Planned</span></li><li><b>134</b><span>Backlog</span></li></ul>
<div class="fresh"><p><b>Last updated 2026-08-27.</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:

Expand Down Expand Up @@ -252,7 +252,6 @@ <h3>Quick wins <span class="facets">(small enough, and safe enough to run unatte
<h2>In flight <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/active.md">markdown version</a></h2>
<p class="muted">Issued — each has an open GitHub issue and usually a branch.</p>
<div class="task"><button class="copy" data-cmd="/start_dev active/16_transformed_message_factor_gradient_unpack.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/active/16_transformed_message_factor_gradient_unpack.md"><code>@PyAutoFit</code> <code>TransformedMessage.factor_gradient</code> crashes on first call</a> — <a href="https://github.com/PyAutoLabs/PyAutoFit/issues/1501">issue #1501</a><span class="facets"> — issued 2026-08-19</span> — <span class="facets">HOLD — do not start dev. Fix-or-delete hangs off the PyAutoFit#1498 logpdf-contract</span></p></div>
<div class="task"><button class="copy" data-cmd="/start_dev active/board_without_gh_phase1_seam.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/active/board_without_gh_phase1_seam.md">Board phase 1: the injection seam, proven on the overnight legs</a> — <a href="https://github.com/PyAutoLabs/PyAutoBrain/issues/303">issue #303</a><span class="facets"> — issued 2026-08-27</span> — <span class="facets">library-dev — not started; routed by /start_dev, no worktree claimed yet</span></p></div>
<div class="task"><button class="copy" data-cmd="/start_dev active/xla_cpu_eigen_pool_deadlock.md" aria-label="Copy the Claude command">📋</button><p><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/active/xla_cpu_eigen_pool_deadlock.md">Why does XLA CPU's Eigen thread pool wedge on the multi_dataset vmap…</a> — <a href="https://github.com/PyAutoLabs/PyAutoFit/issues/1530">issue #1530</a><span class="facets"> — issued 2026-08-27</span> — <span class="facets">not started — research follow-up to the shipped jax-compile-stall epic</span></p></div>
<h2>Parked <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/parked.md">markdown version</a></h2>
<details>
Expand Down Expand Up @@ -467,12 +466,6 @@ <h2>Backlog <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/tree
<td class="pick"><button class="copy" data-cmd="/start_dev draft/feature/pyautobrain/board_without_gh_phase2_legs.md" aria-label="Copy the Claude command">📋</button></td>
</tr>
<tr>
<td class="when">2026-08-27</td>
<td class="what">issued</td>
<td><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/active/board_without_gh_phase1_seam.md">Board phase 1: the injection seam, proven on the overnight legs</a></td>
<td class="pick"><button class="copy" data-cmd="/start_dev active/board_without_gh_phase1_seam.md" aria-label="Copy the Claude command">📋</button></td>
</tr>
<tr hidden>
<td class="when">2026-08-26</td>
<td class="what">filed</td>
<td><a href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/bug/workspaces/gradient_pixelization_pin_residual_drift.md">jax_profiling/gradient/imaging/pixelization.py: 3.2% of its pin move…</a></td>
Expand Down Expand Up @@ -712,6 +705,12 @@ <h2>Backlog <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/tree
<td><a href="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></td>
<td class="pick"><button class="copy" data-cmd="/start_dev draft/maintenance/autolens_workspace_developer/stale_api_rot_audit.md" aria-label="Copy the Claude command">📋</button></td>
</tr>
<tr hidden>
<td class="when">2026-08-04</td>
<td class="what">filed</td>
<td><a href="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>
<td class="pick"><button class="copy" data-cmd="/start_dev draft/triage/nightly_release_blocked_eight_nights.md" aria-label="Copy the Claude command">📋</button></td>
</tr>
</table>
<button class="more" data-page="10">… 10 more (40 left)</button>
<h2>Epics <a class="mdsrc" href="https://github.com/PyAutoLabs/PyAutoMind/blob/main/epics.md">markdown version</a></h2>
Expand Down
Loading
Loading