Skip to content

examples: outage_program_scheduling — time-phased selection with staging cascades - #138

Merged
cafzal merged 1 commit into
mainfrom
claude/outage-example
Aug 3, 2026
Merged

examples: outage_program_scheduling — time-phased selection with staging cascades#138
cafzal merged 1 commit into
mainfrom
claude/outage-example

Conversation

@cafzal

@cafzal cafzal commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Adds the outage_program_scheduling bundled example: 30 maintenance jobs × 4 quarters → 115 (job, quarter) pair options — the portfolio's time-phased structure cell, where deferral decays value, seasonality reprices cost, and a slipped quarter cascades through staged pairs.

Showcase. Time-phased binary selection with staging dependencies (phase-2 runs the quarter after phase-1), per-quarter crew caps, corridor exclusions, and safety-critical deadlines. Full HiGHS certify on the shape; per_pick marginal analysis reads which (job, quarter) picks carry each program; the audit proves emergent guarantees the rules never state (no safety work in H2; Ivyloch phase 1 pinned to Q1 by arithmetic, not by rule).

Dominance-count scoping (found in prep). The advisory's echo lists its first 20 entries — display cap, not a count. True engine numbers, generator-asserted: 82 of 115 pairs globally dominated, 58 same-job, and 36 of the 82 still appear in certified-optimal programs. The README scopes every cited count, and notes SB-03's dual identity (safety-critical AND phase-2 of SB-02 — why the audit floor counts 7 deadline jobs, not 8).

Discipline. Seeded generator asserts all 11 README claims; bundle baked on current main — byte-identical re-bake post #132/#134/#135/#136. Upstream kit guarded by tests/test_upstream_kits.py. Index row in examples/README.md.

Verification. Full suite 1042 passed / 2 skipped on the branch; live pipeline-tested through the MCP tools (three-layer bar verdict: publish); provenance/secrets sweep over origin/main...HEAD clean.

…ing cascades

The first bundled example where TIME is the structure: 30 maintenance jobs x
4 quarters, so every option is a (job, quarter) pair and WHEN carries as much
value as WHETHER. 115 options, 69 constraints — six crews a quarter, a $76M
budget, a June-30 deadline on the safety-critical work, phase-2 jobs staged
into the window right after phase 1, and corridor rivals that stay out of the
same quarter.

Every number in the README is asserted by a seeded generator against the
engine's own output before the bundle is baked (re-baked on the post-#136
engine; dominance counts are stated with their scope — global advisory vs
same-job vs earliest-window — and SB-03's dual membership, safety-critical
AND phase-2 staged, is called out where the runbook uses both labels):

- WHEN is a real choice: 62 of 85 later windows survive comparison with the
  job's own earliest window, and the mandatory 8-job set holds three separate
  frontier places that differ only in quarters (+208 MWh for $4.9M).
- Deferral cascades: pinning HY-03 a quarter later evicts HY-04 from Q2; of
  the 14 MWh the corner loses, 13 are the knock-on, not the pinned job's decay.
- A value-greedy schedule overruns Q1 by 19 jobs and the budget by $48.1M; the
  repaired greedy is legal and beaten outright by three certified programs.
- The exact overlay dominates 15 of 40 heuristic programs and sharpens the risk
  corner +507 MWh; both curated finalists come back dominated with a named
  certified counterpart.
- The per-option advisory flags 82 of 115 pairs (global scope; 58 same-job),
  and 36 of the 82 still appear in certified-optimal programs — a "worse"
  window is often the only window.
- Audit: no safety work in H2, Ivyloch phase 1 always in Q1, and at least 2 of
  7 deadline jobs in Q1 hold over every feasible program; the tighter floor
  returns a witness.
- Scenarios: the summer surge re-prices Q3 (+60%) and caps it at 3 crews; the
  Q2 crew shortage leaves 5 of 40 base programs standing.

Ships the upstream kit (projects.csv + quarter_factors.csv + the step-1 ask),
its reconstruction test, the ask-literal guard, and the index row.
@cafzal
cafzal force-pushed the claude/outage-example branch from d00a6eb to 2199c9c Compare August 3, 2026 22:39
@cafzal
cafzal merged commit 0fffbfa into main Aug 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant