/add-planning-project
Add a new project to the PM Planning Suite. Each project gets its own configuration space under .planning-config/projects/<project-name>/.
Prerequisites
- The planning suite must be initialized first (
/init-planning-suite).
- If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
File Creation
All files under .planning-config/ are pre-approved for creation and modification. The user consented when they ran /init-planning-suite. DO NOT ask for permission to create project.json, subdirectories, or any other file under .planning-config/. Write them directly.
Steps
Step 1: Get Project Name
If not provided as input (e.g., passed from /init-planning-suite), prompt: "What is the project name?"
Derive the directory name by sanitizing the project name into a filesystem-safe slug:
- convert to lowercase
- replace any sequence of spaces or non-alphanumeric characters with a single hyphen
- trim leading and trailing hyphens
- if the result is empty, ask the user for a different project name
Examples:
- "Contoso Platform" ->
contoso-platform
- "Contoso/Platform: Core" ->
contoso-platform-core
If sanitization changes the derived directory name, tell the user: "I'll store this project under .planning-config/projects/<project-dir>/." If the project name was just provided by the init skill in the same session, do not ask the user to confirm it again after showing the derived directory name. Proceed directly.
Check if .planning-config/projects/<project-dir>/ already exists. If it does, inform the user and ask if they want to reconfigure it.
Step 2: Create the Project Directory
Create the entire directory structure immediately. Do not ask the user about individual directories - just create them all:
.planning-config/projects/<project-dir>/
project.json
capacity/
planning/
specs/
meetings/
All directories are created in a single step with no prompts. They are part of the standard project scaffold.
Step 3: Gather Project Settings
Walk the user through the project configuration. Accept answers one at a time.
Required Settings
ADO organization and project - The approach depends on whether other projects already exist:
- First project (no other projects in
.planning-config/projects/): Ask directly:
- "What is your Azure DevOps organization URL? (e.g., 'contoso.visualstudio.com' or 'dev.azure.com/contoso')"
- "What is the ADO project name? (e.g., 'ContosoOS')"
- Subsequent projects (at least one project already exists): Read the ADO organization and project from the first existing project's
project.json and offer to inherit:
- "Your existing project uses ADO organization
{org} and project {project}. Does this new project use the same ADO organization and project? (yes/no)"
- If yes, inherit both values.
- If no, ask for both values individually.
Area Path - "What Area Path should new work items use? (e.g., 'ContosoOS\Engineering\Platform\Core')"
Iteration Path prefix - "What is the Iteration Path prefix? (e.g., 'ContosoOS' if iterations are 'ContosoOS\2604')"
Default assignee - "Who should new scenarios be assigned to by default? (email)"
Placeholder assignee - "Who should costing deliverables and auto-generated work items be initially assigned to? This is the person or account that holds new items before they are distributed to the team - often a team lead, a shared triage alias, or a dedicated placeholder account. (email)"
Optional Settings
Parent objective ID - "Is there a parent Initiative/Objective ID that new scenarios should link to? (Enter an ADO work item ID or 'skip')"
Team members (FTE) - "Would you like to define your FTE team members now? Team data is used by several skills: Engineering Team Capacity uses it to calculate available engineer-days, Scenario Original Estimate uses expertise profiles to adjust cost estimates, and WBS Assignments uses it to match deliverables to the right people. You can add or edit members later in project.json. (yes/no/skip)"
- If yes, offer two entry modes:
- Batch entry (recommended for 3+ members): "You can paste a table of team members. Format: Name, Email, Role, Expertise, Allocation - one member per line, separated by tabs or commas. Example:
Jane Smith, jsmith@contoso.com, Senior SWE, backend C# ASP.NET Core, 0.8
Carlos Rivera, crivera@contoso.com, Data Scientist, Python ML Azure ML Kusto, 0.7
Paste your table, or type 'one-by-one' to enter members individually."
- Individual entry: Collect for each member:
- Name - Display name (e.g., "Jane Smith")
- Email - ADO identity email (e.g., "jsmith@contoso.com")
- Role - Job title or function (e.g., "Senior SWE", "Data Scientist", "Principal SWE")
- Expertise areas - Comma-separated list of technologies, domains, or skills (e.g., "backend, C#, ASP.NET Core, Azure Functions")
- Default allocation - What percentage of this person's time is on this project? Enter 0.0 to 1.0. (e.g., 0.8 for 80%). This is used as the starting point by Engineering Team Capacity; it can be adjusted per planning period.
- After entry, display the team table for confirmation before saving.
- If skipped, inform the user: "Skills that need team data (Engineering Team Capacity, WBS Assignments) will prompt you to add team members when you run them."
Team members (Vendor) - Same collection flow as FTE above (batch or individual). Vendor members are stored separately and may be treated differently by capacity calculations (see Capacity Model).
- If skipped, same informational message as FTE.
Vendor responsibilities - Only ask this if vendor team members were defined. "Are there specific work areas owned by the vendor team? For example, some teams route all UI work, security/SFI work, or deployment work to vendor members. (yes/no/skip)"
Categories - "Would you like to define planning categories for this project? These are used by the Scenario Categorization skill to organize your backlog. (yes/no/skip)"
- If yes, offer two entry modes:
- Batch entry: "You can paste categories as a list. Format: Category Name - Description, one per line. Example:
Core Platform - Foundational platform capabilities, APIs, and services
Infrastructure - Architecture modernization, tech debt, CI/CD, monitoring
Paste your list, or type 'one-by-one' to enter individually."
- Individual entry: Collect category name and description one at a time until "done".
- After entry, display the category list for confirmation.
Repositories - "Do you have a local Git repository for this project? Adding a local repository enables the planning suite to automatically build a tech stack profile by scanning your codebase. This tech stack profile is used by the Scenario Original Estimate skill to produce more accurate cost estimates grounded in your actual technology choices, and by WBS Assignments to match deliverables to team members with the right expertise. You can always add one later by editing project.json. (yes/no/skip)"
- If yes, collect: repo name and local path. Description is optional - if the user does not provide one, use the repo name as the description.
- After collecting repositories, automatically scan the codebase to populate
tech_stack_description:
- Examine package manifests (package.json, requirements.txt, .csproj, go.mod, Cargo.toml, etc.)
- Identify languages, frameworks, cloud services, databases, and infrastructure patterns
- Write a concise summary to
tech_stack_description in project.json
- Show the generated tech stack summary to the user for confirmation
- If the user skips or says no, leave
repositories empty and tech_stack_description empty. Inform them: "You can add repositories later by editing project.json. Skills that use tech stack context will prompt you for a repository at that time."
Documentation sources - "Does your project have existing documentation that could help with planning? This could be a SharePoint site, wiki, design docs, spec library, or any other source of project knowledge. The Scenario Description Generator and estimation skills use these sources to produce better descriptions and more accurate estimates. (yes/no/skip)"
- If yes, offer batch entry: "You can paste documentation sources as a list. Format: Name, URL, Type, Description - one per line. Example:
Design Specs, https://contoso.sharepoint.com/sites/Platform/Specs, sharepoint, Feature specs and design reviews
Team Wiki, https://dev.azure.com/contoso/wiki, wiki, Runbooks and operational docs
Paste your list, or type 'one-by-one' to enter individually."
- Write to
documentation_sources array in project.json
- If skipped, leave empty. Inform: "You can add documentation sources later by editing project.json."
Capacity model - "Which capacity calculation model should this project use? This determines how discount days (learning, training, holidays) are applied to your team's available time."
Present these two options with explanations:
Default (recommended for most teams) - Discount days are subtracted from the gross working days first, then the allocation percentage is applied. This means everyone on the team loses the same proportion of discount days regardless of their allocation. Formula: Effective days = (Gross working days - Discount days) x Allocation. Example: 65 gross days - 5 discount days = 60 net days x 0.8 allocation = 48 effective days.
Post-allocation, FTE-only - Allocation is applied first, then discount days are subtracted only from FTE members. Vendor team members are not subject to discount days at all (they do not participate in organizational learning days, training, etc.). Formula for FTE: (Gross days x Allocation) - Discount days. Formula for Vendor: Gross days x Allocation. Example FTE: 65 gross days x 0.8 allocation = 52 days - 5 discounts = 47 effective days. Example Vendor: 65 gross days x 0.6 allocation = 39 effective days (no discounts).
If the user is unsure, recommend "default".
Step 4: Write project.json
Assemble all gathered values into .planning-config/projects/<project-dir>/project.json:
{
"project_name": "<display name>",
"ado": {
"organization": "<org>",
"project": "<project>",
"area_path": "<area path>",
"iteration_path_prefix": "<prefix>",
"parent_objective_id": null,
"work_item_types": {
"scenario": "Scenario",
"deliverable": "Deliverable"
}
},
"team": {
"default_assignee": "<email>",
"placeholder_assignee": "<email>",
"members_fte": [],
"members_vendor": [],
"vendor_responsibilities": {}
},
"fiscal_calendar": {
"fiscal_year_start_month": null,
"current_fiscal_year": null,
"current_quarter": null
},
"categories": [],
"capacity_model": "default",
"repositories": [],
"tech_stack_description": "",
"documentation_sources": [],
"ranking_bands": null,
"horizontal_budgets": null
}
Fill in all user-provided values. Leave optional fields as null or empty arrays if skipped.
Note: fiscal_calendar.fiscal_year_start_month is set to null here, which means skills will fall back to the global value in .planning-config/config.json. Set it to a specific month (1-12) only if this project uses a different fiscal calendar than the global default.
Step 5: Summary
Output:
Project "<display name>" configured.
Config: .planning-config/projects/<project-dir>/project.json
Capacity: .planning-config/projects/<project-dir>/capacity/
Planning: .planning-config/projects/<project-dir>/planning/
Meetings: .planning-config/projects/<project-dir>/meetings/
Settings:
ADO Org: <org>
ADO Project: <project>
Area Path: <area path>
Default Assignee: <email>
Team Size: X FTE + Y Vendor
Categories: X defined
Capacity Model: <model>
Tip: Save meeting transcripts (.vtt, .txt, .md) in the meetings/ folder.
They are automatically version-controlled and used as context by
description and estimation skills.
You can edit project.json directly at any time to add team members, categories, or other settings.
A sample configuration is available at: config/sample-project.json
Guardrails
- Do not overwrite an existing project.json without user confirmation.
- Do not assume values. Always ask or use explicit defaults from config.json.
- Validate that email addresses contain an @ symbol.
- If ADO MCP is available, optionally validate the organization and project are reachable.
- Repository access is pre-approved. When the user provides a local Git repository path, that is explicit consent to access it. Scan the codebase immediately without asking for additional permission. Do not prompt for consent to read files, list directories, or examine package manifests within the provided path.
- NEVER ask for file creation or write permission for anything under
.planning-config/. This is pre-approved. See the File Creation section above.
type: skill
lifecycle: stable
inheritance: inheritable
name: ado-hygiene-validator
description: Validates ADO Scenario and Deliverable work items against planning hygiene standards. Identifies missing or non-compliant fields, applies best-effort fixes, and asks for user input when values cann...
tier: standard
applyTo: '/planning,/scenario,/wbs,/capacity'
currency: 2026-05-03
lastReviewed: 2026-05-03
ADO Hygiene Validator
Validates ADO Scenario and Deliverable work items against planning hygiene standards. Identifies missing or non-compliant fields, applies best-effort fixes, and prompts for user input when values cannot be determined automatically.
Prerequisites
- Planning suite must be initialized. If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
- A project must be configured. If no projects exist under
.planning-config/projects/, instruct the user to run /add-planning-project first.
Inputs
- Work item IDs, an ADO query, or a backlog to scope the validation.
- ADO organization and project are read from
.planning-config/projects/<project>/project.json — never hardcode these values.
Execution Steps
- Resolve project context. Read
.planning-config/projects/<project>/project.json to obtain ado.organization, ado.project, and any other project-level settings (e.g., ado.parent_objective_id, ado.area_path, team.members_fte, team.members_vendor).
- Retrieve work items from the provided IDs, ADO query, or backlog.
- Filter to only Scenario and Deliverable work item types. Ignore all other types.
- Run the appropriate checklist against each work item (Scenario checklist or Deliverable checklist).
- Apply auto-fixes where indicated. Do not modify fields that already pass.
- Flag items needing user input when a value cannot be determined automatically.
- Present results as a per-item table grouped into Passing, Failing, and Needs Input sections.
- Summarize changes applied at the end.
Scenario Checklist (21 Checks)
| # |
Check |
Auto-Fixable |
Fix Behavior |
| 1 |
Title follows outcome format |
Yes |
Rewrite to outcome phrasing, preserve any leading emoji |
| 2 |
Parented to Initiative |
Yes |
Link to parent if parent_objective_id is configured in project.json |
| 3 |
Has child Deliverables |
No |
Flag — user must create Deliverables |
| 4 |
Assigned To populated |
No |
Flag — requires user input |
| 5 |
Area Path correct |
No |
Flag — compare against project.json area_path |
| 6 |
State appropriate |
No |
Flag — verify state is valid for current planning phase |
| 7 |
Tags correct, no contradictions |
No |
Flag contradictory tags and remove them only with explicit user approval |
| 8 |
Iteration Path set |
No |
Flag — requires user input |
| 9 |
Description answers 5 quality questions |
No |
Flag — list which questions are unanswered |
| 10 |
Spec link present in description |
No |
Flag — user must add spec link |
| 11 |
Risk Assessment current |
No |
Flag — check for staleness |
| 12 |
Risk Comment populated if at risk |
No |
Flag — required when Risk Assessment indicates risk |
| 13 |
Original Estimate consistent with estimates skill |
No |
Flag if Original Estimate is present but no corresponding /scenario-original-estimate comment exists; do not clear |
| 14 |
PM Owner populated |
No |
Flag — requires user input |
| 15 |
Dev Owner populated |
Conditional |
Infer from child Deliverables if possible, otherwise flag |
| 16 |
Custom String 07 populated |
Conditional |
Infer from title if possible, otherwise flag |
| 17 |
Custom String 08 in [FYXXQX] format |
Conditional |
Derive from Iteration Path if possible, otherwise flag |
| 18 |
Scenario Spec URL linked |
No |
Flag — user must attach spec |
| 19 |
Rank assigned, does not exceed parent |
No |
Flag — verify rank is set and ≤ parent rank |
| 20 |
Does not span multiple fiscal years |
No |
Flag — check Iteration Path range |
| 21 |
Nice-to-have (rank 51+) in separate scenario |
No |
Flag — advise splitting if mixed priorities |
Deliverable Checklist (8 Checks)
| # |
Check |
Auto-Fixable |
Fix Behavior |
| 1 |
Title follows [Team] [Quarter] [Work] format, with optional [AI Gen] prefix |
Yes |
Rewrite title to match format while preserving or allowing optional [AI Gen] prefix |
| 2 |
Parented to Scenario |
No |
Flag — user must set parent |
| 3 |
Assigned To populated |
No |
Flag — requires user input |
| 4 |
Area Path is team path |
No |
Flag — compare against project.json team_paths |
| 5 |
Original Estimate populated |
No |
Flag — requires user input |
| 6 |
Scope max 4-5 week sprint (≤ 25 days) |
No |
Flag if Original Estimate > 25 days |
| 7 |
Iteration Path set |
No |
Flag — requires user input |
| 8 |
Rank assigned |
No |
Flag — verify rank is set |
Output Format
For each work item, present a table with three sections:
- Passing — checks that passed (collapsed or summarized)
- Failing — checks that failed, with details and any auto-fixes applied
- Needs Input — checks that require user decision, with prompts
End with a Summary listing:
- Total items validated
- Auto-fixes applied (count and details)
- Items still needing user input
Constraints
- Do not assume values that require domain knowledge — prompt the user instead.
- Do not modify fields that already pass validation.
- Only process Scenario and Deliverable work item types. Skip all others.
- Report any ADO API validation errors to the user clearly.
- All ADO org/project values come from
.planning-config/projects/<project>/project.json — never hardcode.
type: skill
lifecycle: stable
inheritance: inheritable
name: cost-analysis
description: Compare AI-generated Scenario Original Estimates against human-entered costing deliverable estimates with per-scenario and portfolio-level variance analysis.
tier: standard
applyTo: '/planning,/scenario,/wbs,/capacity'
currency: 2026-05-03
lastReviewed: 2026-05-03
Cost Analysis
Prerequisites
- Planning suite must be initialized. If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
- A project must be configured. If no projects exist under
.planning-config/projects/, instruct the user to run /add-planning-project first.
Purpose
Compare AI-generated Scenario Original Estimates against human-entered costing deliverable estimates. Produces per-scenario variance and portfolio-level summary to surface estimation alignment or gaps.
Inputs
- ADO query link or work item IDs — a shared query URL or a comma-separated list of Scenario work item IDs.
Steps
1. Resolve Project Context
Load the active project configuration from .planning-config/projects/<project>/project.json. Use the ADO organization, project, and team settings defined there.
2. Parse Input and Execute Query
Accept the user-provided ADO query link or work item IDs. If a query link is provided, execute it to retrieve the list of Scenario work items. If work item IDs are provided, fetch each directly.
3. Identify Scenarios and Expand Children
For each Scenario work item, expand child work items. Locate costing deliverables — these represent the human-entered engineering cost estimates. Costing deliverables are identified by titles containing Costing] (case-insensitive). For backward compatibility, also recognize titles starting with [SWE] or [DS] without the "Costing" keyword.
4. Exclude Cut Deliverables
Filter out any child deliverables tagged or classified as Cut. These are descoped and must not factor into cost comparisons.
5. Extract Cost Data
For each Scenario, extract:
| Field |
Source |
| Scenario Original Estimate |
The AI-generated estimate on the Scenario work item |
| Per-Discipline Cost |
For each discipline found (e.g., SWE, DS, PM), sum the Original Estimate on that discipline's costing deliverables. The discipline name is extracted from the prefix before "Costing]" in the title (e.g., [SWE Costing] → SWE, [DS Costing] → DS). For legacy [SWE]/[DS] titles, use the bracket prefix as the discipline name. |
| Costing Total |
Sum of all per-discipline costs |
6. Calculate Variance
For each Scenario compute:
- Variance (days) = Costing Total − Scenario Original Estimate
- Variance (%) = ((Costing Total − Scenario Original Estimate) / Scenario Original Estimate) × 100
Sign convention: positive variance means humans estimated higher than the AI estimate; negative means humans estimated lower.
7. Classify Alignment Status
Assign each Scenario one of the following statuses based on the absolute variance percentage:
| Status |
Condition |
| Aligned |
Variance within ±20% |
| Minor Gap |
Variance between ±20% and ±50% |
| Significant Gap |
Variance greater than ±50% |
| Not Comparable |
Scenario Original Estimate is zero or missing, preventing meaningful comparison |
| Missing Cost |
No costing deliverables found under the Scenario |
8. Portfolio Summary
Aggregate across all Scenarios:
- Total AI Estimate — sum of Scenario Original Estimates
- Total Human Estimate — sum of Costing Totals
- Coverage — count and percentage of Scenarios that have costing deliverables
- Overall Variance — portfolio-level days and percentage difference
- Status Distribution — count of Scenarios in each alignment category
9. Insights
Surface systematic estimation patterns:
- Consistent over-estimation or under-estimation direction
- Outlier Scenarios with extreme variance
- Areas or teams with recurring gaps
- Recommendations for calibration
Constraints
- Read-only — this skill does not create, update, or delete any ADO work items.
- No consent gate — because no modifications are made, no user confirmation is required before execution.
type: skill
lifecycle: stable
inheritance: inheritable
name: cost-variance-analysis
description: Detailed read-only variance analysis between AI-generated estimates and human costing with summary statistics, largest gaps, and distribution analysis.
tier: standard
applyTo: '/planning,/scenario,/wbs,/capacity'
currency: 2026-05-03
lastReviewed: 2026-05-03
Cost Variance Analysis
Prerequisites
- Planning suite must be initialized. If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
- A project must be configured. If no projects exist under
.planning-config/projects/, instruct the user to run /add-planning-project first.
Purpose
Perform a detailed read-only variance analysis between AI-generated Scenario Original Estimates and human-entered costing deliverable estimates. Produces ranked variance tables, summary statistics, distribution analysis, and identifies the largest estimation gaps.
Inputs
- ADO query link or work item IDs — a shared query URL or a comma-separated list of Scenario work item IDs.
Steps
1. Resolve Project Context
Load the active project configuration from .planning-config/projects/<project>/project.json. Use the ADO organization, project, and team settings defined there.
2. Parse Input and Execute Query
Accept the user-provided ADO query link or work item IDs. If a query link is provided, execute it to retrieve the list of Scenario work items. If work item IDs are provided, fetch each directly.
3. Identify Scenarios and Expand Children
For each Scenario work item, expand child work items. Locate costing deliverables — these represent the human-entered engineering cost estimates. Costing deliverables are identified by titles containing Costing] (case-insensitive). For backward compatibility, also recognize titles starting with [SWE] or [DS] without the "Costing" keyword.
4. Exclude Cut Deliverables
Filter out any child deliverables tagged or classified as Cut. These are descoped and must not factor into cost comparisons.
5. Extract Cost Data
For each Scenario, extract:
| Field |
Source |
| Scenario Original Estimate |
The AI-generated estimate on the Scenario work item |
| Per-Discipline Cost |
For each discipline found (e.g., SWE, DS, PM), sum the Original Estimate on that discipline's costing deliverables. The discipline name is extracted from the prefix before "Costing]" in the title (e.g., [SWE Costing] → SWE, [DS Costing] → DS). For legacy [SWE]/[DS] titles, use the bracket prefix as the discipline name. |
| Costing Total |
Sum of all per-discipline costs |
6. Per-Scenario Variance Table
Build a ranked variance table sorted by absolute variance descending (largest gaps first). Each row includes:
| Column |
Description |
| Rank |
Position by absolute variance (1 = largest gap) |
| Scenario ID |
ADO work item ID |
| Scenario Title |
Work item title |
| AI Estimate (days) |
Scenario Original Estimate |
| Human Estimate (days) |
Costing Total (sum of all discipline costs) |
| Variance (days) |
Human Estimate − AI Estimate |
| Variance (%) |
((Human − AI) / AI) × 100 |
| Direction |
Over (human > AI) or Under (human < AI) |
Sign convention: Positive variance means humans estimated higher than the AI estimate. Negative variance means humans estimated lower.
7. Flag Non-Comparable Items
Separately list Scenarios that cannot be meaningfully compared:
- Missing AI Estimate — Scenario Original Estimate is zero or absent
- Missing Costing — no costing deliverables found
- Partially Costed — only some disciplines present, not all expected disciplines (flag but still include in analysis)
8. Summary Statistics
Produce an aggregate summary across all comparable Scenarios:
| Metric |
Description |
| Comparable Count |
Number of Scenarios with both AI and human estimates |
| Total AI Estimate |
Sum of all Scenario Original Estimates |
| Total Human Estimate |
Sum of all Costing Totals |
| Net Variance (days) |
Total Human − Total AI |
| Net Variance (%) |
((Total Human − Total AI) / Total AI) × 100 |
| Over-Estimated Count |
Scenarios where human > AI |
| Under-Estimated Count |
Scenarios where human < AI |
| Aligned Count |
Scenarios within ±20% variance |
| Mean Absolute Variance (%) |
Average of absolute variance percentages |
| Median Variance (%) |
Median of signed variance percentages |
9. Distribution Analysis
Analyze the distribution of variance across the portfolio:
- Histogram buckets: ≤−50%, −50% to −20%, −20% to +20% (aligned), +20% to +50%, >+50%
- Count and percentage of Scenarios in each bucket
- Skew direction — whether the portfolio trends toward over- or under-estimation
10. Largest Gaps
Highlight the top 5 (or fewer) Scenarios with the largest absolute variance, including:
- Work item link
- Variance in days and percentage
- Brief note on possible contributing factors (e.g., missing costing discipline, scope complexity)
Constraints
- Read-only — this skill does not create, update, or delete any ADO work items.
- No consent gate — because no modifications are made, no user confirmation is required before execution.
type: skill
lifecycle: stable
inheritance: inheritable
name: costing-deliverable-generator
description: Creates costing placeholder deliverables under each Scenario for human cost entry. Supports user-defined disciplines (e.g., SWE, DS, PM, Design).
tier: standard
applyTo: '/planning,/scenario,/wbs,/capacity'
currency: 2026-05-03
lastReviewed: 2026-05-03
Costing Deliverable Generator
Create costing placeholder Deliverable work items under each Scenario. Each costing deliverable represents a discipline (e.g., SWE, DS, PM, Design) and is intended for human cost entry - Original Estimate is left blank.
Prerequisites
- Planning suite must be initialized. If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
- A project must be configured. If no projects exist under
.planning-config/projects/, instruct the user to run /add-planning-project first.
Inputs
Accept any of the following:
- One or more work item IDs (comma-separated or space-separated)
- An ADO query (WIQL or saved query name)
Project Context
Load project configuration from .planning-config/projects/<project>/project.json. Extract:
ado.organization - ADO organization name
ado.project - ADO project name
team.placeholder_assignee - the user to assign costing deliverables to
Discipline Configuration
Before processing scenarios, ask the user to define the costing disciplines for this run.
Prompt: "Costing deliverables let you estimate work by discipline. For example, if your team has Software Engineers and Data Scientists, you might create a costing deliverable for each discipline per scenario. How many costing disciplines do you want per scenario?"
Then for each discipline, ask: "What is the discipline name? (e.g., SWE, DS, PM, Design, QA, Infrastructure)"
The discipline name becomes the prefix in the deliverable title.
Example with 2 disciplines (SWE and DS):
| Title |
Purpose |
[SWE Costing] <scenario title> |
Software engineering cost placeholder |
[DS Costing] <scenario title> |
Data science cost placeholder |
Example with 3 disciplines (SWE, DS, PM):
| Title |
Purpose |
[SWE Costing] <scenario title> |
Software engineering cost placeholder |
[DS Costing] <scenario title> |
Data science cost placeholder |
[PM Costing] <scenario title> |
Program management cost placeholder |
Title format: [{Discipline} Costing] <scenario title>
The word "Costing" is always included in the title to distinguish costing deliverables from functional deliverables. Downstream skills use this pattern to identify costing deliverables.
Execution Steps
- Resolve project context - Read
.planning-config/projects/<project>/project.json. Load organization, project, and placeholder_assignee.
- Gather discipline configuration - Ask the user how many disciplines and collect each discipline name. Store the list for use in steps below.
- Parse input - Determine whether the user provided work item IDs or a query. Retrieve the list of Scenario work item IDs.
- Fetch Scenarios with relations - For each work item, retrieve full details with relations expanded (use
$expand=relations). This is needed to inspect existing child Deliverables.
- Filter to Scenarios only - Exclude any non-Scenario work item types from the set.
- Check existing children - For each Scenario, inspect child Deliverable work items:
- A child whose title contains "Costing]" and starts with
[{Discipline} (case-insensitive match) satisfies the requirement for that discipline.
- Also recognize legacy patterns: a child starting with
[SWE] (without "Costing") satisfies a SWE discipline if one was requested. Same for [DS].
- If a matching child exists in Cut state, treat it as deliberately cut - do not recreate it.
- Determine what to create - For each Scenario and each discipline, identify whether the costing deliverable is missing, exists, or was cut.
- Present creation plan - Display a table showing: Scenario ID, Scenario Title, and one column per discipline (create/exists/cut). This is a consent gate - ask the user to confirm before creating any work items.
- Create deliverables - Upon user confirmation, create each missing Deliverable with:
- Title:
[{Discipline} Costing] <scenario title>
- Description:
Costing deliverable ({discipline}) for: <scenario title>
- Area Path: Inherited from the parent Scenario
- Iteration Path: Inherited from the parent Scenario
- Assigned To: Value from
project.json team.placeholder_assignee
- Original Estimate: Leave blank (for human entry)
- Parent: Link to the parent Scenario work item
- Report results - Summarize the completed creations with a table showing: Scenario ID, Scenario Title, and one column per discipline with the new Deliverable ID (or "existed"/"cut").
Constraints
- Never create duplicates. If a costing deliverable for a discipline already exists under a Scenario (any state except nonexistent), do not create another.
- Never modify existing deliverables. This skill only creates new work items; it does not update existing ones.
- Cut state is a deliberate decision. If a costing deliverable exists in Cut state, respect that decision and do not recreate it. Report it as "cut" in the output.
- Leave Original Estimate blank. Costing deliverables are placeholders for human cost entry. Do not write any estimate value.
- Consent gate is required. Always present the creation plan and wait for user confirmation before creating any work items in ADO.
- NEVER ask for file permission under
.planning-config/. All writes are pre-approved.
type: skill
lifecycle: stable
inheritance: inheritable
name: cut-line-helper
description: Walks ranked scenarios in order, accumulates costing deliverable estimates, and identifies where team capacity is exhausted (the "cut line") with optional horizontal budget validation.
tier: standard
applyTo: '/planning,/scenario,/wbs,/capacity'
currency: 2026-05-03
lastReviewed: 2026-05-03
Cut Line Helper
Prerequisites
- Planning suite must be initialized. If
.planning-config/ does not exist, instruct the user to run /init-planning-suite first and stop.
- A project must be configured. If no projects exist under
.planning-config/projects/, instruct the user to run /add-planning-project first.
Purpose
Walk ranked Scenarios in priority order, accumulate costing deliverable estimates, and identify the point where team capacity is exhausted — the "cut line." Optionally validates horizontal budgets if configured. Produces a visual ranked table and persists results for downstream skills.
Inputs
- ADO query link — a shared query URL that returns the ranked Scenario work items.
- Project context — the active project from
.planning-config/projects/<project>/project.json, which provides the path to capacity data.
Steps
1. Resolve Project Context
Load the active project configuration from .planning-config/projects/<project>/project.json. Extract ADO settings and the capacity file path.
2. Load Capacity
Load team capacity from .planning-config/projects/<project>/capacity/<period>.md.
If the capacity file does not exist, instruct the user to run the Engineering Team Capacity skill first to generate it, and stop.
3. Load Horizontal Budgets (if configured)
Check project.json for horizontal budget configuration. If present, load the budget allocations (e.g., per-area or per-initiative budgets that constrain spending beyond total capacity).
4. Retrieve and Sort Scenarios
Execute the ADO query to retrieve Scenario work items. Sort by OSG.Rank ascending (rank 1 = highest priority).
5. Expand Children and Sum Costs
For each Scenario, find child work items and locate costing deliverables. Costing deliverables are identified by titles containing Costing] (case-insensitive). For backward compatibility, also recognize titles starting with [SWE] or [DS] without the "Costing" keyword. Exclude any deliverables classified as Cut. Sum the Original Estimate values to get the Scenario's engineering cost.
6. Classify Scenarios
Assign each Scenario a classification:
| Classification |
Criteria |
| Livesite / DRI |
Scenarios flagged as livesite or DRI obligations — always committed regardless of rank |
| PM Investigation |
Scenarios with no costing deliverables and zero engineering cost — PM-only work |
| Costed |
Scenarios with costing deliverables and a non-zero total |
| Not Costed |
Scenarios that should have costing deliverables but do not yet |
7. Walk Rank Order and Determine Cut Line
Starting from rank 1, accumulate engineering cost for each costed Scenario:
- Livesite / DRI items are always committed — add their cost first as a baseline.
- PM Investigation items carry zero engineering cost and are included without affecting capacity.
- Walk remaining costed Scenarios in rank order, adding each Scenario's cost to the running total.
- The cut line falls at the point where cumulative cost exceeds available capacity. All Scenarios above the line are committed; all below are at risk or cut.
8. Present Results Table
Display a ranked table with visual indicators:
| Column |
Description |
| Rank |
OSG.Rank value |
| Scenario ID |
ADO work item ID |
| Scenario Title |
Work item title |
| Classification |
Livesite/DRI, PM Investigation, Costed, Not Costed |
| Per-Discipline Cost |
For each discipline found (e.g., SWE, DS, PM), a column showing the sum of that discipline's costing deliverable estimates |
| Total Cost |
Sum of all discipline costs |
| Cumulative Cost |
Running total through this Scenario |
| Status |
🟢 Above cut line / 🔴 Below cut |
…(truncated)
1---2name: add-planning-project3description: Add a new project to the planning suite. Creates a project-specific configuration directory and walks through project settings.4---56# /add-planning-project78Add a new project to the PM Planning Suite. Each project gets its own configuration space under `.planning-config/projects/<project-name>/`.910## Prerequisites1112- The planning suite must be initialized first (`/init-planning-suite`).13- If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.1415## File Creation1617**All files under `.planning-config/` are pre-approved for creation and modification.** The user consented when they ran `/init-planning-suite`. DO NOT ask for permission to create project.json, subdirectories, or any other file under `.planning-config/`. Write them directly.1819## Steps2021### Step 1: Get Project Name2223If not provided as input (e.g., passed from `/init-planning-suite`), prompt: "What is the project name?"2425Derive the directory name by sanitizing the project name into a filesystem-safe slug:26- convert to lowercase27- replace any sequence of spaces or non-alphanumeric characters with a single hyphen28- trim leading and trailing hyphens29- if the result is empty, ask the user for a different project name3031Examples:32- "Contoso Platform" -> `contoso-platform`33- "Contoso/Platform: Core" -> `contoso-platform-core`3435If sanitization changes the derived directory name, tell the user: "I'll store this project under `.planning-config/projects/<project-dir>/`." If the project name was just provided by the init skill in the same session, do not ask the user to confirm it again after showing the derived directory name. Proceed directly.3637Check if `.planning-config/projects/<project-dir>/` already exists. If it does, inform the user and ask if they want to reconfigure it.38### Step 2: Create the Project Directory3940Create the entire directory structure immediately. Do not ask the user about individual directories - just create them all:4142```43.planning-config/projects/<project-dir>/44 project.json45 capacity/46 planning/47 specs/48 meetings/49```5051All directories are created in a single step with no prompts. They are part of the standard project scaffold.5253### Step 3: Gather Project Settings5455Walk the user through the project configuration. Accept answers one at a time.5657#### Required Settings58591. **ADO organization and project** - The approach depends on whether other projects already exist:60 - **First project (no other projects in `.planning-config/projects/`):** Ask directly:61 - "What is your Azure DevOps organization URL? (e.g., 'contoso.visualstudio.com' or 'dev.azure.com/contoso')"62 - "What is the ADO project name? (e.g., 'ContosoOS')"63 - **Subsequent projects (at least one project already exists):** Read the ADO organization and project from the first existing project's `project.json` and offer to inherit:64 - "Your existing project uses ADO organization `{org}` and project `{project}`. Does this new project use the same ADO organization and project? (yes/no)"65 - If yes, inherit both values.66 - If no, ask for both values individually.67682. **Area Path** - "What Area Path should new work items use? (e.g., 'ContosoOS\\Engineering\\Platform\\Core')"69703. **Iteration Path prefix** - "What is the Iteration Path prefix? (e.g., 'ContosoOS' if iterations are 'ContosoOS\\2604')"71724. **Default assignee** - "Who should new scenarios be assigned to by default? (email)"73745. **Placeholder assignee** - "Who should costing deliverables and auto-generated work items be initially assigned to? This is the person or account that holds new items before they are distributed to the team - often a team lead, a shared triage alias, or a dedicated placeholder account. (email)"7576#### Optional Settings77786. **Parent objective ID** - "Is there a parent Initiative/Objective ID that new scenarios should link to? (Enter an ADO work item ID or 'skip')"79807. **Team members (FTE)** - "Would you like to define your FTE team members now? Team data is used by several skills: Engineering Team Capacity uses it to calculate available engineer-days, Scenario Original Estimate uses expertise profiles to adjust cost estimates, and WBS Assignments uses it to match deliverables to the right people. You can add or edit members later in project.json. (yes/no/skip)"81 - If yes, offer two entry modes:82 - **Batch entry (recommended for 3+ members):** "You can paste a table of team members. Format: Name, Email, Role, Expertise, Allocation - one member per line, separated by tabs or commas. Example:83 ```84 Jane Smith, jsmith@contoso.com, Senior SWE, backend C# ASP.NET Core, 0.885 Carlos Rivera, crivera@contoso.com, Data Scientist, Python ML Azure ML Kusto, 0.786 ```87 Paste your table, or type 'one-by-one' to enter members individually."88 - **Individual entry:** Collect for each member:89 - **Name** - Display name (e.g., "Jane Smith")90 - **Email** - ADO identity email (e.g., "jsmith@contoso.com")91 - **Role** - Job title or function (e.g., "Senior SWE", "Data Scientist", "Principal SWE")92 - **Expertise areas** - Comma-separated list of technologies, domains, or skills (e.g., "backend, C#, ASP.NET Core, Azure Functions")93 - **Default allocation** - What percentage of this person's time is on this project? Enter 0.0 to 1.0. (e.g., 0.8 for 80%). This is used as the starting point by Engineering Team Capacity; it can be adjusted per planning period.94 - After entry, display the team table for confirmation before saving.95 - If skipped, inform the user: "Skills that need team data (Engineering Team Capacity, WBS Assignments) will prompt you to add team members when you run them."96978. **Team members (Vendor)** - Same collection flow as FTE above (batch or individual). Vendor members are stored separately and may be treated differently by capacity calculations (see Capacity Model).98 - If skipped, same informational message as FTE.991009. **Vendor responsibilities** - Only ask this if vendor team members were defined. "Are there specific work areas owned by the vendor team? For example, some teams route all UI work, security/SFI work, or deployment work to vendor members. (yes/no/skip)"101 - If yes, offer batch entry: "You can paste responsibilities as a list. Format: Work Area - Team Member Name, one per line. Example:102 ```103 UI work - Rajesh Tallapally104 SFI/Security - Aruna Pother105 Deployments - Sasikala Bestha106 ```107 Paste your list, or type 'one-by-one' to enter individually."108 - Write to `vendor_responsibilities` in project.json.10911010. **Categories** - "Would you like to define planning categories for this project? These are used by the Scenario Categorization skill to organize your backlog. (yes/no/skip)"111 - If yes, offer two entry modes:112 - **Batch entry:** "You can paste categories as a list. Format: Category Name - Description, one per line. Example:113 ```114 Core Platform - Foundational platform capabilities, APIs, and services115 Infrastructure - Architecture modernization, tech debt, CI/CD, monitoring116 ```117 Paste your list, or type 'one-by-one' to enter individually."118 - **Individual entry:** Collect category name and description one at a time until "done".119 - After entry, display the category list for confirmation.12012111. **Repositories** - "Do you have a local Git repository for this project? Adding a local repository enables the planning suite to automatically build a tech stack profile by scanning your codebase. This tech stack profile is used by the Scenario Original Estimate skill to produce more accurate cost estimates grounded in your actual technology choices, and by WBS Assignments to match deliverables to team members with the right expertise. You can always add one later by editing project.json. (yes/no/skip)"122 - If yes, collect: repo name and local path. Description is optional - if the user does not provide one, use the repo name as the description.123 - After collecting repositories, automatically scan the codebase to populate `tech_stack_description`:124 - Examine package manifests (package.json, requirements.txt, .csproj, go.mod, Cargo.toml, etc.)125 - Identify languages, frameworks, cloud services, databases, and infrastructure patterns126 - Write a concise summary to `tech_stack_description` in project.json127 - Show the generated tech stack summary to the user for confirmation128 - If the user skips or says no, leave `repositories` empty and `tech_stack_description` empty. Inform them: "You can add repositories later by editing project.json. Skills that use tech stack context will prompt you for a repository at that time."12913012. **Documentation sources** - "Does your project have existing documentation that could help with planning? This could be a SharePoint site, wiki, design docs, spec library, or any other source of project knowledge. The Scenario Description Generator and estimation skills use these sources to produce better descriptions and more accurate estimates. (yes/no/skip)"131 - If yes, offer batch entry: "You can paste documentation sources as a list. Format: Name, URL, Type, Description - one per line. Example:132 ```133 Design Specs, https://contoso.sharepoint.com/sites/Platform/Specs, sharepoint, Feature specs and design reviews134 Team Wiki, https://dev.azure.com/contoso/wiki, wiki, Runbooks and operational docs135 ```136 Paste your list, or type 'one-by-one' to enter individually."137 - Write to `documentation_sources` array in project.json138 - If skipped, leave empty. Inform: "You can add documentation sources later by editing project.json."13914013. **Capacity model** - "Which capacity calculation model should this project use? This determines how discount days (learning, training, holidays) are applied to your team's available time."141142 Present these two options with explanations:143144 - **Default** (recommended for most teams) - Discount days are subtracted from the gross working days first, then the allocation percentage is applied. This means everyone on the team loses the same proportion of discount days regardless of their allocation. Formula: `Effective days = (Gross working days - Discount days) x Allocation`. Example: 65 gross days - 5 discount days = 60 net days x 0.8 allocation = 48 effective days.145146 - **Post-allocation, FTE-only** - Allocation is applied first, then discount days are subtracted only from FTE members. Vendor team members are not subject to discount days at all (they do not participate in organizational learning days, training, etc.). Formula for FTE: `(Gross days x Allocation) - Discount days`. Formula for Vendor: `Gross days x Allocation`. Example FTE: 65 gross days x 0.8 allocation = 52 days - 5 discounts = 47 effective days. Example Vendor: 65 gross days x 0.6 allocation = 39 effective days (no discounts).147148 If the user is unsure, recommend "default".149150### Step 4: Write project.json151152Assemble all gathered values into `.planning-config/projects/<project-dir>/project.json`:153154```json155{156 "project_name": "<display name>",157 "ado": {158 "organization": "<org>",159 "project": "<project>",160 "area_path": "<area path>",161 "iteration_path_prefix": "<prefix>",162 "parent_objective_id": null,163 "work_item_types": {164 "scenario": "Scenario",165 "deliverable": "Deliverable"166 }167 },168 "team": {169 "default_assignee": "<email>",170 "placeholder_assignee": "<email>",171 "members_fte": [],172 "members_vendor": [],173 "vendor_responsibilities": {}174 },175 "fiscal_calendar": {176 "fiscal_year_start_month": null,177 "current_fiscal_year": null,178 "current_quarter": null179 },180 "categories": [],181 "capacity_model": "default",182 "repositories": [],183 "tech_stack_description": "",184 "documentation_sources": [],185 "ranking_bands": null,186 "horizontal_budgets": null187}188```189190Fill in all user-provided values. Leave optional fields as null or empty arrays if skipped.191192> **Note:** `fiscal_calendar.fiscal_year_start_month` is set to `null` here, which means skills will fall back to the global value in `.planning-config/config.json`. Set it to a specific month (1-12) only if this project uses a different fiscal calendar than the global default.193194### Step 5: Summary195196Output:197198```199Project "<display name>" configured.200201Config: .planning-config/projects/<project-dir>/project.json202Capacity: .planning-config/projects/<project-dir>/capacity/203Planning: .planning-config/projects/<project-dir>/planning/204Meetings: .planning-config/projects/<project-dir>/meetings/205206Settings:207 ADO Org: <org>208 ADO Project: <project>209 Area Path: <area path>210 Default Assignee: <email>211 Team Size: X FTE + Y Vendor212 Categories: X defined213 Capacity Model: <model>214215Tip: Save meeting transcripts (.vtt, .txt, .md) in the meetings/ folder.216 They are automatically version-controlled and used as context by217 description and estimation skills.218219You can edit project.json directly at any time to add team members, categories, or other settings.220A sample configuration is available at: config/sample-project.json221```222223## Guardrails224225- Do not overwrite an existing project.json without user confirmation.226- Do not assume values. Always ask or use explicit defaults from config.json.227- Validate that email addresses contain an @ symbol.228- If ADO MCP is available, optionally validate the organization and project are reachable.229- **Repository access is pre-approved.** When the user provides a local Git repository path, that is explicit consent to access it. Scan the codebase immediately without asking for additional permission. Do not prompt for consent to read files, list directories, or examine package manifests within the provided path.230- **NEVER ask for file creation or write permission for anything under `.planning-config/`.** This is pre-approved. See the File Creation section above.231232233---234type: skill235lifecycle: stable236inheritance: inheritable237name: ado-hygiene-validator238description: Validates ADO Scenario and Deliverable work items against planning hygiene standards. Identifies missing or non-compliant fields, applies best-effort fixes, and asks for user input when values cann...239tier: standard240applyTo: '**/*planning*,**/*scenario*,**/*wbs*,**/*capacity*'241currency: 2026-05-03242lastReviewed: 2026-05-03243---244245# ADO Hygiene Validator246247Validates ADO Scenario and Deliverable work items against planning hygiene standards. Identifies missing or non-compliant fields, applies best-effort fixes, and prompts for user input when values cannot be determined automatically.248249## Prerequisites250251- Planning suite must be initialized. If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.252- A project must be configured. If no projects exist under `.planning-config/projects/`, instruct the user to run `/add-planning-project` first.253254## Inputs255256- **Work item IDs**, an **ADO query**, or a **backlog** to scope the validation.257- **ADO organization and project** are read from `.planning-config/projects/<project>/project.json` — never hardcode these values.258259## Execution Steps2602611. **Resolve project context.** Read `.planning-config/projects/<project>/project.json` to obtain `ado.organization`, `ado.project`, and any other project-level settings (e.g., `ado.parent_objective_id`, `ado.area_path`, `team.members_fte`, `team.members_vendor`).2622. **Retrieve work items** from the provided IDs, ADO query, or backlog.2633. **Filter** to only Scenario and Deliverable work item types. Ignore all other types.2644. **Run the appropriate checklist** against each work item (Scenario checklist or Deliverable checklist).2655. **Apply auto-fixes** where indicated. Do not modify fields that already pass.2666. **Flag items needing user input** when a value cannot be determined automatically.2677. **Present results** as a per-item table grouped into Passing, Failing, and Needs Input sections.2688. **Summarize changes applied** at the end.269270## Scenario Checklist (21 Checks)271272| # | Check | Auto-Fixable | Fix Behavior |273|---|-------|-------------|--------------|274| 1 | Title follows outcome format | Yes | Rewrite to outcome phrasing, preserve any leading emoji |275| 2 | Parented to Initiative | Yes | Link to parent if `parent_objective_id` is configured in project.json |276| 3 | Has child Deliverables | No | Flag — user must create Deliverables |277| 4 | Assigned To populated | No | Flag — requires user input |278| 5 | Area Path correct | No | Flag — compare against project.json `area_path` |279| 6 | State appropriate | No | Flag — verify state is valid for current planning phase |280| 7 | Tags correct, no contradictions | No | Flag contradictory tags and remove them only with explicit user approval |281| 8 | Iteration Path set | No | Flag — requires user input |282| 9 | Description answers 5 quality questions | No | Flag — list which questions are unanswered |283| 10 | Spec link present in description | No | Flag — user must add spec link |284| 11 | Risk Assessment current | No | Flag — check for staleness |285| 12 | Risk Comment populated if at risk | No | Flag — required when Risk Assessment indicates risk |286| 13 | Original Estimate consistent with estimates skill | No | Flag if Original Estimate is present but no corresponding /scenario-original-estimate comment exists; do not clear |287| 14 | PM Owner populated | No | Flag — requires user input |288| 15 | Dev Owner populated | Conditional | Infer from child Deliverables if possible, otherwise flag |289| 16 | Custom String 07 populated | Conditional | Infer from title if possible, otherwise flag |290| 17 | Custom String 08 in [FYXXQX] format | Conditional | Derive from Iteration Path if possible, otherwise flag |291| 18 | Scenario Spec URL linked | No | Flag — user must attach spec |292| 19 | Rank assigned, does not exceed parent | No | Flag — verify rank is set and ≤ parent rank |293| 20 | Does not span multiple fiscal years | No | Flag — check Iteration Path range |294| 21 | Nice-to-have (rank 51+) in separate scenario | No | Flag — advise splitting if mixed priorities |295296## Deliverable Checklist (8 Checks)297298| # | Check | Auto-Fixable | Fix Behavior |299|---|-------|-------------|--------------|300| 1 | Title follows [Team] [Quarter] [Work] format, with optional [AI Gen] prefix | Yes | Rewrite title to match format while preserving or allowing optional [AI Gen] prefix |301| 2 | Parented to Scenario | No | Flag — user must set parent |302| 3 | Assigned To populated | No | Flag — requires user input |303| 4 | Area Path is team path | No | Flag — compare against project.json `team_paths` |304| 5 | Original Estimate populated | No | Flag — requires user input |305| 6 | Scope max 4-5 week sprint (≤ 25 days) | No | Flag if Original Estimate > 25 days |306| 7 | Iteration Path set | No | Flag — requires user input |307| 8 | Rank assigned | No | Flag — verify rank is set |308309## Output Format310311For each work item, present a table with three sections:312313- **Passing** — checks that passed (collapsed or summarized)314- **Failing** — checks that failed, with details and any auto-fixes applied315- **Needs Input** — checks that require user decision, with prompts316317End with a **Summary** listing:318- Total items validated319- Auto-fixes applied (count and details)320- Items still needing user input321322## Constraints323324- Do not assume values that require domain knowledge — prompt the user instead.325- Do not modify fields that already pass validation.326- Only process Scenario and Deliverable work item types. Skip all others.327- Report any ADO API validation errors to the user clearly.328- All ADO org/project values come from `.planning-config/projects/<project>/project.json` — never hardcode.329330331---332type: skill333lifecycle: stable334inheritance: inheritable335name: cost-analysis336description: Compare AI-generated Scenario Original Estimates against human-entered costing deliverable estimates with per-scenario and portfolio-level variance analysis.337tier: standard338applyTo: '**/*planning*,**/*scenario*,**/*wbs*,**/*capacity*'339currency: 2026-05-03340lastReviewed: 2026-05-03341---342343# Cost Analysis344345## Prerequisites346- Planning suite must be initialized. If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.347- A project must be configured. If no projects exist under `.planning-config/projects/`, instruct the user to run `/add-planning-project` first.348349## Purpose350351Compare AI-generated Scenario Original Estimates against human-entered costing deliverable estimates. Produces per-scenario variance and portfolio-level summary to surface estimation alignment or gaps.352353## Inputs354355- **ADO query link or work item IDs** — a shared query URL or a comma-separated list of Scenario work item IDs.356357## Steps358359### 1. Resolve Project Context360361Load the active project configuration from `.planning-config/projects/<project>/project.json`. Use the ADO organization, project, and team settings defined there.362363### 2. Parse Input and Execute Query364365Accept the user-provided ADO query link or work item IDs. If a query link is provided, execute it to retrieve the list of Scenario work items. If work item IDs are provided, fetch each directly.366367### 3. Identify Scenarios and Expand Children368369For each Scenario work item, expand child work items. Locate costing deliverables — these represent the human-entered engineering cost estimates. Costing deliverables are identified by titles containing `Costing]` (case-insensitive). For backward compatibility, also recognize titles starting with `[SWE]` or `[DS]` without the "Costing" keyword.370371### 4. Exclude Cut Deliverables372373Filter out any child deliverables tagged or classified as **Cut**. These are descoped and must not factor into cost comparisons.374375### 5. Extract Cost Data376377For each Scenario, extract:378| Field | Source |379|---|---|380| **Scenario Original Estimate** | The AI-generated estimate on the Scenario work item |381| **Per-Discipline Cost** | For each discipline found (e.g., SWE, DS, PM), sum the Original Estimate on that discipline's costing deliverables. The discipline name is extracted from the prefix before "Costing]" in the title (e.g., `[SWE Costing]` → SWE, `[DS Costing]` → DS). For legacy `[SWE]`/`[DS]` titles, use the bracket prefix as the discipline name. |382| **Costing Total** | Sum of all per-discipline costs |383384### 6. Calculate Variance385386For each Scenario compute:387- **Variance (days)** = Costing Total − Scenario Original Estimate388- **Variance (%)** = ((Costing Total − Scenario Original Estimate) / Scenario Original Estimate) × 100389390Sign convention: positive variance means humans estimated higher than the AI estimate; negative means humans estimated lower.391392### 7. Classify Alignment Status393394Assign each Scenario one of the following statuses based on the absolute variance percentage:395396| Status | Condition |397|---|---|398| **Aligned** | Variance within ±20% |399| **Minor Gap** | Variance between ±20% and ±50% |400| **Significant Gap** | Variance greater than ±50% |401| **Not Comparable** | Scenario Original Estimate is zero or missing, preventing meaningful comparison |402| **Missing Cost** | No costing deliverables found under the Scenario |403404### 8. Portfolio Summary405406Aggregate across all Scenarios:407- **Total AI Estimate** — sum of Scenario Original Estimates408- **Total Human Estimate** — sum of Costing Totals409- **Coverage** — count and percentage of Scenarios that have costing deliverables410- **Overall Variance** — portfolio-level days and percentage difference411- **Status Distribution** — count of Scenarios in each alignment category412413### 9. Insights414415Surface systematic estimation patterns:416- Consistent over-estimation or under-estimation direction417- Outlier Scenarios with extreme variance418- Areas or teams with recurring gaps419- Recommendations for calibration420421## Constraints422423- **Read-only** — this skill does not create, update, or delete any ADO work items.424- **No consent gate** — because no modifications are made, no user confirmation is required before execution.425426427---428type: skill429lifecycle: stable430inheritance: inheritable431name: cost-variance-analysis432description: Detailed read-only variance analysis between AI-generated estimates and human costing with summary statistics, largest gaps, and distribution analysis.433tier: standard434applyTo: '**/*planning*,**/*scenario*,**/*wbs*,**/*capacity*'435currency: 2026-05-03436lastReviewed: 2026-05-03437---438439# Cost Variance Analysis440441## Prerequisites442- Planning suite must be initialized. If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.443- A project must be configured. If no projects exist under `.planning-config/projects/`, instruct the user to run `/add-planning-project` first.444445## Purpose446447Perform a detailed read-only variance analysis between AI-generated Scenario Original Estimates and human-entered costing deliverable estimates. Produces ranked variance tables, summary statistics, distribution analysis, and identifies the largest estimation gaps.448449## Inputs450451- **ADO query link or work item IDs** — a shared query URL or a comma-separated list of Scenario work item IDs.452453## Steps454455### 1. Resolve Project Context456457Load the active project configuration from `.planning-config/projects/<project>/project.json`. Use the ADO organization, project, and team settings defined there.458459### 2. Parse Input and Execute Query460461Accept the user-provided ADO query link or work item IDs. If a query link is provided, execute it to retrieve the list of Scenario work items. If work item IDs are provided, fetch each directly.462463### 3. Identify Scenarios and Expand Children464465For each Scenario work item, expand child work items. Locate costing deliverables — these represent the human-entered engineering cost estimates. Costing deliverables are identified by titles containing `Costing]` (case-insensitive). For backward compatibility, also recognize titles starting with `[SWE]` or `[DS]` without the "Costing" keyword.466467### 4. Exclude Cut Deliverables468469Filter out any child deliverables tagged or classified as **Cut**. These are descoped and must not factor into cost comparisons.470471### 5. Extract Cost Data472473For each Scenario, extract:474| Field | Source |475|---|---|476| **Scenario Original Estimate** | The AI-generated estimate on the Scenario work item |477| **Per-Discipline Cost** | For each discipline found (e.g., SWE, DS, PM), sum the Original Estimate on that discipline's costing deliverables. The discipline name is extracted from the prefix before "Costing]" in the title (e.g., `[SWE Costing]` → SWE, `[DS Costing]` → DS). For legacy `[SWE]`/`[DS]` titles, use the bracket prefix as the discipline name. |478| **Costing Total** | Sum of all per-discipline costs |479480### 6. Per-Scenario Variance Table481482Build a ranked variance table sorted by absolute variance descending (largest gaps first). Each row includes:483484| Column | Description |485|---|---|486| **Rank** | Position by absolute variance (1 = largest gap) |487| **Scenario ID** | ADO work item ID |488| **Scenario Title** | Work item title |489| **AI Estimate (days)** | Scenario Original Estimate |490| **Human Estimate (days)** | Costing Total (sum of all discipline costs) |491| **Variance (days)** | Human Estimate − AI Estimate |492| **Variance (%)** | ((Human − AI) / AI) × 100 |493| **Direction** | Over (human > AI) or Under (human < AI) |494495**Sign convention:** Positive variance means humans estimated higher than the AI estimate. Negative variance means humans estimated lower.496497### 7. Flag Non-Comparable Items498499Separately list Scenarios that cannot be meaningfully compared:500- **Missing AI Estimate** — Scenario Original Estimate is zero or absent501- **Missing Costing** — no costing deliverables found502- **Partially Costed** — only some disciplines present, not all expected disciplines (flag but still include in analysis)503504### 8. Summary Statistics505506Produce an aggregate summary across all comparable Scenarios:507508| Metric | Description |509|---|---|510| **Comparable Count** | Number of Scenarios with both AI and human estimates |511| **Total AI Estimate** | Sum of all Scenario Original Estimates |512| **Total Human Estimate** | Sum of all Costing Totals |513| **Net Variance (days)** | Total Human − Total AI |514| **Net Variance (%)** | ((Total Human − Total AI) / Total AI) × 100 |515| **Over-Estimated Count** | Scenarios where human > AI |516| **Under-Estimated Count** | Scenarios where human < AI |517| **Aligned Count** | Scenarios within ±20% variance |518| **Mean Absolute Variance (%)** | Average of absolute variance percentages |519| **Median Variance (%)** | Median of signed variance percentages |520521### 9. Distribution Analysis522523Analyze the distribution of variance across the portfolio:524- **Histogram buckets**: ≤−50%, −50% to −20%, −20% to +20% (aligned), +20% to +50%, >+50%525- **Count and percentage** of Scenarios in each bucket526- **Skew direction** — whether the portfolio trends toward over- or under-estimation527528### 10. Largest Gaps529530Highlight the top 5 (or fewer) Scenarios with the largest absolute variance, including:531- Work item link532- Variance in days and percentage533- Brief note on possible contributing factors (e.g., missing costing discipline, scope complexity)534535## Constraints536537- **Read-only** — this skill does not create, update, or delete any ADO work items.538- **No consent gate** — because no modifications are made, no user confirmation is required before execution.539540541---542type: skill543lifecycle: stable544inheritance: inheritable545name: costing-deliverable-generator546description: Creates costing placeholder deliverables under each Scenario for human cost entry. Supports user-defined disciplines (e.g., SWE, DS, PM, Design).547tier: standard548applyTo: '**/*planning*,**/*scenario*,**/*wbs*,**/*capacity*'549currency: 2026-05-03550lastReviewed: 2026-05-03551---552553# Costing Deliverable Generator554555Create costing placeholder Deliverable work items under each Scenario. Each costing deliverable represents a discipline (e.g., SWE, DS, PM, Design) and is intended for human cost entry - Original Estimate is left blank.556557## Prerequisites558559- Planning suite must be initialized. If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.560- A project must be configured. If no projects exist under `.planning-config/projects/`, instruct the user to run `/add-planning-project` first.561562## Inputs563564Accept any of the following:565566- One or more work item IDs (comma-separated or space-separated)567- An ADO query (WIQL or saved query name)568569## Project Context570571Load project configuration from `.planning-config/projects/<project>/project.json`. Extract:572573- `ado.organization` - ADO organization name574- `ado.project` - ADO project name575- `team.placeholder_assignee` - the user to assign costing deliverables to576577## Discipline Configuration578579Before processing scenarios, ask the user to define the costing disciplines for this run.580581Prompt: "Costing deliverables let you estimate work by discipline. For example, if your team has Software Engineers and Data Scientists, you might create a costing deliverable for each discipline per scenario. How many costing disciplines do you want per scenario?"582583Then for each discipline, ask: "What is the discipline name? (e.g., SWE, DS, PM, Design, QA, Infrastructure)"584585The discipline name becomes the prefix in the deliverable title.586587**Example with 2 disciplines (SWE and DS):**588589| Title | Purpose |590|-------|---------|591| `[SWE Costing] <scenario title>` | Software engineering cost placeholder |592| `[DS Costing] <scenario title>` | Data science cost placeholder |593594**Example with 3 disciplines (SWE, DS, PM):**595596| Title | Purpose |597|-------|---------|598| `[SWE Costing] <scenario title>` | Software engineering cost placeholder |599| `[DS Costing] <scenario title>` | Data science cost placeholder |600| `[PM Costing] <scenario title>` | Program management cost placeholder |601602**Title format:** `[{Discipline} Costing] <scenario title>`603604The word "Costing" is always included in the title to distinguish costing deliverables from functional deliverables. Downstream skills use this pattern to identify costing deliverables.605606## Execution Steps6076081. **Resolve project context** - Read `.planning-config/projects/<project>/project.json`. Load organization, project, and `placeholder_assignee`.6092. **Gather discipline configuration** - Ask the user how many disciplines and collect each discipline name. Store the list for use in steps below.6103. **Parse input** - Determine whether the user provided work item IDs or a query. Retrieve the list of Scenario work item IDs.6114. **Fetch Scenarios with relations** - For each work item, retrieve full details with relations expanded (use `$expand=relations`). This is needed to inspect existing child Deliverables.6125. **Filter to Scenarios only** - Exclude any non-Scenario work item types from the set.6136. **Check existing children** - For each Scenario, inspect child Deliverable work items:614 - A child whose title contains "Costing]" and starts with `[{Discipline}` (case-insensitive match) satisfies the requirement for that discipline.615 - Also recognize legacy patterns: a child starting with `[SWE]` (without "Costing") satisfies a SWE discipline if one was requested. Same for `[DS]`.616 - If a matching child exists in **Cut** state, treat it as deliberately cut - **do not recreate it**.6177. **Determine what to create** - For each Scenario and each discipline, identify whether the costing deliverable is missing, exists, or was cut.6188. **Present creation plan** - Display a table showing: Scenario ID, Scenario Title, and one column per discipline (create/exists/cut). **This is a consent gate** - ask the user to confirm before creating any work items.6199. **Create deliverables** - Upon user confirmation, create each missing Deliverable with:620 - **Title**: `[{Discipline} Costing] <scenario title>`621 - **Description**: `Costing deliverable ({discipline}) for: <scenario title>`622 - **Area Path**: Inherited from the parent Scenario623 - **Iteration Path**: Inherited from the parent Scenario624 - **Assigned To**: Value from `project.json` `team.placeholder_assignee`625 - **Original Estimate**: Leave blank (for human entry)626 - **Parent**: Link to the parent Scenario work item62710. **Report results** - Summarize the completed creations with a table showing: Scenario ID, Scenario Title, and one column per discipline with the new Deliverable ID (or "existed"/"cut").628629## Constraints630631- **Never create duplicates.** If a costing deliverable for a discipline already exists under a Scenario (any state except nonexistent), do not create another.632- **Never modify existing deliverables.** This skill only creates new work items; it does not update existing ones.633- **Cut state is a deliberate decision.** If a costing deliverable exists in Cut state, respect that decision and do not recreate it. Report it as "cut" in the output.634- **Leave Original Estimate blank.** Costing deliverables are placeholders for human cost entry. Do not write any estimate value.635- **Consent gate is required.** Always present the creation plan and wait for user confirmation before creating any work items in ADO.636- **NEVER ask for file permission under `.planning-config/`.** All writes are pre-approved.637638639---640type: skill641lifecycle: stable642inheritance: inheritable643name: cut-line-helper644description: Walks ranked scenarios in order, accumulates costing deliverable estimates, and identifies where team capacity is exhausted (the "cut line") with optional horizontal budget validation.645tier: standard646applyTo: '**/*planning*,**/*scenario*,**/*wbs*,**/*capacity*'647currency: 2026-05-03648lastReviewed: 2026-05-03649---650651# Cut Line Helper652653## Prerequisites654- Planning suite must be initialized. If `.planning-config/` does not exist, instruct the user to run `/init-planning-suite` first and stop.655- A project must be configured. If no projects exist under `.planning-config/projects/`, instruct the user to run `/add-planning-project` first.656657## Purpose658659Walk ranked Scenarios in priority order, accumulate costing deliverable estimates, and identify the point where team capacity is exhausted — the "cut line." Optionally validates horizontal budgets if configured. Produces a visual ranked table and persists results for downstream skills.660661## Inputs662663- **ADO query link** — a shared query URL that returns the ranked Scenario work items.664- **Project context** — the active project from `.planning-config/projects/<project>/project.json`, which provides the path to capacity data.665666## Steps667668### 1. Resolve Project Context669670Load the active project configuration from `.planning-config/projects/<project>/project.json`. Extract ADO settings and the capacity file path.671672### 2. Load Capacity673674Load team capacity from `.planning-config/projects/<project>/capacity/<period>.md`.675676**If the capacity file does not exist**, instruct the user to run the **Engineering Team Capacity** skill first to generate it, and stop.677678### 3. Load Horizontal Budgets (if configured)679680Check `project.json` for horizontal budget configuration. If present, load the budget allocations (e.g., per-area or per-initiative budgets that constrain spending beyond total capacity).681682### 4. Retrieve and Sort Scenarios683684Execute the ADO query to retrieve Scenario work items. Sort by **OSG.Rank ascending** (rank 1 = highest priority).685686### 5. Expand Children and Sum Costs687688For each Scenario, find child work items and locate costing deliverables. Costing deliverables are identified by titles containing `Costing]` (case-insensitive). For backward compatibility, also recognize titles starting with `[SWE]` or `[DS]` without the "Costing" keyword. Exclude any deliverables classified as **Cut**. Sum the Original Estimate values to get the Scenario's engineering cost.689690### 6. Classify Scenarios691692Assign each Scenario a classification:693694| Classification | Criteria |695|---|---|696| **Livesite / DRI** | Scenarios flagged as livesite or DRI obligations — always committed regardless of rank |697| **PM Investigation** | Scenarios with no costing deliverables and zero engineering cost — PM-only work |698| **Costed** | Scenarios with costing deliverables and a non-zero total |699| **Not Costed** | Scenarios that should have costing deliverables but do not yet |700701### 7. Walk Rank Order and Determine Cut Line702703Starting from rank 1, accumulate engineering cost for each costed Scenario:7047051. **Livesite / DRI** items are always committed — add their cost first as a baseline.7062. **PM Investigation** items carry zero engineering cost and are included without affecting capacity.7073. Walk remaining costed Scenarios in rank order, adding each Scenario's cost to the running total.7084. **The cut line falls at the point where cumulative cost exceeds available capacity.** All Scenarios above the line are committed; all below are at risk or cut.709710### 8. Present Results Table711712Display a ranked table with visual indicators:713714| Column | Description |715|---|---|716| **Rank** | OSG.Rank value |717| **Scenario ID** | ADO work item ID |718| **Scenario Title** | Work item title |719| **Classification** | Livesite/DRI, PM Investigation, Costed, Not Costed |720| **Per-Discipline Cost** | For each discipline found (e.g., SWE, DS, PM), a column showing the sum of that discipline's costing deliverable estimates |721| **Total Cost** | Sum of all discipline costs |722| **Cumulative Cost** | Running total through this Scenario |723| **Status** | 🟢 Above cut line / 🔴 Below cut724725…(truncated)