core/tests/test_determination_surface.py
Shay dc06bd5a3c feat(runtime): surface the determination — the engine answers from accrued knowledge (Step B-2)
When accrue_realized_knowledge is on and a question turn is Determined over realized
knowledge, the user-facing surface IS that answer (generate.determine.render_determination):
'Yes — as I was told, truth is a concept.' The realizer's articulation_surface is
RETAINED as evidence — the determination is a user-facing SELECTION (like the
unknown-domain gate), not a rewrite. An Undetermined turn keeps the default
articulation surface (the honest 'I don't know'); flag-off never takes this path.

Basis is rendered honestly: SPECULATIVE grounds read 'as I was told', never 'verified'
(D0 only asserts answer=True, so the surface is an affirmation — no fabricated or
asserted-False string). Selection only: no field op, no normalization, proposes no
learning (HITL untouched).

Updates docs/runtime_contracts.md selection policy + adds the contract test in the
same PR (per the surface-contract discipline).
2026-06-06 10:52:54 -07:00

94 lines
4 KiB
Python

"""Step B-2 — surface the determination: the engine answers from accrued knowledge.
When a question turn is Determined over realized knowledge, the user-facing ``surface``
IS that answer (rendered honestly: "as I was told", never "verified"). The realizer's
``articulation_surface`` is retained as evidence — the determination is a selection, not
a rewrite. Undetermined and flag-off keep the default surface. This is the contract test
for the selection policy in docs/runtime_contracts.md.
"""
from __future__ import annotations
from dataclasses import replace
import pytest
from chat.runtime import ChatRuntime
from core.config import RuntimeConfig
from generate.determine import Determined, render_determination
# --------------------------------------------------------------------------- #
# render_determination — deterministic, honest basis (unit, no runtime)
# --------------------------------------------------------------------------- #
def test_render_member_reads_naturally() -> None:
d = Determined(answer=True, basis="as_told", predicate="member",
subject="truth", object="concept", grounds=())
assert render_determination(d) == "Yes — as I was told, truth is a concept."
def test_render_relational_predicate_is_legible() -> None:
d = Determined(answer=True, basis="as_told", predicate="parent_of",
subject="alice", object="bob", grounds=())
assert render_determination(d) == "Yes — as I was told, alice parent of bob."
def test_render_basis_is_honest_never_overclaims() -> None:
# SPECULATIVE grounds → "as I was told" (today's only case); COHERENT would be the
# only thing that renders "verified". The render must never overclaim.
as_told = Determined(True, "as_told", "member", "truth", "concept", ())
assert "as I was told" in render_determination(as_told)
assert "verified" not in render_determination(as_told)
# --------------------------------------------------------------------------- #
# Surface selection in the live turn (integration)
# --------------------------------------------------------------------------- #
@pytest.fixture(scope="module")
def accrued_runtime() -> ChatRuntime:
rt = ChatRuntime(
config=replace(RuntimeConfig(), accrue_realized_knowledge=True),
no_load_state=True,
)
rt.chat("Truth is a concept.") # accrue the fact this module's questions probe
return rt
def _default_surface(text: str) -> str:
rt = ChatRuntime(config=RuntimeConfig(), no_load_state=True)
rt.chat("Truth is a concept.")
return rt.chat(text).surface
def test_determined_question_surfaces_the_answer(accrued_runtime) -> None:
response = accrued_runtime.chat("Is truth a concept?")
assert response.surface == "Yes — as I was told, truth is a concept."
# the realizer surface is retained as evidence, distinct from the selection
assert response.articulation_surface
assert response.surface != response.articulation_surface
def test_determined_surface_does_not_rewrite_articulation(accrued_runtime) -> None:
# The determination SELECTS the surface; the articulation_surface is the same
# evidence the default (flag-off) turn produces.
response = accrued_runtime.chat("Is truth a concept?")
off = ChatRuntime(config=RuntimeConfig(), no_load_state=True)
off.chat("Truth is a concept.")
off_response = off.chat("Is truth a concept?")
assert response.articulation_surface == off_response.articulation_surface
def test_undetermined_question_keeps_default_surface(accrued_runtime) -> None:
response = accrued_runtime.chat("Is truth a virtue?") # never told → Undetermined
# not an affirmation; the honest default surface (== the flag-off surface)
assert not response.surface.startswith("Yes — as I was told")
assert response.surface == _default_surface("Is truth a virtue?")
def test_flag_off_never_surfaces_a_determination() -> None:
surface = _default_surface("Is truth a concept?")
assert not surface.startswith("Yes — as I was told")