reviewer-github-app — operations
The p24-reviewer GitHub App — a dedicated, least-privilege identity whose only job is posting
PR reviews (APPROVE / REQUEST_CHANGES / comments) for the auto-review pipeline. It replaces the
shared App 2109526 for the review approve step, isolating the review identity from 2109526’s
contents:write / secrets:write / administration:write blast radius. Issue: #7478.
Full playbook: docs/playbooks/reviewer-github-app.md.
Status (2026-10-08)
Live and posting reviews, but its APPROVE does NOT count toward the required review (verified
2026-10-08 from worker logs, #7574): reviewDecision stays REVIEW_REQUIRED after a p24-reviewer
APPROVE (authorAssociation: NONE, likely because the App has contents:read only). Owner decision
2026-10-08 (“option 2”, #7625): keep p24-reviewer review-only (no contents:write). So the
counting approve = App 2109526 (p24-infra-admin) and p24-reviewer = comments /
CHANGES_REQUESTED only. Components:
- App created (App ID
5208530, installation ID168439358), installed on all repositories of theradieuaccount (repository_selection: all, intentional — fleet-wide review identity). scripts/gh-app-token --app reviewer— shipped (#7483, onmain).secrets/github-reviewer-app.env.sops— real values (REVIEWER_APP_ID/REVIEWER_APP_PRIVATE_KEY_B64/REVIEWER_APP_INSTALLATION_ID), merged in #7516. Do not recreate.infra/agent-prompts/review-pr-worker.mdswitch — applied (v3.2.0, #7595, 2026-10-08) and hardened (#7618): the worker postsp24-reviewerfor comments / CHANGES_REQUESTED, and the counting APPROVE comes from App 2109526 (#6039). Per the #7625 decision the worker’s Phase 2 Step 7 should make App 2109526 the primary approve path (dropping the now-redundant reviewer-first-approve +reviewDecisionsecond-approve) — that edit is a pending human-confirmed change to theprotected: trueworker file (tracked on #7625).
Architecture
- Permissions (least-privilege):
pull_requests:write,contents:read,issues:write,metadata:read(optionalchecks:write). Nocontents:write/secrets:write/administration:write/workflows:write— it cannot push code, mutate secrets, change settings, or merge. - Installation: all repositories of the
radieuaccount (repository_selection: all, user decision 2026-10-06) — the fleet-wide review identity for every repo inREVIEW_REPOS(p24-infra, et-operational-platform, Art-Agency, radekkonarski-personal-brand, gmail-tools). The review-only permission set is what keeps a fleet-wide key safe. - Token flow: review-pr worker on bms-4
sops -d secrets/github-reviewer-app.env.sops→ exportsREVIEWER_APP_*→scripts/gh-app-token --app reviewer --permissions pull_requests:writemints a 1h installation token (os.environ-first resolution; separate cache/tmp/.gh-reviewer-app-token-cache). Token never persisted beyond that cache; private key never leaves SOPS. - Merge stays separate: approval is by
p24-reviewer; merge (needscontents/admin) still runs via the existing worker/CI/App-2109526 path. Two distinct identities by design.
Secrets
secrets/github-reviewer-app.env.sops — REVIEWER_APP_ID, REVIEWER_APP_PRIVATE_KEY_B64,
REVIEWER_APP_INSTALLATION_ID (only the private key is secret; App ID 5208530 and installation ID
168439358 are public). 3 recipients (developer + bms-4 infra-task worker key + lap2-windows, #7516).
Excluded from secrets-sync.yml — no server plaintext .env, no sync job; the worker decrypts it
directly on bms-4. Rekey via bms-4 SSH, not CI (AGE_KEY_GHA is not a recipient). Skipped in both CI
SOPS-health jobs (self-test.yml #7538, sops-pr-canary.yml #7540) since CI cannot decrypt it.
Rotation
- Token issuance — Tier 1, autonomous (1h tokens).
- Private-key rotation — Tier 3, human-only in the GitHub App UI, then secret-manager updates the
SOPS file. See
playbooks/secret-rotation-access-matrix.md.
Monitoring / verification
scripts/gh-app-token --app reviewer --check # exit 0 + "OK" on stderr once creds are realReview activity is visible as p24-reviewer-authored reviews on PRs, and in the dev_r_worker_queue
job_type=review-pr rows (see playbooks/ai-pr-auto-review.md).
Compliance
dev_r_servicesrow:reviewer-github-app(tooling),compliance_workbook='yes'.- Not an AI system itself (it is the identity/transport for the review pipeline; the AI review logic
lives in
review-pr-worker.md/dev_r_ai_systems).