Sprint 29
Table of Contents
This page documents a sprint (Sprint 29) 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
Finish the work carried out of sprint 28 before drawing anything new from the product backlog.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent version | Version 0 |
| Previous | Sprint 28 |
| Start | 2026-10-24 |
| End (expected) | 2026-10-31 |
| End | 2026-11-08 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Release Notes | ORE Studio Sprint 29 – Release Notes |
| Last touched | 2026-11-08 |
3. Stories
For the definitions of the themes see Themes.
3.1. Product
| Story | State | Start | End | Description |
|---|---|---|---|---|
| Bound the memory a request body may cost | DONE | A request body is read whole into a reused buffer with a 256 MiB cap for every route, so one large upload costs its own size in resident memory and an over-limit body is closed with no response. Read up to a per-route limit, stream the large ones, and answer 413. | ||
| Classify every HTTP route against the resource rule | DONE | 2026-10-31 | Apply the design document's four-way rule to every route the two servers answer, 408 of them: resource, composed view, transport capability, or rendering concern that is not an API. Produce the inventory, the published area list, and each composed view's name and owner. | |
| Let a busy market move prices, not only the clock | ABANDONED | 2026-11-08 | The market-wide arrival factor speeds up ticks and leaves the price law alone, so a panic arrives as more observations rather than more variance, fatter tails or a gap. Carry the same shared factor into the price processes, settle whether a rate change moves time at all, and decide the control plane for both. | |
| Open sprint 29 | DONE | 2026-11-08 | Scaffold sprint 29, wire the version manifest and the agile index, and move the postponed stories. | |
| Account for the grid's usage | DONE | 2026-11-08 | A super administrator needs to know which tenant is using the grid, and the work that answers it is tenant-owned, so reading it across tenants is the widening the guard forbids. The installation records what it did instead: the compute service, already inside each tenant as it dispatches that tenant's work and takes the result back, writes a usage row. This story builds that ledger and the global view it feeds. | |
| Add entity groups and finish the remaining codegen work — the remaining work | ABANDONED | 2026-11-08 | Add an entity group annotation to the model and a group flag to codegen, and finish the remaining codegen work: the model drift fixes, the counterparty logo picker and the tenor convention messaging layer under codegen, and the literate template split. | |
| Approve a reporting line change by the proposed manager | ABANDONED | 2026-11-08 | A change to someone's reporting line becomes a four-eyes decision: it is proposed, and the person it would make their manager approves or declines it, like a role request. | |
| Atomise every convention onto the central entity — the remaining work | DONE | 2026-11-08 | Pilot the atomised entity shape with tenor basis swap, then convert every remaining convention onto one central convention row plus its kind-specific parts, one convention per PR. | |
| Fix the defects the bond family review found | ABANDONED | 2026-11-08 | Bonds were the data-oriented design pilot, reworked across sprints 25 to 27. Review the family's current data model against the Regime 2 checklist and record what holds and what does not. | |
| Audit the policies that let the system tenant read every tenant | ABANDONED | 2026-11-08 | Each policy that lets the system tenant read every tenant is either replaced by acting inside the tenant or listed as a reviewed exception with its reason, and a check fails the build on an unlisted one. | |
| Author the report configurations on guided screens | ABANDONED | 2026-11-08 | A person creates and edits a report configuration on screens that guide each step. A configuration holds many related entities, so each entity gets a screen that helps the person choose, check and connect its parts. The configuration screens link later to the report definition screens. | |
| Bring the FX spot conventions onto the market standard | ABANDONED | 2026-11-08 | Correct the FX spot conventions where they disagree with the market: the pair's spot lag, the quote precision, the spot tick size and the end-of-month roll, and record the evidence behind each. | |
| Bring the existing screens to the entity screen specification | DONE | 2026-10-24 | Check the currency screens and every other existing screen against the entity screen specification and the record screen standard, and fix each difference in one PR. | |
| Bring the role screens to the standard | ABANDONED | 2026-11-08 | Move the roles list and role page onto the shared record parts, with paged server reads for roles and for the people who hold a role. | |
| Bring the service code onto the NATS patterns — the remaining work | ABANDONED | 2026-11-08 | Audit every NATS call site against the NATS service pattern library, and fix each deviation from it. | |
| Browse and follow the grid's jobs — the remaining work | ABANDONED | 2026-11-08 | The grid screen counts batches, workunits and results and shows no row of any of them. The journeys Browse the grid's jobs and Follow a job are written and prototyped. This story builds the screens: the paged tree of batches, workunits and results, the details of each, the job page, and the file download, for the operator, the tenant administrator and the party member. | |
| Build the bindings screen and clear the oresmd snags — the remaining work | ABANDONED | Retired: the feed binding is gone and the subscriptions screen replaces this one. The language control became its own capture. | ||
| Build the retire or reset tenant journey — the remaining work | ABANDONED | 2026-11-08 | The Retire or reset a tenant journey has a document and no implementation: suspend has no operation, terminate, deprovision and purge have SQL functions but no subjects, and a party-level reset has no subject. The roster's row menu shows Retire or reset as not built until these exist. | |
| Build the synthetic collection and model catalogue journeys | ABANDONED | 2026-11-08 | A person runs a synthetic collection and keeps the yield curve model catalogue in ores.web, on the subjects the journeys name. | |
| Clean ores.synthetic to the component clean standard | ABANDONED | 2026-11-08 | Bring ores.synthetic to the Component Clean Standard (Entity items): tier 3, domain component. | |
| Close the tenor journey and the remaining refdata gaps — the remaining work | ABANDONED | 2026-11-08 | The tenor resolution journey and the remaining refdata gaps are built: the tenor resolve operation and its screen, party membership versions, the convention family mapping and term rules, the portfolio right key, the Acme book-control actors, and the party list and history reads. | |
| Complete the ACME report inputs and prove they run | ABANDONED | 2026-11-08 | Add the analytic and exposure input documents the reports read through DQ, add a readiness check, give the platform reports their own report type, split an ORE file by a key, resolve the curve quote names against the feeds, and prove the exported packages run in ORE. | |
| Import and export conventions without a document aggregate | ABANDONED | 2026-11-08 | Replace the whole-document conventions request with per-family messages staged into one atomic apply, so a new convention adds a family rather than growing a god type. | |
| Design and seed the reports, configurations and portfolio trees each ACME party runs | ABANDONED | 2026-11-08 | Each ACME party gets the reports it would really run, with the configuration those reports need and a realistic portfolio tree, root portfolio and currencies. | |
| Draw every coded value as its badge — the remaining work | ABANDONED | 2026-11-08 | A value that is a catalogue code is drawn through one shared renderer, so a screen shows the badge the code domain paints and never a bare code. Census the screens that still print codes as text, give the domains that have no badge their definitions, and hold the rule with a gate. | |
| Draw the node heatmap and carry the engine run statistics | ABANDONED | 2026-11-08 | The grid screen draws the node heatmap and state ribbon, a node sample states the engine's run time and peak memory, and the run statistics are measured, recorded and aggregated for the grid. | |
| Edit a party on a standard entity page | ABANDONED | 2026-11-08 | Replace the party wizards with a standard entity page for a party: a list, a page with cards and tabs, and dialogs, built from the shared record parts. A save writes directly for now. The four-eyes approval of party changes belongs to the story Build the four-eyes framework. | |
| End a session when its window closes, not when it is unattended | ABANDONED | 2026-11-08 | A session ends when the browser window that held it is gone, and never because a screen sat unattended for a while, so traders can leave their screens open. Presence, not activity, decides. | |
| Find a trade by its identifiers, state, book and date from one list — the remaining work | ABANDONED | 2026-11-08 | A person finds a trade by its identifier, state, book, date, counterparty, trade type or enum column from one list. | |
| Finish the tick ingest pipeline | ABANDONED | 2026-11-08 | A tick on the chart was stamped 71 minutes behind the wall clock and drained its backlog at only 1.16 times real time. Find where the backlog sits and fix it. | |
| Finish moving the hand-written SQL onto models | ABANDONED | 2026-11-08 | Two groups of hand-written SQL still sit outside the model: four populate pipelines that predate the generic dataset archetypes, and the tables no model covers at all. Both are the defect the DQ artefact migration fixed for staging tables — schema and its loader written by hand, and checked by nothing. | |
| Fix the tenor basis swap convention model and the document TU — the remaining work | DONE | 2026-10-26 | 2026-11-08 | Split the tenor basis swap convention onto the data-oriented field groups its access patterns need, and find out why the configuration document protocol builds such a large translation unit, so the Windows MSVC build stops failing with C1202. |
| Follow the child run a workflow hands off | ABANDONED | 2026-11-08 | bootstrap setup and provision tenant report 'All 2 step(s) completed' and 'the tenant is ready to work in' as soon as the provision_tenant_workflow finishes, while the tenant is still being populated by the 9-step tenant_setup_workflow that start_tenant_setup creates. The child run's id is already in the final step's response as child_instance_id, so the shell can follow it; it simply never reads it. The follow loop has no notion of a child run. | |
| Gate every ER diagram | ABANDONED | 2026-11-08 | Make the er-diagram check compare every generated group diagram and the index, discovered from the model rather than a hard-coded list. | |
| Gather each trade set and its market data — the remaining work | DONE | 2026-11-08 | Partition a report's trade population into trade sets and record them against the run, export one trade set as an archive and map it into the ORE portfolio, resolve and export each set's market data at its as-of, hand each configuration to its owner by id at an as-of, and assemble the package only w | |
| Give the other prototype groups their design notes | ABANDONED | 2026-11-08 | Give the eighteen remaining prototypes across eight groups their design notes, make every group page state the rule, and make the check refuse a prototype without a note. | |
| Give each tenant its own buckets and scope the reaper | ABANDONED | 2026-11-08 | A tenant owns a bucket per data class, the storage service derives the tenant from the bucket, a step service reaches its tenant's buckets with its run token, a run's inputs and outputs are removed at run end with a 24-hour backstop, and the compute reaper acts inside each tenant. | |
| Keep the record screens up to date — the remaining work | ABANDONED | 2026-11-08 | The web screens read once and never learn that a record changed elsewhere. Add live updates from the change events to the browser, a Refresh button on the record page and the list, and a stated behaviour when the record under edit changed: tell the person, show what changed, and let them keep their edit or take the new values. Complete the 'Updates and refresh' section of the entity screen specification and the Change notification page. | |
| Let the blotter read a page, not the book | DONE | 2026-11-08 | The blotter reads every summary to count its rail, so at ten thousand trades the screen takes fifty-four seconds and then the service refuses a filter of ten thousand ids. The rail and the keyset page are on main (#4403); the store behind them becomes trades, because a package is a trade, and the page's order becomes an index. | |
| Manage reports from the list a party runs — the remaining work | ABANDONED | 2026-11-08 | Give report management its own UX, whose front door is the list of reports a party runs, and keep the analytic authoring surfaces out of it. | |
| Make every configuration screen follow one standard | DONE | 2026-11-08 | The engine settings work set the pattern for every configuration that comes off ORE XML. Generalise it into one UX standard, apply it to the pricing engine configuration, and make the two similarly named configurations impossible to confuse. | |
| Make ores.ore the only owner of ORE formats | DONE | 2026-10-29 | The ORE codec reads and writes ORE documents and reaches no other component's tables, services or runtime. Delete the database store, move the payload types to their contract, declare the input file names in the codec, and add a check that fails a build which links another component's core. | |
| Model every output ORE writes | DONE | 2026-10-30 | 2026-11-03 | ORE writes 66 families of output and one has a reader today. Name every family, read each one against the samples checked in, and give the data to the component that stores it: run results to ores.reporting and market state to ores.marketdata. ores.ore holds the format, the read model and the readers, and no store. |
| Prove generated trades value against the ORE samples | DONE | 2026-11-08 | A run of the Acme portfolio dropped 61 of 73 trades. Find why the roundtrip tests and the generator checks missed the gaps in the trade XML and the generated data, close them, and price the FX exotics and the bond family. | |
| Validate that every trade type is modelled as ORE reads it | ABANDONED | 2026-11-08 | We model every trade type ORE knows, yet most generated trades fail in ORE. The XSD is laxer than ORE and the sample roundtrip never compares what it writes. Audit the tests we have, then measure each type's modelling level against ORE's own contract. | |
| Name the record in a change event | ABANDONED | 2026-11-08 | A change event says that an entity changed and names no record, so a record screen cannot tell whether the change concerns the record it shows. Carry the key of the changed row on every entity event, pass it to the browser, and let a record screen go stale only for its own record. | |
| Populate the ACME books with a realistic trade population — the remaining work | DONE | 2026-10-31 | ACME's books hold no trades, so a report package is structurally valid and substantively empty. Populate them from a synthetic generator in present time, referencing ACME's own books, counterparties and staff, starting with bonds and extending to every instrument. | |
| Preview a convention's term structure on a calendar — the remaining work | ABANDONED | 2026-11-08 | A person picks a tenor convention and a calendar in ores.web and sees every tenor of the convention resolved to its date at once. | |
| Prove the report grid run end to end — the remaining work | DONE | 2026-11-08 | The ACME report definition runs to completion against the compute grid from an input bundle that already exists, the compute results are retrieved, and the run is reproducible from a freshly recreated database. | |
| Codegen facet: generate the DQ publish-from-dq pattern | ABANDONED | 2026-11-08 | Add an ores.codegen facet that generates the SECURITY DEFINER publish-from-dq SQL function for the homogeneous family — about 29 of the 57 hand-written copies — from a declaration on the entity's codegen model, and unify the eight per-service publish_from_dq handlers rather than generating 57 of them. | |
| Raise a notification for a scenario waiting for a tester — the remaining work | ABANDONED | 2026-11-08 | Story 3 of the QA runner arc. A scenario that waits for a tester raises an inbox notification and the bell shows it. Add a tester role and an assignment, and a permission for the Development module. Today any signed-in user may call the QA routes. Also settle whether the module runs in production, since a deployed BFF has no work tree. | |
| Raise approval requests from the remaining gated write paths | ABANDONED | 2026-11-08 | The party, convention and tenor screens, the ORE import and the shell counterparty commands raise approval requests instead of writing gated data directly. | |
| Record service lifecycle events and surface them in system health | ABANDONED | 2026-11-08 | Services announce their starts and graceful stops, telemetry records the events and raises restart notices, a service logs out on shutdown, and the system-health home shows the services. | |
| Record system events in a central event log | ABANDONED | 2026-11-08 | Extend ores.telemetry with a central log of key system events, apart from the logs: a catalogue of event types, a publish API every service calls, a collector that stores them with their subject, an Operations Events screen, and events in each record's History. Feed runs are the first client. | |
| Refactor conventions onto families and bundles — the remaining work | ABANDONED | 2026-11-08 | Conventions fail to build on MSVC because one aggregate carries every family. Refactor them onto the classification settled in the data model: one family per convention, a bundle per import applied in one unit of work, and the ORE file demoted to a package at the boundary. | |
| Restore the trading guards the versioned model dropped — the remaining work | ABANDONED | 2026-11-08 | Making every trading entity versioned removed the immutable profiles, and two guarantees went with them without a replacement: a trade's reported portfolio no longer has to belong to the trade's party, and a raw update rewrites every version of a row instead of opening a new one. | |
| Rework the market data feeds into a market data service with adapters — the remaining work | DONE | 2026-11-08 | Move the simulated feeds behind a market data service: vendor ids and a mapping, sources with a kind, subscriptions and routes, adapters on NATS, metering and cost, and the simulator as one adapter, so the system treats live and simulated data in the same way. | |
| Publish public fixings through an adapter | DONE | 2026-10-28 | 2026-11-02 | Each public publisher is a provider, one adapter publishes their daily rates as durable fixing ticks, and a synthetic feed starts from the latest one. |
| Run a report end to end on a synthetic bond population — the remaining work | ABANDONED | 2026-11-08 | Trigger the NPV report of an ACME party over its synthetic bonds and follow the run to a completed instance, recording every issue met on the way and fixing what can be fixed. | |
| Scope a report by regulatory book type | ABANDONED | 2026-11-08 | A report states the regulatory book type of the books it may read, from the same vocabulary a book uses, so a trading book report never prices the banking book. | |
| See and change everything a report runs — the remaining work | ABANDONED | 2026-11-08 | A report page shows its definition, its configurations and its conventions on tabs, and a person can choose the conventions a report reads. | |
| Seed a relative-time trade population with the market data it needs | ABANDONED | 2026-11-08 | A new ACME system has no time horizon and no deal population, so nothing says which historical fixings or market data it needs. Hold a sample ACME trade corpus in DQ whose dates are relative to the install date, then derive the market data that corpus requires and generate it, including historical fixings, in ores.synthetic. | |
| Sort every list by when it was updated | ABANDONED | 2026-11-08 | Every list can be ordered by the time of the latest save, so the newest changes come first. | |
| Split the types that carry too many columns | DONE | 2026-11-08 | The persisted types hold 30 to 60 flat columns, which the data-oriented model forbids. Inventory them, decide which are one aggregate over several components, and split those into components of their own. | |
| Stop the gateway blocking its own event loop | DONE | A handler forwards over NATS with a synchronous call on the single io_context thread, so one slow service stalls every connection, and the per-request session counter write blocks the same thread on the database. Run handler work on a bounded worker pool and flush the counters from a timer. | ||
| Stop the workflow from losing steps to a transient storm | DONE | 2026-11-08 | A provisioning run lost its first step to a transient database connection storm. The engine published the step command, the iam service never handled it, and twenty minutes later the run failed with a message that names no cause. The command was dropped rather than retried, the pool storm left no explanation, and the handler has a path that discards a command in silence. | |
| Subscribe tenants to provider feeds and prove the browser at scale | ABANDONED | 2026-11-08 | A tenant or party subscribes to a provider's feeds through a subscription and a route, the feed screen standard states the browser, the two scopes and the subscription, and the feed browser is proved with tens of thousands of feeds. | |
| Trade Blotter — the remaining work | DONE | 2026-11-01 | Build the Trade Blotter: the primary front-office screen for viewing, booking, amending, and routing trades through their lifecycle. The design is done: the sandbox, the draft state and the operational authorisation queue replace the Pending Book, and the workspace dependency is gone. | |
| Describe every product type on one page | DONE | 2026-10-31 | 2026-11-08 | The catalogue holds the product types a tenant can book and no page describes them together: what each one is, its documentation, and which books and permissions allow it. |
| Draw a trade's status as its badge | ABANDONED | 2026-11-08 | The trade screens state a deal's status as words because the badge catalogue holds no trade-status domain. Add the domain and its badges, and draw the status through it everywhere a trade states one. | |
| Trace a process run and the trade groups it creates — the remaining work | ABANDONED | 2026-11-08 | A process that acts on a set of trades must be traceable, so it can be undone or repeated. Record each run with an identity and a state machine, name the process it is a run of, and let the trade groups its inputs and outputs carry the run's key. Waits on one process with a real client. | |
| Validate a curve pillar's tenor codes | ABANDONED | 2026-11-08 | ir_curve_bootstrap_pillar.start_tenor_code and end_tenor_code are undeclared soft references to refdata_tenors. The only database check validates curve_role_code, so a typo in a tenor code saves and then throws at bootstrap time inside curve_republish_resolver, where the end tenor doubles as the quote point id. | |
| Add a Hawkes tick arrival process to analytics.quant | DONE | 2026-10-23 | 2026-10-25 | A synthetic feed can draw the times of its ticks from a self-exciting Hawkes point process, ported from the tick library (BSD 3-clause, the tick developers, CMAP), so bursts of ticks follow bursts of ticks as they do in a live market. |
| Carry a market-wide arrival regime | DONE | 2026-11-08 | Let the whole market speed up together: an exogenous calm/active state and a shared endogenous intensity, driven by one clock per run, so a panic is representable and cross-series counts correlate. | |
| Carry one hundred thousand feeds on the data path | DONE | 2026-10-26 | 2026-11-08 | Rebuild the data path so the system carries 100,000 feeds on one machine shared by ten environments: pooled long-lived connections, a transaction API, bounded concurrency, ticks stored once and written in bulk, a bounded tick store, work pushed to the grid, and built-in measurement. |
| Decide whether codegen replaces sqlgen and reflect-cpp with generated raw code | DONE | 2026-10-26 | 2026-11-03 | Analyse whether the generator should emit raw SQL, MessagePack and JSON code for every entity in place of sqlgen and reflect-cpp. |
| Replace sqlgen and reflect-cpp with generated code | ABANDONED | 2026-11-08 | Generated statements on a thin libpq layer replace sqlgen, and generated JSON and MessagePack codecs replace reflect-cpp, in every component, until neither dependency is left. | |
| Sprint health review — System 2 analysis | DONE | 2026-11-08 | 2026-11-08 | Recurring System 2 health reviews of sprint 29, covering goal alignment, load, PR velocity, story and task balance, focus signal, and bookkeeping hygiene. |
| Carry a large body without holding it | DONE | An accepted body is still read whole into a string and held for the life of the request, so a 256 MiB upload costs 256 MiB resident. Stream the accepted body to where it is going under the same per-route limit, with a stall deadline, and stream the storage routes' upload and download from the file on disk. | ||
| Book a trade as a draft | DONE | A draft is a trade the desk has captured and not concluded, and the completion executes drafts. No screen can book one: the booking screen always books live, so the draft path cannot be reached and a tester cannot create the leg a completion takes live. | ||
| Eight columns in the trading models hold JSON blobs where th… | ABANDONED | 2026-11-08 | Eight columns in the trading models hold JSON blobs where the domain should hold rows, and each is a place where the store cannot answer a question about the trade without parsing text. | |
| Configure every seeded report from the ORE examples | ABANDONED | 2026-11-08 | Every report ACME is seeded with needs a risk report configuration that ORE can actually run: the right engine settings, market data bindings and portfolio scope, built from the ORE examples. This was a task inside Prove the report grid run end to end, and it is its own story because it is authoring work over dozens of reports, not chain work, and the chain can be proven without it. | |
| Model suppliers, sessions and feeds | DONE | 2026-11-08 | A supplier has sessions, a session is one configured adapter with its endpoint, environment and credentials, and a feed binds a publisher to a session and a service; the adapter reads the transport instead of service flags. | |
| Complete a structure from a screen | DONE | 2026-11-08 | The completion operation writes a structure, its members and takes every leg live in one transaction, and nothing calls it: the grouping route writes the structure and then each member, so grouped legs stay drafts and a half-grouped deal can stand. Point the screen at the operation. |
3.1.1. Epic: One UX language for every screen
Every screen in ores.web speaks one UX language, and a reviewer or a check can tell whether a screen fits it. The arc starts from the reference data screens the Qt client had: inventory them against the web, settle the standards so each rule has one answer and one identifier, build the checks before the screens change, then take each Qt topic through one pipeline: journeys, prototype, build, test scenario and sign off. Later topics and the other areas of the application join as their own stories under this heading.
| Story | State | Start | End | Description |
|---|---|---|---|---|
| Inventory the Qt reference data screens and audit the UX standards | DONE | 2026-10-25 | 2026-10-25 | Build the Qt-to-web matrix of the reference data screens, audit the UX standards for gaps, and order the topics. |
| Settle the UX language for record screens | DONE | 2026-10-25 | 2026-10-25 | Decide every contradiction between the standards, write the form layout rules, name each rule, and specify it in Allium. |
| Check every record screen against the UX language | DONE | 2026-10-25 | 2026-10-25 | Build a Playwright harness that checks every record screen by rule identifier, and write the sign off recipe. |
| Take the first reference data topic through the screen pipeline | DONE | 2026-10-25 | 2026-10-25 | Run the calendars topic through journeys, prototype, build, test scenario and sign off; the pipeline is the deliverable. |
| Take the currencies topic through the screen pipeline | DONE | 2026-10-25 | 2026-11-08 | Run the currencies and pairs topic through the screen pipeline runbook: journeys, prototype, build, scenario, sheet and the owner's sign off. |
| Let the model state how the store keeps a column | DONE | 2026-10-31 | 2026-10-31 | A generated mapper copies a domain value into the row unchanged. The refdata conventions must store the seven codes, not the spelling a document states, and that conversion was applied by hand to ten generated mappers, so a regeneration erased it once. Let the model state the conversion and have the mapper emit it. |
| Switch the interface between light and dark, and choose the language from the header | DONE | 2026-10-31 | 2026-10-31 | The interface has one palette, a dark one. A person who needs a light screen has no way to ask for one. The language sits in a select inside the account menu, where a person looks for their own pages. Give the header two controls with the icons the set already uses for them. |
| Read a batch of rows in one query in the generated services | ABANDONED | 2026-11-08 | The generated get-many, put-many and delete-many paths read each row by key, one query per row, so a 1,000-row put makes about 2,000 reads and stores about 104 rows a second; each batch path reads its rows in one query instead. | |
| Build the IR curves of every supported currency from public data | DONE | 2026-11-06 | 2026-11-08 | Each supported currency has an overnight-index curve bootstrapped from its synthetic quotes and published in the system tenant, and the synthetic IR feeds start from public rates; today only USD has a bootstrap config, it was never published, and no currency's synthetic feed is calibrated. |
| Present the market data series | DONE | 2026-11-08 | 2026-11-08 | A slide series that explains how ORE Studio builds synthetic market data generators. |
3.2. Hotfixes
| Story | State | Start | End | Description |
|---|---|---|---|---|
| Fix the nightly platform failures | DONE | 2026-11-04 | 2026-11-06 | The Linux gcc, Windows, macOS and memcheck nightlies, and the codegen drift check on main, fail. Fix each one so the nightlies build, test and submit to CDash. |
| Hotfix: Keep the build warning-free on every toolchain | DONE | 2026-10-31 | 2026-10-31 | The nightly builds with a compiler this checkout never runs: gcc on Linux and MSVC on Windows, both with warnings as errors. Two gcc warnings in ores.nats are errors there and invisible to a clang build, so the branch that introduces them passes locally. |
| Seed the commodity permissions the handler needs | DONE | 2026-10-25 | 2026-10-25 | The commodity handler checks refdata::commodities read, write and delete, and the permission seed does not define them, so two codegen tests fail on main and redden the tooling gate. |
| Draw every ORE leaf the same way, starting with conventions | DONE | 2026-10-25 | 2026-10-26 | A product parameter, an engine run setting and a convention term are leaves of ORE documents and read the same on every screen: one Simple and Advanced switch, the documentation under the leaf, the value in force, the control and the gaps, with the exact words. State it once as a standard and an Allium spec, and apply it first to conventions. |
| Hotfix: The fleet runs the machine out of memory | DONE | 2026-10-26 | 2026-10-26 | The machine went down on 2026-10-26: the NATS client kept every message it received and the shared Hawkes heat ran ticks at about 300 times their configured rate. |
| Standardise the curve configuration's parameters on the one contract | DONE | 2026-10-26 | 2026-10-30 | Bring curveconfig.xml onto the ORE parameter contract and the ORE element and leaf screen standard, as the engine run settings and the conventions have been, so a curve configuration's leaves read as every other ORE leaf does. |
| Report when a database's timescaledb version is not on disk | DONE | 2026-10-27 | 2026-10-27 | An apt upgrade replaces the version-named timescaledb library while every database keeps the version it recorded, so a database fails on its first query with could not access file. compass db status reported the schema and said nothing about the extension, so the failure read as an unreachable database rather than a one-line fix. |
| A write checks the version of another party's row | DONE | 2026-10-26 | 2026-10-27 | The generated refdata service reads the current row of a write by id alone, so a session that sees several parties checks the claimed version against whichever party's row comes first, and a write to the acting party's own row gets a false version conflict. |
| Scope a delete and an unclaimed write to the acting party | DONE | 2026-10-27 | 2026-10-27 | The generated repository reads a row by key across every party the session sees, so a delete checks and may close another party's row of the same id and version, and an unclaimed write states another party's version. Scope the key read and the delete to the acting party, and retire the service-side filter. |
| Make main green after the sqlgen removal | DONE | 2026-10-28 | 2026-10-28 | Run every local check and the Linux, macOS and Windows CI against main, and fix what fails, so main is green across the board. MSVC reflect-cpp errors are out of scope. |
| Let the plan state domain rows, not a bag | DONE | 2026-10-30 | The trade population describes each trade twice: once in a per-asset-class *_terms bag and once in the domain rows the writer builds from it. The bag mixes the generator's drawing parameters with the product's economic content, so a product can be assembled from whichever fields happen to be present and eight SQL refusals police the difference. Let the plan carry the domain rows, construct products by name so an illegal combination cannot be stated, and reduce the writer to a persister. | |
| Run the public sources from the Official rates screen | ABANDONED | 2026-10-28 | The Official rates screen becomes the place a person runs the public sources from: each provider carries its terms, its freshness and its adapter's health, and its controls rest on decisions the architecture can carry. | |
| Run the adapter per session | ABANDONED | 2026-11-08 | The session is the runtime identity: one announce, demand and heartbeat per session, the transport read from the catalogue, the simulator as one session, and health reported per session. | |
| Read the public interest rate sources | ABANDONED | 2026-11-08 | The ECB Data Portal, FRED, the Bank of England and the US Treasury become adapters and feeds that deliver rates and curve pillars as end-of-day data. | |
| Own the refresh in the scheduler | ABANDONED | 2026-11-08 | One refresh request serves the scheduler and the Fetch action; a job per feed carries the rhythm; the adapter no longer polls on its own flags. | |
| Publish the market data catalogue from DQ | ABANDONED | 2026-11-08 | The ACME bundle publishes publishers, suppliers, sessions, feeds, scopes, routes and schedules, references adapters by code, and carries no secret. | |
| Build the Connectivity screens | DONE | 2026-11-08 | The delivery tree, the supplier dashboard, the adapter catalogue and the session and feed records, with the two setup flows and the writes behind them. | |
| Build the Public rates screens | DONE | 2026-11-08 | Publisher and class rows, the routed feed and supplier, freshness derived from the feed schedule, availability and compare, and a service-aware fetch. | |
| Govern the public feeds | ABANDONED | 2026-11-08 | Terms acceptance in Connectivity, a defined pause, and a route switch with history, with the old acts removed from Public rates. | |
| Normalise every ORE parameter representation | DONE | 2026-11-08 | ORE accepts more than one spelling for many of its values: 27 spellings for seven business day conventions, four vocabularies for a boolean, alias rows for a day counter, and any case for the enumerations its parser upper-cases. The store must hold one representation of each fact, and the knowledge of which spellings mean what must live in data, not in code that drifts from the engine. | |
| Let the area come from the model | DONE | 2026-10-31 | The generated route template writes /api/v1/<component>/<plural>, which leaks an internal component name into a published contract. Let an entity model declare its HTTP area, resolve it once, default it to the component so nothing moves yet, and gate a declared area against the published list. | |
| Move the IAM collections onto their areas | DONE | 2026-10-31 | The IAM entity collections answer under /api/v1/iam, a component name, while the inventory decides their areas as access or auth. Declare each entity's area, regenerate what follows from it, and settle the one collision the move exposes, that the generated session collection and the session door both want /api/v1/auth/sessions. | |
| Stream the changes as they happen | DONE | 2026-11-04 | A browser needs to hear about a change when it happens rather than when it next polls. Serve the change stream over the HTTP server: a hub every publisher reaches, a source that waits without holding the thread, the SSE framing, and a keep-alive a proxy will not time out. | |
| Answer while the answer is still being made | DONE | 2026-10-31 | 2026-11-06 | Every response is built complete in a string before a byte leaves the server, so a file, an event stream and a five megabyte asset all cost their own size. Give a response a body it reads from, serve the built bundle from disk, and report the server's own health and metrics. |
| Hold the session at the door | DONE | 2026-10-31 | 2026-11-06 | A browser holds a bearer token today, so one successful script injection owns the session and no deployment can revoke it. Hold the token server side, hand the browser an opaque cookie, and make sign in and sign out resources of their own. |
| Hotfix: Make CI green on every platform | DONE | 2026-11-01 | Linux, macOS, Windows, codegen drift and TypeScript runs fail on main; fix every failure that is not the reflect-cpp work on Windows. | |
| Generate roundtrip tests for the wire codecs | DONE | 2026-11-08 | Codegen emits a JSON and MessagePack roundtrip test for every model that opts in to the wire codec, so no codec depends on a hand-written test. | |
| Support volatility surfaces | DONE | 2026-11-03 | 2026-11-08 | Add volatility surfaces to the system: their structure, quotes, construction and storage, and how they flow to pricing. A long arc that starts from a documented architecture. |
| Seed the public fixings history from a DQ snapshot | ABANDONED | 2026-11-08 | Every environment holds years of daily public fixings from a static DQ snapshot, and the adapter fetches only the gap to today. | |
| Stamp the time a build starts and finishes | DONE | 2026-11-03 | 2026-11-03 | compass build prints and logs the wall-clock start and finish of a build, so a reader can tell when a build ran. |
| Run only the checks a change needs | DONE | 2026-11-08 | The local check gate runs every heavy check for any C++ change, so a test-only header change pays for the database rebuild, the tick smoke and all 98 suites. | |
| Run an independent local AI assistant | DONE | 2026-11-08 | Build standalone agent/MCP stages for issue #4295 with NATS-only tools and separate CUDA inference. | |
| Support native Windows pricing and local services | DONE | Native ORE package, local services, build portability and account-preservation evidence. | ||
| Serve one screen from the new server | DONE | 2026-11-08 | Sign in, one list and the change stream all work on the C++ server, and no screen calls them: the browser still reaches the BFF for everything. Put one screen on the C++ server behind a flag, with the BFF serving every other screen, so the shape is proven against a real person before the rest is ported. | |
| Hotfix: clear the six failing checks on main | DONE | The local gate on main fails six checks that no branch owns: component-drift names eight generated files that no longer match their models, unity-collisions finds five file-local names shared by two ores.synthetic test units, er-diagram is stale, money-decimal-columns types seven continuous trading columns as exact decimals, bff-list-requests is missing instrument_underlyings, and ticks-smoke books a bond whose call date the run already stored. | ||
| Hotfix: read the marketdata log the launcher writes | DONE | 2026-11-08 | 2026-11-08 | The ticks smoke check reads a log name the launcher does not write, so it fails on a healthy system. |
4. Achievements
Sprint 29 closed with 69 stories DONE and 61 ABANDONED, nearly all of the latter carried to the product backlog.
- The browser hears changes as they happen. The server streams them and coalesces them per window, and responses stream while they are made.
- The session is held at the door, and request bodies have a bounded memory cost.
ores.oreis the only owner of ORE formats, and every ORE output is modelled.- Public fixings are published through an adapter, and volatility surfaces are supported.
- Most of the move from sqlgen and reflect-cpp to generated code landed. The rest is carried.
- The local check gate runs only the checks a change needs, and CI failures on Windows, Linux and macOS were addressed in PR #4500.
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 |
|---|---|---|
| Write the rest of a booked trade | trading, booking | The instrument writer leaves three gaps: the bond remainder members, the child-to-header check and the round trip for every family. Close them so book_trade writes whatever the export reads. |
6. Health Review
| # | Date | Day | Overall | Task |
|---|---|---|---|---|
| 1 | 2026-11-08 | day 16 | RED | Health review 1 — sprint 29 overrun analysis |
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.
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.
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.
7.4. Cumulative Stories Done
Line chart tracking stories marked DONE during the sprint. Steady upward slope is healthy; plateauing signals a stall.
8. Retrospective
Health review 1 graded the sprint RED on day 16 of a planned 7.
8.1. What went well
- Output and flow were high. 786 PRs merged by review day, with a median merge cycle of 0.06 hours.
- The streaming, session and ORE ownership stories each finished as whole outcomes.
8.2. What hurt
- The mission was to finish the carried work. The sprint closed about 5% of it and drew in 68 new stories.
- The sprint ran eight days past its planned end, with 38 stories in flight on review day.
- The sprint 28 review gave the same finding, and the count still rose. A written recommendation did not change behaviour.
- Bookkeeping drifted: 105 audit findings on review day, and
compass sprint statusdisagreed with the sprint table at close. - The local gate takes hours, so PR #4500 merged before it finished and before CI reported.
8.3. What changes
- Enforce a limit on STARTED stories in
compass, at the point a story starts. - Make
compass sprint statusread the same state as the sprint table. - Shorten the local gate so that it is run to the end.
9. Release Notes
See release_notes.org for the full narrative.
Capture the sprint 29 release screenshots lists the images the notes need.