[Story-1195] Team directory accepted-member contract

Story 1195Epic None5 files · +226/−31

PR #307 · pramaan-io/pramaan-functions · merged 2026-06-12

Why this matters

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.

How it flows

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

Files changed (5)

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