Change Request
Draft-first: parse what the user gave, fill the schema, run the script. Only interview if the user explicitly asks.
Why this skill exists
Change requests are high-stakes governance artifacts. Baselines of scope/schedule/cost only move through a formal CR, so the artifact needs to be auditable: every impact number traceable to the requestor, every CCB member named by the user, and disposition left blank until the user says a decision was made. Unskilled baselines fabricate with enthusiasm here — they convert "maybe a week" to "5 business days," invent CCB rosters ("PM, Sponsor, Tech Lead"), and auto-stamp "Approved" on a request that was merely submitted. This skill refuses all of that.
Hard rules
- Never invent impact numbers. If the user said "maybe a week" or "a few thousand dollars," that stays as the verbatim phrase with a
[TBD — user said "maybe a week"] marker in the structured slot. Do NOT convert to 5 days or $3,000.
- Never invent CCB members. The Change Control Board roster is whoever the user named. If the user said "went to the CCB," the member list is
[TBD — CCB roster not stated]. Do not default-fill "PM, Sponsor, Tech Lead."
- Disposition defaults to Submitted. Valid dispositions:
Submitted | Under Review | Approved | Rejected | Deferred | Withdrawn. Unless the user explicitly stated a decision, disposition is Submitted and the approval block is empty. Never stamp Approved based on tone.
- Requestor is not the PM by default. If the user says "Marcus is asking for …," Marcus is the requestor. The PM field is only populated if the user names the PM separately.
- Baseline version only moves on approval. If disposition is Approved, the script increments the baseline tag (e.g., v1.0 → v1.1). If disposition is anything else, the baseline version is unchanged and a note says "No baseline change — request [status]."
- Risk vs Issue discipline carries over. If the user describes something currently biting the project as justification for the CR, it's an issue in the context section, not a risk introduced by the change.
- Preserve fuzzy quantities. "2-3 weeks," "~$10k," "a couple engineers" stay as exact strings in a
user_estimate field. The structured numeric fields (schedule_impact_days, cost_impact_usd) stay null/TBD until the user gives a single value.
- Reporting-line managers never appear. If the user says "Marcus reports to Raj," Raj does not appear in CCB, approvals, or impact sections. Full stop.
- Options considered is optional but honest. If the user only described the one change,
options_considered is an empty array. Do not manufacture a fake "Option B: do nothing" unless the user said it.
- Fidelity pass. Every field — description, impact bullet, CCB member, option — must trace to a verbatim phrase in the user's message. If you can't cite it, leave the slot empty.
Run
python3 scripts/create_change_request.py --output "<dir>/<ProjectName>_CR_<id>.docx" <<'JSON'
{ ...schema... }
JSON
Script produces a .docx with fixed section order: Header → Request Summary → Description & Justification → Impact Analysis (scope/schedule/cost/resources/quality/risk) → Options Considered → Recommendation → CCB / Approvals → Disposition & Baseline Version → Appendix (Draft Gaps).
JSON schema
{
"header": {
"cr_id": "string (e.g., CR-0007)",
"cr_title": "string",
"project_name": "string",
"requestor": "string",
"project_manager": "string or [TBD]",
"sponsor": "string or [TBD]",
"date_submitted": "YYYY-MM-DD",
"current_baseline_version": "string (e.g., v1.0)"
},
"category": "Scope | Schedule | Cost | Quality | Resource | [TBD]",
"priority": "Low | Medium | High | Critical | [TBD]",
"description": "string — what is being requested, in user's words",
"justification": "string — why, in user's words",
"impact": {
"scope": "string or empty",
"schedule_impact_days": "integer or null",
"schedule_user_estimate": "string or empty (verbatim fuzzy phrase)",
"cost_impact_usd": "number or null",
"cost_user_estimate": "string or empty (verbatim fuzzy phrase)",
"resources": "string or empty",
"quality": "string or empty",
"risk": "string or empty"
},
"options_considered": [
{"option": "string", "pros": "string", "cons": "string"}
],
"recommendation": "string or [TBD]",
"ccb_members": ["string — names user provided"],
"approvals": [
{"name": "string", "role": "string", "decision": "Approve | Reject | Defer | Pending", "date": "YYYY-MM-DD or empty"}
],
"disposition": "Submitted | Under Review | Approved | Rejected | Deferred | Withdrawn"
}
Notes:
schedule_impact_days is an integer ONLY if the user gave a precise number of days. Otherwise leave null and put the verbatim phrase in schedule_user_estimate.
cost_impact_usd same rule — null unless the user gave a specific dollar figure.
approvals is empty unless the user said "X approved" or "Y rejected." Listing CCB members is separate from listing decisions.
- If
disposition == "Approved" the script increments the baseline version and records the new version; otherwise the baseline stays put.
Worked example
User: "Need a change request for Project Aurora. Marcus is asking to add mobile push notifications to the MVP. He says it'll take maybe 2 weeks of Jen's time and probably a few thousand dollars in Firebase costs. We haven't gone to the CCB yet — just drafting. Ken PM, Mei Tanaka sponsor. Current baseline v1.2. Marcus reports to Raj."
Correct JSON:
{
"header": {
"cr_id": "[TBD — no CR ID stated]",
"cr_title": "Add mobile push notifications to MVP",
"project_name": "Project Aurora",
"requestor": "Marcus",
"project_manager": "Ken",
"sponsor": "Mei Tanaka",
"date_submitted": "[TBD]",
"current_baseline_version": "v1.2"
},
"category": "Scope",
"priority": "[TBD]",
"description": "Add mobile push notifications to the MVP",
"justification": "[TBD — requestor did not state justification]",
"impact": {
"scope": "Adds mobile push notification feature to MVP",
"schedule_impact_days": null,
"schedule_user_estimate": "maybe 2 weeks of Jen's time",
"cost_impact_usd": null,
"cost_user_estimate": "probably a few thousand dollars in Firebase costs",
"resources": "Jen",
"quality": "",
"risk": ""
},
"options_considered": [],
"recommendation": "[TBD]",
"ccb_members": [],
"approvals": [],
"disposition": "Submitted"
}
Note: Raj is NOT in CCB or approvals. Jen is a resource (named by requestor). "2 weeks" stays as text — NOT converted to schedule_impact_days: 10. "A few thousand dollars" stays as text — NOT converted to cost_impact_usd: 3000. Disposition is Submitted because the user said "haven't gone to the CCB yet." Baseline version does NOT increment.
Grounding (Project+)
Change control is the formal process for altering a baseline (scope, schedule, cost, or quality). The Change Control Board (CCB) is the governance body that dispositions each request. Project+ emphasizes that change requests preserve baseline integrity: nothing moves until a formal disposition is recorded. This skill enforces that structurally — the baseline version field is bound to the disposition field, so the artifact itself cannot claim a baseline shift that wasn't approved.
1---2name: change-request3description: Generate a Project+ style change request as .docx — request metadata, description, impact analysis across scope/schedule/cost/quality/resources/risk, options considered, recommendation, and CCB approval block. Use whenever a user needs a change request, CR, change control form, scope change document, RFC, or baseline change. Triggers include "change request", "CR", "change control", "scope change", "baseline change", "RFC". Enforces never-invent discipline for impact numbers, CCB members, and disposition — and preserves the user's fuzzy estimates exactly.4---56# Change Request78Draft-first: parse what the user gave, fill the schema, run the script. Only interview if the user explicitly asks.910## Why this skill exists1112Change requests are high-stakes governance artifacts. Baselines of scope/schedule/cost only move through a formal CR, so the artifact needs to be **auditable**: every impact number traceable to the requestor, every CCB member named by the user, and disposition left blank until the user says a decision was made. Unskilled baselines fabricate with enthusiasm here — they convert "maybe a week" to "5 business days," invent CCB rosters ("PM, Sponsor, Tech Lead"), and auto-stamp "Approved" on a request that was merely *submitted*. This skill refuses all of that.1314## Hard rules15161. **Never invent impact numbers.** If the user said "maybe a week" or "a few thousand dollars," that stays as the verbatim phrase with a `[TBD — user said "maybe a week"]` marker in the structured slot. Do NOT convert to 5 days or $3,000.172. **Never invent CCB members.** The Change Control Board roster is whoever the user named. If the user said "went to the CCB," the member list is `[TBD — CCB roster not stated]`. Do not default-fill "PM, Sponsor, Tech Lead."183. **Disposition defaults to Submitted.** Valid dispositions: `Submitted | Under Review | Approved | Rejected | Deferred | Withdrawn`. Unless the user explicitly stated a decision, disposition is `Submitted` and the approval block is empty. Never stamp Approved based on tone.194. **Requestor is not the PM by default.** If the user says "Marcus is asking for …," Marcus is the requestor. The PM field is only populated if the user names the PM separately.205. **Baseline version only moves on approval.** If disposition is Approved, the script increments the baseline tag (e.g., v1.0 → v1.1). If disposition is anything else, the baseline version is unchanged and a note says "No baseline change — request [status]."216. **Risk vs Issue discipline carries over.** If the user describes something currently biting the project as justification for the CR, it's an **issue** in the context section, not a risk introduced by the change.227. **Preserve fuzzy quantities.** "2-3 weeks," "~$10k," "a couple engineers" stay as exact strings in a `user_estimate` field. The structured numeric fields (`schedule_impact_days`, `cost_impact_usd`) stay null/TBD until the user gives a single value.238. **Reporting-line managers never appear.** If the user says "Marcus reports to Raj," Raj does not appear in CCB, approvals, or impact sections. Full stop.249. **Options considered is optional but honest.** If the user only described the one change, `options_considered` is an empty array. Do not manufacture a fake "Option B: do nothing" unless the user said it.2510. **Fidelity pass.** Every field — description, impact bullet, CCB member, option — must trace to a verbatim phrase in the user's message. If you can't cite it, leave the slot empty.2627## Run2829```bash30python3 scripts/create_change_request.py --output "<dir>/<ProjectName>_CR_<id>.docx" <<'JSON'31{ ...schema... }32JSON33```3435Script produces a .docx with fixed section order: Header → Request Summary → Description & Justification → Impact Analysis (scope/schedule/cost/resources/quality/risk) → Options Considered → Recommendation → CCB / Approvals → Disposition & Baseline Version → Appendix (Draft Gaps).3637## JSON schema3839```json40{41 "header": {42 "cr_id": "string (e.g., CR-0007)",43 "cr_title": "string",44 "project_name": "string",45 "requestor": "string",46 "project_manager": "string or [TBD]",47 "sponsor": "string or [TBD]",48 "date_submitted": "YYYY-MM-DD",49 "current_baseline_version": "string (e.g., v1.0)"50 },51 "category": "Scope | Schedule | Cost | Quality | Resource | [TBD]",52 "priority": "Low | Medium | High | Critical | [TBD]",53 "description": "string — what is being requested, in user's words",54 "justification": "string — why, in user's words",55 "impact": {56 "scope": "string or empty",57 "schedule_impact_days": "integer or null",58 "schedule_user_estimate": "string or empty (verbatim fuzzy phrase)",59 "cost_impact_usd": "number or null",60 "cost_user_estimate": "string or empty (verbatim fuzzy phrase)",61 "resources": "string or empty",62 "quality": "string or empty",63 "risk": "string or empty"64 },65 "options_considered": [66 {"option": "string", "pros": "string", "cons": "string"}67 ],68 "recommendation": "string or [TBD]",69 "ccb_members": ["string — names user provided"],70 "approvals": [71 {"name": "string", "role": "string", "decision": "Approve | Reject | Defer | Pending", "date": "YYYY-MM-DD or empty"}72 ],73 "disposition": "Submitted | Under Review | Approved | Rejected | Deferred | Withdrawn"74}75```7677Notes:78- `schedule_impact_days` is an integer ONLY if the user gave a precise number of days. Otherwise leave null and put the verbatim phrase in `schedule_user_estimate`.79- `cost_impact_usd` same rule — null unless the user gave a specific dollar figure.80- `approvals` is empty unless the user said "X approved" or "Y rejected." Listing CCB *members* is separate from listing *decisions*.81- If `disposition == "Approved"` the script increments the baseline version and records the new version; otherwise the baseline stays put.8283## Worked example8485User: *"Need a change request for Project Aurora. Marcus is asking to add mobile push notifications to the MVP. He says it'll take maybe 2 weeks of Jen's time and probably a few thousand dollars in Firebase costs. We haven't gone to the CCB yet — just drafting. Ken PM, Mei Tanaka sponsor. Current baseline v1.2. Marcus reports to Raj."*8687Correct JSON:88```json89{90 "header": {91 "cr_id": "[TBD — no CR ID stated]",92 "cr_title": "Add mobile push notifications to MVP",93 "project_name": "Project Aurora",94 "requestor": "Marcus",95 "project_manager": "Ken",96 "sponsor": "Mei Tanaka",97 "date_submitted": "[TBD]",98 "current_baseline_version": "v1.2"99 },100 "category": "Scope",101 "priority": "[TBD]",102 "description": "Add mobile push notifications to the MVP",103 "justification": "[TBD — requestor did not state justification]",104 "impact": {105 "scope": "Adds mobile push notification feature to MVP",106 "schedule_impact_days": null,107 "schedule_user_estimate": "maybe 2 weeks of Jen's time",108 "cost_impact_usd": null,109 "cost_user_estimate": "probably a few thousand dollars in Firebase costs",110 "resources": "Jen",111 "quality": "",112 "risk": ""113 },114 "options_considered": [],115 "recommendation": "[TBD]",116 "ccb_members": [],117 "approvals": [],118 "disposition": "Submitted"119}120```121122Note: Raj is NOT in CCB or approvals. Jen is a resource (named by requestor). "2 weeks" stays as text — NOT converted to `schedule_impact_days: 10`. "A few thousand dollars" stays as text — NOT converted to `cost_impact_usd: 3000`. Disposition is `Submitted` because the user said "haven't gone to the CCB yet." Baseline version does NOT increment.123124## Grounding (Project+)125126Change control is the formal process for altering a baseline (scope, schedule, cost, or quality). The Change Control Board (CCB) is the governance body that dispositions each request. Project+ emphasizes that change requests preserve baseline integrity: nothing moves until a formal disposition is recorded. This skill enforces that structurally — the baseline version field is bound to the disposition field, so the artifact itself cannot claim a baseline shift that wasn't approved.