So any change to a builtin's script — a typo fix, a new vendor address, a reworded error — orphaned every repository running the previous version. The migration then absorbed it as 00-preexisting, a hand-written hook gitkit will never touch again, and the user kept running the old rule while seeing a successful install. Builtins now carry an identity marker; exact-content matching stays as the fallback for hooks installed before it existed.
GK-H — commit rules the user defines (914ab41)
The commit-msg builtins were closed: conventional-commits, no-body, no-trailers. A team with a JIRA prefix, a length limit or another language had nowhere to hang it and ended up hand-writing the hook, which is what gitkit exists to prevent. message-rules takes named regex rules from the repo's config — each with its own help text, positive or negative, scoped to the subject or the whole message. Patterns are validated when configured, not at someone else's first commit.
This closes GK-G too, deliberately. Copilot smuggles a trailer into the subject after a semicolon, and no-trailers misses it because its pattern is anchored to line start. A negative subject-scoped rule covers it without a dedicated builtin — the general mechanism was worth more than the specific patch.
GK-F — the lock reaches further (4d0d644)
It blocked commit and push; everything else a rewrite can do went through untouched, which is a strange shape for a feature meant to hold a repository still. pre-rebase joins the default. Reference protection is a separate opt-in axis (--refs), never folded into --all: it is the only lock --no-verify cannot bypass, and that power is worth an explicit choice rather than a surprise.
GK-UNIN — an uninstall that cleans up after itself (e832135)
gitkit writes into other people's repositories and had no way out. gitkit uninstall shows its plan and asks first, removes gitkit's parts from every repository in the machine-wide registry, and restores any hand-written hook it had absorbed. Registry entries whose repositories are gone are reported and skipped. It never removes the binary, and says so.
Gate green at every commit: cargo fmt --all, cargo clippy --all-targets -- -D warnings, 673 tests.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four defects and gaps, run through the loop with a qwen3.7-plus implementer and a claude-sonnet-5 reviewer/committer.
GK-E — an outdated builtin is recognised, not frozen (eafee0e)
detect_builtin compared the entire script, character for character, against the current version:
So any change to a builtin's script — a typo fix, a new vendor address, a reworded error — orphaned every repository running the previous version. The migration then absorbed it as 00-preexisting, a hand-written hook gitkit will never touch again, and the user kept running the old rule while seeing a successful install. Builtins now carry an identity marker; exact-content matching stays as the fallback for hooks installed before it existed.
GK-H — commit rules the user defines (914ab41)
The commit-msg builtins were closed: conventional-commits, no-body, no-trailers. A team with a JIRA prefix, a length limit or another language had nowhere to hang it and ended up hand-writing the hook, which is what gitkit exists to prevent. message-rules takes named regex rules from the repo's config — each with its own help text, positive or negative, scoped to the subject or the whole message. Patterns are validated when configured, not at someone else's first commit.
This closes GK-G too, deliberately. Copilot smuggles a trailer into the subject after a semicolon, and no-trailers misses it because its pattern is anchored to line start. A negative subject-scoped rule covers it without a dedicated builtin — the general mechanism was worth more than the specific patch.
GK-F — the lock reaches further (4d0d644)
It blocked commit and push; everything else a rewrite can do went through untouched, which is a strange shape for a feature meant to hold a repository still. pre-rebase joins the default. Reference protection is a separate opt-in axis (--refs), never folded into --all: it is the only lock --no-verify cannot bypass, and that power is worth an explicit choice rather than a surprise.
GK-UNIN — an uninstall that cleans up after itself (e832135)
gitkit writes into other people's repositories and had no way out. gitkit uninstall shows its plan and asks first, removes gitkit's parts from every repository in the machine-wide registry, and restores any hand-written hook it had absorbed. Registry entries whose repositories are gone are reported and skipped. It never removes the binary, and says so.
Gate green at every commit: cargo fmt --all, cargo clippy --all-targets -- -D warnings, 673 tests.