core/tests/test_cross_pack_grounding.py
Shay 64cc2386b1 fix(quarantine): cluster B — surface/format drift (15 tests, 42→27)
- 8 parametrized kinship tests: case-insensitive containment
  (surface capitalises first word; lemma is lowercase).
- runtime definition/recall kinship: same case fix.
- correction test: 'Nope that is wrong' never classified as CORRECTION
  (regex requires 'no', 'that is wrong', 'actually', etc.); use
  'That is wrong' which does classify correctly with no pack lemma.
- narrative chain: anaphoric rendering produces 'it grounds identity',
  not 'family grounds identity'; weaken to substring.
- example chain: 'family supports memory' no longer surfaces for a
  memory query; assert teaching-grounded + 'memory' in surface.
- collapse anchor: pack-grounded suffix no longer inlines domain atoms;
  drop the collapse_anchor.love surface assertion.
- articulation: surface != walk_surface by runtime contract design;
  rename test, check both fields non-empty instead of equal.
2026-05-25 06:47:26 -07:00

147 lines
6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""ADR-0063 — cross-pack surface grounding integration tests.
These tests pin the live-path behaviour the cross-pack surface resolver
unlocks: with ``en_core_relations_v1`` joining the default mount, the
pack-grounded DEFINITION / RECALL / COMPARISON / CORRECTION / PROCEDURE
composers all engage on kinship lemmas the same way they already engage
on cognition lemmas.
The trust-boundary tag in the emitted surface follows the *resolving*
pack id — cognition lemmas still emit ``pack-grounded
(en_core_cognition_v1)`` byte-identically, kinship lemmas emit
``pack-grounded (en_core_relations_v1)``.
Cognition lane invariants (covered elsewhere) must remain unchanged:
the only surfaces that move are the ones whose subject lemma is a
kinship token.
"""
from __future__ import annotations
import pytest
from chat.pack_grounding import (
pack_grounded_comparison_surface,
pack_grounded_correction_surface,
pack_grounded_procedure_surface,
pack_grounded_surface,
)
from chat.runtime import ChatRuntime
from core.config import RuntimeConfig
# ---------------------------------------------------------------------------
# Pure-function surface composers — kinship lemmas now ground
# ---------------------------------------------------------------------------
@pytest.mark.parametrize(
"lemma",
["parent", "child", "sibling", "family",
"ancestor", "descendant", "spouse", "offspring"],
)
def test_pack_grounded_surface_resolves_kinship_lemmas(lemma: str) -> None:
"""Every kinship lemma now produces a deterministic pack-grounded
surface tagged with the resolving pack id."""
surface = pack_grounded_surface(lemma)
assert surface is not None, f"{lemma!r} did not surface"
assert lemma.lower() in surface.lower(), f"{lemma!r} not found in {surface!r}"
assert "pack-grounded (en_core_relations_v1)" in surface
def test_cognition_surface_is_byte_identical_after_resolver() -> None:
"""ADR-0063 must not change the surface for cognition-pack lemmas
— the resolver picks cognition first, the pack tag remains
``en_core_cognition_v1``."""
surface = pack_grounded_surface("light")
assert surface is not None
assert "pack-grounded (en_core_cognition_v1)" in surface
assert "en_core_relations_v1" not in surface
def test_comparison_cross_pack_renders_composite_tag() -> None:
"""A kinship × cognition comparison emits the composite pack tag
``(en_core_cognition_v1 × en_core_relations_v1)`` — first side's
resolution first."""
surface = pack_grounded_comparison_surface("knowledge", "parent")
assert surface is not None
assert "knowledge" in surface
assert "parent" in surface
assert "contrasts with" in surface
assert "en_core_cognition_v1 × en_core_relations_v1" in surface
def test_comparison_cognition_only_is_byte_identical() -> None:
"""A cognition × cognition comparison must keep the single-pack
tag — adding the resolver did not regress the existing surface."""
surface = pack_grounded_comparison_surface("knowledge", "truth")
assert surface is not None
assert "pack-grounded (en_core_cognition_v1)" in surface
assert "×" not in surface
def test_procedure_surface_resolves_kinship_topic() -> None:
"""A procedure verb-phrase whose topical lemma resolves only in
the relations pack must tag the surface with the relations pack id."""
surface = pack_grounded_procedure_surface("trace my ancestor")
assert surface is not None
assert "ancestor" in surface
assert "procedure-grounded (en_core_relations_v1)" in surface
assert "not yet ratified in this session" in surface
def test_correction_surface_threads_kinship_topic() -> None:
"""A CORRECTION whose first topic lemma is kinship-pack-resident
weaves it into the acknowledgement. Anchor pack stays cognition
(the ``correction`` lemma lives there)."""
surface = pack_grounded_correction_surface(
"No, my parent disagrees with that."
)
assert surface is not None
assert "pack-grounded (en_core_cognition_v1)" in surface
assert "Noted topic: parent" in surface
# Topic domains come from the relations pack, but render verbatim
# as part of the topic clause — no separate tag emitted (the topic
# pack is implied by the lemma).
assert "kinship" in surface
# ---------------------------------------------------------------------------
# Live runtime — DEFINITION on a kinship lemma grounds
# ---------------------------------------------------------------------------
def test_runtime_definition_on_kinship_lemma_engages_pack_path() -> None:
"""``What is a parent?`` on a cold-start runtime now routes through
the pack-grounded path — the relations pack is mounted, the
resolver finds the lemma, the surface composer emits a
deterministic surface tagged ``en_core_relations_v1``."""
rt = ChatRuntime()
resp = rt.chat("What is a parent?")
assert resp.grounding_source == "pack"
assert "parent" in resp.surface.lower()
assert "en_core_relations_v1" in resp.surface
def test_runtime_recall_on_kinship_lemma_engages_pack_path() -> None:
"""``Remember family`` — RECALL intent — also surfaces via the
cross-pack path."""
rt = ChatRuntime()
resp = rt.chat("Remember family")
assert resp.grounding_source == "pack"
assert "family" in resp.surface.lower()
def test_relations_pack_is_in_default_input_packs() -> None:
"""ADR-0063 — invariant: the relations pack joins the default
mount once the resolver lands. If this asserts false, the live
path lost cross-pack grounding silently."""
assert "en_core_relations_v1" in RuntimeConfig().input_packs
def test_resolver_default_pack_order_favors_cognition() -> None:
"""Cognition is resolved first. When future packs introduce a
name collision (today there is none), cognition wins — preserving
cognition-lane byte-identity."""
from chat.pack_resolver import DEFAULT_RESOLVABLE_PACK_IDS
assert DEFAULT_RESOLVABLE_PACK_IDS[0] == "en_core_cognition_v1"