agent-deck contributor
This skill is the contributor-side mirror of agent-deck's PR gate. The repo's intake
check (.github/workflows/pr-intake.yml), its field contract (.github/INTAKE.md),
and the maintainer's four-lens review machine are one spec read from the receiving
side; this skill is the same spec read from the sending side. An agent that follows
it passes intake on the first try and scores well on all four review lenses:
correctness, security, fit, and intent.
One principle before anything else: every field the gate requires is trivial for a
legitimate human+agent pair and impossible for intent-less slop. The one thing that
cannot be faked is a real human's ask. So the very first thing you capture, before
any code, is what your human actually asked for, in their words. Keep the quote.
It goes in the PR body verbatim.
Script path resolution
This skill ships scripts/self-check.sh. Resolve it from the skill's own base
directory (shown when the skill loads), not the project root:
SKILL_DIR="/path/shown/in/base-directory-line" # e.g. <repo>/.github/skills/agent-deck-contributor
"$SKILL_DIR/scripts/self-check.sh" pr-body.md
When working inside an agent-deck clone the path is
.github/skills/agent-deck-contributor/scripts/self-check.sh.
Phase 1 — Claim and understand the issue
- Capture the human ask first. Write down, verbatim, what your human asked for
(one sentence is enough). If you are working from an issue with no direct human
instruction, quote the issue author's problem statement instead. This becomes the
## What actually bothered you section. Intake fails a PR whose intent section is
empty; it never fails an honest one-liner.
- Reproduce before you touch code. For bugs: build agent-deck, reproduce the
reported behavior, and save the capture (terminal output, log lines). The review
machine's intent lens asks "did the submitter supply real observed behavior, not
just claims?" — your reproduction is that evidence. If you cannot reproduce
reliably, say so honestly: "can't reproduce reliably, happens when ..." passes;
silence does not.
- Comment on the issue to claim it before starting, so the maintainer's fleet
can tell you if someone (human or agent) is already on it.
- Check scope before committing effort:
- Features go to a Discussion first; feature PRs that arrive as surprises take
longer, not shorter.
- agent-deck holds a lean-scope line: no net-new tool adapters or bolt-on UIs
without demonstrated demand. If your idea adds a new integration surface, open
a Discussion and get a yes before writing it.
- Anticipated diff over ~3000 added lines? Link an issue or Discussion agreeing
the shape first, or the gate flags it
needs-discussion.
- You may have at most 5 open PRs on the repo at a time.
- Security issues go through the private advisory route in
SECURITY.md, never
a public issue or PR.
Phase 2 — Implement to the bar
One problem per PR, scoped diff. No unrelated churn, no drive-by refactors,
no formatting sweeps of untouched files. The fit lens flags diffs over ~400
changed lines as oversized; if your change is genuinely bigger, say in the PR
body what could split out and why it didn't.
Match the codebase style. Read the surrounding package before writing. Go
code: standard library first, existing helpers over new ones, table-driven tests
like the neighbors have.
Write a test that FAILS without your change. This is the centerpiece of the
correctness lens: the reviewer reverts your non-test hunks and re-runs your
tests — a test that still passes proves nothing. Write the test first, watch it
fail, then make it pass. scripts/self-check.sh automates this revert-check
locally.
Every changed hunk should be exercised by some test. The correctness lens
spot-checks changed-lines coverage and names untested hunks as flags.
Run the exact CI sandbox invocation. agent-deck tests must never run against
a real home directory (they can destroy live user data), and CI runs them
sandboxed. Use precisely:
HOME=$(mktemp -d) XDG_CONFIG_HOME= XDG_DATA_HOME= XDG_CACHE_HOME= go test ./...
Format and vet before every push:
gofmt -w $(git diff --name-only origin/main -- '*.go')
go vet ./...
Lint CI treats formatting as a failure; the 2-second local pass saves a CI
round-trip.
Never touch CHANGELOG.md — entries are added at landing time.
Hot paths need timing evidence. If you touch list, status,
session output, startup, or the tmux layer, include simple before/after timing
(even time agent-deck list runs) in the Evidence section.
Avoid the tripwires (details in references/security-self-scan.md):
- New or bumped dependencies from a community PR are an automatic
extra-scrutiny stop. If the fix truly needs a new module, justify it in the PR
body (why this module, why it's canonical, where it's used) and expect a
human gate. Never add a
replace directive or a GOPROXY override.
- Anything under
.github/ never auto-merges; it always waits for the
maintainer personally. Keep workflow changes out of unrelated PRs.
- No
curl | bash, no downloaded-and-executed tooling, no new outbound network
calls in production paths, no exec of shell-interpolated strings, no
world-writable file modes, no InsecureSkipVerify.
Phase 3 — Self-verify against the gate BEFORE opening
Draft your PR body into a file (start from references/pr-body-template.md), then
run the pre-open gate from the repo root:
.github/skills/agent-deck-contributor/scripts/self-check.sh pr-body.md
It mirrors, check for check, what the repo-side gate and review machine will do:
gofmt/vet/build, sandboxed tests, the revert-check, diff-size and forbidden-path
checks, the hidden-logic security sweep, and a lint of the PR body against the
intake contract (required headings, exactly one AI-disclosure box, model named when
AI helped, non-empty human intent, consistent gate marker).
Fix every FAIL before opening. WARNs are judgment calls: resolve them or
explain them in the PR body (a stated, honest imperfection passes review; a silent
one becomes a flag). The full check-by-check mapping, with the exact fix for each,
is in references/gate-spec.md.
Phase 4 — Open the PR
Use .github/PULL_REQUEST_TEMPLATE.md verbatim — the intake Action parses the
body by exact ## headings. Fill every required section:
What problem does this solve?, Why this change, User impact, Evidence,
AI disclosure, What actually bothered you, Checklist.
AI disclosure: check exactly one box, and if AI helped, name the model(s)
(e.g. claude-opus-4-x, gpt-5-codex). unsure is a valid answer; blank is
not. Disclosure is a quality signal that feeds a per-model track record — models
that land clean earn lighter-touch review over time. It is never a filter.
What actually bothered you: paste the human ask you captured in Phase 1,
quoted. This is the first thing a reviewer reads.
Evidence, inline: your reproduction capture, before/after behavior, the
sandboxed test-suite result, and the revert-check result ("reverting the fix
makes TestX fail: "). Real observed output, not claims;
mock-only proof is insufficient for user-visible changes.
End the body with the machine-readable marker (last line, exact format):
<!-- gate:ai=<human|assisted|authored> model=<name-or-unsure> intent=<yes|no> -->
The visible sections are authoritative; the marker is a parse-stable
confirmation that speeds routing. Make it agree with the checkboxes.
Check only the checklist boxes that are true. Leave "Allow edits from
maintainers" enabled so urgent fixes can be taken over the line for you.
Do not mark anything CRITICAL/URGENT/SECURITY unless the body carries a
concrete reproduction — urgency language plus scanner-style output with no repro
is a named slop signal and gets deprioritized.
Phase 5 — Respond to verdicts
Within about a day the PR gets a structured validation result. The loop from here:
- Intake comment (
needs-info): the bot names the exact missing field in
machine-readable form. Edit the PR description — the check re-runs automatically
and the label flips. No new commit needed for body-only fixes.
- Rank-up moves are the whole loop. A
needs-work verdict arrives with 1–3
concrete actions that upgrade the verdict. Do exactly those, nothing else, then
say so in a comment. needs-work is a loop with a re-review trigger, not a
rejection.
- Verdicts are SHA-bound. Every review verdict applies to one exact head SHA.
Any push voids it and triggers re-review — so batch your fixes into one push
rather than trickling commits, and never force-push over a reviewed SHA without
saying what changed.
- Answer questions about the code. Disclosed AI PRs are welcome on three
conditions, and the third is that you (or your human) can defend the change when
asked. The intent lens explicitly scores author understanding.
- If the gate misfires on your good-faith PR, say so plainly in a comment and
point at the evidence — the maintainer overrides bot mistakes by hand (there is
a
bad-gate label for exactly this) and the heuristic gets tuned. The gate is
deliberately biased toward false-clean, so a wrong flag is rare and taken
seriously.
- Silence is the only thing that auto-closes. Any reply from you resets the
clock. If life intervenes, one comment keeps the PR open; a closed PR can be
reopened the moment you can add the missing piece.
- If your diff is declined but the problem is real, the fleet may reimplement
the intent with credit to you. A rejected diff is never a rejected idea — a
well-evidenced problem statement is the most valuable thing you can leave
behind.
Hard rules (never do)
- Never open a PR with an empty or boilerplate
What actually bothered you
section. One real, quoted human sentence.
- Never claim AI-free authorship when a model wrote the code. Undisclosed
bulk-generated PRs get closed; disclosed AI PRs get equal standing.
- Never run agent-deck tests against a real
$HOME — always the sandbox
invocation above.
- Never edit
CHANGELOG.md; never fold .github/ changes into an unrelated PR.
- Never add or bump a dependency without stating why in the PR body; never add
replace directives or proxy overrides.
- Never introduce
curl | bash, exec-of-constructed-strings, new outbound network
calls in production paths, world-writable modes, weak crypto, or non-ASCII
homoglyph/invisible characters in code.
- Never use urgency language (
CRITICAL/SECURITY) without a concrete repro;
real vulnerabilities go through SECURITY.md privately.
- Never exceed 5 open PRs; never open a >3000-added-line PR without a linked
issue or Discussion.
- Never check a checklist box that is not true.
- Never expect a bot to merge: merges are always human, and a green gate is
necessary but never sufficient.
Traceability matrix
Every rule above traces to a named check on the maintainer's side. If the gate
changes, this skill changes with it — they are one spec.
| Skill rule |
Gate-side source |
Required ## headings, filled |
pr-intake.yml check 1 (missing-headings) / INTAKE.md §PR body contract |
| Exactly one AI-disclosure box |
pr-intake.yml check 2 (checked-boxes == 1) |
| Non-empty human intent, quote the ask |
pr-intake.yml check 3 (meaningful intent) / gate design: human-provenance is the anti-slop asymmetry |
Model named when AI helped; unsure valid |
INTAKE.md marker contract; review-machine model provenance ledger (per-model track record) |
| Gate marker as last line, consistent |
INTAKE.md §Machine-readable marker; pr-intake.yml marker parse |
| Test fails without the change (revert-check) |
review machine, correctness lens: revert-check centerpiece |
| Changed hunks exercised by tests |
review machine, correctness lens: diff-coverage spot-check |
| Exact sandbox test invocation |
CONTRIBUTING §What makes a PR land fast; security gates: sandbox-everything rule (Gate 6) |
| gofmt + go vet before push |
maintainer shipping rule (lint CI fails on formatting) |
| Scoped diff; ~400-line oversize flag |
review machine, fit lens: oversized-pr flag |
| >3000 added lines needs linked discussion |
intake gate: giant-undiscussed-diff check; INTAKE.md house rules |
| Lean-scope check before new adapters/UIs |
review machine, fit lens: lean-scope line |
| Real repro/evidence, mock-only insufficient |
review machine, intent lens: behavior-evidence test; INTAKE.md Evidence row |
| No urgency language without repro |
intake gate: urgency-scanner-slop check |
| Dependency changes justified; no replace/GOPROXY |
security gates, Gate 1 (dependency vet) + Gate 6 red flags |
.github/ changes always human-gated |
security gates, Gate 2 |
| Hidden-logic self-scan (network/exec/homoglyph/perms/time-bomb/crypto) |
security gates, Gate 3 sweep + Gate 6 red flags (author-side version: references/security-self-scan.md) |
| No CHANGELOG edits; ≤5 open PRs |
INTAKE.md house rules; CONTRIBUTING house rules |
| Hot-path timing evidence |
PR template checklist (hot-path row); CONTRIBUTING rule 6 |
| SHA-bound verdicts; push = re-review |
review machine: SHA binding invariant |
| Rank-up loop on needs-work |
review machine: rank-up doctrine (needs-work is a loop, not a wall) |
| Misfire → say so, human overrides |
gate design: bad-gate override; false-clean bias |
| Silence-only close; reply resets clock |
gate design: reaction ladder |
| Merges always human |
branch protection + CODEOWNERS; every gate necessary-not-sufficient |
References
references/gate-spec.md — every intake check and review criterion, with the
exact fix for each; the machine-readable companion to .github/INTAKE.md.
references/pr-body-template.md — one complete example of a passing PR body,
including the gate marker block.
references/security-self-scan.md — the security sweeps rewritten as
author-side greps you run on your own diff.
- Repo-side:
.github/INTAKE.md (field contract), CONTRIBUTING.md (policy),
.github/PULL_REQUEST_TEMPLATE.md (the body you fill).
1---2name: agent-deck-contributor3description: agent-deck contributor4---56# agent-deck contributor78This skill is the contributor-side mirror of agent-deck's PR gate. The repo's intake9check (`.github/workflows/pr-intake.yml`), its field contract (`.github/INTAKE.md`),10and the maintainer's four-lens review machine are one spec read from the receiving11side; this skill is the same spec read from the sending side. An agent that follows12it passes intake on the first try and scores well on all four review lenses:13**correctness, security, fit, and intent**.1415One principle before anything else: every field the gate requires is trivial for a16legitimate human+agent pair and impossible for intent-less slop. The one thing that17cannot be faked is a real human's ask. So the very first thing you capture, before18any code, is **what your human actually asked for, in their words**. Keep the quote.19It goes in the PR body verbatim.2021## Script path resolution2223This skill ships `scripts/self-check.sh`. Resolve it from the skill's own base24directory (shown when the skill loads), not the project root:2526```bash27SKILL_DIR="/path/shown/in/base-directory-line" # e.g. <repo>/.github/skills/agent-deck-contributor28"$SKILL_DIR/scripts/self-check.sh" pr-body.md29```3031When working inside an agent-deck clone the path is32`.github/skills/agent-deck-contributor/scripts/self-check.sh`.3334## Phase 1 — Claim and understand the issue35361. **Capture the human ask first.** Write down, verbatim, what your human asked for37 (one sentence is enough). If you are working from an issue with no direct human38 instruction, quote the issue author's problem statement instead. This becomes the39 `## What actually bothered you` section. Intake fails a PR whose intent section is40 empty; it never fails an honest one-liner.412. **Reproduce before you touch code.** For bugs: build agent-deck, reproduce the42 reported behavior, and save the capture (terminal output, log lines). The review43 machine's intent lens asks "did the submitter supply real observed behavior, not44 just claims?" — your reproduction is that evidence. If you cannot reproduce45 reliably, say so honestly: "can't reproduce reliably, happens when ..." passes;46 silence does not.473. **Comment on the issue to claim it** before starting, so the maintainer's fleet48 can tell you if someone (human or agent) is already on it.494. **Check scope before committing effort:**50 - Features go to a Discussion first; feature PRs that arrive as surprises take51 longer, not shorter.52 - agent-deck holds a lean-scope line: no net-new tool adapters or bolt-on UIs53 without demonstrated demand. If your idea adds a new integration surface, open54 a Discussion and get a yes before writing it.55 - Anticipated diff over ~3000 added lines? Link an issue or Discussion agreeing56 the shape first, or the gate flags it `needs-discussion`.57 - You may have at most 5 open PRs on the repo at a time.58 - Security issues go through the private advisory route in `SECURITY.md`, never59 a public issue or PR.6061## Phase 2 — Implement to the bar62631. **One problem per PR, scoped diff.** No unrelated churn, no drive-by refactors,64 no formatting sweeps of untouched files. The fit lens flags diffs over ~40065 changed lines as oversized; if your change is genuinely bigger, say in the PR66 body what could split out and why it didn't.672. **Match the codebase style.** Read the surrounding package before writing. Go68 code: standard library first, existing helpers over new ones, table-driven tests69 like the neighbors have.703. **Write a test that FAILS without your change.** This is the centerpiece of the71 correctness lens: the reviewer reverts your non-test hunks and re-runs your72 tests — a test that still passes proves nothing. Write the test first, watch it73 fail, then make it pass. `scripts/self-check.sh` automates this revert-check74 locally.754. **Every changed hunk should be exercised by some test.** The correctness lens76 spot-checks changed-lines coverage and names untested hunks as flags.775. **Run the exact CI sandbox invocation.** agent-deck tests must never run against78 a real home directory (they can destroy live user data), and CI runs them79 sandboxed. Use precisely:8081 ```bash82 HOME=$(mktemp -d) XDG_CONFIG_HOME= XDG_DATA_HOME= XDG_CACHE_HOME= go test ./...83 ```84856. **Format and vet before every push:**8687 ```bash88 gofmt -w $(git diff --name-only origin/main -- '*.go')89 go vet ./...90 ```9192 Lint CI treats formatting as a failure; the 2-second local pass saves a CI93 round-trip.947. **Never touch `CHANGELOG.md`** — entries are added at landing time.958. **Hot paths need timing evidence.** If you touch `list`, `status`,96 `session output`, startup, or the tmux layer, include simple before/after timing97 (even `time agent-deck list` runs) in the Evidence section.989. **Avoid the tripwires** (details in `references/security-self-scan.md`):99 - New or bumped dependencies from a community PR are an automatic100 extra-scrutiny stop. If the fix truly needs a new module, justify it in the PR101 body (why this module, why it's canonical, where it's used) and expect a102 human gate. Never add a `replace` directive or a `GOPROXY` override.103 - Anything under `.github/` never auto-merges; it always waits for the104 maintainer personally. Keep workflow changes out of unrelated PRs.105 - No `curl | bash`, no downloaded-and-executed tooling, no new outbound network106 calls in production paths, no exec of shell-interpolated strings, no107 world-writable file modes, no `InsecureSkipVerify`.108109## Phase 3 — Self-verify against the gate BEFORE opening110111Draft your PR body into a file (start from `references/pr-body-template.md`), then112run the pre-open gate from the repo root:113114```bash115.github/skills/agent-deck-contributor/scripts/self-check.sh pr-body.md116```117118It mirrors, check for check, what the repo-side gate and review machine will do:119gofmt/vet/build, sandboxed tests, the revert-check, diff-size and forbidden-path120checks, the hidden-logic security sweep, and a lint of the PR body against the121intake contract (required headings, exactly one AI-disclosure box, model named when122AI helped, non-empty human intent, consistent gate marker).123124**Fix every FAIL before opening.** WARNs are judgment calls: resolve them or125explain them in the PR body (a stated, honest imperfection passes review; a silent126one becomes a flag). The full check-by-check mapping, with the exact fix for each,127is in `references/gate-spec.md`.128129## Phase 4 — Open the PR1301311. Use `.github/PULL_REQUEST_TEMPLATE.md` verbatim — the intake Action parses the132 body by exact `## ` headings. Fill every required section:133 `What problem does this solve?`, `Why this change`, `User impact`, `Evidence`,134 `AI disclosure`, `What actually bothered you`, `Checklist`.1352. **AI disclosure:** check exactly one box, and if AI helped, name the model(s)136 (e.g. `claude-opus-4-x`, `gpt-5-codex`). `unsure` is a valid answer; blank is137 not. Disclosure is a quality signal that feeds a per-model track record — models138 that land clean earn lighter-touch review over time. It is never a filter.1393. **What actually bothered you:** paste the human ask you captured in Phase 1,140 quoted. This is the first thing a reviewer reads.1414. **Evidence, inline:** your reproduction capture, before/after behavior, the142 sandboxed test-suite result, and the revert-check result ("reverting the fix143 makes TestX fail: <one line of output>"). Real observed output, not claims;144 mock-only proof is insufficient for user-visible changes.1455. **End the body with the machine-readable marker** (last line, exact format):146147 ```148 <!-- gate:ai=<human|assisted|authored> model=<name-or-unsure> intent=<yes|no> -->149 ```150151 The visible sections are authoritative; the marker is a parse-stable152 confirmation that speeds routing. Make it agree with the checkboxes.1536. Check only the checklist boxes that are true. Leave "Allow edits from154 maintainers" enabled so urgent fixes can be taken over the line for you.1557. Do not mark anything `CRITICAL`/`URGENT`/`SECURITY` unless the body carries a156 concrete reproduction — urgency language plus scanner-style output with no repro157 is a named slop signal and gets deprioritized.158159## Phase 5 — Respond to verdicts160161Within about a day the PR gets a structured validation result. The loop from here:1621631. **Intake comment (`needs-info`):** the bot names the exact missing field in164 machine-readable form. Edit the PR description — the check re-runs automatically165 and the label flips. No new commit needed for body-only fixes.1662. **Rank-up moves are the whole loop.** A `needs-work` verdict arrives with 1–3167 concrete actions that upgrade the verdict. Do exactly those, nothing else, then168 say so in a comment. needs-work is a loop with a re-review trigger, not a169 rejection.1703. **Verdicts are SHA-bound.** Every review verdict applies to one exact head SHA.171 Any push voids it and triggers re-review — so batch your fixes into one push172 rather than trickling commits, and never force-push over a reviewed SHA without173 saying what changed.1744. **Answer questions about the code.** Disclosed AI PRs are welcome on three175 conditions, and the third is that you (or your human) can defend the change when176 asked. The intent lens explicitly scores author understanding.1775. **If the gate misfires on your good-faith PR**, say so plainly in a comment and178 point at the evidence — the maintainer overrides bot mistakes by hand (there is179 a `bad-gate` label for exactly this) and the heuristic gets tuned. The gate is180 deliberately biased toward false-clean, so a wrong flag is rare and taken181 seriously.1826. **Silence is the only thing that auto-closes.** Any reply from you resets the183 clock. If life intervenes, one comment keeps the PR open; a closed PR can be184 reopened the moment you can add the missing piece.1857. **If your diff is declined but the problem is real**, the fleet may reimplement186 the intent with credit to you. A rejected diff is never a rejected idea — a187 well-evidenced problem statement is the most valuable thing you can leave188 behind.189190## Hard rules (never do)191192- Never open a PR with an empty or boilerplate `What actually bothered you`193 section. One real, quoted human sentence.194- Never claim AI-free authorship when a model wrote the code. Undisclosed195 bulk-generated PRs get closed; disclosed AI PRs get equal standing.196- Never run agent-deck tests against a real `$HOME` — always the sandbox197 invocation above.198- Never edit `CHANGELOG.md`; never fold `.github/` changes into an unrelated PR.199- Never add or bump a dependency without stating why in the PR body; never add200 `replace` directives or proxy overrides.201- Never introduce `curl | bash`, exec-of-constructed-strings, new outbound network202 calls in production paths, world-writable modes, weak crypto, or non-ASCII203 homoglyph/invisible characters in code.204- Never use urgency language (`CRITICAL`/`SECURITY`) without a concrete repro;205 real vulnerabilities go through `SECURITY.md` privately.206- Never exceed 5 open PRs; never open a >3000-added-line PR without a linked207 issue or Discussion.208- Never check a checklist box that is not true.209- Never expect a bot to merge: merges are always human, and a green gate is210 necessary but never sufficient.211212## Traceability matrix213214Every rule above traces to a named check on the maintainer's side. If the gate215changes, this skill changes with it — they are one spec.216217| Skill rule | Gate-side source |218|---|---|219| Required `## ` headings, filled | `pr-intake.yml` check 1 (missing-headings) / `INTAKE.md` §PR body contract |220| Exactly one AI-disclosure box | `pr-intake.yml` check 2 (checked-boxes == 1) |221| Non-empty human intent, quote the ask | `pr-intake.yml` check 3 (meaningful intent) / gate design: human-provenance is the anti-slop asymmetry |222| Model named when AI helped; `unsure` valid | `INTAKE.md` marker contract; review-machine model provenance ledger (per-model track record) |223| Gate marker as last line, consistent | `INTAKE.md` §Machine-readable marker; `pr-intake.yml` marker parse |224| Test fails without the change (revert-check) | review machine, correctness lens: revert-check centerpiece |225| Changed hunks exercised by tests | review machine, correctness lens: diff-coverage spot-check |226| Exact sandbox test invocation | CONTRIBUTING §What makes a PR land fast; security gates: sandbox-everything rule (Gate 6) |227| gofmt + go vet before push | maintainer shipping rule (lint CI fails on formatting) |228| Scoped diff; ~400-line oversize flag | review machine, fit lens: oversized-pr flag |229| >3000 added lines needs linked discussion | intake gate: giant-undiscussed-diff check; `INTAKE.md` house rules |230| Lean-scope check before new adapters/UIs | review machine, fit lens: lean-scope line |231| Real repro/evidence, mock-only insufficient | review machine, intent lens: behavior-evidence test; `INTAKE.md` Evidence row |232| No urgency language without repro | intake gate: urgency-scanner-slop check |233| Dependency changes justified; no replace/GOPROXY | security gates, Gate 1 (dependency vet) + Gate 6 red flags |234| `.github/` changes always human-gated | security gates, Gate 2 |235| Hidden-logic self-scan (network/exec/homoglyph/perms/time-bomb/crypto) | security gates, Gate 3 sweep + Gate 6 red flags (author-side version: `references/security-self-scan.md`) |236| No CHANGELOG edits; ≤5 open PRs | `INTAKE.md` house rules; CONTRIBUTING house rules |237| Hot-path timing evidence | PR template checklist (hot-path row); CONTRIBUTING rule 6 |238| SHA-bound verdicts; push = re-review | review machine: SHA binding invariant |239| Rank-up loop on needs-work | review machine: rank-up doctrine (needs-work is a loop, not a wall) |240| Misfire → say so, human overrides | gate design: `bad-gate` override; false-clean bias |241| Silence-only close; reply resets clock | gate design: reaction ladder |242| Merges always human | branch protection + CODEOWNERS; every gate necessary-not-sufficient |243244## References245246- `references/gate-spec.md` — every intake check and review criterion, with the247 exact fix for each; the machine-readable companion to `.github/INTAKE.md`.248- `references/pr-body-template.md` — one complete example of a passing PR body,249 including the gate marker block.250- `references/security-self-scan.md` — the security sweeps rewritten as251 author-side greps you run on your own diff.252- Repo-side: `.github/INTAKE.md` (field contract), `CONTRIBUTING.md` (policy),253 `.github/PULL_REQUEST_TEMPLATE.md` (the body you fill).