Jaah API Keys Workflow Implementation
Implement Jaah API keys workflow.
- Permissions: same as we have internally: subject:action. Access to object is limited to the owner of the key. Should be very easy to configure on the UI. By default all is max, but user can remove some
- API Keys can only be created by at least Org Admin
- Keys have expiration
Do a web research and suggest the most modern approach to this for this type of systems
Subtasks
- [business_analysis] Jaah API Keys Workflow Implementation PRD settled: personal Jaah API keys (Org Owner/Admin only), opaque prefixed hashed secrets, feature:action grid default all + Org-admin toggle, expiry default 1y/never allowed, rotate/edit/revoke/IP allowlist/audit/reminders via new notify choke point; Settings→API keys. 17 ACs. Memory: none applied.
- [architecture] Jaah API Keys Workflow Implementation Middleware verifies hashed jaah_ key, narrows owner Principal (∩ key set, no superadmin/act-as), @session_only marker refuses identity/minting routes. Children: C1 backend, C2 notify choke point, C3 sweep+reminders (C1,C2), C4 UI+docs (C1). AC7 oracle amended per D-A2. Memory: none applied.
- [plan] Jaah API Keys Workflow Implementation Split by the Architect's boundaries into 4 children across 2 phases. Foundation: backend (the only migration) and the notify choke point. Core: expiry sweep (depends on both) and UI+docs (depends on backend). AC7 carries the amended oracle; AC1 and AC14 tightened. Memory: none applied.
- API keys backend: model, auth, routes
- Notification choke point with important flag Built user_notify.deliver (no channel arg; important forces verified email) + notification_sent audit row; api_key_expiry event added (Owner/Admin, web label). Quick gate + tests green; PR #6733 queued to lane. Visual check done: row renders cleanly. Deferred: migrating old notifiers. Memory: used mem-15203; proposed 0.
- API key expiry sweep and reminders
- API keys Settings UI and docs
- [finish] Jaah API Keys Workflow Implementation
Activity
- Created
- Runner started
- Ready
- Ready
- Ready
- Runner started
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Runner resumed
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Runner resumed
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Runner resumed
- Runner ended (done)
- Runner started
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Awaiting response
- Runner resumed
- Awaiting response
- Awaiting response
- Runner resumed
- Awaiting response
- Awaiting response
- Awaiting response
- Runner resumed
- Runner ended (done)
- Runner started
- Draft
- Draft
- Draft
- Draft
- Draft
- Ready
- Ready
- Ready
- Ready
- Ready
- Runner ended (done)
- Runner started
- Runner started
- Runner ended (done)