Development record
ahoy install --outbound-hook leaves git config --local abcd.binary for each person to set by hand in each clone, so the commit-message check warns and lets every commit through until someone does, although the recorded remedy of iss-2609250834251447 said ahoy install would write it to the owned PATH copy, the abcd.guardPath precedent. The product thinker ruled on 2026-10-15 that the installer writes abcd.binary itself, to the absolute path of the provenance-verified abcd copy ahoy installs.
ahoy install --outbound-hook leaves git config --local abcd.binary for each person to set by hand in each clone, so the commit-message check warns and lets every commit through until someone does, although the recorded remedy of iss-2609250834251447 said ahoy install would write it to the owned PATH copy, the abcd.guardPath precedent. The product thinker ruled on 2026-10-15 that the installer writes abcd.binary itself, to the absolute path of the provenance-verified abcd copy ahoy installs.
The hooks decision, made in the fix round of 2026-10-15: the product thinker ruled that the commit-message check runs with no manual step, within the rule that abcd changes nothing about how a repository works beyond what the person opted into. On the explicit --outbound alone, where no core.hooksPath is set at any scope and the common git directory's hooks/commit-msg does not exist (resolved with git rev-parse --git-common-dir, so every worktree shares it), install writes abcd's embedded commit-msg template there, marked as abcd's. It finds abcd through abcd.binary as the committed copy does, and never runs or calls the committed .githooks copy, so no repository-authored code runs through it. It never replaces an existing hook, never sets core.hooksPath and never touches global config: where a hooks path is set (the empty value included), or a commit-msg hook abcd did not write is there, it leaves that hook alone, saves the same template as hooks/abcd-commit-msg in the common git directory, a name git never runs, and one note says the check is not wired, why, and the line that calls that copy from the person's own hook, so the chained check fails open as the template does and blocks only on abcd's own refusal. A rerun leaves a current copy as it is, refreshes one only when it is byte for byte a template an earlier abcd wrote, and leaves an edited one, saying so. The binary abcd.binary names is not re-verified at commit time; a swap of the PATH copy by the same account is out of scope.
Frontmatter
| id | iss-2610152024267547 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2610152024267547-ahoy-install-outbound-hook-leaves-git.md
open on GitHub ↗ · commit history ↗
mentions1
- iss-2609250834251447A managed repository still has no local gate on a commit message carrying a live agent-session URL or a tool attribution footer, and nothing guards the text handed to the forge CLI for a pull request, an issue or a comment. abcd's own repository refuses both shapes in a commit message through its committed commit-msg hook, which runs go run ./cmd/abcd lint outbound from the source checkout; a managed repository has no source checkout, so the scaffolded form of that hook needs three product decisions first: how it finds an abcd binary (a git hook has no plugin root, so only the PATH rung survives), whether it fails closed or open when none is found, and whether abcd ahoy installs it by default or on opt-in. Split out of iss-2609061438431625 when its local half landed for this repository.