Produce engineering effort and risk estimates using WBS, three-point (PERT) estimating, risk matrix, uncertainty, and assumptions. Operates on a provided issue id and its prepared plan.
Produce a concise, auditable engineering estimate (effort + risk) for a prepared work item. The skill's canonical outputs are:
Before doing any work the issue MUST be in the intake_complete or plan_complete stage. If it is not, refuse and output ONLY this single sentence (replace <issue-id> with the actual id):
The issue does not have a sufficiently detailed plan, to proceed it must be in the stage of intake_complete or plan_complete. Run the intake command with or the plan command with .
/intake <issue-id>/plan <issue-id>Do not output any other text when refusing.
The orchestrate_estimate.py script accepts work items in either intake_complete or plan_complete stages when applying effort and risk updates. This allows estimates to be applied early in the intake phase and refined later if needed. The script uses the same stage validation for both calculation and update phases.
Use this skill only after the Producer has prepared a plan and set the work item's stage to intake_complete or plan_complete.
Follow these steps from the project root (run commands from the repository root, not from the skill/effort_and_risk directory):
Fetch the issue and its children (audit file):
wl show <issue-id> --json
Prepare the inputs (JSON) using the plan and WBS. The input should include keys such as:
{ "items": [{"id":"CHILD-1","title":"Design","o":2,"m":4,"p":6}, ...], "o": <effort_units>, "m": <effort_units>, "p": <effort_units>, "overheads": {"coordination": <h>, "review": <h>, "testing": <h>, "risk_buffer": <h>}, "parent": {"probability": <1-5>, "impact": <1-5>}, "children": [{"id":"ISSUE-1","probability":2,"impact":1,"title":"child A"}, ...], "certainty": 85, "assumptions": ["..."], "unknowns": ["..."] }
Run the orchestrator. Prefer capturing output to a filename derived from the work-item id (avoid fixed names):
```sh
python3 scripts/run_skill.py --issue <issue-id> <<'JSON' > final-<issue-id>.json
{ ... }
JSON
```
The orchestrator enforces gating, computes effort and risk, updates issue metadata, and posts the comment. The script returns a single JSON object that includes:
Verify what was posted by inspecting the generated output file (for example final-<issue-id>.json) or, if needed, the issue itself:
wl show <issue-id> --format full
final-<issue-id>.json (or captured stdout): canonical machine-readable estimate (as described above), plus orchestration metadata including human_text and comment_result. Prefer filenames generated from the work-item id to avoid fixed temporary filenames.