This is the record of an abcd-managed repository

abcdBetav0.16.2 · 2026-11-06

Development record

A 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.

issueresolvedmajoriss-2609250834251447

A 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.

Deferral 2026-09-29

Deferred past v0.11.1: ruling still owed to the product thinker (re-deferred at v0.11.1 by run A's major-triage lane; none recorded since v0.10.0): for the commit-msg hook abcd ahoy would scaffold into a managed repository, how does it find an abcd binary with no plugin root, does it fail open or closed when none is found, and is it installed by default or on opt-in? The sources-refresh hook's opt-in shape (git config abcd.sourcesBinary, fail open; dcn-2609250000000027) is a provisional precedent, not that ruling.

Remedy grounds (2026-09-29)

  • The threat is a session URL or tool footer reaching public history, plus the hook itself executing repository-controlled code; resolving through a local config key holding an absolute path answers the second. lefthook's generated hook searches an explicit variable, then PATH, then package-manager locations, and fails open unless assert_lefthook_installed is set: https://raw.githubusercontent.com/evilmartians/lefthook/master/internal/templates/hook.tmpl (consulted 2026-09-29), so fail-closed-on-opt-in is an established shape, but the choice stays the ruling's (G+).
  • Rejected: a PATH-only search, which a repository can shadow through a relative PATH element.

Split 2026-10-14

Resolved for the commit-message half when the opt-in outbound commit-msg gate was re-applied for v0.15.0. The hook judges commit messages only; the text handed to the forge CLI for a pull request, an issue or a comment is still unchecked in a managed repository, and that half is now its own record, iss-2610142210511831.

Frontmatter

idiss-2609250834251447
typeissue
lifecycleresolved
severitymajor

mentions10