scrum 2026-05-02: materializer+replay+vectord — ship-with-fixes

Cross-lineage review of 89ca72d (Opus + Kimi + Qwen3-coder).

Convergent findings (≥2 reviewers): NONE.

- Kimi BLOCK (materializer main.go exits 0 on validation fail):
  confabulation. Code does os.Exit(1) at lines 65-66.
- Qwen BLOCK (saveTask race condition): confabulation. All access
  to inflight/pending is under s.mu.
- Qwen WARN (saveAfter nil deref): confabulation. Explicit
  `if h.persist == nil { return }` guard at line 184.
- Opus BLOCK (TestSaveTask_Coalesces): self-withdrawn in same
  response.

Opus WARNs actioned:
- Detached docstring on TestAdd_SmallIndex_ConcurrentDistinctIDs —
  attached.
- isoDatePartition fallback comment — clarified as defense-in-depth
  (MaterializeAll guards upstream; branch unreachable through public
  surface).

Disposition + verdicts in reports/scrum/_evidence/2026-05-02/.

Pattern matches feedback_cross_lineage_review.md: only Opus emits
BLOCK-class findings worth verifying; Kimi/Qwen single-reviewer
BLOCKs failed trace verification.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
root
2026-05-02 03:35:12 -05:00
co-authored by Claude Opus 4.7
parent 89ca72d471
commit 09299a27b7
7 changed files with 4673 additions and 7 deletions
+5 -3
View File
@@ -446,9 +446,11 @@ func isoDatePartition(iso string) string {
t, err = time.Parse(time.RFC3339, iso)
}
if err != nil {
// Fallback: TS would have produced "NaN/NaN/NaN" — we use
// "0000/00/00" which is at least a valid path. Materializer
// fails its own RecordedAt validation before reaching here.
// Defense-in-depth only — MaterializeAll calls validISOTimestamp
// on RecordedAt before processSource ever invokes us, so this
// branch is unreachable through the public surface. Kept so a
// future direct caller doesn't get a panic; "0000/00/00" is at
// least a valid path.
return "0000/00/00"
}
t = t.UTC()
+6 -4
View File
@@ -561,10 +561,12 @@ func TestAdd_RecoversFromPanickingGraph(t *testing.T) {
// path and proceeding.
_ = safeGraphDelete(idx.g, "safe-test")
}
// playbook_record pattern: many requests in flight, each Adding a
// unique ID to a fresh small index. Vectord's mutex serializes
// these, but the concurrency stresses lock acquisition timing
// against the small-index transition state.
// TestAdd_SmallIndex_ConcurrentDistinctIDs reproduces the playbook_record
// pattern: many requests in flight, each Adding a unique ID to a fresh
// small index. Vectord's mutex serializes these, but the concurrency
// stresses lock acquisition timing against the small-index transition
// state.
func TestAdd_SmallIndex_ConcurrentDistinctIDs(t *testing.T) {
idx, _ := NewIndex(IndexParams{Name: "concurrent_small", Dimension: 8})
const writers = 16