- ScheduledDiscovery now instantiates real scanners and merges results via CatalogService
- Records scan history (start/complete/errors) in scan_history table
- Partial scan failures stage results instead of overwriting catalog
- P2: Gitea Actions CI for SaaS backend (separate from Go agent CI)
- P4: ScheduledDiscovery with Redis distributed lock to prevent concurrent scans
- P6: AgentBridge — Redis pub/sub for SaaS↔agent communication (approvals + step results)
- Caddyfile: self-hosted reverse proxy with auto-TLS for all 6 products