core/tests/test_serve_quarantine_transitive.py
Shay 5e0f0e5f0b feat(adr-0243): wire ADR-0240 PASS into integrate_biography (Phase 3 Lane C)
First live caller of integrate_biography (previously zero production call
sites). New core/physics/biography_wiring.py: report-level PASS gate
(report.wrong == 0 AND >=1 correct transfer; refusals don't block but
all-refused validates nothing), I-01 closure asserts re-checked at the
wiring seam (fail-closed typed BiographyIntegrationError), and a net-new
append-only BiographyProvenanceRecord binding report evidence to the
integrated trajectory hash (AuthorshipProposal-style closure proof in a
TurnEvent-style audit role).

Design ruling (Shay, 2026-07-17, brief open question): direct integration,
structurally pinned — integrate_biography is a pure recompute
(reconstruction-over-storage), so D-5/I-03 proposal gating does not attach;
the ruling is enforced by a test pinning that the wiring imports no vault
store and no evals package (report typed structurally, no core->evals
import). Module registered in the never-serve lazy tier + _BANNED +
third-door banned lists. cognitive_lifecycle.py untouched (Lane C touches
zero Phase-2 code).
2026-07-17 10:49:44 -07:00

62 lines
2.4 KiB
Python

"""A-04 (transitive) — the serve process must not LOAD the wave/fibonacci substrate.
The existing `test_phase0_a04_serve_path_quarantines_wave_and_fibonacci` walks only
`chat/runtime.py`'s own AST import nodes, so it catches DIRECT imports only. The
stated invariant is process-level ("serve path stays quarantined"; modules labelled
"never serve"). This pin enforces the stated invariant: importing `chat.runtime` in
a clean interpreter must not pull any banned module into `sys.modules`.
RED until the `core/physics/__init__.py` barrel stops eagerly importing the
off-serving substrate (Finding #2, docs/research/adr-0241-0242-adversarial-and-fidelity-findings.md).
"""
from __future__ import annotations
import subprocess
import sys
from pathlib import Path
_ROOT = Path(__file__).resolve().parents[1]
# Genuinely off-serving; must never load into the serve process.
_BANNED = (
"core.physics.holographic_vault",
"core.physics.fibonacci_search",
"core.physics.fibonacci_word_schedule",
"core.physics.atlas_packing",
"core.physics.wave_seam",
"core.physics.wave_energy_boundary",
"core.physics.multi_scale_energy",
"core.physics.sensorium_wave_feed",
"core.physics.cognitive_lifecycle", # ADR-0243 lifecycle — never serve
"core.physics.biography_wiring", # ADR-0243 §2.5 PASS→biography wiring — never serve
# NOTE: core.physics.wave_manifold is intentionally excluded pending the
# Joshua design ruling (goldtether delegates to it). Add it here if the
# ruling is "quarantine wave_manifold for real".
)
def test_import_chat_runtime_does_not_load_offserving_substrate():
probe = (
"import importlib, sys, json;"
"importlib.import_module('chat.runtime');"
f"banned={list(_BANNED)!r};"
"leaked=sorted(m for m in sys.modules for b in banned if m==b or m.startswith(b+'.'));"
"print(json.dumps(leaked))"
)
result = subprocess.run(
[sys.executable, "-c", probe],
cwd=str(_ROOT),
capture_output=True,
text=True,
env={"PYTHONPATH": str(_ROOT), "PATH": ""},
)
assert result.returncode == 0, f"probe failed: {result.stderr[-2000:]}"
leaked = result.stdout.strip().splitlines()[-1]
import json as _json
leaked_list = _json.loads(leaked)
assert not leaked_list, (
"serve process transitively loaded off-serving modules "
f"(A-04 breach via core/physics barrel): {leaked_list}"
)