Skip to content

Read Russian prose, because the engine already matched it - #219

Merged
Parshkov merged 1 commit into
mainfrom
claude/extract-russian-prose
Sep 7, 2026
Merged

Read Russian prose, because the engine already matched it#219
Parshkov merged 1 commit into
mainfrom
claude/extract-russian-prose

Conversation

@Parshkov

@Parshkov Parshkov commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Found by the owner using his own product in his own language, in the browser.

The asymmetry

Resonance matched Russian thoughts and could not accept one. The matching side has been bilingual for two releases — lexicon 0.3.0 gave all 90 concept classes Russian forms, ADR-0006 put multilingual-e5-small behind the semantic layer. The extraction side was never touched.

The same reasoning, written twice:

nodes relations
Russian 0 0
English 5 3

The person was then shown validation_failed: … Extract the causal structure yourself and call again with \thought`: nodes with roles [...]` — correct guidance for a model calling the tool, unusable for a human, rendered verbatim on the page.

Four subsystems were English-only, and the cue table was the least of them

Adding connectives alone would have changed nothing:

  1. WORD matched [A-Za-z0-9]… — no Cyrillic token at all, so a matched cue still produced empty arguments. The deepest one.
  2. SENTENCE_END required [A-Z"'(\[] after the period, so Russian prose was one unbroken sentence and clause segmentation never ran.
  3. The cue table.
  4. Stopwords, negation, modality, conditionals.

stems() already handled Cyrillic, which is exactly what made this look smaller than it was.

Why English cannot have moved

Russian cues live in _CUE_TABLE_RU, appended after the English table. The alphabets do not overlap, so no Russian pattern can match English prose or the reverse. English is byte-identical, not merely still-passing — the gate reports the same twelve figures before and after:

{"assertion_accuracy": 1.0, "cases": 22, "determinism": 1.0, "edge_f1": 0.9359,
 "edge_precision": 0.9359, "edge_recall": 0.9359, "modality_accuracy": 0.9726,
 "node_f1": 0.9333, "node_precision": 0.9297, "node_recall": 0.937,
 "nonempty_rate": 1.0, "pii_leaks": 0, "role_accuracy": 0.6218}

Two things Russian needs that English does not

  • Modal + infinitive — «может привести к», «могут вызвать» is the ordinary hedged register. Without infinitive forms it was invisible: the first draft read «Короткие смены могут снижать число ошибок» as no relation at all.
  • The comma before «что» — Russian orthography requires it and a comma is a clause break, so «показывают, что X» lost X entirely. English never meets this. The comma is written into those cues, tried before the bare verb; and bare «что» is deliberately not a clause boundary though English that is, because English recovers via AUX_AFTER_THAT and Russian drops the copula.

Deliberately not fixed

Both languages misread the same convoluted sentence the same way — the left argument of a final cue comes from a distant clause rather than the adjacent one. Verified by translating it: English gets the same wrong shape. That is a pre-existing limit of clause selection, not a Russian fault, and fixing it would move frozen English figures. Pinned in a test so the parity is on record rather than rediscovered later as a Russian-only bug.

Evidence

python3 -m unittest discover -s tests          # Ran 722 tests ... OK (skipped=1)
python3 benchmark/extraction-v0.2/runner.py    # pass, metrics identical to before
python3 benchmark/r0-v0.2/runner.py            # pass
python3 ops/lexicon_check.py                   # exit 0

Six of seven relation types parse correctly on Russian test sentences, including reversed direction on «потому что» and a two-link causal chain. The seventh («Это противоречит…») correctly yields nothing: a pronoun with no antecedent, and the extractor does not guess.

Checklist

  • CI is green — 3/3: test suite 9m34s, benchmark gates 41s, lexicon 8s.
  • benchmark/ gold is unedited.
  • Extractor version moved 0.2.00.3.0; ADR-0008 records why. Neither gate is keyed to that version, so no recorded report needed regenerating.
  • ROADMAP §5 corrected — including that it warned against closing this "with more regular expressions", which is what was done, and what narrower argument justifies it. There is still no Russian gold set.
  • No credentials, tokens or private human context committed.

🤖 Generated with Claude Code

Resonance matched Russian thoughts and could not accept one. The
matching side has been bilingual for two releases -- lexicon 0.3.0 gave
all 90 concept classes Russian forms, ADR-0006 put a multilingual
encoder behind the semantic layer -- and extraction was never touched.
The same reasoning written twice gave 5 nodes and 3 relations in
English, 0 and 0 in Russian, and the person was then shown an error
addressed to a language model.

Four subsystems were English-only and the cue table was the least of
them. WORD matched no Cyrillic token at all, so a matched cue still
produced empty arguments. SENTENCE_END wanted a capital Latin letter,
so Russian prose was one unbroken sentence and clause segmentation
never ran. Then the connectives, and the stopword, negation, modality
and conditional sets. stems() already handled Cyrillic, which is what
made this look smaller than it was.

Russian cues live in their own table appended after the English one.
The alphabets do not overlap, so English is byte-identical rather than
merely still-passing: the gate reports the same twelve figures before
and after.

Two things Russian needs that English does not. Modal plus infinitive
is the ordinary hedged register, and without infinitive forms the whole
register was invisible. Russian orthography requires a comma before
'что' and a comma is a clause break, so 'показывают, что X' lost X --
the comma is written into those cues, and bare 'что' is not a clause
boundary even though English 'that' is, because English recovers via
AUX_AFTER_THAT and Russian drops the copula.

The web page also stopped showing the agent-facing failure text. It
already had a human sentence for this; it was only ever reached when
the server said nothing at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Parshkov
Parshkov merged commit 26edef4 into main Sep 7, 2026
3 checks passed
@Parshkov
Parshkov deleted the claude/extract-russian-prose branch September 7, 2026 07:54
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