[6.12.0] Generated _config catalogues: skill-manifest.csv paths all resolve to nothing, and bmad-help.csv mixes two phase naming schemes
Two defects in the generated _bmad/_config/ catalogues on a fresh 6.12.0 install. Both are install-time output rather than anything a user edited, and both matter to anything that reads the install programmatically (my case is a scheduler that reads the phase graph to decide what to run next).
Repro — one command, into an empty git repo:
npx [email protected] install --yes --directory ~/Code/<project> \
--modules bmm --tools claude-code
_bmad/_config/manifest.yaml then reads installation.version: 6.12.0. Environment: Linux, node via npx, uv 0.12.10 (the installer's uv check passed).
1. skill-manifest.csv names 29 files and none of them exist
Every row points at _bmad/core/<skill>/SKILL.md. The installer wrote the skills to .claude/skills/<skill>/SKILL.md — the directory chosen by --tools claude-code — and created no _bmad/core/<skill>/ at all.
python3 -c "
import csv, pathlib
root = pathlib.Path.home() / 'Code/<project>'
rows = list(csv.DictReader(open(root / '_bmad/_config/skill-manifest.csv')))
print(len(rows), 'rows,', sum(1 for r in rows if not (root / r['path']).exists()), 'paths missing')"
29 rows, 29 paths missing
$ ls ~/Code/<project>/_bmad/core
v6-shims
$ ls ~/Code/<project>/.claude/skills/bmad-brainstorming/SKILL.md
.../.claude/skills/bmad-brainstorming/SKILL.md
Expected: the path column resolves, or is documented as relative to something other than the project root.
Actual: it resolves to nothing, so the manifest cannot be used to locate a skill. A consumer that trusts it silently hands out paths to files that are not there.
I do not know whether the intent is that _bmad/core/<skill>/ should have been created and was not, or that the column should name the tool directory. Either way the manifest and the tree disagree.
2. The phase column mixes two naming schemes
_bmad/_config/bmad-help.csv, 25 skill rows (excluding the _meta row):
| phase | rows |
|---|---|
anytime |
12 |
plan |
6 |
ship |
5 |
2-planning |
2 |
The two on 2-planning are bmad-prd and bmad-ux. Every other row uses an unnumbered name. The same two appear in _bmad/bmm/module-help.csv, so both files look to be generated from one source.
python3 -c "
import csv, collections, pathlib
p = pathlib.Path.home() / 'Code/<project>/_bmad/_config/bmad-help.csv'
rows = [r for r in csv.DictReader(open(p)) if r['skill'] and r['skill'] != '_meta']
print(collections.Counter(r['phase'] for r in rows))
print([r['skill'] for r in rows if r['phase'][:1].isdigit()])"
Counter({'anytime': 12, 'plan': 6, 'ship': 5, '2-planning': 2})
['bmad-prd', 'bmad-ux']
It also shows up in preceded-by: bmad-prd is 2-planning and names bmad-product-brief as preceding it, which is plan.
Expected: one scheme, so the column can be grouped or sorted.
Actual: a consumer grouping by phase gets a 2-planning bucket holding two skills beside three named buckets, and cannot tell whether 2-planning is meant to be an ordinal position that the others have lost or a leftover from the older naming.
Cross-phase preceded-by links are not in themselves a problem — bmad-build (ship) naming bmad-sprint-planning (plan) reads fine. It is only the mixed naming that is ambiguous.
Happy to test a fix against the same install. If either of these is intended behaviour I would value a pointer to where the contract is written down, and I will read that instead.
Source: bmad-code-org/BMAD-METHOD