Sprint 25

Table of Contents

This page documents a sprint (Sprint 25) 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.

1. Mission

Resolve sprint drift on as many components as possible and progress IR curves work.

2. Status

Field Value
State DONE
Parent version Version 0
Previous Sprint 24
Start 2026-08-03
End (expected) 2026-08-10
Now Closed. See Sprint 26.
Waiting on Nothing.
Next Nothing.
Release Notes Sprint 25 release notes
Last touched 2026-09-23

3. Stories

For the definitions of the themes see Themes.

3.1. Product

Story State Start End Description
Open sprint 25 DONE 2026-08-03 2026-08-04 Scaffold sprint 25, wire version manifest, move postponed stories.
Acme Corporation follow-ups: manual chapter, logo fixes, synthetic feeds DONE 2026-08-03 2026-09-23 Extension work beyond Commission Acme Corporation's own acceptance, split off at sprint 24 close. Reopened 2026-08-09 for the fit-for-purpose review task.
Find root cause of FX Spot Monitor wire-codec decode mismatch DONE 2026-08-03 2026-08-04 Deferred from sprint 24: fx_spot_subscription silently fails to decode ticks under msgpack despite both sides resolving msgpack at startup. Root cause found and fixed; live investigation also fixed two CRM bugs (stale JWT, party scoping).
Holding company treasury functionality: FX/CRM visibility, Group Treasury book, consolidated reporting DONE 2026-08-05 2026-08-07 Acme's holding company party has no CRM/treasury data at all – surfaced while investigating the wire-codec story above. FX visibility, Group Treasury book, and a consolidated-reporting investigation.
Refactor ores.codegen C++ generation ABANDONED 2026-05-30 2026-09-23 Audit and resolve drift between C++ templates and production files: fix template bugs, fix model consistency, register all C++ components in the CLI, achieve zero-diff regeneration across all domain entities.
Entity classification and drift baseline across all components DONE 2026-09-03 2026-09-04 Program coordination vehicle (2026-09-03): the 12 stories below run foundations-first under one canonical per-component method (compass-codegen-fix-drift); retires the 3 stale manual-tracking docs; the quantified report is dropped, the per-component surveys supersede it.
Component architecture audit: first run on the drift-free components DONE 2026-09-06 2026-09-07 Recurring component architecture audit, first run on ores.refdata, ores.dq, ores.iam, ores.compute: 15-item checklist document, composite-aware doc validation, per-component records with lizard measures, and the compute job lifecycle doc.
Systemd resource management and per-environment isolation DONE 2026-07-31 2026-08-05 Pulled from product backlog: converge compass onto systemd for process lifecycle across the fleet, root-causing the 2026-07-31 reboot's cgroup-unaware process management.
Entity classification and drift baseline: ores.dq DONE 2026-08-04 2026-08-08 Per-component rollout of the ores.refdata pilot pattern: bind dq/dq-cpp entities to profiles, verify zero-diff regen, extend the CI drift check.
Entity classification and drift baseline: ores.iam DONE 2026-09-05 2026-09-05 Per-component rollout of the ores.refdata pilot pattern: bind iam/iam-cpp entities to profiles, verify zero-diff regen, extend the CI drift check.
Entity classification and drift baseline: ores.trading DONE 2026-09-06 2026-09-06 Per-component rollout of the ores.refdata pilot pattern: bind trade/trading-cpp entities to profiles, verify zero-diff regen, extend the CI drift check.
Entity classification and drift baseline: ores.synthetic DONE 2026-09-07 2026-09-08 Run the compass-codegen-fix-drift method: bind synthetic entities to profiles, verify zero-diff regen, extend the drift gate. Closed by the post-merge live system test (9-entity CRUD via ores.shell); the tpl/ppv table-display defect it caught was fixed at source.
Entity classification and drift baseline: ores.marketdata ABANDONED   2026-09-23 Run the compass-codegen-fix-drift method: bind marketdata entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: ores.analytics DONE 2026-09-17 2026-09-23 Run the compass-codegen-fix-drift method: bind analytics-cpp entities to profiles, verify zero-diff regen, extend the drift gate. The bind is done and merged; the story waits on the post-merge live system test.
Entity classification and drift baseline: ores.compute DONE 2026-08-10 2026-09-05 Per-component rollout of the ores.refdata pilot pattern: bind compute-cpp entities to profiles, verify zero-diff regen, extend the CI drift check.
Entity classification and drift baseline: ores.database ABANDONED   2026-09-23 Run the compass-codegen-fix-drift method: bind database-cpp entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: ores.reporting DONE   2026-09-23 Run the compass-codegen-fix-drift method: bind reporting-cpp entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: ores.scheduler ABANDONED   2026-09-23 Run the compass-codegen-fix-drift method: bind scheduler-cpp entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: ores.workflow ABANDONED   2026-09-23 Run the compass-codegen-fix-drift method: bind workflow-cpp entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: ores.workspace ABANDONED   2026-09-23 Run the compass-codegen-fix-drift method: bind workspace-cpp entities to profiles, verify zero-diff regen, extend the drift gate.
Entity classification and drift baseline: redundant explicit properties DONE 2026-09-17   Across the components in the drift gate's known-drift-free registry, remove the explicit model properties the profile already fixes to the same value. Keep genuine overrides, the structural properties profiles deliberately omit, and has_parent_id, which the generator then read from a place the profile did not write (fixed the same day, and the four lines came out). Prove each removal output-neutral by regeneration.
Complete the market series classification DONE 2026-09-17 2026-09-23 Finish the classification rollout: lift the ORE-vocabulary mapping out of import_service into a testable class, cover every series type the ORE corpus carries, and let a market series belong to more than one asset class through a junction table.
IR curve bootstrapping + official curve republish DONE   2026-09-23 Pulled from product backlog: bootstrap the raw instrument grid into a desk-consumable zero/discount curve and republish it as an official curve stream.
FOMC-dated OIS short end: calendar-event model and flat-forward pillars DONE 2026-08-09 2026-08-11 Decide and implement how FOMC meeting dates enter the model: FOMC dates as typed events on a currency calendar, a unified FOMC/IMM/tenor resolution model, then bootstrap the SOFR OIS short end off FOMC-dated pillars with flat-forward interpolation.
Feed lifecycle harmonization: asset-class-agnostic feed control-plane DONE   2026-09-23 The feed control-plane (folder start/stop cascade, per-config start/stop/list, auto-start) is implemented per asset class; harmonise it behind one common feed interface and a per-kind factory so every control-plane verb works for any asset class, ores.shell covers all asset classes, and a new asset class plugs in via one factory registration.
Asset-class-agnostic Market Simulator client: shared IR/FX config UX ABANDONED   2026-09-23 The Market Simulator client implements the same generation-config UX once per asset class: MarketSimulatorWindow builds the tree, walks selections, and dispatches new/edit/delete per asset class (delete is hardcoded to FX, so IR deletes silently no-op), IrCurveEditor was copy-adapted from FxSpotRateEditor, and the parameter rows IR drives from its definitions table are the rows FX hardcodes. Make the client stack asset-class-agnostic so a new asset class registers once instead of copying the window or the editor again.
IR Rates synthetic data: dataset seeding, index cleanup, dual-curve, quoting conventions ABANDONED   2026-09-23 Pulled from product backlog: follow-on from Sprint 23's IR Rates synthetic data generation – seed a realistic vintage dataset, normalize duplicate floating-index catalogs, extend to dual discount/projection curve, add IR quoting-convention display.
Documentation improvements DONE 2026-08-04 2026-09-23 Ongoing improvements to ORE Studio's documentation and public-facing site. Tasks are added incrementally as ideas come up.
Collapse NATS config passthrough to a single environment-mapper fallback tier ABANDONED 2026-08-04 2026-09-23 Promoted from inbox: a new shared NATS knob currently needs manual fixes in five places (process_supervisor, SQL args_template, systemd_generate.py, compass_services.py, ores.qt); add a shared ORES_NATS_* fallback tier to environment_mapper_factory so services read it straight from .env.
Synthetic data scope and binding: system/tenant/party levels, bound vs sandboxed DONE 2026-08-04 2026-08-08 Add orthogonal scope (system/tenant/party) and binding-mode (bound/sandboxed) axes to synthetic configs so ACME's parties share one reality and testing can consume synthetic data without affecting real feeds.
Injectable environment provider in ores.platform for test-safe, parallel-safe env var access DONE 2026-08-07 2026-08-07 Follow-on from the NATS config passthrough story: environment_provider abstraction with real_environment_provider and fake_environment_provider implementations; scoped_environment_override RAII guard; 11 config-parser tests migrated from scoped_env_unset to the new mechanism.
Reduce and configure per-service DB connection pool size DONE 2026-08-04 2026-08-05 Bundle the pool-size reduction and runtime-configurability captures, plus an audit of compass services start's systemd integration, to lower steady-state Postgres connection load.
Review whether ores.cli/ores.shell's host.cpp divergence is load-bearing or historical DONE 2026-08-05 2026-08-05 ores.cli and ores.shell are the only two tools left out of the shared run_host_async helper – review in detail whether their differences are genuinely necessary or just how the tools happened to be written.
Compass quality-of-life improvements: remaining follow-ups DONE 2026-08-06 2026-08-06 Pulled from product backlog: mop up seven self-contained compass DX improvements – branch pruning, systemd scope info, named .env files, compass show full-content flag, blocked dependency tree in compass where, per-environment fleet status, compass help command.
Extract a sync sibling of run_host_async for ores.cli/ores.shell DONE 2026-08-05 2026-08-05 Follow-on from the host.cpp divergence review: ores.cli and ores.shell's host.cpp bodies share ~70% structure with each other despite being correctly excluded from the async run_host_async helper; extract a sync sibling parameterised by a construction callable.
Backlog deep refinement DONE 2026-08-05 2026-08-07 Deep audit of all product-backlog captures: inbox/next/deferred verified against the codebase, duplicates merged, buckets re-scored against sprint 25 mission. First run.
Fix codegen template drift DONE 2026-09-04 2026-09-04 Fix four codegen template bugs: history mapper provenance fields, compound-key is_uuid gating, pagination footgun, junction template follow-ups.
Close systemic codegen gaps DONE 2026-09-04 2026-09-04 Close two systemic codegen gaps: RLS policy facet (no template emits RLS policies) and history provider registrar codegen (918-line hand-maintained file).
Shared test database rerun safety DONE 2026-09-04 2026-09-04 An aborted fixture-writing test suite can leave synthetic rows open in the shared per-worktree test database; the next run then aborts on duplicate keys. CDash Experimental must be rerunnable without manual database surgery.
IR curve follow-ups DONE   2026-09-23 Three IR curve follow-ups: expand stochastic process types, fix seed data/combo gaps, investigate tenant_type drift.
Add new stochastic processes ABANDONED 2026-08-11 2026-09-23 Add new stochastic process types for FX and IR: finish the unwired IR engines (Black-Karasinski, BDT, affine, HJM, LMM, QG) by wiring them into the system, add further IR models (two-factor Hull-White, shifted log-normal, normal/Bachelier), and add an FX jump/Poisson process engine. SABR and vol-surface models are out of scope.
Investigate hand-added cross-service grants in generated iam_service_db_grants_create.sql DONE 2026-08-06 2026-08-06 Found while removing controller from the db recreate pipeline (PR #1867): regenerating iam_service_db_grants_create.sql drops hand-added cross-service grants the generator does not emit. Investigate whether the registry model/template should express per-service cross-domain grants so generation is lossless, and close the drift so regeneration never silently drops grants.
Normalise NATS protocol message shapes and inventory hand-written drift DONE 2026-08-07 2026-08-07 Audit request/response structs for consistent shape (success/message fields per codegen convention) and inventory protocol messages hand-written instead of generated via ores.codegen's cpp_protocol template.
Migrate to oresmd, delete market_series qualifier and ore_key DONE 2026-07-28 2026-08-07 Carried from sprint 24: migrate ir_curve_generation_config, market_series, and fx_spot_generation_config onto oresmd, then delete the legacy free-text qualifier/ore_key fields — single scheme, no permanent coexistence. XML round-trip descoped to Extend oresmd story.
Extend oresmd to full ORE quote-type coverage DONE 2026-08-07 2026-08-10 Carried from sprint 24: extend oresmd from ~7 of 49 ORE quote types to full coverage across all asset classes — new families (inflation, correlation), new metric/dimension fields, new volatility-surface sub-schema. 9 tasks, all done.
Remote WSL offload and compute nodes DONE 2026-08-10 2026-08-10 The WSL remote-host arc consolidated into sprint 25: containerize + deploy to Newton (sprint 24), the compass env deploy command family (runtime and compute roles), and a remote compute node joining the serving environment end-to-end.
Port trading instruments to codegen ABANDONED 2026-08-05 2026-09-23 Umbrella for the trading-instrument-to-codegen port: the decision/pilot (PR #1857), the remaining ~19 conversions (PR #1874 and ongoing), and the NATS eventing facet retrofit onto converted instruments (PR #1896). 15/19 converted.
Absorb PR checks locally: targeted checks, local review, CDash submissions DONE   2026-09-23 We spend too long waiting for GitHub PR checks. Absorb their cost locally: classify each change and run only the checks it needs; review code locally as a skill with findings registered on the task; submit builds to CDash as experimental. GitHub keeps the continuous builds and nightlies.
Adopt oresmd as the native market data identity across simulator, UIs, and shell ABANDONED 2026-08-11 2026-09-23 Make oresmd the single native market data identifier across the market simulator, all Qt UIs, and ores.shell, abandoning ORE-shaped representations on persisted entities. First task: the analysis that decides fields-vs-URI storage.
party/counterparty_identifier_generator tests assert stale version/change_reason_code DONE 2026-08-11 2026-08-11 generators_tests.cpp still expects version==1/system.new for party_identifier and counterparty_identifier generators, but the generators produce version==0/system.test — same stale-expectation pattern already fixed for the contact_information generators. Investigation confirmed the fix already landed on main (90ad8693be, c113b851e, 123ca2bfa, d0458e500); closed as done elsewhere.
Harden the eventing chain against transient notification loss DONE   2026-09-23 Follow-up to the eventing integration test flake hotfix: fix the production loss windows the tests now tolerate — the postgres listener reconnect path drops in-flight NOTIFYs, and NATS publish failures are swallowed by publish_entity_event and the event_bus.
Verify the compute-grid and tenant flows from the desktop UI ABANDONED   2026-09-23 UI verification of the compute-grid and iam/tenant flows the post-merge system-test report drove through ores.shell only. Runs when a UI session is available: tenant provisioning, lookup, RLS isolation and delete, and compute batch, dispatch, workunit and result flows through the desktop client, recording the UI-only findings (permission gating, error rendering, the F2/F3 protections) the shell cannot see.
Standardize the compass pr create body template with a Testing section DONE 2026-09-06 2026-09-06 compass pr create emits one fixed body template – Summary, Changes, Traceability and a mandatory Testing section (Plan, Evidence, Limitations) from required –testing-plan/–testing-evidence/–testing-limitations flags, plus the footer. PR #2021 was raised without the Testing section again; PR #2020 lost its Traceability table to a wholesale body overwrite.
Manage trading entities from the shell DONE 2026-09-07 2026-09-08 Minimal per-entity ores.shell trading verbs - list, get, add, delete and history over trade_type, party_role_type, trade_id_type, lifecycle_event and trade - built as codegen-ready per-entity command units in a per-component folder, so the ores.trading bind post-merge system test can run without a UI.
Lay the foundation of the LLM skills catalogue DONE 2026-08-25 2026-09-23 Put the skills catalogue on one model: the compass- namespace, cybernetic levels, cited principles, ported methods, the compass-helm mode, selection instrumentation and the regulator specification, with the codegen and build fixes that work surfaced. Remainder moved to the inbox story Complete the LLM skills catalogue.
Redesign ores.trading on data-oriented principles ABANDONED   2026-09-23 Program: review the whole ores.trading data model with the data-oriented criteria and move it to the correct data-oriented shape across several PRs – model every persisted family in the modeling orgs in the normalised relational shape (atomised entities with keys and foreign keys, no object graph), grow the org grammar to express nested domain groups, column mapping, custom service methods and wire consolidation, then align the service layer and the wire to the atomised model. First PR: the in-depth analysis.
Trade entry prototype: structure-based booking screen ABANDONED 2026-09-11 2026-09-23 Throwaway clickable prototype of a trade entry screen built around structures rather than single trades: a structure panel managing components of any ORE product type, a specialised widget per product family, a companion pricing screen whose Book button carries the initial NPV across, and audit and versioning surfaced at structure level. Produces the decisions the screen forces, not production code.
refdata fixtures depend on a currency row no fixture writes DONE 2026-09-11 2026-09-11 write_book_publishes_nats_changed_event fails under full-suite ordering: the book fixture writes a generated parent portfolio whose aggregation_ccy the generator hardcodes as X-0, and seeds no X-0 row for the write tenant. Only the first synthetic-currency call in a process emits X-0, so its presence is test-order dependent. Fixed in the eventing-test template and core.py, not in the generated files, with the generators' false invariant corrected.
Split ores.shell into composable parts DONE 2026-09-16 2026-09-16 Split ores.shell into api and application parts behind one CMake root and declare it a codegen composite, so a domain adapter can link the shell plumbing without the REPL host and codegen has a part to write a command unit into. The component architecture audit ran against the split, and the naming rule for a part named after a component is now in the catalogue.
Generate shell command units per component ABANDONED   2026-09-23 Land the ores.cpp.shell-command facet and generate each component's shell command units into its own adapter part of ores.shell, retiring the hand-written units component by component. ores.trading goes first: its units land in the new ores.shell.trading part.
Classification catalogs as data DONE 2026-09-17 2026-09-17 Move the asset class and series subclass vocabularies out of C++ enums and into refdata catalogs: the asset class taxonomy becomes the seven classes the analysis fixed, a new series_subclass_code catalog ships end to end, and consumers read the codes and their labels from the tables.
Migrate remaining ~100 entity models from JSON to org ABANDONED   2026-09-23 Complete the org-migration story: convert the remaining legacy JSON-format entity models to the literate .org entity-model format.
Integrate the Volga TypeScript UI as ores.web DONE 2026-09-19 2026-09-19 Adopt the Volga TypeScript web-UI prototype as projects/ores.web: generate its TypeScript from ores.codegen instead of copying it by hand, retire projects/ores.typescript, and add the component to the services subsystem on a port inside the environment range.
Implement every IAM entity in the web client DONE 2026-09-20 2026-09-23 Build every IAM entity inside ores.web from the shared entity shell, so a new entity is a declaration rather than a set of pages. The measurement is in the story: the one entity on the shell today costs about 877 lines of new files plus edits to six shared files, for 37 lines of real judgement, and the Qt client being replaced differed by 40-46% between two entities of the same kind. Closing that comes first; the eleven IAM wire types are then built in four groups.
Prototype the post-setup IAM journeys in ores.web ABANDONED 2026-09-23 2026-09-23 Revisit the post-setup IAM screens from first principles: identify the member and tenant-administrator journeys from user goals rather than from the entities, then prototype each one. Accounts come first. The map stops at accepted prototypes.
Sprint health review — System 2 analysis DONE 2026-08-07 2026-09-23 Recurring System 2 health reviews of sprint 25: review 1 at mid-sprint (AMBER), review 2 at close (RED).
Sprint 25 closure: story cleanup and reset for sprint 26 DONE 2026-09-23 2026-09-23 Close out sprint 25: close every story that is finished, abandon the superseded codegen, web and half-finished approaches, split the skills catalogue story, and file one clean capture for the IR work.

3.2. Hotfixes

Story State Start End Description
Hotfix: mint_token_respects_the_requested_ttl flaky on nightly (1s JWT TTL) DONE 2026-08-04 2026-08-04 Test mints a JWT with a 1-second TTL and validates it immediately with zero verifier leeway; on slower/loaded nightly runners the token expires before validation, causing a spurious failure.
Hotfix: shared NATS fallback tier leaks .env into parse-defaults tests DONE 2026-08-04 2026-08-04 PR #1819's generic ORES_NATS_* shared-domain fallback tier makes 11 service config_parser test suites fail their parse_defaults_returns_expected_values case, because the checkout's real .env NATS URL/subject-prefix now leaks in as a fallback where the test expects the coded default with no overrides.
Hotfix: MSVC rejects ScopeLabel.hpp due to ambiguous scope identifier DONE   2026-08-05 Windows (MSVC) build breaks on ScopeLabel.hpp:34 — the using-declaration and parameter named 'scope' collide; MSVC resolves 'scope' in 'switch (scope)' as the type rather than the variable.
Hotfix: Replace setenv/unsetenv with ores.platform::environment in tests DONE   2026-08-06 Windows (Clang/MSVC) builds break because setenv/unsetenv are POSIX-only; 12 test files use them and must switch to the portable ores.platform::environment wrapper.
Hotfix: macOS CI fails to start NATS server, nats-server not installed DONE     Continuous MacOS CI aborts at the Start NATS server step: the nats-server binary is only installed inside the Run CTest workflow step (brew install autoconf automake libtool autoconf-archive nats-server), which runs after the step that launches it, so the launch emits command not found and the 30s readiness poll fails. Linux CI installs it via compass env install-packages and Windows CI downloads a GitHub release (v2.10.24) – three platforms, three sources, three versions. Introduced by commit 41a07950e which added the Start NATS server step to all four workflows. Fix: every CI workflow gets an identical Setup NATS server step running the shared build/scripts/setup_nats_server.sh (PowerShell equivalent setup_nats_server.ps1 on Windows), which unpacks the vendored nats-server v2.14.3 release (external/nats/packages) and puts it on PATH – one pinned binary on every platform instead of apt/brew/GitHub-download.
Manage the compute grid from the shell DONE   2026-09-23 Comprehensive ores.shell compute verbs so compute-grid tests run without a UI: add and list apps, app versions, platforms, hosts and batches; add batches and dispatch jobs; download job inputs and outputs; monitor grid health per node; plus a smoke-test script that dispatches 10-20 consecutive jobs and asserts every online node was exercised.
Hotfix: Valgrind flags NATS one-time init blocks as leaks on eventing tests DONE 2026-08-10 2026-08-10 CDash dynamic analysis flags 21 still-reachable leak records on three components (ores.trading.core.tests, ores.reporting.core.tests, ores.refdata.core.tests), all from the NATS C library one-time global init (nats_openLib) reached via the eventing client connect. Add narrow suppressions to build/valgrind/custom.supp and create a valgrind recipe.
Hotfix: NATS cert generation fails on macOS/Windows (missing `ip` command) DONE 2026-08-11 2026-08-11 NATS certificate generation fails on macOS and Windows because `_local_ipv4_addresses` shells out to the Linux-only `ip` binary and never reaches its gethostname fallback.
Hotfix: rate_tree fails to compile on Windows DONE 2026-08-11 2026-08-11 rate_tree.cpp calls std::to_string without including the string header, breaking the MSVC build.
Hotfix: stochastic process statistical tests fail on macOS CI DONE 2026-08-12 2026-08-12 Sample-variance and drift-mean Monte Carlo tests in ores.analytics.quant fail on macOS because their tolerances are tighter than the tests' own standard error.
Hotfix: Windows build fails on std::getenv deprecation DONE   2026-08-12 Windows CI compiles with -Werror -Wdeprecated-declarations: std::getenv is deprecated in MSVC's STL in favour of _dupenv_s. The generated eventing integration tests (and two hand-written ores.synthetic tests) call std::getenv, so every such file fails the Windows build, e.g. account_type_eventing_integration_tests.cpp:60.
Hotfix: Windows link fails on missing IFeed ctor/dtor exports DONE   2026-08-18 Windows CI fails at the link of ores.synthetic.api.dll in all three configs (clang-debug, msvc-debug, msvc-release): lld-link: error: undefined symbol: __declspec(dllimport) ores::marketdata::domain::IFeed::IFeed(void) and ~IFeed(void), referenced from fx_spot_feed/ir_curve_feed (feed_factory.cpp, fx_spot_feed.cpp). IFeed is ORES_MARKETDATA_API_EXPORT (dllimport in consumers) with inline-defaulted ctor and virtual dtor in i_feed.hpp; the abstract class is never constructed or destroyed inside ores.marketdata.api, so the producer never emits or exports them.
Hotfix: read_latest_party_types returns empty results DONE   2026-08-19 party_type_repository::read_latest() returns empty vector despite written records. Temporal field mismatch or trigger malfunction.
Hotfix: eventing integration test flakes on Windows CI DONE 2026-08-25 2026-09-23 The eventing integration test occasionally fails on Windows CI because a transient notification drop exceeds the poll budget.
Hotfix: Windows build broken on unistd.h include DONE   2026-08-31 The Windows CI build fails because postgres_listener_service.cpp includes unistd.h, which MSVC does not provide.
Hotfix: CI builds red across all OSs on value_or({}) in the generated result mapper DONE 2026-09-06 2026-09-06 The result-mapper codegen template emits value_or({}) for nullable numerics; the CI compilers gcc 13 and Apple clang cannot deduce the value_or template parameter from a braced-init-list, while MSVC and clang-cl accept it. The fix emits value_or(0).
Hotfix: Valgrind flags compute host ram_mb/credit_total read uninitialized DONE 2026-09-07 2026-09-07 CDash dynamic analysis flags 299 uninitialised-value errors when the generated host eventing integration test writes a synthetic host: the org declares :default: 0 (SQL-side) but never :default_value:, the key the class-header template emits into the C++ member-initializer list, and codegen synthesizes an initializer for bool/int members alone, so ram_mb (int64_t) and credit_total (double) stay indeterminate and sqlgen's dynamic INSERT stringifies them. The fix declares :default_value: 0 on both members.
Generate realistic trade populations for Acme using ORE's TradeGenerator ABANDONED 2026-09-07 2026-09-23 Evaluate ORE's Python TradeGenerator as the source of Acme's synthetic trade population: generate ORE trade XML across asset classes, import it through the existing ores.ore mappers, and distribute the result across Acme's 36 portfolios in a way that is realistic rather than uniform.
Update ORE to v17 ABANDONED   2026-09-23 Sync the vendored ORE examples and XSD to v1.8.17.0, build and vendor the new engine package, and keep the v1.8.16.0 package in service beside it.
Hotfix: CI builds red across all OSs on the payload decode fold and the ascot member DONE 2026-09-13 2026-09-13 Six independent defects put every OS's continuous build in the red: gcc 16 rejects the name collision between the ascot member and its ascot type in bond_instrument_data; clang 19 and AppleClang segfault inside TransformCXXFoldExpr while instantiating decode_with_legs for the rates family; MSVC promotes C4251 to an error on ores.platform's exported exception classes; clang on Windows reports nine unused functions in the generated ores.ore domain.cpp because the generated XSDCPP_MAYBE_UNUSED macro gives the attribute only to GNUC; the Nightly Include Hygiene job cannot configure because it never installs Qt6; and the bond future exporter test document still carries the pre-v17 shape the loader rejects. One PR carries all six fixes.
Hotfix: Continuous Linux gcc jobs red on two constructs in the generated domain.cpp DONE 2026-09-15 2026-09-15 Continuous Linux is red again on the commit that merged the previous hotfix. Both gcc jobs fail in the generated parser at ores.ore/core/src/domain/domain.cpp: a case label falls through to the default label behind a // no break comment, which gcc does not accept as a fallthrough marker, and gcc 16 also reports a loop counter that is set but never read. Clang raises neither, so every clang job passes. The tree has not compiled clean under gcc since -Wall and -Wextra landed on 2026-09-11, so further gcc-only fallout may sit behind this error. One PR silences both warnings for that one generated file, under gcc only.
Hotfix: Continuous Windows red on the venv interpreter name in compass.sh DONE 2026-09-15 2026-09-15 Continuous Windows stops in its Setup Database step with exit 127 because compass.sh assumes that a Windows virtual environment holds Scripts/python3, while CPython's venv module always writes python.exe there, whatever interpreter name creates the environment. The job went red when the runner image moved its default Python from 3.12.10 to 3.14.7: the wrapper and the workflow are byte-identical across that boundary. One PR carries this fix and the Linux gcc fix.
Hotfix: Continuous Linux gcc jobs red on further gcc-only diagnostics DONE 2026-09-15 2026-09-15 The gcc jobs on main fail again behind the suppressed generated parser. The jobs stop on diagnostics that only gcc reports. Clear every remaining one, then raise a single PR.
Hotfix: Continuous Windows MSVC jobs red on C4275 in the exported exception classes DONE 2026-09-17 2026-09-17 Continuous Windows has been red since 2026-09-04. The two MSVC jobs stop in the compile of ores.platform with error C2220, which promotes warning C4275 to an error. C4275 fires on the exported exception classes io_error and file_not_found, which derive from std::exception and boost::exception. The project already suppresses the sibling warning C4251 on the same grounds, so the fix extends that suppression. The two clang jobs on the same workflow fail for an unrelated reason and stay red.
Fix the has_parent_id feature namespace so profile bindings take effect DONE 2026-09-17 2026-09-17 A profile assignment for has_parent_id landed in the entity's sql namespace while every generator reader looked at the entity root, so a bound profile's assignment was silently inert and each model repeated the line by hand. Moving the feature to the root let the four hierarchy models drop their explicit lines, and exposed eleven flat entities that had bound the hierarchy profile without the two column properties it requires. Those were rebound, and the documents the defect had misled were corrected.
Restore the code generation methodology the slovaris removal took DONE 2026-09-18 2026-09-18 Database recreation fails on main: a shared methodology row left with the retired slovaris dataset, but ten seed scripts still name it.
Generate protocol messages from one model into C++ and TypeScript ABANDONED   2026-09-23 Add an ores.codegen.operation model type so the hand-written IAM protocol headers generate from org with zero byte differences, then add a TypeScript target space so the TypeScript UI consumes the same model.
Retire Qt and emit the UI metadata to TypeScript DONE 2026-09-19 2026-09-19 Delete the ores.qt and ores.wt trees. Keep the entity models' presentation drawer, renamed, and project it into a new ores.ts.ui facet so the TypeScript screens and the C++ headers read one model.
Generate every protocol message as TypeScript DONE 2026-09-19 2026-09-23 Every drift-free component renders its protocol messages to generated C++ headers from the org models, but the TypeScript twin exists for six IAM protocols only. The other components have no TypeScript messages at all, and five IAM protocols switch the TypeScript facet off because their fields reference C++ domain types with no TypeScript projection. This story closes the gap so every message that renders to C++ also renders to TypeScript, one message type per header.
Hotfix: Windows build and SQL schema validation fail on main DONE 2026-09-19 2026-09-19 The Windows MSVC jobs fail on a warnings-as-errors C4244; the Windows Clang jobs fail to link ores.ore.api; the SQL schema validator rejects the ores_ore_ component prefix; the marketdata service has no grant on the ore series key shapes; and the web service cannot resolve the environment its checkout reports.
Define and adopt the canonical NATS entity protocol ABANDONED 2026-09-21 2026-09-23 ORE Studio has no canonical specification for its NATS entity messages: the de-facto specification is a codegen template, the only index of subject namespaces sits outside doc/, and the conventions that do exist are scattered across plans, one closed agile task and the code itself. This story writes the target-state specification for common entity messaging, reconciles every NATS document to a single responsibility, and adopts the specification in ores.iam across codegen, ores.shell and ores.web.
Hotfix: database_info mapper and repository use their own namespace DONE 2026-09-21 2026-09-21 The Windows MSVC build fails in ores.database because database_info_mapper.cpp and database_info_repository.cpp re-enter ores::database::repository with a using-directive from inside that same namespace; MSVC emits C4515 and /WX turns it into an error.
Hotfix: password_hasher catch block leaves its exception unreferenced DONE 2026-09-22 2026-09-22 The Windows MSVC build fails in ores.security because password_hasher.cpp catches const std::exception& e but never uses e; MSVC emits C4101 and /WX turns it into an error.
Hotfix: IAM current-state notify triggers are not wired into the aggregators DONE 2026-09-22 2026-09-22 SQL schema validation fails on main with four WIRE_001 warnings because the login_info and session notify trigger scripts are not reachable from the create and drop aggregators; Continuous Linux and Nightly Build have been red since 2026-09-21.
Hotfix: provision tenant publishes party-scoped bundle without party_id DONE   2026-09-23 Party provisioning published the first available bundle, a party-scoped one without a party_id, instead of the base bundle. Fixed in PR #1929.
Prototype ORE Studio bootstrap in ores.web DONE   2026-09-22 Revisit the ores.qt bootstrap wizards from first principles for ores.web, taking the ACME work into account.

4. 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]].

