Skip to content

Fix ingest/capture edge cases (burst 3)#18

Merged
REPPL merged 1 commit into
bughunt-2from
bughunt-3
Jul 20, 2026
Merged

Fix ingest/capture edge cases (burst 3)#18
REPPL merged 1 commit into
bughunt-2from
bughunt-3

Conversation

@REPPL

@REPPL REPPL commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Summary

Burst 3 of the autonomous correctness hunt — 4 low-severity bugs, each with a watched-to-fail regression test. Several are second-order refinements of the burst 1 fixes, which is the expected shape as the hunt digs into deeper edge cases.

  • validate rejected a finding at t<0. An imported recording whose creation_time predates the manifest t0 yields legitimately-negative session-relative times; a faithfully-anchored finding then failed the whole transactional ingest. The lower bound is now derived from the earliest timeline entry (symmetric with the upper bound); a normal session still floors at 0.
  • appendLines could still persist a newline-less line on a full disk. os.File.Write gives no atomicity, so ENOSPC lands a truncated prefix — which then breaks merge on the whole file. New appendRecords records the length and Truncates back on any write error; corrects the earlier comment's false atomicity claim (from burst 1's demo fix).
  • An empty findings array silently truncated a prior good findings.jsonl (O_TRUNC write) — a model that finds nothing, or a truncated answer file, wiped real data. Ingest now refuses an empty answer.
  • The overwrite guard counted only enum-valid verdicts, so a hand-edited file whose only verdicts carried a foreign value was clobbered on re-ingest. It now counts raw kind:"verdict" lines.

Docs + DECISIONS.md updated in step; all gates green independently.

Stacked on #17 (bughunt-2), because burst 3 hunted against the burst-1+2-fixed tree so its findings are genuinely new. GitHub will retarget this to main when #17 merges.

Convergence note

Bugs per burst: 5 (one HIGH) → 2 (LOW) → 4 (LOW). The severity ceiling has dropped to LOW and findings are increasingly niche (disk-full, imported-recording clocks, empty/hand-edited answer files) and second-order. Real, but we're into diminishing returns — see my message for whether to keep going.

Assisted-by: Claude:claude-fable-5

…e, verdict guard

Burst 3 of the autonomous correctness hunt — 4 low-severity bugs, each
with a watched-to-fail regression test. Several are second-order
refinements of the burst 1 fixes.

- validate rejected a finding at t<0, but an imported recording whose
  creation_time predates the manifest t0 yields legitimately-negative
  session-relative utterance times; a faithfully-anchored finding then
  failed the whole transactional ingest. The lower bound is now derived
  from the earliest timeline entry (min(0, idx.start)), symmetric with
  the upper bound; a normal session still floors at 0.
- appendLines could still persist a newline-less line on a full disk:
  os.File.Write gives no atomicity, so ENOSPC lands a truncated prefix.
  New appendRecords records the file length and Truncates back on any
  write error, so no partial line survives. Corrects the earlier
  comment's false atomicity claim.
- ingesting an empty findings array silently truncated a prior good
  findings.jsonl (O_TRUNC write) — a model that finds nothing, or a
  truncated answer file, wiped real data. Ingest now refuses an empty
  answer instead of overwriting.
- the overwrite guard counted only enum-valid verdicts, so a hand-edited
  findings.jsonl whose only verdicts carried a foreign value was clobbered
  on re-ingest. The guard now counts raw kind:"verdict" lines.

Docs (analyze surface, schemas, CLI/session references) and DECISIONS.md
updated in step. Gates green.

Assisted-by: Claude:claude-fable-5
@REPPL
REPPL merged commit 59e53bb into bughunt-2 Jul 20, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant