Task: QA Market Simulator tree Start/Stop-at-Root for merged theme datasets

Table of Contents

This page documents a task in the IR Rates synthetic data: dataset seeding, index cleanup, dual-curve, quoting conventions story. It captures the goal, current status, acceptance, and any notes or results.

Goal

Follow-up QA left open by Make a synthetic theme one atomic dataset: that task's SQL-level structural check confirmed the new one-dataset-per-theme model (one collection folder per theme, with FX/Rates asset-class sub-folders as children), but the Market Simulator Qt tree's Start/Stop-at-Root behaviour and the full "Synthetic data themes" manual test scenario were not re-verified end to end. Run that scenario against this environment's re-provisioned Barclays tenant and fix any issues the merged-theme model introduced.

Status

Field Value
State DONE
Parent story IR Rates synthetic data: dataset seeding, index cleanup, dual-curve, quoting conventions
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-07-29

Acceptance

Plan

(Implementation strategy. Written when work starts; key decisions are distilled into the parent story's * Decisions at close, but the plan itself stays — it is the historical record of what we did.)

Notes

Test Scenarios

Manual QA scenarios (scaffolded via compass add test_scenario, run through the QA Validation Runner panel) that verify this task. Link new ones here as they're created; the scenario doc itself links back via its "Verifies task" field.

Scenario State Notes
Synthetic data themes … Start-at-Root theme picker PASSED Re-run twice against fresh code; failed both first passes, fixed, passed clean on the third.

PRs

PR Title
#1741 [ores.qt] Fix Start-at-Root theme picker for merged synthetic themes

Review

# Comment summary File Decision Notes
5120063524 Claude review: no functional issues; suggested a comment clarifying why rootCollections() is re-fetched in the accepted lambda instead of reusing the outer list MarketSimulatorWindow.cpp Accepted Added the clarifying comment; no other changes requested.

Result

Ran the "Synthetic data themes" scenario end to end against a fresh db recreate + re-provisioned Barclays tenant on a rebased-onto-main build (picking up the start_all() coroutine fix that was otherwise blocking every service in this environment). Confirmed structurally via SQL first: exactly three collection folders (2016 ORE Samples, 2026 Realistic, Uniform Volatility Demo), each with one FX and one Rates asset-class sub-folder – no duplicates, matching this story's Make a synthetic theme one atomic dataset acceptance.

The scenario surfaced three real bugs in MarketSimulatorWindow (projects/ores.qt/synthetic/src/MarketSimulatorWindow.cpp), all fixed in this task:

  1. rootCollections() only scanned direct children of the tree model's true invisible root. buildTree() nests every theme under one real "Synthetic" root folder item instead, so rootCollections() always returned empty and promptThemeAndStart() silently no-opped – the Start-at-Root theme picker was completely unreachable. Fixed by recursing the whole tree instead of scanning one level down.
  2. The Start toolbar action was disabled whenever nothing was selected – exactly the root case that should trigger the theme picker. Fixed by enabling Start when either something is selected or nothing is (the root case).
  3. The theme picker used a floating QInputDialog. Even set Qt::NonModal, it still fought this single-top-level-window MDI app for keyboard focus against sibling subwindows (the Scenario Runner a tester takes notes in). Replaced with an MDI-subwindow- embedded picker (QComboBox + QDialogButtonBox in a DetachableMdiSubWindow), matching the pattern this window already uses for its FX/IR editors.

Also trimmed the picker's prose to a direct question per review feedback ("just ask what to start"), dropping the mutually-exclusive- vintages rationale from the dialog body.

Investigated a fourth report – Uniform Volatility Demo's IR curves not bulk-starting from the theme picker – and confirmed via seed data comments (synthetic_ir_curve_configs_uniform_demo_populate.sql) and service logs that this is by design, not a bug: auto_start = false on that dataset deliberately guards against a real curve_feed_controller tenor-collision with 2026 Realistic (both seed the same currency/index pairs). Left as-is; not folded into this task's fix.

Also investigated a report that 2026 Realistic's PLN-POLONIA curve "did not start" – backend logs confirmed it started cleanly and published curve ticks throughout, so this was not a start failure. Filed as a follow-up (Improve Market Simulator status icons) since the tree's running/stopped iconography is not visually unambiguous enough to tell at a glance, and there is no indicator at all for auto_start = false feeds.

Acceptance met:

  • "Synthetic data themes" scenario passed end to end (Start-at-Root picker appears, starts only the chosen theme, Cancel is a no-op, Stop cleans up).
  • Verified Start/Stop-at-Root starts/stops every asset class under a theme for all three themes (subject to the pre-existing, by-design auto_start=false exception noted above).
  • Two regressions found and fixed in this task's own commit; two further gaps (icon clarity, a broader synthetic-config-topology design question) filed as separate follow-up tasks in this story rather than folded in here.

Emacs 29.3 (Org mode 9.6.15)