Overview
Phase 1b of the pyautoeyes-birth epic. Under the layered design (human decision 2026-09-28), each <lib>_visualization project repo makes, stores and tracks its figures; the organ PyAutoEyes becomes the cross-project dashboard over them. This task strips PyAutoEyes of the lens gallery content that phase 1a (#446) moved to PyAutoLabs/autolens_visualization, and builds the organ skeleton: registry.yaml, the versioned manifest contract, the eyes/ package, bin/pyauto-eyes, and the Pages dashboard workflows. The organ renders nothing, copies no figures, never judges, and never edits library plot code.
Plan
- Strip (commit 1, reviewable alone): delete producers, simulators,
dataset/, tracked PNGs, GALLERY.md, instruments/, config/, gallery/, _viz_cli.py, activate.sh, lint.yml/render.yml. The history is preserved in git and on PyAutoLabs/autolens_visualization (refs/heads/main 8f3e712).
- Skeleton (commit 2):
registry.yaml (lens row only), REFERENCE.md (manifest contract schema 1), the eyes/ package (registry, manifest reader, board builder), bin/pyauto-eyes (board, check, survey), organ prose stating the layering and boundary, hermetic tests, and the workflows lint.yml, pages_dashboard.yml and dashboard_refresh.yml (repository_dispatch eyes-refresh plus a daily cron, the Cortex pattern).
- Brain (one change): replace the PyAutoEyes
WITNESS_EXEMPT entry in tests/test_policy_seams.py with a pyautoeyes: PyAutoEyes/tests row in the config/policy.yaml test_witness map.
- Ship order: PyAutoEyes first, then PyAutoBrain. PRs wait until PyAutoMind#447 (phase 1a) is merged. Merge stays human.
Detailed implementation plan
Affected Repositories
- PyAutoEyes (primary)
- PyAutoBrain (witness row only)
Branch Survey
| Repository |
Current Branch |
Dirty? |
| ./organs/PyAutoEyes |
main (8f3e712 = origin) |
clean |
| ./organs/PyAutoBrain |
main |
clean |
worktree_check_conflict: PyAutoEyes is free. PyAutoBrain is claimed by eyes-organ-order (#439) and autolens-visualization-rebirth (#446). A parallel claim was human-approved in-session on 2026-09-28. The files do not overlap: 1b touches only tests/test_policy_seams.py and config/policy.yaml, #446 touches the eyes conductor prose, docs and clean_slate, and #439 touches _pyauto_root and docs.
Suggested branch: feature/eyes-organ-skeleton
Implementation Steps
- PyAutoEyes commit 1 (strip):
git rm of scripts/, dataset/, config/, instruments/, gallery/, GALLERY.md, _viz_cli.py, activate.sh, .github/workflows/{lint,render}.yml. Keep LICENSE, AI_POLICY.md, ruff.toml, the CLAUDE.md stub, .claude/ hooks, and the repos_sync:* marker blocks in AGENTS.md.
- PyAutoEyes commit 2 (skeleton):
registry.yaml: lens row with name, repo, path, github, library, import_name, manifest, images_base_url, gallery, dispatch_event.
REFERENCE.md: the manifest contract, schema 1 (schema, generated, rendered_with{...}, figure_count, figures[{file, producer, domain, source, bytes, sha256}]), what the organ reads, and the versioning rule.
eyes/registry.py, eyes/manifest.py (local path or raw GitHub URL; validates schema 1), eyes/board.py (dashboard.md + dashboard.html: per instance the figure count, rendered_with, generated date, freshness vs the latest library release with a graceful offline fallback, a thumbnail grid linking the raw PNGs, and a copyable /eyes review <instance> <figure> line per figure).
bin/pyauto-eyes: board [--offline] [--from <instance>=<path>], check, survey [<instance>|--all] (delegates to pyauto-brain eyes survey <instance path>).
AGENTS.md / README.md / CLAUDE.md: state the layering and the boundary.
tests/: hermetic tests for the registry, the manifest reader, the board builder and check.
.github/workflows/lint.yml (ruff, pytest, pyauto-eyes check, lychee), pages_dashboard.yml, dashboard_refresh.yml.
- PyAutoBrain: move PyAutoEyes out of
WITNESS_EXEMPT into the test_witness row in config/policy.yaml. Run the policy_seams and skill_seams tests.
Key Files
PyAutoEyes/registry.yaml, PyAutoEyes/REFERENCE.md, PyAutoEyes/eyes/*.py, PyAutoEyes/bin/pyauto-eyes, PyAutoEyes/tests/, PyAutoEyes/.github/workflows/*.yml
PyAutoBrain/config/policy.yaml (test_witness), PyAutoBrain/tests/test_policy_seams.py (WITNESS_EXEMPT)
- Read contract source:
autolens_visualization/gallery/viz_manifest.yaml, gallery/gallery_build.py, .github/workflows/render.yml (fires eyes-refresh)
Feature Agent note
The Feature Agent sized this as large and suggested splitting it further. The epic's declared phasing (1a / 1b / 2) wins: the dashboard content is kept modest here, and phase 2 (eyes_p2_board_and_conductor_registry.md) expands it.
Original Prompt
Click to expand starting prompt
PyAutoEyes phase 1b — strip the organ to its dashboard skeleton
Type: feature
Target: PyAutoEyes
Repos:
- PyAutoEyes
- PyAutoBrain
Themes:
- visualization
- infrastructure
Difficulty: large
Autonomy: supervised
Priority: high
Lane: local-dev
Status: draft
Consequence: judge
Witness: pyauto-eyes check green against the lens registry row (manifest resolves, every listed PNG URL resolves); hermetic tests green (registry, manifest reader, board builder on a fabricated manifest, check); lint.yml green on the PR; pyauto-eyes board writes dashboard.md/.html with a lens row linking into PyAutoLabs/autolens_visualization
Review-minutes: 15
Epic: pyautoeyes-birth
Phase: 1b
Filed: 2026-09-28
Blocked on: phase 1a shipped (history confirmed on PyAutoLabs/autolens_visualization).
Task
PyAutoEyes becomes the cross-project dashboard of the layered design (human
decision 2026-09-28): it reads each <lib>_visualization project repo's
tracked manifest and links to its PNGs. It renders nothing, copies no
figures, never judges (the Brain Eyes conductor does), never edits library
plot code (critiques route through intake).
- Strip, in one PR. Delete from the organ everything phase 1a moved to
autolens_visualization: scripts/ producers + simulators, dataset/,
the tracked PNGs, GALLERY.md, instruments/, config/, gallery/,
_viz_cli.py, activate.sh, render.yml. History stays in git and in
the project repo.
registry.yaml — one row per instance: name, path, github, library, import_name, manifest (tracked path in the project repo, e.g.
gallery/viz_manifest.yaml), images_base_url (raw.githubusercontent
base), dispatch (the library release event the project repo re-renders
on). Lens row only.
- Manifest contract —
REFERENCE.md specifies the fields the project
repos commit (figure list + rendered stack version) and what the organ
reads; versioned so project repos and organ can move independently.
eyes/ package — registry.py (read + validate registry.yaml),
manifest.py (read a manifest from a local checkout or its GitHub raw URL),
board.py (build dashboard.md/.html from registry + manifests; phase 2
fills the content).
bin/pyauto-eyes — board, check (registry valid, every manifest
reachable and parseable, every PNG URL resolves), survey (runs
pyauto-brain eyes survey <instance root> per registered instance).
- Organ prose — AGENTS.md / README.md / REFERENCE.md / CLAUDE.md stub
stating the layering (project repos make, store and track figures; the
organ is where the human checks in on visualization across all projects;
same layering as autolens_profiling / autolens_inference under the
Brain board), repos_sync:map markers kept.
- Workflows —
lint.yml (ruff, pytest, pyauto-eyes check, lychee);
pages_dashboard.yml + dashboard_refresh.yml on repository_dispatch
(eyes-refresh, fired by each project repo's render.yml) and a daily
cron (Cortex pattern).
- Tests — hermetic: registry, manifest reader, board builder on a
fabricated manifest, check. Then replace the Brain WITNESS_EXEMPT
entry (tests/test_policy_seams.py) with a pyautoeyes: row in
config/policy.yaml's witness map.
Ship policy
PyAutoBrain (witness row) merges after PyAutoEyes. While Heart is RED the PRs
ship only under a contemporaneous human RED override. Merge stays human.
Overview
Phase 1b of the
pyautoeyes-birthepic. Under the layered design (human decision 2026-09-28), each<lib>_visualizationproject repo makes, stores and tracks its figures; the organ PyAutoEyes becomes the cross-project dashboard over them. This task strips PyAutoEyes of the lens gallery content that phase 1a (#446) moved toPyAutoLabs/autolens_visualization, and builds the organ skeleton:registry.yaml, the versioned manifest contract, theeyes/package,bin/pyauto-eyes, and the Pages dashboard workflows. The organ renders nothing, copies no figures, never judges, and never edits library plot code.Plan
dataset/, tracked PNGs,GALLERY.md,instruments/,config/,gallery/,_viz_cli.py,activate.sh,lint.yml/render.yml. The history is preserved in git and onPyAutoLabs/autolens_visualization(refs/heads/main 8f3e712).registry.yaml(lens row only),REFERENCE.md(manifest contract schema 1), theeyes/package (registry, manifest reader, board builder),bin/pyauto-eyes(board,check,survey), organ prose stating the layering and boundary, hermetic tests, and the workflowslint.yml,pages_dashboard.ymlanddashboard_refresh.yml(repository_dispatcheyes-refreshplus a daily cron, the Cortex pattern).WITNESS_EXEMPTentry intests/test_policy_seams.pywith apyautoeyes: PyAutoEyes/testsrow in theconfig/policy.yamltest_witnessmap.Detailed implementation plan
Affected Repositories
Branch Survey
worktree_check_conflict: PyAutoEyes is free. PyAutoBrain is claimed byeyes-organ-order(#439) andautolens-visualization-rebirth(#446). A parallel claim was human-approved in-session on 2026-09-28. The files do not overlap: 1b touches onlytests/test_policy_seams.pyandconfig/policy.yaml, #446 touches the eyes conductor prose, docs and clean_slate, and #439 touches_pyauto_rootand docs.Suggested branch:
feature/eyes-organ-skeletonImplementation Steps
git rmofscripts/,dataset/,config/,instruments/,gallery/,GALLERY.md,_viz_cli.py,activate.sh,.github/workflows/{lint,render}.yml. KeepLICENSE,AI_POLICY.md,ruff.toml, theCLAUDE.mdstub,.claude/hooks, and therepos_sync:*marker blocks inAGENTS.md.registry.yaml: lens row withname, repo, path, github, library, import_name, manifest, images_base_url, gallery, dispatch_event.REFERENCE.md: the manifest contract, schema 1 (schema, generated, rendered_with{...}, figure_count, figures[{file, producer, domain, source, bytes, sha256}]), what the organ reads, and the versioning rule.eyes/registry.py,eyes/manifest.py(local path or raw GitHub URL; validates schema 1),eyes/board.py(dashboard.md+dashboard.html: per instance the figure count, rendered_with, generated date, freshness vs the latest library release with a graceful offline fallback, a thumbnail grid linking the raw PNGs, and a copyable/eyes review <instance> <figure>line per figure).bin/pyauto-eyes:board [--offline] [--from <instance>=<path>],check,survey [<instance>|--all](delegates topyauto-brain eyes survey <instance path>).AGENTS.md/README.md/CLAUDE.md: state the layering and the boundary.tests/: hermetic tests for the registry, the manifest reader, the board builder and check..github/workflows/lint.yml(ruff, pytest,pyauto-eyes check, lychee),pages_dashboard.yml,dashboard_refresh.yml.WITNESS_EXEMPTinto thetest_witnessrow inconfig/policy.yaml. Run the policy_seams and skill_seams tests.Key Files
PyAutoEyes/registry.yaml,PyAutoEyes/REFERENCE.md,PyAutoEyes/eyes/*.py,PyAutoEyes/bin/pyauto-eyes,PyAutoEyes/tests/,PyAutoEyes/.github/workflows/*.ymlPyAutoBrain/config/policy.yaml(test_witness),PyAutoBrain/tests/test_policy_seams.py(WITNESS_EXEMPT)autolens_visualization/gallery/viz_manifest.yaml,gallery/gallery_build.py,.github/workflows/render.yml(fireseyes-refresh)Feature Agent note
The Feature Agent sized this as large and suggested splitting it further. The epic's declared phasing (1a / 1b / 2) wins: the dashboard content is kept modest here, and phase 2 (
eyes_p2_board_and_conductor_registry.md) expands it.Original Prompt
Click to expand starting prompt
PyAutoEyes phase 1b — strip the organ to its dashboard skeleton
Type: feature
Target: PyAutoEyes
Repos:
Themes:
Difficulty: large
Autonomy: supervised
Priority: high
Lane: local-dev
Status: draft
Consequence: judge
Witness:
pyauto-eyes checkgreen against the lens registry row (manifest resolves, every listed PNG URL resolves); hermetic tests green (registry, manifest reader, board builder on a fabricated manifest, check); lint.yml green on the PR;pyauto-eyes boardwritesdashboard.md/.htmlwith a lens row linking intoPyAutoLabs/autolens_visualizationReview-minutes: 15
Epic: pyautoeyes-birth
Phase: 1b
Filed: 2026-09-28
Blocked on: phase 1a shipped (history confirmed on
PyAutoLabs/autolens_visualization).Task
PyAutoEyes becomes the cross-project dashboard of the layered design (human
decision 2026-09-28): it reads each
<lib>_visualizationproject repo'stracked manifest and links to its PNGs. It renders nothing, copies no
figures, never judges (the Brain Eyes conductor does), never edits library
plot code (critiques route through intake).
autolens_visualization:scripts/producers + simulators,dataset/,the tracked PNGs,
GALLERY.md,instruments/,config/,gallery/,_viz_cli.py,activate.sh,render.yml. History stays in git and inthe project repo.
registry.yaml— one row per instance:name, path, github, library, import_name, manifest(tracked path in the project repo, e.g.gallery/viz_manifest.yaml),images_base_url(raw.githubusercontentbase),
dispatch(the library release event the project repo re-renderson). Lens row only.
REFERENCE.mdspecifies the fields the projectrepos commit (figure list + rendered stack version) and what the organ
reads; versioned so project repos and organ can move independently.
eyes/package —registry.py(read + validateregistry.yaml),manifest.py(read a manifest from a local checkout or its GitHub raw URL),board.py(builddashboard.md/.htmlfrom registry + manifests; phase 2fills the content).
bin/pyauto-eyes—board,check(registry valid, every manifestreachable and parseable, every PNG URL resolves),
survey(runspyauto-brain eyes survey <instance root>per registered instance).stating the layering (project repos make, store and track figures; the
organ is where the human checks in on visualization across all projects;
same layering as
autolens_profiling/autolens_inferenceunder theBrain board),
repos_sync:mapmarkers kept.lint.yml(ruff, pytest,pyauto-eyes check, lychee);pages_dashboard.yml+dashboard_refresh.ymlonrepository_dispatch(
eyes-refresh, fired by each project repo'srender.yml) and a dailycron (Cortex pattern).
fabricated manifest,
check. Then replace the BrainWITNESS_EXEMPTentry (
tests/test_policy_seams.py) with apyautoeyes:row inconfig/policy.yaml's witness map.Ship policy
PyAutoBrain (witness row) merges after PyAutoEyes. While Heart is RED the PRs
ship only under a contemporaneous human RED override. Merge stays human.