Skip to content

Bug-hunt round 31: CHANGELOG entry for round 30's word-level SafeText filtering - #47

Merged
REPPL merged 1 commit into
mainfrom
bughunt-31
Aug 6, 2026
Merged

Bug-hunt round 31: CHANGELOG entry for round 30's word-level SafeText filtering#47
REPPL merged 1 commit into
mainfrom
bughunt-31

Conversation

@REPPL

@REPPL REPPL commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Round 31 of the autonomous bug-hunt loop (state tracked on #24).

Confirmed finding (substantive)

CHANGELOG.md had no [Unreleased] entry for round 30's word-level SafeText filtering change.

Round 30 (ad3106a) changed internal/transcribe/transcribe.go:532mapSegments's per-word emptiness guard now decides presence on session.SafeText(word) (the rendered form) rather than the raw word, so a word that is entirely invisible-only Unicode (e.g. a zero-width space) is now dropped from transcript.jsonl/timeline.jsonl/the analysis request instead of surviving as a timestamped word with no visible content. This is a real, user-visible change to what transcribe writes to disk. Only the sibling segment-level change from round 27 was documented in CHANGELOG.md; the word-level change landed with no bullet.

Fix: CHANGELOG.md gains a bullet documenting the word-level guard, alongside the existing segment-level one. Direct precedent: round 27 explicitly back-filled the CHANGELOG entry round 26's evidence-anchor fallback should have carried.

Both adversarial refuters independently confirmed this survives — see .abcd/work/DECISIONS.md's round 31 entry for their reasoning.

Considered and rejected (3)

  • docs/reference/session-directory.md:73's words row omitting the same content-based drop cause from its listed omission causes. Split verdict on adversarial review (one refuter killed it as pre-existing — the empty-word drop predates round 30 by roughly 30 rounds, so round 30 introduced no fresh doc staleness; the other found it survives on the row's own precedent of documenting the equivalent text-row cause). Discarded per the loop's "both must fail to kill it" rule.
  • docs/reference/session-directory.md:127's quote row "no normalisation" claim read against internal/analyze/validate.go's SafeText-based comparison. Refuted by both reviewers: SafeText is a rune-local, substring-preserving map (no case-folding, no whitespace-collapsing, no Unicode NFC/NFD), so it is not "normalisation" in the sense the row rules out — the row's own decision-log origin coordinates "no normalisation" with "not corpus-joined" as a matching-leniency claim, not a byte-purity one.
  • internal/analyze/analyze.go:185's duplicate-finding-id error message printing the raw id instead of the SafeText-compared form, claimed inconsistent with three sibling checks. Refuted by both reviewers: %q already escapes every character SafeText would strip, so the raw form is the more diagnostic one for locating the offending bytes on the reported line, and the "three consistent siblings" premise doesn't hold on inspection (one sibling names no first occurrence either; another sibling in the same package also prints the raw form).

Verification

  • gofmt -l ., go vet ./..., go test ./..., go test -race ./... all pass.
  • Pipeline smoke (merge/report on examples/sample-session) passes.
  • Docs-only change; no code path touched, so no new test.

Assisted-by: Claude:claude-sonnet-5

Round 30 changed transcribe.mapSegments's per-word emptiness guard to
compare the SafeText-rendered form, matching the segment-level guard
documented in the round-27 entry, but the round's commit did not add
a CHANGELOG bullet for the word-level sibling change.

Assisted-by: Claude:claude-sonnet-5
@REPPL
REPPL merged commit 3b1cb60 into main Aug 6, 2026
6 checks passed
@REPPL
REPPL deleted the bughunt-31 branch August 6, 2026 13:37
@REPPL REPPL mentioned this pull request Aug 6, 2026
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