Surfaced during a runtime probe of PR #70 — the probe skill flagged it about its own body, unprompted, while being used to test something else.
The gap
skills/ba-execute/SKILL.md "Locate the Plan" specifies two paths:
- A path was provided → "read it directly." No failure branch.
- No path provided → auto-detect, with a specified not-found message: "No actionable plans found in
docs/plans/. Which file should I execute? Or run /ba-plan to create one."
So when a user passes a path that does not exist, the body says nothing. What happens is entirely model judgment.
Why it is worth pinning
The observed behavior was good — it reported the path missing, explicitly declined to fall back to auto-detection ("picking a different plan on your behalf is exactly the kind of substitution that would make an execution run untrustworthy"), listed the five most recent plans, and asked. It also confirmed it had touched no state.
But that is one sample of unspecified behavior, and the failure mode it avoided is the dangerous one: silently auto-detecting a different plan and executing it. ba-execute writes code and commits. A model that resolves the ambiguity the other way on a different day would execute the wrong plan against a path the user believed they had specified.
This is the same silent-substitution class the migration's own guard rails exist to prevent, and it sits one branch away from derive-state / stack-base machinery that is specified to the character.
Suggested fix
One branch under "Locate the Plan": an explicitly-provided path that does not resolve stops and asks — never falls through to auto-detect. Distinguish it from the two adjacent specified refusals, which are about shape rather than existence: "predates the git-derived execution model" (the .md-frontmatter-absent case) and "doesn't look like a plan file" (the non-conforming .html case).
Low effort, and it is a machine-boundary-adjacent ordering rule rather than steering, so per .claude/agent_docs/prompt-authoring.md it earns literal specification.
Surfaced during a runtime probe of PR #70 — the probe skill flagged it about its own body, unprompted, while being used to test something else.
The gap
skills/ba-execute/SKILL.md"Locate the Plan" specifies two paths:docs/plans/. Which file should I execute? Or run/ba-planto create one."So when a user passes a path that does not exist, the body says nothing. What happens is entirely model judgment.
Why it is worth pinning
The observed behavior was good — it reported the path missing, explicitly declined to fall back to auto-detection ("picking a different plan on your behalf is exactly the kind of substitution that would make an execution run untrustworthy"), listed the five most recent plans, and asked. It also confirmed it had touched no state.
But that is one sample of unspecified behavior, and the failure mode it avoided is the dangerous one: silently auto-detecting a different plan and executing it.
ba-executewrites code and commits. A model that resolves the ambiguity the other way on a different day would execute the wrong plan against a path the user believed they had specified.This is the same silent-substitution class the migration's own guard rails exist to prevent, and it sits one branch away from
derive-state/ stack-base machinery that is specified to the character.Suggested fix
One branch under "Locate the Plan": an explicitly-provided path that does not resolve stops and asks — never falls through to auto-detect. Distinguish it from the two adjacent specified refusals, which are about shape rather than existence: "predates the git-derived execution model" (the
.md-frontmatter-absent case) and "doesn't look like a plan file" (the non-conforming.htmlcase).Low effort, and it is a machine-boundary-adjacent ordering rule rather than steering, so per
.claude/agent_docs/prompt-authoring.mdit earns literal specification.