Closes gap-analysis v2 §4 + §10.9.
- Migration 005 adds plans_participants (plan_id, participant_id, role,
lei, did, created_at) with a composite UNIQUE(plan_id, role,
participant_id) and CHECK on role vocabulary matching types/plan.ts.
- services/participants.ts: idempotent add() / bulkAdd() / listForPlan() /
listByRole() / remove() — the SoD layer reads listByRole() to resolve
the authorised actor set for a transition.
- api/participants.ts + wiring in index.ts:
GET /api/plans/:planId/participants
POST /api/plans/:planId/participants -> participants.authorized
DELETE /api/plans/:planId/participants/:role/:participantId
- 7 unit tests against a Map-backed query stub; full suite 87/87 green.