Product backlog — next
Table of Contents
The next bucket of the product backlog. Captures here are captures — pre-sprint ideas considered candidate work for the next version. When a sprint pulls one in, it becomes a story.
The table below is regenerated by
projects/ores.codegen/scripts/regenerate_backlog_indexes.py — do not
edit the rows by hand. To add a capture, run
generate_doc.sh --type capture --parent-dir doc/agile/product_backlog/next
and re-run the script.
Captures
| Capture | Tags | Description | |||
|---|---|---|---|---|---|
| Accounts need to have a human or robot field | code |
Accounts need to have a human or robot field | |||
| Add =[[nodiscard= to repository operations returning data]] | code |
Add [[nodiscard]] to repository operations returning data |
|||
Add publication_params_schema to artefact types |
code |
Add publication_params_schema to artefact types |
|||
| Add a "is alive" message | code |
Add a "is alive" message | |||
| Add a compass wait-for-CI command | compass github ci tooling |
Poll a PR's CI checks in a sleep/poll/report loop until the checks of interest are green, harvesting failure logs into the project tmp dir when red. | |||
| Add a currency-country assignment widget to CurrencyDetailDialog | qt refdata currency ui gap |
currency_calendar has a CalendarAssignmentWidget in CurrencyDetailDialog for viewing/assigning calendars; currency_country, the sibling junction, has no UI at all. | |||
| Add a Definition of Done entry to the glossary and link to i… | Add a Definition of Done entry to the glossary and link to it from every place we use the term (sprint acceptance criteria, story templates, etc.). | ||||
| Add a delete all button which deletes all currencies | code |
Add a delete all button which deletes all currencies | |||
| Add a flag for human readable time | code |
Add a flag for human readable time | |||
| Add a organisation type scheme entity | code |
Add a organisation type scheme entity | |||
| Add a system clock | code |
Add a system clock | |||
| Add a Videos page and link it from the Resources menu | site docs resources videos |
Create a new site page listing all ORE Studio videos (overview + sprint demos) and add it to the site's Resources menu. | |||
| Add account permissions visibility and tabbed dialog | code |
Add account permissions visibility and tabbed dialog | |||
| Add action type to trades | code |
Add action type to trades | |||
| Add an emacs script to export a single page to HTML | compass site tooling dx |
A compass build –direct target that publishes one org file to HTML using the site's org-publish-project settings, without rebuilding the entire site. | |||
| Add an LLM guidance document stating that all temporary data… | Add an LLM guidance document stating that all temporary data produced during tasks must be placed under the project's tmp/ directory, not scattered in arbitrary locations. | ||||
| Add automated cross-tenant regression tests for DQ governanc… | Add automated cross-tenant regression tests for DQ governance 'shared reference data' repositories (catalog, data_domain, change_reason, change_reason_category, badge_severity, badge_definition): seed a row as the system tenant, then assert a different tenant context can read it back via read_latest/read_all/get_total_*_count. None of the existing repository unit tests exercise this path (they all write+read within a single tenant), so a future accidental reintroduction of an app-level tenant_id filter (the exact bug fixed by tenant_read_scope: shared) would go uncaught by CI. Flagged by PR #1668 review. Needs database_helper (or a new helper) support for constructing a second, distinct tenant context within one test, which it doesn't cleanly support today. | ||||
| Add auxiliary types to their entities | code |
Add auxiliary types to their entities | |||
| Add CLI, HTTP, shell, and Wt layer generation to codegen | Codegen currently has no profiles for generating CLI commands, HTTP REST endpoints, shell REPL commands, or Wt web UI. Each entity commissioned since the codegen migration ships without these layers, and per-entity placeholder captures accumulate. Build codegen profiles for each layer so entities get CLI/HTTP/shell/Wt support automatically on regeneration. This will need splitting into per-layer stories (one for CLI, one for HTTP, one for shell, one for Wt) with per-component tasks. | ||||
| Add coloured icons | code |
Add coloured icons | |||
| Add CONFIGURE_DEPENDS to file(GLOB) for .ui/source forms | cmake qt build dx |
Qt UI forms and sources registered via bare file(GLOB) are not picked up until CMake is manually reconfigured, causing ui_*.h-not-found build breaks on newly added files. | |||
| Add currencies update command to shell | code |
Add currencies update command to shell | |||
| Add FX market-convention facet (base/quote order, pip precision) | refdata fx marketdata ui |
No reusable facet exists for FX market conventions (canonical base/quote ordering per pair, pip/decimal precision for display) – rates are formatted as plain doubles everywhere they're shown. | |||
| Add languages to ores.qt | code |
Add languages to ores.qt | |||
| Add missing history dialogs | code |
Add missing history dialogs | |||
| Add modified since for all entities | code |
Add modified since for all entities | |||
| Add new flag to change reasons in Qt UI | ui bug |
Change reasons have a new flag in the database but it is not surfaced in the Qt UI. Add the field to the change reason form. | |||
| Add party role scheme entity | code |
Add party role scheme entity | |||
| Add postponed state to agile dashboard | agile dashboard sprint |
Dashboard has no 'Postponed' concept; stories returned to backlog at sprint close lose the signal that they were in-flight. | |||
| Add proper enumerations for trade key fields | code trades ui database |
Key trade fields (product type, call/put) currently use raw strings. Add typed enumerations backed by database tables; UI uses combo boxes populated from these tables. | |||
| Add recipes for doc list commands (compass list, search, etc… | Add recipes for doc list commands (compass list, search, etc.) and link them to the relevant skills in the skills catalogue. | ||||
| Add regression tests for domain_entity SQL template fixes | codegen testing refdata sql |
Guard the change_reason_code_declared dedup and validation_fn scope sync-back fixes with unit/golden tests in ores.codegen's test suite. | |||
| Add regression tests for onboarding.party wizard-completion checks | ores.iam ores.variability testing onboarding |
No automated coverage for party_setup_required/party_setup_warning branching in auth_handler/account_handler, nor for the complete_party_onboarding NATS handler and new system_settings_service onboarding accessors — flagged during PR #1491 review as valuable given this is the second time a party-wizard re-trigger bug has been fixed in this area. | |||
| Add regression tests for tenant provisioner system-settings seeding | ores.sql testing iam variability |
No automated coverage for ores_variability_seed_tenant_system_settings_fn or a provisioner-level assertion that all system.* settings land on a freshly-provisioned tenant, flagged during PR #1496 review as valuable given this is exactly the bug class being fixed (a setting silently missing per-tenant). | |||
| Add repository-level unit tests for hand-written market_observation_repository | ores.marketdata testing tech-debt |
market_observation_repository (the hand-written entity's repository, distinct from the codegen market_observations entity) has no repository-level test file at all, including its list_by_series_id/read_latest paths. | |||
| Add RESTRICTIVE party-isolation RLS policies for the marketdata tables | sql security rls marketdata |
Commit 83292021a added party_id to ores_marketdata_feed_bindings_tbl, _market_fixings_tbl, _market_observations_tbl and _market_series_tbl without the matching AS RESTRICTIVE party-isolation policies, so validate_schemas.sh –strict fails (RLS_002). PR #1397 added a stopgap: the four tables are listed under RLS_002 in projects/ores.sql/utility/validation_ignore.txt. The CRM implementation story (PR wiring the CRM into ores.marketdata's ingest path) added three more party_id-scoped tables the same way – ores_marketdata_crm_topology_configs_tbl, _crm_driver_pairs_tbl, _crm_enabled_derived_pairs_tbl – and extended the same ignore-list stopgap rather than fix it ad hoc. Proper fix: add the RESTRICTIVE policies to marketdata_rls_policies_create.sql for all seven tables and remove all seven ignore entries. Until then, party scoping on marketdata is columns-only with no row-level enforcement. | |||
| Add SC script on windows to install ores.service | code |
Add SC script on windows to install ores.service | |||
| Add search to currencies | code |
Add search to currencies | |||
| Add serialisation tests for analytics domain types | code testing analytics |
No tests exist for analytics domain types (pricing engine type, pricing model config, etc.). Add basic round-trip serialisation tests for each. | |||
| Add server-side search/filter to list windows across entities | qt refdata ux list-windows |
List windows only support offset/limit pagination with no search field, making it impractical to find a specific record in large tables (e.g. ~13k GLEIF-imported counterparties) without paging through hundreds of pages. | |||
| Add shell commands for parties and counterparties | code |
Add shell commands for parties and counterparties | |||
| Add shell introduction to Provisioning from the Shell chapter | manual documentation shell ux |
The manual chapter 'Provisioning from the Shell' dives straight into commands without first introducing the shell itself. | |||
| Add sub-menus for shell | code |
Add sub-menus for shell | |||
| Add sub-menus to shell | code |
Add sub-menus to shell | |||
| Add support for staging | code |
Add support for staging | |||
| Add trade import support to HTTP API | code |
Add trade import support to HTTP API | |||
| Add trade import support to shell | code |
Add trade import support to shell | |||
| Add validation and ISO compliance flags for reference data | code |
Add validation and ISO compliance flags for reference data | |||
| Add widget to manage assets | code |
Add widget to manage assets | |||
| Adopt proper secrets management for deployment | security devops deployment |
Container/systemd unit generation uses podman secret only as a narrow workaround for the IAM JWT PEM value (EnvironmentFile= can't represent a multiline value); every other secret still lives in plaintext .env. Evaluate a real secrets-management approach (Vault, SOPS/sealed-secrets, or systemd LoadCredential=) covering all of ORE Studio's secrets consistently across local dev, plain-systemd, and Quadlet deployment modes, instead of one bespoke workaround per format. | |||
| After the UUID upcase migration, local site links resolve to… | After the UUID upcase migration, local site links resolve to absolute local filesystem paths instead of site-relative URLs. Org-publish path resolution needs to be fixed so links are relative to the site root. | ||||
| All environment ports should derive from a single base port,… | All environment ports should derive from a single base port, incrementing by 1. The current setup has overlapping ORES_HTTP_PORT and ORES_CONTROLLER_SERVICE_HTTP_PORT. Document the port assignments and enforce the convention. | ||||
| Allow creating new connections from login dialog | code |
Allow creating new connections from login dialog | |||
| Allow in place editing of currencies | code |
Allow in place editing of currencies | |||
| Allow supplying the postgres connection URI | code |
Allow supplying the postgres connection URI | |||
| Analyse whether timeseries/observation entities need their own codegen metatype | codegen masd timeseries marketdata qt |
market_observation is frontmattered ores.codegen.entity (metatype domain_entity) today, but its shape (TimescaleDB hypertable, high-volume append-mostly, no CRUD Qt layer) is quite different from a standard domain entity. Analyse whether timeseries entities warrant a real distinct metatype (a new #+type dispatch value, its own archetype set) or whether they are adequately expressed as a domain_entity variability knob combination – then, either way, do the codegen work needed to support a proper list/chart-style UI for observations (not the standard generated CRUD detail dialog). | |||
| api and core are not namespaces — fix naming | code architecture housekeeping |
Project component names like ores.qt.api and ores.compute.core use api/core as if they were namespaces, but they are not. Clarify the naming convention or rename accordingly. | |||
| Apply -fvisibility=hidden to ores.shell (visibility-migration straggler) | shell build infrastructure |
The symbol-visibility migration set -fvisibility=hidden per shared library, but ores.shell never received the flag (it was slated to become static instead and stayed shared). Its Linux .so exports ~34k symbols by default, which masked the missing ORES_SHELL_EXPORT macros that broke the Windows test link (hotfix PR #1166). Add the flag (and -fvisibility-inlines-hidden) to projects/ores.shell/src/CMakeLists.txt like its peers, fix whatever additional exports surface, so Linux catches missing macros at dev time. | |||
| AppVersionHistoryDialog diff rows mislabelled | The AppVersion history changes tab emits mislabelled diff rows: both 'Wrapper Version' and 'Name' diff wrapper_version, and 'Description' diffs engine_version. Full details similarly maps codeValue to wrapper_version and both nameValue and descriptionValue to engine_version. Pre-existing bug found during the HistoryDialogBase migration and preserved verbatim; fields should map to the actual app_version domain fields. | ||||
| Architecture doc should link to multi-party, multi-company, … | Architecture doc should link to multi-party, multi-company, and workspace documents under a dedicated Isolation section, so the top-level architecture narrative connects to the domain-isolation concepts. | ||||
| Associating annotations with entities | code |
Associating annotations with entities | |||
| Assorted UI polish work for detached mode | code |
Assorted UI polish work for detached mode | |||
| Async workflow progress for large party hierarchies | code |
Async workflow progress for large party hierarchies | |||
| Atomic batch-save endpoint for FX spot config + components | ores.synthetic robustness api |
Add a server-side transactional endpoint that saves an fx_spot config and its GMM components in one unit so a mid-way failure cannot leave a partially-updated state. | |||
| Audit: does every facet have both a TS-inventory and TS-description link? | codegen meta_model documentation audit |
Check whether every facet doc in projects/ores.codegen/library/templates/ is linked from both its generated TS-inventory page (ores.cpp, ores.sql, ores.cmake, ores.doc, ores.plantuml, ores.shell) and, where one exists, a hand-authored TS-description page (technical_space_cpp.org, technical_space_sql.org, technical_spaces_other.org). Specifically check whether ores.codegen itself (the Python generator implementation) needs this same doc pair, or whether the existing 'Python Technical Space' section in technical_spaces_other.org already covers it. Create whatever's missing. | |||
| Authentication failed dialog does not have details | code |
Authentication failed dialog does not have details | |||
| Auto-unlock login from an env/CLI password | qt dx login env |
Let ores.qt auto-fill/unlock the login dialog from a password supplied via CLI arg or .env, instead of typing it manually every launch. | |||
| Automate content transfer when promoting captures to tasks/stories | compass agile codegen tooling |
compass add task/story –id <capture-id> should copy the capture's content across automatically (not just preserve the ID) and prompt the LLM to reformat it into the target's section schema, instead of the promoter hand-retyping the capture's substance into the new doc. | |||
| Automate new service registration | infra |
Automate new service registration | |||
| Automated SQL generation | code |
Automated SQL generation | |||
| Babel source blocks that run ORE Studio commands should quer… | Babel source blocks that run ORE Studio commands should query the active .env file dynamically for paths and presets, so they work correctly when switching between environments without needing a manual reload. | ||||
| Barclays Plc provisioning never seeds CRM topology (majors/minors/exotics) — Cross-Rates Matrix screen shows nothing | provisioning crm marketdata gap |
After provisioning Barclays Plc via barclays_system_provision.ores (system bundle 'base' + party bundle 'synthetic_realistic_2026', which dispatches marketdata.fx_driver_rates_2026 and synthetic.themes.realistic_2026), the CRM Cross-Rates Matrix screen has no named CRMs to choose from except 'all', which opens blank. Root cause: refdata.crm_topology_bundles (the dataset that seeds the majors/exotics/scandies named CRMs, per projects/ores.sql/populate/refdata/refdata_crm_topology_bundles_populate.sql) is registered only as a member of the marketdata.reference_vintage_2016_02_05 bundle, not of the base/synthetic_realistic_2026 bundles used by current-day tenant/party provisioning. So any tenant provisioned against the 2026 realistic vintage (the now-default/recommended path) never gets CRM topology at all. Surfaced during manual QA of Task: Extend SyntheticBindingDialog to cover IR curve configs (IR Rates synthetic data story). | |||
| Book detail dialog: ID field is editable, should be read-only | qt book bug dx |
Manual QA on the Portfolio/Book composite-versioning scenario found the Book detail dialog's ID (GUID) field is editable in edit mode. Book's ID is a surrogate key and should be read-only, matching the is_key/uuid detail-field pattern PR #1449 established for Book's own primary key. | |||
| Bulk-regenerate synthetic generators to fix hardcoded r.version = 1 | codegen database postgres bug |
35 remaining generated files still hardcode r.version = 1 instead of 0, causing spurious optimistic-concurrency Version conflict errors on a 3rd write of the same synthetic entity. | |||
| Bundle of agile doc polish: (1) PR references in story/task … | Bundle of agile doc polish: (1) PR references in story/task docs should be hyperlinks not plain text; (2) task lists should be formatted as tables; (3) the manuals index page and site nav link need wiring (PR #818 follow-up). | ||||
| Business unit UI follow-ups | Three UI gaps in business unit: Business Centre field should be a flagged combo (not plain text), list/detail views need badge emblems, and Org Explorer doesn't live-refresh on business unit edits. | ||||
| Cache-bust site asset links at build time | site build css emacs |
Version the stylesheet and asset links the site build emits (e.g. style.css?v=<short-sha>) so returning visitors do not see stale CSS after a restyle. | |||
| Centralise test target boilerplate into a shared CMake macro | Refactor the 65 per-component test CMakeLists into a shared ores_add_test_target() CMake macro in projects/CMakeLists.txt — eliminates the add_custom_target + add_test duplication that has to be updated every time the test runner pattern changes. | ||||
| Change reason not requested on delete | code |
Change reason not requested on delete | |||
| Check change reasons on delete | code |
Check change reasons on delete | |||
| Clarify and enforce system-tenant vs per-tenant dataset publish scope | dq provisioning tenant data-model |
Some DQ datasets are published once to the system tenant, others per-tenant during provisioning, with no documented rule or enforcement for which is correct – already caused one duplication bug. | |||
| Cli clean-ups | code |
Cli clean-ups | |||
| CLI commands — top-level commissioning story | ores.cli codegen refdata |
ores.cli entity commands have no codegen profile and are hand-written per entity. Tackle CLI command commissioning once across entities — establish the pattern, templatize into a codegen facet, roll out — mirroring the shell/HTTP/Wt top-level stories. | |||
| CLI Importing needs to read from database | code |
CLI Importing needs to read from database | |||
| Clicking on connection in status bar should provide info | code |
Clicking on connection in status bar should provide info | |||
| ClientMarketFixingModel truncates series on unfiltered page fetch | marketdata qt bug |
Same failure mode PR #1498 fixed for market observations: fetches an unfiltered limit=10000 page of fixings and filters client-side, so a series' rows get silently truncated once other series' continuous ticks grow the table past the page size. | |||
| codegen –component run generates all entities not just the target | codegen ux sprint_21 |
Running codegen.sh with –component generates all matching entity files across the component, not just the ones in scope; out-of-scope files must be manually deleted after each targeted run. | |||
| Codegen CLI legacy renderer emits empty files for minimal org models | ores.codegen bug dx |
compass codegen generate / codegen.sh route through generate_from_model whose legacy enrichment silently produces empty output for a new-style org entity model that the modern load_model+render_template renders correctly. | |||
| Codegen DX story's entity-filter item is stale; recipe pointed at the wrong command | codegen tooling docs |
Story A083FE26 lists 'no entity-level filter' as an open gap, but compass codegen entity generate <entity> (compass_codegen_entity.py) already does this; a codegen recipe was telling readers to use the component-wide command and hand-discard the diff instead. | |||
| Codegen insert-trigger validations ignore column nullable flag | codegen sql bug refdata |
Insert-trigger validation wiring calls the validation function unconditionally, even for nullable columns, causing null-rejection errors. | |||
| Codegen lacks generic cross-field FK validation and partial unique indexes | codegen sql gap |
No declarative way in an entity .org model to (a) validate a child row's own column matches a value denormalized/looked-up from its parent (only the hardcoded, book-specific party_id_from_book_id facet does this), or (b) declare a partial/conditional unique index (e.g. unique WHERE enabled = true) – both needed by the CRM config entities and surfaced during their service-wiring task. | |||
| Codegen: mustache renders a phantom double blank line when both list_by and list_by_as_of are set on one FK | codegen book_data_model_cleanup |
In the shared repository/service templates, when an FK has both :list_by: true and :list_by_as_of: true (currently only book.parent_portfolio_id), inserting a blank line between {{/list_by}} and {{#list_by_as_of}} (needed to separate the two generated functions) causes the renderer to also emit a phantom extra blank line at the closing {{/list_by_as_of}}{{/foreign_keys}} boundary before the next method – confirmed independent of how the closing tags are laid out (same line vs separate lines). Worked around by normalizing the affected generated files with 'cat -s' post-generation (see PR #1526 review round 3), but the root cause in the templating engine isn't understood. Investigate if a second entity ever sets both flags on the same FK. | |||
| Commission remaining ores.qt components into codegen | Seven ores.qt components (admin, analytics, compute, marketdata, synthetic, trading, workspace) have not been commissioned into codegen. Each needs: entity inventory, codegen model authoring where missing, full-stack codegen run and reconciliation, and migration of per-entity history dialogs to the generic HistoryDialog. This unblocks retiring per-entity history dialogs (Phase C). Distinct from per-component drift resolution: these components may lack models entirely rather than having stale ones. | ||||
| compass add capture should search for related stories/captures first | compass agile tooling |
When scaffolding a new capture, compass should search existing stories/tasks/captures for the same topic and ask the user whether one already covers it, instead of always creating a new file. | |||
| compass add component stamps #+type: component instead of ores.codegen.component | compass codegen bug scaffold |
compass add component's scaffold template stamps #+type: component, but codegen only recognises the long form ores.codegen.component (every existing component_overview.org in the repo uses it) — every fresh component scaffold needs a manual fix until the template is corrected. | |||
| compass capture promote should not force a new branch per promotion | compass capture promote always creates a fresh branch from origin/main, which scatters story and task files across N branches when promoting multiple captures in one session. Should support an in-place mode that scaffolds tasks on the current branch without switching, or batch promotion of multiple captures at once. | ||||
| Compass command to tail and grep service logs | compass ops logging dx |
Add a compass command that tails the last few lines of a service log and greps it for errors. | |||
| compass has 'compass add memory' to create a memory doc, but… | compass has 'compass add memory' to create a memory doc, but no equivalent removal command — retiring an obsolete memory (e.g. one whose advice no longer applies after a feature was removed) requires manually deleting the .org file and editing its index entry out of doc/llm/memory/memory.org by hand. Add a 'compass memory remove <slug-or-id>' command that does both. | ||||
| compass needs to support a help command. currently 'compass … | compass needs to support a help command. currently 'compass help' returns an error. there should be a top-level help subcommand that lists all available commands with a one-line description, and 'compass help <command>' should show the full usage for that command. | ||||
| Compass services restart command | compass ops dx |
Add a compass services restart sub-command that stops then starts the service fleet. | |||
| compass should own backlog index regeneration | compass agile backlog index |
inbox.org/next.org/deferred.org are regenerated by manually invoking projects/ores.codegen/scripts/regenerate_backlog_indexes.py — outside compass, easy to forget after capture/move/promote operations. Either give compass a verb (e.g. compass backlog reindex) or, better, make every compass operation that touches the backlog (add capture, future sprint pull/carry, capture promote) regenerate the indexes automatically as it lands. | |||
| compass show needs a full-content variant | ores.compass dx cli |
compass show only prints metadata/summary/links for a document; there is no flag to dump the full body content, forcing a fallback to the Read tool on the file path. | |||
| compass sprint charts –output-dir is ignored by the gnuplot render step | compass tooling agile charts |
The Python data-prep step honours –output-dir for its CSVs, but every tangled *.gnuplot script hardcodes both its CSV input path and PNG output path to build/output/sprint_NN/ and doc/agile/versions/v0/sprint_NN/, so passing a non-default –output-dir silently renders charts from stale data in the hardcoded location instead. | |||
| compass sprint close: automate carrying unfinished stories to inbox | compass agile sprint closure backlog |
At sprint close, compass should automate the carry: find all stories still in BACKLOG, move story.org to inbox/<story_name>.org (ID preserved, so the sprint table's id-links keep resolving), delete the story folder, and regenerate the backlog indexes. Stories with task files (STARTED/BLOCKED partials) move as whole folders so task history travels. Pairs with capture promote for the pull into the next sprint. | |||
| compass sprint pull: move carried stories from inbox into a sprint | compass agile sprint scaffold backlog |
The sprint-open counterpart to the close-time carry: pull stories back from the product backlog inbox into a sprint by file move (IDs travel), recreating <story>/story.org folders for flat carries, rewriting the previous sprint's id-links and :sprint_N: filetags to the new sprint, and emitting ready-to-paste Stories table rows. Prototyped as a one-off script during the sprint 19→20 transition; source below. | |||
| Component codegen output paths use dotted {component_full}, not the nested regrouped layout | Component-scaffold archetypes use #+output: projects/{component_full}/… where {component_full} is the dotted name (e.g. ores.refdata.api), so codegen writes to projects/ores.refdata.api/ (flat, dotted). But components were regrouped under product-group parents to the NESTED layout projects/ores.refdata/api/ (commit 164255805). So component generation writes to the wrong location. This is pre-existing — facet_catalogue's * Component archetypes already used {component_full}, and the B8 graph migration faithfully copied those paths. Consequence: (1) running component generation creates stray dotted dirs (observed: projects/ores.refdata.{api,core,service}, and pre-existing projects/ores.trading.{api,core}, ores.wt.service may be similar cruft — needs checking); (2) the B8 byte-identical verification compared the nested path and saw no change = false pass for split components. Entities already resolve correctly via the domain_entity branch's component_dir = ores.{component}/{subcomponent} (slash). Fix: make the component branch of resolve_output_path (core.py ~676) derive the nested dir (ores.{name-with-dots-as-slashes}) for split components, then re-verify component generation byte-identical at the nested path and clean any stray dotted dirs. | ||||
| Component overview models are unloadable (bare #+type, missing names) | All 99 component_overview.org models fail get_model_type: they declare bare '#+type: component' but the resolver only accepts the prefixed 'ores.codegen.component' (entities already use ores.codegen.table etc.). 60 of the 99 also lack #+name/#+full_name (use #+title only), so resolve_output_path cannot compute {component_full}. Net effect: component generation is currently broken via both the legacy –profile (now –address) path and the new graph path (confirmed: codegen.sh generate –address ores.cpp.component raises ValueError). Normalisation needed before component archetypes (B8) can generate or be byte-identically verified: (1) #+type -> ores.codegen.component; (2) add #+name/#+full_name where missing (derive from #+title/path); (3) add #+component_kind (flat | api | core | service from the path: /api,/core,/service subdir, else flat) — note non-standard subcomponents (qt/*, http/server, iam/client, compute/wrapper, telemetry/database, etc.) need per-component kind decisions. Discovered during B8 component-archetype migration; the graph+kind engine itself is verified correct against well-formed synthetic models. | |
| Compute repositories should query the system tenant, not the caller's | compute tenancy bug ores.compute |
host_repository.cpp (and likely batch_repository.cpp/workunit_repository.cpp) filter compute-domain reads/writes by ctx.tenant_id() – the caller's own session tenant – even though hosts/batches/workunits are all created under the system tenant, making them invisible to any real tenant session. | |||
| Consider compressing all NATS JSON messages, not just images | nats messaging performance |
Raised while scoping the image-batch payload/compression story: every NATS message in this app goes through rfl::json::write/read (ores.service/messaging/handler_helpers.hpp) uncompressed. Images need special-case handling regardless (raw bytes instead of base64-in-JSON, since round-tripping SVGs through JSON encoding just to decode them again is wasted work), but the broader question of whether to add generic compression to the JSON transport layer for all other messages (large list responses, bulk history payloads, etc.) is separate and worth evaluating independently – likely lower priority since most non-image payloads are far smaller, but worth a look if payload-size complaints recur elsewhere. | |||
| Consider renaming Connection Browser to Connection Manager | qt ui naming connections |
The Qt window (ConnectionBrowserMdiWindow, titled "Connection Browser") actively manages connections (add/edit/delete/organise/secure), which arguably makes "Connection Manager" the more accurate name; the user manual was made consistent with the current code name in the meantime. | |||
| contact_information entities lack a NATS handler — no sub-registrar | codegen nats refdata |
The nats-sub-registrar codegen profile excludes counterparty_contact_information and party_contact_information: both have an api protocol (get/save/delete) but no generated <entity>_handler.hpp in ores.refdata.core/messaging, so a per-entity registrar cannot reference a handler type. They were excluded when generating sub-registrars for refdata entities (Task-ID 818E9AC0-DF64-4480-BB7C-6132D8CA8B0F). Decide whether these aggregates should expose a NATS handler of their own (then generate handler + registrar) or remain managed via their parent party/counterparty handler (then they are intentionally registrar-less). Note: neither carries a history protocol either. | |||
| Convert CODE_OF_CONDUCT.md and CONTRIBUTING.md from Markdown… | Convert CODE_OF_CONDUCT.md and CONTRIBUTING.md from Markdown to org-mode, and link them from the contributing entry point in the docs. | ||||
| Convert three catalogues from bullet lists to tables: skills… | Convert three catalogues from bullet lists to tables: skills catalogue, memory catalogue, and recipes topics — improving scannability and alignment with the table-based style used elsewhere. | ||||
| Counterparty/Party list has no way to find a newly created row | qt refdata ux pagination counterparty party |
The Counterparties (and Parties) list is paginated and ordered by id (a random UUID), so a newly created row lands on an arbitrary page with no search or sort-by-name to find it. | |||
| CPack COMPONENT split: services vs Qt install targets | cmake packaging tech-debt |
Add COMPONENT tags across install(TARGETS) call sites so a services-only package can be produced without bundling ores.qt. | |||
| cpp_enum.hpp.mustache prints 8-bit enum underlying types as … | cpp_enum.hpp.mustache prints 8-bit enum underlying types as raw characters: the stream insert 'os << std::hex << static_cast<{{underlying_type}}>(v)' outputs a char when underlying_type is uint8_t/int8_t instead of a hex number. Fix with unary plus promotion ('<< +static_cast<…>(v)') in the template, regenerate all enum headers, and verify via the codegen zero-diff CI. Raised by Gemini review on PR #1132; declined there because the literate migration must not change template content. | ||||
| Currencies displays when not connected | code |
Currencies displays when not connected | |||
| Currencies: Country relationship | code |
Currencies: Country relationship | |||
| Currency combo boxes should group by classification (major/minor/exotic) | qt ux currency combo |
Currency pickers (base/quote/settlement combos, currency_pair pair_code, etc.) currently sort currencies alphabetically by ISO code; group them by classification (major, minor, exotic) instead, matching how traders actually scan a currency list. | |||
| Currency types: enum, management screen, combo box | ui database domain |
Currency types should be a proper database-backed enum. Add a management screen and tables; use a combo box in the currencies form. | |||
| Current issues with package install in debian | code |
Current issues with package install in debian | |||
| Data in login info looks spurious | code |
Data in login info looks spurious | |||
| Define and regenerate the standard codegen repository method set | codegen refdata repository tech-debt |
Settle the canonical standard repository/table methods the codegen emits per entity, then regenerate all entities uniformly. | |||
| Design standard_service_options as composable opt-in blocks | codegen cpp service-app config |
E3647ADD's standard_service_options assumes nats+database always present; redesigning it as composable opt-in blocks would let ores.wt.service/http.server/cli/shell/compute.wrapper adopt it too, not just the 17 domain services. | |||
| Distinguish service roles from user roles; prevent leakage to tenants | code |
Distinguish service roles from user roles; prevent leakage to tenants | |||
| Do not disable cert verification | code |
Do not disable cert verification | |||
| Do not return sensitive fields | code |
Do not return sensitive fields | |||
| Do not upload Linux/macOS debug build packages as CI artifacts | ci build packaging housekeeping |
CI uploads debug-build .deb/.dmg packages for Linux and macOS as workflow artifacts, but debug packages are very large and not worth the storage/transfer cost. | |||
| Document all valid ORES_* environment variables with their p… | Document all valid ORES_* environment variables with their purpose. Add a script that validates the active env against the schema and errors on unknown variables, so misconfigured environments are caught at init time. | ||||
| Document and enforce canonical IAM context setup patterns | code |
Document and enforce canonical IAM context setup patterns | |||
| Document Contact/Contact Information with contact_type as a subsection | manual refdata contact_type |
Write the Contact/Contact Information manual chapter with contact_type folded in as its valid-values subsection, per the aux-type documentation convention. | |||
| Document history diff and complete its task record | shell history diff documentation |
Document the shell history-diff feature properly (manual/shell docs and recipe narrative) and fill the empty * Result on the Show history as a unified diff in ores.shell task — it closed before the merge-writes-Result convention firmed up. Shipped in PR #1105; server-computed diff via ores.diff, command: currencies history-diff <iso>. | |||
| Document pg_notify rename as breaking change in deployment runbook | sql eventing deployment runbook pg_notify |
The ores_{component}_{entity_plural} channel rename requires SQL triggers and application binary to be updated atomically; a partial deploy silently drops all change events. | |||
| Document the stale Qt help .qch/.qhc cache gotcha in the screenshot recipe | documentation manual qt tooling |
HelpViewer only re-registers the .qch if its namespace isn't already in the co-located .qhc index, and the exe's POST_BUILD copy_if_different only runs on an actual relink, so deploy_help_qch + a full rebuild can silently leave the client serving a stale manual. Document the workaround (copy the .qch by hand, delete the .qhc) in the screenshot-capture recipe. | |||
| Downgrade profile/model-type incompatibility from error to skip in –component mode | codegen ux dx |
Running a profile with –component emits loud ERRORs for entity types that do not support the profile (e.g. table/junction when running the qt profile); they should be silently skipped in –component mode, not treated as errors. | |||
| Drop controller_service_* tables, move service registry to codegen model | controller systemd codegen tech-debt sql |
The decommissioned ores.controller left behind ores_controller_service_definitions_tbl/dependencies_tbl, now used only as the DB-backed data source for systemd unit generation; this static data belongs in a codegen model, not a runtime table. | |||
| Drop database roles before recreating the database | database infrastructure |
recreate_database.sh does not drop roles before re-creating the database. Add role-drop logic to ensure a clean slate. | |||
| Drop dead ores_controller_service_instances_tbl/events_tbl | controller systemd tech-debt sql |
Two controller-era tables (service instances, service events) have no remaining readers/writers now that systemd owns process lifecycle – confirmed by full-repo grep during the controller-decommission DB audit. | |||
| Enforce component-level #include paths everywhere | codestyle cmake cleanup |
Some source files use relative includes (e.g. "process_factory.hpp") instead of the component-level form ("ores.component/path/file.hpp"); audit and fix, and consider a lint/CI check to prevent regressions. | |||
| Enforce optimistic concurrency version checks at the DB layer (remove the version=0 bypass) | database versioning concurrency codegen architecture |
Replace the undocumented version=0 'skip the check' sentinel in every codegen'd entity's insert trigger with an explicit, separate force/upsert signal, so a genuine duplicate-key create is rejected at the DB layer for every client, not just caught by a per-entity Qt-side pre-check. | |||
| Enforce process parameter validation at save/feed-start time | synthetic validation backlog |
validate_process_parameters exists but isn't called by gmm_component_handler::save or feed_controller::start, so bad configs can still be persisted or crash a feed thread. | |||
| Enforce single canonical entry point for authenticated IAM handlers | code |
Enforce single canonical entry point for authenticated IAM handlers | |||
| Ensure applications work under OSX using github images | code |
Ensure applications work under OSX using github images | |||
| Ensure DQ dataset checks use code | code |
Ensure DQ dataset checks use code | |||
| Entity-org scaffold should pre-populate codegen knobs | ores.codegen dx scaffolding |
compass add entity_org should generate a model with the basic variability knobs already present/enabled so a fresh entity generates code instead of rendering empty files. | |||
| Extend Qt codegen for compound primary keys | codegen qt dq compound-key |
The Qt codegen layer (controller, MDI window, client model, detail dialog templates) assumes a single-column primary key end-to-end and cannot yet generate a working controller for a compound-key entity such as subject_area. | |||
| Extend validate_docs.sh to check org frontmatter | tooling validation codegen |
validate_docs.sh only checks component structure; extend it to validate frontmatter fields (:ID:, #+type:, #+description:, etc.) across all org files. | |||
| External data issues | code |
External data issues | |||
| Extract a sync sibling of run_host_async for ores.cli/ores.shell | codegen cpp service-app cli shell |
ores.cli and ores.shell's host.cpp bodies share ~70% structure with each other (parse/init-logging/log/try-construct-run/catch-diagnostic) despite being correctly excluded from the async run_host_async helper; a construction-callable-parameterised sync sibling could close that remaining gap. | |||
| Fast, minimal synthetic dataset for test-tenant provisioning | testing performance iam database |
Give test-tenant provisioning a lightweight fixture path so DB-backed test suites don't pay the full production-like refdata copy cost. | |||
| Fix account registration NATS SSL error | bug client nats registration tls |
Registering a new account fails with 'Account creation failed: NATS connect failed: SSL Error'. The client cannot complete registration against the backend; investigate and fix the NATS/TLS configuration on the registration path. | |||
| Fix badge severity combo box duplicates and non-badge rendering | qt dq badges ui |
Badge Definition detail dialog's Severity combo box shows duplicate entries and doesn't render items as badges, noticed during live QA of a tenant with both system-tenant and its own bundle-published badge_severity rows. | |||
| Fix batch currency generation UX and audit-field leakage | qt currency generator ux |
CurrencyMdiWindow's batch Generate adds N unsaved synthetic currencies to the list requiring one save-click per row, and populates audit fields that shouldn't be set until save. | |||
| Fix bootstrapping wizard cancellation leaving system in bad state | bootstrap wizard ux resilience |
Cancelling bootstrapping wizards mid-way leaves the system believing bootstrapping is complete, with no recovery path short of recreating the database. Investigate and implement a sensible cancellation/recovery model. | |||
| Fix ClientXModel::fetch_* pagination no-op (offset/limit never applied to request) | Systemic bug across essentially all ClientXModel::fetch_* implementations in ores.qt (e.g. ClientPartyStatusModel, ClientBadgeSeverityModel, ClientTenantModel): fetch_* constructs the get_X_request without copying its own offset/limit parameters into request.offset/request.limit, so load_page() always re-fetches the default first page. Found while reviewing PR #1443. Likely a shared codegen template gap in cpp_qt_client_model.cpp.mustache; needs a template fix plus a regen sweep across all synced entities. | ||||
| Fix instruments not visible in UI | bug instruments ore qt |
Instruments cannot be seen in the UI. Investigate whether they are being imported and surfaced correctly; fix the import or display path. | |||
| Fix missing history-window close button wiring in 7 controllers | ores.qt qt-ui bug codegen |
Apply the connect_dialog_close fix from PR #1462 to the other 7 Qt controllers whose showHistoryWindow() is missing the same wiring. | |||
| Fix notification toast blocking FX chart Y-axis area | ores.qt mktdata synthetic charts |
The 'Started N feed(s)' toast from MarketSimulatorWindow renders over the bottom-right corner of charts, permanently obscuring axis labels. | |||
| Fix orphaned child service processes after compass services stop | compass devops reliability |
compass services stop only reliably kills the top-level controller and nats-server; child services it spawned can survive as orphans, competing with freshly-started replacements on the same NATS queue groups. | |||
| Fix PostgreSQL long-identifier truncation warnings | database code |
Several index names exceed PostgreSQL's NAMEDATALEN limit and are silently truncated (dq_lei_relationships_artefact, refdata_party_contact_informations, etc.). Shorten the names. | |||
| Fix repo-wide component_overview.org drift | codegen docs tech_debt |
validate_docs.sh reports ~30 components missing #+type: component, required sections, or a modeling/*.puml diagram; two components are missing component_overview.org entirely. | |||
| Fix security bug with shell | code |
Fix security bug with shell | |||
| Fix skill scaffold template missing #+type and empty #+filetags | codegen compass skills documentation |
The doc_skill.org.mustache template never emits #+type/#+level/#+description at the org level and renders #+filetags empty, so compass show reports Type: (none) for 44 of 75 shipped skills. | |||
| Fix suspicious signup handler using raw ctx_ without tenant context | code |
Fix suspicious signup handler using raw ctx_ without tenant context | |||
| Fix trading_trade_party_roles pg_notify channel name | sql trading eventing pg_notify |
trading_trade_party_roles_notify_trigger_create.sql uses channel ores_trading_party_roles (missing trade_ segment), breaking the ores_{component}_{entity_plural} convention. | |||
| Fix validate_docs.sh warnings and enforce it in CI | documentation ci codegen component |
Clear the 63 existing component-documentation warnings from projects/ores.codegen/validate_docs.sh and add it as an enforced CI check, mirroring how validate_schemas.sh already fails CI on warnings. | |||
| Fix window-key separator mismatch in Workspace/SystemSetting controllers | qt bug eventing |
startsWith("details:")/("history:") checks never match build_window_key()'s dot-separated keys, silently disabling dialog staleness-propagation on NATS notifications. | |||
| FX Spot chart doesn't refresh on feed binding change | marketdata synthetic ux qt |
FX Spot chart window resolves feed bindings only once at open time, so it shows nothing and never updates if opened before a pair's binding exists, with no stale-data indicator to the user. | |||
| Gate unordered_set include in the generator template on actual need | codegen templates cleanup |
cpp_domain_type_generator.cpp.mustache unconditionally includes <unordered_set>, but only entities with a hand-added bulk-unique-generator addendum (e.g. currency's generate_unique_synthetic_currencies) actually use it — every other generated *_generator.cpp carries an unused include (confirmed on country, plus 2 other already-regenerated entities). Compute a needs_unordered_set flag and gate the include. | |||
| Generalize SQL include-reachability validation beyond RLS | sql codegen validation |
validate_schemas.sh's RLS_003 check (is a rls_policies_create.sql file reachable via \ir from rls/rls_create.sql?) should be generalized to all *_create.sql/*_drop.sql/*_notify_trigger.sql files under create/ and drop/, not just RLS policy files – it would have caught rounding_type's missing notify-trigger include. | |||
| Generate messaging registrars via codegen | codegen messaging nats registrar |
All 20 hand-written per-component NATS messaging registrars are boilerplate-heavy, inconsistent, and drift as entities are added; generate them from the entity/protocol models instead. | |||
| Generated detail dialogs disable Save silently instead of showing validation errors | qt codegen ux validation |
Detail dialogs (e.g. PartyDetailDialog) disable the Save button when required fields are empty, but give no visible reason why – clicking a disabled button does nothing, reading as broken rather than blocked. Should either always enable Save and show a specific 'X is required' message on click, or add a tooltip/inline hint on the disabled state. | |||
| Geo-location tests fail for some IP Addresses | code |
Geo-location tests fail for some IP Addresses | |||
| Header-comment drift in renamed synthetic populate SQL scripts | Header-comment drift in renamed synthetic populate SQL scripts: several top-of-file header comments still say the dataset registered/looked up is synthetic.fx_spot_configs.X / synthetic.ir_curve_configs.X, but since the theme-unit merge (PR #1727) it's actually synthetic.themes.X. Cosmetic only (comment text, not functional), explicitly deferred as a follow-up during PR #1727 review (finding 3). Known locations: synthetic_fx_spot_configs_ore_samples_2016_populate.sql:24; synthetic_ir_curve_configs_uniform_demo_populate.sql:24,26,44,119,129; synthetic_ir_curve_configs_realistic_2026_populate.sql:62. | ||||
| History dialogs do not remember their size and position betw… | History dialogs do not remember their size and position between opens. Implement geometry persistence for all history dialogs using QSettings, consistent with other dialogs in the application. | ||||
| History field mapper codegen emits a raw date value where a … | History field mapper codegen emits a raw date value where a string is expected: regenerating calendar_exception (which has an exception_date column of type date) produces presentation/calendar_exception_history_field_mapper.cpp with fields.push_back({.name = …, .value = v.exception_date}), but domain::calendar_exception::exception_date is a std::chrono::year_month_day (per the entity/mapper templates' recent date-handling migration – see calendar_exception_mapper.cpp's std::format/istringstream parsing) while field_value::value is a std::string – a hard compile error (no matching push_back overload). The ores.cpp.presentation history_field_mapper template's is_date handling needs to render the value through a string conversion (e.g. std::format) like the mapper templates now do. Found while regenerating refdata entities for the fix-refdata-model-drift task (A2EDDEDC-D5D3-469D-88C9-7CE00951CC72); calendar_exception is excluded from that task's regeneration until this is fixed. Any other domain_entity with a date-typed column would hit the same break on regen. | ||||
| HTTP entity endpoints — top-level commissioning story | ores.http codegen refdata auth |
Lift HTTP endpoint commissioning out of per-entity commission-story tasks into a top-level HTTP story with per-component tasks; modernize the auth layer and bring HTTP generation under codegen. | |||
| Illustrative org-roam links in doc bodies break the site build | documentation org_roam ci site_build |
Org document prose that uses placeholder link syntax (e.g. id:… in double-brackets) as an illustrative example causes the site builder to attempt link resolution, failing with 'Unable to resolve link'. The fix is verbatim markup; the harder fix is making the exporter tolerate unresolvable links. | |||
| Implement allowed-currency/allowed-product-type lists for book | refdata book junction |
Add junction tables restricting which currencies/product types may be booked into a book, once the 'All' wildcard semantics and Qt multi-select widget shape are decided. | |||
| Implement IMM_ROLL tenor resolution for credit/CDS conventions | marketdata tenor cds imm resolver |
The tenor_convention.resolution_algorithm=IMM_ROLL branch and CREDIT_CDS_IMM convention are modeled and seeded, but resolve_end_date() throws std::logic_error for it – the actual roll-schedule stepping algorithm, and the CDS tenor_convention_resolution rows (roll-quarter counts per nominal tenor), are not implemented. | |||
| Implement missing equity instrument types | code trades equity |
Not yet implemented: Equity_Margin_Trade_TRS_on_EquityIndexFuture, Equity_OutperformanceOption, Equity_Swap_Indexed_Funding_Leg (complex indexed leg). | |||
| Implement missing FX instrument types | code trades fx |
Not yet implemented: FX_Swap, FX_KIKO_Barrier_Option, Exotic_FxGenericBarrierOption, FX_WorstOfBasketSwap, Exotic_FXWorstOfBasketSwap. | |||
| Implement paired risk-book link for Wash-purpose books | refdata book wash |
Add nullable self-referencing book.paired_risk_book_id FK, plus conditional validation (settable only when book_purpose_type = Wash) and Qt UI conditional-enable support, neither of which has existing precedent in the codebase. | |||
| Improve error message when server is not running | code |
Improve error message when server is not running | |||
| Improve handling of error responses | code |
Improve handling of error responses | |||
| Improve icon for methodology and dimensions | code |
Improve icon for methodology and dimensions | |||
| Improve session management and server-side housekeeping | code |
Improve session management and server-side housekeeping | |||
| Improve tag support | code |
Improve tag support | |||
| Improve tenant deletion safety and cascading | code |
Improve tenant deletion safety and cascading | |||
| Improvements to detail dialogs | code |
Improvements to detail dialogs | |||
| Install OSX package on OSX machine | infra |
Install OSX package on OSX machine | |||
| Instrument components with telemetry context | code |
Instrument components with telemetry context | |||
| Invalid password should not throw | code |
Invalid password should not throw | |||
| Issues with event viewer | code |
Issues with event viewer | |||
| Librarian errors | code |
Librarian errors | |||
| Light system theme results in mix of dark and light | code |
Light system theme results in mix of dark and light | |||
| Listen for events in details dialog | code |
Listen for events in details dialog | |||
| Listener error in comms service | code |
Listener error in comms service | |||
| Load org-babel and systematically test all recipe types in u… | Load org-babel and systematically test all recipe types in use: SQL, CLI, shell, and HTTP. Verify each type executes correctly with the current .env settings. | ||||
| Lock down data librarian for production tenants | code |
Lock down data librarian for production tenants | |||
| Locking an account should log user out | code |
Locking an account should log user out | |||
| Log file location for Qt application is non-standard on Linux | code |
Log file location for Qt application is non-standard on Linux | |||
| lookup_entity codegen path can't generate DQ artefact tables | codegen dq gap |
The ores.codegen.lookup_entity model type routes to no template mappings in the current address/facet system, so its artefact-table facet is dead code. | |||
| lookup_entity codegen tables never get an RLS policy | codegen sql rls security lookup_entity |
Every ores.codegen.entity table gets tenant_id + an RLS policy, but the lookup_entity archetype (code/name lookup tables) never emits one – 11 of 11 lookup tables checked are missing it. | |||
| Make bootstrap operation atomic using SQL transactions | code |
Make bootstrap operation atomic using SQL transactions | |||
| Market Simulator: scope folders to current party, clarify feed-start UX | ores.qt synthetic market-simulator ux iam |
Market Simulator window shows every party's Synthetic folder tree unfiltered, and feed-start failures (missing vintage data) are silently skipped with no UI feedback. | |||
| Merge regenerate_backlog_indexes into compass | ores_compass ores_codegen backlog refactor |
Move regenerate_backlog_indexes.py from ores.codegen into ores.compass and expose it as a compass subcommand, so all backlog operations live in one place. | |||
| Merge release notes collector script into compass | compass release notes consolidation |
build/scripts/collect_release_pr_data.py gathers merged-PR data (with reviewer-bot overviews) for release notes generation. Fold it into compass — likely a Generate or PR pillar verb (e.g. compass pr collect or compass sprint release-data) — delete the script, and update the release-notes recipe and developer scripts inventory. | |||
| Methodology screen review | code |
Methodology screen review | |||
| Migrate ores.refdata generators to change_reason_constants.hpp | refdata codegen tech-debt generators |
Replace hardcoded change-reason-code string literals across ~30 remaining ores.refdata generator files with the shared ores.dq.api change_reason_constants.hpp constants. | |||
| Migrate remaining entities off the legacy Primary key/Natural keys heading shape | codegen dq tech-debt |
About 59 of 120 ores.codegen.entity models still declare primary/natural keys via the legacy top-level headings, which the current org_loader.py no longer reads at all – regenerating any of them fails validation (Missing primary key). | |||
| Migrate remaining lookup_entity/table models to unified Columns key shape | codegen tooling migration |
~75 lookup_entity/table-shaped models outside ores.refdata (dq, iam, trading, analytics, etc.) still use the old * Primary key/* Natural keys sections; story 36A25C95 (Unify entity key modeling, closed) rewrote org_loader.py's parser but explicitly deferred migrating these models. | |||
| Migrate remaining refdata entities to generated event-mapping registrar | codegen eventing refdata |
Resolve nats-eventing drift for 10 refdata entities so their live-eventing wiring can move from hand-wired application.cpp to the generated per-entity event registrar. | |||
| Migrate remaining ~100 entity models from JSON to org | codegen org_mode literate |
Complete the org-migration story: convert the remaining legacy JSON-format entity models to the literate .org entity-model format. | |||
| Missing session properties | code |
Missing session properties | |||
| Modernise subject_area and dataset_bundle repositories to th… | Modernise subject_area and dataset_bundle repositories to the current domain_entity codegen template (both are on a legacy ctx_-member interface predating the current per-call-ctx convention, and were never actually regenerated when their .org models were authored). Discovered while fixing the Data Librarian tree regression: regenerating them via 'compass codegen regenerate –component dq –address ores.cpp.repository' to apply the new tenant_read_scope: shared flag changed their public interface (constructor, method signatures), a bigger blast radius than that bug fix warranted, so it was deferred here. Also mark them tenant_read_scope: shared explicitly once regenerated (their current behaviour already relies on RLS alone and is correct, just not yet expressed via the new codegen property). | ||||
| Move compass sql under the db command | compass cli devx |
compass sql is a top-level alias for compass db sql, inconsistent with every other pillar where related operations nest under one subcommand (e.g. compass db {status,recreate,sql,…}). | |||
| Move list-window loading bar to a slim always-visible footer strip | qt ui refdata ux |
Reposition EntityListMdiWindow's loading indicator from a shown/hidden bar above the table to a thin progress strip fixed at the bottom of the window, always present rather than appearing/disappearing. | |||
| Move Portfolio's Qt CRUD UI from ores.qt/trading to ores.qt/refdata | qt refdata trading portfolio consistency |
Portfolio's backend already lives in ores.refdata, and Book/BookStatus's Qt UI already lives under ores.qt/refdata to match – but Portfolio's own CRUD Qt files (detail/history/MDI/controller/client model) are still under ores.qt/trading, inconsistent with its own backend and with the Book precedent. | |||
| Multi-select LEI picker for PartyProvisionPage | code |
Multi-select LEI picker for PartyProvisionPage | |||
| NATS-based health for all services: HTTP, WT and compute wrapper | code |
NATS-based health for all services: HTTP, WT and compute wrapper | |||
| New feature flags | code |
New feature flags | |||
| New lookup entity: two undocumented manual wiring steps (NATS handler registrar, tenant-provisioning copy block) | codegen book_data_model_cleanup |
Adding a new codegen'd lookup entity (e.g. book_purpose_type) requires two hand-edits the codegen workflow doesn't cover or document: (1) registering the generated NATS CRUD handlers in projects/ores.refdata/core/src/messaging/registrar.cpp (only the eventing registrar, event_registrar.cpp, gets proactively wired – the request/response handler registrar is a separate hand-maintained dispatch list); (2) adding a copy block to projects/ores.sql/create/iam/iam_tenant_provisioner_create.sql so the new entity's system-tenant seed rows get copied into newly (or already-)provisioned tenants, matching book_statuses/regulatory_book_types/purpose_types. Both gaps were silent – no build/test failure, only a runtime 'Failed to fetch … from server' (gap 1) or an empty list for a real tenant (gap 2), caught only via manual QA. Codify as codegen steps or document explicitly in the entity-creation runbook (codegen-add-entity skill / entity_lifecycle.md). | |||
| No cycle guard in hierarchy CTEs and build_tree() | hierarchy codegen sql party counterparty robustness |
PR #1450's review (4 independent Claude runs) consistently flagged: the recursive hierarchy CTEs (party/counterparty *_hierarchy_fn, and the codegen twin in sql_schema_domain_entity_create.mustache) and ores::utility::domain::build_tree() have no cycle guard. A parent_id cycle (A's parent is B, B's parent is A, no external root) would either spin the recursive CTE until Postgres's safety net kicks in, or silently drop both nodes from build_tree()'s output forest (neither qualifies as a root). Low severity given DB-level one-root-per-tenant conventions constrain real data, but worth a defensive fix (cycle detection in the CTE, and detecting unreached ids in build_tree to promote them to extra roots like the existing orphan-handling guarantee) plus a test case in domain_hierarchy_tests.cpp. | |||
| No samples in sessions | code |
No samples in sessions | |||
| No test exercises compound-key batch read/remove cross-product filtering | cpp_domain_type_repository.cpp.mustache's over-fetch plus std::set of std::tuple filter logic for compound-key batch reads/removes is the most intricate new code from PR #1691, but repository_subject_area_repository_tests.cpp only covers the single-row compound-key case. Add a test with two or more subject areas sharing one key-column value across different domains, so the cross-product candidates actually need filtering. | ||||
| Notify clients of database connection errors | code |
Notify clients of database connection errors | |||
| Now that change_reason/change_reason_category/badge_severity… | Now that change_reason/change_reason_category/badge_severity/badge_definition repositories correctly rely on RLS alone for reads (tenant_read_scope: shared, fixed alongside the Data Librarian tree regression), their tenant-provisioning copy-block entries in iam_tenant_provisioner_create.sql (which duplicate system-tenant seed rows into every new tenant) are redundant – harmless, but worth removing for consistency with catalog/data_domain/subject_area/dataset_bundle, which are never copied and rely on RLS fallback alone. | ||||
| Only rescan modified files for org-id location updates | devops site performance emacs |
Site build rescans every .org file for org-id-update-id-locations on every run instead of only files changed since the last build. | |||
| ores.compass Product Backlog — next and deferred listing | backlog compass python tooling |
Add compass commands to list next and deferred product-backlog captures, mirroring the sprint-backlog listing in compass where. | |||
| ores.controller.service crashes with corrupted UTF-8 byte after launching a service | controller bug memory-safety blocker |
ores.controller.service dies shortly after starting a supervised service (observed with ores.wt.service) with a non-deterministic invalid-UTF8-byte error (0x99, then 0x8f on a second run) in the SET app.current_service context query at service_instance_repository::update_phase(); looks like memory corruption, not a data issue. | |||
| Org Explorer tree nodes don't respond to double-click | qt trading ux org_explorer |
OrgExplorerMdiWindow wires doubleClicked only on the trade table, not the org tree view; business unit/book nodes have no double-click-to-edit, only an explicit toolbar/context action. | |||
| Package SQL scripts | code |
Package SQL scripts | |||
| Parameterize raw SQL in the synthetic organisation publisher | synthetic database security |
organisation_publisher_service.cpp concatenates internally-generated UUIDs directly into SQL (set_party_context call, BU-type dedup query) instead of parameterizing. Risk is low — values are generated UUIDs, not user input — and the pattern is a pre-existing codebase convention, but it should be hardened in a cleanup pass. Flagged by review on PR #1163. | |||
| Party wizard UX improvements | code |
Party wizard UX improvements | |||
| Party's per-party report_events pgmq queue looks half-baked / unused | refdata party codegen pgmq |
party's insert trigger provisions a per-party pgmq queue (report_events) on every new party, but no consumer/dequeue code anywhere reads from it. | |||
| Party/counterparty grid ignores transliterated_name for non-Latin full_name | qt refdata party counterparty i18n |
Parties/counterparties with a non-Latin full_name (e.g. CJK) render as tofu boxes when the required glyphs aren't installed; the transliterated_name column exists precisely for this but the list/detail views never fall back to it. | |||
| Perform tests to check database connectivity | code |
Perform tests to check database connectivity | |||
| Persist per-tag colour and add a tag create/edit dialog | ores.qt connections tags ui |
Store a colour per connection tag in the DB and provide a dialog to create/edit tags with a colour picker, instead of hashing the tag name into a fixed palette at render time. | |||
| populateDynamicCombo cannot distinguish never-selected from blank-selected | qt dynamiccombo party counterparty |
previous_selection is empty both when nothing has been selected yet and when the user deliberately picked the blank/No-Parent item, so a future repopulate could silently revert an in-progress No Parent choice back to the last-saved parent. | |||
| Portfolio explorer toggle to show/hide business-unit nodes | ui domain database |
The portfolio explorer tree mixes books, portfolios, and business units with no way to toggle business-unit nodes on/off. | |||
| Portfolio window/history dialog does not live-refresh on NATS events | qt portfolio bug eventing |
Manual QA on the Portfolio/Book composite-versioning scenario found Portfolio's own list/history windows don't live-update when a book change bumps the portfolio's version (or possibly on other portfolio-changed events in general – unclear if pre-existing). Correct data is only visible after a manual reload. Portfolio's Qt layer is still unmigrated to RefdataPlugin (separate scope); worth re-checking once that relocation lands, since it may be the same class of gap as Book's own event-registrar wiring was. | |||
| Positions domain model | code |
Positions domain model | |||
| Problems with session charts | code |
Problems with session charts | |||
| Promote cross-tenant read to a codegen flag | codegen repository marketdata refactor |
read_latest_all_tenants is a generic pattern — promote it to a generated optional via a flag in the entity org model. | |||
| Promote recurring custom repository methods to template variability flags | Five methods appear across 3-5 entities as F2EB1914 paste blocks instead of template output: read_latest(offset, limit), get_total_*_count(), read_at_timepoint(as_of), read_at_timepoint(as_of, pk), read_all() (no-filter). A sixth — batch remove — already has has_batch_remove but is inconsistently used (party uses the flag; country/currency/business_centre use paste blocks). Proposed flags: has_pagination (read_latest + count), has_timepoint_reads (both read_at_timepoint overloads), has_unfiltered_read_all, has_batch_remove (already exists). Each flag bakes in the tenant_id pattern so entity authors cannot forget it. Affected entities: country, currency, business_centre, counterparty, party. Raised during DFD25563 (country codegen sync). | ||||
| publish_from_dq codegen facet: hand-writing artefact tables is a recurring cost | The publish_from_dq codegen facet (generate the DQ artefact table, publish-from-dq SQL function, NATS handler, registrar wiring from an entity's codegen model) was designed then abandoned. Every DQ-published dataset since (currency_pairs, synthetic fx_spot_configs, and now the FX driver-rate dataset) has had to hand-write its artefact table + publish function from scratch, each a near-identical shape. Revisit implementing the facet — the design task's own worked-example approach (regenerate report_definitions with zero behavioural diff) is still sound, there's now three real hand-written instances to generalise from instead of one. | ||||
| QA Validation Runner follow-ups | Four follow-up improvements for the QA Validation Runner: auto-crop screenshots to active window, keyboard-shortcut-armed delayed screenshot for combo/popup capture, warn on unsaved changes when closing the client, and surface multi-client step colour ownership. | ||||
| Qt codegen: introduce to_display_key() helper to unify UUID/string key display | codegen qt uuid refactor |
Qt codegen currently handles UUID vs string key field display via mustache prefix/suffix variables injected by core.py (key_to_string_prefix / key_to_string_suffix). This works but is fragile. When a second UUID-keyed entity goes through codegen, introduce a small free function ores::qt::to_display_key() with overloads for boost::uuids::uuid (calls boost::uuids::to_string) and std::string (identity). Replace the prefix/suffix template pattern with a single {{to_display_key(item.field)}} call. Do not introduce this until the pattern is confirmed stable across at least two UUID-keyed entities. | |||
| Raise events for account profile updates | code |
Raise events for account profile updates | |||
| Re-shoot manual screenshots showing Barclays as Acme Corporation | documentation manual screenshots acme_corporation |
Five manual chapters (Tenants, Accounts and Roles, Connecting, Parties, Counterparties) have real UI screenshots captured against the old Barclays Plc demo tenant; re-shoot them against Acme Corporation now that it is the system's reference entity, and update the tied prose/captions to match. | |||
| Rebuild org-roam DB independently from CMake | build cmake elisp org-roam |
Extract org-roam DB sync into .build-org-roam.el and add a standalone cmake target so the DB can be rebuilt without a full site build. | |||
| Recapture party/counterparty parent-combo screenshots showing No Parent | docs manual qt party counterparty screenshot |
party_parent_party_combo.png and counterparty_parent_counterparty_combo.png both predate the No Parent combo fix and don't show the new leading entry; both chapters flag them inline as outdated. | |||
| Recipe: how do I build the site locally? | Add a how-do-I-build-the-site-locally recipe mirroring the serve recipe; cross-reference both so readers find the full build-then-serve workflow. | ||||
| Reconcile dynamic_combo detail-dialog codegen drift | codegen qt drift tech-debt |
Several entities' detail dialogs (e.g. currency) have drifted from the current async-lookup-combo template: setCurrentText() vs findData()/setCurrentIndex(), missing loading/error placeholder text. | |||
| Reconcile SQL codegen template drift on synthetic validation fn | codegen sql synthetic drift |
Regenerating the fx_spot_generation_config SQL layer drops the tracked system-tenant fallback logic from its validation function, indicating the template has drifted from the checked-in output. | |||
| Refactor trading reference type boilerplate into shared templates | code |
Refactor trading reference type boilerplate into shared templates | |||
| Regenerate deposit/zero convention tables for bool table-display fix | codegen refdata tech-debt |
deposit_convention_table.cpp and zero_convention_table.cpp still stream raw bools into fort::char_table as 0/1, unlike book_table.cpp which was regenerated with the fixed template. | |||
| Regenerate party_currency/party_country junction repository layer | codegen refdata junction drift |
Now that junction codegen works end-to-end (tenor_convention_resolution story), regenerate party_currency/party_country's entity/mapper/repository files to converge on generated code, matching what was just done for tenor_convention_resolution. | |||
| Register missing refdata *_changed_event types for NATS eventing | ores.refdata.service eventing nats bug |
Several ores.refdata *_changed_event types aren't registered/subscribed in application.cpp, so their changes don't propagate cross-session; contact_type and party_id_scheme have Qt history windows and likely share the same gap just fixed for party_status. | |||
| Regression test for zero-volatility GMM component | ores.synthetic testing regression |
Add a unit test asserting a sigma=0 GMM component draws the mean and does not abort, covering the SIGABRT fix. | |||
| Release notes Sprint duration uses carried-over story dates | compass release_notes tooling bug |
generate_release_notes.py computes Sprint duration as min/max of every story's Start/End, including carried-over stories from earlier sprints, producing a nonsensical date range. | |||
| Reload Qt client caches after tenant provisioning completes | ores.qt caching provisioning bug |
When a tenant is provisioned mid-session (bootstrap mode exits without a fresh login), the Qt client's currency/country/image caches stay empty until the user manually logs out and back in. | |||
| Remove bootstrap guards from validation functions | code |
Remove bootstrap guards from validation functions | |||
| Remove legacy pgmq extension residue from ores.compute | compute sql cleanup legacy |
Remove the unused pgmq PostgreSQL extension residue: conditional grant block in create_database.sql and pgmq_msg_id field threaded through ores.compute. | |||
| Remove uses of raw libpq | code |
Remove uses of raw libpq | |||
| Rename _protocol.hpp messaging files for the NATS world | codegen messaging naming nats |
The _protocol.hpp suffix is a leftover from the old binary-protocol era; reconsider the naming (drop the postfix or make it meaningful) now that messaging is NATS request/response structs. | |||
| Rename purpose_type to portfolio_purpose_type | refdata ux naming |
The purpose_type entity/menu label is confusingly similar to the unrelated book_purpose_type; rename to portfolio_purpose_type for clarity. | |||
| Rename request contexts to reflect their scope (tenant_ctx, etc.) | code |
Rename request contexts to reflect their scope (tenant_ctx, etc.) | |||
| Rename the Knowledge Graph menu item to Knowledge, remove th… | Rename the Knowledge Graph menu item to Knowledge, remove the graph viewer from the nav, and add a section within the Knowledge page explaining the org-roam graph and how to use it. | ||||
| Rename the modeling/ directory to docs/ in all components. T… | Rename the modeling/ directory to docs/ in all components. The name 'modeling' misleads contributors into thinking it is UML-only. | ||||
| Replace hardcoded timestamp sentinels with MAX/MIN_TIMESTAMP constexprs | database codegen time cleanup |
137 entity headers and the codegen template hardcode '9999-12-31 23:59:59' as the valid_from/valid_to default. Move MAX_TIMESTAMP from helpers.hpp to db_types.hpp, add a MIN_TIMESTAMP counterpart, and switch the template plus all entities to use them. | |||
| Replace log-grep HEALTHCHECK with an in-process NATS health endpoint | docker healthcheck nats architecture |
The per-service HEALTHCHECK (docker/healthcheck.c) proves the container-native probe model but works by grepping the service's own log file from outside the process – fragile and duplicative of state the process already has. Every service is already a NATS client, so a request/reply ping subject (or a tiny local socket) each service answers directly would be a more robust, less coupled health signal. | |||
| Replace optional JWT verifier with explicit modes | code security api |
The JWT verifier is currently optional<jwt_authenticator>. Replace with an enum mode (allow_all / strict) for clarity and safety. | |||
| Replace parent combo boxes with server-side type-ahead search | code |
Replace parent combo boxes with server-side type-ahead search | |||
| Replace parent entity combo box with server-side searchable widget | code |
Replace parent entity combo box with server-side searchable widget | |||
| Restore list windows after login | code |
Restore list windows after login | |||
| Rethink is_sweepable as a sweep-type enum, not a boolean | book currency sweep data-model |
Each sweep type (spot sweep, ledger sweep, future types) needs its own configuration, so a single is_sweepable boolean can't express which sweep(s) a book participates in; likely needs a sweep-type enum with a none/unsweepable sentinel. | |||
| Review pricing engine type tenant vs party design | code design analytics |
PricingEngineType has a tenant but no party. Review whether a party FK is needed and whether defaulting tenant to system() is correct or if a well-known invalid tenant should be required. | |||
| Root-cause ores.wt.service's intermittent glibc pthread crash | controller wt glibc crash tech-debt |
ores.wt.service was disabled by default (hotfix, PR #1592) after its Wt httpd crashed intermittently on startup with a fatal glibc pthread-priority-protect assertion. Needs a debugger session to find the exact call site inside Wt/Boost's compiled internals and either fix it or work around it properly, then re-enable the service. | |||
| Sanitize Catch2 test names used as log filenames | testing logging tech-debt |
logging_listener.cpp uses the raw Catch2 test-case name directly as a log filename; a name containing a mid-sentence period (e.g. an abbreviation) gets misparsed as a filename+extension split, producing an invalid/oversized path and crashing the test binary with a boost::filesystem_error. | |||
| sccache daemon inherits vcpkg lock fd from cmake | cmake vcpkg sccache build |
sccache server started by cmake inherits the vcpkg-running.lock file descriptor, blocking subsequent cmake –preset runs until sccache –stop-server is called. | |||
| sccache's cache is on GitHub's built-in actions/cache, cappe… | sccache's cache is on GitHub's built-in actions/cache, capped at a fixed, non-purchasable 10 GB per repository shared across every OS/compiler/buildtype variant (linux-gcc/clang, windows-clang, macos-clang x debug/release) plus vcpkg/Qt caches. Confirmed via live experiment (sprint 22, story canary_ctest_ignores_cancellation): a PR with essentially zero source diff got a 0.00% sccache hit rate because the Linux-gcc-debug cache had been evicted entirely by GitHub's LRU policy to make room for other platforms' caches touched more recently by continuous-*.yml runs. Recommended fix: move sccache to an external cache backend it natively supports (S3/GCS/Azure Blob, or a self-hosted Redis/webdav endpoint) so the cache is bounded by provisioned storage, not GitHub's shared 10GB quota, and isn't subject to cross-platform eviction or the 7-day-unused cleanup. Needs bucket/credentials/IAM setup and workflow changes across every platform's workflow file (canary-linux.yml, continuous-linux.yml, continuous-macos.yml, continuous-windows.yml) — a real infra project, not a quick fix. | ||||
| Script the project version bump for sprint opening | compass build version sprint scaffold |
The five-file version bump (CMakeLists.txt project VERSION, vcpkg.json version-string, three workflow package filenames, readme sprint badge + commits-since badge) is done by hand each sprint from the recipe. Fold it into compass as part of the sprint-opening flow (e.g. compass sprint bump-version 0.0.N), driven by the new sprint number. Prototype source below. | |||
| Separate trade and instrument detail dialogs | Trade and instrument are currently displayed in one details dialog. Consider separate dialogs with idiomatic navigation between them; needs a brainstorm on trading-system UX patterns. | ||||
| Setup code quality actions | infra |
Setup code quality actions | |||
| Setup Qt properly on Windows | code |
Setup Qt properly on Windows | |||
| Several pages are not linked in the org-roam knowledge graph… | Several pages are not linked in the org-roam knowledge graph: sprint 17 release notes, MSVC C1202 workaround cleanup, Type definition facet, and several manual pages. Investigate and add missing id-links. | ||||
| Shared chart-data presentation layer for FX Spot and CRM plots | ores.qt mktdata charts architecture |
Extract candle/line aggregation, windowing, and downsampling logic out of Qt chart windows into a plain-C++ presentation-layer class (mirroring crm_rate_display_service), reused by Qt, ASCII shell rendering, and CRM plots. | |||
| Shell entity commands — top-level commissioning story | ores.shell codegen refdata |
ores.shell entity commands have no codegen profile and are hand-written per entity. Lift shell-command commissioning out of per-entity commission stories into one top-level story: establish the per-entity command pattern, modernize, templatize into a codegen facet, then roll out across entities. | |||
| Sign-up dialog should be disabled if feature is disabled | code |
Sign-up dialog should be disabled if feature is disabled | |||
| Simplify verbose handler log names | code logging codegen |
Handler log names like pricing_engine_type_handler_lg() should just be lg(). Affects all generated handler templates. | |||
| Single tenant setup creates tenant | code |
Single tenant setup creates tenant | |||
| Single-row lookups on tenant_read_scope: shared entities (e.… | Single-row lookups on tenant_read_scope: shared entities (e.g. catalog_repository::read_latest(ctx, name), read_at_version) no longer filter by tenant_id, so if a tenant ever creates a row whose natural key (e.g. catalog name) collides with a system-tenant seed row of the same key, the lookup can return either row non-deterministically (callers like catalog_service::get_catalog(name) take .front()). Not a security issue (RLS still enforces the own-OR-system boundary) since both rows are legitimately visible, but worth either a deterministic own-tenant-preferred tie-break in the codegen template's single-row read queries, or an app-level constraint preventing a tenant's natural key from shadowing a system-tenant seed row. Flagged by PR #1668 review. | ||||
| Sort list dialogs by display_order when present | qt ux list_dialog |
Any list dialog whose entity has a display_order field should sort by it by default. | |||
| Split LookupFetcher into per-entity codegen'd fetchers | codegen qt refactor dynamic-combo |
LookupFetcher.hpp/.cpp is a hand-maintained grab-bag of fetch_<entity> functions that should be generated per-entity from the model, like the rest of the dynamic_combo plumbing. | |||
| SQL schema validator doesn't recognize nullable-tenant-id scope pattern | sql validation codegen tooling |
TENANT_002/TENANT_003 checks flag any table whose tenant_id isn't in the PK/EXCLUDE constraint, but don't recognize the legitimate nullable-tenant-id-for-system/tenant/party-scope shape several tables already use by design, forcing a per-table ignore entry instead of recognizing the shape as a category. | |||
| Standardise timeline bucket generation as a compass writer (for the snapshot skill) | agile timeline compass tooling org-js |
Turn the ad-hoc timeline-bucket generation into a standard compass timeline writer under the snapshot-skill task: read compass timeline generate –json, bucket events into fixed windows, and emit canonical bucket org docs the board parses. | |||
| Starting UI from file manager does not work | infra |
Starting UI from file manager does not work | |||
| Stop and start service does not trigger ores.qt reconnection | code |
Stop and start service does not trigger ores.qt reconnection | |||
| Story: Add a server-side rate-history endpoint for chart panels | marketdata ui api charts product_backlog |
Multiple UIs (CRM cross-rates matrix, likely others) need a short rate-history sparkline/chart per pair or series; there is no server-side history endpoint today, only live/latest reads. | |||
| Story: Add tenant discovery to CLI and compass | tooling cli compass iam tenant |
Developers have no single command to discover which tenants are provisioned and obtain their UUIDs for ORES_TENANT. Add ores.cli iam tenants list to expose tenants from the IAM layer, then wrap it in compass db tenants so one compass command prints code, name, tenant_id and a copy-pasteable export hint. | |||
| Story: Audit and standardize the display_order field across lookup/code-table entities | codegen qt refdata technical-debt product_backlog |
Determine what display_order means, which entity archetypes require it, fix codegen Qt detail-dialog templates to surface it by default, backfill affected existing entities, and update their manual screenshots. | |||
| Story: Audit ores.synthetic.service headers for missing export macro | synthetic windows build tech-debt product_backlog |
make_ir_curve_feed() in ir_curve_feed.hpp (and possibly other src/ free functions/classes) lack ORES_SYNTHETIC_SERVICE_EXPORT, the same latent Windows-link bug fixed for ir_curve_template_resolver.hpp in PR #1656. | |||
| Story: Audit refdata entities for composite (temporal-versioned) child relationships | product_backlog |
Inventory ores.refdata entities beyond party/counterparty that have child/component rows (identifiers, contacts, junction/restriction tables) and determine which need the temporal composite entity versioning mechanism (touch-function, as-of query, Qt composite history). | |||
| Story: Calendar follow-ups: remaining hand-written list pagination cleanup | calendar-list-pagination-followups product_backlog |
Split from the calendar entity follow-ups story at sprint 24 close: three remaining follow-on tasks not required by that story's acceptance – backfill missing Qt-drawer hand-authored entities, fix legacy primary-key heading models, and paginate remaining hand-written Qt list entities. | |||
| Story: Codegen CI zero-diff invariant | tooling codegen sprint_22 v0 |
Add a CI job that regenerates all registered components and fails if any output differs from HEAD; makes the zero-diff invariant machine-enforced. | |||
| Story: Codegen facet: generate the DQ publish-from-dq pattern | codegen dq publish librarian product_backlog |
Add an ores.codegen facet (publish_from_dq) that generates the artefact-type registration row, a shadow-table model derived from the target entity's own model, the SECURITY DEFINER publish-from-dq SQL function, its NATS handler, and registrar wiring from a single declaration on an entity's codegen model, replacing the 25 hand-written copies of this pattern across ores.refdata/ores.assets/ores.reporting. | |||
| Story: Codegen model safety guardrails | tooling codegen sprint_22 v0 |
Add runtime guards for missing component_include/component_core; block dual-template SQL generation; document profile limitations. Prerequisite for the C++ audit. | |||
| Story: Codegen: generate NATS subject constants per component | codegen nats tech_debt codegen_nats_subject_constants product_backlog |
Codegen currently produces NATS subject strings only as literals scattered across request/protocol structs, handler registrar files, and client call sites – e.g. this session found a real bug where a new publish-from-dq subject was registered in SQL/DQ metadata but the handler's registrar.cpp never subscribed to it, because there is no compiler-checked single source of truth. Generate, per component, an API header of named constants for every NATS subject the component owns (requests, events, publish-from-dq subjects, …), and have codegen-generated registrar/handler/client code reference those constants instead of raw string literals, so a missing subscription or a typo becomes a compile error instead of a silent runtime hang/failure. | |||
| Story: Codegen: mustache-to-address rename + junction codegen rollout | codegen-legacy-profile-followups |
Remaining tech-debt tail from Sprint 23's 'Retire legacy codegen profile system' story once its own acceptance was met, and the follow-up story's B7 task: rename the 50 entity-facet .mustache templates to MASD address form, and roll junction codegen out to the other has_tenant_id junctions beyond tenor_convention_resolution. | |||
| Story: Commission remaining DQ entities | codegen dq qt refdata product_backlog |
Finish commissioning ores.qt.dq's DQ entities onto standard codegen: subject_area (blocked on compound natural-key SQL support), the ores.qt.data_management history-dialog migration, the change_reason_code-not-assigned bug in ~9 dialogs, and the Data Librarian tree regression caused by last sprint's DQ work. | |||
| Story: Commission: business_unit | product refdata commissioning business_unit sprint_22 v0 |
Commission business_unit: verify Qt UI post-NATS, fix regressions, add manual chapter, capture shell/CLI/Wt/HTTP backlog. | |||
| Story: Commission: party_id_scheme | product refdata commissioning party_id_scheme sprint_22 v0 |
Commission party_id_scheme: verify Qt UI post-NATS, fix regressions, add manual chapter, capture shell/CLI/Wt/HTTP backlog. | |||
| Story: Commission: portfolio | product refdata commissioning portfolio sprint_22 v0 |
Commission portfolio: verify Qt UI post-NATS, fix regressions, add manual chapter, capture shell/CLI/Wt/HTTP backlog. | |||
| Story: compass generate catalogue: auto-generate index org files from tagged content | compass sprint_22 v0 |
Add a compass command to regenerate catalogue/index org files by scanning tagged org files. Covers memories, recipes, knowledge, and skills catalogues. | |||
| Story: Compass GitHub Actions support | compass ci github-actions tooling dx sprint_22 v0 |
Give compass a quick overview of all GitHub Actions runs, highlight which ones are failing, and for failing runs surface the error detail via gh CLI without needing to download full logs. | |||
| Story: Decommission legacy ores.codegen bash scripts | tooling codegen sprint_22 v0 |
Replace all direct bash script invocations of ores.codegen with ores.compass or the Python codegen; remove legacy bash scripts. | |||
| Story: DQ/Refdata service boundary cleanup | product_backlog |
Route DQ bundle publication through refdata.v1.* NATS endpoints instead of writing directly to ores_refdata_* tables. | |||
| Story: Entity evaluation skill and runbook | llm skill runbook entity evaluation sprint_19 v0 |
Create a reusable skill and runbook for evaluating the health of any entity: coverage matrix lookup, functional verification steps, and gap reporting. | |||
| Story: Generalize as-of and as-of-bucket queries across repositories | architecture database timeseries product_backlog |
As market_observations_repository::read_as_of()/read_as_of_buckets() now show for IR curve snapshots: latest-value-at-time-T (as-of) and N-snapshots-over-time (as-of buckets) are general patterns any bitemporal/timeseries repository needs, not just curve data. Capture the pattern and scope generalizing it. | |||
| Story: IAM/Refdata service boundary cleanup | product_backlog |
Replace ores.iam.core's direct ores_refdata_parties_tbl writes/reads with refdata.v1.* NATS calls to restore clean service ownership and RLS enforcement. | |||
| Story: Improve compass output monitoring | compass-output-monitoring |
Move all compass command output out of ad-hoc /tmp files into a well-known, rotated, per-checkout log directory, and add a services-start concurrency lock so at most 4 environments run services at once. Split from Sprint 23's 'Compass improvements' story once its own acceptance (vcpkg drift warning, devops-update-environment skill) was met. | |||
| Story: Improve site documentation discoverability | documentation site ux sprint_22 v0 |
Make key catalogue pages (skills, recipes, memories, knowledge) reachable from the site menu and cross-linked from their glossary entries, so website visitors can find reference material without knowing the URL. | |||
| Story: Model market data cuts as proper ORE Studio reference data | refdata market_data pricing product_backlog |
currency_pair.default_cut_code (and any other cut-code reference) is currently unvalidated free text pointing at a concept — the market data snapshot time used for official valuation — that has no domain model anywhere in ORE Studio. Model cuts as a first-class, FK-referenceable lookup entity (code, name, description, cut time, timezone) so pairs, trades, and valuation config can reference a validated cut rather than a raw string. | |||
| Story: Offload service and DB runtime to a WSL host over SSH | devops environment wsl infrastructure product_backlog |
Split from sprint 24's containerize-and-deploy story at sprint close: the actual cutover to running the dev environment's services/DB on a WSL host day-to-day, starting with first-class compass tooling to build/stage/transfer/deploy the service-runtime image to a remote host instead of the current manual SSH/podman sequence. | |||
| Story: Party/counterparty follow-ups | party-counterparty-followups |
Two independent follow-ups spun off Sprint 23's 'Commission: party, counterparty, and party_status' once its own acceptance was met: orchestration/workflow-step usage in counterparty, and a generate_short_code Qt button. | |||
| Story: Portfolio display follow-ups | portfolio-followups |
Two independent display-quality issues found while capturing Sprint 23's 'Commission: portfolio' manual-chapter screenshots — portfolio_status as a proper lookup entity, and a Purpose Type combo display-label fix. | |||
| Story: Rate display conventions: convention-aware formatting across all Qt rate surfaces (FX + IR) | rate-display-conventions product_backlog |
Extend the crm_rate_formatter pattern (stateless, convention-aware, presentation-layer formatter) to every remaining FX rate-display surface still hand-formatting with hardcoded precision, and build the equivalent for IR (ir_index_convention + ir_rate_formatter) – both families share the same underlying gap: conventions exist in the DB but most Qt surfaces don't consume them. | |||
| Story: Refdata entity NATS event registrar audit | product_backlog |
Audit all refdata entities with a changed_event type and wire NATS event registrars for the ones still missing (26 of 34), closing the eventing gap systematically. | |||
| Story: Retire per-entity history dialogs: Phase C rollout | qt history refactor product_backlog |
Delete HistoryDialogBase, every remaining per-entity *HistoryDialog class, and their templates, across the ~61 dialogs still on the old architecture, now that the generic HistoryDialog widget and server-side diff pipeline are shipped. | |||
| Story: Server-side UUID generation for all entities | server_side_uuid_generation product_backlog |
Clients must never generate primary-key UUIDs for entities they create. Every UUID-primary-keyed entity's Add flow currently generates the id client-side (boost::uuids::random_generator() in setCreateMode, part of the shared Qt detail-dialog codegen template); the server should assign the id on save instead, with the client showing a nil-UUID placeholder until the response comes back. | |||
| Story: Stochastic tick arrival times for synthetic feeds | product_backlog |
Replace the fixed-interval tick clock with random inter-arrival times drawn from a realistic distribution (Poisson/Hawkes), so synthetic feed ticks arrive irregularly like real market data. | |||
| Story: Trade Blotter | trading blotter workspace product_backlog |
Build the Trade Blotter: the primary front-office screen for viewing, booking, amending, and routing trades through their lifecycle. Depends on the workspace story – production trade import needs a temporary holding location (Pending Book) for trades before they are promoted into the Live workspace. Requires additional design work; first task is to recover and re-validate the prior analysis before scoping implementation. | |||
| Story: Unify entity timestamp handling — throw on failure, fix optional<db_timestamp> | sprint_19 v0 time |
Eliminate silent epoch returns from timestamp conversions. All timestamp conversions must throw on failure. Fix optional<db_timestamp> for NOT NULL fields. Replace timepoint_to_timestamp (silent failure) with datetime::to_db_string. Stretch: migrate entity fields from db_timestamp to time_point. | |||
| Story: Upgrade Qt to latest supported version to fix macOS 15 AGL removal | infrastructure build sprint_22 v0 |
Qt 6.8.x references -framework AGL (removed in macOS 15 Sequoia) in its QtGui link configuration. The latest supported Qt version drops the AGL dependency. CI is currently pinned to macos-14 as a stopgap; upgrading to the latest supported Qt version restores macos-latest compatibility and unblocks macOS 15 runner support. | |||
| Story: Verify Windows and macOS CI builds | ci windows macos msvc sprint_22 v0 |
Re-run the Windows (MSVC) and macOS CI builds and verify the sprint 19 rfl decomposition cleared the C1202 root cause; fix or file follow-ups for whatever still breaks. Carried context: the goal slipped in sprints 18 and 19 for want of a story naming it. | |||
| Stream large HTTP upload bodies to disk instead of buffering | http storage compute performance |
Route-specific http::file_body streaming for the storage PUT endpoint, so large binary uploads (compute engine packages) don't buffer the whole body into a std::string in memory. | |||
| Subscribe on reconnect fails | code |
Subscribe on reconnect fails | |||
| Support expiry date shorthand with calendar integration | trades ux calendars |
Allow expiry date entry as a shorthand (e.g. 9Y). Requires calendar support — either from QuantLib or another library. Backlog until calendar infrastructure is in place. | |||
| Support tenant specification in shell account commands | code |
Support tenant specification in shell account commands | |||
| Suppress staging dataset publication warnings | code |
Suppress staging dataset publication warnings | |||
| Sweep missing reflectors.hpp IWYU include across entity repositories | codegen refdata drift tech-debt |
PR #1407 review found ~143 of 148 *_entity.cpp files (all but party_type and 4 ores.marketdata files) are missing the ores.utility/rfl/reflectors.hpp IWYU include that cpp_domain_type_entity.cpp.mustache emits unconditionally. | |||
| Sweep remaining already-commissioned entities against latest codegen templates | codegen refdata qt sql drift |
Country proved the sweep-and-reconcile process against currency's new shared codegen capability; apply the same one-task-per-entity sweep to the rest of the already-commissioned entities. | |||
| Synthetic data generator improvements | generator testing |
Three issues: (1) cities must nest within the same parent city, not mixed hierarchies; (2) generate multiple counterparty root nodes with a probability distribution over tree depth; (3) block tenant bootstrapping if system has not been bootstrapped first. | |||
| Synthetic parties are created Active, bypassing the party setup flow | synthetic refdata provisioning |
The synthetic organisation generator creates parties with status Active, but the party provisioning flow (Qt wizard trigger via party_setup_required, and the provision party porcelain) is designed around parties starting Inactive and being activated at the end of setup. Synthetic parties therefore never trigger the party wizard and 'activation' is a no-op rewrite. Decide: should the generator create parties Inactive (root included), or is the synthetic path exempt from party setup? | |||
| System wizard single-tenant default hostname collides with seeded Root Tenant | qt iam provisioning |
The SystemProvisionerWizard's single-tenant mode pre-fills tenant hostname 'localhost', but the database seed now creates the Root Tenant on hostname 'localhost' and tenant hostnames are unique — so the wizard's default path fails with a duplicate-key error. Found live while verifying provision_all.ores (the shell porcelain inherited the same default and had to override with –tenant-hostname default). Fix the wizard default (e.g. derive hostname from code) or the seed. | |||
| Tag-based heading dispatch for codegen entity models (Stage 1.5) | codegen org_mode literate |
Replace codegen's title-matching heading dispatch ("Flags", "Primary key", …) with tag matching (e.g. :section:flags:), so headings can be renamed without breaking the loader. | |||
| task start crashes after switching to a stale branch | compass bug task workflow |
compass task start resolves the task doc path, switches to the task's branch, then re-reads the doc — but on a branch that diverged before a sprint transition the file lives elsewhere (or compass itself is older), producing FileNotFoundError tracebacks and an unstamped journal. Re-resolve the doc after the switch, or read everything needed before switching; also consider warning when the target branch's compass predates the running one. | |||
| The 'How do I set up a development environment?' recipe cove… | The 'How do I set up a development environment?' recipe covers Linux only. Either rename it to make the Linux scope explicit, or expand it with macOS and Windows sections. | ||||
| The client session is not automatically renewing its authent… | The client session is not automatically renewing its authentication token, causing sessions to expire silently. Implement token refresh on expiry so users are not logged out unexpectedly. | ||||
| The My Account password change dialog does not have a show/h… | The My Account password change dialog does not have a show/hide password toggle. Add one so users can verify what they are typing. | ||||
| The ORE Studio manuals page should list manuals in a table (… | The ORE Studio manuals page should list manuals in a table (format columns: HTML, PDF). Manuals should also be structured as linked sections so individual pages can be linked to from elsewhere in the docs. | ||||
| The org-roam knowledge graph no longer exposes options to co… | The org-roam knowledge graph no longer exposes options to configure or hide the right-hand sidebar — these settings seem to have been removed in a recent version. Investigate and restore sidebar control. | ||||
| The site build leaves legacy output alongside the new site. … | The site build leaves legacy output alongside the new site. The build pipeline should always rm -rf site/ before recompiling so stale pages are never served. | ||||
| Three-level provisioning: end-to-end testing | code |
Three-level provisioning: end-to-end testing | |||
| Timeline snapshot agent column shows #+todo: frontmatter ins… | Timeline snapshot agent column shows #+todo: frontmatter instead of env name for stories/tasks without an #+environment: field — compass is reading the #+todo: line as the owner value. Affects at least 8 entries in the 2026-06-26 snapshot. | ||||
| Troubleshoot skills in claude | infra |
Troubleshoot skills in claude | |||
| Two bundled component doc template improvements: (1) remove … | Two bundled component doc template improvements: (1) remove the Summary heading — component overviews should start directly with the blurb; (2) file and directory links should use proj: links so they resolve to GitHub URLs rather than local paths. | ||||
| Two small ref-data UI bugs: (1) market tiers has an icon but… | Two small ref-data UI bugs: (1) market tiers has an icon button that does nothing — wire it or remove it; (2) deleting a rounding type does not auto-refresh the list — trigger a refresh on delete. | ||||
| Unify junction entity timestamp type to db_timestamp alias | codegen templates cpp refdata |
The domain_entity section of cpp_domain_type_entity_hpp.org uses db_timestamp (via db_types.hpp) for valid_from/valid_to after PR #1316, but the junction section still uses sqlgen::Timestamp directly. These should be unified for consistency. The composite-PK interaction with sqlgen must be validated first (valid_from is part of the junction PK). See * Design notes in cpp_domain_type_entity_hpp.org for full pros/cons. Recommend a dedicated template-cleanup task after validating with a test junction entity. | |||
| Unify the codebase's three separate Beast HTTP client implementations | http storage compute refactor |
Replace ores.storage::net::http_client, ores.compute.wrapper::net::http_client, and ores.http.api's request-read path with one shared, correctly-configured Beast HTTP client component. | |||
| Update codegen entity meta-model doc for unified Columns key shape | codegen documentation |
projects/ores.codegen/modeling/entity_meta_model_keys_and_columns.org still documents the retired * Primary key/* Natural keys sections rather than the unified * Columns + :primary_key:/:natural_key: shape shipped by story 36A25C95. | |||
| Use badges in the history dialog | Make history dialog consistent with main window and details dialog for badges by using badges there too. | ||||
| Use entity display name (not key) in detail/history window titles | ores.qt codegen ux titles |
Window titles for detail and history use the primary key (e.g. alpha-2 code); use a human display field (e.g. country name) instead, via a generic title_field Qt variability point. | |||
| Use string views for static strings | infra |
Use string views for static strings | |||
| Validate flag_source library symbols exist at codegen time | codegen qt combo flag |
A flagged_combo field's flag_source-derived fetch/icon function names aren't checked against the ores.qt library until C++ compile time; codegen should fail fast with a clear message instead. | |||
| Validate GMM simulate params at request boundary | ores.synthetic validation robustness |
Defensively validate GMM component parameters in the simulate handler so bad inputs return a clear error instead of risking an abort. | |||
| Vendored ORE engine package missing its own shared libraries | compute ore packaging bug |
external/ore/packages/ore-1.8.15.0-x64-linux.tar.gz only contains the executable and a manifest.json, never bundling libOREAnalytics.so/libQuantExt.so/libQuantLib.so.1 – every compute job dispatched to a wrapper node fails immediately with a shared-library load error, confirmed reproducible natively (not container/Newton-specific). | |||
| Warn when creating account without a role assignment | iam accounts ux validation |
Creating a new account without assigning at least one role is most likely an error; show a warning message box as we already do for missing party assignments. | |||
| Windows WiX installer: break through the v3 size and file-count limits | analysis |
Windows WiX installer: break through the v3 size and file-count limits | |||
| Wire service token provider for all services | code security infrastructure |
5 of 19 outbound-NATS services have make_service_token_provider wired up; 14 more make outbound NATS calls (publish/subscribe) but still lack it. | |||
| Write a manual chapter for business units and business unit types | docs refdata business_unit commissioning |
business_unit and business_unit_type have Qt list/detail windows but no user-manual coverage; deserve their own org-structure chapter. | |||
| Write org-timestamps to the build output directory | Configure org-publish to write .org-timestamps/ under the build output directory rather than ~/.org-timestamps, supporting clean-build semantics and keeping the home directory uncluttered. | ||||
| xsdcpp codegen fails: cannot resolve group oreTradeData | codegen ore xsdcpp blocked |
Local xsdcpp 1.0.3 build fails with 'error: Could not find group oreTradeData' against both the old and newly-synced external/ore/xsd/input.xsd, blocking regeneration of projects/ores.ore's domain.hpp/domain.cpp. |