core/evals/relational_inference/v1/provenance.md
Shay 0be18ebdb9
feat(reader): add overlaps_event finite-verb reader surface (B3) (#783)
Add a closed finite-verb relational surface to comprehend_relational, narrowly:
declarative <A> overlaps <B>, interrogative Does <A> overlap <B>?, predicate
overlaps_event ONLY (closed finite-verb table, default-off).

Kept SEPARATE from the copula-connective grammar (byte-unchanged): the other
connectives (before/after/during/inside/adjacent/…) still REQUIRE the copula, so
"Monday before Friday." stays a refusal — no connective bypass (adversarial hazard #2).

Fail-closed slot gate: each finite-verb argument slot must be EXACTLY ONE content
token (after article stripping). An enumerated adverb/negation blocklist is unbounded
and leaks — the adversarial audit found "Meeting never overlaps lunch." committed as a
POSITIVE overlaps_event(meeting_never, lunch), plus almost/sometimes/trailing-qualifier/
second-verb compound fabrications in BOTH slots and the query path. The single-token
gate closes the whole COMPOUND-fabrication class (any extra token refuses); the
_FINITE_VERB_MODIFIERS and _CONNECTIVE_TOKENS checks add precise reasons for common
bare-modifier / second-verb slots. Multi-word entities in the finite-verb surface are
deferred (they need a positive content lexicon, which OOV entities preclude). A lone
bare token remains an entity (the reader's universal OOV single-token contract — the
copula and general readers behave identically), not a compound fabrication.

Hazards pinned (adversarial audit hazard #1 + #2): adverb absorption, negation-as-
positive ('never'), interrogative double-verb, trailing qualifier, and the copula-bypass
firewall.

Measurement: migrated ref-009 "Sunrise overlaps dawn." (the documented coverage gap) to
a positive rel-018 — comprehension_relational_predicate 17->18, wrong_total 0, breadth
still 11 (coverage added, not a new domain), baseline digest re-frozen. Refusal floor
rose 9 -> 24 (finite-verb confusers replace the one migrated input). The #775 inference
and #781 transitive lane SHA pins are UNTOUCHED. determine.py is untouched (reader-only):
no answer=False, no FrameVerdict, INV-30 unaffected.

Verified in the worktree: finite-verb + reader + reader-lane + #775 inference lane +
#781 transitive lane + #779 OWA floor + capability baseline/index + INV-30/29/21 + full
smoke — all green. Two read-only adversarial passes: the first found 4 real slot-
fabrication blockers, closed by the single-token gate; a black-box probe of 24
adversarial inputs confirms the compound-fabrication class is fully closed.
2026-06-15 14:56:09 -07:00

1.9 KiB

evals/relational_inference/v1 — provenance

Independent gold for the one-hop relational-inference DETERMINE capability (mastery-v2 Step 3). The gold (predicate, subject, object) triples are authored by reading the relational predicate algebra (inverse/converse + symmetric) independently of generate/determine/determine.py and generate/meaning_graph/relational.py (INV-25 / INV-27) — the reader/determiner never produced them.

cases.jsonl — positive coverage (13)

Each case: told fact(s) → determine(query) should assert the entailed relation.

  • 8 INVERSE/converse — both directions of less_than/greater_than, parent_of/child_of, left_of/right_of, before_event/after_event.
  • 5 SYMMETRICsibling_of, spouse_of, equal_to, distinct_from, adjacent_to, each told one direction and queried the other.

A refusal here is a COVERAGE miss (counted refused), never a wrong.

refusals.jsonl — confusers that MUST refuse (8)

Transitive (direct + through-inverse), asymmetric self-converse (less_than, parent_of), cross-predicate (sibling_ofparent_of, greater_thanequal_to), object mismatch, and ungrounded. A Determined on any of these is a wrong=0 breach — the lane test fails loudly.

Resolved coverage gap (B3)

overlaps_event (symmetric, pack-declared graph.edge.symmetric) was previously excluded from the positive gold: the relational reader required a copula ("X is connective Y"), but overlaps is a finite verb. The closed finite-verb reader surface (B3 — <A> overlaps <B> / Does <A> overlap <B>?, see generate/meaning_graph/relational.py::_read_finite_verb_clause) now reads it, so a stored overlap and its symmetric converse determine (proven in tests/test_relational_finite_verb.py). The reader-surface coverage lives in evals/relational; adding a symmetric overlaps_event case to THIS inference lane is optional follow-up.