decisions(0019) + docs(specs): non-author reviewer mandatory v0 prebuild (#75) #369

Merged
pdurlej merged 1 commit from claude/fork-C3-governance-non-author-reviewer-mandatory into main 2026-05-23 09:20:05 +02:00
Collaborator

Summary

Fork-C3 prebuild per prompts/fork-dispatch-2026-05-18-retry-batch.md §2.7. Closes the convention→mechanism gap for self-approval surface exposed by PR #319 (2026-05-15) and codifies pyfallow Phase A close-out pattern (operator decision 2026-05-04/05).

Contents

  • decisions/0019-non-author-reviewer-mandatory.md — Proposed ADR (Nygard format, ~230 lines)
  • docs/specs/governance-non-author-reviewer-mandatory-v0/ (6 files, ~1100 lines total):
    • README.md — entry point + safety/production boundary
    • 00-constitution.md — 8 non-negotiable principles
    • 01-specify.md — 10-scenario behavior matrix + 5 acceptance criteria (A1-A5)
    • 02-plan.md — 7 design questions answered + alternatives + risks
    • 03-tasks.md — per-slice breakdown (a operator → b codex → c optional → d claude → e claude)
    • 04-implement-notes.md — Forgejo API patterns + version quirks + cousin email mapping + secret token decision
  • prompts/codex-governance-non-author-reviewer-mandatory.md — codex execution prompt for Slices (b)+(c) with Safety/production boundary, hard gates, stop conditions per ADR-0018

The rule (TL;DR)

Every PR on main requires ≥1 approval from a cousin different than the PR author. Universal floor regardless of size class.

  • Author identity = commit.author.email
  • Approver identity = email of Forgejo Pull Request Review approver
  • {author, approver} cardinality MUST be ≥ 2
  • ADR-0007 risk tiers compose (Trivial/Lite/Full); ADR-0019 sets floor, ADR-0007 sets ceiling
  • Operator is merger, NOT reviewer-of-record
  • Break-glass is operator-only ceremony (§ 7)

Enforcement

  1. Forgejo branch protection on main (≥1 approval, dismiss stale on push) — Slice (a) operator-action
  2. CI workflow non-author-review-check.yml (status check non-author-reviewer / guard) — Slice (b) codex Lite PR

Defense-in-depth pattern from ADR-0017.

Tier

Full per ADR-0007 (new governance ADR). Operator merge only.

Acceptance after rollout

  • 5+ subsequent PRs land with valid non-author approvals
  • state/break-glass-log.jsonl <2 entries per quarter
  • Cross-repo: pyfallow/hermes-agency/iskra-openclaw/kan-ductor configured per § P7
  • After 4 weeks healthy operation: ADR-0019 status moves to "Accepted"

Refs #75, #319 (live evidence), pyfallow Phase A close-out 2026-05-04/05, prompts/fork-dispatch-2026-05-18-retry-batch.md §2.7

## Summary Fork-C3 prebuild per `prompts/fork-dispatch-2026-05-18-retry-batch.md` §2.7. Closes the convention→mechanism gap for self-approval surface exposed by PR #319 (2026-05-15) and codifies pyfallow Phase A close-out pattern (operator decision 2026-05-04/05). ## Contents - **`decisions/0019-non-author-reviewer-mandatory.md`** — Proposed ADR (Nygard format, ~230 lines) - **`docs/specs/governance-non-author-reviewer-mandatory-v0/`** (6 files, ~1100 lines total): - README.md — entry point + safety/production boundary - 00-constitution.md — 8 non-negotiable principles - 01-specify.md — 10-scenario behavior matrix + 5 acceptance criteria (A1-A5) - 02-plan.md — 7 design questions answered + alternatives + risks - 03-tasks.md — per-slice breakdown (a operator → b codex → c optional → d claude → e claude) - 04-implement-notes.md — Forgejo API patterns + version quirks + cousin email mapping + secret token decision - **`prompts/codex-governance-non-author-reviewer-mandatory.md`** — codex execution prompt for Slices (b)+(c) with Safety/production boundary, hard gates, stop conditions per ADR-0018 ## The rule (TL;DR) **Every PR on `main` requires ≥1 approval from a cousin different than the PR author.** Universal floor regardless of size class. - Author identity = `commit.author.email` - Approver identity = email of Forgejo Pull Request Review approver - `{author, approver}` cardinality MUST be ≥ 2 - ADR-0007 risk tiers compose (Trivial/Lite/Full); ADR-0019 sets floor, ADR-0007 sets ceiling - Operator is merger, NOT reviewer-of-record - Break-glass is operator-only ceremony (§ 7) ## Enforcement 1. Forgejo branch protection on `main` (≥1 approval, dismiss stale on push) — Slice (a) operator-action 2. CI workflow `non-author-review-check.yml` (status check `non-author-reviewer / guard`) — Slice (b) codex Lite PR Defense-in-depth pattern from ADR-0017. ## Tier **Full** per ADR-0007 (new governance ADR). Operator merge only. ## Acceptance after rollout - 5+ subsequent PRs land with valid non-author approvals - `state/break-glass-log.jsonl` <2 entries per quarter - Cross-repo: pyfallow/hermes-agency/iskra-openclaw/kan-ductor configured per § P7 - After 4 weeks healthy operation: ADR-0019 status moves to "Accepted" Refs #75, #319 (live evidence), pyfallow Phase A close-out 2026-05-04/05, `prompts/fork-dispatch-2026-05-18-retry-batch.md` §2.7
decisions(0019) + docs(specs): non-author reviewer mandatory v0 prebuild (#75)
All checks were successful
base-is-main / guard (pull_request) Successful in 1s
canary-required / collect-diff (pull_request) Successful in 4s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 3s
platformctl plan / auto-apply scope (pull_request) Successful in 21s
canary-required / canary (pull_request) Successful in 13s
patchwarden-pr-sanity / sanity (pull_request) Successful in 20s
1e95285e8e
Per fork-anchor 2026-05-18 retry-batch dispatch (PR #356 §2.7).
Authoring fork: C3 (worktree-isolated per v0.1 pattern).

## ADR-0019 (proposed)

Universal floor: every PR on pdurlej/platform (and downstream
microprojects inheriting platform governance) requires ≥1 approval
from a cousin different than the PR author. Branch protection rule
on main + CI workflow `non-author-review-check.yml` enforces
mechanically. Operator is the merger, not a reviewer-of-record.

Closes the convention→mechanism gap exposed by PR #319 (live
self-approval observed 2026-05-15) and pyfallow Phase A close-out
(operator decision 2026-05-04/05).

ADR-0007 risk tiers compose, not replace:
- Trivial: self-merge invalid; must have non-author approval first
- Lite: 3 reviewers, ≥1 non-author
- Full: full canary 3+3, ≥1 non-author

Break-glass procedure is operator-only ceremony per § 7. Cousins
never invoke break-glass.

## Spec Kit (6 files)

docs/specs/governance-non-author-reviewer-mandatory-v0/:
- README.md — entry point + safety/production boundary
- 00-constitution.md — 8 non-negotiable principles (P1-P8)
- 01-specify.md — acceptance criteria + behavior matrix (10 scenarios)
- 02-plan.md — design decisions (Q1-Q7) + risks + decision queue
- 03-tasks.md — per-slice breakdown (a operator → b codex → c
  optional → d claude → e claude)
- 04-implement-notes.md — Forgejo quirks + API patterns + cousin
  email mapping + secret token decision + validation checklist

## Codex execution prompt

prompts/codex-governance-non-author-reviewer-mandatory.md:
- Safety / production boundary (does NOT authorize branch protection
  changes, production runner, operator PAT usage)
- Pre-flight (worktree pattern per v0.1, identity check)
- Per-slice instructions (b is codex's; c optional; d/e are claude's)
- Hard gates (G-ADR-0018, G-ADR-0019-P3, G-ADR-0019-P6, G-Sacred,
  G-Production-Runner, G-OperatorPAT)
- Stop conditions per ADR-0018 (NO "accept workaround" outcomes)
- Reporting format

## Tier

Full per ADR-0007 (new governance ADR). Operator merge only.

## Constraints honored

- ADR-0017: no stacked PRs (this is a single PR from main)
- ADR-0018: governance philosophy explicitly cited; "accept
  workaround" outcomes rejected
- Sacred path: no modification of policies/sacred-paths.yaml or
  control-plane/platformctl/safety.py in this PR
- Identity isolation: claude author per ADR-0010

Refs #75, #319 (live evidence), pyfallow Phase A close-out
2026-05-04/05, fork-anchor dispatch §2.7
Sign in to join this conversation.
No reviewers
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform!369
No description provided.