Sprint 26

Table of Contents

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

For each module, sync codegen and clear its drift, then analyse the user journeys, then build the UX.

The three passes run in this order, and one approach is used for each. Sprint 25 tried many approaches side by side and settled on this one; the other approaches are closed and are not reopened here.

2. Status

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

2.1. Achievements

  • The Component Clean Standard pass came within five of its target: 27 components brought fully to the standard, ores.reporting and ores.dq closed at the work they delivered with the remainder split out, and ores.cli decommissioned. ores.diff, ores.eventing, ores.history, ores.scheduler and ores.synthetic carried to the backlog.
  • The trade was redesigned on data-oriented principles: an immutable anchor with component tables keyed by the trade, generated composite keys, netting agreements and sets, sandboxes and virtual books.
  • The journey extraction standard was written, the ores.refdata journeys were extracted, and five journey groups — setup, entry, profile, credentials and access — run as ores.web screens on one shared journey runtime.
  • The HTTP surface became generated end to end: per-component route units, literate org recipes that tangle to Hurl, and a runner that replays them against the live gateway.
  • The shell surface of fifteen components is code generated, or is a hand-crafted command signed off with a reason.
  • The marketdata grammar was rewritten as a hand-written, typed codec checked field by field against ORE's own parser, and quote identities moved onto the new codecs.
  • A hotfix line held the continuous builds: Apple's libc++ gaps, the Windows clang-cl export attributes, the RLS gaps and the CI timeouts, each restored on the day it appeared.

3. Stories

For the definitions of the themes see Themes.

3.1. Product

