awesome-commit-plan
Commit Plan
Read a codebase, map how its parts depend on each other, and split it into a commit series where every commit builds and its tests pass. The output is one file: the commits, numbered #1 to #N, each with its message and its exact file set. Nothing is committed, nothing is pushed, and the repository under analysis is never written to.
Why the plan is a separate artifact: a split is a claim about a codebase — that these files form a unit, that this module compiles without the one landing three commits later, that this test has a subject to test. Claims are cheap to write and expensive to discover wrong at commit 14 of 40. A plan file is reviewable before any of that, re-splittable on one word from the user, and executable later by hand or by awesome-git-history-rebuild.
Core principle
BISECTABLE IS A MEASURED PROPERTY, NOT A DESIGN GOAL. A plan that says every commit builds has claimed something; a plan whose ladder was replayed in a scratch clone with the repository's own build and test commands run at every step has proven it. Phase 5 does the replay. A commit that fails its gate is regrouped and the ladder re-run — never shipped with a note that it "should" work.
Four invariants hold throughout:
- Read-only against the user's code. All work happens in a scratch clone or a temporary worktree. The user's checkout is never staged, committed, cleaned or checked out. If the run dies halfway, nothing of theirs moved.
- Every tracked path lands in exactly one commit. Coverage is proven by set arithmetic against
git ls-files, not by inspection. An unassigned path is a stop. - Never invent work that did not happen. Split along seams that exist in the final tree. A
fix:commit is honest only when the tree carries the fix; a fabricated bug-and-repair arc is a lie that reaches the changelog. - The repository's own rules outrank this skill's defaults. A commitlint config, a hook,
CONTRIBUTING.mdor the existing log decides the message format, always, including where this skill's default is nicer.