Skip to content

chore(privacy): use role references and drop verbatim maintainer quotes - #185

Merged
zaridan merged 2 commits into
mainfrom
chore/hygiene-scrub-name-and-quotes
Aug 3, 2026
Merged

chore(privacy): use role references and drop verbatim maintainer quotes#185
zaridan merged 2 commits into
mainfrom
chore/hygiene-scrub-name-and-quotes

Conversation

@zaridan

@zaridan zaridan commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🟢 SAFE TO MERGE

All 8 gates green, including Quality (typecheck, lint, test, coverage). No behaviour change — comments, spec prose, and one JSDoc string only, verified line by line. No new decisions: every choice here was made by the maintainer in session on 2026-08-02, including leaving .github/CODEOWNERS as-is.

CodeRabbit produced no review (rate limited, no walkthrough, no comments, no review object). Codex substituted, disclosed below: 3 findings — 2 real and fixed, 1 raised and decided.


What this changes

  1. The maintainer's personal name → role references ("the maintainer") in 21 source files and one spec — 28 occurrences.
  2. specs/mail/spam-classification.md no longer quotes a private working conversation verbatim. Five quotations become dated decision references: (maintainer decision, 2026-08-02).

The decision ledger keeps its full force. Every DECIDED and INFERRED marking is unchanged — this only changes how the source is cited, not whether it is.


Why rule 2 needs saying out loud

The repo's provenance discipline pulls the other way: every normative choice must carry its source, and anything unauthorized must be marked INFERRED. That is a good rule and it stays.

But it created steady pressure to paste the authorizing words into the repo — and that is not what it asked for. Recording that a decision was made, and when, discharges the duty completely. The verbatim source belongs outside the repository.

This has now been swept from this repo twice. PR #166 was itself titled "final public-repo hygiene" and its own provenance table contains the line "Names in docs become 'the maintainer'" — and the names came back. That is why this PR is paired with a mechanical gate rather than a resolution to be careful.


The gate — deliberately NOT in this repo

A pre-commit hook now blocks the name, contact details, verbatim quotations, and health or personal-circumstance language before a commit is created.

It is installed locally and is not committed here, on purpose: the patterns it matches are the disclosure. A version of this check was drafted into this repo's CI first; committing it would have published the exact strings it exists to remove, permanently, in a file whose purpose is removing them. Caught before it landed.

The hook was tested against six violation cases and two clean controls. The first two attempts silently passed everything — \b is unsupported by the local grep, which also rejected the diff-extraction pattern outright — so the matching now runs through perl. Testing it is the only reason that is known.


Deliberately out of scope

Commit messages (52) and merged PR bodies (32) that carry the name. Rewriting published history breaks every existing clone and fork; the exposure is a first name on a project the person owns. Not worth the cure.

