# Scrum review — c2_vectord_substrate — opus (opencode/claude-opus-4-7)

**Latency:** 21399ms · **Tokens:** 6 in / 927 out · **Date:** 2026-05-02

---

SEVERITY: WARN
WHERE: cmd/vectord/main.go:saveTask.trigger
WHAT: Save errors leave inflight=true forever if pending was set, but actually re-loop; however an error with no pending requests correctly clears — yet a persistent failure plus ongoing triggers will spin in a tight loop logging on every iteration with no backoff.
WHY: The `for` loop re-runs save immediately when pending is set; under sustained MinIO outage with sustained writes this becomes a hot retry loop saturating logs and a goroutine.

SEVERITY: WARN
WHERE: internal/vectord/index.go:rebuildGraphLocked
WHAT: `g.Distance = i.g.Distance` reads from the (potentially corrupted) old graph; if i.g was nil-deref-corrupted, the Distance field may still be valid but this couples rebuild to old-graph state unnecessarily when params already encode the distance.
WHY: The rebuild's stated load-bearing property is "independence from i.g state"; pulling Distance from i.g undermines that — should resolve via distanceFn(i.params.Distance) like NewIndex does.

SEVERITY: WARN
WHERE: internal/vectord/index.go:DecodeIndex
WHAT: v1 fallback now silently drops ids whose meta exists but graph Lookup fails, where previously they were tracked in i.ids.
WHY: Comment acknowledges the contract tightening, but there is no warning/log on dropped IDs — an operator decoding a v1 envelope with stale meta will see a silent shrink with no diagnostic.

SEVERITY: INFO
WHERE: internal/vectord/index_test.go:TestAdd_RecoversFromPanickingGraph
WHAT: Test name claims to prove rebuild from a panicking graph but never actually forces a panic — only exercises safeGraphAdd on a healthy graph then cleans up.
WHY: Test body does not match docstring intent; coverage of the rebuild-after-panic path is asserted only indirectly via TestAdd_PastThreshold_SustainedReAdd.

SEVERITY: INFO
WHERE: internal/vectord/index_test.go:TestAdd_SmallIndex_ConcurrentDistinctIDs
WHAT: Missing function-doc comment delimiter — the comment block above the function is detached from a prior test's closing brace, making it look like a continuation comment.
WHY: The diff shows `}` immediately followed by `// playbook_record pattern:` with no blank line and no func keyword between — readability/godoc hazard.

VERDICT: ship-with-fixes — saveTask retry-loop backoff and rebuild Distance independence worth addressing.
