Concerns
Every card's rule on one page, and each row links to the full card. Pick one or more concerns to scope a review, such as performance only. A card matches when it lists any picked concern. Report each check as PASS, FAIL, or N/A with file:line evidence. A FAIL carries the card's severity. Any block FAIL means request changes. A should-fix or discuss FAIL goes in the review but does not block.
FAIL [block] chg-expand-contract - src/a.py:42 - renames the column and drops the old one in one migration
FAIL [should-fix] chg-one-concern - src/b.py:7 - a logging rewrite rides along with the bug fix
PASS chg-breaking-change-taxonomy - src/c.py:15 - no signature or return shape changes
N/A chg-perf-claim-evidence - the description makes no performance claimChecklist
- code-adr discussKeep a short written record for each significant design choice (datastore, framework, deviation from a pattern) that states the context, the decision, and its consequences.
- code-build-hermetic should-fixBuild from declared inputs only, so that the same source revision gives the same artifact.
- code-ci-gates should-fixRequire review and passing build, tests, lint, and type checks on the default branch before merge, and leave nothing mechanical to reviewer vigilance.
- code-consistency-drift discussFor each recurring concern (errors, config, HTTP clients, logging), make one pattern the standard instead of leaving several as equal peers.
- code-dead-code should-fixRemove unreferenced functions, commented-out code, expired flags, and orphaned files; history keeps them.
- code-dependency-licence-sbom should-fixGenerate an SBOM, and scan dependencies for known vulnerabilities on every change or on a schedule.
- code-dependency-pinning blockCommit a lockfile with hashes and install from it in CI.
- code-perf-budget-in-ci should-fixWrite the performance budget down as a CI check that fails the build when it is exceeded.
- code-rule-has-enforcer should-fixBack each rule that a type, lint or CI check could enforce with that check, not with a line in an instruction file or a repeated review comment.
- code-secret-scan blockScan for committed credentials, and treat any hit as leaked: revoke and replace it first.
- code-workflow-supply-chain blockPin every CI action to a full commit SHA.
- fn-aria-role-has-state-and-keys should-fixWhen a native element cannot do the job, give the custom widget the state attribute and the keys its role promises.
- fn-colour-not-sole-cue should-fixPair every colour that carries meaning with a second cue: text, an icon, a shape, or an underline.
- fn-comments-explain-why should-fixWrite comments that give a reason, a constraint, or a trade-off; rename before commenting, and never restate what the next line does.
- fn-confine-file-path blockResolve the final path and check that it stays inside the intended base directory before using it.
- fn-csprng-for-secrets blockDraw every security-relevant random value from the platform CSPRNG.
- fn-destructive-confirm-or-undo should-fixMake a destructive action reversible with undo, or ask the user to confirm it before it runs.
- fn-dialog-focus-managed blockWhen a modal opens, move focus into it and keep Tab inside it. Make Escape close it.
- fn-error-says-what-and-how should-fixShow each validation error next to its field, in plain words that name what is wrong and how to fix it.
- fn-fetch-only-needed-data should-fixFilter, count, and aggregate in the query, and select only the columns the code uses.
- fn-focus-indicator-visible blockKeep a visible focus indicator on every focusable element. Never set
outline: nonewithout a replacement. - fn-form-control-has-label blockTie every form control to a visible
<label>, withforand a matchingidor by wrapping it. A placeholder is not a label. - fn-heading-structure should-fixMark every heading with a real
<h1>to<h6>element, not a styleddiv,span, orp. - fn-img-alt-text should-fixGive every
<img>analtattribute: text that serves the image's purpose, oralt=""when the image is decorative. - fn-independent-work-concurrent should-fixStart independent I/O together and wait for all of it; run calls in sequence only when one needs the result of another.
- fn-join-dont-concat-in-loop should-fixBuild a string from a loop with a builder or a join, never with repeated
+=. - fn-jwt-verify-pinned blockVerify the signature against a fixed list of accepted algorithms, and check
issandaud, before reading any claim. - fn-keep-input-on-error should-fixAfter a failed validation or submit, show the form again with every value the user entered, correct or not.
- fn-native-button-or-link blockUse
<button>for an action and<a href>for navigation. Do not attach a click handler to adiv,span, orawith nohref. - fn-no-blocking-call-in-async-code blockNever make a blocking I/O call or run long CPU work directly in async code; use the async API or hand the work to a thread or worker.
- fn-no-mass-assignment blockBind request data to a DTO or an explicit field allowlist, never straight onto the model.
- fn-no-native-deserialise-untrusted blockParse untrusted input with a data-only format, never with a native object deserialiser.
- fn-no-positive-tabindex should-fixWrite the DOM in reading order and never set
tabindexabove 0. - fn-no-raw-html-sink blockWrite untrusted text through an encoding sink (
textContent, auto-escaped template), never through a raw HTML sink. - fn-no-shell-with-input blockStart processes with the program and each argument as separate list items, and never through a shell string.
- fn-object-level-authz blockCheck that the caller may act on the specific record before returning or changing it.
- fn-password-slow-hash blockHash passwords with Argon2id (or scrypt, bcrypt, PBKDF2) and a per-password salt from the library.
- fn-reduced-motion-respected should-fixSwitch off or replace large, repeating, or interaction-triggered motion when
prefers-reduced-motion: reduceis set. - fn-regex-compiled-once should-fixCompile a regular expression once, at module or startup level, and reuse it.
- fn-rerun-safe-after-crash blockMake a state-changing operation give the same result on a second run and after a crash at any step, by deriving each step from current state and making leftovers recognisable as stale.
- fn-response-fields-explicit should-fixReturn a response type that lists each field, never the stored model or a generic dump of it.
- fn-status-announced-live-region should-fixAnnounce an async status message through a live region (
role="status"orrole="alert") that is already in the markup before its text changes. - fn-target-size should-fixMake each pointer target at least 24 by 24 CSS pixels, or space it so that a 24 px circle centred on it touches no other target and no other undersized target's circle.
- fn-tls-verify-on blockLeave certificate and hostname verification on in every environment that ships.
- inc-perf-fix-has-profile-evidence should-fixTie the performance fix to evidence that names the bottleneck: a profile, a trace, or a USE check.
- inc-rollback-path-tested should-fixExercise each mitigation that a runbook names (rollback, failover, flag off) on a regular schedule.
- mod-colour-tokens-meet-contrast should-fixMake every text and background token pair meet 4.5:1 (3:1 for large text), and every border, icon, and focus colour meet 3:1 against its neighbour.
- mod-derive-dont-duplicate should-fixDerive a type, list or enum from the schema or list that owns it, or add a build check that fails when the two disagree.
- mod-pooled-clients-built-once should-fixBuild pooled clients once at startup and reuse them.
- mod-single-writer-per-state should-fixLet only one writer change a piece of state at a time, through a single owner, a queue that serialises the writes, or compare-and-swap, never by convention.
- mod-vetted-crypto-only blockEncrypt with an authenticated mode such as AES-GCM, and never reuse a nonce under one key.
- mod-yagni should-fixAdd an abstraction only when the logic is reused, non-trivial, or clutters the main flow; do not build for a need that does not exist yet.
- prod-alerts-symptoms-golden-signals should-fixPage on user-visible symptoms, such as error rate and latency, not on causes.
- prod-canary-staged-rollout blockRoll out in stages behind a canary, and abort by rule, not by judgment.
- prod-kill-switch-fallback should-fixMake a risky feature switchable off without a deploy, and exercise every fallback path in test or in production on a schedule.
- prod-latency-slo-percentile should-fixDefine latency SLOs and alerts on high percentiles, never on the mean.
- prod-load-test-before-launch should-fixLoad test before launch, past the expected peak, with pass and fail thresholds written down.
- prod-profile-on-demand discussMake a CPU and memory profile of a production instance obtainable, through a continuous profiler or a private profile endpoint.
- svc-api-conditional-writes should-fixReturn an
ETagon reads and honourIf-Matchon writes, answering 412 when the entity tag is stale. - svc-api-deprecation-sunset should-fixBefore removing an endpoint, mark it
deprecatedin the spec and sendDeprecationandSunsetheaders, with theSunsetdate no earlier than theDeprecationdate. - svc-api-error-code-stable should-fixGive each error a stable machine-readable code that callers branch on, and never make them parse the message text.
- svc-api-versioning-policy should-fixWrite down one versioning scheme for the API, and ship no breaking change inside a version it has published.
- svc-auth-throttle-generic-errors blockLimit failed attempts per account, and return the same message and status code whether or not the account exists.
- svc-authz-central-deny-default blockRoute every request through one authorization layer that denies when no rule allows it.
- svc-bound-client-controlled-sizes should-fixCap every client-controlled size and count on the server: body bytes, string length, array items, page size and batch size.
- svc-bounded-background-tasks blockCap how many background tasks run at once, and never spawn one per input with no limit.
- svc-cors-allowlist should-fixAllow cross-origin access only to a fixed list of named origins, and never echo the request
Originheader back unchecked. - svc-csrf-state-changing blockRequire a CSRF token (or an equivalent header check) on every cookie-authenticated request that changes state, and never change state on GET.
- svc-idempotency-key blockMake every retryable write idempotent: the caller sends a unique key, and a retry with the same key never applies the write twice.
- svc-list-endpoint-paginates should-fixPaginate every list endpoint, with a default page size and a server-side maximum.
- svc-no-redundant-entry should-fixDo not ask for information the user already gave in the same flow. Fill it in, or let the user pick it.
- svc-rate-limit-quota should-fixEnforce a per-tenant quota on shared APIs and queues.
- svc-reflow-and-zoom should-fixMake the page usable at 320 CSS pixels wide and at 200% text zoom, with no sideways scrolling, no clipped content, and no blocked pinch-zoom.
- svc-retry-policy blockRetry only transient errors, with capped attempts and jittered exponential backoff.
- svc-session-lifecycle blockIssue a new session ID at login, and set
Secure,HttpOnlyandSameSiteon the session cookie. - svc-slow-operation-shows-progress should-fixShow that a slow action is under way, and show its progress when it runs long.
- svc-sqli-authn blockPass untrusted data to queries as bound parameters, never by string concatenation or formatting.
- svc-timeouts blockSet an explicit timeout on every remote call.
- svc-upload-validate-store blockAllowlist the file type, cap the size, and store each upload under a generated name where the server will not execute it.
- sys-agent-tool-least-privilege blockGive the agent only the narrow tools and the minimal credentials its task needs.
- sys-cache-bounds-invalidation should-fixBound every cache by size and give its entries an expiry.
- sys-consistent-ui-terms discussUse one label and one icon for the same action and the same concept across all screens.
- sys-fanout-leg-deadlines should-fixGive every leg of a fan-out its own deadline, and decide in code what happens when a leg misses it: a partial result, a hedged request, or an error.
- sys-load-shedding-bounded-queues blockBound every queue and reject excess work cheaply.
- sys-lock-fencing blockCheck a correctness lock on the resource side (fencing token or compare-and-set), never by lock possession alone.
- sys-migration-expand-contract blockRun data backfills in batches, in a migration separate from the schema change.
- sys-n-plus-one-pooling should-fixFetch related rows in one query or batch, never one query per row.
- sys-pii-minimise-retention should-fixGive every store of personal or sensitive data a retention period, and delete or anonymise the data when it ends.
- sys-prompt-injection blockValidate model output deterministically before code acts on it.
- sys-secrets-and-errors blockFail closed: a validation or auth error must deny, never continue, and an error response must not carry internals such as stack traces, SQL or tokens.
- sys-ssrf blockFetch a user-supplied URL only when its host matches a server-side allowlist.
- chg-author-hygiene should-fixSelf-review the diff and write the description before requesting review.
- chg-breaking-change-taxonomy blockTreat any observable difference in signature, return shape, error type, ordering, timing, defaults, or side effects as breaking until a consumer check says otherwise.
- chg-expand-contract blockEvolve shared contracts in steps: add the new form beside the old (expand), migrate every consumer, then remove the old form (contract) in a later change.
- chg-match-codebase-pattern should-fixFollow the established pattern nearby.
- chg-one-concern should-fixMake each change do one logical thing; if the description needs "and" between unrelated outcomes, split it.
- chg-perf-claim-evidence should-fixBack a performance claim with measured before-and-after numbers.
- chg-refactor-has-behaviour-pin should-fixPin current behaviour with a characterization test, snapshot or equivalence check before the refactor moves any structure.
- chg-refactor-separate should-fixPut refactors, renames, and reformatting in their own commit or PR, apart from behaviour changes.
- chg-review-signal discussDo not comment on what a tool enforces or on taste with no written rule; spend comments on a few high-conviction findings, and if there are many, talk to the author.
- chg-size-ceiling discussSplit a change past about 400 changed lines or about 20 files, or say in the description why not; aim for about 200.
- chg-tests-ship-with-change blockShip new or changed behaviour in the same change as a test that fails if the behaviour breaks; a code-only change needs a stated reason.
- chg-verify-before-claim blockBack every "works" or "bug" claim with something run: a repro, a test or command output.
What the badges mean
- blockmust be fixed before merge or release.
- should-fixfix it, but it need not block.
- discussraise it and decide together.
- stablevetted; use for verdicts.
- draftnot vetted; do not use for a verdict.
- Tool gate: what a linter or CI check could enforce instead of a reviewer.
Filters
Concerns
Levels
Topic tags
Topics
Draft cards
136 draft cards
A draft card is not vetted. Read it for ideas, but do not use it for a verdict. Each row links to the full card.
- code-a11y-check-in-ci should-fixRun an automated accessibility check, such as axe on rendered pages, in the automated tests, and fail the test on a violation.
- code-ai-pr-disclosure should-fixDisclose AI assistance in the PR, and have a human author who can explain and defend every changed line without the tool.
- code-documented-setup-runs should-fixMake every setup, build and run command in the README or contribution guide succeed on a clean checkout.
- code-file-lines-ceiling discussKeep every hand-written source file under about 1,000 lines unless it has a listed exception, and split larger files by knowledge owned, not by execution order.
- code-flaky-test-quarantine should-fixReport every test that passes only on retry, move it to a quarantine with a named owner and a ticket, and return it to the merge gate only after it passes many reruns.
- code-scoped-validation-loop discussDocument a command that checks one package or path, with readable output, so a small change does not need the full-repo run.
- fn-atomic-related-updates blockMake related writes succeed or fail together: one transaction, or an ordered sequence with a defined undo.
- fn-bool-arg-at-callsite discussReplace a boolean flag argument with an enum, keyword-only argument or two functions.
- fn-comments-survive-context should-fixWrite comments that remain true without outside context: no "see the PR", "currently", "not yet", ticket ids or codenames.
- fn-distinct-types-for-ids should-fixGive arguments with different meanings distinct types, so a call that swaps them fails to type-check.
- fn-empty-collection-not-none should-fixReturn an empty collection for "nothing found"; return
Noneonly when absent differs from empty. - fn-english-identifiers discussWrite identifiers and comments in English, unless the project policy names another language.
- fn-known-keys-get-a-type should-fixGive a fixed key set a record type (model, dataclass, or typed dict), and use a generic map only for open keys.
- fn-name-intermediate-conditions discussName each compound condition by assigning its sub-conditions to booleans that say what they mean.
- fn-no-anonymous-tuples should-fixReturn a small named record, not a positional tuple, once the fields differ in meaning.
- fn-no-check-then-act-across-await blockMake check-and-write one atomic operation where the state lives, and never split it across a suspension point.
- fn-no-eval-untrusted blockNever pass untrusted text to
eval,exec,new Function, an expression language, or a template compiler. Pass it to a fixed template or a parser as data. - fn-no-getattr-for-known-names discussUse plain field access, and reserve dynamic access for genuinely dynamic names.
- fn-no-magic-values should-fixGive every meaningful literal a name: an enum member or a constant.
- fn-no-pass-through-wrapper should-fixDelete a method that only forwards, and keep wrappers that validate, adapt, or narrow.
- fn-no-prototype-pollution blockNever write an untrusted key into a plain object. Use a
Map, an object fromObject.create(null), or an allowlist of keys, and block__proto__,constructor, andprototypein any deep merge. - fn-no-stringly-typed-returns should-fixReturn an enum or a tagged type, never a bare string that the caller must compare.
- fn-propagate-dont-swallow blockChain the original cause when you translate an exception.
- fn-redirect-target-allowlist should-fixRedirect only to a local path or to a host on a server-side allowlist, never to a URL taken from the request as is.
- fn-resource-lifetime blockGive every task and handle an owner that waits for it or closes it, on the error path too.
- fn-specific-exceptions-only blockCatch only the specific exception you can handle in business code.
- fn-test-oracle-independent should-fixTake a test's expected value from the requirement, not from the code under test, and pair every "not called" assertion with a case where the call happens.
- fn-variants-as-tagged-union should-fixModel variants as a tagged union, and make every switch over it fail the build when a variant is unhandled.
- fn-xml-no-external-entities blockParse untrusted XML with DTDs, external entities, and network access turned off, or with a hardened wrapper such as
defusedxml. - inc-perf-regression-guard should-fixAdd an automated check that would have caught the regression (a benchmark, a budget, a load-test threshold, or a resource guard) as one of the postmortem's actions.
- inc-postmortem-owned-actions should-fixGive every postmortem action one named owner, a due date, and a tracker link.
- mod-behaviour-lives-with-state discussPut invariants and calculations over one object on that object, and move logic to a service only when it spans objects or needs an injected collaborator.
- mod-central-config should-fixRead configuration in one settings module and pass it in; business code must not read the environment or hold knobs.
- mod-cohesive-unit discussKeep one cohesive concept per module.
- mod-deep-modules discussPrefer a small interface that hides real work, and flag modules whose interface is nearly as complex as their implementation.
- mod-fowler-smells discussName the smell, point to the line, and suggest the refactoring; do not file smells as taste.
- mod-inject-boundary-collaborators should-fixInject boundary collaborators through the constructor; do not construct them inside or reach for a global.
- mod-internals-unreachable should-fixMake a module's internals unimportable from outside it, and have a check fail the build when a caller reaches in.
- mod-layers-point-inward should-fixMake dependencies point inward: surface, then logic, then boundary.
- mod-mock-at-boundaries-only should-fixMock only at the process boundary (HTTP, DB, cloud, clock, I/O).
- mod-no-import-side-effects blockKeep I/O at the edges: importing a package must not touch the network, read files, or read the environment.
- mod-no-logic-in-constructors should-fixAssign only in constructors, and put I/O, parsing, and heavy computation in a named factory.
- mod-no-module-mutable-state should-fixKeep no mutable state at module level.
- mod-no-utils-grab-bag should-fixPut a helper in the module that owns the concept, or in a new module named after the concept.
- mod-no-wire-types-in-public-api should-fixExpose domain types in a module's public interface, and keep transport, storage and framework types behind it.
- mod-no-wrong-abstraction should-fixInline an abstraction that has grown flags for its callers, then re-split it.
- mod-one-name-per-concept should-fixUse one name for one concept across the codebase.
- mod-prefer-sync-api discussKeep logic in plain synchronous functions with no I/O, and add async wrappers at the edge only.
- mod-proto-enum-zero-unspecified should-fixGive every protobuf enum a zero value named
<ENUM>_UNSPECIFIEDwith no real meaning. - mod-subtype-passes-parent-tests should-fixMake a subtype pass its parent's tests: accept every input the parent accepts, promise at least what it promises, and keep its invariants.
- mod-thin-entry-point should-fixKeep the entry module to wiring (bootstrap, configuration, lifespan) and put no business logic in it.
- mod-validate-at-boundary-once should-fixValidate at the boundary, once, with a schema or model, so that inner layers receive typed, already-valid data.
- prod-a11y-audit-before-launch should-fixBefore a public launch, run an accessibility audit against WCAG 2.2 AA that includes assistive technology, and link the report in the launch checklist.
- prod-shadow-compare-before-cutover should-fixBefore you move traffic to a new system, run it beside the old one on live or captured production traffic, diff the results, and cut over only when every mismatch is fixed or explained.
- prod-slo-error-budget discussDefine an SLO with an indicator and window, and use its remaining error budget to gate risky releases.
- prod-wide-events-bounded-labels should-fixEmit one structured event per request carrying trace, tenant, build and flag state.
- svc-api-cache-control should-fixSet an explicit
Cache-Controlon every response a cache may store, useprivateorno-storefor user-specific data, and addVaryfor any request header that changes the body. - svc-api-contract-tests should-fixRun a contract test for each cross-service call, derived from the consumer's real requests, and fail the provider's build when it breaks one.
- svc-api-documented-errors should-fixDocument every error status each operation can return, with a schema and one example.
- svc-api-naming-consistent discussUse one casing convention per location (fields, query parameters, headers, paths) across the whole API, and state it in the API guide.
- svc-api-problem-json should-fixReturn errors as
application/problem+jsonwith astatusthat equals the HTTP status, and leave stack traces and internal detail out. - svc-api-retry-after should-fixSend
Retry-Afteron every 429 and 503, and set it no earlier than the time capacity returns. - svc-api-safe-idempotent-methods blockKeep GET, HEAD and OPTIONS free of side effects, and make PUT and DELETE give the same end state when repeated.
- svc-api-spec-matches-impl should-fixKeep the OpenAPI document as the source of truth, and generate it from the code or test the running service against it in CI.
- svc-api-specific-status-codes should-fixReturn the most specific status code that fits: 201 with
Locationfor a create, 405 withAllowfor a wrong method, and a 4xx or 5xx for any failure. - svc-api-trace-context should-fixForward
traceparentandtracestateon every outgoing call, keep the incoming trace id, and set a new parent id for each hop. - svc-async-content-reserves-space should-fixReserve the space for late-loading content with set dimensions or an aspect ratio, so nothing already on screen moves.
- svc-authn-by-default blockRequire authentication on every route by default, and mark each public route by name.
- svc-best-effort-optional-deps should-fixGive each call to a non-critical dependency a short budget and a default, so its failure degrades the result instead of failing the critical path, and count every fallback.
- svc-circuit-breaker-bulkhead should-fixGive each critical dependency its own concurrency limit.
- svc-cli-destructive-dry-run should-fixGive a destructive command a preview flag that changes nothing and a flag that skips the confirmation prompt.
- svc-cli-non-interactive should-fixGive every input a flag, use a prompt only as a fallback, and exit at once with an example call when a required flag is missing.
- svc-csp-strict-script-src should-fixSend a
Content-Security-Policywhosescript-srcuses a per-response nonce or script hashes, withobject-src 'none'andbase-uri 'none'. - svc-dlq should-fixGive every consumer queue a dead-letter queue and a way to replay its messages after the fix.
- svc-no-secrets-in-url should-fixSend tokens, keys, passwords, and personal data in a header or the request body, never in the path or query string.
- svc-page-title-per-route should-fixGive every page and every client-side view its own
<title>that says what it is. - svc-rate-limit-by-cost should-fixWhen request costs differ by orders of magnitude, charge each request its estimated cost against the quota instead of counting it as one.
- svc-request-id-logging should-fixPut the request or trace id on every log line written during a request.
- svc-saga-steps blockMake steps after the pivot idempotent and retryable, and make every compensation idempotent with a failure path.
- svc-security-event-logging should-fixLog every failed authentication with the account name and a timestamp.
- svc-security-headers should-fixSend
Strict-Transport-Securityon every HTTPS response. - svc-stream-dont-materialise should-fixProcess large results as a stream with backpressure; do not load them whole into memory.
- svc-tls-modern-only should-fixAccept only TLS 1.2 and TLS 1.3 on servers, and set that minimum in the config instead of relying on the default.
- sys-cache-cold-start should-fixCap and coalesce the cache-miss path so an empty cache cannot overwhelm the origin.
- sys-cells-limit-blast-radius discussSplit shared infrastructure into independent cells, each with its own control plane and storage, and route each tenant or request to one cell, so one failure stops only that cell.
- sys-constraint-not-valid blockAdd the constraint
NOT VALID, then runVALIDATE CONSTRAINTin a separate step, and never leave the VALIDATE out. - sys-health-liveness-readiness blockWire load balancers and restarters to liveness and local checks only, never to shared-dependency checks.
- sys-index-concurrently blockCreate indexes with
CONCURRENTLY, outside a transaction block, and handle a failed build that leaves an INVALID index. - sys-leader-two-leaders should-fixMake leader work safe if two leaders overlap: make it idempotent, check the lease before acting, and stop when renewal fails.
- sys-migration-lock-timeout blockSet
lock_timeoutfor the migration session and retry on timeout. - chg-agent-grounded-code blockVerify that every import and external call the agent wrote exists with that signature.
- chg-agent-independent-review should-fixGet sign-off from a person or a fresh-context reviewer who has the spec but not the author's reasoning; self-review by the writing session does not count.
- chg-agent-mock-asserting-tests blockWrite tests that fail when the behaviour breaks, and reject tests that mostly assert on mocks, copy the implementation, or were edited to match new output without explanation.
- chg-api-spec-in-same-change should-fixUpdate the API spec in the same change that alters the routes, fields, status codes or headers it describes.
- chg-approval-tied-to-patch should-fixTreat an approval or verification verdict as current only if no push since then changed non-test content, and compare patch ids after a rebase.
- chg-chestertons-fence should-fixAdd a characterization test before rewriting code you do not understand.
- chg-delete-legacy-after-migration should-fixWhen no consumer sits outside the repo, move every caller to the new API and delete the old one, and the tests that pinned its internals, in the same change.
- chg-devex-breaking-config should-fixWhen a change breaks how developers or operators run the project, ship a migration note with it: old name, new name, and what to do.
- chg-fix-root-cause-not-symptom blockIn a bug fix, state the cause you saw in evidence, and reject a guard, retry, sleep, longer timeout, swallowed error, cast, skipped or weakened test, or special case for the failing input that the cause does not justify.
- chg-flag-owner-retirement should-fixGive every new flag an owner, a default, and a removal condition or date, and ticket the removal.
- chg-matches-spec blockTrace every behaviour change in the diff to the stated requirement, and flag missing requirements and any change nobody asked for.
- chg-migration-add-column-rewrite blockAdd the column nullable or with a constant default, then fill volatile, computed, or identity values in batches.
- chg-name-attack-surface blockList any new attack surface in the description.
- chg-new-api-has-usage should-fixShip new API with at least one real caller in the same change, and fail speculative interfaces and options that nothing uses.
- chg-new-query-has-plan should-fixAttach the query plan for each new or rewritten query on a growing table, taken on production-sized data.
- chg-no-silenced-diagnostics should-fixName the rule, the reason, and a ticket on every suppression; a swallowed error, skipped test, or disabled check is a FAIL unless justified.
- chg-no-special-case-branches should-fixPut a new case behind its own function or type; do not add a one-off branch to a shared flow.
- chg-proto-no-field-type-change blockNever change the type of a protobuf field, switch it between repeated and scalar, or rename it while any consumer reads JSON or text format; add a new field instead.
- chg-proto-reserve-removed-fields blockWhen you delete a protobuf field or enum value, add
reservedfor its number and name in the same change, and never reuse a number. - chg-reuse-before-write should-fixSearch the repo for an existing helper before adding a new one.
- chg-review-comment-format discussLabel each review comment with its severity: block, should-fix, or discuss.
- chg-rollback-path blockState in the description how to undo the change.
- chg-ui-change-screenshots-and-keyboard-pass should-fixA UI change shows before-and-after screenshots and says what a keyboard-only pass and a 200% zoom check found on the changed screens.
- py-await-check-then-act blockWhen more than one worker or process can run, make check-then-act an atomic DB statement or constraint, because a Python lock covers one process only.
- py-cancellation blockRe-raise
CancelledError(do not catch it via bareexceptorBaseException), and catchTimeoutErroroutside theasyncio.timeout()block. - py-class-earns-its-instance discussGive a class real state or a collaborator; otherwise write a module function.
- py-docstrings-google discussWrite a Google-style docstring only when it adds what the signature cannot say.
- py-error-hierarchy should-fixGive each package one base exception, with the specific ones in an
errorsmodule. - py-field-only-when-adds discussUse
Field()only when it adds something (a constraint, an alias, or API docs), and set plain defaults directly. - py-frozen-dataclass-over-tuple should-fixReturn a
@dataclass(frozen=True, slots=True)instead of a positional tuple. - py-httpx-client-lifespan should-fixPass an explicit
httpx.Timeoutto everyhttpxclient. - py-imports should-fixPut imports at module top, absolute only.
- py-init-assign-only should-fixKeep
__init__and__post_init__to assignments, and do I/O in a@classmethodfactory. - py-init-py-empty should-fixKeep
__init__.pyempty unless it re-exports the public API. - py-modern-typing should-fixWrite
X | Noneand builtin generics, nottypingaliases. - py-no-cast should-fixDo not use
cast(); parse the boundary into a typed model, or narrow withisinstance. - py-no-init-or-model-tests should-fixCover
__init__and plain models through the behaviour that uses them. - py-no-silenced-diagnostics should-fixSuppress a Python diagnostic only with a single named code and a reason on the same line.
- py-paths-from-file should-fixResolve paths from
__file__, not the current working directory. - py-pydantic-validation should-fixValidate request data with a pydantic model, not hand-written checks.
- py-pytest-parametrize should-fixUse
@pytest.mark.parametrizefor test variations. - py-ruff-gate should-fixEnable the Ruff rule sets E, F, I, B, UP, SIM, BLE, TID and D in CI.
- py-settings-pydantic-settings should-fixLoad env config with
BaseSettingsfrompydantic_settings. - py-strenum-not-strings should-fixUse
StrEnumfor fixed string sets andHTTPStatusfor HTTP codes. - py-task-reference blockNever discard the result of
create_task; keep a reference and surface its exceptions, preferably through aTaskGroup. - py-test-hygiene discussFreeze time and block network in tests.