Files
rune/tests/conftest.py
Nick 37deb6085c feat(provider): provider ownership boundary + PROVIDER_UNAVAILABLE recovery class (T16 16F/16G)
- provider_context.py: require_model() resolves the model from the
  ambient provider context; missing context fails LOUDLY
  (PROVIDER_UNRESOLVED, exit 3) — no silent default provider anywhere.
- t14/t15 builder drivers, evidence_probe, research executor/relay:
  hardcoded 'Verboo Code/glm-5.3-flash' defaults REMOVED (6+ sites);
  provider/model selection now belongs exclusively to the provider
  layer via the ambient context. No caller anywhere set MIMO_MODEL —
  every run silently used the code-chosen provider until now.
- failure_recovery: PROVIDER_UNAVAILABLE class (context-forced; real
  status/API code preserved verbatim in evidence; policy
  block_branch_preserve_error, 0 retries, no fallback — 16G-D).
- tests/test_provider_ownership.py: structural guard (provider names
  in Scaffolding code lines fail the suite; module list live-discovered)
  + 16G held-outs (verbatim codes, zero fallback attempts, resumable
  after block, provider preference never mutates scaffold truth).
- 16U root-cause completion: pyright skew 117⇄124 driven by ambient
  VIRTUAL_ENV/PATH leakage into pyright's interpreter resolution —
  the ratchet now neutralizes ambient-venv signals (PYTHONNOUSERSITE
  was necessary but not sufficient; reproduced and closed).
- spine reconciliation: T15 modules (event_wait, stage_guards,
  failure_recovery, programme_continuation) were missing belongs_to
  relationships in the tracked store while the generated manifest had
  them — registered with SCAFFOLD-TRANCHE-015 evidence; provider_context
  registered under capability; manifest regenerated via export-umbrellas.

Suite 1869 green; ratchets PASS; Henxels rc=0.
2026-09-15 17:02:04 +01:00

61 lines
2.3 KiB
Python

"""tests/conftest.py — suite-wide construction-store isolation.
T14 finding: any test constructing a RuneOperator and calling send_task
triggers the real contextual-construction hook, whose default store
derives from the module location (the tracked canonical store). Test-run
activation records were polluting store/scaffold/current.json (924-line
residue found in commit 2a009a3).
Fix: default EVERY test to a per-test tmp construction store. Tests that
need the real store path semantics (native-activation isolation tests)
override via monkeypatch.setenv, which wins over this fixture.
"""
import os
import sys
from pathlib import Path
import pytest
# W/R bridge code dir (daemon/waitstore live out-of-repo, own snapshot).
# Env-overridable so runner users without $HOME access can point at an
# installed copy — T15 legacy hardcode, resolved T16.
WR_CODE_DIR = Path(os.environ.get(
"RUNE_WR_CODE", "/home/nick/.local/share/mimo-wait-resume"))
if str(WR_CODE_DIR) not in sys.path:
sys.path.insert(0, str(WR_CODE_DIR))
TESTS_DIR = Path(__file__).resolve().parent
REPO_ROOT = TESTS_DIR.parent
if str(REPO_ROOT) not in sys.path:
sys.path.insert(0, str(REPO_ROOT))
@pytest.fixture(autouse=True)
def _isolate_construction_store(tmp_path, monkeypatch):
monkeypatch.setenv("RUNE_CONSTRUCTION_STORE",
str(tmp_path / ".rune" / "scaffold"))
yield
@pytest.fixture(autouse=True)
def _provide_test_provider_context(monkeypatch):
"""T16 §16F: drivers/probes resolve the model from the ambient
provider context (MIMO_MODEL) and fail loudly without one. In tests,
the HARNESS is the surrounding provider layer — so the default test
context provides one, unless a test explicitly removes it (the
PROVIDER_UNRESOLVED held-outs do exactly that)."""
monkeypatch.setenv("MIMO_MODEL", "test-provider/test-model")
@pytest.fixture()
def wr_daemon(tmp_path, monkeypatch):
"""Real W/R daemon subprocess on an isolated WR_ROOT + ephemeral port.
Shared by test_event_wait.py (T15) and test_ci_event_wait.py (T16)."""
monkeypatch.setenv("RUNE_WR_ROOT", str(tmp_path)) # adapter binds here
monkeypatch.setenv("RUNE_WR_CODE", str(WR_CODE_DIR))
from tests.test_event_wait import Daemon
d = Daemon(tmp_path)
yield d
d.stop()