write-rfc
Enforcement tool for standardizing RFC structure and documentation in ArenaQuest projects.
Install
mkdir -p .claude/skills/write-rfc-raphaelsilva && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17178" && unzip -o skill.zip -d .claude/skills/write-rfc-raphaelsilva && rm skill.zipInstalls to .claude/skills/write-rfc-raphaelsilva
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Scaffold and validate ArenaQuest RFCs against the house standard so every proposal in docs/product/RFCs follows the same structure (numbered file, metadata header, canonical sections, README index row).Key capabilities
- →Scaffold new RFCs with sequential numbering and kebab-case titles
- →Append RFC index rows to the README
- →Validate RFCs against a house standard (filename, title, metadata)
- →Check for presence of canonical sections in RFCs
- →Identify missing recommended sections in RFCs
- →Generate RFCs with predefined metadata fields
How it works
The skill uses Node scripts to scaffold new RFCs with a standard structure and index them in the README, or to validate existing RFCs against predefined rules for filename, title, metadata, and sections.
Inputs & outputs
When to use write-rfc
- →Create new RFC draft
- →Validate RFC structure
- →Scaffold documentation templates
About this skill
ArenaQuest keeps formal proposals in docs/product/RFCs/ as
NNNN-<kebab-title>.md, indexed by docs/product/RFCs/README.md. This skill
enforces that standard with two dependency-free Node scripts:
new-rfc.mjs— scaffolds the next-numbered RFC fromtemplate.mdand appends its index row to the README.check-rfc.mjs— validates one or all RFCs against the standard; non-zero exit on a hard violation, so it drops into a pre-commit hook or CI.
Paths below are relative to the repo root (docs/product/RFCs, the
scripts under .claude/skills/write-rfc/). Run them from the root of the
planning worktree (see Where to work), never from the root checkout on main.
The
.claude/skills/directory is a symlink to.agents/skills/. It resolves fine for the Node runtime (Linux). The Windows\\wsl.localhostbridge can't traverse the symlink — if a tool errors withENOTDIR/Input/output erroron.claude/skills/..., use the real path.agents/skills/write-rfc/...instead. Both point at the same files.
Where to work: the planning worktree
Planning is written in its own git worktree and ships as its own PR, separate
from any code. The root checkout stays on main; one planning worktree carries the
whole documentation chain — RFC (write-rfc) → milestone (write-feature), or the
backlog/epic structure → task files (write-tasks) — until it is ready for review.
| What is being planned | Branch | Worktree |
|---|---|---|
| A new RFC (and everything derived from it) | docs/rfc-<NNNN>-<slug> | .worktrees/rfc-<NNNN>-<slug> |
| Planning with no new RFC (backlog/epic item, milestone for an already-merged RFC) | docs/<slug> | .worktrees/docs-<slug> |
- Pick the number.
new-rfc.mjsnumbers from the directory, so derive<NNNN>from the trunk and from RFC branches still in flight, or two open PRs collide on the same number:git fetch origin git ls-tree --name-only origin/main docs/product/RFCs/ | grep -E '/[0-9]{4}-' git branch -r --list 'origin/docs/rfc-*' - Open the worktree from the root checkout (on
main, clean) and route the session into it. The helper bases the branch onorigin/mainand marks the worktree as managed:
Docs-only work needs nomake worktree-open KIND=rfc NUMBER=<NNNN> SLUG=<slug> # or KIND=docs SLUG=<slug> cd .worktrees/rfc-<NNNN>-<slug>make setup— the skill scripts are stdlib Node. - Iterate there until the chain is ready: scaffold and fill the RFC, then the
milestone / backlog / epic structure and its task files, validating each with its
check-*.mjs. Commit as you go (docs(rfc): …,docs(milestone): …). - Push and open the PR to
main(the PR only on explicit user confirmation):git push -u origin docs/rfc-<NNNN>-<slug>. - Keep the worktree until the merge. The worktree stays on disk while the PR is under review, so requested changes are
made right there. Once the PR is merged into
main, the sweep removes it: the Claude CodeSessionStarthook (.claude/settings.json) runs the same sweep on every session start, and it can be run by hand (make worktree-sweep,DRY_RUN=1to preview). It only touches worktrees opened bymake worktree-open(they carry a marker), and skips any that is dirty, has commits the PR does not, or holds the current session. - After the PR merges into
main, execution starts in a new feature worktree opened by thedeveloperskill (.worktrees/m<N>-candidate, fromorigin/main).
Never touch a worktree you did not open — git worktree list may show worktrees
owned by another process — and never use bare git stash (the stash is shared by
every worktree).
The standard
Every RFC has, in this order:
- Filename
NNNN-<kebab-title>.md— 4-digit zero-padded, sequential. - Title
# RFC NNNN: <Title>— number matches the filename. - Metadata block (bold fields):
**Status:**,**Author:**,**Date:**(PTAutor:/Data:accepted), plus optional**Revised:**and an**Affected:**file list. Then a---divider. - Sections (
##): Summary, Motivation, Goals & Non-Goals, Current State (omit if greenfield), Proposed Design, Alternatives Considered, Implementation Plan, Tradeoffs & Risks, Success Criteria, Open/Resolved Decisions, References. Seetemplate.mdfor the prose guidance per section. - README index row in
docs/product/RFCs/README.md.
Status lifecycle: Draft → Proposed → Approved → In Progress → Implemented/Done/Completed; or Rejected / Superseded.
Create a new RFC (agent path)
node .claude/skills/write-rfc/new-rfc.mjs "Title of the proposal" --author raphaelsilva
Prints the created path (e.g. docs/product/RFCs/0007-title-of-the-proposal.md)
and adds the README index row. Options: --status (default Draft),
--date YYYY-MM-DD (default today), --author (default git config user.name),
--dir (default docs/product/RFCs). Then fill in each ## section — the
template body explains what belongs in each.
Validate (agent path)
Check every RFC in the directory:
node .claude/skills/write-rfc/check-rfc.mjs
Check a single file (use this on the RFC you just wrote):
node .claude/skills/write-rfc/check-rfc.mjs docs/product/RFCs/0005-enrollment-exclusions-and-visibility.md
Output: ✓ clean, ⚠ recommended section missing (advisory — exit 0),
✗ hard violation (exit 1). ERROR = wrong filename, missing/mismatched
# RFC NNNN title, missing Status/Author/Date metadata, or not linked from the
README index. warn = a recommended ## section is absent (older RFCs
predate the full skeleton, so these don't block).
Gotchas
.claude/skillsis a symlink (→.agents/skills). Native file tools reaching it over the Windows bridge throwInput/output error; run scripts through the WSL Node runtime, or edit files via.agents/skills/write-rfc/.- Exit codes are swallowed by the
wsl.exe … bash -c '… ; echo $?'bridge —$?reads as 0 even when Node exited non-zero. To observe the real result use&&/||evaluated inside WSL:node …/check-rfc.mjs && echo PASS || echo FAIL. - The standard is advisory for legacy RFCs. 0001 is Portuguese (
Autor:/Data:— accepted) and 0003 embeds its date inside the Status line, socheck-rfc.mjsflags 0003 as✗ missing Date. That is a real, known gap in an existing doc, not a script bug — don't "fix" the validator to hide it. - Numbering reads the directory, not the README. If a number was skipped or
a draft file deleted, the next number follows the highest existing
NNNN-*.md, not the index.
Files
.claude/skills/write-rfc/new-rfc.mjs— scaffolder (Node, stdlib only)..claude/skills/write-rfc/check-rfc.mjs— validator (Node, stdlib only)..claude/skills/write-rfc/template.md— the canonical section skeleton with per-section prose guidance;new-rfc.mjsfills its{{...}}placeholders.
When not to use it
- →When the `.claude/skills` symlink causes `ENOTDIR` or `Input/output error` on Windows `\wsl.localhost`
- →When the standard is advisory for legacy RFCs and should not be 'fixed'
- →When the goal is to observe real exit codes from `wsl.exe` without `&&`/`||`
Limitations
- →The skill relies on Node scripts for scaffolding and validation.
- →The skill's validation is based on a specific house standard for ArenaQuest RFCs.
- →The skill's numbering reads the directory, not the README, for the next sequential number.
How it compares
This workflow enforces a consistent structure and indexing for RFCs using automated scripts, preventing structural drift and ensuring all proposals follow the same standard, unlike manual RFC creation.
Compared to similar skills
write-rfc side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| write-rfc (this skill) | 0 | 3mo | Review | Beginner |
| architecture-decision-records | 54 | 7mo | Review | Beginner |
| wiki-architect | 11 | 5mo | No flags | Advanced |
| smart-docs | 4 | 10mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
architecture-decision-records
wshobson
Write and maintain Architecture Decision Records (ADRs) following best practices for technical decision documentation. Use when documenting significant technical decisions, reviewing past architectural choices, or establishing decision processes.
wiki-architect
microsoft
Analyzes code repositories and generates hierarchical documentation structures with onboarding guides. Use when the user wants to create a wiki, generate documentation, map a codebase structure, or understand a project's architecture at a high level.
smart-docs
sopaco
AI-powered comprehensive codebase documentation generator. Analyzes project structure, identifies architecture patterns, creates C4 model diagrams, and generates professional technical documentation. Use when users need to document codebases, understand software architecture, create technical specs, or generate developer guides. Supports all programming languages. Alternative to Litho/deepwiki-rs that uses Claude Code subscription without external API costs.
codebase-documenter
mhattingpete
Generates comprehensive documentation explaining how a codebase works, including architecture, key components, data flow, and development guidelines. Use when user wants to understand unfamiliar code, create onboarding docs, document architecture, or explain how the system works.
c4-architecture-c4-architecture
sickn33
Generate comprehensive C4 architecture documentation for an existing repository/codebase using a bottom-up analysis approach.
dagger-design-proposals
dagger
Write design proposals for Dagger features. Use when asked to draft, review, or iterate on Dagger design documents, RFCs, or proposals.