-- Per-daemon least-privilege roles (audit critical finding 1, deployment half). -- The app-level chain + signatures are in code; this locks the DB layer. -- Apply on the production Postgres; adjust the connection limits. CREATE ROLE cayce_scanner LOGIN PASSWORD 'set-from-env'; CREATE ROLE cayce_executor LOGIN PASSWORD 'set-from-env'; CREATE ROLE cayce_maild LOGIN PASSWORD 'set-from-env'; CREATE ROLE cayce_publisher LOGIN PASSWORD 'set-from-env'; CREATE ROLE cayce_monitor LOGIN PASSWORD 'set-from-env'; GRANT SELECT ON proposals, audit_log, mail_messages, content_items, daemon_runs TO cayce_monitor; GRANT SELECT, INSERT, UPDATE ON proposals TO cayce_scanner; -- no DELETE GRANT INSERT ON audit_log TO cayce_scanner; -- append-only GRANT SELECT, UPDATE ON proposals TO cayce_executor; -- status transitions GRANT INSERT ON audit_log TO cayce_executor; -- append-only GRANT SELECT, INSERT, UPDATE ON mail_messages, proposals TO cayce_maild; GRANT INSERT ON audit_log TO cayce_maild; GRANT SELECT, UPDATE ON content_items TO cayce_publisher; GRANT INSERT ON audit_log TO cayce_publisher; GRANT SELECT ON daemon_runs TO cayce_scanner, cayce_executor, cayce_maild, cayce_publisher; -- sequences GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO cayce_scanner, cayce_executor, cayce_maild, cayce_publisher, cayce_monitor;