Repository navigation
Description
Overview
Phase 2 of the autonomous-orchestrators epic: make the organism parse what phase 1 wrote. Lane: gains the resource values ral | gpu | wsl-data (each implying local-dev), the batch planner routes and reports by them, a new batch brief --check validates shift briefs against the PyAutoMind/batches/AGENTS.md schema, intake proposes resource lanes and stops dropping declared optional headers, and the census/dashboard show a lane histogram. Nothing here merges or dispatches anything.
Plan
- Sizing faculty accepts the three new
Lane:values, treats all butanyas laptop-only, and rejects the staleany | local-devspelling. - Batch planner routes lanes through one helper, prints the pool's lane histogram, names the resources in the other-lane line.
- New
batch brief --check <file>(errors name the key) andbatch plan --brief <file>(named tasks first, then the dip, budget from the brief). - Example brief shipped under
PyAutoMind/batches/examples/; a Mind test pins that lifecycle never scans it. - Intake proposes
Lane: ral/gpu/wsl-datafrom the text and passes declaredEpic:/Phase:/Filed:/Blocked-by:/Closes-when:/Lane:through unchanged. intake censusand the dashboard backlog show a lane histogram.
Tier: glance — merge mode: auto-merge on green if the Witness passes, post-merge summary
Detailed implementation plan
Affected Repositories
- PyAutoBrain (primary)
- PyAutoMind
Branch Survey
| Repository | Current Branch | Dirty? |
|---|---|---|
| ./organs/PyAutoBrain | main | clean |
| ./organs/PyAutoMind | main | clean |
Suggested branch: feature/autonomous-orchestrators-p2 (both repos); worktree root ~/Code/PyAutoLabs-wt/autonomous-orchestrators-p2/
Implementation Steps
agents/faculties/sizing/_sizing.py—LANE_VALUES = ("any","local-dev","ral","gpu","wsl-data"),lane_is_local(), first-valid-declaration-wins, an invalid value is recorded aslane_invalidand read asany.agents/conductors/batch/_batch.py—_lane_okvialane_is_local;lane_countsin the BatchDecision, printed;other_lane_readybecomes a per-lane breakdown (3 ral, 1 gpu).- New
agents/conductors/batch/_brief.py+batch brief --check <file>:review-at:ISO and later thandispatched:; integerreview-minutes/merge-cap≥0;lanes⊆ known values (cloudrefused);backlog: none|fill-idle|scoped(scopedneedsscoped:);ral-allowance:required withral; named tasks resolved indraft//active/(unresolved = warning);merge-cap > 0refused when every named task isjudgeandbacklog: none(approved refinement); refused while the newest previous record lacksreview-minutes-actual:.batch plan --brief <file>restricts the pool to named tasks, then the dip policy, reporting against the brief'sreview-minutes. - PyAutoMind
batches/examples/shift_brief_example.md(+ README line);tests/assertslifecycle.pynever reads a record placed inexamples/. agents/conductors/intake/_intake.py—_render_headerpasses declaredFiled/Epic/Phase/Blocked-by/Closes-whenafterStatus:andLane:afterUnattended:; lane inference (RAL/SLURM/sbatch/euclid_jump →ral; CUDA/laptop GPU →gpu;/mnt/c/Workspace/Science→wsl-data; precedence ral > gpu > wsl-data; written only when notany; a declared value wins).- Census —
by_laneincensus(), printed byemit_census, a lane line on the dashboard Backlog section (md + html);lane_invalidas a hygiene flag. - Tests for every Witness clause (a)–(e).
Scope note (approved): this fixes the header pass-through half of draft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase.md; at close-out that prompt is re-scoped to its Memory:-gating half, not closed.
Key Files
PyAutoBrain/agents/faculties/sizing/_sizing.pyPyAutoBrain/agents/conductors/batch/_batch.py, new_brief.pyPyAutoBrain/agents/conductors/intake/_intake.pyPyAutoMind/batches/examples/shift_brief_example.md,PyAutoMind/tests/
Original Prompt
Click to expand starting prompt
Autonomous orchestrators phase 2: Lane: resource values, the shift-brief validator, intake pass-through and census
Type: feature
Target: PyAutoBrain
Repos:
- PyAutoBrain
- PyAutoMind
Themes: - autonomy
- orchestration
Difficulty: medium
Autonomy: supervised
Priority: high
Status: formalised
Epic: autonomous-orchestrators
Phase: 2
Filed: 2026-11-03
Consequence: glance
Witness:pytest PyAutoBrain/tests -qgreen with new tests that (a) parseLane: ral,gpu,wsl-dataand keepany/local-dev, and rejectLane: any | local-dev; (b) assert_lane_ok("ral","web-github")is False and_lane_ok("ral","local-dev")True for all three new values; (c)batch brief --checkacceptsPyAutoMind/batches/examples/shift_brief_example.mdand refuses the same file withreview-at:removed, withlanes: cloudand with amerge-cap:above 0 for a brief whose named tasks are alljudge; (d)intake classifyon a text naming RAL proposesLane: raland a declaredEpic:/Phase:/Filed:/Lane:survives--applyunchanged; (e)intake censusprints a lane histogram whose total equals the prompt count
Review-minutes: 5
Unattended: ready
Lane: any
Parent: draft/feature/pyautobrain/autonomous_orchestrators_epic.md ("Lane, not Needs").
Starts only after phase 1 merges (epic phase order; the schema this validates is written
there). Phase 1 wrote the words; this phase makes the organism parse them. It is the code half of
the original phase 1, split out because a prose-only autonomy edit is judge and this is
glance with a real witness.
Deliverables
- Sizing faculty (
agents/faculties/sizing/_sizing.py):LANE_VALUES = ("any", "local-dev", "ral", "gpu", "wsl-data"); a helperlane_is_local(lane)that is True for
everything butany; keep the first-declaration-wins rule. - Batch planner (
agents/conductors/batch/_batch.py):_lane_okroutes through
lane_is_local; the BatchDecision prints the lane histogram of the pool; the
"other lane's ready count" line names the resources (3 ral, 1 gpu). batch brief --check <file>: validate a shift brief against the schema phase 1 fixed
inPyAutoMind/batches/AGENTS.md; errors name the key. Ship the example brief under
PyAutoMind/batches/examples/(ignored bylifecycle.py check's drift scan — add the
exclusion with a test).plan --brief <file>restricts the pool to the brief's named
tasks first, then the dip policy, and reports the review-minute total against the brief's
budget.- Intake (
agents/conductors/intake/_intake.py): proposeLane: ral/gpu/
wsl-datawhen the text names RAL/SLURM/euclid_jump, the laptop GPU/CUDA, or/mnt/c
/ a Science dataset path; pass declared optional headers (Epic:,Phase:,Filed:,
Blocked-by:,Closes-when:,Lane:) through_render_headerunchanged (this is the
bugdraft/bug/pyautobrain/intake_classify_file_drops_declared_epic_phase_filed_headers*.md
reports; fix it here or there, not both — whichever lands first closes the other). - Census: a lane histogram in
intake censusand the dashboard's backlog page.
Out of scope
The watcher, dispatch and leases (phase 3); any change to merge authority (phase 1 prose
governs; nothing here merges anything).
Activity
Jammy2211 commentedon Nov 3, 2026
Shipped — merged 2026-11-03 by the tiered glance close-out (plan approved by the human; Heart YELLOW reason set acknowledged at ship).
batches/examples/shift_brief_example.md+ README; lifecycle test pinning thatexamples/is never a record.Lane:resource values +lane_is_local, planner lane counts/resources,batch brief --check+plan --brief, intake header pass-through + lane inference, census/dashboard lane histogram; 28 witness tests.Witness green: 28/28 clause tests,
brief --checkOK on the shipped example, census lane total = prompt count (289); full suites Brain 1437 / Mind 712. First CI run was red on the tenant firewall only (instance facts in new files) — fixed in f3fc8fc, second run green on both legs.Revert:
git revert -m 1 af2af89d(Brain) andgit revert -m 1 4d4fb932(Mind). Next: phase 3 (watcher, dispatch safety, digest).