This is the record of an abcd-managed repository

abcdBetav0.16.2 · 2026-11-06

Development record

A managed repo commits under whatever identity git happens to resolve, and when

issueopenmajoriss-193

A managed repo commits under whatever identity git happens to resolve, and when user.email is unset git invents one — the OS account's full name plus $USER@$(hostname), silently, on the first commit. This repo's own history carried 25 such commits before the 2026-08-06 rewrite, all authored and committed under a fabricated <user>@<host>.local pair no one ever typed. The same gap let autonomous harness runs commit under a tool identity: nothing in a managed repo declares who its commits belong to, so every machine and every harness answers the question differently.

Scope, settled by the maintainer (2026-08-06): abcd enforces exactly one thing — that a managed repo commits under the user's own GitHub identity, and that git can never fabricate a substitute. Nothing more. Rejecting AI co-author trailers, allowlisting authors, and gating pushes on trailer presence are out of scope here: those belong to the forge's own rules (a server-side ruleset) and to iss-119, not to abcd.

What that means concretely:

  • ahoy install pins the identity. It resolves the user's canonical GitHub name and email (the account's no-reply address is the safe default — it is what the forge already attributes to them, and it leaks no personal mailbox) and writes both into the managed repo's local git config. Repo-local, not global: abcd configures the repos it manages and leaves the rest of the machine alone.
  • Fabrication is disabled, not merely overridden. The repo also sets user.useConfigOnly, so a checkout whose identity is missing or cleared fails the commit with an error instead of quietly deriving one from the host. A refusal is recoverable; a fabricated commit is already in the history.
  • The state is observable. A managed repo whose identity is unset, or set to something the install did not pin, is reported — the same fail-loud posture the guard and audit rules take, so the gap surfaces before a commit rather than after a rewrite.

The privacy half matters as much as the attribution half: an auto-derived identity embeds the machine's hostname in every commit it touches (alice@alice-laptop.local in the persona shape), which is the same never-commit-hostnames class the v0.5.0 security half closes in scanning and redaction. Prevention at the commit boundary is where that leak is cheapest to stop — the scanner can only find it once it is already written.

Likely intent-scale: a user-facing capability across every managed repo, so it wants an intent and a spec rather than a bare fix. Reconcile with, rather than duplicate, iss-84 (managed pre-commit gates — the hook seam this would use), iss-85 (managed attribution config — the nearest neighbour; check whether this supersedes it or lands inside it) and iss-119 (Assisted-by declared but unenforced — the trailer half, deliberately left out of this scope).

Deferral 2026-09-29

Deferred past v0.11.1: The product thinker's ruling M2 of 2026-09-23 folds this into itd-131 and spc-34, but itd-131 shipped and spc-34 closed without it: nothing in internal/ pins an identity at install or sets user.useConfigOnly. Owed: a successor intent for the pinning half, which needs the product thinker's adoption, and one ruling: may ahoy install look up the canonical GitHub identity although adr-38 keeps implicit paths disk-only, since install is an explicit act?

Remedy grounds (2026-09-29)

  • git's own documentation: user.useConfigOnly makes git 'avoid trying to guess defaults for user.email and user.name' and retrieve them only from configuration (git-config(1), https://git-scm.com/docs/git-config, consulted 2026-09-29); that half needs no ruling and closes the fabrication, so the remedy separates it from the lookup question (B).
  • Rejected: a global useConfigOnly, which reaches beyond the repositories abcd manages.

Frontmatter

idiss-193
typeissue
lifecycleopen
severitymajor

mentions9