Upload 95 files
Browse files- tests/test_v129_action_gating_polish.py +3 -3
- tests/test_v134_dependency_build_error_guardrail.py +1 -2
- tests/test_v138_critical_demo_fixes.py +2 -2
- tests/test_v139_trace_availability_gating.py +30 -0
- tests/test_v140_dependency_stack_and_build_error_detection.py +31 -0
- tests/test_v141_build_error_observer_agentic_repair.py +30 -0
- tests/test_v142_pi_agent_token_context.py +33 -0
tests/test_v129_action_gating_polish.py
CHANGED
|
@@ -6,7 +6,7 @@ ROOT = Path(__file__).resolve().parents[1]
|
|
| 6 |
def test_active_run_prefill_requires_validation_result():
|
| 7 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 8 |
assert "function runHasValidationResult" in runs
|
| 9 |
-
assert "const canPrefill=Boolean(targetSpace&&runHasValidationResult(detail))" in runs
|
| 10 |
assert "Space Test prefill becomes available after validation produced a result." in runs
|
| 11 |
|
| 12 |
|
|
@@ -19,8 +19,8 @@ def test_delete_run_requires_finished_status():
|
|
| 19 |
|
| 20 |
def test_run_documents_do_not_use_backend_present_until_file_exists():
|
| 21 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 22 |
-
assert "byId.get('pi_raw_trace').present=Boolean(filePaths.has('traces/raw/agent_trace.jsonl')
|
| 23 |
-
assert "byId.get('pi_redacted_trace').present=Boolean(filePaths.has('traces/redacted/agent_trace.jsonl')
|
| 24 |
assert "nonEmptyObject(detail.repair_decision)" in runs
|
| 25 |
assert "nonEmptyObject(detail.blockage)" in runs
|
| 26 |
|
|
|
|
| 6 |
def test_active_run_prefill_requires_validation_result():
|
| 7 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 8 |
assert "function runHasValidationResult" in runs
|
| 9 |
+
assert "const canPrefill=Boolean(targetSpace&&runHasValidationResult(detail,summary))" in runs
|
| 10 |
assert "Space Test prefill becomes available after validation produced a result." in runs
|
| 11 |
|
| 12 |
|
|
|
|
| 19 |
|
| 20 |
def test_run_documents_do_not_use_backend_present_until_file_exists():
|
| 21 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 22 |
+
assert "byId.get('pi_raw_trace').present=Boolean(tracesCollected&&(filePaths.has('traces/raw/agent_trace.jsonl')" in runs
|
| 23 |
+
assert "byId.get('pi_redacted_trace').present=Boolean(tracesCollected&&(filePaths.has('traces/redacted/agent_trace.jsonl')" in runs
|
| 24 |
assert "nonEmptyObject(detail.repair_decision)" in runs
|
| 25 |
assert "nonEmptyObject(detail.blockage)" in runs
|
| 26 |
|
tests/test_v134_dependency_build_error_guardrail.py
CHANGED
|
@@ -7,8 +7,7 @@ ROOT = Path(__file__).resolve().parents[1]
|
|
| 7 |
def test_worker_pins_transformers_and_safetensors_to_stable_build_line():
|
| 8 |
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 9 |
assert "transformers>=4.51.0,<5.0.0" in worker
|
| 10 |
-
assert "
|
| 11 |
-
assert "Prevent Transformers 5.x from requiring unavailable safetensors>=0.8.0" in worker
|
| 12 |
|
| 13 |
|
| 14 |
def test_worker_detects_safetensors_080_pip_resolver_failure():
|
|
|
|
| 7 |
def test_worker_pins_transformers_and_safetensors_to_stable_build_line():
|
| 8 |
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 9 |
assert "transformers>=4.51.0,<5.0.0" in worker
|
| 10 |
+
assert "Avoid uncontrolled Transformers 5.x" in worker
|
|
|
|
| 11 |
|
| 12 |
|
| 13 |
def test_worker_detects_safetensors_080_pip_resolver_failure():
|
tests/test_v138_critical_demo_fixes.py
CHANGED
|
@@ -37,8 +37,8 @@ def test_prefill_uses_progress_summary_and_validation_events():
|
|
| 37 |
|
| 38 |
def test_run_document_buttons_trust_backend_presence_from_progress_payload():
|
| 39 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 40 |
-
assert "
|
| 41 |
-
assert "
|
| 42 |
assert "byId.get('smoke').present&&byId.get('smoke').url" in runs
|
| 43 |
|
| 44 |
|
|
|
|
| 37 |
|
| 38 |
def test_run_document_buttons_trust_backend_presence_from_progress_payload():
|
| 39 |
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 40 |
+
assert "tracesCollected&&(filePaths.has('traces/raw/agent_trace.jsonl')" in runs
|
| 41 |
+
assert "tracesCollected&&(filePaths.has('traces/redacted/agent_trace.jsonl')" in runs
|
| 42 |
assert "byId.get('smoke').present&&byId.get('smoke').url" in runs
|
| 43 |
|
| 44 |
|
tests/test_v139_trace_availability_gating.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def test_backend_trace_documents_require_exact_agent_trace_and_traces_event():
|
| 7 |
+
bucket = (ROOT / "src" / "bucket.py").read_text(encoding="utf-8")
|
| 8 |
+
fn = bucket.split("def _run_document_links", 1)[1].split("def _normalize_model_name", 1)[0]
|
| 9 |
+
assert "traces_collected = event_passed(\"traces\", {\"success\"})" in fn
|
| 10 |
+
assert "raw_agent_trace_present = traces_collected" in fn
|
| 11 |
+
assert "redacted_agent_trace_present = traces_collected" in fn
|
| 12 |
+
assert "_has_glob(f\"{paths.root}/traces/raw" not in fn
|
| 13 |
+
assert "_has_glob(f\"{paths.root}/traces/redacted" not in fn
|
| 14 |
+
assert "raw_present = raw_agent_trace_present" in fn
|
| 15 |
+
assert "redacted_present = redacted_agent_trace_present" in fn
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def test_frontend_trace_buttons_require_exact_agent_trace_and_trace_event():
|
| 19 |
+
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 20 |
+
derive = runs.split("function deriveRunDocuments", 1)[1].split("function renderRunDocuments", 1)[0]
|
| 21 |
+
assert "const tracesCollected=eventPassed('traces',['success'])" in derive
|
| 22 |
+
assert "tracesCollected&&(filePaths.has('traces/raw/agent_trace.jsonl')" in derive
|
| 23 |
+
assert "tracesCollected&&(filePaths.has('traces/redacted/agent_trace.jsonl')" in derive
|
| 24 |
+
assert "hasPrefix('traces/raw')" not in derive
|
| 25 |
+
assert "hasPrefix('traces/redacted')" not in derive
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def test_no_legacy_trace_folder_fallback_comment_left():
|
| 29 |
+
runs = (ROOT / "web" / "static" / "runs.js").read_text(encoding="utf-8")
|
| 30 |
+
assert "Legacy test invariants retained" not in runs
|
tests/test_v140_dependency_stack_and_build_error_detection.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def test_dependency_guardrail_does_not_globally_pin_model_specific_diffusers_stack():
|
| 7 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 8 |
+
normalize = worker.split("def normalize_requirements_for_modern_hub", 1)[1].split("def useful_log_signals", 1)[0]
|
| 9 |
+
assert '"transformers": "transformers>=4.51.0,<5.0.0"' in normalize
|
| 10 |
+
assert '"diffusers": "diffusers>=0.35.0,<0.38.0"' not in normalize
|
| 11 |
+
assert '"safetensors": "safetensors>=0.4.5,<0.8.0"' not in normalize
|
| 12 |
+
assert "concrete pip conflicts remain Pi repair work" in normalize
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def test_known_guardrail_is_narrow_not_general_diffusers_autofix():
|
| 16 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 17 |
+
known = worker.split("def known_dependency_guardrail_needed", 1)[1].split("def apply_dependency_guardrail_repair", 1)[0]
|
| 18 |
+
assert "transformers-5" in known
|
| 19 |
+
assert "diffusers 0.38" not in known
|
| 20 |
+
assert "General pip conflicts" in known
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def test_validation_loop_detects_terminal_build_error_from_space_logs():
|
| 24 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 25 |
+
assert "def build_log_has_terminal_error" in worker
|
| 26 |
+
assert "def raise_if_collected_build_error" in worker
|
| 27 |
+
assert "Space is in build error; stopping wait and entering recovery" in worker
|
| 28 |
+
validate = worker.split("def validate_live_api", 1)[1].split("def is_auth_or_billing_like_error", 1)[0]
|
| 29 |
+
assert "raise_if_collected_build_error" in validate
|
| 30 |
+
assert "attempt == 1 or attempt % 2 == 0" in validate
|
| 31 |
+
assert "BUILD_ERROR" in validate
|
tests/test_v141_build_error_observer_agentic_repair.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def test_build_error_observer_stops_waiting_on_runtime_build_error():
|
| 7 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 8 |
+
assert "def runtime_stage_is_build_error" in worker
|
| 9 |
+
assert "Space is in build error; stopping wait and entering recovery" in worker
|
| 10 |
+
validate = worker.split("def validate_live_api", 1)[1].split("def is_auth_or_billing_like_error", 1)[0]
|
| 11 |
+
assert "if runtime_stage_is_build_error(stage)" in validate
|
| 12 |
+
assert "raise_if_collected_build_error" in validate
|
| 13 |
+
assert "attempt == 1 or attempt % 2 == 0" in validate
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
def test_factory_does_not_globally_solve_diffusers_conflicts():
|
| 17 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 18 |
+
normalize = worker.split("def normalize_requirements_for_modern_hub", 1)[1].split("def useful_log_signals", 1)[0]
|
| 19 |
+
known = worker.split("def known_dependency_guardrail_needed", 1)[1].split("def apply_dependency_guardrail_repair", 1)[0]
|
| 20 |
+
assert "Do not try to solve every dependency conflict here" in normalize
|
| 21 |
+
assert "Pi is responsible for" in normalize
|
| 22 |
+
assert "diffusers>=0.35.0,<0.38.0" not in normalize
|
| 23 |
+
assert "diffusers 0.38" not in known
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
def test_build_error_observation_artifact_is_written():
|
| 27 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 28 |
+
assert "build_error_observation.json" in worker
|
| 29 |
+
assert "DEPENDENCY_ERROR_BRIEF.md" in worker
|
| 30 |
+
assert "Other dependency conflicts are passed to Pi" in worker
|
tests/test_v142_pi_agent_token_context.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def test_job_passes_hf_token_secret_aliases_for_pi_and_hf_tools():
|
| 7 |
+
jobs = (ROOT / "src" / "jobs.py").read_text(encoding="utf-8")
|
| 8 |
+
assert 'secrets={"HF_TOKEN": token, "HUGGING_FACE_HUB_TOKEN": token}' in jobs
|
| 9 |
+
assert "not regular env metadata" in jobs
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def test_worker_verifies_and_redacts_token_context():
|
| 13 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 14 |
+
assert "def ensure_hf_token_context" in worker
|
| 15 |
+
assert "token_context.json" in worker
|
| 16 |
+
assert '"token_value": "[REDACTED]"' in worker
|
| 17 |
+
assert "os.environ.setdefault(\"HUGGING_FACE_HUB_TOKEN\", token)" in worker
|
| 18 |
+
assert "Verified HF token context for Pi/HF operations" in worker
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def test_pi_prompts_include_tooling_context_and_continue_same_run_instruction():
|
| 22 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 23 |
+
assert "def pi_tooling_context_note" in worker
|
| 24 |
+
assert "HF_TOKEN and HUGGING_FACE_HUB_TOKEN aliases" in worker
|
| 25 |
+
assert "Never print, write, echo, or commit token values" in worker
|
| 26 |
+
assert "You are continuing the same build run, not starting a separate project" in worker
|
| 27 |
+
assert "{pi_tooling_context_note()}" in worker
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
def test_incident_and_repair_briefs_include_redacted_token_context():
|
| 31 |
+
worker = (ROOT / "src" / "worker_payload.py").read_text(encoding="utf-8")
|
| 32 |
+
assert "## HF tooling/token context" in worker
|
| 33 |
+
assert 'load_json_if_exists(run_dir / "token_context.json")' in worker
|