# Scrum disposition — 2026-05-02 Bundle: `materializer_replay_substrate_fix` (commit `89ca72d`, 4522 diff lines, 165KB). Three reviewers via cross-lineage scrum (`scripts/scrum_review.sh`): Opus 4.7 (opencode) · Kimi K2.6 (openrouter) · Qwen3-coder (openrouter). Verdicts in `verdicts/`. ## Convergent findings (≥2 reviewers) **None.** Each reviewer flagged different lines — no high-signal convergent bug. ## Per-reviewer triage ### Opus → ship-with-fixes | Severity | Where | Disposition | |---|---|---| | BLOCK | TestSaveTask_Coalesces | **Self-withdrawn in same response** ("withdraw to INFO. (Self-correction.)"). | | WARN | index.go::Add ordering | Future-proofing note — no current code-path can panic between `safeGraphAdd` and `i.vectors[id] = out` while holding the write lock. Noted; no action. | | WARN | replay.go::logReplayEvidence | Code is correct (embedded by value, mutation local); flagged as future-refactor risk only. No action. | | WARN | materializer.go::isoDatePartition | **Real comment-rot risk.** Fixed in `89ca72d`-followup: comment now states the branch is defense-in-depth (MaterializeAll guards upstream). | | WARN | index_test.go detached docstring | **Real readability regression.** Fixed in `89ca72d`-followup: blank line + leading `// TestAdd_…` line attached. | | INFO | LocalOnly path coverage gap | Acknowledged. Test deferred — the path is structurally simple (one branch in `Replay`), risk-of-regression low. | | INFO | Receipt.Errors always-empty | Schema-compatible behavior. No action. | ### Kimi → BLOCK (rejected as confabulation) | Severity | Where | Disposition | |---|---|---| | BLOCK | cmd/materializer/main.go:59 — "exits 0 on validation failure" | **False.** Lines 65–66 are `if !res.Receipt.ValidationPass { os.Exit(1) }` — exit-1 fires regardless of dry-run. Kimi misread the code structure. Single-reviewer BLOCK with verifiable counter-evidence → dismissed per `feedback_cross_lineage_review.md`. | ### Qwen → hold (both items rejected as confabulation) | Severity | Where | Disposition | |---|---|---| | WARN | cmd/vectord/main.go:137 saveAfter nil dereference | **False.** Explicit `if h.persist == nil { return }` at top of `saveAfter` (line 184). Guard exists; flagged claim is wrong. Dismissed. | | BLOCK | cmd/vectord/main.go:146 saveTask race | **False.** Every read/write of `inflight`/`pending` happens under `s.mu` (Lock at lines 116/130, Unlock at 119/123/133/137). The save() call between Lock segments doesn't touch saveTask state — it operates on the index. Dismissed. | | INFO | × 3 | Not bugs — narrative summaries of the doc edits. No action. | ## Pattern observation This wave matches `feedback_cross_lineage_review.md`'s prediction: **only Opus emits BLOCK-class findings worth verifying**. Kimi and Qwen each produced single BLOCKs that were verifiable confabulations. Opus's BLOCK was self-withdrawn in the same response. The convergent-findings rule held: zero ≥2-reviewer overlap, and the single-reviewer BLOCKs from non-Opus lineages didn't survive trace verification. Opus-only WARNs that were actionable (2 of 4) were trivially fixable comment-rot. ## Outcome **Ship-with-fixes** applied in a follow-up commit: - `internal/vectord/index_test.go` — attach docstring to `TestAdd_SmallIndex_ConcurrentDistinctIDs` - `internal/materializer/materializer.go` — clarify `isoDatePartition` fallback comment as defense-in-depth, not a reachable branch No retraction of any commit; substrate + ports stand as shipped.