Skip to content

The first real pair said negative: rank on meaning, and let the same subject disagree - #212

Merged
Parshkov merged 1 commit into
mainfrom
claude/engine-same-subject
Sep 7, 2026
Merged

The first real pair said negative: rank on meaning, and let the same subject disagree#212
Parshkov merged 1 commit into
mainfrom
claude/engine-same-subject

Conversation

@Parshkov

@Parshkov Parshkov commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Two real people, driven through claude.ai and ChatGPT as ordinary clients. One had reasoned about a registry of how employers treat candidates; the other, independently and in another domain, about a registry of how landlords treat tenants. Step for step it was the same construction — including the cold start and the need for an organisation that already holds the histories.

The engine returned negative, and put a template coincidence above it.

candidate verdict structural semantic contradiction
"overtime in a ward" (coincidence) negative 0.305 0.120 0.000
the actual twin negative 0.186 0.590 0.214

Four defects, none visible to the suite or to Benchmark v0.2.

1. Ranking read one component. _verified_sort_key ordered by structural alone — and shape alone is exactly what cannot tell a coincidence from a match, which is why semantic is computed. Now 0.65·structural + 0.35·semantic. Classification untouched.

2. The same-subject branch demanded contradiction == 0.0 exactly. The 0.214 came from two crossed correspondences. That is a disagreement about which is the first cause — and when the two people were introduced and asked, the second answered that the root is the asymmetry of power at the moment of the deal, not the invisibility of the information. The engine had used the most interesting thing about the pair as its reason to hide them from each other. Same subject now buys a higher ceiling (0.35), not immunity; h_sign_conflict still hard-rejects real polarity conflicts.

3. The contract demanded English labels. An assistant driving a Russian conversation translated first and honestly downgraded authorship to their_words_reorganised — a translation is the assistant's phrasing, and it is that phrasing which then gets matched. It also defeated the multilingual encoder production runs.

4. The chat drawing was not the page's drawing. Dots on rings by structural score, telling a different story from the list beside it, and printing one pseudonym twice for two thoughts. It is now the same seven-axis radar the page draws — same axes, same order, same two inversions — one polygon per match, each row naming the thought.

Why this is not tuning the gate away

Benchmark v0.2 passes unchanged on both splits, gold unedited: accuracy 1.0, negative FPR 0.0, polarity rejection 1.0, Recall@5/@20 1.0. same_vocabulary_wrong_structure — the family designed to catch exactly this loosening — stays negative.

The gap was that the benchmark has no case for two people on the same subject who order the causes differently. Production produced one. It is now tests/test_same_subject_resonance.py, built from the measured components, not authored fixtures. Recorded in ADR-0007.

Not fixed, stated plainly

Prose extraction is English-only, down to its sentence splitting and clause boundaries. A Russian conversation yields an honest empty graph and the assistant supplies the structure instead. Multilingual extraction is a real mission with its own gate — now §5 of the roadmap.

690 tests OK (1 skipped)   both gates pass, gold unedited

🤖 Generated with Claude Code

…subject disagree

Two real people were driven through claude.ai and ChatGPT as ordinary clients.
One had reasoned about a public registry of how employers treat candidates; the
other, independently and in another domain, about a registry of how landlords
treat tenants. Step for step it was the same construction: conduct is private
and scattered, so the decision is blind; it costs the stronger party nothing,
so it repeats; a registry makes conduct visible before the decision and deters
it; the real constraint is the cold start, which needs an organisation that
already holds the histories.

The engine returned negative, and returned a template coincidence above it.
Measured on production: the coincidence at structural 0.305 / semantic 0.120,
the twin at 0.186 / 0.590 / contradiction 0.214. Four defects, none of them
visible to the suite or to Benchmark v0.2.

Ranking read one component. `_verified_sort_key` ordered by `structural` alone,
so shape without meaning led the list -- and shape alone is exactly what cannot
tell a coincidence from a match, which is why `semantic` is computed at all. It
now ranks on 0.65 structural + 0.35 semantic, with structural as the tie-break.
Classification is untouched: a coincidence is still negative, it just no longer
leads.

The same-subject branch demanded contradiction == 0.0 exactly. The pair had
0.214, from two crossed correspondences -- one person's "learning after the
fact" laid over the other's "no cost to the landlord", and the reverse. That is
not noise. It is a disagreement about which is the first cause, and when the
two were introduced and asked, the second answered that the root is the
asymmetry of power at the moment of the deal, not the invisibility of the
information. The engine had used the most interesting thing about the pair as
its reason to hide them from each other. Same subject now buys a higher
contradiction ceiling, not immunity; polarity conflicts are still hard-rejected
by h_sign_conflict. Policy .../same-subject/0.4, ADR-0007.

The tool contract demanded English labels, so an assistant driving a Russian
conversation translated the reasoning first -- and said so, honestly
downgrading authorship to their_words_reorganised, because a translation is the
assistant's phrasing and it is that phrasing which then gets matched. It also
defeated the multilingual encoder the deployment actually runs. The contract now
says the index compares meaning across languages and names any script it cannot
read. Written declaratively: the descriptions say what the server does rather
than instructing the model, which is a rule the suite enforces and my first
draft broke.

The chat drawing was not the page's drawing. It placed dots on rings by
structural score, so it told a different story from the list beside it, and it
printed one pseudonym twice when a person had two matching thoughts with no way
to tell which dot was which. It is now the same seven-axis radar the page draws
-- same axes, same order, same two inversions -- one polygon per match, each
legend row naming the thought.

Benchmark v0.2 passes unchanged on both splits with gold unedited, including
same_vocabulary_wrong_structure, the family designed to catch exactly this
loosening. The gap was that the benchmark has no case for two people on the
same subject who order the causes differently. Production produced one, and it
is now tests/test_same_subject_resonance.py, built from the measured components
rather than from authored fixtures.

Not fixed, and now stated plainly in the contract and the roadmap: prose
extraction is English-only, down to its sentence splitting and clause
boundaries. A Russian conversation yields an honest empty graph and the
assistant supplies the structure instead. Making it multilingual is a real
mission with its own gate, not more regular expressions.

690 tests OK, both gates pass with gold unedited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Parshkov
Parshkov merged commit f97446c into main Sep 7, 2026
3 checks passed
@Parshkov
Parshkov deleted the claude/engine-same-subject branch September 7, 2026 02:26
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