chadtmiller.com/knotless
git that lives in your Atmosphere account
knotless commits as git does on your machine, and a runner as knotless
MergedThis adds Env::signer (Account, Git or Runner). The CLI and MCP over stdio now commit as git var GIT_AUTHOR_IDENT and GIT_COMMITTER_IDENT give them, read with user.useConfigOnly. Without a git identity they fall back to the account, as before. The runner commits as knotless at its account's <did>@knotless.invalid.
I read the whole diff and found nothing that must change.
emails::signaturefalls back to the account whenever git has no identity, including when only one of name or email is set. That matches the "git would not guess" rule.- Servers keep the default
Account, so the pages and MCP over HTTP behave as before. identis now shared withclaim_first, and that behavior is unchanged.- The runner write-back's
knotlessauthor is hardcoded inknotless-run/src/lib.rsrather than taken from the signer. It matchesSigner::Runner's output. - Callers of
committer,squash_commitandstackare updated, tests cover each path, and the docs pages and change file are included.
I did not read the checks' results.
I read the change since my approval. It only updates the expected pack counts in repository_lifecycle in crates/knotless/tests/cli.rs, from 2 packs to 3. The new count presumably comes from the extra commit the new tests make. It doesn't affect the behaviour I approved earlier, so that approval stands. I didn't read the checks' results.
8 passed, 2 skipped
What changes
On your machine, knotless commits as git does. The CLI and MCP over stdio author
repo commit(with no--author) and commit merges, squashes, branch updates and reverts asgit var GIT_AUTHOR_IDENT/GIT_COMMITTER_IDENTgive them withuser.useConfigOnly:user.nameanduser.email, orGIT_AUTHOR_*andGIT_COMMITTER_*. Where git has no identity it would not guess from the machine's name, they fall back to the account, its handle at<did>@knotless.invalid, as before.Servers acting for accounts are unchanged. The pages, MCP over HTTP and a gateway's commit with no author named still use the account (
Signer::Account, the default).A runner commits as
knotless, at its account's<did>@knotless.invalid: the committer of the queue's squashes and auto-merges, and the author and committer of a workflow's write-back (wasknotless-run, or the runner's handle).Env::signer(Signer::{Account, Git, Runner}) carries this;knotless'scli::mainandknotless-mcp's main setGit,knotless-run's mainRunner.emails::signaturenames whoever commits;forge::committerandqueue::stacktake theCtxfor it.Why
On GitHub, or any mirror of a knotless repository, commits authored or committed as
<did>@knotless.invalidshow as someone unlinked: that address can never be verified there. knotless's own history had 19 commits authored so (agents'repo commits and the runner's write-backs), missing from their author's contributions, and every merge committed by a DID address under the merger's or runner's handle, which changed name as the runner's account did. GitLab commits a squash as the merger, GitHub and Tangled as the forge itself; here, the merger as git knows them on their machine, and the runner, which is a separate actor, asknotless.How it was checked
knotless/tests/cli.rs:repo commitwith no author, in process, is the account; through the binary,Test <t@example.com>for both author and committer.knotless-serve/tests/forge.rs: a squash merged by the binary keeps the head's author and is committed asTest <t@example.com>.knotless-serve/tests/gateway.rs: a queue batch stacked as a runner is committed byknotless <runner did>@knotless.invalid.knotless-run/tests/run.rs: the write-back's author isknotless.Shortcomings
The history already made keeps its identities: rewriting it would change every hash pulls, checks and releases name.
git varreads the config of the repository in the directory knotless runs in, so a per-repositoryuser.emailcounts only when run from that checkout's top.