Skip to content

[roadmap] ba-execute has no defined failure branch for an explicitly-provided missing plan path #72

Description

@azevedo

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    cluster:polishBrowser/last-mile polish & evidencereadyClear starting point — can build now

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions