Story: Guard the curve-snapshot reads
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
The curve-snapshot reads answer only a caller that holds the read permission, and the permission is seeded, so a signed-in member cannot read every tenant's curve points.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 27 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-10-09 |
3. Acceptance
- curve_snapshot_handler checks marketdata::curve_snapshots:read.
- The permission is seeded in the IAM permission catalogue.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
5. Decisions
6. Out of scope
7. Promoted from capture
Captured 2026-10-06 in the product backlog; promoted preserving the UUID.
7.1. What
curve_snapshot_handler checked no permission and no curve-snapshot read code
was seeded in iam_permissions_populate.sql, so any authenticated caller could
read every tenant's curve points. The republish and compute handlers did check
marketdata::curve_bootstrap:republish and :compute, so this was an oversight
on the read side.
7.2. Resolution
The defect was closed before the capture was promoted.
projects/ores.marketdata/service/include/ores.marketdata.service/messaging/curve_snapshot_handler.hpp
checks marketdata::curve_snapshots:read at :81-85 and :121-125, and
projects/ores.sql/populate/iam/iam_permissions_populate.sql:1519 seeds it. The
story is closed on that evidence and carries no tasks, because no work was left
to do when it was promoted.
8. Result
Nothing was built under this story. It exists so the capture that found the defect has a story to close against, and so the sprint does not carry a defect record in the inbox after the defect is gone.
Both acceptance criteria were already met when the capture was promoted:
curve_snapshot_handler.hppchecksmarketdata::curve_snapshots:readat:81-85and:121-125.iam_permissions_populate.sql:1519seeds the code.
The evidence is the story's own ** Resolution above, which the
marketdata-curves story's What the tree has moved since the earlier passes
section recorded first. No task was opened, because the work the capture asked
for was done.
The capture doc/agile/product_backlog/inbox/curve-snapshot-reads-are-unauthenticated.org
was removed when the story was promoted, so the inbox no longer offers work that
is finished.