Story: Pick a curve from the series a party can see
Table of Contents
This page documents a story in Sprint 27. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
A person opens the curve evolution screen and chooses the curve or surface from a list of the series their party can see, instead of typing its asset class, scope, instrument type, quote type and fields.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 27 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-10-11 |
3. Acceptance
- A server operation returns the typed identity of each series the caller's party can see: asset class, scope, instrument type, quote type and the other identity fields, with the owning party.
- The BFF routes that list for a session, and a session sees no series of a party it cannot read.
- The screen offers the list as a picker, filled in from the chosen row, and still lets the person type an identity.
- An empty list says so in words and does not read as an error.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| List the series identities a party can see | DONE | 2026-10-11 | 2026-10-11 | Add a marketdata operation that returns the typed identity of each series the caller's party can see. |
| Route the series list through the BFF | DONE | 2026-10-11 | 2026-10-11 | Give the BFF a session-guarded route for the series identity list, with tests. |
| Pick the curve on the evolution screen | DONE | 2026-10-11 | 2026-10-11 | Offer the series list as a picker on the evolution screen, filling the identity from the chosen row. |
| Scaffold story: Pick a curve from the series a party can see | DONE | 2026-10-11 | 2026-10-11 | Story scaffolding rides this task: the story, its sprint row and its three tasks. |
| Import each party's own series | DONE | 2026-10-11 | 2026-10-11 | The market data importer finds a series by its URI across the whole tenant, so a second party reuses the first party's series and fails on its axes. Look the series up by party and URI. |
5. Decisions
- The list comes from the party-isolated projection. The series table is isolated by tenant only, and the identity projection is isolated by party. The lister takes visibility from the projection and the rows from the table. Reading the table first showed one party another party's series, which a test caught.
- A listed identity names its series. The identity carries the owning party, so passing it to the snapshot, slice or evolution read names that series and no other party's.
- A series with no declared shape is listed and cannot be chosen. It has no grid, so the evolution would refuse it. The option says so, and the picker does not hide it.
- The list is cached under the party. A switch of party does not clear the cache, so the key carries the party and the list of the party left behind is never shown.
- The importer looks a series up by party. The lookup was tenant-wide, which was harmless until the axes became party-isolated. A second party's import reused the first party's series and was refused. The earlier import tests ran with no party, so none could see it. The fix passes the context's party, and a test with two parties under row-level security failed first and now passes.
- Tests that write a surface use a pair of their own. The test tenant is shared across tests, so a surface one test imports is still there for the next.
Left for later.
- Provisioning seeds market series without their identity rows, so a fresh party's picker can be empty until
marketdata backfill-identityruns. Captureprovisioning_projects_seeded_series_identities. - The synthetic IR curve feed screen, and a shape declared when a feed starts. Capture
synthetic_feed_declares_its_shape. The screens belong to the synthetic implementation story.
6. Risks
- An empty picker with no error. Market series that provisioning seeds have no identity rows until
marketdata backfill-identityruns for the party, so a fresh Acme environment lists nothing for a party. The picker says the list is empty and why a list can be empty. The fix is the captureprovisioning_projects_seeded_series_identities. - A cut list read as a complete one. The list holds at most 5000 series. The picker must show the
truncatedflag and say to narrow by party.
7. Out of scope
- Searching or filtering the list beyond what a short list needs.
- A series with no declared shape stays a refused read.
- Changing which party a person works for.