Skip to content

feat(standard): author identity is the GitHub handle - defaults, stated convention, self-check enforcement - #29

Merged
PBNZ merged 4 commits into
mainfrom
fix/author-identity
Aug 12, 2026
Merged

feat(standard): author identity is the GitHub handle - defaults, stated convention, self-check enforcement#29
PBNZ merged 4 commits into
mainfrom
fix/author-identity

Conversation

@PBNZ

@PBNZ PBNZ commented Aug 12, 2026

Copy link
Copy Markdown
Owner

What & why

Scaffolded repos could end up carrying a real personal name — the /new-repo commit-identity recipe preferred the profile name (.name // .login) under a heading that promised anonymity, the {{author}} default was a personal name, and nothing caught a name reintroduced later. This PR flips every identity default to the GitHub handle, states the convention in the standard (a real name is a per-repo opt-in recorded as an ADR + START-HERE variance row), and adds repokit-check.ps1 check 6 so reintroduction fails the self-check instead of relying on review. The optional tree-guard grep from the field report is documented with its trade-off rather than stamped into scaffolds (ADR-0009 records why).

Refs #25, Refs #26

Checklist

  • One concern per PR (split unrelated changes).
  • Driving issue referenced as Refs #NN (no auto-close keywords), if the repo tracks issues.
  • Conventional Commit title (e.g. feat: …, fix: …, docs: …).
  • CHANGELOG.md updated under ## [Unreleased] if user-visible.
  • Validation passes locally (python scripts/*.py; see .github/workflows/validate.yml).
  • An ADR added under docs/adr/ for any notable decision.

🤖 Generated with Claude Code

PBNZ and others added 3 commits August 12, 2026 22:30
…andle

The step-5 recipe resolved user.name as `.name // .login` -- the real
profile name on any account that has one -- under a heading that promised
anonymity; only the email was anonymised. Prefer `.login` for both fields,
make an explicit real identity the recorded opt-in direction, and flip the
`{{author}}` interview default from a personal name to the handle.

Refs #26

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The handle-over-real-name expectation becomes a stated convention: a new
"Author identity" section in the-standard.md (with the opt-in path -- a
real name is a per-repo declared variance, recorded in an ADR and a
START-HERE row), the commit-identity section covers both fields, and the
pre-commit checklist extends the contact-info item to names.

Reintroduction is now caught, not review-dependent: repokit-check.ps1
gains check 6 -- repo-local git identity and commit history (bounded by
the adoption marker) must be handle + noreply unless the variance row is
declared -- with smoke coverage for the pass/fail/variance cases. The
optional bracketed-grep tree guard is documented with its trade-off
(the pattern spells the name) rather than stamped into scaffolds.

Also stamps the licence copyright line from {{year}}/{{author}} instead
of a hardcoded handle, adds the identity ground rule to the scaffolded
AGENTS.md, and allowlists GitHub's own web-flow service address in the
private-contact scan.

Refs #25

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Refs #25, #26

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates RepoKit’s standard and scaffolding defaults so author identity is the GitHub handle (not a real/personal name) across commit identity, templates, and docs; and adds a self-check guard to catch non-compliant commit identities unless an explicit variance is declared.

Changes:

  • Standardizes “handle + noreply” as the default author identity and documents the opt-in variance path (ADR + START-HERE row).
  • Adds repokit-check.ps1 check 6 to validate repo-local git identity (when set) and commit history since the adoption marker.
  • Updates /new-repo guidance and templates ({{author}}, LICENSE.tmpl) plus validation scripts/smoke tests to enforce/cover the new behavior.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
scripts/smoke_test_repokit_check.ps1 Adds git-backed fixtures to validate the new author-identity self-check behavior.
scripts/check_no_private_contact.py Allows GitHub’s noreply@github.com service identity through private-contact scanning.
plugins/repokit/skills/repo-standard/standard/the-standard.md Documents the “author identity” convention and the optional tree-guard approach/trade-offs.
plugins/repokit/skills/repo-standard/standard/pre-commit-checklist.md Expands the checklist tripwire to include real names (not just emails).
plugins/repokit/skills/repo-standard/standard/commit-conventions.md Aligns commit identity guidance to “handle + noreply” and references the new guard.
plugins/repokit/skills/new-repo/templates/public/LICENSE.tmpl Stamps copyright with {{year}}/{{author}} instead of a hardcoded value.
plugins/repokit/skills/new-repo/templates/core/scripts/repokit-check.ps1 Implements check 6 to validate commit identity (repo-local config + bounded history).
plugins/repokit/skills/new-repo/templates/core/AGENTS.md.tmpl States the handle-as-author convention in the scaffolded agent guidance.
plugins/repokit/skills/new-repo/SKILL.md Updates /new-repo interview defaults and git identity recipe to prefer .login.
plugins/repokit/skills/new-repo/references/placeholders.md Updates {{author}} placeholder definition to match the handle-first convention.
docs/CHECKPOINT.md Updates resume-state content for the current work batch/status.
docs/adr/0009-author-identity-handle-not-real-name.md Records the decision, rationale, and guard design trade-offs.
CHANGELOG.md Notes the added convention + guard and the fixed /new-repo identity defaults.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +128 to +134
function Test-AnonymousIdentity([string]$Name, [string]$Email) {
if ($Email -eq 'noreply@github.com') { return $true } # GitHub's own web-flow identity
if ($Email -match '^(\d+\+)?(?<login>[^@]+)@users\.noreply\.github\.com$') {
return ($Name -eq $Matches['login']) # the handle, nothing else
}
return $false
}

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7569419noreply@github.com now passes only as GitHub's own identity (GitHub <noreply@github.com>); a real name paired with the web-flow email fails. Smoke cases added in both directions (12/13).

— 🤖 Claude Code (Fable 5), on behalf of @PBNZ

Comment thread scripts/smoke_test_repokit_check.ps1 Outdated
# --- Author-identity cases (refs #25/#26) — these fixtures are real git repos. ---------------
function New-GitFixture([string]$UserName, [string]$UserEmail) {
$d = New-Fixture
git -C $d init -q -b main

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7569419 — the fixture now mirrors the fallback the /new-repo skill documents: git init -b main, and on failure (git < 2.28) git init + git branch -m main.

— 🤖 Claude Code (Fable 5), on behalf of @PBNZ

Comment thread docs/CHECKPOINT.md Outdated
Comment on lines +7 to +13
- Status: IN PROGRESS
- In progress: two branches ready for local review — `fix/author-identity` (#25 + #26,
ADR-0009: handle-over-real-name defaults, repokit-check identity check) and
`fix/session-end-branch-check` (#28: content-based branch-landed check); owner pushes and
opens the PRs (`Refs #NN`, no closing keywords)
- Next step: review both branches, push, open two PRs, merge, verify, close #25/#26/#28;
`[Unreleased]` then holds a shippable standards batch — cut 0.6.0

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7569419 — the checkpoint now records the open PRs and the remaining owner steps (merge, verify-and-close, cut 0.6.0). PR #30 carries the identical checkpoint content (93da069), so whichever PR merges second still merges clean.

— 🤖 Claude Code (Fable 5), on behalf of @PBNZ

…ollow-up)

Copilot review on PR #29: noreply@github.com passed with any name, so a
real name paired with the web-flow email slipped through -- now only
"GitHub <noreply@github.com>" passes, with smoke cases in both
directions. Also mirrors the documented git < 2.28 init fallback in the
smoke fixture and refreshes the checkpoint to post-push state.

Refs #25

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PBNZ added a commit that referenced this pull request Aug 12, 2026
Copilot review on PR #30: the checkpoint described pre-PR actions that
are already done. Now states the open PRs and the remaining owner steps.
Identical content lands via PR #29 so the second merge stays clean.

Refs #28

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@PBNZ
PBNZ merged commit 3809d7e into main Aug 12, 2026
6 checks passed
@PBNZ
PBNZ deleted the fix/author-identity branch August 12, 2026 12:26
PBNZ added a commit that referenced this pull request Aug 12, 2026
…rges (#30)

* fix(standard): branch-landed check is content-based, not ancestry-based

The session-end checklist's first item relied on `git branch -a
--no-merged`, an ancestry test: on rebase- or squash-merging repos every
landed branch is reported unmerged forever, `git branch -d` refuses it by
the same test, and the only way to clear the box was the reflexive
`git branch -D` habit the checklist should be training away.

The item keeps `--no-merged` as the enumerator but names the over-report,
prescribes confirming the change landed by content before force-deleting
(`gh pr list --state merged --head <branch>`; `git log --cherry` for
no-PR rebases), forbids `-D` when both checks fail, and closes the remote
half with `gh repo edit --delete-branch-on-merge` plus `git fetch
--prune`. The sentence quoted verbatim by agent-collaboration.md is
unchanged.

Refs #28

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: refresh checkpoint to post-push state (review follow-up)

Copilot review on PR #30: the checkpoint described pre-PR actions that
are already done. Now states the open PRs and the remaining owner steps.
Identical content lands via PR #29 so the second merge stays clean.

Refs #28

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants