Six specific test gaps were identified during code review. Each gap means a corresponding bug (#47–#50) can regress or remain broken without any CI signal.
1. BoneToken.entry round-trip through compress/decompress
test_round_trip_dict checks bone_count matches but does not verify per-token entry fields. Finding #50 (entry={} after decode) is not caught. Add an assertion that token.entry equals the original canon dict after a full compress → decompress cycle.
2. Affix false positives
test_affix_stripping covers true positives ("unhappy" → affix bone). No test verifies that words like "uncle", "unit", "universe" are not classified via the un- prefix. Finding #49 (over-fire) has no coverage. Add a negative test using a word whose stripped residual is not a real stem.
3. Monologue / single-speaker transcripts
No fixture tests a transcript where all turns share the same speaker. The round-builder boundary logic is untested for the degenerate case (no speaker change = no natural round close).
4. SYS/TOOL turn exclusion from round anchoring
core/parsing/round_builder.py excludes SYS/TOOL turns from round-closure; backend/src/edcmbone/parser/turns_rounds.py does not. No test exercises a transcript containing SYS/TOOL turns to verify either parser's behavior, let alone their divergence.
5. Smart-apostrophe input through parser tokenization
Tests/test_backend.py::test_tokenize_ascii_apostrophe_contraction covers stats.py::_WORD_RE but not parser/turns_rounds.py::_WORD_RE. Input containing U+2019 (') contractions is untested through the parser path.
6. normalizer.py no-op replace
Finding #47: .replace("'", "'") is a no-op. No test feeds a smart-quote contraction through normalize_text_for_matching and asserts that the output contains an ASCII apostrophe. The bug is dormant and undetected for any real-world word-processed input.
Six specific test gaps were identified during code review. Each gap means a corresponding bug (#47–#50) can regress or remain broken without any CI signal.
1.
BoneToken.entryround-trip through compress/decompresstest_round_trip_dictchecksbone_countmatches but does not verify per-tokenentryfields. Finding #50 (entry={}after decode) is not caught. Add an assertion thattoken.entryequals the original canon dict after a full compress → decompress cycle.2. Affix false positives
test_affix_strippingcovers true positives ("unhappy" → affix bone). No test verifies that words like "uncle", "unit", "universe" are not classified via theun-prefix. Finding #49 (over-fire) has no coverage. Add a negative test using a word whose stripped residual is not a real stem.3. Monologue / single-speaker transcripts
No fixture tests a transcript where all turns share the same speaker. The round-builder boundary logic is untested for the degenerate case (no speaker change = no natural round close).
4. SYS/TOOL turn exclusion from round anchoring
core/parsing/round_builder.pyexcludes SYS/TOOL turns from round-closure;backend/src/edcmbone/parser/turns_rounds.pydoes not. No test exercises a transcript containing SYS/TOOL turns to verify either parser's behavior, let alone their divergence.5. Smart-apostrophe input through parser tokenization
Tests/test_backend.py::test_tokenize_ascii_apostrophe_contractioncoversstats.py::_WORD_REbut notparser/turns_rounds.py::_WORD_RE. Input containing U+2019 (') contractions is untested through the parser path.6.
normalizer.pyno-op replaceFinding #47:
.replace("'", "'")is a no-op. No test feeds a smart-quote contraction throughnormalize_text_for_matchingand asserts that the output contains an ASCII apostrophe. The bug is dormant and undetected for any real-world word-processed input.