A list of data is not a tricolon - #101
Merged
Merged
Conversation
Closes #100. rhet.rule-of-three matched any three word-characters, so it could not tell a rhetorical tricolon ("fast, simple, and powerful") from an author listing three values. #100 found it on "2324, 2425 and 2526" in a support-ticket reply and measured it: 18 of the rule's 236 corpus matches are lists like that -- gene names, dose numbers, year codes -- and six texts had no other hit. The narrowing is in the pack, not in C#, so the rule stays editable by anyone: a list is skipped when none of its three items contains a lowercase letter. Two traps shaped the regex: - PatternAnalyzer compiles every pack pattern with IgnoreCase, so an uppercase class would match prose too. The token class is wrapped in (?-i:...). - \p{Lu}, not [A-Z]: an ASCII class misses an accented acronym, which is what the Turkish dotless i taught this project a week ago. Mixed lists still fire ("CD31, CD45, and cells"): requiring all three items to be data is the conservative reading #100 argued for. The Spanish twin, rhet.regla-de-tres, gets the same narrowing. The Spanish corpus cannot judge it -- 14 matches, none of them data -- but the reasoning is language-independent, and leaving the two packs asymmetric is how a sibling goes stale. Published numbers: unchanged in every field. The calibration run was compared before and after the regex change, and the only fields that differ from the committed file are engine and measuredOn -- which is why that file is not regenerated here. humanRatePer1000 is deliberately left at 1.09: it was measured on a superset of these matches, so it is now slightly generous, and refitting one rule's rate in isolation is the trap #75 describes. SKILL.md told agents to "vary the count" on tricolons, which in edit mode would rewrite someone's data. It now says a list of data is not one. Verified by mutation: with the original regexes, all 12 data-list tests fail. 393 + 72 + 7, plus the desktop job's 31. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
peopleworks
added a commit
that referenced
this pull request
Sep 16, 2026
Bumped here rather than in a later release PR, on purpose. Pages deploys on merge, and the download page builds the installer's URL from DesktopRelease.Version: merging the page change at 0.8.0 would point the primary button at desktop-v0.8.0, which has no Setup.exe. The version and the page have to land together. All seven declarations, held together by ReleaseVersionTests. Merge #101 first, so v0.8.1 carries the rule-of-three fix. Then cut desktop-v0.8.1 before v0.8.1: until that tag exists, the button 404s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #100.
rhet.rule-of-threematched any three word-characters, so it could not tell a rhetorical tricolon — "fast, simple, and powerful" — from an author listing three values. #100 found it on "2324, 2425 and 2526" in a support-ticket reply, and measured it: 18 of the rule's 236 corpus matches are lists like that (gene names, doses, year codes), and six texts had no other hit. Reproduced exactly before changing anything.The narrowing
In the pack, not in C#, so the rule stays editable by anyone. A list is skipped when none of its three items contains a lowercase letter:
Two traps shaped it, and both are pinned by tests:
PatternAnalyzercompiles every pack pattern withIgnoreCase, so an uppercase class would match prose too and silently switch the rule off. The token class is wrapped in(?-i:…). If that ever stops working, "fast, simple, and powerful" stops firing and the test says so.\p{Lu}, not[A-Z]— an ASCII class missesÁREA, ÉPOCA y ÍNDICE. Same lesson as the Turkish dotless ı in The character scanner reads Turkish dotless i as an artifact #62.Mixed lists still fire (
CD31, CD45, and cells): requiring all three to be data is the conservative reading #100 argued for.The Spanish twin
rhet.regla-de-tresgets the same narrowing. The Spanish corpus cannot judge it — 14 matches, none of them data — but the reasoning is language-independent, and leaving the packs asymmetric is how a sibling goes stale.Published numbers: unchanged in every field
The calibration run was compared field by field before and after the regex change. A baseline run first confirmed the tool reproduces the committed file exactly except
engineandmeasuredOn; the run with the new regex differs from that baseline in zero fields. Sopublished-calibration.jsonis not regenerated here, and no committee is needed.humanRatePer1000stays at 1.09 on purpose. It was measured on a superset of these matches, so it is now slightly generous — and refitting one rule's rate in isolation is the trap #75 describes. It will be refreshed with the next fullthresholdsrun.A sibling
SKILL.mdtold agents to "vary the count" on tricolons. In edit mode that rewrites someone's data. It now says a list of data is not a tricolon.Verification
Thanks to whichever terminal filed #100 — it arrived measured, with a proposal and the open questions named, which is what made this a half-day fix.
🤖 Generated with Claude Code
https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF