Sprint 23
Table of Contents
This page documents a sprint (Sprint 23) of ORE Studio. It captures the sprint's mission, current status, and the stories that compose it. For the surrounding context — version goals, sprint order, and product identity — see Version 0.
Mission
Continue commissioning ores.refdata entities and codegen C++ drift correction.
Status
| Field | Value |
|---|---|
| State | DONE |
| Parent version | Version 0 |
| Previous | Sprint 22 |
| Start | 2026-07-11 |
| End | 2026-07-21 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Open sprint 24. |
| Release Notes | release_notes.org |
| Last touched | 2026-07-21 |
Stories
For the definitions of the themes see Themes.
Product
| Story | State | Start | End | Description |
|---|---|---|---|---|
| Open sprint 23 | DONE | 2026-07-11 | 2026-07-11 | Scaffold sprint 23, wire version manifest, move postponed stories. |
| Retire legacy codegen profile system; add junction support to physical-space codegen | DONE | 2026-07-13 | 2026-07-15 | Deleted the dead facet_catalogue.org/–profile codegen path; junction C++ generation (domain/generator/repository) now works, validated end-to-end against tenor_convention_resolution (hand-authored code retired). At health review 1 (2026-07-20) the 4 remaining BACKLOG tasks (not required by this story's own acceptance) were split into Codegen legacy-profile retirement follow-ups. |
| Generic entity-mirror cache primitive + codegen facet (party as first consumer) | DONE | 2026-07-12 | 2026-07-14 | Build a reusable, thread-safe entity-mirror cache: an immer-based partitioned_cache<PartitionKey,Key,Value> primitive plus a nats-event-cache codegen facet that generates the subscribe/reload wiring for any entity, declared where the entity is defined. Migrate ores.iam.core's party_cache to be its first real consumer, fixing the original subject-mismatch bug as a byproduct. |
| Book data model cleanup | DONE | 2026-07-08 | 2026-07-15 | Carried from sprint 22 (3/9 tasks done); all 13/13 tasks now done: book_status/is_trading_book fixes, book_purpose_type/ledger_feed_type/is_sweepable/rates_centre_code shipped, hierarchy/legal-entity/allowed-lists/Wash-link questions resolved, ledger_ccy renamed to functional_currency, manual chapter enriched, Book window toolbar buttons added via the existing codegen facet. |
| Move book to refdata | DONE | 2026-07-11 | 2026-07-11 | Moved Book/BookStatus/RegulatoryBookType Qt CRUD + plugin wiring from TradingPlugin to RefdataPlugin (no cross-component leakage), incl. a new Reference Data > Book Codes submenu. Portfolio's equivalent move is intentionally separate for parallel work. |
| Book codegen drift remediation | DONE | 2026-07-11 | 2026-07-12 | Regenerate book/book_status/regulatory_book_type against current codegen templates, restore any silently-dropped SQL validations, end-to-end test, then migrate book to composite-entity versioning and regen/test again. Unblocked, resuming. |
| Resolve codegen model unification blockers | DONE | 2026-06-27 | 2026-07-15 | Carried from sprint 22; 6/7 own blockers done (B6/#+has_qt abandoned, superseded). Remaining backlog merged into Retire legacy codegen profile system; add junction support to physical-space codegen. |
| Consolidate history dialogs onto HistoryDialogBase | DONE | 2026-06-05 | 2026-07-21 | Carried from sprint 19; shipped the entire new server-side diff architecture and the single generic HistoryDialog widget, ores.qt.refdata fully migrated. Closed with acceptance narrowed to what shipped; Phase C rollout (retire old per-entity dialogs) split into a Sprint 24 story. |
| Migrate ores.qt.refdata onto the generic HistoryDialog | DONE | 2026-07-14 | 2026-07-18 | Rolled out the generic HistoryDialog widget to every ores.qt.refdata entity; narrowed from all of ores.qt (other components now their own backlog captures). Last two entities (floating_index_type, leg_type) also moved their backend from ores.trading to ores.refdata to fix a component-ownership mismatch. Contributes to unblocking the sibling story's "Retire HistoryDialogBase" task once every component has migrated. |
| IR Rates synthetic data generation | DONE | 2026-07-03 | 2026-07-20 | Carried from sprint 22 (mislabeled ABANDONED there, no such decision recorded): short-rate stochastic process, Curve Template raw instrument generation, tenor-collision validation, tick-batch publishing all DONE. Remaining forward-looking work split into a product-backlog story. |
| Synthetic data collections: Basic and Realistic | DONE | 2026-07-03 | 2026-07-17 | Carried from sprint 22 (6/8 tasks done, mislabeled ABANDONED there): feed namespacing by collection and Market Simulator tree grouping remain. |
| Add a default party per account with a quick-login checkbox | DONE | 2026-07-11 | 2026-07-12 | Account gains a default_party_id; login dialog gets a quick-login checkbox that bypasses PartyPickerDialog; provisioning scripts set the default. |
| Model calendars as proper ORE Studio reference data | DONE | 2026-07-11 | 2026-07-21 | First-class calendar entity with FK-referenceable relationships, replacing free-text holiday_calendar/advance_calendar fields, plus Qt screens (PR #1638 merged). Closed with acceptance narrowed to what shipped; XML export boundary and DQ publish split into a Sprint 24 story. Three extras previously split into a product-backlog story. |
| Cross-rates matrix (CRM) | DONE | 2026-07-11 | 2026-07-18 | Pulled in from product backlog next: driver/derived spanning-tree topology, no-arbitrage triangulation, risk recentering, management UI in ores.marketdata. |
| Commission: day_count_fraction_type | DONE | 2026-07-12 | 2026-07-12 | Pulled in from product backlog next (misfiled under sprint 22): move day_count_fraction_type from ores.trading to ores.refdata alongside the other *_convention entities, commission it fully, repoint trading_swap_legs' one soft-FK. |
| Sprint 23 planning session | DONE | 2026-07-11 | 2026-07-11 | 16 stories seeded into sprint 23; deep backlog refinement audited all 559 items (71 discarded/relocated, 1 merged); bucket rescoring moved 310 items and emptied inbox. |
| Extract stochastic process math from ores.synthetic into ores.analytics.quant | DONE | 2026-07-12 | 2026-07-12 | Moved GMM/OU stochastic processes, process factory, and parameter validation out of ores.synthetic into ores.analytics.quant, with 54 new Catch2 tests and updated component documentation. |
| Commission: business_centre | DONE | 2026-07-12 | 2026-07-15 | Pulled in from product backlog next: update codegen model, enable variability knobs, regenerate, reconcile diffs, verify Qt post-NATS, add manual chapter, capture shell/CLI/Wt/HTTP backlog. |
| Compass improvements | DONE | 2026-07-12 | 2026-07-20 | Catch-all for small compass enhancements: bearings/vcpkg drift check, environment-update tooling. Output-monitoring task split into a product-backlog story. |
| Improve Data Librarian accession card UI/UX | DONE | 2026-07-12 | 2026-07-13 | Promoted from deferred backlog. Redesign the dataset detail dialog into a persistent-header, two-column layout with merged Provenance/Methodology tab, per a Gemini UI review. |
| Commission: contact_type | DONE | 2026-07-13 | 2026-07-13 | Rebuilt contact_type's codegen model from the current meta-model and regenerated every layer, verified the Qt UI end-to-end post-NATS (11/11 scenario steps), and filed backlog captures for shell/CLI/Wt/HTTP support; manual chapter deferred to a backlog capture since contact_type is an aux type that documents as a subsection of the not-yet-written Contact chapter. |
| Commission: party, counterparty, and party_status | DONE | 2026-07-13 | 2026-07-20 | Consolidates and supersedes the three Sprint 22 per-entity commission stories, now that their shared blockers (composite hierarchy Qt widgets, temporal composite versioning) are DONE: party/counterparty regenerated zero-diff, Qt UI verified end-to-end post-NATS, manual chapters for all three written. At health review 1 (2026-07-20) the 2 remaining independent tasks were split into Party/counterparty follow-ups in the product backlog. |
| Commission: portfolio | DONE | 2026-07-16 | 2026-07-18 | Codegen/drift and manual-chapter tasks both DONE. Two non-blocking follow-ups split into Portfolio display follow-ups in the product backlog. |
| Sprint health review — System 2 analysis | DONE | 2026-07-20 | 2026-07-20 | System 2 health review 1: RED overall (sprint load and focus both RED, 2 days past planned close). |
| Codegen legacy-profile retirement follow-ups | DONE | 2026-07-20 | 2026-07-20 | Split from the now-DONE "Retire legacy codegen profile system" story: split-model backcompat removal (B7, PR #1652) DONE in jolly_knuth, absorbing the duplicate table-model-type task as ABANDONED. Mustache-to-address renames and the junction-codegen rollout split further into Codegen: mustache-to-address rename + junction codegen rollout in the product backlog. |
Hotfixes
| Story | State | Start | End | Description |
|---|---|---|---|---|
| Hotfix: Windows Clang CI compiler-launcher wrapper | DONE | 2026-07-11 | 2026-07-11 | windows-clang-debug-ninja and windows-clang-release-ninja fail to configure because the clang preset's environment launcher (a .sh wrapper) leaks into CMake's project()-time compiler detection on Windows. |
| Hotfix: ores.iam.core build fails, missing ores.eventing.core include dependency | DONE | 2026-07-14 | 2026-07-14 | party_cache.hpp includes ores.eventing.core/service/cache/partitioned_cache.hpp but ores.iam.core's CMakeLists.txt doesn't depend on ores.eventing.core, so the include path is missing and the build fails. |
| Improve badge colour scheme support | DONE | 2026-07-15 | 2026-07-21 | Shipped the badge_mapping browser UI and migrated badge_definition/badge_severity/code_domain onto standard codegen + DQ publishing. Closed with acceptance narrowed to what shipped; remaining scope split into two Sprint 24 stories: visual polish/self-badging fixes and badge adoption coverage audit/rollout. |
| Commission ores.qt.dq — full-stack codegen for the DQ component | DONE | 2026-07-16 | 2026-07-21 | catalog/change_reason/change_reason_category/data_domain commissioned onto standard codegen; lookup_entity architecture unified into domain_entity. Closed with acceptance narrowed to what shipped; remaining scope split into two Sprint 24 stories: commission remaining DQ entities and codegen infrastructure follow-ups. |
| Clean up application menus | DONE | 2026-07-16 | 2026-07-18 | The application's menu structure has grown organically and is now inconsistent: Reference Data menu is a grab-bag, System menu mixes app-chrome with operational concerns (Telemetry, Message Queue, Administration), Data Management menu is misleadingly named for what's actually transfer/import actions, and there's no coherent home for DQ metadata entities (change reasons, code domains, badges, etc.). Redesign the menu structure from first principles: System = app chrome only (Testing, Reset); Operations = Jobs, Workflows, Data Transfer, Data Catalogue, Telemetry, Message Queue, Administration; Reference Data = cleaned up; Data Quality = new menu for DQ metadata entities. |
| Hotfix: ores.dq.core fails to build, missing ores.diff link | DONE | 2026-07-17 | 2026-07-17 | ores.dq.core includes ores.diff headers but its CMakeLists never links or includes ores.diff.lib, breaking the build. |
| Hotfix: Windows CI builds timing out / failing on header dependency scanning | DONE | 2026-07-19 | 2026-07-19 | Windows CI (msvc-release and clang-debug/release) consistently fails or times out at 6h because CMake's automatic C++ module dependency scanning (clang-scan-deps) invokes via cmd.exe, whose ~8191-char command-line limit truncates the very long include/define argument list, silently dropping the ores.diff include path and causing 'file not found' errors or scanner hangs. Fixed by setting CMAKE_CXX_SCAN_FOR_MODULES OFF (PR #1645). |
| Hotfix: Windows link fails, ir_curve_template_resolver free functions not exported | DONE | 2026-07-20 | 2026-07-20 | lld-link: undefined symbol for ores::synthetic::service::resolve() (and sibling free functions in ir_curve_template_resolver.hpp) when linking ores.synthetic.service.tests.exe on windows-clang-debug-ninja – the functions are missing the ORES_SYNTHETIC_SERVICE_EXPORT macro, so they never make it into the DLL's export table on Windows, though the default ELF/Mach-O visibility on Linux/macOS hides the gap. Fixed by exporting the three free functions; verified locally on Linux, Windows CI is the real check. |
Achievements
Milestones worth capturing as they happen, so the release notes at
sprint close have the evidence to hand. Add a dated ** subheading
per milestone, with any screenshot via [[proj:assets/images/<file>.png]].
IR synthetic data generator (2026-07-20)
The Market Simulator's IR side end-to-end: a CIR short-rate process
configured live (Simple/Advanced engine controls, curve-shape preview,
sample short-rate paths), feeding a running CAD CORRA collection
alongside the existing FX collections. Known limitation: ticks are
being treated as full trading days by the process update step, so a
day's worth of mean-reversion/volatility lands every real-time
update_frequency interval (60s here) instead of once per day —
producing rate swings of thousands of basis points within minutes.
Consistent with the day-scaled kappa and sigma defaults still
producing unrealistic (~150-250) rates in the seeded
synthetic.ir_curve_configs.basic dataset over longer tick counts —
same missing dt scaling factor, not a separate bug. See
the story's Now field and
the release notes' Known Limitations section for detail. Analysis and
fix deferred to next sprint. Also note: every seeded curve is
single-curve (self-discounting) only, not a discounting/projection
dual-curve model — correct for the seeded overnight RFR indices, not
yet for IBOR-style term indices; tracked in the IR Rates follow-on
backlog story.
Interest rates and calendars (2026-07-20)
The new calendar reference-data entity (US/UK financial-centre and
public-holiday calendars) alongside the Interest Rates series browser
and live Curve Snapshot windows (grid + bucketed history + curve-shape
chart) for USD/SOFR and EUR/ESTR.
Cross-rates matrix (2026-07-20)
Three live Cross-Rates Matrix windows (majors, scandies, exotics)
plus the Market Series browser — derived rates computed from drivers
and updating on a 5s interval, each with an FX Pair Overview
sparkline. Known limitation: the CRM has no interest-rate awareness —
it triangulates pure FX spot ratios, with no way to represent
forward points, covered-interest-rate-parity, or spot-date lag
(today + spot lag, typically T+2), all of which are IR-driven. Scope
deferred to next sprint, pending the IR scaling fix above.
Data Librarian accession card redesign (2026-07-20)
The Data Librarian's dataset detail dialog ("accession card") redesigned into a persistent-header, asymmetric two-column layout — Provenance & Methodology and Dependencies tabs, shown here across three datasets (Currency Pair Convention Calendars, Calendars, and FpML Asset Class).
Generic history dialog with GitHub-style diff view (2026-07-20)
Every ores.qt.refdata entity now shares one HistoryDialog: a
version timeline plus a GitHub-style unified diff between any two
versions, with field-level highlighting. Shown here on Currency
history (ANG's DQ import lineage; AOA's v2=→=v3 "Angolan Kwanza2" →
"Angolan Kwanza" typo rectification).
Captures
Real captures filed during this sprint that have not been pulled into a
story as tasks — listed here purely for visibility into what the sprint
surfaced. Each is an inbox capture (compass capture); triage them at the
health review (promote to a story, move to next, or discard).
| Capture | Tags | Description |
|---|---|---|
Health Review
| # | Date | Day | Overall | Task |
|---|---|---|---|---|
| 1 | 2026-07-20 | day 9 | RED | Health review 1 — sprint 23 analysis |
Charts
Charts generated via compass sprint charts. See Sprint health charts for what each chart measures, its purpose, and how to read it.
PRs & Commits per Day
Dual-axis bar chart. PRs (left axis) and commits (right axis) per day. A high commits-to-PR ratio may indicate scope creep.
Daily Line Churn
Lines added (green) and deleted (red) per day. Building work produces mostly additions; refactoring produces a mix. Days with no churn may indicate blockers.
PR Cycle Time
Hours from PR open to merge, one bar per PR. Long bars indicate review bottlenecks. Generated only when PR data is available.
Cumulative Stories Done
Line chart tracking stories marked DONE during the sprint. Steady upward slope is healthy; plateauing signals a stall.
Retrospective
(Filled at sprint close.)
Release Notes
See release_notes.org for the full narrative.