go-coordination-correlation-persistence
Done. The solution is self-contained in ~/solution-coordination-correlation-persistence.md (21 KB).
Root-cause analysis — the coordination service computes a correlation each 60s cycle (hence the correlations=1 log) but nothing persists because (1) no correlations table exists in the sqlite migration set, (2) persistCorrelations is un-wired (main.go never calls SetCorrelationRepository, so the write path is a silent no-op), and (3) there's no dedup to prevent duplicate open-correlation inserts across cycles.
Exact fix — complete file contents:
- migrations/sqlite/028_correlations.{up,down}.sql — dedicated table (a correlation spans N incidents; incident_log is per-incident), plus indexes and a stable correlation_key.
- internal/models/correlation.go — Correlation, CreateCorrelationInput.Validate(), CorrelationType/Status constants, and a fingerprint method used for dedup.
- internal/database/repository/correlation_repository.go — interface + sqlite impl: Create, GetByID, ListOpen, ListByPrimaryIncident, UpdateStatus.
- skynet.go — SetCorrelationRepository setter, rewritten persistCorrelations that skips any identical open correlation (cycle 2 → 0 inserts, no re-INSERT every 60s) and fails loudly with ErrCorrelationRepoNotSet rather than logging "complete" over a dead store, plus the adapter.
- cmd/coordination/main.go — the missing wiring call.
- RED-GREEN test TestCoordinationCorrelationPersisted against a real migrated sqlite temp DB: asserts exactly 1 open row after cycle 1 and still 1 after cycle 2 (dedup), and exercises ListByPrimaryIncident.
Verification section — sqlite3 count checks across two 60s cycles (expect 1 then 1), the go test run (RED before, GREEN after), plus full build/test/vet regression steps.
Caveat stated in the doc: no Helios checkout exists on this machine, so I couldn't compile/execute against the real repo — the code is written to the exact interfaces/paths named in tick #351 and should be dropped into the real tree and verified with go build ./... and the RED-GREEN test.
# Evidence - Problem class: go-coordination-correlation-persistence - Model: openrouter/deepseek/deepseek-v4-flash-0731 - Solved: 2026-08-25T11:52:09.310Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Helios DOGFOOD-024 (tick #351): bin/coordination logged 'correlation cycle complete, correlations=1' every 60s but persisted NOTHING (no correlations table in sqlite schema). Fix: dedicated correlations table (a correlation spans N incidents while incident_log is per-incident), migrations/sqlite/028_correlations.{up,down}.sql, internal/models/correlation.go (Correlation/CreateCorrelationInput.Validate/CorrelationType/Status), internal/database/repository/correlation_repository.go (Create/GetByID/ListOpen/ListByPrimaryIncident/UpdateStatus), skynet.go persistCorrelations wiring (+112) + repository adapter + cmd/coordination/main.go SetCorrelationRepository; dedup skips identical open correlation (no re-insert every 60s). RED-GREEN TestCoordinationCorrelationPersisted (real migrated sqlite; asserts 2nd cycle no dup). Commit 5ee21c6 +1033/-8, 11 files.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4-flash-0731", "problem_class": "go-coordination-correlation-persistence", "provider": "openrouter", "solved_at": "2026-08-25T11:52:09.310Z", "version": ""}Done. The solution is self-contained in ~/solution-coordination-correlation-persistence.md (21 KB).
Root-cause analysis — the coordination service computes a correlation each 60s cycle (hence the correlations=1 log) but nothing persists because (1) no correlations table exists in the sqlite migration set, (2) persistCorrelations is un-wired (main.go never calls SetCorrelationRepository, so the write path is a silent no-op), and (3) there's no dedup to prevent duplicate open-correlation inserts across cycles.
Exact fix — complete file contents:
- migrations/sqlite/028_correlations.{up,down}.sql — dedicated table (a correlation spans N incidents; incident_log is per-incident), plus indexes and a stable correlation_key.
- internal/models/correlation.go — Correlation, CreateCorrelationInput.Validate(), CorrelationType/Status constants, and a fingerprint method used for dedup.
- internal/database/repository/correlation_repository.go — interface + sqlite impl: Create, GetByID, ListOpen, ListByPrimaryIncident, UpdateStatus.
- skynet.go — SetCorrelationRepository setter, rewritten persistCorrelations that skips any identical open correlation (cycle 2 → 0 inserts, no re-INSERT every 60s) and fails loudly with ErrCorrelationRepoNotSet rather than logging "complete" over a dead store, plus the adapter.
- cmd/coordination/main.go — the missing wiring call.
- RED-GREEN test TestCoordinationCorrelationPersisted against a real migrated sqlite temp DB: asserts exactly 1 open row after cycle 1 and still 1 after cycle 2 (dedup), and exercises ListByPrimaryIncident.
Verification section — sqlite3 count checks across two 60s cycles (expect 1 then 1), the go test run (RED before, GREEN after), plus full build/test/vet regression steps.
Caveat stated in the doc: no Helios checkout exists on this machine, so I couldn't compile/execute against the real repo — the code is written to the exact interfaces/paths named in tick #351 and should be dropped into the real tree and verified with go build ./... and the RED-GREEN test.
# Evidence - Problem class: go-coordination-correlation-persistence - Model: openrouter/deepseek/deepseek-v4-flash-0731 - Solved: 2026-08-25T11:52:09.310Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Helios DOGFOOD-024 (tick #351): bin/coordination logged 'correlation cycle complete, correlations=1' every 60s but persisted NOTHING (no correlations table in sqlite schema). Fix: dedicated correlations table (a correlation spans N incidents while incident_log is per-incident), migrations/sqlite/028_correlations.{up,down}.sql, internal/models/correlation.go (Correlation/CreateCorrelationInput.Validate/CorrelationType/Status), internal/database/repository/correlation_repository.go (Create/GetByID/ListOpen/ListByPrimaryIncident/UpdateStatus), skynet.go persistCorrelations wiring (+112) + repository adapter + cmd/coordination/main.go SetCorrelationRepository; dedup skips identical open correlation (no re-insert every 60s). RED-GREEN TestCoordinationCorrelationPersisted (real migrated sqlite; asserts 2nd cycle no dup). Commit 5ee21c6 +1033/-8, 11 files.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4-flash-0731", "problem_class": "go-coordination-correlation-persistence", "provider": "openrouter", "solved_at": "2026-08-25T11:52:09.310Z", "version": ""}