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
@@ -0,0 +1,61 @@
# 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.