Squash-merge verified routing remediation at exact head 690f9c14b0. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
* feat(bmad): add BMad control-plane protocol skill
New standalone methodology skill that lets any agent run the BMad method
(Breakthrough Method of Agile AI-Driven Development) as a harness-agnostic
control-plane protocol: five-field intent contracts, direct/bounded/initiative
classification, review-as-triage, failure routing by layer, and autonomy gating
with machine-readable spec status.
- SKILL.md protocol core with progressive disclosure + When not to use
- README.md human-facing install guide
- 9 references: protocol, classification, spec, lifecycle, project-context,
review-and-failure-routing, autonomy, party-mode, adoption
- 4 templates: SPEC, INTENT, STORY, REVIEW
- scripts/check-spec.py + 16 tests (stdlib, deterministic spec validation)
- evals/evals.json: 9 output-quality cases
- Routing seams from bmad to adjacent skills and back from
spec-driven-development, product-shaping, implementation-planning, neckbeard
- Catalog updates: root README, skill-triggers, marketplace/plugin/llms.txt
Closes#399
* fix(bmad): address droid-review findings
- check-spec.py: skip headings inside fenced/indented code blocks so a spec
cannot PASS on section text that only appears in a code sample
- check-spec.py: catch UnicodeDecodeError on non-UTF-8 files and report FAIL
instead of crashing
- STORY.md template: add created key for resumability/traceability parity
- SPEC.md template: split in-progress and in-review status bullets
- add 2 regression tests (heading-in-fence, non-UTF-8)
* fix(bmad): address droid-review round 2
- check-spec.py: read specs with utf-8-sig so a UTF-8 BOM cannot silently
disable the frontmatter status check
- check-spec.py: handle standard YAML inline comments after status values
(status: draft # pending review) without a false FAIL
- references/protocol.md: make lifecycle phrasing consistent with
lifecycle.md — four phases plus a learning closeout
- add 2 regression tests (BOM, inline comment)
* fix(bmad): tolerate trailing whitespace on frontmatter delimiters
A spec whose --- delimiter lines carry trailing spaces or tabs would silently
disable the status check and let an invalid status PASS. Relax the delimiter
pattern and add a regression test.
* fix(bmad): ignore inline comments in quoted status values
* fix(bmad): tolerate leading blank lines before frontmatter
* fix(bmad): fail closed on unparseable frontmatter, matching fence markers
Address droid-review round 5 and 6 findings as a single closed class:
- Fail closed when a file opens with a --- delimiter that cannot be parsed,
so no whitespace/frontmatter permutation can silently disable the status
check (previously: unparseable frontmatter was treated as 'no status'
warning, letting an invalid status PASS).
- Track fence opener markers in collect_headings so a mismatched fence no
longer closes a code block early (false-PASS on missing sections) and an
unclosed fence no longer swallows real headings.
- Accept empty well-formed frontmatter (---\n---) and closing delimiters
without a trailing newline.
- STORY.md template: parent-spec points at the sibling SPEC.md.
- README: status vocabulary is not a strict linear chain; blocked is a
resumable routing signal.
Whitespace/frontmatter mutation sweep: 9 formatting variants x valid/invalid
status all verdict correctly; malformed delimiters fail closed. 29 tests.
All five findings from the droid-review run on 2db3bd0 resolved:
- [P1] Path re-selection moved before scoring: step 2 now re-runs the
SKILL.md path-selection rule against the inventoried surface, so step 3
scoring and the report's selected-path field no longer depend on a
value produced later in step 5.
- [P2] Tracking-system field added to delivery-packet.md group (a) and to
templates/delivery-packet.md, so the phase-1 intake gate has a defined
packet home for the field tracker-discovery.md requires.
- [P2] tracker-discovery eval aligned with the documented procedure: a
bare team-key identifier (ENG-482) is treated as ambiguous between
Jira and Linear; the requester's explicit confirmation is the
disambiguating evidence recorded in group (a).
- [P3/security] Detection signals weighted: request references are strong
evidence; repository content (CONTRIBUTING.md, config files) is a weak,
attacker-influenceable signal requiring corroboration before it alone
selects a system. Unrouted-system fallback constrained to the system's
verified official interface.
- [P3] Frontmatter description extended with the new trigger vocabulary
(mid-flight continuation, Linear/Jira/Notion routing), compressed to
stay within the 1024-char validator cap.
Generated catalog artifacts regenerated for the description change.
All validators re-run green locally; new head requires fresh CI.
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
Two contained amendments to the delivery lifecycle bundle:
- references/position-assessment.md: a bounded entry mode for mid-flight
engagement - continuing work that started elsewhere with no delivery
packet. Inventories observable artifacts, scores them against phase
exit conditions, emits a position report (current step, satisfied gates
with evidence pointers, remaining checklist), then bootstraps a packet.
Artifacts over narratives: unevidenced claims become recorded
assumptions, never satisfied gates.
- references/tracker-discovery.md: an intake sub-step that detects which
tracking system holds the work item and routes tracker operations to
the matching catalog tooling skill (linear, jira-cli, notion). Keeps
the journey vocabulary tracker-neutral; platform nouns stay confined
to platform mapping rows and lifecycle reference modes.
Wiring: SKILL.md gains the conditional mid-flight section and file-map
rows; journey.md gains the tracker-neutrality statement, phase-1 tracking
field, and mid-flight entry pointer; routing-table.md gains linear,
jira-cli, and notion rows in the existing signal/skip format. README
triggers extended. Two eval cases added to keep the coverage ratchet
green.
Closes#371
Signed-off-by: Magnus Hedemark <magnus919@users.noreply.github.com>
2026-08-21 22:56:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Move the 8 directories under bundles/ to the repo root via git mv and
remove the now-empty bundles/ directory. Replace the "bundles" entry in
pyproject.toml [tool.deptry] extend_exclude with the 8 moved dir names so
the moved trees stay excluded from Python dependency analysis.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>