Add the pure scheduling seam (campaign_scheduler.decide_schedule) that, given a static plan and window-clock offset, decides which plan entries are due and whether the window ended — mirroring judgement.combine_case_outcome, with time_scale confined to the clock mapping so it never touches judgement/report. The campaign_runner shell maps injected elapsed time to a window offset, spawns due child Runs through the existing EvalEngine.run(existing_run=...) path with campaign_id + RunTrigger.CAMPAIGN, and persists spawned-entry indices per entry for idempotent, restart-recoverable progress. No auto loop yet (ticket 03). |
||
|---|---|---|
| .. | ||
| agents | ||
| channels | ||
| config | ||
| evaluation | ||
| model_protocols | ||
| scenarios | ||
| services | ||
| storage | ||
| utils | ||
| web | ||
| __init__.py | ||
| model_gateway.py | ||
| models.py | ||
| version.py | ||