Story: Let the blotter read a page, not the book — the remaining work
Table of Contents
This page documents a story in Sprint 30, carried unfinished from Sprint 29 at close. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
A desk opens the blotter and has its rows in well under a second, at any size the tenant has written, and its rail states how many rows sit at each node without reading the book to find out.
The screen asks two questions, and they are different questions: give me one page of rows, and give me a count at each node. Both have their operation on main, and both still read the union view, so a page pays for each row's laterals and sorts the book to take the first hundred rows. That is what the tasks below take away.
2. Status
| Field | Value |
|---|---|
| State | BACKLOG |
| Parent sprint | Sprint 30 |
| Now | Not yet started. Split from Let the blotter read a page, not the book, which closed in sprint 29 with its done tasks. |
| Waiting on | Nothing. |
| Next | Triage into a sprint. |
| Last touched | 2026-11-08 |
3. Acceptance
- Every blotter row is a trade, and a package is one composite trade with its legs beneath it.
- The structure tables are gone.
- A page is ordered by an indexed key, and the page and count times are measured at the largest tenant size.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Complete a package as a composite trade | BACKLOG | The completion writes a structure with no book, date or state, so a package cannot be a blotter row. Write the package as a composite trade with its own booking and state, and name its legs as component trades. | ||
| Delete the structure tables | BACKLOG | The structure tables, their code and their tests go once nothing reads or writes them, so the tree holds one way to state a package. | ||
| Hold a composite's legs as trades | BACKLOG | A composite leg names its constituent in free text, so the row points at a word and not at a trade. Give the leg a uuid reference to the trade and a role, and give the composite the kind and template the deal states. | ||
| List a package as the trade it is | BACKLOG | Every blotter row must be a trade, so the summary view stops unioning structures and reads a composite as one row with its legs beneath. Convert the structures that exist, so nothing is lost when the branch goes. | ||
| Order the page by an indexed key | BACKLOG | A keyset page compares its sort column as text, so no index can serve the order. Compare in the column own type, read the page keys from the bookings alone, and index that order; then measure the first page at a hundred thousand trades. |
5. Decisions
- Split from Let the blotter read a page, not the book on 2026-11-08 at sprint 29 close. The acceptance above is copied from that story; its done tasks are recorded there.
- Reviewed on 2026-11-08 at sprint 30 start. Acceptance written from the tasks, because it was empty.
6. Out of scope
- Any change to the BFF. It is being replaced by ores.http, and a read model written around it would be thrown away.
- The screen's layout and interaction, except where the read model forces a change (paging, the rail's source).
- The other screens that read the summary view; they are separate stories unless they share the read model.