extract-parameters-fro…
Use when the user wants to extract parameters from a PlanExe extraction-input digest (the markdown produced by…
Use when the user wants to generate low/base/high assumption ranges (bounds) for missing or uncertain variables in a validated extract-parameters-from-full JSON, in preparation for deterministic scenarios or Monte Carlo
$ npx -y skills add planexeorg/planexe --skill generate-bounds --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/generate-boundsContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user wants to generate low/base/high assumption ranges (bounds) for missing or uncertain variables in a validated extract-parameters-from-full JSON, in preparation for deterministic scenarios or Monte Carlo
name: generate-bounds description: Use when the user wants to generate low/base/high assumption ranges (bounds) for missing or uncertain variables in a validated extract-parameters-from-full JSON, in preparation for deterministic scenarios or Monte Carlo
Wraps the bounds-estimator system prompt at `system-prompt.txt` (next to this file) and applies it to a parameter JSON produced by `extract-parameters-from-full` (and ideally already passed `validate-parameters`). Output is a strict JSON object keyed by variable id, with `low / base / high / unit / rationale / source` for every variable that needs an assumption range.
Stage 4 of the pipeline described in `planexe_simulator/README.md`.
Not for: regenerating the parameter JSON (use `extract-parameters-from-full`), validating the JSON (use `validate-parameters`), or producing Python code (use `generate-calculations`).
1. **Get the input JSON path.** If the user did not provide one, ask. Do not guess. 2. **Read `system-prompt.txt`** (sibling of this SKILL.md). Its selection rules and spread heuristics are authoritative. 3. **Read the parameter JSON.** Assume it has already passed `validate-parameters`; if it visibly hasn't, tell the user and offer to validate first. 4. **Produce the bounds JSON** per the system prompt. 5. **Self-audit before output.** For each bound entry, verify:
If any check fails, revise the bound; do not ship inconsistent state. 6. **Output destination.** Default: print the JSON to chat. If the user asks for a file, write to the path they specify. Suggested default file path: `<input-basename>.bounds.json` next to the input.
Generate one bounds entry for every id that meets ANY of:
Skip: explicit/derived `key_values` with low uncertainty, `derived_questions`, `recommended_first_calculations`, and formula LHS-only outputs that are not declared as inputs.
| Uncertainty | Spread around base | |---|---| | low | ±10–20% | | medium | ±25–50% | | high | ≥±50%, up to a 2–5× factor when genuinely speculative |
Always `low ≤ base ≤ high`. Fractions stay in `[0, 1]`. Counts of discrete things (people, kits, centers, months) use integer bounds.
{
"<variable_id>": {
"unit": "fraction",
"low": 0.10,
"base": 0.20,
"high": 0.30,
"rationale": "Short, ≤50 words. Include required disclosures when applicable.",
"source": "data" | "assumption",
"sampling_discipline": "fraction",
"non_negative": true,
"default_pass_probability": null
}
}Top-level is a single object keyed by variable id. Order keys roughly by importance (critical → high → medium → remaining missing values). Use `"source": "data"` only when the range is anchored in a citable real-world reference for similar programs; otherwise `"assumption"`.
Each entry MUST carry a `sampling_discipline` chosen by the LLM based on the variable's nature. Downstream consumers (run-scenarios, monte-carlo runner) read this tag directly and do not pattern-match on unit strings — so the LLM is the single authority for this classification.
| Value | Meaning | Downstream behavior | |---|---|---| | `"fixed"` | `low == base == high`; genuinely pinned | Always return that value | | `"bernoulli_gate"` | Binary pass/fail (staged funding, permit toggle, regulatory pass, conditional release). Requires `default_pass_probability` ∈ [0, 1] | Bernoulli draw; low on fail, high on pass | | `"integer"` | Countable units — people, households, sites, kits, days, … | Sample continuously, round, re-clamp to `[low, high]` | | `"fraction"` | Bounded fraction in `[0, 1]` | Clamp draws to `[0, 1]` | | `"continuous"` | Real-valued; no rounding, no extra clamping beyond `[low, high]` | Plain triangular/uniform draw |
`non_negative` is independent of discipline: set `true` when the variable cannot legitimately go below zero (continuous monetary amounts, counts, capacities); set `false` only when negative values are physically meaningful (a delta or net change variable).
`default_pass_probability` is required (a number in `[0, 1]`) when `sampling_discipline == "bernoulli_gate"` and MUST be `null` for every other discipline.
If no variable needs bounds, return `{}`.
| Mistake | Fix | |---|---| | Bounding every variable, including known explicit facts | Skip explicit/derived key_values with low uncertainty — they are facts, not assumptions | | Returning `low == base == high` for variables with real uncertainty | Give a real range; identical bounds are only for genuinely pinne
Use when the user wants to extract parameters from a PlanExe extraction-input digest (the markdown produced by…
Use when the user wants to extract parameters, modelling values, or key variables from a PlanExe report (HTML or text) for napkin…
Use when the user wants to turn a validated extract-parameters-from-full JSON into a Python module of deterministic functions…
Use when the user wants Monte Carlo simulation of a PlanExe model — sampling from bounds to produce output distributions…
Use when the user wants to run the napkin-math pipeline end-to-end on a PlanExe report, or resume a partially populated output…
Use when the user wants to compute deterministic low/base/high scenario outputs for a PlanExe model — given an…