ADR-0020 -- Machine actor identity: a bot acts under its own name, or the attribution record is fiction

Status: PROPOSED -- built not released, per Pip's constraint. Design gates below are unanswered and BLOCK creation. · Decided: 2026-08-23
These are the actual decision records the game is built from, published unedited except for internal process notes. They describe why the game works the way it does. They are not a strategy guide, and some of them argue with each other.

Context

The observation that earned this

Pip, reading a printed pack, 2026-08-23:

"every one of the 130 was filed by me not one by a bot account... if I can give a bot the same rights as me in my repos and it can differentiate from when things are fully run and then I can come in as a human and review it, we can see what my vs the bot interactions with the repos are, which I think is more honest."

The word doing the work is "honest". This is not a permissions problem or a throughput problem. It is an evidence problem.

What the record currently claims, and why it is false

Every issue, PR, comment and commit produced by an agent in this estate is attributed to PipFoweraker. The Co-Authored-By trailer on commits is the only marker, and it:

So a reader of any repo's history sees one prolific human. On 2026-08-23 alone that record absorbed roughly a dozen merges, four issue closures, two cross-repo issues and several thousand lines of documentation, all stamped with one person's name. The attribution record is not a lie anyone told. It is a lie the tooling tells by default, and it is the same silent-failure shape catalogued in docs/design/SILENT_FAILURE_REGISTER.md: the false state is the plausible one, and nothing generates an event when it happens.

Why this matters now rather than later

Three reasons converged this week:

  1. A hundred and fifty people are about to look. Some will read the repo before running the binary -- #1038 exists because one already did.
  2. docs/TRUST.md now makes provable claims about what the game touches. A trust artifact in a repo whose authorship record is fictional is a weaker artifact than it deserves to be.
  3. Certificates are being bought in a human's legal name. Code signing asserts a named person vouches for this binary. That assertion should not quietly cover work no human read.

Decision

PROPOSED, not accepted. Nothing is created until the gates below are answered.

D1. One machine actor, not one per seat

A single identity, not pdoom1-bot / website-bot / coordination-bot.

Rationale: the question the record must answer is "human or machine?", and that is one bit. Which seat did it is already recoverable from the repo and the branch name. Multiple bot identities multiply the credential surface, the audit surfaces, and the number of things that can be silently misconfigured, to answer a question nothing is asking.

D2. A GitHub App, not a machine user

machine user (PAT)GitHub App
shows asa second human accounta distinctly-rendered bot
credentiallong-lived tokenshort-lived, auto-expiring installation token
permissionsper-account, coarseper-repo, per-scope, revocable
seat costmay consume a paid seatnone
auditmixed into user eventsseparate installation event log

A machine user is a fake human, and the entire purpose here is to stop the record containing fake humans. Adding a second one to fix the first is the wrong shape.

D3. Strictly narrower permissions than Pip's -- explicitly NOT "the same rights"

This departs from Pip's phrasing and the departure is deliberate.

Grant: open issues, open PRs, comment, push to non-default branches, add labels.

Withhold: merge to main, close issues, force-push, administer branch protection, publish releases, touch secrets, modify workflow files.

The reason is not distrust of an agent. It is that the value of the record is that the two identities can do different things. If the bot can do everything Pip can, "reviewed by a human" becomes unfalsifiable again -- a merge stamped with his name would prove nothing, because the bot could have made it. The separation is what converts a label into evidence.

There is a live example: three branch-protection bypasses happened on 2026-08-23, agent-driven, under Pip's admin rights. Under this ADR the agent could not have performed them and would have had to ask.

D4. A commit trailer is not attribution -- it is a courtesy

Co-Authored-By stays, because it is useful. It does not satisfy this ADR. Attribution means the actor field GitHub records, which no trailer can change.

What is NOT decided here

Design gates -- these BLOCK creation

Pip asked for gates rather than silent resolutions. Six, roughly in the order they bite.

GATE 1 -- Does the bot's output count as reviewed? If a bot opens a PR and Pip merges it, the record says a human reviewed it. Is that true? Today a human merges agent PRs after reading a summary, sometimes after reading the diff. The honest record is only as good as the honesty of that step, and this ADR makes it visible without making it true. Naming the risk: a bot identity could make review-theatre easier to perform, not harder. That would be worse than the current state, which at least has no ceremony to hide behind.

GATE 2 -- Who is accountable for what the bot does? Legally and practically, Pip. The identity separation is evidentiary, not a liability shield, and it must never be described as one. If a bot opens an issue containing something defamatory or a PR containing someone's private data, the answer to "who did this" is Pip, with an extra step.

GATE 3 -- What happens to the existing 130? Backfill is impossible: GitHub authorship cannot be rewritten. So the record has a discontinuity at the date the bot starts. Either that boundary is documented, or every future analysis of "human vs machine over time" silently reads the pre-boundary period as all-human. An undocumented discontinuity is a silent failure by this estate's own definition.

GATE 4 -- Does the bot get to close things? D3 says no, and it is the gate most likely to be argued. Closing is a judgement that work is finished. #732 was closed with half its criteria undone by a human; a machine closing issues would industrialise that failure. The counter- argument -- that stale-issue hygiene is exactly the drudgery to delegate -- is real. Unresolved.

GATE 5 -- Is the bot one actor or a fleet? D1 says one. But if several agents run concurrently under one identity, their work is mutually indistinguishable, and this ADR's whole premise is that indistinguishable actors make a record fictional. The premise may apply recursively and D1 may be wrong.

GATE 6 -- What does the bot do when it is uncertain? A human who is unsure asks. A bot with issue-opening rights that is unsure will open an issue -- and the cheapest possible action becomes the default response to uncertainty. That is how a tracker acquires 200 open issues. The failure mode is not bad work; it is cheap work at volume.

Beacons served / violated

Rejected alternatives

Do nothing, rely on Co-Authored-By. Rejected: covers commits only, is self-asserted, is unqueryable, and is absent from every issue and comment. It is a courtesy, and courtesies are not evidence.

A machine user account. Rejected under D2: it is a fake human, and the problem is fake humans.

Label agent work instead of separating identity. Rejected: a label is applied by the same actor doing the work, so it is self-assertion again -- sighting #9's shape, where bump and none were mechanically identical.

Give the bot Pip's full rights, as originally phrased. Rejected under D3, with the reasoning stated there: identical capability makes "a human did this" unfalsifiable, which destroys the evidence the exercise is meant to create.

Consequences / open questions