Story State Start End Description
Open sprint 26 DONE 2026-09-23 2026-09-23 Scaffold sprint 26, set its mission, wire the version manifest and the agile index, and close sprint 25.
Make compass site page the site check DONE 2026-09-23 2026-09-23 The skills and recipes run compass site page as the site check; the full site build is for the first build in a checkout.
Make first-generation component scaffolding opt-in DONE 2026-09-26 2026-09-26 A default-disabled codegen scaffold facet, so a normal regeneration can never recreate stub files or the umbrella header for an existing component.
Complete the LLM skills catalogue ABANDONED   2026-10-05 Finish the skills catalogue sprint 25 started: the dispatcher, the verification ladder, the eval harness, the writing standards, the duplicate reconciliation and the end-to-end check, plus the codegen findings the catalogue work surfaced. Split from Lay the foundation of the LLM skills catalogue at sprint 25 close.
Bring every component to the component clean standard DONE 2026-09-23 2026-09-23 Program story for the codegen pass: the Component Clean Standard, and the 35 component stories below in order.
Harden the gates the component clean standard rests on DONE 2026-09-27 2026-09-27 Replace the three manual checks the ores.service verification rounds exposed with gates: generated output outside the registry, a test case compiled away to green, and a record whose numbers went stale on rebase.
Clean ores.platform to the component clean standard DONE 2026-09-25 2026-09-25 Bring ores.platform to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.logging to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.logging to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.utility to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.utility to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.orgmode to the component clean standard DONE   2026-09-26 Bring ores.orgmode to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.diff to the component clean standard ABANDONED   2026-10-05 Bring ores.diff to the Component Clean Standard (Entity items): tier 1, foundation infrastructure.
Clean ores.storage to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.storage to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.security to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.security to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.database to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.database to the Component Clean Standard (Entity items): tier 1, foundation infrastructure.
Clean ores.nats to the component clean standard DONE   2026-09-26 Bring ores.nats to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.connections to the component clean standard DONE   2026-09-23 Bring ores.connections to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.eventing to the component clean standard ABANDONED   2026-10-05 Bring ores.eventing to the Component Clean Standard (All items): tier 1, foundation infrastructure.
Clean ores.history to the component clean standard ABANDONED   2026-10-05 Bring ores.history to the Component Clean Standard (Protocol items): tier 2, higher infrastructure.
Clean ores.service to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.service to the Component Clean Standard (Protocol items): tier 2, higher infrastructure.
Clean ores.telemetry to the component clean standard DONE   2026-09-26 Bring ores.telemetry to the Component Clean Standard (Protocol items): tier 2, higher infrastructure.
Clean ores.geo to the component clean standard DONE   2026-09-26 Bring ores.geo to the Component Clean Standard (All items): tier 2, higher infrastructure.
Clean ores.variability to the component clean standard DONE     Bring ores.variability to the Component Clean Standard (Protocol items): tier 2, higher infrastructure.
Clean ores.fpml to the component clean standard DONE   2026-09-26 Bring ores.fpml to the Component Clean Standard (All items): tier 2, higher infrastructure.
Clean ores.assets to the component clean standard DONE 2026-09-23 2026-09-26 Bring ores.assets to the Component Clean Standard (Entity items): tier 2, higher infrastructure.
Clean ores.http to the component clean standard DONE   2026-09-27 Bring ores.http to the Component Clean Standard (Protocol items): tier 2, higher infrastructure.
Clean ores.scheduler to the component clean standard ABANDONED   2026-10-05 Bring ores.scheduler to the Component Clean Standard (Entity items): tier 2, higher infrastructure.
Clean ores.workspace to the component clean standard DONE 2026-09-28 2026-09-28 Bring ores.workspace to the Component Clean Standard (Entity items): tier 2, higher infrastructure.
Clean ores.workflow to the component clean standard DONE   2026-10-02 Bring ores.workflow to the Component Clean Standard (Entity items): tier 2, higher infrastructure.
Give the workflow component a fixture it can run against itself DONE 2026-09-26 2026-10-05 Make the workflow component exercisable from ores.shell against a live fleet, without another component's data: the fixture and the cross-tenant engine. The remainder continues in Add the identity workflow and the commands that drive it.
Clean ores.iam to the component clean standard DONE 2026-09-23 2026-09-27 Bring ores.iam to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.refdata to the component clean standard DONE 2026-09-23 2026-09-28 Bring ores.refdata to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.analytics to the component clean standard DONE 2026-09-23 2026-09-26 Bring ores.analytics to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.compute to the component clean standard DONE 2026-09-23 2026-09-26 Bring ores.compute to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.reporting to the component clean standard DONE   2026-10-05 Bring ores.reporting to the Component Clean Standard (Entity items): tier 3, domain component. The defects and gaps the pass recorded continue in Complete the ores.reporting clean-up.
Clean ores.synthetic to the component clean standard ABANDONED 2026-09-23 2026-10-05 Bring ores.synthetic to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.marketdata to the component clean standard DONE   2026-10-01 Bring ores.marketdata to the Component Clean Standard (Entity items): tier 3, domain component.
Add proper curve support to ores.marketdata ABANDONED   2026-10-05 Give a curve identity, provenance and a consumer, so it is not a derived series nothing reads back. Blocked on the clean-up closing.
Clean ores.dq to the component clean standard DONE 2026-09-26 2026-10-05 Bring ores.dq to the Component Clean Standard (Entity items): tier 3, domain component. Pass 1's artefact tail continues in Model the handcrafted ores.dq code and generate the artefact tables.
Clean ores.ore to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.ore to the Component Clean Standard (Entity items): tier 3, domain component.
Clean ores.trading to the component clean standard DONE   2026-10-02 Bring ores.trading to the Component Clean Standard (Entity items): tier 3, domain component.
Design the trade shape on data-oriented principles DONE 2026-10-02 2026-10-03 Split the trade into an immutable anchor and component tables keyed by the trade, one per access pattern; model sets, groups, links, activities and the client-facing version as entities.
Teach the code generator the trade shape DONE 2026-10-03 2026-10-03 Immutable anchors, real foreign keys into them, and pinned composite keys.
Model netting agreements, netting sets and CSAs DONE   2026-10-03 Three entities in ores.refdata, tying each trade to a set of its own counterparty and legal entity.
Add sandboxes and virtual books DONE   2026-10-03 Sandboxes anchored to the official portfolio tree, with virtual books that hold only trades that are never live.
Split the trade into an anchor and its components DONE 2026-10-03 2026-10-05 An immutable anchor and component tables per access pattern; identifiers and the envelope as entities; no workspaces in trading.
Record trade activities, their participants and trade links ABANDONED   2026-10-05 One activity per business event, acts with participants, and typed directed links.
Model operational authorisation and the client-facing agreement ABANDONED   2026-10-05 Append-only authorisation decisions with a derived status, and the agreement that carries the external version.
Model trade structures ABANDONED   2026-10-05 The structure anchor, kind and template, temporal membership and one level of nesting.
Clean ores.testing to the component clean standard DONE 2026-09-26 2026-09-26 Bring ores.testing to the Component Clean Standard (All items): tier 4, client or test support.
Clean ores.cli to the component clean standard ABANDONED     Bring ores.cli to the Component Clean Standard (All items): tier 4, client or test support.
Clean ores.shell to the component clean standard DONE   2026-09-27 Bring ores.shell to the Component Clean Standard (All items): tier 4, client or test support.
Decommission ores.cli DONE 2026-09-23 2026-09-26 Remove the ores.cli component, its round-trip dataset and its recipes. A clean-standard review found no capability the shell or the service layer does not already provide. The directory round trip was kept and covered by a test, which found a 17-document export defect.
Write the journey extraction standard and the ores.refdata journeys DONE 2026-09-23 2026-10-05 Second pass of the sprint 26 mission: the User Journey Extraction Standard, written from the sprint 25 IAM journey work, and its first run — the ores.refdata journeys, with every Qt action covered by a journey or recorded as dropped. The remaining components continue in Extract the remaining component user journeys.
Show the current agile work item inside DSH DONE 2026-09-23 2026-09-23 A DSH plugin that renders the sprint's stories and tasks as a kanban board, read from the org tree, with the work tree properties visible on every card.
Reach systemd from a sandboxed compass session DONE   2026-09-26 Make the busctl transport the default so a sandboxed compass session can see and change the systemd fleet, give the systemd pillar the flag the services pillar has, and stop the deploy hiding a failed daemon-reload.
Give object storage a NATS and HTTP interface with authentication DONE 2026-09-26 2026-09-27 Model the storage operation set so that put, get, delete, exists and list are reachable over both NATS and HTTP, authenticated on both, and exercisable from the shell and the test suite.
Implement the user journeys in ores.web ABANDONED   2026-10-05 Programme story for the third pass of the sprint 26 mission: one story per journey group in ores.web, built on one shared journey runtime, in dependency order.
Implement the setup journeys in ores.web DONE 2026-09-27 2026-09-30 The first steps: first run, new tenant and new party run in ores.web, on the accepted seed-profile and provisioning contracts.
Implement the entry journeys in ores.web DONE 2026-09-29 2026-09-30 The door: sign in and sign up run in ores.web, on the refusals, the defaults and the registration state the platform needs.
Implement the profile journeys in ores.web DONE 2026-09-30 2026-10-05 The profile: present myself, keep my details current and change someone's details run in ores.web, on the self-service and administrator profile contract.
Implement the credentials journeys in ores.web DONE 2026-09-30 2026-10-01 The fourth group: the member's own security screen, the administrator's rescue actions and the sign-in audit. Prototypes first, on the journey runtime the Setup group landed.
Implement the access journeys in ores.web DONE 2026-09-30 2026-10-04 The fifth group: the member's own access, the administrator's grants, and the role catalogue. The documents are re-verified before anything is built from them. The fourth journey continues in Land the role request journey.
Observe a run while it works ABANDONED   2026-10-05 A run states what each step is, how far into it the work has come, and what it has done so far: a step's presentation context, a live progress register and an append-only journal, in the workflow component that every workflow needs.
Roll the generator fixes out to the components outside the test list DONE 2026-09-28 2026-09-28 Regenerate history, scheduler, storage, marketdata and synthetic against the four generator fixes the refdata clean-standard pass landed, so the tree carries one response shape and one recipe family rather than two of each.
Keep the ores.iam eventing tests idempotent DONE 2026-09-30 2026-09-30 Three generated ores.iam eventing tests failed on the second run against the same database: they seed a system-tenant parent seed profile and never remove it, and its synthetic code was unique only within one process.
Generate the shell surface of the clean components DONE 2026-10-01 2026-10-01 Every ores.shell command a component at the clean standard answers is code generated, or is a hand-crafted command signed off with a reason. The seven components are done; the facet's profile-level default continues in Default the shell facet on at the profile level.
Generate the shell surface of the remaining components DONE 2026-10-01 2026-10-01 The eight components outside the first seven that still hold shell-surface gaps: every command they answer is generated or their model states why it renders none, and every hand-crafted command keeps a recorded reason.
Complete the ORE report configuration ABANDONED   2026-10-05 The remainder of the ORE report configuration: the round trips still missing, the report-kind classification, the run-input packaging, and the hand-written tables that need models. Split from Model the ORE report configuration as entities at sprint 26 close.
Return marketdata to the clean-standard registry ABANDONED   2026-10-05 The remainder of the oresmd rewrite: take the marketdata registry entry once P01 and H01 close, and remove the namespace closer comments H03 forbids from the templates and the files they generate. Split from Rewrite the oresmd grammar as a hand-written codec checked against ORE at sprint 26 close.
Land the role request journey ABANDONED   2026-10-05 The fourth access journey: the member asks for a role beyond the one registration gave them, and the tenant administrator answers. Split from Implement the access journeys in ores.web at sprint 26 close.
Default the shell facet on at the profile level ABANDONED   2026-10-05 The last lever of the shell surface story: make ores.cpp.shell-command default on at the profile level once no component would gain an unintended unit. Split from Generate the shell surface of the clean components at sprint 26 close.
Sprint 26 closure: story cleanup and reset for sprint 27 DONE 2026-10-05 2026-10-05 Close out sprint 26: resolve every story at the sprint close, rework and split the eleven stories that delivered part of their scope, carry the nineteen unfinished stories to the product backlog inbox, and write the release notes, the charts and the retrospective.
Sprint health review — System 2 analysis DONE 2026-10-05 2026-10-05 The System 2 health review of sprint 26 at its close: the six dimensions measured and challenged, the bookkeeping repaired, and one overall RED verdict with the evidence behind it.

