- 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.
61 lines
2.3 KiB
Python
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()
|