Skip to content
DESIGN RECORDS

The RFC process

Design changes to what WeaveC guards, how its runtime enforces it and what it guarantees go through a lightweight RFC. The RFC is the durable record of why the design is the way it is; the code and tests record what it does.

Write an RFC when a change would:

  • change which accesses get a guard, or add or change a rule that removes one (lib/Frontend/Guard*.cpp);
  • change the shadow encoding, frame layout, global redzones, the quarantine or the sweep;
  • change the runtime’s checked library wrappers, its report kinds or their formats, or the library table (lib/Core/LibrarySpec.txt);
  • change the enforcement ledger’s format or the driver’s -fweavec-* flags;
  • add or change an annotation in resources/include/weavec.h;
  • change what WeaveC guarantees, including trading soundness for cost.

Do not write an RFC for driver plumbing, build or CI changes, documentation, or bug fixes that bring the implementation in line with an already-accepted RFC. Those go through normal pull requests; release-worthy changes appear in the generated CHANGELOG.md.

  1. Copy 0000-template.md to NNNN-short-title.md using the next unused number, fill it in, and open a pull request containing only the RFC. Discussion happens on that PR.
  2. When there is consensus, the RFC is merged with status Accepted. Implementation proceeds in follow-up PRs that reference the RFC number.
  3. When every item in the RFC’s Detailed design and Diagnostics sections has landed with tests, a PR flips the status to Implemented. Lit tests that pin RFC behaviour are named by feature (test/Guards/<feature>.c, test/cases/<area>/…), and the pull request names the RFC.
  4. An RFC that is abandoned is marked Withdrawn; one replaced by a later RFC is marked Superseded with a link. RFCs are never deleted or renumbered.

Statuses: Draft → Accepted → Implemented, or Withdrawn / Superseded.

Small corrections to an Accepted RFC (typos, clarifying a sentence to match what was actually built) may be made directly. Anything that changes a decision is a new RFC that supersedes the relevant section.