5. 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
     

6. Health Review

# Date Day Overall Task
1 2026-08-07 day 5 AMBER Health review 1 — sprint 25 mid-sprint analysis
2 2026-09-23 day 52 RED Health review 2 — sprint 25 close analysis

(Run sprint-reviewer to add more rows.)

7. Charts

Charts generated via compass sprint charts. See Sprint health charts for what each chart measures, its purpose, and how to read it.

7.1. 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

7.2. 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

7.3. 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

7.4. Cumulative Stories Done

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

stories_done.png

8. Retrospective

See the release notes' Post Mortem section for the full write-up. Summary:

8.1. What worked

  • High throughput: 316 PRs merged and 80 stories closed DONE.
  • The drift method worked. Each component followed the same steps and reached zero drift.
  • PRs merged fast, with a median of 1.9 hours from open to merge.
  • The close reset recorded every abandoned story with a reason, so sprint 26 starts from a clean board.

8.2. What didn't work

  • The sprint ran 52 days against a 7-day plan. It did not close at the lull, so a second full sprint of work went into the same document.
  • The mission did not change when the work moved to ores.web and TypeScript. The mission then described less than half of the work.
  • 31 stories were STARTED at the close review, 10 of them with every task done. The documents did not show the real work in progress.
  • 23 hotfixes. Cross-compiler failures were found by the scheduled CI runs, after the merge.
  • Many approaches to the codegen problem ran at the same time, and none of them finished.

8.3. Improve next sprint

  • Close the sprint at day 7. A lull ends a sprint; it does not stretch it.
  • Change the mission when the direction changes, or open a new sprint.
  • Follow one order: codegen sync and drift for each module, then user journeys, then UX.
  • Run a gcc or MSVC build before a merge that touches CMake, headers or compiler flags.
  • Close a story when its last task closes.

9. Release Notes

See release_notes.org for the full narrative.

Emacs 29.3 (Org mode 9.6.15)