30 lines
1.6 KiB
Python
30 lines
1.6 KiB
Python
from __future__ import annotations
|
|
import json, sys
|
|
from pathlib import Path
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SCRIPTS = ROOT / "scripts"
|
|
sys.path.insert(0, str(SCRIPTS))
|
|
import production_e2e_monitor, profile_persistence_regression, answer_quality_audit, skill_sync_admission_gate, long_term_validation_dashboard
|
|
|
|
def test_governance_contract_lists_five_controls() -> None:
|
|
data=json.loads((ROOT/"references/cross_project_contract/production_governance_controls_2026_07_19.json").read_text())
|
|
assert [c["id"] for c in data["controls"]] == ["production_e2e_monitor","profile_persistence_regression","answer_quality_audit","skill_sync_admission_gate","long_term_validation_dashboard"]
|
|
|
|
def test_production_e2e_monitor_uses_existing_pass_context() -> None:
|
|
assert production_e2e_monitor.run()["status"] == "pass"
|
|
|
|
def test_profile_persistence_blocks_without_credentials(monkeypatch) -> None:
|
|
monkeypatch.delenv("JYOTISHA_PRODUCTION_BASE_URL", raising=False)
|
|
monkeypatch.delenv("JYOTISHA_PRODUCTION_COOKIE", raising=False)
|
|
assert profile_persistence_regression.run()["status"] == "blocked"
|
|
|
|
def test_answer_quality_blocks_forbidden_claims() -> None:
|
|
assert answer_quality_audit.audit_answer("保证发财")["status"] == "fail"
|
|
assert answer_quality_audit.audit_answer("给出候选窗口,不保证具体日期")["status"] == "pass"
|
|
|
|
def test_sync_gate_and_dashboard_are_safe() -> None:
|
|
assert skill_sync_admission_gate.run()["status"] == "pass"
|
|
dash = long_term_validation_dashboard.run()
|
|
assert dash["items"]["commercial_e2e"] == "pass"
|
|
assert dash["items"]["day_month_holdout"] == "awaiting_independent_labels"
|