You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
_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
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 #155and under 0.9.1)
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".
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 hotfixbranch — 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
mainrather 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 theworktree, copy-when-absent,
BMAD_SEED_EXCLUDES = ("render",)skipped before descending, theseed_files loop's resolve-and-contain symlink guard.
/_bmad/render/exclude inside the worktree, and_bmad/render/ininit'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 existingworktree-seed-skippedchannel, as the exportedBMAD_SCRIPTS_SEED_RELsentinel. The engine escalates on that one entry and pauses the run(added in the same review round that reversed the
_require_base_skillscut, below): thefault is identical for every story, so dispatching would burn the backlog on result-less
Stops.
_require_base_skillsnow hard-blocks the two renderer checks — see the reversal noteunder the cut table.
What was cut, and why it must not be revived unchanged
--render-probe/_run_render_probetoml_artifact_parity,_TOML_LAYERS,_toml_mergeRenderError, not "bmm wins"; plain deep-merge vsstructural_mergetracked_render_warningrenderer_shim_treesresolve_dev_primitive, and keying on the name violates the era-agnostic rulemissing_renderer_support's uv-on-PATH FAILmissing_renderer_support's "render.py next to SKILL.md" FAILskills.dev-renderer, relocated because upstream moved the script — porting it would double-reportOne-line addition to_require_base_skillsCONTRIBUTING.mdparagraphReversal (2026-07-30): the
_require_base_skillsrow is now TAKENCodex 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 projectsthat 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 arun 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_skillshasno severity filter at all — it FAILs on whatever
missing_base_skillsreturns — so the twoemitters moved out of
dev_primitive_warningsintomissing_base_skillsat severityproblem.dev_primitive_warningskeeps onlyskills.customize-legacy, which is genuinelysurvivable (the session runs, unstyled).
run --dry-run's "NOT runnable as-is" banner readsthe 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 ofrender_skill.py, so its era gate would silently never fire.install.RENDERER_SCRIPT_MARKERis the correct marker.
Forward-port hazards (
mainhas moved under #155 and under 0.9.1)provision_worktreenow lives inworktree_flow.py:70onmain(Engine collaborator extraction: worktree + rollback clusters, rehome provision_worktree #244 collaborator extraction), notinstall.py. The 0.9.1 patch is againstinstall.pyand will not apply._worktree_local_excludeonmainreturnsstr | Noneand, 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/excludeactivated by a worktree-scopedcore.excludesFile— notthe common
.git/info/exclude. The 0.9.1 gate on/_bmad/render/("only when the worktreehas a
_bmad/, because the exclude file is shared with the main checkout") is reasoned fromthe old mechanism. On
mainthe pollution argument no longer holds, so re-derive the gatethere 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
mainreduced 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".