Task: Populate the inflation family

Table of Contents

This page documents a task in the Populate the ACME books with a realistic trade population — the remaining work story. It captures the goal, current status, acceptance, and any notes or results.

1. Goal

ACME's books hold inflation-linked trades. The refdata asset class names inflation, but the trade type catalogue carries exactly one inflation code, InflationSwap, and it routes to rate_instrument under the swap product type. The planner therefore selects by trade type and not by product type, and the class carries 3% of the population.

2. Status

Field Value
State DONE
Parent story Populate the ACME books with a realistic trade population — the remaining work
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-10-31

3. Acceptance

  • The mapping from the inflation asset class to its trade types is declared, because the catalogue has no inflation product type.
  • InflationSwap books a trade, and the index the trade names is one the tenant holds fixings for.
  • The class share of the population matches its weight within tolerance.
  • The family exports as the ORE portfolio the engine reads, and reverse-maps without loss.
  • The report that prices the family runs against the inflation fixing curve and its seasonality, or the task states which pricing it cannot prove yet.

4. Plan

Route the one code, and state the rows the store's own writer already reads.

The catalogue sends InflationSwap to the rates family's table, so the trade is a rates header plus the product's own fact row, and the planner draws the code the router sends it. The family is planned by its own planner because the asset class is inflation and the class is the key the registry answers a planner by; the rate planner carries the nine other codes and does not draw this one.

The index is the tenant's own curve name. A curve definition in the InflationCurves section states its index in its curve id, so the population reads the definitions and draws from the ids, the way it draws a currency pair from the tenant's catalogue. A scope that names no curve refuses.

The swap states a fixed side and a CPI side. The CPI side's type is what the ORE projection reads the index, its base level and its lag from, so the trade exports as the InflationSwap element the engine prices. One thing the CPI leg must not state: its own index column. That column references the benchmark catalogue every floating leg names, and an inflation index is not a member of it — the store refused the row. The index is the product's own fact and the export reads it there.

ACME charters a sterling inflation book and one config for it. The family routes one code, so the config's slot count is its trade count.

5. Measurements

Every number this task claims about a tree, with the command that produced it and the commit it was measured at. A number without both is not a measurement, because a clean-up record describes a tree and trunk moves under a branch: a consumer count, a gate's component count and a suite's size all change with no code changing, and the reader of a bare number cannot tell which tree it came from. Where the raw output matters, put it in an evidence/ file beside the task and name that file in the Command column.

What Value Command Commit
The population a fresh tenant holds 184 trades, up from 178 select count(distinct id) from ores_trading_trades_tbl branch head
Inflation swaps 6, two on each of UKRPIX, USCPIA and BECPIHL select inflation_index_code, count(*), min(base_cpi), min(lag_convention) from ores_trading_inflation_swap_instruments_tbl group by 1 order by 1 branch head
The class share 6 of 184 = 3.3%, against the weights page's 3% the two counts above branch head
What the curves the seed publishes are 10 definitions in InflationCurves, 3 of them GBP select count(*) from ores_refdata_curve_definitions_tbl where section_code'InflationCurves'= branch head
Suites trading.api 641/166, synthetic.core 2315/94, trading.core 1427/224, ore.core 483462/446, all green publish/bin/<suite> branch head
The provisioning run completed, all nine steps the provisioning script branch head

6. Notes

7. Test Scenarios

Manual QA scenarios (scaffolded via compass add test_scenario) 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
     

8. PRs

PR Title
#4235 [synthetic,trading,refdata] Populate the inflation family

9. Review

Comment summary File Decision Notes
       

10. Result

The inflation family books, and the tenant's books hold inflation swaps that name the curves the seed published.

Measured on a fresh tenant:

  • Six inflation swaps over three indices, two on each, with a base level and a three month lag. The population is 184 trades, so the class is 3.3 per cent of it against the weight's three.
  • Each swap is a rates header and the product's own fact row, with a fixed side and a CPI side, which is the shape the ORE projection reads back as an InflationSwap element.
  • The provisioning run completes all nine steps.

Three things surfaced on the way and are fixed here rather than worked around:

  • The tenant's curve.inflation_type value set holds ZC and YY, the codes the ORE document states, and the seed stated ZeroInflation. It got away with the invented spelling while the value set arrived empty; it is refused now that the set is populated, and it stopped the run in curve publication.
  • The CPI leg cannot state the index in the leg's own index column: that column is the soft reference to the benchmark catalogue, and the store refuses an inflation index there. The index is the product's fact and the export reads it from the fact.
  • A convertible security's conversion target was drawn from the trade's slot, so two trades of one security stated two targets and the store refused the second issue write. The target now comes from the security's name.

Two desks the configs name had also gone from the seeder's tree — equity and commodity — so every provisioning run stopped at the first config whose book no entity held. Both are restored, unstaffed, and the gap that let them go is captured as A seed profile's generate_trades config names a book by name, and nothing checks that name against the tree.

Emacs 29.3 (Org mode 9.6.15)