Two merged PR bodies containing verbatim quotations (#180, #166) are being edited separately — bodies are mutable, so that costs nothing.


Decision provenance

Decision — in plain words Source
Do the quote scrub, the name sweep, and add a guard Maintainer instruction, 2026-08-02
Guard is local-only, not in this repo's CI Maintainer instruction, 2026-08-02, after correctly identifying that a public pattern list is itself the leak
Leave commit history alone Maintainer instruction, 2026-08-02
⚠️ INFERRED — the specific replacement wording ((maintainer decision, 2026-08-02)) and that role references read as "the maintainer" rather than another form Mine
⚠️ INFERRED — that the hook also blocks health/personal-circumstance language, which was not asked for Mine — added because it is the same class of leak and free to include

One-way doors

None. Comment and prose edits, fully reversible. No public promise, no licensing term, no API surface.

🤖 Generated with Claude Code


Review adjudication

CodeRabbit did not review this PR — its check reported "Review rate limited" with no walkthrough, no inline comments, and no review object. Per the repo's review protocol that is not a review, so an adversarial Codex pass was run in its place and is disclosed here rather than left implied.

Codex: 3 findings — 2 real and fixed, 1 raised for a separate decision.

# Finding Verdict
1 The spec's own summary paragraph still reproduced two removed private phrasings verbatim, and claimed the decisions "are quoted in §7's ledger" — untrue once the ledger stopped quoting them Real, fixed. Both paraphrased; "quoted" → "recorded"
2 .github/CODEOWNERS names a personal GitHub handle ⚠️ Real, not fixed here — see below
3 A code comment read "flagged for his sign-off", carrying a personal pronoun through a change meant to remove personal reference Real, fixed. Now "maintainer sign-off"

Verified clean by the same pass: no behaviour change (every changed line is a comment, JSDoc block, JSX comment, or markdown prose; all 21 TS/TSX files parse; comment delimiters balanced; token-identical with comments excluded); no DECIDED/INFERRED designation altered; no grammar breakage from the substitution; nothing undisclosed in the diff.

Finding 2 — needs an ownership decision, not a hygiene edit

.github/CODEOWNERS reads * @zaridan. Replacing it requires an org team that already exists and holds the right access; getting it wrong silently breaks required review on every PR. It is also weaker exposure than the rest — the account owns the repository, so it appears in commit metadata regardless.

Decision: left as-is (maintainer instruction, 2026-08-02). Not deferred — decided.

Two hygiene rules restored across the tree. Both have been swept from this
repository before and returned, so this change is paired with a local
pre-commit gate rather than relying on discipline.

1. The maintainer's personal name is replaced with role references -- "the
   maintainer" -- in 21 source files and one spec. Docs and comments should
   name roles, not people.

2. specs/mail/spam-classification.md no longer quotes the maintainer's
   private working conversation verbatim. Five quotations become dated
   decision references: "(maintainer decision, 2026-08-02)".

Rule 2 needs saying explicitly, because the repo's provenance discipline
pulls the other way: every normative choice must carry its source, and
anything unauthorized must be marked INFERRED. That duty is discharged by
recording THAT a decision was made and when. It never required publishing
the words. The decision ledger keeps its full force -- every DECIDED and
INFERRED marking is unchanged.

Commit history and merged pull-request bodies are deliberately untouched.
Rewriting published history would cost every clone and fork more than the
exposure is worth.

No behaviour change: comments, spec prose, and one JSDoc string only.

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

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
helpthread Ready Ready Preview Aug 3, 2026 12:47am
helpthread-inbox Ready Ready Preview Aug 3, 2026 12:47am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@zaridan, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 14 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 041aba3b-2f4c-4e2f-887d-840b699736c6

📥 Commits

Reviewing files that changed from the base of the PR and between 64448bb and cc72954.

📒 Files selected for processing (22)
  • specs/mail/spam-classification.md
  • src/db/migrate.ts
  • web/src/app/manage/agents/[id]/page.tsx
  • web/src/app/manage/agents/[id]/permissions/page.tsx
  • web/src/app/manage/agents/new/page.tsx
  • web/src/app/manage/agents/page.tsx
  • web/src/components/AgentDetailShell.tsx
  • web/src/components/AgentPermissionsScreen.tsx
  • web/src/components/AgentProfileScreen.tsx
  • web/src/components/ConnectInboxForm.tsx
  • web/src/components/ConversationScreen.tsx
  • web/src/components/InboxSettingsShell.tsx
  • web/src/components/InviteAcceptScreen.tsx
  • web/src/components/LoginScreen.tsx
  • web/src/components/MailboxListScreen.tsx
  • web/src/components/NewAgentScreen.tsx
  • web/src/components/SettingsScreen.tsx
  • web/src/components/SetupScreen.tsx
  • web/src/components/ShortcutsProvider.tsx
  • web/src/components/TeamListScreen.tsx
  • web/src/components/TopBar.tsx
  • web/src/lib/agent-actions.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

An adversarial pass confirmed the no-behaviour-change claim (every changed
line is a comment, JSDoc block, JSX comment, or markdown prose; all 21
TS/TSX files parse; delimiters balanced) and found the sweep incomplete
in two places:

The spec's own summary paragraph still reproduced two of the removed
private phrasings verbatim, and asserted the decisions "are quoted in
§7's ledger" -- which stopped being true when the ledger's quotations
became dated decision references. Both phrasings are now paraphrased and
the sentence says "recorded" rather than "quoted".

A code comment read "flagged for his sign-off", carrying a personal
pronoun through a change whose purpose was removing personal reference.
Now "maintainer sign-off".

Not fixed, raised separately: .github/CODEOWNERS names a personal GitHub
handle. Changing it needs an org team that exists and holds the right
access, and getting it wrong breaks required review. That is an ownership
decision, not a hygiene edit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@zaridan
zaridan merged commit 45ca9dc into main Aug 3, 2026
8 checks passed
@zaridan
zaridan deleted the chore/hygiene-scrub-name-and-quotes branch August 3, 2026 17:19
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.

1 participant