Merge remote-tracking branch 'origin/main' into codex/p0-006-ai-log-triage-20260709
This commit is contained in:
@@ -14,6 +14,7 @@ from src.api.v1.agents import router
|
||||
from src.services.windows99_vmx_source_locator_readback import (
|
||||
build_windows99_vmx_source_locator_readback,
|
||||
validate_windows99_vmx_source_candidate_confirmation_packet,
|
||||
validate_windows99_vmx_source_scoped_relink_dry_run_packet,
|
||||
)
|
||||
from src.services.windows99_vmx_source_repair_package import (
|
||||
build_windows99_vmx_source_repair_package,
|
||||
@@ -53,6 +54,85 @@ def _scorecard() -> dict:
|
||||
}
|
||||
|
||||
|
||||
def _locator_ready_for_scoped_relink_dry_run() -> dict:
|
||||
repair_package = build_windows99_vmx_source_repair_package(
|
||||
_scorecard(),
|
||||
generated_at="2026-07-03T11:21:00+08:00",
|
||||
)
|
||||
return build_windows99_vmx_source_locator_readback(
|
||||
_scorecard(),
|
||||
repair_package=repair_package,
|
||||
collector_receipt={
|
||||
"schema_version": "windows99_vmx_source_locator_receipt_v1",
|
||||
"collector_readback_present": True,
|
||||
"collector_collection_status": (
|
||||
"collected_windows99_vmx_source_locator_stdout"
|
||||
),
|
||||
"target_host_alias": "99",
|
||||
"target_vm_aliases": ["111"],
|
||||
"expected_vmx_path_present_count": 0,
|
||||
"candidate_source_count": 1,
|
||||
"candidate_source_fingerprint_count": 1,
|
||||
"alias_hint_candidate_count": 0,
|
||||
"unassigned_ubuntu_candidate_count": 0,
|
||||
"identity_metadata_read": True,
|
||||
"bounded_identity_metadata_only": True,
|
||||
"identity_target_hint_count": 1,
|
||||
"identity_unassigned_ubuntu_candidate_count": 0,
|
||||
"locate_status": "single_identity_candidate_requires_confirmation",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def _valid_scoped_relink_dry_run_packet() -> dict:
|
||||
return {
|
||||
"schema_version": "windows99_vmx_source_scoped_relink_dry_run_packet_v1",
|
||||
"plan_id": "windows99-vmx-source-relink-dry-run-111",
|
||||
"target_host_alias": "99",
|
||||
"target_vm_aliases": ["111"],
|
||||
"candidate_confirmation_accepted": True,
|
||||
"candidate_identity_evidence_ref": (
|
||||
"console://awoooi/windows99/candidate-identity-redacted-111"
|
||||
),
|
||||
"source_fingerprint_ref": "fingerprint://awoooi/windows99/vmx-source-111",
|
||||
"backup_ref": "backup://awoooi/windows99/pre-relink-redacted-111",
|
||||
"source_of_truth_diff": {
|
||||
"expected_vmx_path_present_count": 0,
|
||||
"candidate_source_count": 1,
|
||||
"candidate_source_fingerprint_count": 1,
|
||||
"raw_path_output": False,
|
||||
"path_fingerprint_only": True,
|
||||
"bounded_identity_metadata_only": True,
|
||||
},
|
||||
"pre_apply_backup_plan": {
|
||||
"ready": True,
|
||||
"backup_ref": "backup://awoooi/windows99/pre-relink-redacted-111",
|
||||
"destructive_restore_allowed": False,
|
||||
},
|
||||
"rollback_ref": "rollback://awoooi/windows99-vmx-source-relink-dry-run",
|
||||
"post_verifier": [
|
||||
"bash scripts/reboot-recovery/collect-windows99-vmware-verify.sh --collect",
|
||||
"GET /api/v1/agents/reboot-auto-recovery-slo-scorecard",
|
||||
"GET /api/v1/agents/windows99-vmx-source-repair-package",
|
||||
"GET /api/v1/agents/windows99-vmx-source-locator-readback",
|
||||
],
|
||||
"redacted_metadata_only": True,
|
||||
"bounded_identity_metadata_only": True,
|
||||
"path_fingerprint_only": True,
|
||||
"raw_path_output": False,
|
||||
"vmx_file_content_read": False,
|
||||
"secret_value_read": False,
|
||||
"remote_write_performed": False,
|
||||
"runtime_write_performed": False,
|
||||
"host_reboot_performed": False,
|
||||
"vm_power_change_performed": False,
|
||||
"windows_registry_apply_performed": False,
|
||||
"scheduled_task_write_performed": False,
|
||||
"apply_requested": False,
|
||||
"vm_power_change_requested": False,
|
||||
}
|
||||
|
||||
|
||||
def test_windows99_vmx_source_locator_builder_is_no_secret_check_mode() -> None:
|
||||
repair_package = build_windows99_vmx_source_repair_package(
|
||||
_scorecard(),
|
||||
@@ -442,6 +522,78 @@ def test_windows99_candidate_confirmation_validator_rejects_sensitive_payload()
|
||||
assert payload["operation_boundaries"]["apply_gate_opened"] is False
|
||||
|
||||
|
||||
def test_windows99_scoped_relink_dry_run_validator_accepts_redacted_packet() -> None:
|
||||
payload = validate_windows99_vmx_source_scoped_relink_dry_run_packet(
|
||||
_valid_scoped_relink_dry_run_packet(),
|
||||
locator_readback=_locator_ready_for_scoped_relink_dry_run(),
|
||||
)
|
||||
|
||||
assert payload["schema_version"] == (
|
||||
"windows99_vmx_source_scoped_relink_dry_run_validation_v1"
|
||||
)
|
||||
assert payload["status"] == "accepted_for_reviewer_validation_passed_no_write"
|
||||
assert payload["accepted"] is True
|
||||
assert payload["reviewer_validation_passed"] is True
|
||||
assert payload["controlled_relink_dry_run_ready"] is True
|
||||
assert payload["validated_target_vm_aliases"] == ["111"]
|
||||
assert payload["plan_id"] == "windows99-vmx-source-relink-dry-run-111"
|
||||
assert payload["rollback_ready"] is True
|
||||
assert payload["post_verifier_ready"] is True
|
||||
assert payload["pre_apply_backup_plan_ready"] is True
|
||||
assert payload["apply_allowed_by_this_validation"] is False
|
||||
assert payload["runtime_write_authorized"] is False
|
||||
assert payload["request_payload_saved"] is False
|
||||
assert payload["remote_write_performed"] is False
|
||||
assert payload["vm_power_change_performed"] is False
|
||||
assert payload["secret_value_read"] is False
|
||||
receipt = payload["projected_relink_dry_run_receipt"]
|
||||
assert receipt["schema_version"] == (
|
||||
"windows99_vmx_source_scoped_relink_dry_run_receipt_v1"
|
||||
)
|
||||
assert receipt["ready"] is True
|
||||
assert receipt["target_selector"]["host_alias"] == "99"
|
||||
assert receipt["target_selector"]["vm_aliases"] == ["111"]
|
||||
assert receipt["target_selector"]["runtime_write_allowed"] is False
|
||||
assert receipt["source_of_truth_diff"]["raw_path_output"] is False
|
||||
assert receipt["source_of_truth_diff"]["path_fingerprint_only"] is True
|
||||
assert receipt["pre_apply_backup_plan"]["ready"] is True
|
||||
assert receipt["pre_apply_backup_plan"]["destructive_restore_allowed"] is False
|
||||
assert "GET /api/v1/agents/windows99-vmx-source-locator-readback" in receipt[
|
||||
"post_verifier"
|
||||
]
|
||||
assert receipt["operation_boundaries"]["request_payload_saved"] is False
|
||||
assert receipt["operation_boundaries"]["remote_write_performed"] is False
|
||||
assert receipt["operation_boundaries"]["vm_power_change_performed"] is False
|
||||
|
||||
|
||||
def test_windows99_scoped_relink_dry_run_validator_rejects_sensitive_payload() -> None:
|
||||
packet = _valid_scoped_relink_dry_run_packet()
|
||||
packet["source_fingerprint_ref"] = "D:\\raw\\path\\vm.vmx"
|
||||
packet["source_of_truth_diff"]["raw_path_output"] = True
|
||||
packet["vmx_file_content_read"] = True
|
||||
|
||||
payload = validate_windows99_vmx_source_scoped_relink_dry_run_packet(
|
||||
packet,
|
||||
locator_readback=_locator_ready_for_scoped_relink_dry_run(),
|
||||
)
|
||||
|
||||
assert payload["accepted"] is False
|
||||
assert payload["status"] == "rejected_scoped_relink_dry_run_packet"
|
||||
assert payload["reviewer_validation_passed"] is False
|
||||
assert payload["controlled_relink_dry_run_ready"] is False
|
||||
assert "source_of_truth_diff.raw_path_output" in payload["rejected_fields"]
|
||||
assert "vmx_file_content_read" in payload["rejected_fields"]
|
||||
assert "forbidden_fragments" in payload["rejected_fields"]
|
||||
assert payload["source_fingerprint_ref"] == ""
|
||||
assert payload["backup_ref"] == ""
|
||||
assert payload["projected_relink_dry_run_receipt"]["ready"] is False
|
||||
assert payload["projected_relink_dry_run_receipt"]["post_verifier"] == []
|
||||
serialized = json.dumps(payload)
|
||||
assert "D:\\" not in serialized
|
||||
assert "192.168.0." not in serialized
|
||||
assert payload["operation_boundaries"]["apply_gate_opened"] is False
|
||||
|
||||
|
||||
def test_windows99_vmx_source_locator_endpoint_returns_public_safe_readback(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
@@ -578,3 +730,47 @@ def test_windows99_candidate_confirmation_endpoint_is_no_persist_validator(
|
||||
assert plan["request_payload_saved"] is False
|
||||
assert "D:\\" not in response.text
|
||||
assert "192.168.0." not in response.text
|
||||
|
||||
|
||||
def test_windows99_scoped_relink_dry_run_endpoint_is_no_persist_validator(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
locator = _locator_ready_for_scoped_relink_dry_run()
|
||||
monkeypatch.setattr(
|
||||
agents,
|
||||
"validate_windows99_vmx_source_scoped_relink_dry_run_packet",
|
||||
lambda packet: validate_windows99_vmx_source_scoped_relink_dry_run_packet(
|
||||
packet,
|
||||
locator_readback=locator,
|
||||
),
|
||||
)
|
||||
app = FastAPI()
|
||||
app.include_router(router, prefix="/api/v1")
|
||||
client = TestClient(app)
|
||||
|
||||
response = client.post(
|
||||
"/api/v1/agents/windows99-vmx-source-locator-readback/"
|
||||
"validate-scoped-relink-dry-run",
|
||||
json=_valid_scoped_relink_dry_run_packet(),
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
payload = response.json()
|
||||
assert payload["schema_version"] == (
|
||||
"windows99_vmx_source_scoped_relink_dry_run_validation_v1"
|
||||
)
|
||||
assert payload["accepted"] is True
|
||||
assert payload["reviewer_validation_passed"] is True
|
||||
assert payload["controlled_relink_dry_run_ready"] is True
|
||||
assert payload["operation_boundaries"]["no_persist_validator"] is True
|
||||
assert payload["operation_boundaries"]["request_payload_saved"] is False
|
||||
assert payload["operation_boundaries"]["apply_gate_opened"] is False
|
||||
assert payload["operation_boundaries"]["vm_power_change_performed"] is False
|
||||
receipt = payload["projected_relink_dry_run_receipt"]
|
||||
assert receipt["ready"] is True
|
||||
assert receipt["target_selector"]["vm_aliases"] == ["111"]
|
||||
assert receipt["pre_apply_backup_plan"]["destructive_restore_allowed"] is False
|
||||
assert payload["apply_allowed_by_this_validation"] is False
|
||||
assert payload["runtime_write_authorized"] is False
|
||||
assert "D:\\" not in response.text
|
||||
assert "192.168.0." not in response.text
|
||||
|
||||
Reference in New Issue
Block a user