Files
dotfiles/.claude/tasks/0015-git-module.md
alexion 4ecb86052b docs(git): record the verified deployment (task 0015)
Also note that `git config --global` lists only ~/.gitconfig and is not a
view of what git resolves, which misreads as the module's file being
ignored.
2026-07-20 12:22:36 -04:00

3.3 KiB

What to build

A git Module, following the Enable convention and configured natively through home-manager, that carries the operator's commit identity — enabled on neogaia.

Today that identity exists only in one repository's local configuration on one machine. It is therefore invisible to every other checkout, absent from any future Host, and lost on a reimage. Declaring it makes committing work anywhere, reproducibly, like everything else in the flake.

The identity matches the one already present throughout this repository's history, so existing commits and future ones agree. Committing it is not a disclosure: it appears in every commit this repository has ever published.

It is a Module rather than base plumbing because a Host that should not carry a personal commit identity is easy to imagine once the servers exist.

Acceptance criteria

  • A git Module following the Enable convention exists and is enabled on neogaia
  • The commit identity is configured through home-manager and matches the one used in existing history
  • nix flake check builds the neogaia toplevel
  • Manual confirmation: committing in a repository outside this checkout succeeds with no per-command identity override
  • The stale note in the project's agent instructions claiming git identity is unconfigured is corrected, since commits already work here through repository-local configuration

Implementation Notes

programs.git.userName/userEmail are renamed in this home-manager pin and emit an obsolete-option trace. The module uses settings.user.name/settings.user.email. Do not "fix" it back.

Review on the pull request asked for the module on every host, which was first built by defaulting enable to true and dropping the per-host line. The operator then chose the opposite: enable defaults to false and each host enables it explicitly, so a host keeps reading as a full checklist of what it carries rather than hiding a default-on module. Enabling it is therefore a step when adding a host.

The commit name is the literal "alexion" rather than config.user.name, which review raised as duplication. A Unix login and a commit display name are separate concepts that merely coincide here, so binding them would let a host overriding its login silently rewrite the operator's commit identity.

The manual confirmation is met on the running machine. The operator rebuilt neogaia, ~/.config/git/config is now a home-manager symlink, and a commit in a repository outside this checkout was authored alexion <contact@alexion.dev> in the real environment with no per-command override and no identity in the test repository's own config.

Review surfaced an unanticipated hazard that proved harmless. Home-manager writes ~/.config/git/config, while an undeclared ~/.gitconfig also exists and outranks it on any key set in both. It holds only a tea credential helper and no user.*, so it does not shadow the identity, confirmed against the deployed configuration. Declaring that credential helper is a reasonable follow-up, since it will not survive a reimage.

This checkout's .git/config still sets the same identity, now redundant. Removing it would let the module govern here too, so a future breakage surfaces instead of being masked. It is local, untracked state, so it is left alone rather than changed as part of this task.