Task: Gap analysis: ORE Studio identifiers vs ORE's real addressing scheme
Table of Contents
This page documents a task in the Market data notation: design an ORE Studio canonical URN mapping to ORE/Bloomberg/Reuters story. It captures the goal, current status, acceptance, and any notes or results.
Goal
Using the survey task's output as the reference, enumerate concretely where every identifier currently in ORE Studio fails to project onto ORE's real addressing scheme:
ir_curve_generation_config: the(currency_code, index_name)pair has no equivalent of FX'sore_key. Two configs can sharecurrency_codebut differ only by tenor embedded inside the free-textindex_name(USD-LIBOR-3Mvs a hypotheticalUSD-LIBOR-6M) – there is no structured tenor field, and nothing distinguishes a discount-role curve from a projection-role curve for the same index.curve_feed_controller'squalifier(built fromcurrency_code+index_name): this is exactly the collision key needed for the narrow "don't double-bind the same tenant/currency/index" check it does today, but it has no concept of curve family (e.g. the set of tenor curves that together make up one currency's multi-curve framework) or of curve role, so it cannot express "these two curves legitimately coexist because one discounts and one projects." Reference the concrete question that surfaced this gap: does a real 3M LIBOR curve key collide with the discount curve for the same currency, and if not, what makes them distinct?market_seriesseries_type/metric/qualifier[/point_id](existing doc): assess whether this scheme, designed beforeir_curve_generation_configexisted, already has room for tenor/curve-role, or needs the same fields as the new URN.fx_spot_generation_config.ore_key: the one place ORE Studio already does this correctly – record it as the pattern to generalise, not a gap.
Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Market data notation: design an ORE Studio canonical URN mapping to ORE/Bloomberg/Reuters |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-07-22 |
Acceptance
- A gap table exists (one row per identifier scheme in scope) with columns: current field(s), what ORE's real scheme requires that's missing, and a concrete example showing the failure (e.g. two same-currency, different-tenor LIBOR configs are indistinguishable by any structured field today).
- The discount-vs-projection curve-role gap is stated explicitly, tied to the still-BACKLOG Dual-curve discount+projection model task, since the URN's curve-role field and that task's data model should agree.
- The analysis is descriptive only – it does not propose fixes (that's the design task) or make any code/schema change.
Plan
(Implementation strategy. Written when work starts; key decisions
are distilled into the parent story's * Decisions at close, but the
plan itself stays — it is the historical record of what we did.)
Notes
Test Scenarios
Manual QA scenarios (scaffolded via compass add test_scenario, run
through the QA Validation Runner panel) that verify this task. Link
new ones here as they're created; the scenario doc itself links back
via its "Verifies task" field.
| Scenario | State | Notes |
|---|---|---|
PRs
| PR | Title |
|---|---|
| #1693 | [knowledge] Gap analysis: ORE Studio identifiers vs ORE's real addressing scheme |
Review
| # | Comment summary | File | Decision | Notes |
|---|---|---|---|---|
| 1 | Task/story acceptance criteria not satisfied by delivered content | task_gap-analysis-ore-studio-identifiers.org | Accepted | Added the concrete ORE-Studio-internal gap table (ir_curve_generation_config, curve_feed_controller, market_series, fx_spot_generation_config) to * Result |
| 2 | Stale link descriptions pointing at renamed/restructured F3010EA7 doc | knowledge.org, market_data_architecture.org, polymorphic_types_over_nats.org, synthetic_market_data_generators.org, fx_spot_synthetic_poc_architecture.org, market_data_requirement.org, market_data_requirements_resolution_hub.org, story.org, task_scaffold_synthetic_market_data_poc.org | Accepted | Repointed NATS/logical-field mentions to market_data_identifier.org (3D56DB59); updated remaining F3010EA7 descriptions to match its new RIC/Bloomberg/ORE comparative-analysis scope |
| 3 | Typo "rodgirgues" -> "rodrigues" | fed_funds_average_swap_convexity.org, multi_curve_construction.org | Accepted | Fixed both occurrences |
| 4 | Unrelated screenshot hitchhiked into this PR's diff | scenario_market-observation-list-by-series-id_step3_20260722_223937.png | Declined | Reviewers confirmed it's a real, pre-existing scenario missing its evidence image; harmless to keep |
Result
ORE Studio internal identifier gap table
Per-field gap analysis of ORE Studio's own schema against ORE's real addressing scheme (index name / curve key / quote key), as required by this task's Acceptance. This is separate from the external RIC/Bloomberg/ORE vendor-notation comparison delivered in External market data identifiers (that doc answers "how do RIC, Bloomberg, and ORE differ from each other", not "where does ORE Studio's own schema fail to project onto ORE's scheme" — the two are complementary, not the same analysis).
| Field | Current shape | What ORE's scheme requires that's missing | Concrete failure example |
|---|---|---|---|
ir_curve_generation_config (currency_code, index_name) |
index_name is free text (synthetic_ir_curve_generation_configs_create.sql); no structured tenor field, no curve-role field |
ORE's index-name layer expects tenor to be a distinct, structured token (e.g. QuantLib's Libor(3M) vs Libor(6M)), and its curve-key layer (Yield/<CCY>/<CURVE_ID>) expects an explicit discount-vs-projection role |
Two configs sharing currency_code = USD can only be told apart if their free-text index_name strings happen to differ (USD-LIBOR-3M vs a hypothetical USD-LIBOR-6M) — nothing stops a typo'd index_name from silently colliding, and nothing records that a USD-LIBOR-3M curve is a projection curve, not the discount curve for the same currency |
curve_feed_controller's qualifier (currency_code + index_name, per ir_curve_feed::qualifier()) |
A flat concatenation used only for the "one running feed per qualifier" collision check | Same gap as above, one level up: the qualifier has no concept of curve family (the set of tenor curves making up one currency's multi-curve framework) or curve role, so it cannot express "these two curves legitimately coexist because one discounts and one projects" | A real 3M LIBOR projection curve and a same-currency discount curve would collide under this qualifier scheme if they ever shared a currency+index-name pair — the controller has no field to say "these are different roles, allow both" |
market_series series_type/metric/qualifier[/point_id] (marketdata_market_series_create.sql) |
Same three-column shape as ORE's real quote key, but qualifier is a single free-text column, not a per-type fixed-dimension tuple like the catalogue's IR_SWAP/RATE/CCY/spot_lag/float_index_tenor/swap_tenor |
Pre-dates ir_curve_generation_config; its qualifier column has room for anything (it is untyped text), so it never had to solve the tenor/curve-role problem explicitly — the gap is latent, not yet hit, because nothing today writes a curve-role-bearing qualifier into it |
Two rows with series_type'DISCOUNT', =metric'RATE'= and the same qualifier text but different intended curve roles would be indistinguishable by the unique index on (tenant, party, series_type, metric, qualifier) — the schema would silently overwrite one with the other |
fx_spot_generation_config.ore_key (synthetic_fx_spot_generation_configs_create.sql, populated in synthetic_publish_from_dq_create.sql) |
Explicit FX/RATE/<BASE>/<QUOTE> string, generated directly in the pattern ORE's own quote-key catalogue documents |
Nothing — this is the one place ORE Studio already does it correctly. Recorded here as the pattern to generalise to the IR side, not a gap | N/A — this row is the target shape, not a failure |
Discount-vs-projection curve-role gap
Stated explicitly per Acceptance: neither ir_curve_generation_config
nor curve_feed_controller's qualifier has a curve-role field, so
there is no schema-level way today to mark a curve as discount vs.
projection for the same currency. This is the same gap the still-BACKLOG
Dual-curve discount+projection model
task will need to close — that task's data model and this task's URN
curve-role field should agree on one representation rather than
independently inventing two.
Scope note
This task's PR (#1693) primarily delivered the external RIC/Bloomberg/ORE vendor-notation survey (originally the sibling task Survey ORE, Bloomberg, and Reuters market data notations's scope, closed via PR #1686) rather than this task's own ORE-Studio-internal gap table. The table above was added during PR review to close that gap and satisfy this task's Acceptance criteria directly, rather than retitling/re-scoping the task.