Sprint 16

Table of Contents

This page documents a sprint (Sprint 16) of ORE Studio v0. 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

Make ORE import work end-to-end, and land the cross-cutting infrastructure it leans on.

  • ORE import end-to-end: dispatch pipeline, mappers for every instrument family, server-side ores.ore.service, supporting market / fixings / calendar / conventions, golden roundtrip tests, portfolio export.
  • Infrastructure import depends on: workflow engine + saga orchestration, market data subsystem from scratch, ores.controller service lifecycle, Qt plugin architecture, reporting + analytics stack.
  • Surrounding cleanup: trade detail dialog unification, per-type instrument tables, asset-class / product-type separation, UTC- everywhere policy, ~20 Windows portability fixes, party-isolation RLS gaps closed.

The largest v0 sprint to date (157h, 89 tasks across 22 stories).

Status

Field Value
State DONE
Parent version Version 0
Previous Sprint 15
Start 2026-03-30
End (expected) 2026-04-18
Now Sprint closed 2026-04-17.
Waiting on Nothing.
Next Sprint 17
Release Notes Release notes
Last touched 2026-04-17

Achievements

  • ORE import pipeline complete: dispatch pipeline, mappers for every instrument family, supporting files, and golden roundtrip tests.
  • Workflow engine established with generalised event-driven FSM and party provisioning saga.
  • Market data subsystem end-to-end: parser, schema, repo, service, and Qt UI.
  • Qt plugin architecture introduced with 7 domain plugins split from the monolith.
  • Service lifecycle controller with unified NATS heartbeat landed.
  • Reporting and analytics: DQ-sourced report definitions and pricing engine.
  • ~20 Windows portability fixes landed.

Stories

For the definitions of the themes see Themes.

Infrastructure

Story State Start End Description
Party isolation RLS policies DONE   2026-04-09 close the gaps. Continues from sprint 13 party_isolation_books_portfolios_trades.
Generic object storage API DONE   2026-04-03 ores.storage + compute grid migration.
Service lifecycle controller DONE   2026-04-08 ores.controller + unified NATS heartbeat. Continues from sprint 15 compute_grid_ observability.
Qt plugin architecture DONE   2026-04-09 ores.qt.api + 7 domain plugins.
Nats-Session-Id DONE   2026-04-01 session-level correlation.
UTC-everywhere timestamp policy DONE   2026-04-08 canonical UTC API.
Windows portability fixes DONE   2026-04-11 ~20 fixes surfaced by Windows builds.
Engineering hygiene DONE   2026-04-07 clock_cast, nodiscard, codegen profiles, menu repositioning.

Product

Story State Start End Description
Asset class and product_type unification DONE   2026-04-03 rename + analysis + implementation.
Workflow engine DONE   2026-04-06 scaffold + FSM state UUIDs + generalised event-driven engine.
Party provisioning saga DONE   2026-03-31 first concrete saga + UX.
Workflow monitor DONE   2026-04-11 Qt plugin + late fixes.
ORE import pipeline DONE   2026-04-04 the sprint's mission. Continues from sprint 15 fix_ore_import_bugs.
ORE import supporting files DONE   2026-04-03 market.txt + fixings.txt + calendar + conventions.
ORE golden roundtrip tests DONE   2026-03-31 three test PRs.
ORE portfolio export DONE   2026-04-01 exporter + Qt actions.
Market data subsystem DONE   2026-04-01 parser + schema + repo + service + Qt UI.
Reporting and analytics DONE   2026-04-07 DQ-sourced report defs + execution workflow + analytics pricing engine. Continues from sprint 14 reporting_subsystem.
Trade detail dialog unification DONE   2026-04-07 six instrument family merges + IInstrumentForm registry.
Per-type instrument tables DONE   2026-04-10 rates / FX / equity. Continues from sprint 15 cdm_instruments.
Scheduler UI complete DONE   2026-04-11 Job Instances + Monitor.

Agile

Story State Start End Description
Sprint 16 housekeeping DONE   2026-04-17 backlog refinement.

Charts

Charts generated via sprint_charts cmake target.

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.

prs_commits.png

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.

line_churn.png

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.

pr_cycle.png

Cumulative Stories Done

Line chart tracking stories marked DONE during the sprint. Steady upward slope is healthy; plateauing signals a stall.

stories_done.png

Retrospective

What went well

  • ORE import landed end-to-end inside the sprint — pipeline + mappers for all six instrument families + supporting files + server-side service.
  • Workflow engine generalised mid-sprint and immediately consumed two sagas (party provisioning + ORE import); the engine becomes load-bearing infrastructure rather than party-specific machinery.
  • Market data subsystem from scratch in one sprint: parser + schema
    • domain + repository + service + UI.
  • Trade detail dialog unification (six merge PRs + IInstrumentForm registry) closes a long-running UX inconsistency.
  • Qt plugin architecture (ores.qt.api + 7 domain plugins) prepares the codebase for v1's modularity needs.
  • Windows portability sweep — 20+ fixes — gets Windows CI back to green and keeps it there.
  • Asset class unification finally separates risk-taxonomy (asset_class) from structural-routing (product_type).
  • Sprint hit 89 tasks across 22 stories; everything either DONE or documented as next-version work.

What hurt

  • 157h sprint — by far the longest. The breadth was hard to keep coherent + the review queue was substantial.
  • Per-type instrument table refactor (rates / FX / equity) repeats parts of the sprint-15 CDM modelling work; that we needed both passes is evidence the first design wasn't quite right.
  • Trade detail dialog merge surfaced several regressions in intermediate PRs (CDO zero values, new-trade tab visibility, etc.) that lingered across PRs before being cleaned up.
  • Workflow engine generalisation came after the first concrete saga rather than before — saga-2 (ORE import) had to wait while the engine grew up.
  • Windows portability fixes were largely reactive — surfaced by CI rather than prevented by deliberate cross-platform discipline.

What changed

  • ores.controller owns service lifecycle; the dashboard is the visible window into it.
  • ores.qt is now ores.qt.api + 7 domain plugins; the monolith is gone.
  • TradeDetailDialog drives every instrument family via the IInstrumentForm registry.
  • ORE import is end-to-end with mappers for every family + server- side service + supporting market data / fixings / calendar / conventions.
  • Workflow engine is general-purpose; party provisioning and ORE import are both event-driven sagas on top of it.
  • Market data is a real component with its own subsystem.
  • asset_class and product_type are recognised as distinct concepts with shared refdata source of truth.
  • Per-type instrument tables (rates / FX / equity) replace the generic instruments table from sprint 15.
  • Party isolation RLS gaps closed; trading instrument subtables have proper RLS.
  • UTC-everywhere timestamp policy enforced from DB to wire format.
  • Windows is a first-class build target with the ~20 portability fixes that landed this sprint.

Where v0 stands after this sprint

The bulk of v0's mission is now delivered: every ORE entity type is modelled, importable, and manageable through the GUI; the platform has multi-tenant + multi-party RLS, JWT-based auth, NATS-based microservices, a compute grid, a scheduler, a workflow engine, an analytics + reporting stack, and a Qt plugin architecture. v0 remains open — Sprint 17 carries the remaining work and any follow-ups surfaced here.

Emacs 29.1 (Org mode 9.6.6)