3.2. Hotfixes

Story State Start End Description
Remove the unused packages, extensions and Qt-named keys DONE 2026-09-23 2026-10-05 Remove the weight the Qt retirement left behind: the X11 and GL packages and the pg_cron and pgmq extensions nothing uses, the Qt-named presentation keys and their helpers, and the first documentation corrections. The remaining presentation keys continue in Remove the presentation keys no template reads.
Hotfix: The site build aborts on a read-only HOME DONE   2026-09-26 compass build –direct site aborts before publishing: the batch Emacs bootstrap deletes the user's quickstart cache on a read-only HOME, and two pages write an org link in Markdown backticks.
Add a read-only entity profile DONE   2026-10-05 A named variability profile that generates read-only entities: list, get and get_many, no writes, no versions. Making ores.database a composite continues in Make ores.database a composite and host the generated entity.
Generate HTTP routes from the models DONE   2026-09-27 Decompose the HTTP gateway the way ores.shell decomposes its command surface: one sub-component per exposed component, each holding generated per-entity route units, so no route is hand-crafted. The gateway stops calling component services in process and speaks the canonical NATS protocol instead, which is what lets one generator serve both surfaces from the same models.
Generate literate HTTP recipes that tangle to runnable Hurl DONE   2026-09-27 Give the HTTP surface the treatment the shell surface already has. A codegen facet emits one literate org recipe per model that renders an HTTP route, and each endpoint's block tangles to a Hurl file in a committed library, so the same document is the page a reader browses and the test the fleet runs. A runner replays a recipe group against the live gateway behind a sign-in preamble and reports a verdict for each, and the inventory is generated and gated.
Stop ores.shell menus from silently shadowing each other DONE   2026-09-27 Five shell menus are registered twice, and the CLI resolves a duplicate by registration order in repl.cpp. Where both sides define a verb, the loser's implementation is dead: accounts list, roles and permissions get/list, and tenants add/delete/get. The dq side of the same class is fixed in the generator, which no longer renders a shell-command unit for an artefact-staging-only entity.
Close the object storage interface leftovers DONE 2026-09-27 2026-09-27 Give the shell a raw storage surface whose verbs take a bucket, a key and a local path, and make the schema setup re-runnable so a second setup_schema.sql run completes.
Move reporting's write path onto the storage protocol DONE 2026-09-27 2026-09-27 Point the reporting storage plan at the protocol bucket and key shape, so the writer and the reader of a report blob agree, and re-verify the compute and ORE consumers on the current tree.
Mop up the storage leftovers the goal surfaced DONE 2026-09-27 2026-09-27 Assign the tenant admin role the provisioner forgot, clear the retired bucket directories, and record the instrument-audit defect the ORE import exposes.
Run an example bundle through the compute grid from a report definition ABANDONED 2026-09-27 2026-10-05 Give ACME corporation a report type and a report definition whose run does no preprocessing: it takes an existing example bundle, submits it to the compute grid and retrieves the results. The point is to prove the report definition and report instance machinery works end to end, not to analyse anything.
Design the report pipeline and the run configuration DONE 2026-09-27 2026-10-05 The design for one report definition running end to end from the scheduler through the workflow to the compute grid: the run configuration that selects the phases, the target state, the decisions and the documentation. The implementation continues in Implement the full report pipeline.
Clean up the ores.shell remnants DONE   2026-09-27 The ores.shell clean-standard pass closed the component and recorded what it did not close. This story closes those four: the fourteen hand-written trading instrument units that generation supersedes, the three defects the pass found and only recorded in commit messages, and the iam S01 accepted exception whose reason the menu-ownership change made untrue.
Hotfix: Restore every red build on main DONE 2026-09-27 2026-09-27 Four independent defects put the continuous builds in the red: the Linux jobs stop in validate_schemas.sh on four regenerated workspace SQL files that duplicate the wired hand-written schema and belong to no aggregator; the macOS jobs cannot compile the iam handlers, because libc++ has no std::atomic<std::shared_ptr<T>> specialisation; the Windows and nightly jobs stop in the database recreation on an undefined storage_service_user psql variable; and the site build aborts on a file: link to a Python line number. The last two were fixed on main before this story started; the PR carries the first two.
Remove the ores.web fleet workaround DONE 2026-09-27 2026-09-27 The component carries its own way to start a subset of the fleet because compass services start could not reach systemd from a sandboxed session. busctl removed that constraint, so the scripts are a second way to start the same services. This story deletes them and everything that offers them.
Format the generated TypeScript with prettier DONE   2026-09-27 Make prettier the second step of the TypeScript render, exactly as clang-format is for C++, commit the style as a configuration, format the tree once, and gate the check on a pull request.
Hotfix: the site build aborts on a POSIX class that reads as a link DONE 2026-09-28 2026-09-28 The site build stops on main publishing the dq clean task: an inline verbatim span is closed early by an equals sign inside the command it holds, so the POSIX character class that follows is parsed as an org link to :space:. The two spans take tilde delimiters, which that equals sign cannot close, and the doc-lint job now fails any parsed link whose target begins with a colon.
Hotfix: macOS cannot parse a floating point with std::from_chars DONE 2026-09-28 2026-09-28 The macOS build stops on the credit simulation mapper: libc++ on Apple platforms declares the floating-point std::from_chars as a deleted function, so the one site in the estate that parses a double with it compiles on Linux and MSVC and fails there. ores.platform gains a locale-independent, whole-input parse that stands in for it, and the mapper uses it.
Hotfix: two macOS test failures that assert Linux-only facts DONE 2026-09-28 2026-09-28 The macOS test phase fails twice now that the build compiles: two assertions compare the system temp directory with the parent of a temp file as strings, and macOS spells that directory with a trailing separator; and a systemd notify case binds an abstract unix socket, which macOS has no namespace for. Both are test defects, both are fixed in the tests, and the first is proved against the macOS spelling reproduced on Linux.
Hotfix: a Boost library landed without its vcpkg port DONE 2026-09-28 2026-09-28 The decimal amount type includes boost/multiprecision/cpp_dec_float.hpp, and vcpkg installs Boost one library per port, so all four continuous Linux jobs failed at that translation unit with a missing header. The port is declared, the component is declared in the root find_package as well, the decimal and bond leg amount suites pass, a check fails before the build when a Boost include has no port behind it, and a configure without the port now fails naming the component.
Hotfix: three reporting tables carry a tenant and no row-level security DONE 2026-09-30 2026-09-30 validate_schemas.sh fails on three RLS_001 warnings: the analytic type, report analytic and report run setup tables carry a tenant_id with no ENABLE ROW LEVEL SECURITY, so every build that validates the SQL tree – the continuous builds and the new pull-request verifier – stops before it builds. The three models declare the tenant isolation facet and their create and drop SQL are regenerated.
Hotfix: the workflow deadline watch uses a thread Apple's libc++ lacks DONE 2026-09-30 2026-09-30 Both macOS legs fail on the deadline watch the step deadline introduced: it declares a std::jthread, and Apple's libc++ has the stop token and stop source but not the thread that owns them. A portable stoppable_thread joins ores.platform's concurrency header, beside the other types that stand in for a standard facility a supported library does not implement, and the engine moves onto it.
Hotfix: Apple's libc++ has no C++20 stop machinery at all DONE 2026-09-30 2026-09-30 The portable thread that fixed the macOS build still failed it: the earlier diagnostic named only std::jthread, and the shim kept std::stop_token and std::stop_source, which Xcode 16.2's libc++ also lacks. The shim now carries its own stop source – a shared atomic flag – and depends only on thread, atomic, memory and utility.
Hotfix: the recovery test fails when the database is busy DONE 2026-10-01 2026-10-01 workflow_engine_tests.cpp:404 waits five seconds for a second step command after recover_in_progress() and got one: the pass re-dispatches every in-progress instance the database holds, including those the test binaries ctest runs in parallel started in their own tenants, and the case's ten-message buffer evicts its own command when the deployment is busy. The buffer and the wait are raised, with the reason beside them.
Hotfix: the ER diagram no longer matches the SQL tree DONE 2026-10-01 2026-10-01 The codegen drift job passes its generated-output step and fails the ER diagram step, because the committed ores_schema.puml fell behind the SQL the reporting analytics, asset class catalogue and curve configuration merges added. Every pull request is red for it, including ones that touch no SQL. The diagram is regenerated from the tree.
Hotfix: a visibility macro on an enum breaks the Windows build DONE 2026-09-29 2026-09-29 The workflow definition marks the failure_policy enum with ORES_WORKFLOW_API_EXPORT, which expands to a DLL import or export attribute. The attribute does not apply to an enum, and clang-cl reports it as -Wignored-attributes, an error under -Werror, so every Windows clang-cl job stopped while compiling a translation unit of ores.dq.core.lib. The macro is dropped, and a check now fails a pull request that puts a visibility macro on an enum, because no compiler on Linux or macOS reports the defect and the continuous workflows run on a schedule rather than on a pull request.
Hotfix: a library exports a type none of its units compiles DONE 2026-09-30 2026-09-30 The Windows clang-cl build fails at the link step of every consumer of ores.workflow.api: the two hand-written service headers put the export macro on header-only types that no translation unit of the library includes, so the library exports nothing for them while every consumer imports them, and clang-cl cannot generate the implicit constructors locally. The attribute is removed from the six declarations, and a scan now fails on a pull request when any sublibrary exports a type none of its units compiles.
Hotfix: the nightly Valgrind run reports uninitialised members and library leaks DONE 2026-09-29 2026-09-29 The nightly dynamic analysis reports defects in four suites: trading.api 4, refdata.core 3329, ore.core 99 and analytics.core 214. The uninitialised-value defects are generated struct members with no in-class initialiser – the analytics matrix bounds and row probabilities, bond_future's dates, bond_trs::funding_rate – read by the write path that stringifies an entity for its INSERT; the 3329 are still-reachable allocations in the coverage runtime, glibc's atexit registration, libpq's connection state and the Catch2 reporter. The models declare the defaults, org_loader now refuses the nullable shape, and the suppressions carry the library allocations.
Hotfix: the macOS parser refuses the smallest subnormal DONE 2026-09-30 2026-09-30 The macOS test phase fails one round trip in ores.platform.tests: parse_double answers nullopt for 5e-324, the shortest decimal that rounds to the smallest denormal a double has, because libc++ turns the range error a subnormal result carries into a stream failure and the shim parsed through a stream. The parse now checks the grammar itself and converts in a C locale of its own, so a subnormal is accepted and only a value that rounds to zero or to infinity is refused.
Model the ORE report configuration as entities DONE 2026-09-27 2026-10-05 Give the ORE report configuration vocabulary a typed entity model: the seventeen XML documents an ORE run is configured with, owned by or referenced from a report definition, so the engine's input is produced from entities rather than assembled by hand. The remainder continues in Complete the ORE report configuration.
Show the environment inside DSH DONE   2026-09-30 A DSH plugin that shows this checkout as a live environment: its name, when the database was last restored and how long ago, the schema drift, and the state of every service. It starts and stops services, and it restores the database behind a guard. It reads compass, so the readiness and drift rules have one home.
Log the fleet to the journal DONE   2026-09-30 Every service writes its log to the console, systemd captures it into the user journal, and nobody writes a log file. compass reads readiness and log tails from the journal, so one interface serves every service including nats-server. The environment plugin gains a log overview for one service.
Make the oresmd URI grammar explicit and typed DONE 2026-10-01 2026-10-02 Rewrite the oresmd URI grammar so that no key's absence carries meaning and no coordinate is an untyped string, then move the stored series identity and coordinate onto it.
Make the tenant roster a working list DONE 2026-10-02 2026-10-02 The tenant roster reads the tenants but cannot search, filter, page or act on one. Bring it to the design the See the tenants journey and the proposed layout describe: search and paging, type and status filters, a per-row actions menu, and a tenant detail screen.
Rewrite the oresmd grammar as a hand-written codec checked against ORE DONE 2026-10-02 2026-10-05 Replace the generated oresmd grammar with a hand-written, typed codec checked field by field against ORE's own parser, and model every ORE type. The remaining clean-standard items continue in Return marketdata to the clean-standard registry.
Hotfix: the marketdata core suite times out in CI DONE 2026-10-02 2026-10-02 ores.marketdata.core.tests is killed at the 600-second ctest limit on every Linux CI job, because the whole-corpus import walk now runs by default and its per-file check reads the whole tenant back after every file.
Hotfix: the workflow deadline pass reads an entry it has freed DONE 2026-10-02 2026-10-02 expire_overdue_steps() erases a step's awaiting entry and then reads the run id through a reference into it, so on macOS the run is never failed and two deadline tests fail.
Hotfix: a service listener falls behind a burst of notifications DONE 2026-10-02 2026-10-02 postgres_listener_service sleeps 100 ms after every poll even with notifications waiting, so a bulk import's per-row notifications back up for hours, its backend sits in ClientWrite, and every DROP DATABASE on the shared server stalls.
Act inside a tenant DONE 2026-10-03 2026-10-03 A system administrator explicitly enters a tenant, sees that they are acting in it, reads that tenant's data through the ordinary reads, and leaves. Replaces the cross-tenant party read.
Stop the web typecheck racing the web tests DONE 2026-10-03 2026-10-03 ctest runs ores.web.typecheck and ores.web.tests together; tsc –build –force rewrites the wire package's dist while the BFF tests load it, so 18 suites fail with an undefined import on linux-clang-release.
Implement order and filter in the generated list contract DONE     The generated service refuses a stated order and any filter. Generate order, filter, search and one-of members from the model, then move the hand-written tenant reads onto them.
Give a person's token the permissions they hold DONE 2026-10-03 2026-10-03 A person's token carries no permissions and the token check passes an empty list, so every permission check passes for every signed-in person. Issue tokens with the effective permissions, keep them current, and fail closed.
Refuse to start against a database built from other SQL DONE 2026-10-03 2026-10-03 A service, a test run or compass services start refuses to run against a database whose schema was built from different SQL than the code expects, and says so plainly.
Send the filter with every web list request DONE     The generated list requests gained an optional filter member, and the server's decoder requires every member, so every web route whose hand-written request leaves it out is refused as a bad request.
Make the shell speak to people plainly DONE 2026-10-04 2026-10-04 The shell names journeys and asks the administrator to enter a tenant, which are implementation terms. Reprototype the home screen, then show tenant management as a list with add and remove, and open a tenant's details with the tenant session held behind the scenes.
Document the operations journeys DONE 2026-10-04 2026-10-04 The super-user's view of a running installation: the services that are up, the compute grid, the message bus, the logs, and the versions and database fingerprint. Five journeys written to the User Journey Extraction Standard, then proven with a prototype.
Remove workspaces from every component ABANDONED   2026-10-05 Workspaces are replaced by sandboxes and virtual books: remove the workspace column, the workspace context and the ores.workspace component across the system.
Hotfix: Linux and Windows CI builds on main DONE 2026-10-04 2026-10-04 The Linux debug builds time out because the sccache entry is never refreshed, and the Windows clang builds fail on a deprecated getenv call in the ores.platform tests.
Implement the operations journeys in ores.web ABANDONED 2026-10-04 2026-10-05 The ninth group: the installation's own life — the services running, the compute grid, the message bus, the logs, and the versions and database under them.
See an account's sign-ins DONE 2026-10-04 2026-10-04 An administrator opens any account, a platform service's included, and reads its type, its sign-in state and its sessions; the system administrator does so for the system tenant's accounts.
Implement the refdata journeys in ores.web DONE 2026-10-04 2026-10-05 Build the ores.refdata user journeys as ores.web screens on the journey runtime: the classification list, currency, desk group, currency pair and holiday calendar screens run on the real server (PR #2644 and PR #2646).
Build approval requests and notifications DONE 2026-10-04 2026-10-05 A new ores.inbox component holds a generic approval record and queue and a notification subsystem any activity can use, with the approval and notification models generated, the rules the schema can carry, and the service operations serving them (PR #2652). The role request kind and the screens continue in Complete the ores.inbox approvals and notifications.
Standardise the record screens DONE 2026-10-05 2026-10-05 One standard for every screen that lists, reads, creates, amends and deletes records: paging, history, change reasons, related records, icons and states, built from shared components so no screen varies. Server paging through the shared Pager landed with the currency, desk group and currency pair screens (PR #2644), the People screens conformed with my profile split from them (PR #2655), and the holiday calendar screen arrived at the standard (PR #2646); applying the rest continues in Bring the record screens to the standard.
Fix the self write refusal on a tenant with accounts DONE 2026-10-05 2026-10-05 Every write whose actor is the account written is refused with Invalid modified_by on a tenant that holds accounts: the generated insert function retires the actor's current row as part of the version replace before it validates modified_by. Found by the profile journeys end-to-end run, which cannot land PUT /api/me/profile and PUT /api/me/contact-information.
A pattern language for service interaction DONE 2026-10-05 2026-10-05 Name the established microservice patterns the platform uses, in one pattern language with a hub, so a design can say use pattern X and inherit its pitfalls, failure handling and sources. The five remaining groups and the rule that a design names its patterns continue in Complete the pattern language.
Codegen improvements from the clean-up passes ABANDONED 2026-09-27 2026-10-06 Fix the codegen defects the component clean-up passes surface: each is recorded with the evidence that shows it and fixed at its source with a regression test, on one long-lived branch that merges once every component is clean.

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

4.1. 2026-10-03: market data quote identities moved to the new codecs

PR 2545 merged at 14:24 UTC (f0d385c1d8). Every reader and writer of a stored quote identity now uses the hand-written ORE key codec and oresmd URI codec, and quote URIs have the form oresmd://fx/EUR?type=quote&instrument=fx_spot&quote=rate&ccy=USD. A quote URI in the old form no longer reads, so every developer must recreate their database and re-import after pulling main: compass db recreate -y -k. The second part of the cut-over, which drops market_observations.key, needs the same step.

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-10-05 day 13 RED Health review 1 — sprint 26 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

The release notes carry the full narrative.

8.1. What worked

  • The Component Clean Standard gave the codegen pass one measuring stick, and the passes applied it component by component with the drift gate as the authority rather than a reader.
  • The split-at-close discipline: eleven stories closed at the scope they actually delivered, with the remainder named in a successor, so the sprint's record does not claim work that did not ship and does not hide work that did.
  • The hotfix line answered every red build with a check where the class allowed one, so the same defect could not return quietly.
  • The journey work documented the target before building it, and the prototypes settled the runtime the later groups reused.

8.2. What didn't work

  • The sprint ran thirteen days against a seven-day window, and the mission's three passes did not all close: the clean standard and the journey extraction each left remainders large enough to carry.
  • Five components never reached the clean standard at all, and the health review rated the sprint RED.
  • The story count grew mid-flight as splits landed, so the sprint table needed a close-time pass to tell delivered scope from carried scope.
  • The web journey groups landed close together at the end, which put review pressure on the last days.

8.3. Improve next sprint

  • Size the mission to the window: one pass per sprint, not three.
  • Split a story when its scope grows, not at the close.
  • Keep the carry list visible in the sprint document from the first week, so the close is a confirmation rather than a discovery.

9. Release Notes

See release_notes.org for the full narrative.

Emacs 29.3 (Org mode 9.6.15)