feat(ai): add PixelRAG marketplace embedding signature guard replay
Some checks failed
CD Pipeline / deploy (push) Has been cancelled

This commit is contained in:
ogt
2026-07-10 12:26:59 +08:00
parent d346e20577
commit ebfef40bb3
10 changed files with 1309 additions and 7 deletions

View File

@@ -1315,6 +1315,7 @@ def test_collect_ai_automation_smoke_uses_worst_status(monkeypatch):
monkeypatch.setattr(smoke, "_pixelrag_marketplace_adapter_dry_run_check", lambda: smoke._check("pixelrag marketplace adapter dry-run", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_identity_matcher_replay_check", lambda: smoke._check("pixelrag marketplace identity matcher replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_promotion_gate_replay_check", lambda: smoke._check("pixelrag marketplace promotion gate replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_embedding_signature_guard_replay_check", lambda: smoke._check("pixelrag marketplace embedding signature guard replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_ocr_vlm_replay_check", lambda: smoke._check("pixelrag ocr vlm", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_vlm_route_readiness_check", lambda: smoke._check("pixelrag vlm route", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_vlm_replay_worker_check", lambda: smoke._check("pixelrag vlm worker", "ok", "ok"))
@@ -1324,7 +1325,7 @@ def test_collect_ai_automation_smoke_uses_worst_status(monkeypatch):
result = smoke.collect_ai_automation_smoke(record_history=False)
assert result["status"] == "critical"
assert result["summary"] == {"ok": 40, "warning": 1, "critical": 1, "total": 42}
assert result["summary"] == {"ok": 41, "warning": 1, "critical": 1, "total": 43}
def test_pchome_controlled_apply_drift_monitor_reports_verified_zero_drift(monkeypatch):
@@ -3858,6 +3859,7 @@ def test_collect_ai_automation_smoke_persists_recent_history(tmp_path, monkeypat
monkeypatch.setattr(smoke, "_pixelrag_marketplace_adapter_dry_run_check", lambda: smoke._check("pixelrag marketplace adapter dry-run", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_identity_matcher_replay_check", lambda: smoke._check("pixelrag marketplace identity matcher replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_promotion_gate_replay_check", lambda: smoke._check("pixelrag marketplace promotion gate replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_embedding_signature_guard_replay_check", lambda: smoke._check("pixelrag marketplace embedding signature guard replay", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_ocr_vlm_replay_check", lambda: smoke._check("pixelrag ocr vlm", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_vlm_route_readiness_check", lambda: smoke._check("pixelrag vlm route", "ok", "ok"))
monkeypatch.setattr(smoke, "_pixelrag_vlm_replay_worker_check", lambda: smoke._check("pixelrag vlm worker", "ok", "ok"))
@@ -3918,7 +3920,7 @@ def test_scheduled_automation_health_summary_reads_history_without_side_effects(
json.dumps({
"generated_at": datetime.now().isoformat(timespec="seconds"),
"status": "ok",
"summary": {"ok": 42, "warning": 0, "critical": 0, "total": 42},
"summary": {"ok": 43, "warning": 0, "critical": 0, "total": 43},
"checks": [
{
"name": "PChome 受控落地 drift monitor",
@@ -4137,6 +4139,31 @@ def test_scheduled_automation_health_summary_reads_history_without_side_effects(
"primary_human_gate_count": 0,
},
},
{
"name": "PixelRAG marketplace embedding signature guard replay",
"status": "ok",
"summary": "PixelRAG marketplace embedding signature guard replay candidates=1, ready=1, blocked=0, dry_run=1, executed=0, receipts=0, signature_candidates=2, knowledge_ready=2, signatures=8c8063c66dbe",
"details": {
"policy": "controlled_pixelrag_marketplace_embedding_signature_guard_replay_v1",
"candidate_count": 1,
"ready_count": 1,
"blocked_count": 0,
"dry_run_count": 1,
"executed_count": 0,
"receipt_written_count": 0,
"capture_runtime_gap_count": 0,
"signature_guard_candidate_count": 2,
"candidate_knowledge_ready_count": 2,
"expected_embedding_signatures": ["8c8063c66dbe"],
"network_call_performed": False,
"model_call_performed": False,
"embedding_generation_performed": False,
"artifact_write_performed": False,
"next_machine_action": "run_marketplace_embedding_signature_guard_replay_execute",
"writes_database_count": 0,
"primary_human_gate_count": 0,
},
},
{
"name": "PixelRAG OCR/VLM replay contract",
"status": "ok",
@@ -4251,7 +4278,7 @@ def test_scheduled_automation_health_summary_reads_history_without_side_effects(
)
assert summary["policy"] == "read_only_ai_automation_scheduled_health_summary"
assert summary["status"] == "ok"
assert summary["summary"]["total"] == 39
assert summary["summary"]["total"] == 40
assert summary["summary"]["primary_human_gate_count"] == 0
assert summary["summary"]["writes_database_count"] == 0
assert pchome_family["status"] == "ok"
@@ -6608,6 +6635,11 @@ def test_surface_html_readback_check_is_part_of_ai_smoke(monkeypatch):
"ok",
"pixelrag marketplace PromotionGate replay ok",
))
monkeypatch.setattr(smoke, "_pixelrag_marketplace_embedding_signature_guard_replay_check", lambda: smoke._check(
"PixelRAG marketplace embedding signature guard replay",
"ok",
"pixelrag marketplace embedding signature guard replay ok",
))
monkeypatch.setattr(smoke, "_pixelrag_ocr_vlm_replay_check", lambda: smoke._check(
"PixelRAG OCR/VLM replay contract",
"ok",
@@ -6648,7 +6680,7 @@ def test_surface_html_readback_check_is_part_of_ai_smoke(monkeypatch):
item for item in result["checks"]
if item["name"] == "Sitewide visual QA readback"
)
assert result["summary"]["total"] == 42
assert result["summary"]["total"] == 43
assert surface_check["status"] == "ok"
assert surface_check["details"]["checked_surface_count"] == 10
assert sitewide_check["status"] == "ok"

View File

@@ -0,0 +1,332 @@
import json
import subprocess
import sys
from datetime import datetime, timezone
def _promotion_candidate(platform, manifest_id, index):
return {
"candidate_id": f"{platform}:{manifest_id}:{index}",
"candidate_index": index,
"identity_fingerprint": f"identity-{platform}-{index}",
"promotion_fingerprint": f"promotion-{platform}-{index}",
"promotion_stage": "pre_embedding_signature_guard",
"promotion_strategy": "deterministic_gate_replay_no_values",
"ready_for_candidate_knowledge_replay": True,
"ready_for_embedding_signature_guard_replay": True,
"ready_for_price_table_write": False,
"price_write_blocked_until_embedding_signature_guard": True,
"requires_embedding_signature_guard": True,
"requires_evidence_time": True,
"requires_identity_matcher_replay": True,
"requires_promotion_gate": True,
"requires_public_source_boundary": True,
"requires_rate_limit_contract": True,
"requires_source_provenance": True,
}
def _write_promotion_gate_receipt(
root,
*,
platform="coupang_tw",
manifest_id="coupang-403",
adapter_code="coupang",
barrier_type="access_denied",
capture_runtime_unavailable=False,
):
receipt_dir = root / platform / manifest_id
receipt_dir.mkdir(parents=True)
source_root = "runtime_artifacts"
payload = {
"generated_at": datetime.now(timezone.utc).isoformat(),
"policy": "controlled_pixelrag_marketplace_promotion_gate_replay_v1",
"worker_status": "executed_marketplace_promotion_gate_replay_ready",
"platform": platform,
"manifest_id": manifest_id,
"adapter_code": adapter_code,
"promotion_gate_receipt_path": (
f"{source_root}/pixelrag_marketplace_promotion_gate_replay_receipts/"
f"{platform}/{manifest_id}/marketplace_promotion_gate_replay_receipt.json"
),
"identity_matcher_receipt_path": (
f"{source_root}/pixelrag_marketplace_identity_matcher_replay_receipts/"
f"{platform}/{manifest_id}/marketplace_identity_matcher_replay_receipt.json"
),
"adapter_dry_run_receipt_path": (
f"{source_root}/pixelrag_marketplace_adapter_dry_run_receipts/"
f"{platform}/{manifest_id}/marketplace_adapter_dry_run_receipt.json"
),
"adapter_preflight_receipt_path": (
f"{source_root}/pixelrag_marketplace_adapter_preflight_receipts/"
f"{platform}/{manifest_id}/marketplace_adapter_preflight_receipt.json"
),
"source_contract_replay_receipt_path": (
f"{source_root}/pixelrag_source_contract_replay_receipts/"
f"{platform}/{manifest_id}/source_contract_replay_receipt.json"
),
"source_worker_receipt_path": (
f"{source_root}/pixelrag_platform_probe_worker_receipts/"
f"{platform}/{manifest_id}/platform_probe_worker_receipt.json"
),
"source_receipt_path": (
f"{source_root}/pixelrag_visual_evidence/"
f"{platform}/{manifest_id}/capture_receipt.json"
),
"promotion_gate_replay_check_count": 22,
"promotion_gate_replay_check_pass_count": 22,
"promotion_gate_replay_checks": {
"blocked_page_not_product_data": True,
"candidate_knowledge_replay_ready": True,
"database_write_disallowed": True,
"direct_ai_insights_write_disallowed": True,
"direct_price_write_disallowed": True,
"embedding_signature_guard_replay_ready": True,
"embedding_signature_guard_required": True,
"identity_candidate_contracts_present": True,
"identity_candidates_ready_for_promotion": True,
"identity_matcher_checks_all_passed": True,
"identity_matcher_replay_ready": True,
"identity_matcher_version_supported": True,
"model_call_disallowed": True,
"network_call_disallowed": True,
"price_write_blocked_until_embedding_signature_guard": True,
"promotion_candidate_contracts_generated": True,
"promotion_candidate_count_matches_identity_count": True,
"promotion_gate_required": True,
"receipt_fresh": True,
"receipt_parse_ok": True,
"required_promotion_gates_present": True,
"source_provenance_paths_present": True,
},
"promotion_gate_replay": {
"promotion_gate_replay_version": "pixelrag_marketplace_promotion_gate_replay_v1",
"identity_matcher_replay_version": "pixelrag_marketplace_identity_matcher_replay_v1",
"adapter_dry_run_version": "pixelrag_marketplace_adapter_dry_run_v1",
"adapter_preflight_version": "pixelrag_marketplace_adapter_preflight_v1",
"source_contract_version": "pixelrag_marketplace_source_contract_v1",
"contract_id": f"{platform}:{manifest_id}:{adapter_code}",
"adapter_code": adapter_code,
"barrier_type": barrier_type,
"capture_runtime_unavailable": capture_runtime_unavailable,
"input_promotion_gate_receipt_path": (
f"{source_root}/pixelrag_marketplace_promotion_gate_replay_receipts/"
f"{platform}/{manifest_id}/marketplace_promotion_gate_replay_receipt.json"
),
"input_identity_matcher_receipt_path": (
f"{source_root}/pixelrag_marketplace_identity_matcher_replay_receipts/"
f"{platform}/{manifest_id}/marketplace_identity_matcher_replay_receipt.json"
),
"input_adapter_dry_run_receipt_path": (
f"{source_root}/pixelrag_marketplace_adapter_dry_run_receipts/"
f"{platform}/{manifest_id}/marketplace_adapter_dry_run_receipt.json"
),
"adapter_preflight_receipt_path": (
f"{source_root}/pixelrag_marketplace_adapter_preflight_receipts/"
f"{platform}/{manifest_id}/marketplace_adapter_preflight_receipt.json"
),
"source_contract_replay_receipt_path": (
f"{source_root}/pixelrag_source_contract_replay_receipts/"
f"{platform}/{manifest_id}/source_contract_replay_receipt.json"
),
"source_worker_receipt_path": (
f"{source_root}/pixelrag_platform_probe_worker_receipts/"
f"{platform}/{manifest_id}/platform_probe_worker_receipt.json"
),
"source_receipt_path": (
f"{source_root}/pixelrag_visual_evidence/"
f"{platform}/{manifest_id}/capture_receipt.json"
),
"promotion_gate_execution_mode": "deterministic_replay_only_no_network_no_db",
"promotion_candidate_count": 2,
"promotion_candidate_contracts": [
_promotion_candidate(platform, manifest_id, 0),
_promotion_candidate(platform, manifest_id, 1),
],
"required_before_data_promotion": [
"public_source_boundary",
"rate_limit_contract",
"provenance_contract",
"identity_matcher_replay",
"promotion_gate",
"embedding_signature_guard",
],
"allowed_next_step": "run_marketplace_embedding_signature_guard_replay",
},
"promotion_boundary": {
"direct_ai_insights_write_allowed": False,
"direct_price_write_allowed": False,
},
"writes_database": False,
"writes_database_count": 0,
"network_call_performed": False,
"model_call_performed": False,
}
path = receipt_dir / "marketplace_promotion_gate_replay_receipt.json"
path.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8")
return path
def test_marketplace_embedding_signature_guard_reads_promotion_receipts(tmp_path):
from services.pixelrag_marketplace_embedding_signature_guard_replay_service import (
POLICY,
run_pixelrag_marketplace_embedding_signature_guard_replay,
)
from services.rag_service import get_embedding_signature
promotion_root = tmp_path / "promotion_gate"
_write_promotion_gate_receipt(promotion_root)
_write_promotion_gate_receipt(
promotion_root,
platform="shopee_tw",
manifest_id="shopee-runtime-gap",
adapter_code="shopee",
barrier_type="language_or_region_interstitial",
capture_runtime_unavailable=True,
)
payload = run_pixelrag_marketplace_embedding_signature_guard_replay(
promotion_gate_receipt_root=promotion_root,
platform=("coupang_tw", "shopee_tw"),
)
by_platform = {item["platform"]: item for item in payload["worker_items"]}
assert payload["policy"] == POLICY
assert payload["status"] == "ok"
assert payload["summary"]["candidate_count"] == 2
assert payload["summary"]["ready_count"] == 2
assert payload["summary"]["dry_run_count"] == 2
assert payload["summary"]["signature_guard_candidate_count"] == 4
assert payload["summary"]["candidate_knowledge_ready_count"] == 4
assert payload["summary"]["capture_runtime_gap_count"] == 1
assert payload["summary"]["expected_embedding_signatures"] == [
get_embedding_signature()
]
assert payload["summary"]["writes_database_count"] == 0
assert payload["controlled_apply"]["embedding_generation"] is False
assert payload["controlled_apply"]["network_call"] is False
assert payload["promotion_boundary"]["writes_price_tables"] is False
assert payload["next_machine_action"] == (
"run_marketplace_embedding_signature_guard_replay_execute"
)
assert by_platform["coupang_tw"]["worker_status"] == (
"dry_run_ready_for_marketplace_embedding_signature_guard_replay"
)
first_guard = by_platform["coupang_tw"]["embedding_signature_guard_replay"][
"signature_guard_candidate_contracts"
][0]
assert first_guard["embedding_signature"] == get_embedding_signature()
assert first_guard["ready_for_candidate_knowledge_replay"] is True
assert first_guard["ready_for_ai_insights_write"] is False
assert first_guard["ready_for_price_table_write"] is False
assert first_guard["price_write_blocked_until_candidate_canary"] is True
assert by_platform["shopee_tw"]["embedding_signature_guard_replay"][
"capture_runtime_unavailable"
] is True
def test_marketplace_embedding_signature_guard_execute_writes_receipt(tmp_path):
from services.pixelrag_marketplace_embedding_signature_guard_replay_service import (
run_pixelrag_marketplace_embedding_signature_guard_replay,
)
promotion_root = tmp_path / "promotion_gate"
output_root = tmp_path / "embedding_signature"
_write_promotion_gate_receipt(promotion_root)
payload = run_pixelrag_marketplace_embedding_signature_guard_replay(
promotion_gate_receipt_root=promotion_root,
output_root=output_root,
platform="coupang_tw",
execute=True,
write_receipt=True,
)
assert payload["status"] == "ok"
assert payload["summary"]["executed_count"] == 1
assert payload["summary"]["receipt_written_count"] == 1
assert payload["controlled_apply"]["artifact_write"] is True
assert payload["controlled_apply"]["writes_database"] is False
assert payload["next_machine_action"] == "run_marketplace_candidate_knowledge_replay"
receipt_path = (
output_root
/ "coupang_tw"
/ "coupang-403"
/ "marketplace_embedding_signature_guard_replay_receipt.json"
)
assert receipt_path.exists()
receipt = json.loads(receipt_path.read_text(encoding="utf-8"))
assert receipt["worker_status"] == (
"executed_marketplace_embedding_signature_guard_replay_ready"
)
assert receipt["artifact_write_performed"] is True
assert receipt["writes_database"] is False
assert receipt["embedding_signature_guard_replay_check_pass_count"] == (
receipt["embedding_signature_guard_replay_check_count"]
)
assert receipt["embedding_signature_guard_replay"]["allowed_next_step"] == (
"run_marketplace_candidate_knowledge_replay"
)
def test_marketplace_embedding_signature_guard_cli_outputs_json(tmp_path):
promotion_root = tmp_path / "promotion_gate"
_write_promotion_gate_receipt(promotion_root)
completed = subprocess.run(
[
sys.executable,
"scripts/ops/run_pixelrag_marketplace_embedding_signature_guard_replay.py",
"--promotion-gate-receipt-root",
str(promotion_root),
"--platform",
"coupang_tw",
],
capture_output=True,
check=False,
text=True,
)
assert completed.returncode == 0
payload = json.loads(completed.stdout)
assert payload["summary"]["candidate_count"] == 1
assert payload["summary"]["ready_count"] == 1
assert payload["summary"]["signature_guard_candidate_count"] == 2
assert payload["controlled_apply"]["writes_database"] is False
def test_marketplace_embedding_signature_guard_route_returns_readback(
tmp_path,
monkeypatch,
):
from flask import Flask
from routes import system_public_routes as routes
from services import (
pixelrag_marketplace_embedding_signature_guard_replay_service as service,
)
promotion_root = tmp_path / "promotion_gate"
_write_promotion_gate_receipt(promotion_root)
monkeypatch.setattr(
service,
"DEFAULT_PROMOTION_GATE_RECEIPT_ROOT",
str(promotion_root),
)
app = Flask(__name__)
with app.test_request_context(
"/api/ai-automation/pixelrag-marketplace-embedding-signature-guard-replay?platform=coupang_tw"
):
response = (
routes
.ai_automation_pixelrag_marketplace_embedding_signature_guard_replay_api
.__wrapped__()
)
payload = response.get_json()
assert payload["policy"] == (
"controlled_pixelrag_marketplace_embedding_signature_guard_replay_v1"
)
assert payload["summary"]["candidate_count"] == 1
assert payload["summary"]["ready_count"] == 1
assert payload["controlled_apply"]["writes_database"] is False