Overview
Phase 2 of the PyAutoEyes birth epic (pyautoeyes-birth). Phase 1b (#448) gave the organ its skeleton: registry.yaml, the manifest reader, a dashboard with thumbnails and /eyes review lines. This phase fills the dashboard with the survey and critique content, gives every figure a route for suggesting an improvement, puts an Eyes chip on the Brain board family footer, and teaches the Brain Eyes conductor to resolve instances by name through the organ's registry.
Plan
- Dashboard content: per instance, the figure count, the conductor survey (stale renders, gaps, orphans) when a local checkout exists, freshness against PyPI, and the open critiques (Mind drafts that mention the instance). Also a
badge.json.
- Critique route per figure: the copyable
/eyes review <instance> <figure> line, plus a pre-filled GitHub "new issue" link on the project repo (title figure: <domain>/<file>, body with the raw PNG link and a "Suggested improvement:" stub, label eyes-critique). The dashboard files nothing itself.
- Brain board chip:
boards.eyes: PyAutoEyes in canonical organ order, an ORGANS["eyes"] palette and MARKS["eyes"] glyph, and a collect_eyes() strip that reads PyAutoEyes' dashboard.md counts.
- Eyes conductor:
--instance <name> resolved through PyAutoEyes registry.yaml. Given the organ root, survey/review cover every registered instance. The conductor stays repo-name-free. The recursive-producer bug is left to its own draft.
- Hermetic tests for every new piece, ruff clean, and prose updated (PyAutoEyes README/AGENTS/REFERENCE, Brain eyes AGENTS.md and skills/eyes/eyes.md).
Feature Agent note: the Agent suggested split-into-phases. The epic's declared phasing wins, since this prompt is already phase 2 of 5, so it ships as one task.
Detailed implementation plan
Work Classification
Library (organ code: PyAutoEyes + PyAutoBrain). No workspace follow-up.
Affected Repositories
- PyAutoEyes (primary)
- PyAutoBrain
Branch Survey
| Repository |
Current Branch |
Dirty? |
| organs/PyAutoEyes |
main |
3 untracked leftover dirs (dataset/, output/, scripts/), not from this task and left untouched |
| organs/PyAutoBrain |
main |
clean |
worktree_check_conflict shows no conflict. The #448 claim has already been removed by its close-out.
Suggested branch: feature/eyes-board-conductor-registry
Worktree root: ~/Code/PyAutoLabs-wt/eyes-board-conductor-registry/
Implementation Steps
- PyAutoEyes
eyes/board.py
InstanceView gains survey (parsed pyauto-brain eyes --json survey of the local checkout, or None with a note) and critiques (titles and paths of Mind drafts under draft/*/ that mention the instance repo or name).
- The summary table gains Figures, Stale/Gaps/Orphans and Critiques columns.
- Each figure row or card gets the review line plus an "Suggest improvement" link to
https://github.com/<github>/issues/new?title=…&body=…&labels=eyes-critique. The body carries the raw PNG URL, the manifest generated date and rendered version, and a Suggested improvement: stub.
badge.json is written beside the dashboard. The render stays deterministic: the survey is summarised as counts and names only, never mtimes.
- PyAutoEyes
eyes/cli.py
board runs the survey (--no-survey opts out) and the critique grep (the Mind checkout comes from $PYAUTO_MIND or the workspace root).
pages_dashboard.yml also publishes badge.json.
- Brain
config/policy.yaml: boards: eyes: PyAutoEyes goes between memory and heart.
- Brain
board/_theme.py: ORGANS["eyes"], an amber palette with contrast of at least 4.5:1 and distinct from the Hands orange, and MARKS["eyes"], an eye glyph in line art inside a ring. Update the ordered-family assertions in tests/test_board_theme.py.
- Brain
board/_board.py: collect_eyes() reads the PyAutoEyes dashboard.md summary table (instances, figures, behind), and the md and html renders gain an "Eyes" line next to Cortex. Add eyes to SURFACE_KEYS in the tests.
- Brain
agents/conductors/eyes/_eyes.py
--instance <name> (repeatable) and --instances-from <organ root>. The PyAutoEyes checkout resolves via $PYAUTO_EYES, then the sibling, then _repo_paths.repo_path(root, "PyAutoEyes").
- A stdlib parser reads
registry.yaml. The instance path resolves from the workspace root (grouped path, then flat repo).
- Given the organ root as the workspace argument, the conductor covers every registered instance.
- The gallery check also looks at the registry's
manifest path.
- New hermetic tests use a fabricated organ and registry.
- Prose: PyAutoEyes README/AGENTS/REFERENCE, plus Brain
agents/conductors/eyes/AGENTS.md and skills/eyes/eyes.md, cover --instance and the critique route.
- Label: create
eyes-critique on PyAutoLabs/autolens_visualization.
Witness
- PyAutoEyes
pytest tests, a live bin/pyauto-eyes check, and bin/pyauto-eyes board (show the dashboard.md head).
pyauto-brain eyes survey --instance lens shows imaging 22 and interferometer 18 with no gaps.
- The full Brain suite outside the bundle env reports 0 failed.
- The Heart and Hands
pytest tests -k footer runs pass against the Brain branch.
Key Files
PyAutoEyes/eyes/board.py, eyes/cli.py, tests/, .github/workflows/pages_dashboard.yml
PyAutoBrain/config/policy.yaml, board/_theme.py, board/_board.py, agents/conductors/eyes/_eyes.py, tests/test_board_theme.py, tests/test_board.py, tests/test_eyes_conductor.py
Original Prompt
Click to expand starting prompt
PyAutoEyes phase 2 — cross-project dashboard, critique route, Brain chip, conductor registry
Type: feature
Target: PyAutoEyes
Repos:
- PyAutoEyes
- PyAutoBrain
Themes:
- visualization
- infrastructure
Difficulty: large
Autonomy: supervised
Priority: high
Lane: local-dev
Status: draft
Consequence: judge
Witness: the PyAutoEyes Pages dashboard publishes with a thumbnail per lens figure linked to its raw PNG in autolens_visualization, a freshness line, and a working "suggest an improvement" affordance per figure; a render.yml run in autolens_visualization triggers dashboard_refresh.yml; the Brain board footer shows the Eyes chip; tests/test_board_theme.py green; pyauto-brain eyes survey --instance lens resolves through registry.yaml
Review-minutes: 15
Epic: pyautoeyes-birth
Phase: 2
Filed: 2026-09-25
Blocked on: none — phase 1b COMPLETE 2026-09-28 (PyAutoMind#448; record complete/2026/09/eyes-organ-skeleton.md).
Task
- Dashboard content (
eyes/board.py → dashboard.md/.html, the epic
ledger): per registered instance, a thumbnail grid of every figure in its
tracked manifest, each thumbnail linked to the raw PNG in the project
repo (the organ never copies figures), click-through to full size, grouped
by domain/producer; per-instance freshness (rendered stack version vs the
latest library release on PyPI); survey gaps and orphans (from
pyauto-eyes survey); open critiques (Mind drafts carrying the instance's
target); badge.json.
- Critique route. Each figure carries a "suggest an improvement"
affordance that pre-fills a critique routed through intake: a copyable
/eyes review <instance> <figure> command and/or a pre-filled GitHub issue
link on the project repo (title + figure path + manifest version). The
dashboard never files anything itself.
- Brain board chip:
config/policy.yaml boards.eyes: PyAutoEyes;
board/_theme.py ORGANS["eyes"] palette + MARKS["eyes"] glyph
(tests/test_board_theme.py enforces); optional collect_eyes() strip in
board/_board.py reading the dashboard's counts.
- Eyes conductor:
--instance <name> resolving through the organ's
registry.yaml (survey/review default to every registered instance
when given the organ root); the conductor stays repo-name-free — the
registry is data, not code. The non-recursive producer scan stays its own
bug draft (draft/bug/pyautobrain/eyes_survey_recursive_producers.md).
Overview
Phase 2 of the PyAutoEyes birth epic (
pyautoeyes-birth). Phase 1b (#448) gave the organ its skeleton:registry.yaml, the manifest reader, a dashboard with thumbnails and/eyes reviewlines. This phase fills the dashboard with the survey and critique content, gives every figure a route for suggesting an improvement, puts an Eyes chip on the Brain board family footer, and teaches the Brain Eyes conductor to resolve instances by name through the organ's registry.Plan
badge.json./eyes review <instance> <figure>line, plus a pre-filled GitHub "new issue" link on the project repo (titlefigure: <domain>/<file>, body with the raw PNG link and a "Suggested improvement:" stub, labeleyes-critique). The dashboard files nothing itself.boards.eyes: PyAutoEyesin canonical organ order, anORGANS["eyes"]palette andMARKS["eyes"]glyph, and acollect_eyes()strip that reads PyAutoEyes'dashboard.mdcounts.--instance <name>resolved through PyAutoEyesregistry.yaml. Given the organ root,survey/reviewcover every registered instance. The conductor stays repo-name-free. The recursive-producer bug is left to its own draft.Feature Agent note: the Agent suggested
split-into-phases. The epic's declared phasing wins, since this prompt is already phase 2 of 5, so it ships as one task.Detailed implementation plan
Work Classification
Library (organ code: PyAutoEyes + PyAutoBrain). No workspace follow-up.
Affected Repositories
Branch Survey
worktree_check_conflictshows no conflict. The #448 claim has already been removed by its close-out.Suggested branch:
feature/eyes-board-conductor-registryWorktree root:
~/Code/PyAutoLabs-wt/eyes-board-conductor-registry/Implementation Steps
eyes/board.pyInstanceViewgainssurvey(parsedpyauto-brain eyes --json surveyof the local checkout, or None with a note) andcritiques(titles and paths of Mind drafts underdraft/*/that mention the instance repo or name).https://github.com/<github>/issues/new?title=…&body=…&labels=eyes-critique. The body carries the raw PNG URL, the manifestgenerateddate and rendered version, and aSuggested improvement:stub.badge.jsonis written beside the dashboard. The render stays deterministic: the survey is summarised as counts and names only, never mtimes.eyes/cli.pyboardruns the survey (--no-surveyopts out) and the critique grep (the Mind checkout comes from$PYAUTO_MINDor the workspace root).pages_dashboard.ymlalso publishesbadge.json.config/policy.yaml:boards: eyes: PyAutoEyesgoes between memory and heart.board/_theme.py:ORGANS["eyes"], an amber palette with contrast of at least 4.5:1 and distinct from the Hands orange, andMARKS["eyes"], an eye glyph in line art inside a ring. Update the ordered-family assertions intests/test_board_theme.py.board/_board.py:collect_eyes()reads the PyAutoEyesdashboard.mdsummary table (instances, figures, behind), and the md and html renders gain an "Eyes" line next to Cortex. Addeyesto SURFACE_KEYS in the tests.agents/conductors/eyes/_eyes.py--instance <name>(repeatable) and--instances-from <organ root>. The PyAutoEyes checkout resolves via$PYAUTO_EYES, then the sibling, then_repo_paths.repo_path(root, "PyAutoEyes").registry.yaml. The instance path resolves from the workspace root (groupedpath, then flatrepo).manifestpath.agents/conductors/eyes/AGENTS.mdandskills/eyes/eyes.md, cover--instanceand the critique route.eyes-critiqueon PyAutoLabs/autolens_visualization.Witness
pytest tests, a livebin/pyauto-eyes check, andbin/pyauto-eyes board(show the dashboard.md head).pyauto-brain eyes survey --instance lensshows imaging 22 and interferometer 18 with no gaps.pytest tests -k footerruns pass against the Brain branch.Key Files
PyAutoEyes/eyes/board.py,eyes/cli.py,tests/,.github/workflows/pages_dashboard.ymlPyAutoBrain/config/policy.yaml,board/_theme.py,board/_board.py,agents/conductors/eyes/_eyes.py,tests/test_board_theme.py,tests/test_board.py,tests/test_eyes_conductor.pyOriginal Prompt
Click to expand starting prompt
PyAutoEyes phase 2 — cross-project dashboard, critique route, Brain chip, conductor registry
Type: feature
Target: PyAutoEyes
Repos:
Themes:
Difficulty: large
Autonomy: supervised
Priority: high
Lane: local-dev
Status: draft
Consequence: judge
Witness: the PyAutoEyes Pages dashboard publishes with a thumbnail per lens figure linked to its raw PNG in
autolens_visualization, a freshness line, and a working "suggest an improvement" affordance per figure; arender.ymlrun inautolens_visualizationtriggersdashboard_refresh.yml; the Brain board footer shows the Eyes chip;tests/test_board_theme.pygreen;pyauto-brain eyes survey --instance lensresolves throughregistry.yamlReview-minutes: 15
Epic: pyautoeyes-birth
Phase: 2
Filed: 2026-09-25
Blocked on: none — phase 1b COMPLETE 2026-09-28 (PyAutoMind#448; record
complete/2026/09/eyes-organ-skeleton.md).Task
eyes/board.py→dashboard.md/.html, the epicledger): per registered instance, a thumbnail grid of every figure in its
tracked manifest, each thumbnail linked to the raw PNG in the project
repo (the organ never copies figures), click-through to full size, grouped
by domain/producer; per-instance freshness (rendered stack version vs the
latest library release on PyPI); survey gaps and orphans (from
pyauto-eyes survey); open critiques (Mind drafts carrying the instance'starget);
badge.json.affordance that pre-fills a critique routed through intake: a copyable
/eyes review <instance> <figure>command and/or a pre-filled GitHub issuelink on the project repo (title + figure path + manifest version). The
dashboard never files anything itself.
config/policy.yamlboards.eyes: PyAutoEyes;board/_theme.pyORGANS["eyes"]palette +MARKS["eyes"]glyph(
tests/test_board_theme.pyenforces); optionalcollect_eyes()strip inboard/_board.pyreading the dashboard's counts.--instance <name>resolving through the organ'sregistry.yaml(survey/reviewdefault to every registered instancewhen given the organ root); the conductor stays repo-name-free — the
registry is data, not code. The non-recursive producer scan stays its own
bug draft (
draft/bug/pyautobrain/eyes_survey_recursive_producers.md).