Skip to content

review-commits skill ignores style file's beads-ID prohibition #2

Description

@jskswamy

Summary

The /review-commits skill (in commit-tools plugin) does not enforce the beads-ID / internal-tracker prohibition that is already documented in its companion style files. As a result, agents authoring messages during the synthesis phase can — and do — leak internal tracker IDs into git history without anything in the skill flagging it.

Repro

Source files (relative to plugin root commit-tools/):

  • styles/classic.md:136-139 — explicitly forbids "Beads IDs (beads-xxx, claude-plugins-xxx, or any internal tracker prefix)"
  • styles/conventional.md:226-229 — same prohibition
  • commands/commit.md:544-547 — restates it (/commit enforces it)
  • skills/review-commits/SKILL.mdno mention of the prohibition
  • skills/review-commits/lib/synthesizer-prompt.mdno mention of the prohibition
  • skills/validate-commits/SKILL.mdno leak check for tracker IDs

In a session where the user worked off beads issues with a project-internal prefix (e.g. PROJ-), the agent ran /review-commits and produced commit messages like:

Promote exact remote URL above recursive path globs (PROJ-30b)
...
Closes PROJ-30b.

/review-commits accepted these as clean and proceeded to merge. /validate-commits also passed them — its five checks scan for Claude/Anthropic/GPT/OpenAI/Copilot co-author lines and conflict/squash markers, but not for internal tracker prefixes.

Why it matters

The style files are normative — /commit reads them at compose time and refuses to leak. /review-commits (which also rewrites messages, often in bulk via planner/synthesizer) bypasses that enforcement because its planning checklist never references the style's prohibition list. The downstream /validate-commits also has no leak scan for tracker IDs, so neither the authoring step nor the gate catches it.

Suggested fix

Two layers, both small:

  1. Synthesizer rule — in skills/review-commits/lib/synthesizer-prompt.md add an explicit rule:

    Authored messages MUST NOT contain internal tracker prefixes (beads-*, claude-plugins-*, or any project-local prefix configured in the active style file's "Avoid" list). Treat any leak as a drafting failure that requires re-authoring.

    Cross-link to styles/<style>.md so future style changes propagate without editing the synthesizer.

  2. Validator check — in skills/validate-commits/SKILL.md add a 6th check: scan @{u}..HEAD (or base..HEAD) commit messages against a configurable prefix list (defaulting to beads- and claude-plugins-, with users able to add project-local prefixes via their style file's "Avoid" list) and fail if any match, mirroring the existing co-author scan.

Either fix alone closes the gap; both together are belt-and-suspenders.

Environment

  • Plugin: jskswamy-plugins/commit-tools 1.0.0
  • Plugin path: ~/.claude/plugins/cache/jskswamy-plugins/commit-tools/1.0.0/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions