Merge remote-tracking branch 'origin/main' into codex/p0-006-ai-log-triage-20260709

This commit is contained in:
ogt
2026-07-10 09:45:35 +08:00
3 changed files with 500 additions and 4 deletions

View File

@@ -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