29ffb42898
---ci--- project: atelier phase: 0 milestone: v0.4 status: complete requirements: covered: [ATELIER-92, ATELIER-93, ATELIER-94, ATELIER-95, ATELIER-96, ATELIER-97, ATELIER-98, ATELIER-99, ATELIER-100, ATELIER-101, ATELIER-102, ATELIER-103, ATELIER-104, ATELIER-105, ATELIER-106, ATELIER-107, ATELIER-108, ATELIER-109, ATELIER-110, ATELIER-111, ATELIER-112, ATELIER-113, ATELIER-114, ATELIER-115, ATELIER-116, ATELIER-117] partial: [] ---/ci---
11 KiB
11 KiB
Peer Review Checklist
For human reviewers. Run this when reviewing a PR or a change. Complements
agent-checklist.md(which the author ran before finishing).
Purpose
A peer review is a second set of eyes on correctness, clarity, and completeness. It is not a gatekeeping ritual; it is a quality multiplier. The author ran the agent checklist; the reviewer checks what the author could not see.
The Review
Understanding (read first, judge never)
- Read the PR description. What is the change trying to do?
- Read the linked issue/spec. Does the change address it?
- Read the changed files in order. Do not jump to judgment.
Correctness (C1)
- Does the change do what it claims?
- Are there edge cases the author missed? (Comment, don't fix in review)
- Are there failure cases unhandled?
- Are the tests testing the right thing? (A test that cannot fail is theater)
- Would this code fail in production? (Different from "does it pass CI")
Clarity (C2)
- Can you understand the change without asking the author?
- Are names intent-revealing?
- Is there a comment that explains why where the why is non-obvious?
- Is the diff minimal? (Unrelated changes are review noise)
Simplicity (C3)
- Is there dead code introduced?
- Is there premature abstraction?
- Could the change be simpler? (Suggest, don't block unless egregious)
- Is there a simpler approach the author may not have considered?
Locality (C4)
- Are related changes grouped?
- Are unrelated changes separated (different PRs)?
- Does a change require touching distant files unnecessarily?
Reversibility (C5)
- Is the change undoable?
- Are there migrations? Do they have rollbacks?
- Are there breaking changes? If so, is there a deprecation path?
Composability (C6)
- Does the change respect existing boundaries?
- Does it introduce coupling that should be an interface?
- Is the new code reusable, or one-off?
Observability (C7)
- Are there logs/metrics for the new behavior?
- Are errors structured and traceable?
- Are there no secrets in logs?
Economy (C8)
- Are there unbounded operations?
- Is memory/time bounded?
- Is the cost proportional to the need?
Domain-Specific (if applicable)
Run the relevant domain section from agent-checklist.md (UI/UX, API, Security, Data, Testing, Performance, Observability, Errors, Concurrency, DevOps, Infrastructure as Code, Kubernetes). The author ran it; the reviewer verifies.
If Infrastructure as Code
- Are providers pinned and modules version-pinned? (no
latest) - Is state remote with locking, not committed?
- Is the
plandiff reviewed, not just the config? - Are secrets via providers/stores, not in HCL?
- Are credentials scoped per environment?
- Is drift being treated as an incident?
If Kubernetes
- Are controllers used, not bare pods?
- Are resource requests set on every prod container?
- Are probes defined and checking the workload, not its dependencies?
- Is RBAC least-privilege, bound to ServiceAccounts by intent?
- Are image tags pinned, not
:latest? - Is persistent storage explicit (PVC + reclaim policy decided)?
- Are ConfigMaps and Secrets separate?
- Is the rollback path tested, not assumed?
If GitOps + Operators
- Is desired state sourced from git, not from the cluster?
- Is configuration declarative, not imperative scripts?
- Is reconciliation pull-based (no external push credentials into the cluster)?
- Does the reconciliation loop run continuously and auto-correct drift?
- Is every change a commit, with history as the audit/rollback path?
- Is operational knowledge encoded as CRDs/controllers, not runbooks humans must remember?
- Does progressive delivery (canary/blue-green) have a tested abort/rollback path?
- Are there manual
kubectl apply/kubectl editon GitOps-managed resources? (flag as incident) - Do sync failures, health degradation, and rollout stalls emit status + notifications?
- Are controller credentials scoped to reconciled namespaces/resources (no cluster-admin GitOps robot)?
If AI / ML
- Scope check: is this engineering discipline (data versioning, evaluation, serving, drift), NOT algorithm/model design? (D-023 — reject algorithm-design content)
- Is every training run reproducible from pinned data + code + config + environment?
- Are datasets, features, and splits versioned artifacts with lineage (not just
git)? - Can any deployed prediction trace back through model → training run → dataset → source?
- Are metrics, splits, and thresholds declared a priori (no post-hoc metric cherry-picking)?
- Are models pinned, immutable, registry-tracked artifacts (never "the latest")?
- Is inference observable (latency, throughput, input distributions, prediction confidence)?
- Are data drift, concept drift, and prediction drift monitored (drift signal = incident)?
- Are inference inputs validated against the model's contract (schema, ranges, types)?
- Are training/serving flows composable pipelines (not notebooks in production)?
- Does serving rollback restore the prior model artifact, not just the prior code?
If i18n
- Is the source language treated as one locale among many, not the "neutral" default?
- Do locale identifiers use BCP 47 tags (no ad-hoc locale codes)?
- Are user-facing strings in locale resource files (not concatenated inline in code)?
- Do plural/gender/select use ICU MessageFormat (no
if (n == 1)branching)? - Are dates, times, numbers, currencies, units formatted via ICU/CLDR/
Intl(no hand-rolled formatters)? - Is RTL/bidi a first-class layout concern (logical CSS properties over physical)?
- Do layouts accommodate translation expansion (no fixed pixel widths for text)?
- Are pseudo-locales used to test before real translations arrive?
- Are icons, colors, and imagery reviewed for locale-sensitivity?
- Are resource files versioned (bad translation = rollback, not hot-patch)?
If Compliance
- Scope check: is this framework-agnostic (no regulation-specific GDPR/HIPAA/SOC2/PCI content)? (D-024)
- Are audit records immutable once written (deletion/mutation is itself an auditable incident)?
- Is the set of auditable actions defined a priori ("we forgot to log it" is a violation)?
- Is data lifetime declared and enforced as policy (deletion at end-of-life is a feature)?
- Is compliance policy expressed in versioned, reviewable, testable code (not spreadsheets/prose)?
- Do policy violations block before the action (admission/CI/CD-time, not after the audit)?
- Is evidence gathered as a byproduct of operation (not assembled manually at audit time)?
- Does every logged action trace to an authenticated principal (no shared/generic identities)?
- Are data-subject rights (access, export, deletion) operations with defined contracts and audit trails?
- Do audit logs avoid leaking secrets (redaction is structural, not opportunistic)?
- Does the system report its own compliance state (drift from policy, open violations, retention status)?
If Edge
- Scope check: is this the proximity/location/constraint angle, NOT generic perf or in-process concurrency? (D-061 — reject generic-performance or in-process-concurrency content as out-of-scope)
- Is compute placed near the user/data source, with latency treated as a correctness constraint (not a perf preference)? (P1)
- Does the system continue to operate offline; is partition the norm, not the exception? (P2)
- Are edge-node resource constraints (CPU/memory/power/bandwidth) declared per node class, not assumed infinite? (P3)
- Do sync conflicts converge; is there no oscillation or infinite sync loop? (P4)
- Are sync, cache-fill, and device commands idempotent (retries safe)? (P5)
- Do edge caches have an explicit TTL or invalidation strategy (no TTL-less caches under partition)? (P6)
- Is partial degradation a designed state with a defined contract (not a crash)? (P7)
- Are routing, fan-out, and data placement location-aware decisions? (P8)
- Are edge-device credentials scoped and per-device (no edge cluster-admin)? (P9)
- Is telemetry local-first (buffered on-node, forwarded on reconnect; partition does not blind the operator)? (P10)
If Messaging
- Scope check: is this cross-process/network-failure-model, NOT in-process concurrency? (D-062 — reject in-process-concurrency content as out-of-scope)
- Do messages have an explicit, versioned schema (producer and consumer agree on shape)? (P1)
- Are ordering guarantees (per-partition, global, none) explicit and documented? (P2)
- Are consumers idempotent (redelivery deduped via idempotency keys or deterministic processing)? (P3)
- Are delivery semantics (at-least-once/at-most-once/exactly-once) a declared choice per channel? (P4)
- Do poison messages route to a dead-letter queue (DLQ observable and drainable)? (P5)
- Is backpressure bounded (consumer lag visible, max-unacked bounded, retry budget capped)? (P6)
- Is partition key choice a documented design decision (ordering vs parallelism vs hotspots)? (P7)
- Are retention windows and replay-from-offset explicit (durable log, not pipe)? (P8)
- Are schema changes backward/forward-compatible (breaking changes are versioned migrations)? (P9)
- Are consumer lag, DLQ depth, throughput, and consumer-group health observed (silent backlog is a bug)? (P10)
If Language-Derived Docs
- Scope check: apply, don't derive — no new P-rules, no new matrix rows (D-063, D-066 — reject any "TS P1"/"Python P2" etc. new-P-rule content)
- Does every section header name ≥1 traced domain P-rule AND the core C-rule(s) inline?
- Are fenced code examples in-language and illustrative only (no standalone
.ts/.py/.go/.rsruntime artifacts)? (D-020) - Does the first-principles stub retain its section structure (no P1–P10 numbering added to languages)? (D-063)
- Are cross-links to traced domain docs present (≥1 outbound per derived doc)? (ATELIER-114)
Review Etiquette
- Comment, don't command. "This could be X" not "Change this to X."
- Distinguish blocking from suggestions. "Blocking: correctness bug. Suggestion: naming."
- Praise good code. Reviews are not just for finding problems.
- Don't review style the linter should catch. Fix the linter, not the PR.
- Ask questions. "Why this approach?" often reveals more than "This is wrong."
Approving
- Approve when: the change is correct, clear, and complete. Minor suggestions can be left for the author.
- Request changes when: there is a correctness bug, a missing test, or a clarity problem that blocks understanding.
- Reject when: the change should not exist (wrong direction, duplicate, scope-violating).
What This Checklist is Not
- Not a style guide. Style is automated (linter, formatter).
- Not a gatekeeping tool. The goal is quality, not perfection.
- Not a substitute for the author's own checklist. The author runs
agent-checklist.mdfirst; this is the second pass.