PR #307 · pramaan-io/pramaan-functions · merged 2026-06-12
Ghost or hidden members — the contract lied both ways.
The app member contract was confused. Now one straight line.
One line of filtering breaks the contract three ways.
The fix — Accepted means member; the rest is one bucket; each session stays in its boundary.
sequenceDiagram autonumber participant app as App (Bouncer) participant identity as Identity (Ledger) participant support as Support (Records key) app->>identity: GET firm members identity->>app: active + accepted rows app->>app: apply staff-read context identity->>app: non-active rows too support-->>identity: support roster query identity-->>support: fail closed on identity tables
| File | ± |
|---|---|
docs/walkthroughs/story-1195-walkthrough.html | +61 |
openapi/app-api.json ★ | +2 −4 |
src/app_api/firm_dtos.py ★ | +5 −4 |
src/app_api/firm_service.py ★ | +22 −12 |
tests/integration/test_app_firm_routes.py | +136 −11 |