Skip to content

PR #155 disposition: partly superseded by the 0.9.1 renderer port, needs reconciling on main #410

Description

@pbean

Context

Follow-up from #405 / PR #406.

PR #155 (fix/renderer-era-dev-auto, draft, open since 2026-07-15, last touched 2026-07-23)
targets main. PR #406's review round ported the load-bearing half of it onto the 0.9.1 hotfix
branch — adapted, not cherry-picked — and deliberately cut the rest. #155 is therefore now
partly superseded and partly wrong, and it must be reconciled during the release's forward-port
to main rather than merged as-is or closed silently.

What landed in 0.9.1 (adapted from #155)

  • _seed_bmad_tree — whole-directory per-file merge of the repo's _bmad/ into the
    worktree, copy-when-absent, BMAD_SEED_EXCLUDES = ("render",) skipped before descending, the
    seed_files loop's resolve-and-contain symlink guard.
  • /_bmad/render/ exclude inside the worktree, and _bmad/render/ in init's gitignore tuple.
  • _bmad_scripts_seed_incomplete — new, fix(worktree): survive the renderer-era bmad-dev-auto (BMAD-METHOD #2587/#2588) #155 could not have needed it; reports a short
    _bmad/scripts/ seed through the existing worktree-seed-skipped channel, as the exported
    BMAD_SCRIPTS_SEED_REL sentinel. The engine escalates on that one entry and pauses the run
    (added in the same review round that reversed the _require_base_skills cut, below): the
    fault is identical for every story, so dispatching would burn the backlog on result-less
    Stops.
  • _require_base_skills now hard-blocks the two renderer checks — see the reversal note
    under the cut table.

What was cut, and why it must not be revived unchanged

Cut Reason Tracked as
--render-probe / _run_render_probe Guesses an argv the agent actually substitutes; green would be a lie #407
toml_artifact_parity, _TOML_LAYERS, _toml_merge Model is wrong now: ambiguity is a RenderError, not "bmm wins"; plain deep-merge vs structural_merge #408
tracked_render_warning Hygiene, not a HALT #409
renderer_shim_trees Hardcodes the legacy skill dir; this branch resolves per tree via resolve_dev_primitive, and keying on the name violates the era-agnostic rule
missing_renderer_support's uv-on-PATH FAIL A validate-host PATH probe does not answer the session-PATH question (fresh panes); the stub already reports uv-missing loudly
missing_renderer_support's "render.py next to SKILL.md" FAIL Same condition as the shipped skills.dev-renderer, relocated because upstream moved the script — porting it would double-report
One-line addition to _require_base_skills REVERSED — now taken, see below
CONTRIBUTING.md paragraph Asserts uv is checked, which we deliberately do not

Reversal (2026-07-30): the _require_base_skills row is now TAKEN

Codex re-reviewed PR #406 and refiled this, and the cut rationale did not survive inspection.
"Newly aborting projects that pass today" means projects that pass validate, not projects
that work: a resolved renderer stub with no _bmad/scripts/render_skill.py (or no
_bmad/config.toml) HALTs every unattended session, so the green preflight was promising a
run that could not possibly produce a result. And both check ids are new in 0.9.1 and
unreleased, so promoting their severity before the release costs no shipped behaviour —
there is no project in the field whose passing run this takes away.

The shape differs from #155's one-liner, so do not port that either: _require_base_skills has
no severity filter at all — it FAILs on whatever missing_base_skills returns — so the two
emitters moved out of dev_primitive_warnings into missing_base_skills at severity
problem. dev_primitive_warnings keeps only skills.customize-legacy, which is genuinely
survivable (the session runs, unstyled). run --dry-run's "NOT runnable as-is" banner reads
the same list and picked both conditions up for free.

RENDERER_PROBE_TEXT = "render.py" in #155 is also dead on arrival: it is not a substring of
render_skill.py, so its era gate would silently never fire. install.RENDERER_SCRIPT_MARKER
is the correct marker.

Forward-port hazards (main has moved under #155 and under 0.9.1)

  1. Provisioning was rehomed. provision_worktree now lives in worktree_flow.py:70 on
    main (Engine collaborator extraction: worktree + rollback clusters, rehome provision_worktree #244 collaborator extraction), not install.py. The 0.9.1 patch is against
    install.py and will not apply.
  2. The exclude mechanism changed shape. _worktree_local_exclude on main returns
    str | None and, since provision_worktree's exclude patterns are repo-wide and permanent: new files under .claude/skills silently stop being staged in the main checkout #384, writes to the worktree-scoped
    .git/worktrees/<id>/info/exclude activated by a worktree-scoped core.excludesFile — not
    the common .git/info/exclude. The 0.9.1 gate on /_bmad/render/ ("only when the worktree
    has a _bmad/, because the exclude file is shared with the main checkout") is reasoned from
    the old mechanism. On main the pollution argument no longer holds, so re-derive the gate
    there instead of transplanting the condition — and keep its ablation
    (…render_shield_only_when_bmad_present) honest to whichever rationale survives.

Disposition

Decide one of: rebase #155 onto post-forward-port main reduced to only what was not ported,
or close it with a pointer to #407/#408/#409. Either way it should not stay open as an unrebased draft
that reads as "the renderer fix, still pending".

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:configBMAD config resolution and the setup skillblocked:prAn open PR in this repo would close or unblock it

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions