Context
Operator surfaced (2026-06-15) that the PR/ticket self-identification block redundantly posts the agent's @handle inside a body that GitHub already attributes to that same gh account. Live example on PR #13360:
neo-gpt commented
…
Authored by GPT-5 (Codex Desktop), @neo-gpt (Euclid). Session 019ec8a7-…
GitHub already shows neo-gpt as the comment author, so @neo-gpt in the body is pure duplication. The operator's proposed shape:
Authored by Euclid (GPT-5.5, Codex Desktop). Session 019ec8a7-…
— lead with the Social Name, model+wrapper in parens, drop the @handle, keep the session; and (operator vote) move the block to the bottom of the body, not "near the top."
The Problem
The current convention (pull-request-workflow.md §5, line 145) mandates
Authored by [Model Name] ([Agent Wrapper]), @<identity> ([Social Name]). Session <Origin Session ID>.
"near the top," and §6.1 (line 173) states author family is "resolved from the §5 @identity self-id, not the drift-prone GitHub login (advisory only)."
Two drifts:
- Redundant
@handle — every named maintainer now posts from a dedicated neo-* gh service account (agent-pr-body-lint.yml:20 already trusts pr.user.login to classify agents). The "drift-prone login" rationale (§5:151 — "even if you do not have a dedicated GitHub service account") predates the current roster; for the normal case the gh author is reliable + visible, so the in-body @handle adds nothing.
- Position drift —
§5 says "near the top," but every recent PR/ticket body in practice puts the block at the bottom (it is a provenance footer). The spec lags practice.
Each remaining field earns its place: the Social Name (Euclid/Ada) is NOT derivable from the gh login and IS roster-resolvable to family (identityRoots); model+wrapper is not derivable from the account; the session is consumed by review-response-protocol.md + the A2A bridge.
The Architectural Reality
pull-request-workflow.md §5 (line 144-149): the format mandate + the cross-harness variant.
pull-request-workflow.md §6.1 (line 173): the cross-family merge-gate resolves author family from the §5 self-id — currently keyed off @identity. Dropping the @handle requires re-pointing this to the Social Name (still in the body, roster-resolvable) as the minimal change; gh author.login is a secondary fallback for recognized neo-* accounts.
ticket-create-workflow.md §11 (Authorship Respect): tickets carry the same block.
agent-pr-body-lint.yml:62: the lint only requires the literal "Authored by " anchor — NOT the @handle — so dropping it is CI-safe (verified).
- Cross-harness variant (
§5:149): where the posting account ≠ the true author, the explicit Model-A/Model-B attribution stays load-bearing — KEEP it (just drop the redundant @handle).
The Fix
New normal-case format, at the bottom of the body:
Authored by <Social Name> (<Model>, <Wrapper>). Session <Origin Session ID>.
pull-request-workflow.md §5: rewrite the format; change "near the top" → "at the bottom"; drop the @handle.
pull-request-workflow.md §6.1: re-point family-resolution from @identity to the Social Name (roster-resolvable via identityRoots), with gh author.login as the fallback for recognized neo-* accounts.
ticket-create-workflow.md §11: same trimmed format + bottom position.
- Cross-harness variant: keep the explicit Model-A/Model-B attribution; drop only the redundant
@handle.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
PR-body authorship block (pull-request-workflow.md §5) |
operator direction (2026-06-15); GitHub comment author == gh account |
Authored by <Social Name> (<Model>, <Wrapper>). Session <id>. at the bottom; drop the redundant @handle |
cross-harness variant keeps explicit Model-A/Model-B attribution |
§5 rewrite |
a PR body in the new format passes agent-pr-body-lint |
Cross-family family-resolution (§6.1) |
§5 self-id; identityRoots roster |
resolve author family from the §5 Social Name (roster-resolvable) or gh author.login; the @handle is no longer the key |
gh-login fallback for recognized neo-* accounts |
§6.1 rewrite |
Social Name → family resolvable via identityRoots |
Ticket-body authorship block (ticket-create-workflow.md §11) |
same |
same trimmed format at the bottom |
same |
§11 update |
a ticket body in the new format |
Out of Scope / Follow-up
- Other body-templates that inherit the block (
ideation-sandbox, session-sunset, epic-review, review-response-template) should be swept to the new format in the same PR or a fast follow-up — flag if the sweep grows beyond the two core workflows.
- The
Session <id> vs Origin Session ID: <uuid> label inconsistency (PR body says "Session", tickets/protocol say "Origin Session ID") is a separate small consistency nit — fold in opportunistically or leave for a follow-up.
Decision Record impact
none — convention refinement to the authorship self-id block; no ADR governs the format. (No ADR names the @identity-keyed family-resolution; if one surfaces, the §6.1 re-point would amend it.)
Consensus / Authority
Operator-directed (2026-06-15). Shared cross-family convention → broadcast the change to all families for awareness/objection (esp. any family whose gh-account reliability differs) when the PR opens; decide-and-document substrate-PR per the operator's path choice, not a full ideation graduation. Net reduces loaded bytes (drops a field from every future PR/ticket body) — satisfies the substrate-accretion defense.
Acceptance Criteria
Live latest-open sweep: checked latest 20 open issues at 2026-06-15T~16:42Z; no equivalent authorship-format ticket (nearest adjacent: H2 #13349/#13362 + gh-auth #13352, both distinct). A2A in-flight: no [lane-claim] on this scope (mailbox clear this turn).
Origin Session ID: 73156d71-9a96-4bf1-bbc8-d6487ca7dddd
Retrieval Hint: "authorship self-id block format drop @handle Social Name bottom PR ticket cross-family family-resolution"
Authored by Ada (Claude Opus 4.8, Claude Code). Session 73156d71-9a96-4bf1-bbc8-d6487ca7dddd.
Context
Operator surfaced (2026-06-15) that the PR/ticket self-identification block redundantly posts the agent's
@handleinside a body that GitHub already attributes to that same gh account. Live example on PR #13360:GitHub already shows
neo-gptas the comment author, so@neo-gptin the body is pure duplication. The operator's proposed shape:— lead with the Social Name, model+wrapper in parens, drop the
@handle, keep the session; and (operator vote) move the block to the bottom of the body, not "near the top."The Problem
The current convention (
pull-request-workflow.md §5, line 145) mandatesAuthored by [Model Name] ([Agent Wrapper]), @<identity> ([Social Name]). Session <Origin Session ID>."near the top," and§6.1(line 173) states author family is "resolved from the §5@identityself-id, not the drift-prone GitHub login (advisory only)."Two drifts:
@handle— every named maintainer now posts from a dedicatedneo-*gh service account (agent-pr-body-lint.yml:20already trustspr.user.loginto classify agents). The "drift-prone login" rationale (§5:151— "even if you do not have a dedicated GitHub service account") predates the current roster; for the normal case the gh author is reliable + visible, so the in-body@handleadds nothing.§5says "near the top," but every recent PR/ticket body in practice puts the block at the bottom (it is a provenance footer). The spec lags practice.Each remaining field earns its place: the Social Name (Euclid/Ada) is NOT derivable from the gh login and IS roster-resolvable to family (
identityRoots); model+wrapper is not derivable from the account; the session is consumed byreview-response-protocol.md+ the A2A bridge.The Architectural Reality
pull-request-workflow.md §5(line 144-149): the format mandate + the cross-harness variant.pull-request-workflow.md §6.1(line 173): the cross-family merge-gate resolves author family from the §5 self-id — currently keyed off@identity. Dropping the@handlerequires re-pointing this to the Social Name (still in the body, roster-resolvable) as the minimal change; ghauthor.loginis a secondary fallback for recognizedneo-*accounts.ticket-create-workflow.md §11(Authorship Respect): tickets carry the same block.agent-pr-body-lint.yml:62: the lint only requires the literal"Authored by "anchor — NOT the@handle— so dropping it is CI-safe (verified).§5:149): where the posting account ≠ the true author, the explicit Model-A/Model-B attribution stays load-bearing — KEEP it (just drop the redundant@handle).The Fix
New normal-case format, at the bottom of the body:
Authored by <Social Name> (<Model>, <Wrapper>). Session <Origin Session ID>.pull-request-workflow.md §5: rewrite the format; change "near the top" → "at the bottom"; drop the@handle.pull-request-workflow.md §6.1: re-point family-resolution from@identityto the Social Name (roster-resolvable viaidentityRoots), with ghauthor.loginas the fallback for recognizedneo-*accounts.ticket-create-workflow.md §11: same trimmed format + bottom position.@handle.Contract Ledger Matrix
pull-request-workflow.md §5)Authored by <Social Name> (<Model>, <Wrapper>). Session <id>.at the bottom; drop the redundant@handleagent-pr-body-lint§6.1)identityRootsrosterauthor.login; the@handleis no longer the keyneo-*accountsidentityRootsticket-create-workflow.md §11)Out of Scope / Follow-up
ideation-sandbox,session-sunset,epic-review,review-response-template) should be swept to the new format in the same PR or a fast follow-up — flag if the sweep grows beyond the two core workflows.Session <id>vsOrigin Session ID: <uuid>label inconsistency (PR body says "Session", tickets/protocol say "Origin Session ID") is a separate small consistency nit — fold in opportunistically or leave for a follow-up.Decision Record impact
none— convention refinement to the authorship self-id block; no ADR governs the format. (No ADR names the@identity-keyed family-resolution; if one surfaces, the §6.1 re-point wouldamendit.)Consensus / Authority
Operator-directed (2026-06-15). Shared cross-family convention → broadcast the change to all families for awareness/objection (esp. any family whose gh-account reliability differs) when the PR opens; decide-and-document substrate-PR per the operator's path choice, not a full ideation graduation. Net reduces loaded bytes (drops a field from every future PR/ticket body) — satisfies the substrate-accretion defense.
Acceptance Criteria
pull-request-workflow.md §5mandatesAuthored by <Social Name> (<Model>, <Wrapper>). Session <id>.at the bottom; no@handle.§6.1resolves author family from the Social Name (roster-resolvable) with gh-login fallback; no longer requires the@handle.ticket-create-workflow.md §11mirrors the new format + position.@handle).agent-pr-body-lint.Live latest-open sweep: checked latest 20 open issues at 2026-06-15T~16:42Z; no equivalent authorship-format ticket (nearest adjacent: H2 #13349/#13362 + gh-auth #13352, both distinct). A2A in-flight: no
[lane-claim]on this scope (mailbox clear this turn).Origin Session ID: 73156d71-9a96-4bf1-bbc8-d6487ca7dddd
Retrieval Hint: "authorship self-id block format drop @handle Social Name bottom PR ticket cross-family family-resolution"
Authored by Ada (Claude Opus 4.8, Claude Code). Session 73156d71-9a96-4bf1-bbc8-d6487ca7dddd.