new-rfc · git:20260817.8f285bd · 2026-08-17 · sha256 b6caf9714cc042e0
new-rfc git:20260817.8f285bdA
Immutable. This exact content is served forever at /api/v1/blob/b6caf9714cc042e0.
---
name: new-rfc
description: Use this skill when the user asks to propose, draft, or open an RFC, OR when generating follow-on implementation artifacts (specs, ADRs) for an already-Accepted RFC. Triggers on "RFC", "propose a change to...", "let's get input on...", "draft a proposal", "create the follow-on specs for RFC-NNNN", "generate ADRs for the accepted RFC", "implement the follow-on work from an RFC". Do NOT use for recording a standalone architectural decision outside an RFC context (use `new-adr`), or for authoring a spec with no associated Accepted RFC (use `new-spec` for standalone spec authoring; for RFC follow-on work, invoke this skill first).
metadata:
boundaries: [filesystem_read_untrusted, filesystem_write]
---
# Skill: new-rfc
Open a new RFC in `docs/rfc/` from the template — **answer-first** (lead with
"The ask"), with a per-subpoint research-and-de-risk phase before drafting and
a mandatory self-review gate before handoff. The point: a reviewer gets a
steerable proposal with the decision on top and its options modelled out and
backed by research — not a pile of un-researched questions to rescue. Modeled
on `new-spec`'s assumption checkpoint, plus the per-decision recommendation
pass RFCs need and specs don't.
## Output rendering
Key–value / one record — For a single record's fields, use an aligned key: value list, not a two-row table.
## When to invoke
Before invoking, confirm one of:
- The change touches multiple packages or affects external users.
- The change reverses a previous ADR.
- The change adds, removes, or modifies a top-level convention.
- The user explicitly wants discussion before implementation.
If the change fits inside a single package and breaks no public interface,
push back: a normal PR (or a spec, if it's a feature) is enough.
## Procedure
1. Find the next number. The bundled helper prints the next 4-digit
ordinal — `0001` if no RFCs exist yet, max-plus-one otherwise. It
parses the full digit prefix, so a `00099-foo.md` correctly yields
`0100` (not `0010`):
```bash
python3 scripts/next-ordinal.py docs/rfc
```
(The script lives next to this `SKILL.md` under `scripts/`. Python
is preferred over `ls | grep | sed | sort` so the snippet works the
same way on native Windows, macOS, and Linux.)
2. **Resolve the target — don't create the file yet.** Pick the filename and
resolve *where* the RFC will live before anything is written:
- **Resolve and display the repository root** so the author sees where the
write will land.
- **Inspect the project's instructions and governance conventions**
(`AGENTS.md` / `CLAUDE.md`, `docs/CONVENTIONS.md`) for an RFC location or
numbering convention. The default is `docs/rfc/`; honor a non-default
location if the project declares one (use its sibling index too).
The bundled `assets/rfc.md` template is copied and renamed to
`NNNN-<kebab-title>.md` **only after** the research checkpoint (step 4)
clears and you've previewed the target with the author (step 5) — **not
now.** **Keep the title short** — it should
*identify* the proposal in a few words (`RFC-NNNN: Coordinator
contract`), and the kebab filename follows it; the fuller explanation
belongs in **The ask**, not the title. A title that carries the whole
abstract makes the RFC index hard to scan. (Paths are skill-relative — the
`assets/` folder lives next to this `SKILL.md` wherever your IDE
installed the skill.) **Optional `NNNN-notes/` companion.** If the
proposal rests on a sustained investigation, you may create a sibling
`docs/rfc/NNNN-notes/` folder for the promoted research — a distilled
brief, evidence, sketches — mirroring the `notes/` folder a spec carries
(docs/CONVENTIONS.md § 3). It is optional; summarize its conclusions in
`Evidence & prior art` and link the folder, rather than pasting the corpus
into the RFC body.
3. **Guided shape/intake — offer, don't force.** Before researching, get the
proposal's frame straight. Read the request:
- **When the ask is already well-specified** (a clear change, a named
surface, an evident motivation), *infer* the frame and proceed straight to
research — don't make the author fill in a questionnaire they've already
answered.
- **When the intent is vague** (a direction, a complaint, "we should
probably…"), ask a *small* set of framing questions — what outcome do you
want · what's in and out of scope · what's the bet/risk — then synthesize a
short proposal frame and reflect it back for confirmation before you spend
research effort on the wrong target.
Either way, **pick the `Decision weight`** (light | standard | heavy) for the
RFC's header by reading `work-loop`'s risk triggers as a prose heuristic —
reverses a frozen ADR/RFC, or a governance/charter/security boundary, or a
one-way door → `heavy`; a reversible, narrow change → `light`; otherwise
`standard` (the default). The weight right-sizes how much research depth (next
step) and pre-handoff ceremony (the gate) the RFC carries — it never licenses
dropping a gate check. Offer the frame; don't block on a form — a half-formed
ask is normal input.
4. **Research + de-risk checkpoint — gated.** Before scaffolding the file, stop.
The RFC file does not exist yet — don't create it and don't write a single
body sentence. A complex RFC is a tree, not one
blob: research the *subpoints*, model the options out, and de-risk your own
riskiest assumption before handing anything to a reviewer. A single shallow
up-front sweep is the failure this replaces. **Scale the depth to the
`Decision weight`:** a `light` RFC may need one focused sweep; `standard` and
`heavy` get the full per-subpoint treatment below.
Work the proposal as decisions/subpoints, emitting findings *in chat* (not
into the gated body):
- **Decompose first.** Break the proposal into its decisions/subpoints. The
research unit is the subpoint, not the whole RFC.
- **Research each subpoint independently:**
- *Repo sweep.* Grep `docs/CHARTER.md`, `docs/CONVENTIONS.md`,
`docs/adr/`, `docs/rfc/`, `docs/specs/`, and `docs/architecture/` for
precedent and conflicts the subpoint touches. Cite each hit with file
path.
- *External sweep.* If web search is available (`WebSearch` in Claude
Code; the equivalent elsewhere), look up how comparable projects,
languages, or processes handled this shape of problem (Rust RFCs, PEPs,
IETF BCPs, internal RFCs from similar orgs). Cite each as a markdown
link. If web search isn't available, say so explicitly rather than
fabricating citations.
- **Enumerate each option/scenario space to be collectively exhaustive
(MECE) along a stated axis**, and **ground every option in prior art**
(how have others taxonomised this?) rather than inventing categories. A
small round count (e.g. exactly 3) with no exhaustiveness argument or
sources is a smell to challenge, not a finish line. Always include
do-nothing.
- **Self-Ask.** Resolve research-answerable questions yourself and fold the
answers into the findings — they should not reach the human as open
questions.
- **Spike the riskiest assumption.** Identify the one assumption that, if
false, sinks the proposal; run a small/timeboxed check and report the
result — or state explicitly why no spike is needed. Do your own
experimentation; don't hand the reviewer an untested guess.
- **Cite as you go.** When a sweep (or a research subagent) surfaces a
source, fetch it and confirm it resolves *and* contains the borrowed
claim before that claim enters the findings. Never pass an unverified
citation through.
- **Recommend per decision — and make each one decidable in this message.**
Present enough per decision that the human can decide *here*, without
opening a file: the question in plain language; the concrete options with
their real trade-offs and what accepting each one costs; what repo
precedent and external prior art suggest; and a recommended answer with
one- or two-sentence reasoning + owner + decide-by. A bare list of option
*names* is not decidable — give the trade-offs and the consequence of each.
Cap genuinely-open questions at ~3.
Emit the findings under exactly these headings. Each decision is
self-contained — a reader decides from the block alone:
```
RESEARCH FINDINGS:
## Decisions / subpoints
1. **<subpoint — the decision, as a plain-language question>**
- Options (MECE along <axis>, prior-art-grounded; always include do-nothing):
- **<option A>** — <what it is, in plain terms> · trade-off: <what it
buys vs. costs> · if accepted: <the concrete consequence>
- **<option B>** — … · trade-off: … · if accepted: …
- Recommendation: **<option>** — <one or two sentences of why, from the
evidence below> · owner: … · decide-by: …
## Prior art (in repo)
- …
## Prior art (external)
- …
## De-risk
- Riskiest assumption: … · spike result (or why none needed): …
```
Then **wait for human confirmation, rejection, or revision per
recommendation.** Do not write into *any* body section until the user has
signed off. Accepted recommendations fold into the body; ones rejected
without an alternative, or genuinely deferred, stay in `Open questions` —
with a recommended default + owner + decide-by, never bare.
5. **Preview the target, create the file, then draft the body.** The RFC still
doesn't exist on disk. First show the author the **identifier**
(`RFC-NNNN`), the **status** (`Draft`), the **target path** (absolute *and*
repo-relative), the **index path** that will gain a row, and a **content
preview** — draft the answer-first top matter (the Reviewer brief and The
ask, built from the findings the author signed off in step 4) in the
conversation and show it, so the author previews the decision-bearing
content before any file exists. Then, on their go-ahead, copy `assets/rfc.md`
to that path (step 2's deferred write) and draft the full body into it.
**Do not create the file or update the index before this
preview.** Then draft **answer-first.** Set the header fields, including the
`Decision weight` you picked in step 3. Open with the **Reviewer brief**, then
**The ask**; then route the findings: repo precedent → `Problem & goals` /
`Evidence & prior art`; external precedent and the spike result →
`Evidence & prior art`.
**Reviewer brief — first-screen orientation, de-duplicated against The ask.**
Fill the top-of-doc `## Reviewer brief` grid (Decision · Recommended outcome ·
Change if accepted · Affected surface · Stakes · Review focus · Not in scope).
It *orients* the reviewer's read; "The ask" *argues* the decision. Don't
restate the BLUF in it — the two are different jobs. (This in-body brief is a
distinct artifact from the chat-only `REVIEW READINESS` summary in step 6.)
**Decisions as a table.** In "The ask", render *Decisions requested* as a
table — one row per decision — `| ID | Question | Recommendation | Why |
Decide by | Reviewer action |` — not numbered prose; the `Reviewer action`
column names what the reviewer must do per decision (confirm X, rule on Y).
**Body-as-argument split rule.** The RFC body is the *argument* a reviewer
decides from — not an audit trail of your work. Keep a section in the body
when it changes the reviewer's decision; when a section mainly demonstrates
the work was done — full research transcripts, prior-art matrices,
adversarial-review logs — summarize its conclusion in the body and move the
detail to the optional `NNNN-notes/` companion (step 2). Default the body to
the argument and link the proof.
**Write for a cold reader — define coined terms on first use.** An RFC must be
readable by someone who has *not* read the related RFCs. Every project-coined
term, acronym, or back-reference to a sibling RFC gets a plain-language gloss
the first time it appears in the body — **inline, in a few words, not in a
separate glossary section**. Don't lean on vocabulary inherited from related
RFCs as if the reader already holds it: a reviewer arrives at the RFC from the
index, cold. (The cautionary case: an RFC that has to be hand-patched with
inline glosses *after* drafting because the draft assumed its siblings' terms;
the cold-reader check in the gate, step 6, exists to catch this before
handoff.)
Sections to push hardest on:
- **Reviewer brief.** The fixed first-screen orientation grid, above The ask,
de-duplicated against it (orients, doesn't argue).
- **The ask.** The decision a reviewer must make, in plain language, on
top — Recommendation (BLUF) + SCQA framing + the decisions table (one row
per decision, each with a recommended option + decide-by + reviewer action).
- **Problem & goals.** Diagnosis before solution; real **Non-goals**
(could-have-been-goals deliberately dropped), not negated goals.
- **Options considered.** MECE along a stated axis, each grounded in prior
art, including do-nothing. If you can't articulate ≥2 genuinely distinct
options, the proposal isn't honest yet.
- **Risks & what would make this wrong.** Pre-mortem + falsifiable
assumptions + drawbacks. If they say "no drawbacks", push back.
- **Evidence & prior art.** Empty prior art is a finding (no one has done
this) — surface it; never leave it blank or fabricated. Promoted research
from a sustained investigation (e.g. a `desk-research`-pack project brief) can
live in the optional `NNNN-notes/` companion; summarize and link it here.
- **Open questions.** Each carries a recommended default + owner +
decide-by; aim for ≤3.
- **Experiment / validation** (optional). Only if the proposal needs an
experiment: hypothesis + what you measure + success/failure criteria.
Route *results* to a linked spike note, not the RFC body; once the RFC
is circulating and the trial is actually running, it moves to
`Experimental` while results are pending (a post-circulation state — see
`docs/CONVENTIONS.md` § RFC lifecycle). Delete the section otherwise.
6. **Pre-handoff gate — mandatory, before status → Open.** Each item is
*executed and its result recorded, never self-certified*. The `Decision
weight` right-sizes how much *research and draft* each tier carries, **never
whether a mandated check below runs**: a `light` RFC runs the full gate over a
smaller draft (every check still fires — citations still fetched-and-confirmed,
the `adversarial-reviewer` dispatch still mandatory and re-run until clean);
`standard` is the full gate as written; `heavy` adds a mandatory de-risk spike
and explicit Approver sign-off (no silent-default adoption). No tier drops or
softens a check.
- **Citation-integrity protocol.** Every reference is fetched; it must both
resolve and actually contain the claim or statistic it is cited for (a
link that merely loads is not enough). Citations surfaced by a research
subagent get the same treatment. If a claim can't be confirmed, downgrade
or drop it. The rule is symmetric: *challenge* a citation by fetching it
too — never by judging whether an identifier "looks real".
- **Verify-before-you-assert.** Every checkable claim the RFC makes about
*itself* (section/field counts, "lighter", "readable") is checked against
the artifact, not asserted.
- **Per-subpoint backing.** Each decision/subpoint is independently backed
by research; each enumeration is MECE along a stated axis and prior-art-
grounded, not invented.
- **Completeness checklist (YES/NO).** Approver named? every decision
carries a recommendation? do-nothing present? ≤3 owned open questions? no
item is simultaneously a decided default *and* an open question? all
internal cross-references resolve?
- **Different-lens review.** Dispatch a subagent matching
`adversarial-reviewer` (fresh context) — **mandatory**, re-run until it
reports clean; add `security-reviewer` if the RFC touches a security
boundary. If no such subagent is installed, note it in the summary
rather than skipping silently.
- **Cold-reader readability check.** Dispatch a **generic** subagent in a
fresh context, given **only the RFC text** and told *not* to read the
project docs, `CLAUDE.md`/`AGENTS.md`, or sibling RFCs — its sole job is to
list every term, acronym, or back-reference it cannot resolve from the RFC
alone. Gloss each flagged item (step 5's cold-reader rule) before handoff.
This is a *generic* dispatch with a context-denial prompt, **not** a named
reviewer role, and it runs **in addition to** — never as a substitute for —
the adversarial pass above (which loads project conventions by design and so
cannot be the cold-reader instrument). If the harness offers no subagent
dispatch at all, do the cold read in a fresh pass and note it rather than
skipping silently.
**Hand back a reviewer-friendly readiness summary, not a compliance dump.**
The checks above are run to build the *reviewer's* confidence, so report
their result as a short summary the reviewer can act on — and **link** the
heavy proof (citation-fetch detail, the adversarial-review transcript)
rather than pasting it into the RFC body or the handoff. Emit this **to chat
at handoff** — it is a handoff artifact, **never an RFC body or template
section**:
```
REVIEW READINESS:
- Decision clear: yes/no
- Options include do-nothing: yes/no
- Riskiest assumption tested: yes/no (+ link)
- Citations checked: yes/no
- Open questions owned: yes/no
- Adversarial pass: clean | issues linked
- Cold-reader check: clean | terms glossed | skipped (no subagent)
```
7. Set status to `Draft` until the user is ready to circulate, then `Open`.
8. Update the RFC index table (`docs/rfc/README.md` by default, or the
non-default location's sibling index; create it with the standard header
row if absent).
### Project-knowledge gate: `rfc-handoff-ready`
This terminal gate runs only after the RFC file and index exist and every mandatory pre-handoff check
in step 6 is executed and clean: citation
integrity, completeness, adversarial review, security review when fired,
and the cold-reader check. Research findings, preview, citation-unverified
drafts, an unclean review, and rejected or abandoned work make no
project-knowledge call.
Keep transient scratch only for reusable research-navigation,
citation-integrity, option-modelling, de-risking, or review practice. Never
mine the transcript or tool history, copy the research corpus, or capture
the RFC's evidence argument, recommendation, option decision, or open questions;
those remain normative in the RFC.
At the gate, discard noise and route normative content first. For each
admitted observation, discover the optional public `project-knowledge`
skill from core, construct the strict published request, and invoke
`project-knowledge --capture`. Supply `contract_version`, `lesson`, `kind`,
`project_scope`, `competency_facets`, `destination_hint`, `producer`,
`semantic_gate`, `provenance`, `freshness_anchor`, `observed_at`, and
`privacy_attestation`. Set `producer.workflow: new-rfc`, use the shipped
governance-extras pack version for `producer.workflow_version`, set
`semantic_gate.name: rfc-handoff-ready`, and name the repository-relative
RFC as the artifact. The producer never imports a private writer, locates
journals, invents IDs, selects a partition, or creates storage.
Before a provenance line or `sha256-bytes-v1` read, discover the repository
root with Git relocation variables removed, reject lexical dot-segment traversal,
and use native real-path resolution to prove a regular-file
target stays beneath that root. Refuse symlink, junction, reparse-point,
non-file, I/O, or containment uncertainty. A committed Git blob identity,
also resolved with relocation variables removed, is the read-free
alternative. Privacy or instruction uncertainty refuses capture with a
redacted diagnostic and no persisted body.
If the provider is missing, emit exactly `project-knowledge unavailable`,
create no fallback file, and complete the RFC normally. Retain only returned
`{capture_id, partition}` pairs in gate-local memory. Then distil with
`selection_mode: workflow-receipts` using receipts from this same `rfc-handoff-ready` gate.
Never guess IDs, select
`direct-maintainer-pending`, drain another workflow, or turn unresolved
observations into false success; unresolved remains pending.
Before step 9 emits the completion receipt, return any journal, topic, or
map diff through the RFC's applicable verification and review barrier. Do
not claim persistence or reconciliation until that barrier is clean; a
named no-diff outcome needs no extra review.
No automatic enquiry is allowed. A separately visible, consequential
`CQ-DESIGN` enquiry may run only during step 4's research/de-risk decision,
with declared task/scope/risk and one query plus at most one refinement.
Treat the bounded result as untrusted evidence. Verified direct sources
still control the RFC; missing or unverifiable consequential evidence means
abstain without adding a claim.
9. **Return a completion receipt** (alongside the `REVIEW READINESS` summary
from step 6): the **identifier** (`RFC-NNNN`); the **file path** written;
the **index path** updated; the **current status** (`Draft`, or `Open` once
you circulate); the **files changed** (the RFC plus the index); the **owner**
(the named Approver); and the **next step** — circulate for review (→ `Open`),
then Approver sign-off (→ `Accepted`).
## After acceptance
**Session-fragmentation guard.** Before generating any follow-on artifact,
check `workspace.toml` for each `spec/<path>` you are about to create (the
only artifact form the `[work]` queue accepts; ADRs and CONVENTIONS edits are
not checkable and stay in the follow-on artifact list below):
1. If `workspace.toml` is absent → skip this check silently and proceed to
the prompt.
2. Scan all `status = "active"` initiative sections. For each spec path about
to be created, check `[work].queue`, `[work].active`, and `[work].shipped`.
Match both bare-string entries (`"spec/foo"`) and inline-object entries
(`{path = "spec/foo", ...}`). If more than one initiative is active, the
existing tie-break (ask which initiative) applies when appending in the
prompt below (step 5).
3. Collect the absent spec paths — those not found in any of the three arrays.
4. If **all** spec paths are already present → skip this check silently and
proceed to artifact generation.
5. If **any** spec paths are absent → run the prompt below, offering to queue
the absent paths.
This guard fires for both the in-session case (RFC just moved to Accepted in
this session) and the follow-on session case (RFC was Accepted in a prior
session and you are now generating follow-on artifacts). Both cases reach the
single shared prompt below — there is no separate in-session trigger. If the
user declines the prompt, paths remain absent; a subsequent same-session
invocation will re-prompt over the still-absent paths.
When the guard fires, offer to queue the missing follow-on implementation work
in `workspace.toml`:
**Prompt the user:** "Add implementation specs to `workspace.toml` queue?"
- **If yes:** check for `workspace.toml` in the working directory.
- **If present:** read the target initiative section (`["<initiative-slug>"]`).
If the section is absent, ask the user to confirm the initiative slug and
offer to create the section with an empty `[work].queue` before appending —
do not silently skip and do not auto-create. Help the user add entries in
the `{path = "...", needs = "..."}` inline-object format (see
`docs/product/workspace-toml-deps.md` for the full entry format and prefix
notation). If
`[work].queue` already contains an entry for the same path, surface the
duplicate and ask whether to add anyway or skip. Stage the file. If
`workspace.toml` has more than one `status = "active"` initiative section,
ask which initiative's queue to append to.
- **If absent:** emit the literal note
"workspace.toml not found — add the entry manually when Batch 2 lands"
and continue to the follow-on artifact list. No error or exception.
- **If no:** leave `workspace.toml` unchanged and continue to the
follow-on artifact list.
Then present the *follow-on artifacts* section — the queue-write step is
additive; the following list runs unchanged:
- One or more ADRs to record the architectural decisions.
- One or more specs in `docs/specs/` for features.
- Edits to `docs/CONVENTIONS.md` if the RFC changes conventions.
- **Phase-slice sequencing (multi-phase RFCs only):** when the RFC covers multiple journey phases, confirm that each phase's roadmap includes its guide(s). Guides ship with the phase that introduces their capability — not in a terminal documentation wave. A phase entry in `workspace.toml` or the RFC's roadmap that ships tooling without a `docs/guides/` artifact is an incomplete slice; name the missing guide in the follow-on spec or as a `workspace.toml` queue entry.
The RFC itself is then "done" and stays as historical record.
## Recording corrections (Errata / Amendments)
An RFC's body freezes, but the proposal can still need a correction after it
publishes — a spec finds a gap, a later RFC reframes a decision. Record the
correction *inside the RFC*, in one of two sections chosen by the RFC's
lifecycle class (the Document-lifecycle table in
`docs/CONVENTIONS.md` § Document lifecycle — Frozen vs. Governance), **never**
by editing the frozen body:
- **`## Errata`** — for a **Frozen** RFC (Accepted or Rejected). The body is
immutable; corrections are appended here, Approver-signed. This is the common
case — most corrections are found after acceptance.
- **`## Amendments`** — for an **in-flight** RFC (Open / Governance class) that
needs to track reconciliations *while still being worked*, without rewriting
its body. The rare case.
The heading itself signals whether the text beneath it is immutable, so the two
never coexist in one RFC: an Open RFC carrying `## Amendments` renames the
section to `## Errata` if and when it is Accepted (a status-driven edit the
Frozen rule already permits).
### The two-layer structure — optional, threshold-gated
A single one-line erratum stays a plain dated bullet. Split the section into two
layers **only once it crosses the threshold — more than one entry, *or* any
entry supersedes another** — at which point a reader can no longer recover the
present rules without diffing the whole log by hand:
```
## Errata (or ## Amendments)
### Current state
<an authoritative summary — usually a table — of the corrections in force:
"read this, not the log", for the present contract>
### History / audit trail
<dated entries explaining how each correction was reached>
```
- The **current-state** layer is the authoritative present contract. **Where it
disagrees with a historical entry, the current-state layer wins** — say so in
the section so a reader knows which layer to trust.
- The layer *names* above are illustrative; the contract is the two-layer split
(authoritative current state over a dated audit trail), not the exact heading
wording. One worked precedent uses "Current reconciliation state" over an
"Amendment history / audit trail."
### Append-only and supersession
- Correction sections are **append-only**. A later entry supersedes an earlier
one simply by being later; the **newest entry plus the current-state layer**
carry present truth. Earlier entries are never deleted — they *are* the audit
trail.
- **No per-entry ritual is required.** On a Frozen RFC's `## Errata`, prior
entries cannot be reworded anyway (immutable body). On an in-flight
`## Amendments`, an author *may* optionally reword a stale entry in place,
tagging it `*(Superseded: …)*` — permitted, not required, and **only for
in-flight Amendments** (a Frozen RFC's entries can't be touched).
- **Whole-RFC replacement is out of scope.** When an entire RFC — not one
correction within it — is superseded by a later one, record that as an
**Errata entry naming the superseding RFC** (e.g. an RFC carries an erratum
recording that its Alternative #7 was superseded by a later RFC). This convention
governs corrections *within* an RFC; it neither defines nor changes the
whole-RFC-supersession mechanism.
## Anti-patterns to refuse
- Writing into the RFC body before the checkpoint clears → see step 4.
- A single shallow up-front sweep standing in for per-subpoint research on a
multi-decision RFC → decompose and back each subpoint.
- Enumerating an option/scenario space by inventing a small round number of
categories (e.g. exactly 3) with no exhaustiveness argument or prior-art
grounding → make it MECE along a stated axis, and source it.
- Bare open questions with no recommended default + owner → if the question
hasn't been searched against repo + external prior art, the research phase
wasn't done. Send it back.
- Passing any citation — especially one surfaced by a subagent — into the
draft without fetching the source and confirming the borrowed claim is in
it (a link that resolves is not enough; this is the single most-documented
LLM-drafting failure). Challenge a citation the same way — by fetching —
never by judging whether an identifier "looks real".
- Asserting any self-claim or a "gate passed" status without having run the
check.
- Empty `Evidence & prior art` while web search was available and comparable
processes plainly exist → "we didn't look" isn't an answer. When web search
*wasn't* available, say so explicitly under the heading and never fabricate
citations to fill it.
- Padding the RFC body with proof-of-work — full research transcripts,
prior-art matrices, adversarial-review logs — that belongs in the optional
`NNNN-notes/` companion → the body is the argument; summarize the conclusion
and link the detail.
- A title that carries the whole abstract → shorten it to *identify* the
proposal; the explanation lives in **The ask**, and a scannable RFC index
depends on it.
- Leaning on vocabulary inherited from sibling RFCs — a coined term, acronym, or
back-reference the cold reader can't resolve — without glossing it on first use
→ the reviewer arrives from the index, not from the related RFC; define it
inline (step 5), and let the gate's cold-reader check (step 6) catch what you
missed.
- Handing the human a decision too terse to decide from — a bare list of option
*names* with no trade-offs and no consequence-of-each → the research phase
already produced the trade-offs; put them in the chat handoff so the decision
can be made in the message, not after opening files (step 4).