Journey 10 — When jump refuses
When jump physics gates refuse the operator, SolvJump still completes the study — auto-routing to adaptive MFBO when terminal_metrics exist, or full SRK screen otherwise.
Prerequisites: Journeys 03 and 08 — understand full vs adaptive paths. Scenario: Brusselator long chain | strategy: full -> adaptive fallback
Key APIs
solvjump run examples/brusselator_study_refuse.yamlKillGateFailed / rollout refusal handlingauto adaptive fallback
Concepts to internalize
- Refusal is not failure — product path adapts; you still get a CSV and session.
- Long-chain Brusselator fixture — dedicated YAML for refusal pedagogy; do not reuse satellite YAML here.
- terminal_metrics present — triggers
srk_adaptiveinstead of baresrk_screen. - Honest receipts — evidence and logs show why jump was not trusted.
Important code
The guided tour script wraps this pattern. Copy the production shape into your pipeline:
solvjump run examples/brusselator_study_refuse.yamlAct-by-act walkthrough
Act 1 — The physics gate
Jump operators must pass holdout SCD and chained rollout (no fixed-point collapse). This YAML asks for a 20-step chain at dt=0.25 — a regime where Brusselator often fails rollout even if a single step looks fine.
Act 2 — What we request
brusselator_study_refuse.yaml uses strategy: full. Because brusselator_model.py defines terminal_metrics(), a refusal auto-runs adaptive MFBO instead of dead-ending.
Act 3 — Contrast with Robertson (Journey 06)
robertson_model.py has NO terminal_metrics(). If jump refused there, fallback is full-grid SRK screen with no ranked CSV — see COVERAGE.md §4.
Study definition
| Field | Value | Notes |
|---|---|---|
model | <product-root>\python\examples\brusselator_model.py:make_rhs | |
dynamics_params | a in [0.8, 1.2], b in [2.5, 3.5] | |
y0 | [1.0, 3.0] | |
t_span | [0.0, 10.0] | |
mode | auto | |
calibration_seeds | 12 | |
jump_lags | [0.1, 0.5, 1.0] | |
safety_margin | 1.5 |
Operator routing, calibration & sweep (3 steps)
| Field | Value | Notes |
|---|---|---|
model | <product-root>\python\examples\brusselator_model.py:make_rhs | |
dim | 2 | |
stiffness_nom | S1 | |
horizon | [0.0, 10.0] | |
problem_set_operators | 256 | kepler |
- Jump recommendation: confidence=exact, cache_ref=<operator_id>, mode=auto
| Field | Value | Notes |
|---|---|---|
seeds | 12 | |
reason | no exact cache match for this model | Collecting trajectory training pairs: jump lag=0.25s, SolvTune arm=solvsrk, objective=balanced, target chain=20 |
-
SRK collection done - 60 train pairs from 3 trajectories (0 failed, need >=8 train)
-
Fitted nominal+guard kernels - train median SCD=2.79, holdout median SCD=1.68 (n=8/8)
-
Rollout validation - SCD by chain depth [1:1.68, 10:0.77, 20:0.56], max_valid_chain=1 (single_step_only)
-
Accuracy gate passed (operator <operator_id>)
| Field | Value | Notes |
|---|---|---|
method | grid | |
grid_points | 9 | |
steps | 20 | |
dt | 0.25 | |
compare_brute_srk | False | |
finalists | 10 | Sweep finished - example params {'a': 1.0, 'b': 3.0}, final state ~ [0.7101, 3.3821] |
- Horizon aligned: 20 jumps x 0.25 s = 5.0 s (jump_lag matches dt)
| Field | Value | Notes |
|---|---|---|
! Degeneracy guard tripped on 1 grid point(s) - sweep mode | jump_anchored | Jump pool (NOT SRK truth): top 9 of 9 by jump metrics -> finalists_top10.csv |
srk_sample_n | 9 | |
full_grid_truth | True | |
min_spearman | 0.85 | Full-grid SRK truth: 9/9 rankable in 0.5 s |
SRK ground truth (authoritative top-N)
| Field | Value | Notes |
|---|---|---|
grid_points | 9 | |
srk_ranked | 9 | |
export | finalists_ground_truth_top9.csv | |
srk_best_jump_rank | 4 | SRK top-10 in jump top-500: 9/9 (100% recall) |
-
SRK top-50 in jump top-500: 9/9 (100% recall)
-
SRK top-100 in jump top-500: 9/9 (100% recall)
Rank verification (jump vs full SRK)
| Field | Value | Notes |
|---|---|---|
verified_rows | 9/9 jump-ranked rows | |
spearman_rho | 0.817 (gate >= 0.85) | |
srk_verify_time | 0.4 s | |
best_srk_jump_rank | #4 (regret 3) | |
verdict | FAIL — do not cite ranking to clients | top-10 overlap: skipped (sample size 9 < top_n 10) |
-
top-50 overlap: skipped (sample size 9 < top_n 50)
-
top-100 overlap: skipped (sample size 9 < top_n 100)
-
steady_ok agreement (jump vs SRK): 78%
-
Report: <session-dir>\rank_verification_report.json
-
SRK shortlist (verified ranking for HPC handoff): <session-dir>\srk_shortlist.csv
-
SRK ground truth (authoritative): <session-dir>\finalists_ground_truth_top9.csv
-
Authoritative deliverable: finalists_ground_truth_top9.csv (SRK ground truth — use this for HPC handoff)
Act 4 — Takeaway
Product coverage = any ODE study completes. Jump speed is the bonus when physics allows. For client ranking claims on jump sweeps that DID succeed, still run Journey 12 (verify-ranking).
Why run SolvJump here?
-
The study completes even when jump refuses — ops is not blocked.
-
Jump succeeded on this run — you get fast screening plus ranked comm windows.
-
Models with terminal_metrics get adaptive fallback; without it you only get a slow full-grid screen.
-
Same YAML path covers both fast jump and honest fallback — no dead-end workflow.
Guided tour output
Verified console capture from 10_when_jump_refuses.py:
Brusselator long chain | strategy: full -> adaptive fallback
-- Act 1 - The physics gate --
-> Jump operators must pass holdout SCD and chained rollout (no fixed-point collapse). This YAML asks for a 20-step chain at dt=0.25 — a regime where Brusselator often fails rollout even if a single step looks fine.
-- Act 2 - What we request --
-> brusselator_study_refuse.yaml uses strategy: full. Because brusselator_model.py defines terminal_metrics(), a refusal auto-runs adaptive MFBO instead of dead-ending.
-- Act 3 - Contrast with Robertson (Journey 06) --
-> robertson_model.py has NO terminal_metrics(). If jump refused there, fallback is full-grid SRK screen with no ranked CSV — see COVERAGE.md §4.
_section: Study definition
model: <product-root>\python\examples\brusselator_model.py:make_rhs
dynamics_params: a in [0.8, 1.2], b in [2.5, 3.5]
y0: [1.0, 3.0]
t_span: [0.0, 10.0]
mode: auto
calibration_seeds: 12
jump_lags: [0.1, 0.5, 1.0]
safety_margin: 1.5
_section: Operator routing, calibration & sweep (3 steps)
model: <product-root>\python\examples\brusselator_model.py:make_rhs
dim: 2
stiffness_nom: S1
horizon: [0.0, 10.0]
problem_set_operators: 256
-> kepler | dim=2 | stiffness=S0 | dynamics=conservative
log: Jump recommendation: confidence=exact, cache_ref=<operator_id>, mode=auto
seeds: 12
reason: no exact cache match for this model
-> Collecting trajectory training pairs: jump lag=0.25s, SolvTune arm=solvsrk, objective=balanced, target chain=20
log: SRK collection done - 60 train pairs from 3 trajectories (0 failed, need >=8 train)
log: Fitted nominal+guard kernels - train median SCD=2.79, holdout median SCD=1.68 (n=8/8)
log: Rollout validation - SCD by chain depth [1:1.68, 10:0.77, 20:0.56], max_valid_chain=1 (single_step_only)
log: Accuracy gate passed (operator <operator_id>)
method: grid
grid_points: 9
steps: 20
dt: 0.25
compare_brute_srk: False
finalists: 10
-> Sweep finished - example params {'a': 1.0, 'b': 3.0}, final state ~ [0.7101, 3.3821]
log: Horizon aligned: 20 jumps x 0.25 s = 5.0 s (jump_lag matches dt)
! Degeneracy guard tripped on 1 grid point(s) - sweep mode: jump_anchored
-> Jump pool (NOT SRK truth): top 9 of 9 by jump metrics -> finalists_top10.csv
srk_sample_n: 9
full_grid_truth: True
min_spearman: 0.85
-> Full-grid SRK truth: 9/9 rankable in 0.5 s
_section: SRK ground truth (authoritative top-N)
grid_points: 9
srk_ranked: 9
export: finalists_ground_truth_top9.csv
srk_best_jump_rank: 4
-> SRK top-10 in jump top-500: 9/9 (100% recall)
log: SRK top-50 in jump top-500: 9/9 (100% recall)
log: SRK top-100 in jump top-500: 9/9 (100% recall)
_section: Rank verification (jump vs full SRK)
verified_rows: 9/9 jump-ranked rows
spearman_rho: 0.817 (gate >= 0.85)
srk_verify_time: 0.4 s
best_srk_jump_rank: #4 (regret 3)
verdict: FAIL — do not cite ranking to clients
-> top-10 overlap: skipped (sample size 9 < top_n 10)
log: top-50 overlap: skipped (sample size 9 < top_n 50)
log: top-100 overlap: skipped (sample size 9 < top_n 100)
log: steady_ok agreement (jump vs SRK): 78%
log: Report: <session-dir>\rank_verification_report.json
log: SRK shortlist (verified ranking for HPC handoff): <session-dir>\srk_shortlist.csv
log: SRK ground truth (authoritative): <session-dir>\finalists_ground_truth_top9.csv
log: Authoritative deliverable: finalists_ground_truth_top9.csv (SRK ground truth — use this for HPC handoff)
-- Act 4 - Takeaway --
-> Product coverage = any ODE study completes. Jump speed is the bonus when physics allows. For client ranking claims on jump sweeps that DID succeed, still run Journey 12 (verify-ranking).
_section: Why run SolvJump here?
log: The study completes even when jump refuses — ops is not blocked.
log: Jump succeeded on this run — you get fast screening plus ranked comm windows.
log: Models with terminal_metrics get adaptive fallback; without it you only get a slow full-grid screen.
log: Same YAML path covers both fast jump and honest fallback — no dead-end workflow.
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 62.6 ms
receipt_calibration: <session-dir>\calibration_receipt.json
receipt_sweep: <session-dir>\sweep_receipt.json
receipt_jump_pool: <session-dir>\finalists_top10.csv
receipt_rank_verification: <session-dir>\rank_verification_report.json
receipt_srk_shortlist: <session-dir>\srk_shortlist.csv
receipt_finalists: <session-dir>\finalists_ground_truth_top9.csv
-- What happened --
session_tier: calibrated
operator_id: <operator_id>
-- Act 4 - Takeaway --
-- Why run SolvJump here? --
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 62.6 ms
receipt_calibration: <session-dir>\calibration_receipt.json
receipt_sweep: <session-dir>\sweep_receipt.json
receipt_jump_pool: <session-dir>\finalists_top10.csv
receipt_rank_verification: <session-dir>\rank_verification_report.json
receipt_srk_shortlist: <session-dir>\srk_shortlist.csv
receipt_finalists: <session-dir>\finalists_ground_truth_top9.csvRun it
cd python
# Guided tour — narrated scenario walkthrough (recommended first run):
python examples/journeys/10_when_jump_refuses.py
# Production one-liner — same API call you ship:
solvjump run examples/brusselator_study_refuse.yamlWhat comes next
Journey 11 golden-proves the top finalist with full SolvSRK.
Navigation
← Journey 09 — SolvTune objective · Journey 11 — Golden proof →