- Shipped
- September 7, 2026 at 8:43 AM UTC
- Author
- Kamo
- Commit
- 88c9566
GET /api/security/contact-effects returns the platform, org and member layers in one round trip; PUT and DELETE on /{scope} write and reset one layer. The service never merges them — the browser has to merge again the moment a member changes something anyway. Platform writes need the new MANAGE_PLATFORM_CONTACT_EFFECTS platform right. Org writes need CONFIGURE_SYSTEM and land on the caller's OWN org from the session, never a path parameter. Member writes are for the caller alone: there is no path to write somebody else's, because an administrator Reads are ungated beyond authentication, deliberately. Every signed-in member needs the layers above them to know what to paint, and a 403 there would mean a shell with no feedback under the pointer rather than a visible failure. A near-copy of EventSoundController rather than a shared generic. The two differ only in their table and their right today, but they are separately-governed surfaces — sounds already grew an uploaded asset library and a per-device output route. The duplication is forty lines; the coupling would have been permanent.