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
33 changes: 29 additions & 4 deletions agents/conductors/intake/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@ Writes the light header PyAutoMind blesses (`README.md` "Prompt file format"),
extended with `Difficulty:/Autonomy:/Priority:`. No YAML frontmatter, no required
schema — light structure over free-form prose.

`Themes:` is written at formalisation, directly under `Repos:` and in the same
list shape (`intake classify --themes mge,jax-gradient`, primary keyword
first). `Target:` says where the code lives; `Themes:` says what the work is
about, and it is what the auto-bundler groups on. The vocabulary is
`PyAutoMind/themes.md` — a markdown list a human edits, read by `parse_themes`,
never a second copy in here. Optional and never blocking: a prompt formalises
with or without it, an unknown keyword still groups (⚠️ on the card, counted in
the page's Hygiene section), and an un-themed prompt falls back to `Target:`.

## Modes

| Mode | Command | What it does |
Expand Down Expand Up @@ -119,10 +128,26 @@ per member, one shared worktree per repo), which makes it the exact opposite of
an epic: no order, no phase gate, and members stay in every pick list above,
because a bundle is an additional VIEW and never a replacement. Two sources:
**pinned** entries in `PyAutoMind/bundles.md` (plus any prompt whose header says
`Bundle: <slug>`), and **auto** bundles this renderer computes — same target
repo, no epic member, no declared `Blocked-by:`, no `human-required`, no
`too-large`, packed under a size cap (`BUNDLE_*`: small 1 / medium 2 / large 4
points, cap 8, at most one large, 2-4 members) in priority-then-path order.
`Bundle: <slug>`), and **auto** bundles this renderer computes — no epic
member, no declared `Blocked-by:`, no `human-required`, no `too-large`, packed
under a size cap (`BUNDLE_*`: small 1 / medium 2 / large 4 points, cap 8, at
most one large, 2-4 members).

Auto bundles are pooled by `_pool_key`: a prompt's **primary theme** (the first
`Themes:` bullet) when it has one — the topical key, cross-repo by design — and
its **`Target:`** when it does not, which is what the bundler keyed on before
themes existed, so an un-themed backlog renders exactly as it did. Every prompt
has one key, so it lands in at most one auto bundle. Inside a pool
`_pack_by_affinity` seeds with the most pickable member (priority, then path)
and then adds whichever remaining candidate that still fits shares the most
keywords with the seed (Jaccard over the whole list; ties: priority, then the
seed's repo, then path) — so a large pool splits by what the work is about
rather than by filename order. With no themes every overlap is 0.0 and this
reduces, member for member, to the old priority-then-path first fit. A
theme-keyed card is titled `<primary>` plus the keywords every member shares
(`mge · jax-gradient`) and its members table carries a **Repo** column, because
it is cross-repo by construction; a Target-keyed card keeps `<target> — bundle
n` and no column, where that column would be a constant.
The proposals are then ranked (most urgent member, then biggest session, then
slug) and only the first `BUNDLE_LIST_MAX` reach the page, with a footer saying
what was left off and that pinning keeps it — the same pick-list-not-inventory
Expand Down
Loading
Loading