Skip to content

Commit efdca45

Browse files
authored
Merge pull request #365 from PyAutoLabs/feature/dashboard-bundles
mind: bundles.md registry + dashboard Bundles section
2 parents 9fc1c88 + 7bcdc00 commit efdca45

5 files changed

Lines changed: 54 additions & 1 deletion

File tree

.github/workflows/dashboard_refresh.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ on:
3535
- "parked.md"
3636
- "planned.md"
3737
- "condemned.md"
38+
- "bundles.md"
3839
- "dashboard.md"
3940
- "dashboard.html"
4041
pull_request:
@@ -45,6 +46,7 @@ on:
4546
- "parked.md"
4647
- "planned.md"
4748
- "condemned.md"
49+
- "bundles.md"
4850
- "dashboard.md"
4951
- "dashboard.html"
5052
workflow_dispatch:

REFERENCE.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,8 @@ Free-form markdown. Strong conventions:
304304
Filed: 2026-07-09 # optional; the day the prompt was written
305305
Issued: 2026-08-19 # optional; set when the prompt advances to active/
306306
Blocked-by: PyAutoFit#1436 # optional; see "Declaring a gate" below
307+
Epic: cluster-strong-lensing # optional; an entry in epics.md
308+
Bundle: euclid-pipeline-tidy # optional; an entry in bundles.md
307309
```
308310

309311
When present, `Type:` should match the work-type folder. The goal is light
@@ -339,6 +341,18 @@ Free-form markdown. Strong conventions:
339341
had closed without anyone noticing — including one whose exit condition was met
340342
the same day it was written.
341343

344+
**Declaring group membership — `Epic:` / `Bundle:`.** Both optional, both
345+
naming a slug in the matching registry file, and the two mean opposite things
346+
about ORDER. `Epic: <slug>` (`epics.md`, plus an optional `Phase: <n>`) says
347+
this prompt is one phase of an ordered programme: the dashboard pulls it out
348+
of every pick list and shows it only under its epic, worked in phase order.
349+
`Bundle: <slug>` (`bundles.md`) says the opposite — this prompt is
350+
INDEPENDENT, and a human has pinned it to a set worth running in one
351+
orchestrated session. A bundle member keeps its normal place on the
352+
dashboard and gains a Bundles card; it leaves only the *auto*-bundle pool,
353+
since it is already spoken for. A slug naming no registry entry still
354+
groups, loudly (⚠️ on the page), so a typo is visible rather than silent.
355+
342356
The optional `Difficulty:` / `Autonomy:` / `Priority:` keys let both people and
343357
PyAutoBrain see, at a glance, how hard a task is, whether an agent can safely
344358
take it on, and how urgent it is. What each `Autonomy:` level *does* at every
@@ -497,7 +511,7 @@ no prompt.
497511
| Ledger — merged automatically | Code — always a human |
498512
|---|---|
499513
| `draft/**`, `active/**`, `complete/**` | `scripts/`, `tests/`, `.github/`, `skills/`, `policy/`, `docs/` |
500-
| `active.md`, `planned.md`, `parked.md`, `condemned.md`, `epics.md`, `ideas.md`, `autonomy_log.md` | `repos.yaml`, `README.md`, `AGENTS.md`, `REFERENCE.md`, `ROUTING.md`, … |
514+
| `active.md`, `planned.md`, `parked.md`, `condemned.md`, `epics.md`, `bundles.md`, `ideas.md`, `autonomy_log.md` | `repos.yaml`, `README.md`, `AGENTS.md`, `REFERENCE.md`, `ROUTING.md`, … |
501515
| `dashboard.md`, `dashboard.html` | anything unclassified — a new root file, a new top-level folder |
502516

503517
Two exceptions inside the ledger dirs: a **dot-path** anywhere, and a file

bundles.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Bundles
2+
3+
Sets of **independent** tasks that make sense to run in one orchestrated
4+
session: an architect session (Fable) plans them, subagent sessions (Opus)
5+
implement them, and every member still gets its own issue and its own PR — so
6+
`/prm` closes each one out exactly as it would a standalone task. The skill
7+
that runs one is `start_bundle` (PyAutoBrain).
8+
9+
**A bundle is not an epic.** An epic is *ordered* and phase-gated: one phase at
10+
a time, worked through its ledger, and its members are pulled out of the pick
11+
lists so nobody starts phase 3 first. A bundle is a *flat set* — its members
12+
have no order and no dependency on each other, so they stay in their usual
13+
dashboard sections and a bundle is only an additional VIEW of the backlog. If
14+
the members must happen in order, it is an epic (`epics.md`), not a bundle.
15+
16+
This file holds **pinned** bundles only — the ones a human decided are worth
17+
doing together. The dashboard also proposes **auto** bundles, computed fresh
18+
from the backlog every time it is rendered (same target repo, unblocked,
19+
non-epic, under a size cap, minimum two members); those are proposals and are
20+
never written here. Pinning is how a proposal becomes a record — and how a
21+
bundle that spans repos, or that no rule would ever spot, gets onto the page.
22+
23+
Schema per entry: `## <slug>` then `- title:` / `- members:` / `- rationale:`
24+
(why these belong in one session) / `- status:` (optional, coarse and durable).
25+
`- members:` opens a list of prompt paths, one per indented ` - <path>`
26+
bullet, and closes at the next `- key:` line.
27+
28+
A member prompt may also declare its own membership in its header:
29+
`Bundle: <slug>` (this file's slug). A prompt carrying that header leaves the
30+
auto pool, and if its slug names no entry here the dashboard renders the group
31+
with a ⚠️ rather than silently dropping it.
32+
33+
<!-- No entries yet: the dashboard's auto bundles cover the same-repo case, so
34+
pin one only when the grouping is something a rule would not find. -->

scripts/ledger_merge.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"parked.md",
5858
"condemned.md",
5959
"epics.md",
60+
"bundles.md",
6061
"ideas.md",
6162
"autonomy_log.md",
6263
"dashboard.md",

scripts/spawn.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
("AI_POLICY.md", "KEEP_SUB"), ("CONTRIBUTING.md", "KEEP_SUB"),
8181
("repos.yaml", "SPECIAL:body_map"),
8282
("active.md", "EMPTY"), ("planned.md", "EMPTY"), ("epics.md", "EMPTY"),
83+
("bundles.md", "EMPTY"),
8384
("parked.md", "EMPTY"), ("condemned.md", "EMPTY"), ("ideas.md", "EMPTY"), ("queue.md", "EMPTY"),
8485
("autonomy_log.md", "SPECIAL:autonomy_log"),
8586
# Prompt-file lifecycle (issue #71): draft/ (not-started) -> active/
@@ -250,6 +251,7 @@
250251
"dashboard.md": "# PyAutoMind Dashboard",
251252
"active.md": "# Active Tasks",
252253
"epics.md": "# Epics",
254+
"bundles.md": "# Bundles",
253255
"planned.md": "# Planned",
254256
"parked.md": "# Parked tasks",
255257
"condemned.md": "# Condemned material",

0 commit comments

Comments
 (0)