Files
BMAD-METHOD/docs/plan
Brian Madison f6ffa3533b feat(ticket): layer the store config, add tracker mirror, and cut bmad-ticket's prompt
Applies the nine recommendations of a quality analysis of bmad-ticket. The skill's always-loaded prompt is smaller, each rule has one home, the store config follows skill updates, and tickets.py does the mechanical work the prompt used to describe.

Prompt

- SKILL.md goes from 3,319 to 2,628 tokens. The autonomous-mode section is folded into the role paragraph, Intake is four bullets, the customization key table is a list, and the tree layout moves in from board.md. Terms gains Envelope and loses Opening epic.
- On the repo store, "what is ready" and "what is the status" are answered from tickets.py next or status without loading a reference. A tracker store goes to board.md first.
- "Refine" now means only expanding a ticket to full acceptance criteria. Going over a pulled story without writing full criteria is a "review", done only when the user asks. references/ticket.md is the one home for both, with a table of where each kind of change is written. slice.md no longer carries its own copy.
- references/board.md is reorganised: reading the tree, with one table of output keys and what to do about each; Publish; Start; Status, with who writes each status and the repo store and tracker split apart; Close, drop, move; Tracker sync. It now states once the rules the six store starters each repeated.
- references/slice.md holds the slicing method that was in customize.toml: what makes a good story, the tracer bullet, lanes, touch points, the platform baseline as the opening epic. Decisions are recorded as Decision: lines when they are made.
- references/tree-rules.md leaves the skill and becomes tools/ticket-tree-rules.md, a maintainer page for the skills that share the tree, named in AGENTS.md. No skill loads it.
- The description gains triggers for validating tickets, sizing an epic, and setting up the store.

Behaviour changes

- A prerequisite is met when it is done or in review. The starters said done only, against tickets.py.
- drift covers hitl as well as after, wherever the file and entry rule is stated.
- An entry is never deleted from an approved tickets.toml. It is marked dropped, so its id is not reused.
- Among several ready tickets, the first in build order is offered. The starters said the one that unblocks the most.
- On a tracker, a mirrored assignee lives in the leaf file; a plan with no assignee key no longer blanks it.
- First use no longer stops for store setup, and setup no longer ends in a session restart.

Store config

- The project's _bmad/custom/ticketing-store-config.toml is now a layer over the skill's starter for the store, not a copy of it. It names the store and holds only what the project sets; a key it sets replaces the starter's, tables merging key by key. With no file the store is the repo store.
- scripts/read_store.py replaces read_toml.py and reads the two layers as one. --starters lists the shipped stores.
- The starters keep only store-specific commands and facts. gh-ticketing.toml is renamed github-ticketing.toml so every file is named for its store.
- references/store-setup.md is rewritten for this: choose, write the project file, connect, prove, plus switching trackers, a status the tracker lacks, and where a house rule on a verb goes.

Customization

- Removed: refinement, container_definition, prose, estimation.leaf_scale, and the auto value of publication, whose default is now at_inception. The first three were method, not team choices; leaf_scale could not be replaced because arrays append.
- slice_to_epics, slice_to_tickets, and ordering hold only the team's own rules.
- Checks that rested on another key now name it instead of restating its default, so replacing the key changes what is checked.

tickets.py

- mirror writes what a tracker returned (tracker_id, remote, tracker_status, assignee, after) into leaf files, pulling a file when the entry has none. It writes nothing when a value is invalid or would leave the tree unreadable, and a tracker_id given alone matches only a ticket that already carries it.
- status reports next_id, the id a new ticket in a folder takes, and estimate totals when tickets carry points.
- next gives a blocked row waiting_on, its unmet prerequisites.
- drift on a status row gives the file's and the entry's value of each field that differs, instead of true.
- With no folder, next and status also report the backlog folder, and find, mark, and mirror look there for a ticket the initiative does not hold.
- A folder may be given by name alone: it is looked up under the store, then the active initiative.
- --help prints the full interface, with a description per command.

Other skills and docs

- bmad-build and bmad-build-auto recognise a dropped plan. Build says the ticket was dropped and halts; build-auto halts with "dropped plan supplied" and leaves the plan as it is. Both plan templates list dropped.
- bmad-retrospective and the bmod-method help pages say a story file exists once it is pulled, reviewed, refined, or published, not "when refined".
- The method help, docs/plan/set-up-the-ticket-tree.md, and the v6 migration describe the new store config; the migration no longer creates one.

For existing installs

- A project file that is a whole copy of an old starter still overrides the new verbs until it is cut down to store, the address fields, and what the team changed.
- An override that sets refinement, container_definition, prose, or publication = "auto" no longer has an effect.
- Anything that read drift as true, or called read_toml.py, needs updating.
2026-10-02 09:08:35 -05:00
..