Task: Seed the ladder family and let it fail like the rest
Table of Contents
This page documents a task in the Rework the market data feeds into a market data service with adapters — the remaining work story. It captures the goal, current status, acceptance, and any notes or results.
1. Goal
The ladder family is seeded for ACME and Northwind with its configs and cut, fails at the engine with the gap named, and appears in the reports list.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Rework the market data feeds into a market data service with adapters — the remaining work |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-11-04 |
3. Acceptance
- The design's report list is seeded, dual-cycle rows split into EOD and LIVE definitions.
- Each definition binds its six configuration types, the sensitivity analytic and the files the configs state.
- The docs and the index state the definitions and what still blocks the engine; a live list shows them.
- The seed generators, pgTAP and the gates are green.
4. Plan
The product owner overruled the design's decision to hold the ladder family back,
so the design's * Reports to build list is the seed list. Rows 1 to 10 are the
family; rows 11 to 14 wait on swaption, cap and floor, credit and equity
volatility data and stay stated and unseeded.
- the catalogue gains the ten reports through
report_catalogue.jsonand the two generators, so the artefact populates are regenerated rather than hand written. A row the design markseod and intradayis two catalogue entries, because a definition states one cut selection. That is fifteen definitions per party. - the report names are the ones the ladder pages already carry, because the index lists a report by its page. The design's rates delta ladder is the Rho ladder and its currency pair spot ladder is the Delta ladder, which is the family's general first-order reader.
- every ladder runs
npvandsensitivity, except the par-rate DV01 ladder, which reads the par column and asks for no valuation. The two analytics already have profiles, so a ladder binds the run settings the sensitivity reports already bind: the same rows, which namesensitivity.xmlandsimulation.xml. - the engines are
Risk Sensitivities, the same set the delta, gamma and DV01 reports use, because a bump wants the prices that carry analytic sensitivities. A close twin takes the default official engines, as the pricing table says. - the definition binds the six configuration types through the existing artefact pattern, so nothing about the binding mechanism is new.
- the ladder family is decided before the party rules. A definition that produces no figure costs nothing to hold, and the catalogue should state what the platform runs. Every party therefore holds the fifteen, the holding company included, and Northwind holds them through the London rows its catalogue reads.
- the environment is shared and already provisioned, so the seeds reach it by being
applied: the artefact populates are staged again and the publish carries them onto
the rows the parties hold.
evidence/apply_the_ladder_family.sqldoes that and states the two secrets of the order: run settings before definitions, and the Northwind rows staged and not published, because this environment holds no Northwind tenant.
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 |
|---|---|---|---|
| Reports in the catalogue | 57 | python3 -c "import json; print(len(json.load(open('report_catalogue.json'))))" in the ACME dataset |
670948cf8f |
| Ladder definitions per party | 15, being 5 LIVE and 10 EOD |
evidence/the_ladder_family_live_list.txt |
670948cf8f |
| Ladder definitions staged for Northwind | 15, waiting for the tenant | same file, last table | 670948cf8f |
| Bindings each ladder definition writes | 6, one per configuration type | same file, third table | 670948cf8f |
| Sensitivity files each ladder's run settings name | sensitivity.xml and simulation.xml |
same file, fourth table | 670948cf8f |
| Definitions held by the parties after the publish | ACMCOR 25, ACCOUK 55, ACCOUS 46, ACCOHK 46 | compass sql count by party |
879b09fece |
| Reporting pgTAP suites | 5 files, 62 tests, pass | projects/ores.sql/test/run_tests.sh test/reporting_*.sql |
879b09fece |
| Sensitivity analytics pgTAP suites | 2 files, 18 tests, pass | ... test/analytics_sensitivity_*_test.sql |
879b09fece |
6. Notes
6.1. The cycle each row runs on
The design's cycle column is the whole rule. Five rows are eod and intraday: the
rates delta, the ATM and surface vega ladders, and the two derived volatility
ladders. Each of those is a live definition that runs every half hour through the
day on the LIVE cut and an "(EOD)" twin that runs at the close on the EOD cut.
The other five are end of day alone. A sensitivity run reprices the whole scope, so
the live definitions run on the half hour like the intraday risk monitor rather than
every fifteen minutes like the triple vol spot ladder.
6.2. The two ladders the design's list does not seed
The Volga and the Vanna are not in rows 1 to 10 and no definition states them. The Three-pillar is the surface shift under its other name, so the surface vega ladder is the report and the page says so. Nothing about those three is a defect: the design's list does not reach them, and the design is what the seed follows.
6.3. Why the holding company holds them
The ladder family is decided before the party rules that say the holding company
runs no trading analytics (D2) and that only London runs the option reports (D8).
That is the product owner's call on 2026-11-04 and the pages state it, in
Report pages, under "Which entity
runs which report". A reviewer who disagrees can remove the holding company and the
two core entities from LADDER_REPORTS in generate_report_data.py and regenerate;
nothing else would change.
6.4. What a run stops on
No definition was run for this task. Each ladder binds run settings that name
sensitivity.xml, and no table holds a SensitivityAnalysis document and no mapper
reads one, so the engine has nothing to shift. The dataset also holds no
FX_OPTION/RATE_LNVOL quote and no FX spot, so a volatility ladder has no factor to
bump even with the document in place. The acceptance put this out of scope: a
definition exists and fails for the same reasons the rest do.
6.5. The new definitions hold no scheduler job
The provisioner's schedule_reports step creates a job and a run grant for each
published definition whose schedule is a real cron expression. It runs while a
tenant is provisioned, and these fifteen definitions reached a tenant that was
already up, so they are published and unscheduled. The schedule column still states
when each one would fire, and a re-provision asks for the jobs. A report a reader
opens from its page is unaffected: the schedule action is a separate feature.
6.6. An environment that carries an older catalogue
The ACME parties in this environment also hold five, three and three definitions named "Bump and Reprice Spot Greeks", "Bump and Reprice Spot Ladder" and "Bump and Reprice Triple Vol Spot Ladder", published on 2026-11-03 from a catalogue that used the Northwind names. They are current rows with scheduler jobs, they are not this task's, and the publish left them alone. The catalogue on this branch names those reports "Spot Greeks", "Spot Ladder" and "Triple Vol Spot Ladder", so the publish inserted those names beside them. A re-provision returns the parties to one name each.
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 |
|---|---|
| #4453 | [reporting] Seed the ladder family and state what blocks it |
9. Review
| Comment summary | File | Decision | Notes |
|---|---|---|---|
10. Result
The ladder family is stated in the report catalogue and applied to this environment. The ten rows of the design's list are fifteen definitions per party, because five of the rows run on both cycles and each cycle is a definition:
| # | Row | Seeded as | Cycle |
|---|---|---|---|
| 1 | Rates delta ladder | Bump and Reprice Rho Ladder | LIVE and (EOD) |
| 2 | Rates gamma ladder | Bump and Reprice Gamma Ladder | EOD |
| 3 | Theta ladder | Bump and Reprice Theta Ladder | EOD |
| 4 | Rates cross-gamma ladder | Bump and Reprice Cross-gamma Ladder | EOD |
| 5 | .1 ATM vol ladder | Bump and Reprice ATM Vega Ladder | LIVE and (EOD) |
| 6 | .1 surface vol ladder | Bump and Reprice Surface Vega Ladder | LIVE and (EOD) |
| 7 | .1 risk-reversal ladder | Bump and Reprice Risk-reversal Vega Ladder | LIVE and (EOD) |
| 8 | .1 strangle ladder | Bump and Reprice Butterfly Vega Ladder | LIVE and (EOD) |
| 9 | Par-rate DV01 ladder | Bump and Reprice DV01 Ladder | EOD |
| 10 | FX spot delta ladder | Bump and Reprice Delta Ladder | EOD |
Each definition binds the six configuration types: conventions,
todays_market, curve_configuration, pricing_engines — Risk Sensitivities
for the plain name and the official engines for a close twin — risk_report_config
and engine_settings. The run settings are the party's existing sensitivity rows,
so the sensitivity analytic carries recalibrateModels Y,
outputSensitivityThreshold 0.000001, parSensitivity Y,
sensitivityConfigFile = sensitivity.xml and marketConfigFile = simulation.xml.
The definitions run through the existing publish, so no table had to be invented
for the shift: the size is still a setting no table holds, and the pages say so.
Rows 11 to 14 are stated and not seeded, because they wait on swaption, cap and floor, credit and equity volatility data.
What the run stops on. Nothing was run. No table holds a SensitivityAnalysis
document and no mapper reads one, no table states a shift size, the dataset holds
no volatility quote and no FX spot, and the report inputs story is open. That is
the same list that stops "Delta and Gamma" and every other sensitivity report, so
the ladder fails like the rest rather than in a way of its own.
Docs. The index's ladder table states the definitions and their cuts, "what is not built" names the four gaps in one place, the pages of the five dual-cycle ladders state both cycles, and the design page records the overrule and the name each row is seeded as.
Tests. The two seed generators run and a re-run produces no diff. The five
reporting pgTAP suites pass (62 tests) and the two sensitivity analytics suites pass
(18 tests). The docs checks pass: lint, site-page on the changed pages,
org-links, heading-numbers, structure-notes and pattern-uses. The SQL and
codegen checks pass: sql-hygiene, populate-refs, sql-reachability,
generated-column-refs, entity-writes, handler-permissions, rls-widenings
and cmake-sources. er-diagram fails on
ores_schema.dq_staging.puml, which the commit that added cut_kind_code to the DQ
artefact table left unregenerated; that failure is on origin/main and this branch
does not touch a schema file. The codegen checks need the codegen virtual
environment, which this worktree does not hold, so they were run with the one in the
main checkout.
Evidence. evidence/apply_the_ladder_family.sql is the apply, and
evidence/the_ladder_family_live_list.txt is what the database answers: the counts
by party and cut, the live list with each definition's schedule and run settings, the
six bindings, the two files, and Northwind's staged rows.