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). |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| test_auth_api.py | ||
| test_campaign_runner.py | ||
| test_campaigns_api.py | ||
| test_files_api.py | ||
| test_model_config_migration.py | ||
| test_model_configs_api.py | ||
| test_reports_api.py | ||
| test_runs_api.py | ||
| test_scenario_version_migration.py | ||
| test_scenarios_api.py | ||
| test_stats_api.py | ||