RFC Writer

SkillDev tools

Write precise, implementation-independent RFCs with testable normative clauses and correct lifecycle handoff

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the RFC Writer skill

What this skill tells your AI

The instructions your AI receives, as published by govctl-org/govctl in .claude/skills/rfc-writer/SKILL.md and read by ahel’s review.

Write the product contract: observable obligations, invariants, interfaces, and compatibility rules. RFCs are normative artifacts, not design diaries, code sketches, or task plans.

This helper owns RFC content quality. Use spec or gov for lifecycle operations such as finalization, version bumps, phase changes, deprecation, and Clause supersession.

Discovery

Inspect the RFC, its relevant Clauses, and governing references before writing:

govctl rfc show <RFC-ID>
govctl clause show <RFC-ID>:<CLAUSE-ID>
govctl search <topic>

Use govctl rfc --help, govctl clause --help, and subcommand help for current syntax. Clause operations always use the root govctl clause resource.

Hard Stops

  • Do not implement, accept, bump, advance, deprecate, supersede, or delete from this helper. Hand lifecycle work to spec or gov.
  • Do not put a new obligation in an ADR or Work Item to avoid amending the RFC.
  • Stop when the requested contract conflicts with normative content or its lifecycle state is unclear.
  • Do not edit lifecycle-owned metadata such as Clause since.
  • Do not reproduce headings or status metadata generated by govctl render.

Writing Policy

Put Contract In The RFC

A normative statement belongs here when an external observer, validator, stored artifact, script, or integration can determine whether it is true. It should remain valid if private types, functions, modules, or implementation languages change.

Include externally relevant behavior, validation and error semantics, lifecycle and compatibility rules, and public or persisted representations. Move design choice and trade-off rationale to an ADR, execution scope to a Work Item, and transient evidence to loop state or the final response.

Use RFC 2119 keywords in uppercase in normative Clauses. Make each obligation specific, independently testable, and unambiguous about its subject and conditions. Prefer one obligation per sentence. Explain why a normative Clause exists without turning its rationale into a second requirements inventory.

Use informative Clauses for scope, overview, and extended explanation. Use descriptive C-UPPER-CASE Clause IDs and [[RFC-NNNN:C-NAME]] or [[ADR-NNNN]] references where another artifact owns relevant authority or rationale.

Preserve Authoring Boundaries

RFC text may describe an external schema or syntax when that representation is itself contractual. It should not prescribe private field layouts, language types, function signatures, helper names, module organization, implementation steps, or validation logs.

The renderer owns RFC and Clause headings, Clause since, supersession markers, and other structural metadata. Clause text contains only specification prose, rationale, and artifact references.

govctl rfc show <RFC-ID> presents the current projection and omits obsolete body content. Use --history for full supersession history. Rendered Markdown remains the archival projection.

Respect Lifecycle State

The governing rules are [[RFC-0000:C-STATUS-LIFECYCLE]], [[RFC-0000:C-PHASE-LIFECYCLE]], [[RFC-0000:C-CLAUSE-DEF]], and [[RFC-0002:C-LIFECYCLE-VERBS]].

  • Draft content remains unpublished until finalization; draft RFCs are not version-bumped.
  • Normative content in spec refines the current candidate without another bump.
  • Content edits in impl, test, or stable create an amendment that requires the authorized version lifecycle before further phase progression.
  • Entry to impl seals the candidate baseline. A version-changing bump opens the next candidate from impl, test, or stable; it does not retarget an open spec candidate.
  • Deprecated RFCs cannot start another version lifecycle.

Clause version assignment is lifecycle-owned. Draft Clauses receive since at finalization; Clauses created in normative spec receive the current version; Clauses created later remain pending until a content bump. An unreferenced Clause may be deleted while its RFC is draft, or while it belongs only to the current normative spec candidate (since equals the current version). Inherited Clauses require deprecation or supersession.

Completion Evidence

Before handoff:

  • every normative statement passes the observable, implementation-independent, and testable contract test;
  • content does not duplicate renderer-owned structure or another artifact's authority;
  • references and project tags are current;
  • govctl check passes after substantive edits; and
  • rfc-reviewer has no unresolved blocker before lifecycle progression.

Use spec for artifact-only maintenance and gov when the RFC change carries implementation work.

Signals

GitHub stars
267
Forks
16
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
rfc-writer
Source
github.com/govctl-org/govctl