Summary
The headline PRP-27 capability — a genuine model-driven re-forecast (method="model_exogenous", regression baseline through a leakage-safe future feature frame) — cannot be triggered from the /visualize/planner UI. From the browser a user can only ever reach the heuristic post-forecast multiplier path.
Root cause
The planner's Pick a baseline step uses JobPicker (jobType="predict", status="completed") and reads job.params.run_id as the baseline (planner.tsx:75-77). But:
POST /forecasting/predict (and therefore predict jobs) explicitly reject regression models:
Regression models forecast through POST /scenarios/simulate, which supplies the exogenous feature frame. POST /forecasting/predict does not support model_type='regression'.
- So no
completed predict job can ever exist for a regression run, and the JobPicker can never surface one.
POST /scenarios/simulate does route a regression run_id down _simulate_model_exogenous, but the planner has no way to feed it a regression run_id. The path is reachable only via the raw API or the agent propose_scenario / save_scenario tools.
Suggested fix (pick one)
- Add a registry run picker to the planner (pick a
success run directly), in addition to / instead of the predict-job picker — a regression run would then be selectable and route to model_exogenous.
- Allow
regression predict jobs to complete (a thin predict job that delegates to the simulate/feature-frame path), so they appear in the JobPicker.
Option 1 is the smaller change and matches scenarios/service.py which already resolves the model bundle straight from run_id.
Found by
Real-browser dogfood of PRP-27 (/visualize/planner) on dev after PR #227. The model_exogenous mechanism itself is correct and proven via the API — this is purely a UI-reachability gap.
Summary
The headline PRP-27 capability — a genuine model-driven re-forecast (
method="model_exogenous", regression baseline through a leakage-safe future feature frame) — cannot be triggered from the/visualize/plannerUI. From the browser a user can only ever reach theheuristicpost-forecast multiplier path.Root cause
The planner's Pick a baseline step uses
JobPicker(jobType="predict",status="completed") and readsjob.params.run_idas the baseline (planner.tsx:75-77). But:POST /forecasting/predict(and therefore predict jobs) explicitly rejectregressionmodels:completedpredict job can ever exist for aregressionrun, and the JobPicker can never surface one.POST /scenarios/simulatedoes route aregressionrun_iddown_simulate_model_exogenous, but the planner has no way to feed it a regressionrun_id. The path is reachable only via the raw API or the agentpropose_scenario/save_scenariotools.Suggested fix (pick one)
successrun directly), in addition to / instead of the predict-job picker — a regression run would then be selectable and route tomodel_exogenous.regressionpredict jobs to complete (a thin predict job that delegates to the simulate/feature-frame path), so they appear in the JobPicker.Option 1 is the smaller change and matches
scenarios/service.pywhich already resolves the model bundle straight fromrun_id.Found by
Real-browser dogfood of PRP-27 (
/visualize/planner) ondevafter PR #227. Themodel_exogenousmechanism itself is correct and proven via the API — this is purely a UI-reachability gap.