Skip to content

Three issues: say the right thing, to the right reader, in their language - #95

Merged
peopleworks merged 4 commits into
mainfrom
reader-language-and-turkish-i
Sep 9, 2026
Merged

peopleworks merged 4 commits into
mainfrom
reader-language-and-turkish-i

Conversation

@peopleworks

Copy link
Copy Markdown
Owner

Three issues from the open list, all of the same family: what the product says to the person reading it. None moves the published number, none needs the committee.

#62 — Turkish is not a disguise

U+0131 DOTLESS I sat in the lookalike table and flagged Fazıl, Kıbrıs, Rıza, Komandoları — spelled correctly — in a Spanish article about a Turkish organisation. The one check this project presents as a fact rather than a judgement was stating a false one, about proper names from a third language.

Measured before changing anything, as the rule pack policy requires: U+0131 occurs in 1 of the 371 texts we hold, and that one is Turkish names. The three IPA entries occur in none. With a base that thin, the issue's proposed three-signal heuristic would have been fitted to a single document.

So instead this applies the principle the table's own comment already stated — accented Latin letters are absent because á and ñ are ordinary Spanish — which had only ever been applied to the two languages we ship. The line is not "Latin or not" but is this a letter of some living alphabet. The remaining three survive it as IPA symbols, which no orthography writes prose with.

The cost, stated plainly: a substitution swapping i for ı is no longer caught. Never observed, and this check errs toward a missed artifact over a false accusation — the direction IsEmojiLike already states.

#88 — the scan speaks to the reader

U+00A0 is U+00A0 in every language, and "ask the writer how this document was produced" is an instruction, not commentary. Both the character scan and the citation cross-check took the analysed text's pack, so an English teacher opening a Spanish essay got the chrome in English and the body in Spanish. #36 settled this for the evidence report in August; these two kept the older behaviour everywhere — web, desktop, Word pane, CLI.

Analyze() gains an optional readerLanguage. Null follows the text, so every existing caller is unchanged. Findings are deliberately untouched: a finding quotes the text and argues about it.

#77 — a Spanish report, and one that is actually Spanish

Two defects, and only the first was in the issue.

  1. The CLI never set InterfaceLanguage, so report.es.json was unreachable from a command line. It now follows --reader-lang.
  2. The report then came out half English. report.es.json carried 39 of 76 blocks — the mandatory core was current and tested, but completeness never was. The other 37 are translated here, in the register the file already uses.

Worth flagging: the existing test asserted the fallback markers were present. It had pinned the symptom as the specification, which is why nothing failed while half the report was English. It now asserts the opposite, keeps the announcement invariant for whenever a block does fall back, and a new guard requires every printable block to exist in Spanish.

Verification

One deliberate deviation: #77 proposed --report-lang. Since #88 gave the CLI a second thing that needs the reader's language, two flags that must always agree would be a trap — there is one, named for what it means.

🤖 Generated with Claude Code

https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF

peopleworks and others added 4 commits September 8, 2026 22:42
Closes #62.

U+0131 sat in the lookalike table under "Latin letters that are not the ASCII
one they look like", and flagged Fazil, Kibris, Riza and Komandolari -- with
their real spelling -- in a Spanish article about a Turkish organisation. The
one check this project presents as a fact rather than a judgement was stating
a false one, and doing it to proper names from a third language, which is the
exact harm the calibration page exists to measure.

The table's own comment already had the right principle -- accented Latin
letters are absent because "a" and "n" are ordinary Spanish -- but it had been
applied only to the two languages we ship. So the line is not "Latin or not"
but whether the character is a letter of some living alphabet. The three
remaining entries survive it as IPA symbols, which no orthography writes prose
with.

Measured before changing anything: U+0131 occurs in 1 of the 371 texts we
hold, and that one is Turkish names. The IPA three occur in none. With a base
that thin, a multi-signal heuristic would be fitted to a single document, so
this applies the stated principle instead.

The cost, stated plainly: a substitution swapping i for dotless i is no longer
caught. Never observed, and this check errs toward a missed artifact over a
false accusation -- the direction IsEmojiLike already states.

Verified by mutation: the new test fails with the entry restored.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
…e text

Closes #88.

Both state facts about the file rather than judgements of its prose, and
everything they say is addressed to whoever is reading: U+00A0 is U+00A0 in
every language, and "ask the writer how this document was produced" is an
instruction, not commentary. They took the analysed text's rule pack, so an
English teacher opening a Spanish essay got the panel's chrome in English and
its body in Spanish.

#36 settled this for the evidence report in August. These two kept the older
behaviour, in the web app, the desktop, the Word pane and the CLI alike.

Analyze() gains an optional readerLanguage. Null follows the text, so every
caller that never heard of this keeps the behaviour it had; the surfaces with
an interface of their own now pass it. Findings are deliberately untouched: a
finding quotes the text and argues about it, and a Spanish tell explained in
Spanish is the useful form.

Batch and the live rewriter read only numbers off the result, so they are left
alone rather than changed for symmetry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
…Spanish

Closes #77.

Two defects, and only the first was in the issue.

The CLI built its ReportOptions without ever setting InterfaceLanguage, so
report.es.json was unreachable from a command line whatever you passed. It now
follows --reader-lang, defaulting to the analysed language. That one option
also carries the reader's language into the analysis, which is #88's CLI
surface: two flags that must always agree would be a trap, so there is one.

Then the report came out half English. report.es.json carried 39 of the 76
blocks: the mandatory core was current -- and tested -- but completeness was
never checked, so a Spanish report opened in Spanish and said "Este bloque aun
no esta traducido" six times. The other 37 are translated here, matching the
register the file already uses (usted, and the project's established terms:
oraciones, variabilidad, punto de codigo, senales).

Worth recording: the existing test asserted the markers were *present*. It had
pinned the symptom as the specification, and it is the reason nothing failed
while half the report was English. It now asserts the opposite, keeps the
announcement invariant for whenever a block does fall back, and a new guard
requires every block the report can print to exist in Spanish.

Verified: the report the issue's own command produces carries zero fallback
markers. 441 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
Today's other lesson was that an option nobody wrote down is an option the
next reader does not have. The README's CLI block and SKILL.md both list the
flags; this adds the new one and the distinction it turns on -- --lang is the
text, --reader-lang is the person reading.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PEbbiYSNPw7jE3LrPNhyF
@peopleworks
peopleworks merged commit 08c02c2 into main Sep 9, 2026
4 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