Write technical proposals and decision documents that get approved, with problem framing, costed options, risks, and rollout plans. Use when drafting, reviewing, or revising an internal proposal, design doc, RFC-style document, or decision record.
./install.sh technical-proposal-writingname: technical_proposal_writing description: Write technical proposals and decision documents that get approved, with problem framing, costed options, risks, and rollout plans. Use when drafting, reviewing, or revising an internal proposal, design doc, RFC-style document, or decision record. metadata: { "includeInPrompt": true }
This skill produces internal technical proposals and decision documents that a reviewer can approve, reject, or send back with specific comments in one reading. A good proposal states the decision requested up front, grounds the problem in evidence, compares real options with real costs, names the risks, and says how the work rolls out, how it rolls back, and when the decision gets revisited.
Use it for design proposals, migration plans, tool or vendor selections, architecture changes, process changes with technical consequences, and any document where a team must pick one option and live with the result.
Related formats exist in the wild, including RFC-style comment rounds and architecture decision records that log a choice after it is made. This skill stays general: it covers the proposal before and during the decision, and it treats the final decision note as part of the same document. Adapt section names to local convention where a local convention exists.
Not this skill:
Copy this skeleton and fill every section. Write "none" or "unknown, owner: role" where a section genuinely has nothing yet, rather than deleting the section.
markdown
# Proposal: [short title]
Status: draft / in review / approved / rejected / deferred
Decider: [role or group]
Decision needed by: [YYYY-MM-DD]
Revisit date: [YYYY-MM-DD]
Author: [role]
Version: [n, with date]
## Decision requested
[One or two sentences. The exact choice the decider is asked to make.]
## Problem
[What is wrong or missing. Who or what it affects. How often, how badly.]
## Evidence
- [Measured fact, with source and date.]
- [Measured fact, with source and date.]
- [Estimate, labeled as an estimate, with its basis.]
## Constraints and non-goals
- Constraint: [...]
- Non-goal: [...]
## Options
### Option A: Status quo
[What stays the same. Cost of staying, in money, time, or continued impact.]
### Option B: [name]
[What changes. Build cost. Run cost. Cost to leave later. Constraints strained.]
### Option C: [name]
[Same fields as Option B.]
## Recommendation
[Recommended option, the reason tied to evidence and costs, and the strongest
argument against it with a direct answer.]
## Risks
| Risk | Likelihood | Impact | Early signal | Mitigation |
| --- | --- | --- | --- | --- |
| [...] | [...] | [...] | [...] | [...] |
## Rollout plan
1. [Stage, what ships, who does it, how success is checked.]
2. [Stage, with the last cheap stopping point marked.]
## Rollback plan
- Trigger: [...]
- Steps: [...]
- Time to roll back: [...]
- State after rollback: [...]
- Point of no return, if any: [...]
## Open questions
- [Question, owner by role, date needed by.]
## Decision record
Decision: [pending]
Decided by: [...]
Date: [...]
Conditions: [...]
Save the code below as check.py, then run it against a draft saved as a Markdown file:
bash
python3 check.py proposal.md
The checker looks for required sections, a revisit date in YYYY-MM-DD form, a decision record, and leftover placeholder markers. It prints one line per check and exits with code 1 when any required item is missing. It checks structure only. It cannot judge whether the evidence is sound or the costs are honest.
python
#!/usr/bin/env python3
"""Check a technical proposal draft for required sections.
Usage: python3 check.py proposal.md
Exit code 0 when all required checks pass, 1 otherwise.
Standard library only.
"""
import re
import sys
REQUIRED = [
("Decision requested", r"decision requested|decision required"),
("Problem", r"^#{1,4}\s+problem\b"),
("Evidence", r"evidence"),
("Constraints or non-goals", r"constraints|non-goals|non goals"),
("Options", r"^#{1,4}\s+options\b"),
("Status quo option", r"status quo|do nothing|current state"),
("Recommendation", r"recommendation|recommended"),
("Risks", r"^#{1,4}\s+risks?\b"),
("Rollout plan", r"rollout|roll-out|implementation plan"),
("Rollback plan", r"rollback|roll back|revert plan"),
("Open questions", r"open questions|unresolved"),
("Decision record", r"decision record|decision:"),
]
PLACEHOLDERS = ["TODO", "TBD", "FIXME", "XXX", "[...]"]
def main():
if len(sys.argv) != 2:
print("usage: python3 check.py proposal.md")
return 2
with open(sys.argv[1], "r", encoding="utf-8") as handle:
text = handle.read()
lowered = text.lower()
failures = 0
for label, pattern in REQUIRED:
found = re.search(pattern, lowered, re.MULTILINE)
status = "PASS" if found else "FAIL"
if not found:
failures += 1
print(f"{status}: section present: {label}")
date_match = re.search(r"revisit date:\s*(\d{4}-\d{2}-\d{2})", lowered)
if date_match:
print(f"PASS: revisit date found: {date_match.group(1)}")
else:
failures += 1
print("FAIL: revisit date missing or not in YYYY-MM-DD form")
needed_match = re.search(r"decision needed by:\s*(\d{4}-\d{2}-\d{2})", lowered)
if needed_match:
print(f"PASS: decision needed by date found: {needed_match.group(1)}")
else:
print("WARN: no 'Decision needed by' date in YYYY-MM-DD form")
words = len(text.split())
print(f"INFO: word count: {words}")
if words < 150:
print("WARN: draft is very short; evidence and costs are likely thin")
for marker in PLACEHOLDERS:
count = text.count(marker)
if count:
print(f"WARN: placeholder {marker!r} appears {count} time(s)")
if failures:
print(f"RESULT: {failures} required check(s) failed")
return 1
print("RESULT: all required checks passed")
return 0
if __name__ == "__main__":
sys.exit(main())
Worked example: save the template skeleton above as proposal.md, replace the two date placeholders with real dates in YYYY-MM-DD form, and run the checker. Verified on that filled skeleton: all 12 section checks pass, both date checks pass, and the checker exits with code 0. On a bare one-paragraph draft with no sections, all section checks fail and the checker exits with code 1. Structure can be checked early, while the writing is still cheap to change. Cost figures, risk quality, and evidence quality still need a human reader.
A finished run of this skill delivers:
Length follows the decision. A small reversible choice can be one or two pages. A costly or hard to reverse choice needs the full treatment, and the document should say plainly which kind it is near the top.
publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.