Technical RFC
Write Technical RFCs that drive informed decision-making for significant changes. An RFC is a structured proposal that invites feedback before commitment — it's cheaper to debate a document than to rewrite a system.
When to Write an RFC
An RFC is required when a change meets any of these criteria:
- Introduces a new dependency, library, or framework (e.g., replacing Panko with a different serializer)
- Changes how data flows between systems (e.g., adding a new Centrifugo channel pattern)
- Modifies database schema in a way that affects multiple services or teams
- Proposes a new architectural pattern that deviates from current conventions
- Requires migration effort across existing code (e.g., switching from callbacks to async/await)
- Affects the deployment pipeline, infrastructure, or operational procedures
- Changes shared APIs that other teams or clients consume
- Introduces a new third-party service or cloud provider integration
An RFC is not needed for:
- Bug fixes following established patterns
- Adding features within existing architecture
- Dependency version upgrades (patch/minor) without API changes
- Documentation updates
- Refactors that don't change external behavior or interfaces
RFC Writing Protocol
Step 1: Understand the Problem Before Proposing a Solution
Before writing the RFC:
- Identify the pain point, limitation, or opportunity that motivates the change.
- Gather evidence: error rates, performance metrics, developer friction, customer complaints.
- Confirm the problem is real — not hypothetical, not premature optimization.
- Check if someone has already proposed a solution (search existing RFCs, ADRs, Slack threads).
Step 2: Research Alternatives Thoroughly
For every RFC, evaluate at minimum:
- Do nothing — What happens if we don't make this change? Sometimes the status quo is the right choice.
- The proposed solution — Your recommended approach.
- At least one alternative — A meaningfully different approach, not a strawman.
For each alternative, assess against our stack:
| Concern |
Questions to Answer |
| Rails backend |
Does it work with our service object pattern? Panko serialization? Sidekiq jobs? |
| React Native |
Does it work with Zustand state management? TanStack Query? Is the npm package actively maintained? |
| PostgreSQL/PostGIS |
What schema changes are needed? Migration strategy? Spatial query impact? |
| Centrifugo |
Does it affect real-time channels? WebSocket connection patterns? |
| Redis |
Cache invalidation impact? Sidekiq queue changes? |
| Infrastructure |
Terraform changes? Docker Compose updates? AWS/GCP service additions? |
| Team |
Learning curve? Hiring impact? On-call complexity? |
Step 3: Write the RFC
Use the template in references/rfc-guide.md. Every section is mandatory — if a section is not applicable, write "N/A" with a one-sentence explanation of why.
Key writing principles:
- Lead with the problem, not the solution. The reader must feel the pain before evaluating the fix.
- Be specific. "Improves performance" is useless. "Reduces p95 API latency from 450ms to under 100ms by eliminating N+1 queries in the order listing endpoint" is useful.
- Show your work. Include benchmarks, prototypes, proof-of-concept results, or load test data.
- Name the risks honestly. A proposal that claims zero downsides is not credible.
- Write for the skeptic. Assume the reader's default position is "no" — persuade them with evidence.
- Keep it under 3 pages. If the RFC is longer, the proposal is probably too big. Split it.
Step 4: Stack-Specific Impact Assessment
Every RFC must include an impact assessment against our stack. Use this checklist:
Backend Impact
Frontend Impact
Data Impact
Infrastructure Impact
Step 5: Define the Migration Path
If the RFC changes existing behavior, the migration path must:
- Be incremental — no big-bang switchover.
- Support rollback at every step.
- Define done criteria — how do we know the migration is complete?
- Estimate effort in developer-days (not story points).
- Identify who does each step.
Step 6: Specify the Review Process
- List required reviewers by role (backend lead, frontend lead, DevOps, etc.).
- Set a review deadline (default: 5 business days).
- Define the decision process: consensus, maintainer approval, or tech lead decision.
- Specify how feedback is incorporated: comment threads on the RFC document.
Output Format
Produce the RFC using the template from references/rfc-guide.md. The output must be a complete, ready-to-share document — not a skeleton or placeholder.
Relationship to ADRs
- RFC = "Should we do X?" (pre-decision proposal, invites debate)
- ADR = "We decided X because Y." (post-decision record, documents outcome)
After an RFC is accepted, create a corresponding ADR using the /doc-generator skill to permanently record the decision. Reference the RFC number in the ADR.
1---2name: technical-rfc3description: Write Technical RFCs (Request for Comments) for proposing significant technical changes that require team review and consensus. Use this skill whenever someone asks to write an RFC, technical proposal, design proposal, or says things like "propose a new approach", "get buy-in for this change", "write a proposal for X", "create an RFC", or "I want to propose we change how we do Y". Also trigger when someone needs to propose a new library, framework migration, process change, or architectural shift that affects multiple teams.4---56# Technical RFC78Write Technical RFCs that drive informed decision-making for significant changes. An RFC is a structured proposal that invites feedback before commitment — it's cheaper to debate a document than to rewrite a system.910## When to Write an RFC1112An RFC is required when a change meets **any** of these criteria:1314- Introduces a new dependency, library, or framework (e.g., replacing Panko with a different serializer)15- Changes how data flows between systems (e.g., adding a new Centrifugo channel pattern)16- Modifies database schema in a way that affects multiple services or teams17- Proposes a new architectural pattern that deviates from current conventions18- Requires migration effort across existing code (e.g., switching from callbacks to async/await)19- Affects the deployment pipeline, infrastructure, or operational procedures20- Changes shared APIs that other teams or clients consume21- Introduces a new third-party service or cloud provider integration2223An RFC is **not** needed for:2425- Bug fixes following established patterns26- Adding features within existing architecture27- Dependency version upgrades (patch/minor) without API changes28- Documentation updates29- Refactors that don't change external behavior or interfaces3031## RFC Writing Protocol3233### Step 1: Understand the Problem Before Proposing a Solution3435Before writing the RFC:36371. Identify the pain point, limitation, or opportunity that motivates the change.382. Gather evidence: error rates, performance metrics, developer friction, customer complaints.393. Confirm the problem is real — not hypothetical, not premature optimization.404. Check if someone has already proposed a solution (search existing RFCs, ADRs, Slack threads).4142### Step 2: Research Alternatives Thoroughly4344For every RFC, evaluate at minimum:45461. **Do nothing** — What happens if we don't make this change? Sometimes the status quo is the right choice.472. **The proposed solution** — Your recommended approach.483. **At least one alternative** — A meaningfully different approach, not a strawman.4950For each alternative, assess against our stack:5152| Concern | Questions to Answer |53|---------|-------------------|54| **Rails backend** | Does it work with our service object pattern? Panko serialization? Sidekiq jobs? |55| **React Native** | Does it work with Zustand state management? TanStack Query? Is the npm package actively maintained? |56| **PostgreSQL/PostGIS** | What schema changes are needed? Migration strategy? Spatial query impact? |57| **Centrifugo** | Does it affect real-time channels? WebSocket connection patterns? |58| **Redis** | Cache invalidation impact? Sidekiq queue changes? |59| **Infrastructure** | Terraform changes? Docker Compose updates? AWS/GCP service additions? |60| **Team** | Learning curve? Hiring impact? On-call complexity? |6162### Step 3: Write the RFC6364Use the template in `references/rfc-guide.md`. Every section is mandatory — if a section is not applicable, write "N/A" with a one-sentence explanation of why.6566Key writing principles:6768- **Lead with the problem, not the solution.** The reader must feel the pain before evaluating the fix.69- **Be specific.** "Improves performance" is useless. "Reduces p95 API latency from 450ms to under 100ms by eliminating N+1 queries in the order listing endpoint" is useful.70- **Show your work.** Include benchmarks, prototypes, proof-of-concept results, or load test data.71- **Name the risks honestly.** A proposal that claims zero downsides is not credible.72- **Write for the skeptic.** Assume the reader's default position is "no" — persuade them with evidence.73- **Keep it under 3 pages.** If the RFC is longer, the proposal is probably too big. Split it.7475### Step 4: Stack-Specific Impact Assessment7677Every RFC must include an impact assessment against our stack. Use this checklist:7879#### Backend Impact80- [ ] Rails routes, controllers, or middleware changes81- [ ] Service object interface changes82- [ ] Panko serializer additions or modifications83- [ ] Sidekiq job changes (new queues, changed priorities, retry behavior)84- [ ] Gem additions or upgrades (check license, maintenance status, download count)8586#### Frontend Impact87- [ ] React Native screen or component changes88- [ ] Zustand store modifications89- [ ] TanStack Query cache key or fetching pattern changes90- [ ] New npm package additions (check bundle size, maintenance, React Native compatibility)91- [ ] Centrifugo subscription changes9293#### Data Impact94- [ ] PostgreSQL schema migrations (use expand/contract for breaking changes)95- [ ] PostGIS spatial column or index changes96- [ ] Redis key namespace or TTL changes97- [ ] Data backfill required (estimate volume and duration)9899#### Infrastructure Impact100- [ ] Terraform resource additions or changes101- [ ] Docker Compose service modifications102- [ ] Environment variable additions103- [ ] CI/CD pipeline changes104- [ ] Monitoring and alerting updates105106### Step 5: Define the Migration Path107108If the RFC changes existing behavior, the migration path must:1091101. Be **incremental** — no big-bang switchover.1112. Support **rollback** at every step.1123. Define **done criteria** — how do we know the migration is complete?1134. Estimate **effort** in developer-days (not story points).1145. Identify **who** does each step.115116### Step 6: Specify the Review Process1171181. List required reviewers by role (backend lead, frontend lead, DevOps, etc.).1192. Set a review deadline (default: 5 business days).1203. Define the decision process: consensus, maintainer approval, or tech lead decision.1214. Specify how feedback is incorporated: comment threads on the RFC document.122123## Output Format124125Produce the RFC using the template from `references/rfc-guide.md`. The output must be a complete, ready-to-share document — not a skeleton or placeholder.126127## Relationship to ADRs128129- **RFC** = "Should we do X?" (pre-decision proposal, invites debate)130- **ADR** = "We decided X because Y." (post-decision record, documents outcome)131132After an RFC is accepted, create a corresponding ADR using the `/doc-generator` skill to permanently record the decision. Reference the RFC number in the ADR.