docs: surface SP14 (Payer-Rejected UI + acknowledge) + SP15 (key rotation) #2
Reference in New Issue
Block a user
Delete Branch "docs/sp14-15-readme-sync"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Surface SP14 (5-lane Inbox UI + Payer-Rejected acknowledge action) and SP15 (SQLCipher key rotation) in the README. Both are merged into main but were not yet documented; the previous doc pass covered up to SP13.
The previous doc PR (#1) was effectively merged via
d4f6fddand is now closed.Changes
Inbox
POST /api/inbox/payer-rejected/acknowledge(idempotent, audit-logged, returnstransitioned/already_acked/not_found/not_rejectedcounts).Encryption at Rest
### Key rotationsub-section explaining thePOST /api/admin/db/rotate-keyhandler, theNullPoolchoice (SQLCipher thread affinity), the module-levelthreading.Lock, the error code mapping (409/400/503).Tamper-Evident Audit Log
Roadmap
### SP14 endpointsand### SP15 endpointsreference sections at the end.Project layout
api_routers/(health.py, acks.py, ta1_acks.py) — FastAPI APIRouter subpackage extracted fromapi.py.api.pyline to note it now mountsapi_routers/*.Verification
pytest --collect-onlyinbackend/collects 759 tests (up from 733 at the last doc pass).git diff --checkclean.d4f6fdd).Step 2 (first half) of the architecture satisfaction loop. api.py shrank from 2595 to 2452 lines (-143) by extracting three read-only resource groups into cyclone.api_routers: - health.py: GET /api/health (1 endpoint) - acks.py: GET /api/acks, GET /api/acks/{ack_id} (2 endpoints) - ta1_acks.py: GET /api/ta1-acks, GET /api/ta1-acks/{ack_id} (2 endpoints) Each router owns its endpoint bodies + the small UI-shape helper that goes with them (_ack_to_ui, _ta1_to_ui, _serialize_ta1_from_row). The helpers stay in the router file rather than being shared because each is only used by its own endpoints. api.py now ends the app-wiring section with three include_router() calls. The new package is named cyclone.api_routers (not cyclone.api.routers) to avoid the Python package-vs-same-named-module ambiguity that would shadow the existing cyclone.api module. Verifies: 41 targeted tests (test_acks, test_health, test_api_gets) pass, full pytest is 8 failed / 735 passed / 16 skipped — identical to clean main baseline. Live curl against the running server: GET /api/health -> 200, GET /api/acks -> 200, GET /api/ta1-acks -> 200. See /tmp/refactor-cyclone.md for the full plan.Pull request closed