Chapter 24. 2026-05-11: The Name on the Work
A GitHub comment goes out under whichever account gh has
active, and gh does not ask before stamping that identity
onto a permanent public record. Mine went out in May 2026 on
solana-foundation/awesome-solana-ai#155, an external repo,
under the deprecated Suede-AI bot account, and the guard
against a repeat is a gh auth status check before every
mutating command. Two GitHub accounts sit in this machine’s
gh keyring. JasonColapietro is me.
Suede-AI is a deprecated bot account, kept around because
the Suede repos live under it. The difference between the two was
bookkeeping until May 2026, when it became an incident. On 2026-05-11 it
became a rename.
The comment that posted under the bot account
A PR comment went out on
solana-foundation/awesome-solana-ai#155, an external repo
in the Solana ecosystem, under the Suede-AI account. The
mechanics were dull: the keyring had the secondary account active, the
comment command ran, and nothing in the chain verified which identity
was signed in before the mutation. gh does not ask. It
stamps whatever account is active onto the record. My log holds the
month of the incident, not the day; what it holds with precision is the
cost.
On my own repos a wrong byline is cosmetic: I see it, I fix it, no outsider was forming a first impression. On an awesome-list PR in someone else’s ecosystem, that comment was the introduction. A maintainer deciding whether to engage with Suede Labs AI looked at the thread and saw a bot account where a founder should have been. The comment content was fine. The authorship was the defect, and the defect class is the bad kind: a mutating command stamps an identity onto a permanent public record, while a read-only command stamps nothing. The check would have cost one command before posting. The mistake is not retractable after.
Why attribution is a distribution asset
Attribution, for a solo founder, is a distribution asset and not a
cosmetic detail. Investors, hiring partners, and collaborators check
founder GitHub activity, and they read package metadata. Work published
under my name compounds: each public commit, comment, and listing adds
to a record those people inspect before they take a founder at his word.
The same work published under Suede-AI compounds nothing.
The account reads as a faceless bot, and a bot byline builds no founder
visibility regardless of the quality of the work behind it.
The rule this produced applies hardest where the wrong byline landed: external and ecosystem contributions, awesome-list PRs included, because those are the surfaces where strangers meet the work before they meet me. I wrote the rule into the agents’ standing instructions the same month, covering git identity and docs attribution both, because a rule that lives in my head does not bind an agent mid-run.
Why jasoncola1 became JasonColapietro
The incident forced a look at the personal account itself, and the
look was unflattering. The handle was jasoncola1. A
trailing digit on a founder handle reads one way to a stranger: the real
name was taken, and this person settled for what was left. That reading
was wrong, and it made no difference that it was wrong, because a
profile header does not get to explain itself. A founder asking
strangers to trust a small company cannot afford a handle that opens
with an apology.
On 2026-05-11 I renamed the account from jasoncola1 to
JasonColapietro. PascalCase is canonical. The canonical URL
for docs, READMEs, and package.json is
https://github.com/JasonColapietro; the lowercase form
resolves as well. GitHub’s rename mechanics carried most of the
migration: old jasoncola1 URLs auto-redirect for as long as
that handle stays unclaimed. If a defensive squat-prevention account
ever registers the old name, the redirect stops, but profile and PR URLs
stay attached to me through the account ID. I recorded that trade-off
the day of the rename and left the handle unclaimed.
One piece of matching work stayed pending as of 2026-05-11: the
personal Vercel slug still needed a rename to match
JasonColapietro. The Suede team slug suede-ai
stays as it is; that slug names the brand, not the person, and the brand
is the one place the bot-flavored name belongs.
Why the git author email stayed jasoncola1@gmail.com
The global git author identity is
Jason Colapietro <jasoncola1@gmail.com>, unchanged.
The email contains the old username, which makes it look like leftover
cleanup; it is not. The address is Gmail, and Gmail is a separate system
from GitHub usernames: the rename touched one system and not the other.
The address remains the verified email on the renamed account, so commit
attribution still resolves to me. A decade of tooling assumes usernames
and emails move together. Here they do not, and the whole point of
keeping the email is that the commits keep resolving.
That nuance became its own cleanup rule, because the natural failure
mode is a find-and-replace. A sweep for jasoncola1 across
repos and docs will match the email address. Replace the username in
URLs, link text, and narrative references. Never change
jasoncola1@gmail.com. Rewriting the email breaks commit
attribution, which is the asset this entire entry exists to protect.
| Layer | State after 2026-05-11 |
|---|---|
| GitHub username | JasonColapietro, renamed from
jasoncola1 |
| Old profile and PR URLs | Auto-redirect while jasoncola1 stays unclaimed |
| Global git author identity | Jason Colapietro <jasoncola1@gmail.com>,
unchanged |
| Verified account email | jasoncola1@gmail.com, unchanged |
| Personal Vercel slug | Rename to match, pending as of 2026-05-11 |
| Suede team Vercel slug | suede-ai, unchanged (brand) |
Why gh auth status still printed the old username
After 2026-05-11, gh auth status kept displaying
jasoncola1. The rename came with a gotcha aimed at the
exact verification step the new rule depends on: the one command that is
supposed to prove the right account is active was printing the old
identity, which looks like the wrong account being active right before a
mutating command.
It is a display lag, not an identity problem. gh’s local
keyring caches the display name. The OAuth token is bound to the
account, not to the name, and it resolves to
JasonColapietro whatever the status line prints. The token
and the account ID behind it are the authoritative layer; the cached
string is cosmetic.
gh auth status # may still print the cached name: jasoncola1
gh auth refresh -h github.com # refreshes the cached identifier
gh auth switch --user jasoncola1 # until refreshed: selects the SAME account via its cached nameThe third line is the one worth writing down, because it reads like a
bug. To select the renamed account before the cache refreshes, you pass
the old username. An agent that knows about the rename and sees
jasoncola1 in a switch command will “correct” it and break
the switch, so the runbook carries the reason next to the command.
The wider lesson: identity renames leave stale caches in tooling. Know which layer is authoritative (the OAuth token and the account ID) and which is cosmetic (the cached display name), or you chase a non-bug in a system that is working.
The identity rules I run before any mutating gh command
The incident and the rename condensed into a standing rule with four clauses.
Human-facing work carries the human’s name. Commits, gh
activity, and the metadata surfaces people read without cloning
anything: docs, READMEs, package.json, LICENSE, CITATION.cff, AUTHORS,
listing metadata. All of it attributes to
JasonColapietro.
Identity gets verified before mutation, not audited after. Before
gh pr create, gh pr comment,
gh issue create or gh issue comment,
gh pr review, gh pr merge, or
gh release create, the active account gets checked with
gh auth status, with the cache lag above in mind. Read-only
commands run under whichever account happens to be active; they stamp
nothing.
The split has one surface where the bot name is correct.
Suede-AI names repo paths, and it is the right value in the
organization entity’s sameAs metadata, the exact opposite
of the attribution rule. Contributors, maintainers, and founders
attribute to the human. Run the split backwards in either direction and
you either erase the founder or misfile the repo.
The bot account keeps a narrow lane. Genuine bot automation, CI
tokens, and org-owned actions can act as Suede-AI when I
ask for that, and the global git identity gets overridden with
git -c user.email=... on explicit request only. An
ambiguous case gets asked about, not guessed.
The canonical metadata values, recorded here so no future cleanup pass has to reconstruct them:
| Field | Canonical value |
|---|---|
| Name | Jason Colapietro |
| GitHub | https://github.com/JasonColapietro |
jasoncola1@gmail.com |
|
| Project URL | https://suedeai.ai |
| Repo location | https://github.com/Suede-AI |
Postscript, 2026-05-15: Suede-AI is a User account, not an org
Four days after the rename, the second account produced a correction
of its own: my notes had been calling Suede-AI “the org,”
and the GitHub API reports it as "type":"User". The two
memory files still disagree on paper (the attribution memo says org, the
access memo says User account), and I am leaving the disagreement
visible here rather than papering over it, because the access mechanics
settle which one to act on. A User account has no teams and no org
membership. Cross-account access to a private repo it owns works one
way: a repository invitation, sent and accepted.
Suede-AI/strumly is private, so granting my personal
account write access took a four-step one-time setup, completed
2026-05-15:
gh auth switch --user Suede-AI
gh api repos/Suede-AI/strumly/collaborators/JasonColapietro -X PUT -f permission=push
gh auth switch --user jasoncola1
gh api /user/repository_invitations/<id> -X PATCHThe third command is the keyring lag again: it selects the renamed
personal account by its cached name. I verified the result with
gh repo view Suede-AI/strumly --json viewerPermission,
which returned "WRITE", and applied the same pattern to
Suede-AI/suedeai-org on 2026-05-17.
The failure symptoms are worth recording because they lie. If the
access lapses, gh repo view returns
Could not resolve to a Repository and git push
returns Repository not found, which is indistinguishable
from the repo not existing at all. The fix is not discoverable from the
error, so the exact reproduction steps live in the log, next to the
reason the switch command uses an old name.
What is fixed, and what is still public
The comment on awesome-solana-ai#155 is still up there
under the bot’s name; public records keep their stamps. Everything since
runs through the identity check first. Attribution compounds one byline
at a time, and the byline is now a checked invariant instead of an
accident of which account was signed in.