This is the record of an abcd-managed repository

abcdBetav0.16.2 · 2026-11-06

Development record

The contributors page counts people and names none

adracceptedadr-2610291037481588

Context

ADR-47 made the website a surface of the repository, with a /contributors/ page that its explorer renders from git history alone. As itd-136 shipped it, the page listed every human author by name with a commit count, linked each one whose address was a forge privacy address to a profile built from the login inside it, and put the same names and profile links in the record.json the site publishes beside it. The health page added a panel pairing two author names it took for one person, with the .mailmap line that would fold them, which named both and quoted the login in the address.

That is how every site abcd builds behaved, for abcd's own repository and for any repository abcd manages. On 2026-10-29 the product thinker ruled that what abcd publishes names no person: no member's name and no member's login appears in credits (iss-2610291028185585). Where a repository keeps no .mailmap, nothing in it folds one person's identities into one, so a count taken from git shortlog alone would count one person once per identity.

The rest of the page is not about people. The bots-and-tools row names tools, and the Assisted-by: tally names models, which is the attribution escape ADR-47 decision 3 declared; neither is touched by the ruling.

Decision

We will publish the human authors of record as a count, not a list. The contributors page states how many people authored the history and how many commits they made, and nothing about any one of them. The record JSON carries the same two numbers, human_authors and human_commits, in place of the humans list, and no author entry carries a profile link. The authorship reader keeps nothing per person: it counts each human as it reads them, so no later page or export can publish a name that was never kept.

People are counted once each by a simple key. A forge privacy address counts by the login it carries, compared without regard to case, so both forms of that address (with and without the numeric prefix) are one person. Any other address counts by itself, case-folded. A name is not a key while there is an address, because two people can share a name and a count that merged them would be wrong the other way. An author recorded with an empty address (Name <>) is the one exception: an empty address identifies nobody, and keying on it would fold every such author into one person, so that author is keyed by the name, case-folded and trimmed. A repository that needs a finer fold keeps a .mailmap, which git shortlog applies before the count is taken.

The health page's same-author panel is withdrawn, because showing it named two people. Part of what it paired is folded where people are counted: two identities that share one forge login. The other half is not: the panel also paired an author whose name was another identity's login, and the count does not fold that, since a name is not evidence of a person. Such a pair counts twice until a .mailmap folds it. The panel's two interface strings become retired labels: a ui.json that declares them still builds, since the file is decoded with unknown fields refused, but nothing requires them, the build no longer adds them to a file that lacks them, and no page renders them.

The bots-and-tools row and the Assisted-by: tally stay as they were. Bot entries lose the profile link the export could carry for them, since the row names the tool and needs nothing more.

This partly supersedes ADR-47: the naming of human authors on the contributors page that itd-136 delivered under it, and nothing else. ADR-47's decisions, including decision 3's escape for model names on that page, stand.

The product thinker made the ruling. The technical facilitator settled how it is carried out (the counting key, withdrawing the health panel, and the renamed JSON fields), decided on their delegation and open to change.

Alternatives Considered

  • Keep the list and blank the names. Rejected: an empty field in the JSON still says one row per person, and a later change that fills it again has nothing to stop it. Removing the fields means there is nothing to fill.
  • Show initials or numbered placeholders. Rejected: a row per person with a commit count still singles people out in a small team, where the count alone names them.
  • Fold people by name as well as by address. Rejected: two people can share a display name, and the honest error for a count is to count one person twice, which a .mailmap fixes, rather than to merge two people, which nothing on the page would show.
  • Count people, folded by address and login (chosen). It is the smallest change that names no one and still gives a number a reader can trust.

Consequences

  • What a reader sees. The contributors page opens with how many people wrote the history and their commit total, then the tools by name, then the model tally. Nobody's name, login or profile link is on any page the site builds from history.
  • What a consumer of record.json sees. authorship.humans is gone and authorship.human_authors and authorship.human_commits take its place; bot entries no longer carry profile. A reader of the old list breaks, so the change is recorded as breaking.
  • The count can run one high. One person committing from two unrelated mailboxes, from a mailbox and a privacy address, or under a name that is another identity's login, counts twice until the repository folds them in a .mailmap. The page does not say which identities were folded, since saying so would name them.
  • The provenance check no longer admits a person's name on the contributors page. Only tool names and declared models are in its attribution vocabulary, so a name that reached the page would fail abcd site check.
  • Out of scope. The site footer's copyright line prints the package metadata's author, which is the licence holder rather than a credit list; this decision does not change it.

Frontmatter

idadr-2610291037481588
typeadr
statusaccepted
date2026-10-29

References1

Referenced by1

mentions1