Skip to content

bmadconfig: read the four-layer central TOML as primary, legacy bmm/config.yaml as fallback #154

Description

@pbean

Context

bmadconfig.load_paths resolves implementation_artifacts / planning_artifacts from the legacy _bmad/bmm/config.yaml only. The renderer-era bmad-dev-auto (BMAD-METHOD #2587/#2588) resolves the same keys from the four-layer central TOML (_bmad/config.toml + config.user.toml + custom/config.toml + custom/config.user.toml), with [modules.bmm] beating [core] on collision.

The BMAD installer regenerates the per-module yaml from the TOML on each install/update, so the two surfaces normally agree — but a hand-added custom/config*.toml override desyncs them until the next install: the skill then writes specs and the deferred-work ledger where the orchestrator is not looking.

Current mitigation

The renderer-compat PR adds bmadconfig.toml_artifact_parity, a validate-time warning (never a FAIL) that deep-merges the four layers with the renderer's exact precedence and compares the resolved implementation_artifacts against the yaml-resolved path.

Proposed fix

Make load_paths read the four-layer TOML as the primary source (same merge + flatten semantics as render.py: layers deep-merge lowest→highest, then [core][modules.bmm] flatten with module precedence), falling back to _bmad/bmm/config.yaml for pre-#2285 installs. The parity warning then becomes unnecessary and toml_artifact_parity can be retired.

Care points:

  • repo_root and output_folder are also read from the yaml today — decide their TOML home before switching.
  • {project-root} substitution must match render.py (forward-slash root).
  • Keep BmadConfigError messages actionable for both surfaces.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions