Files
yao-meta-skill/scripts/evidence_consistency_artifact_roles.py
T
2026-06-16 07:49:02 +08:00

202 lines
9.3 KiB
Python

#!/usr/bin/env python3
"""Compare artifact-role handoffs across world-class evidence reports."""
from pathlib import Path
from typing import Any
SCRIPT_INTERFACE = "internal-module"
SCRIPT_INTERFACE_REASON = "Imported by render_evidence_consistency.py to compare preflight and Review Studio artifact-role contracts."
def _compare_check(
*,
key: str,
label: str,
expected: Any,
actual: Any,
paths: list[str],
detail: str,
) -> dict[str, Any]:
return {
"key": key,
"label": label,
"status": "pass" if expected == actual else "fail",
"expected": expected,
"actual": actual,
"paths": paths,
"detail": detail,
}
def role_contract_signature(contract: dict[str, Any]) -> dict[str, Any]:
roles = {
str(item.get("role", "")): item
for item in contract.get("roles", [])
if isinstance(item, dict) and str(item.get("role", "")).strip()
}
return {
"role_source": contract.get("role_source"),
"counts_as_evidence": contract.get("counts_as_evidence"),
"artifact_prefill_counts_as_evidence": contract.get("artifact_prefill_counts_as_evidence"),
"submission_ref_total_count": contract.get("submission_ref_total_count"),
"submission_ref_ready_count": contract.get("submission_ref_ready_count"),
"supporting_evidence_total_count": contract.get("supporting_evidence_total_count"),
"supporting_evidence_ready_count": contract.get("supporting_evidence_ready_count"),
"submission_ref_copy_to_artifact_refs": roles.get("submission-ref", {}).get("copy_to_artifact_refs"),
"supporting_evidence_copy_to_artifact_refs": roles.get("supporting-evidence", {}).get(
"copy_to_artifact_refs"
),
}
def preflight_role_signatures(world_class_preflight: dict[str, Any]) -> dict[str, dict[str, Any]]:
signatures: dict[str, dict[str, Any]] = {}
items = world_class_preflight.get("items", []) if isinstance(world_class_preflight, dict) else []
for item in items:
if not isinstance(item, dict):
continue
key = str(item.get("evidence_key", "")).strip()
submission_kit = item.get("submission_kit", {}) if isinstance(item.get("submission_kit", {}), dict) else {}
contract = (
submission_kit.get("artifact_role_contract", {})
if isinstance(submission_kit.get("artifact_role_contract", {}), dict)
else {}
)
if key and contract:
signatures[key] = role_contract_signature(contract)
return signatures
def review_studio_role_signatures(review_studio: dict[str, Any]) -> dict[str, dict[str, Any]]:
actions = review_studio.get("review_actions", []) if isinstance(review_studio, dict) else []
for action in actions:
if not isinstance(action, dict) or action.get("gate_key") != "world-class-evidence":
continue
signatures: dict[str, dict[str, Any]] = {}
for step in action.get("evidence_steps", []):
if not isinstance(step, dict):
continue
key = str(step.get("key", "")).strip()
contract = (
step.get("artifact_role_contract", {})
if isinstance(step.get("artifact_role_contract", {}), dict)
else {}
)
if key and contract:
signatures[key] = role_contract_signature(contract)
return signatures
return {}
def build_preflight_artifact_role_handoff_checks(
*,
skill_dir: Path,
world_class_preflight: dict[str, Any],
review_studio: dict[str, Any],
report_paths: dict[str, str],
) -> list[dict[str, Any]]:
preflight_submissions = (
world_class_preflight.get("submissions", {})
if isinstance(world_class_preflight.get("submissions", {}), dict)
else {}
)
preflight_commands = (
preflight_submissions.get("commands", {})
if isinstance(preflight_submissions.get("commands", {}), dict)
else {}
)
preflight_role_contract = (
preflight_submissions.get("artifact_role_contract", {})
if isinstance(preflight_submissions.get("artifact_role_contract", {}), dict)
else {}
)
preflight_roles = {
str(item.get("role", "")): item for item in preflight_role_contract.get("roles", []) if isinstance(item, dict)
}
default_submissions_dir = "evidence/world_class/submissions"
expected_preflight_handoff = {
"directory": default_submissions_dir,
"drafts_count_as_evidence": False,
"preflight_counts_submission_as_completion": False,
"html_report": "reports/world_class_evidence_preflight.html",
"html_exists": True,
"prepare_submission": f"python3 scripts/yao.py world-class-submission-kit . --output-dir {default_submissions_dir}",
"prepare_prefilled_submission": (
f"python3 scripts/yao.py world-class-submission-kit . --output-dir {default_submissions_dir} "
"--prefill-artifacts"
),
"validate_intake": f"python3 scripts/yao.py world-class-intake . --submissions-dir {default_submissions_dir}",
"submission_review": f"python3 scripts/yao.py world-class-submission-review . --submissions-dir {default_submissions_dir}",
"refresh_ledger": f"python3 scripts/yao.py world-class-ledger . --submissions-dir {default_submissions_dir}",
"guard_claim": "python3 scripts/yao.py world-class-claim-guard .",
"artifact_prefill_counts_as_evidence": False,
"artifact_role_source": "world-class-submission-kit",
"artifact_role_counts_as_evidence": False,
"artifact_role_prefill_counts_as_evidence": False,
"submission_ref_role_present": True,
"supporting_evidence_role_present": True,
"submission_ref_copy_to_artifact_refs": True,
"supporting_evidence_copy_to_artifact_refs": False,
"submission_ref_total_present": True,
"supporting_evidence_total_present": True,
}
actual_preflight_handoff = {
"directory": preflight_submissions.get("directory"),
"drafts_count_as_evidence": preflight_submissions.get("drafts_count_as_evidence"),
"preflight_counts_submission_as_completion": preflight_submissions.get(
"preflight_counts_submission_as_completion"
),
"html_report": world_class_preflight.get("artifacts", {}).get("html")
if isinstance(world_class_preflight.get("artifacts", {}), dict)
else None,
"html_exists": (skill_dir / "reports" / "world_class_evidence_preflight.html").exists(),
"prepare_submission": preflight_commands.get("prepare_submission"),
"prepare_prefilled_submission": preflight_commands.get("prepare_prefilled_submission"),
"validate_intake": preflight_commands.get("validate_intake"),
"submission_review": preflight_commands.get("submission_review"),
"refresh_ledger": preflight_commands.get("refresh_ledger"),
"guard_claim": preflight_commands.get("guard_claim"),
"artifact_prefill_counts_as_evidence": preflight_submissions.get("artifact_prefill_counts_as_evidence"),
"artifact_role_source": preflight_role_contract.get("role_source"),
"artifact_role_counts_as_evidence": preflight_role_contract.get("counts_as_evidence"),
"artifact_role_prefill_counts_as_evidence": preflight_role_contract.get(
"artifact_prefill_counts_as_evidence"
),
"submission_ref_role_present": "submission-ref" in preflight_roles,
"supporting_evidence_role_present": "supporting-evidence" in preflight_roles,
"submission_ref_copy_to_artifact_refs": preflight_roles.get("submission-ref", {}).get(
"copy_to_artifact_refs"
),
"supporting_evidence_copy_to_artifact_refs": preflight_roles.get("supporting-evidence", {}).get(
"copy_to_artifact_refs"
),
"submission_ref_total_present": int(preflight_role_contract.get("submission_ref_total_count", 0)) > 0,
"supporting_evidence_total_present": int(preflight_role_contract.get("supporting_evidence_total_count", 0))
> 0,
}
return [
_compare_check(
key="preflight-submission-kit-handoff",
label="Preflight exposes a safe submission-kit handoff",
expected=expected_preflight_handoff,
actual=actual_preflight_handoff,
paths=[report_paths["world_class_preflight"], "reports/world_class_evidence_preflight.html"],
detail=(
"Preflight must give operators the exact draft, SHA-prefill, intake, review, ledger, "
"and claim-guard commands without letting drafts, prefill, or submissions count as accepted evidence."
),
),
_compare_check(
key="review-studio-preflight-artifact-role-handoff",
label="Review Studio mirrors preflight artifact roles",
expected=preflight_role_signatures(world_class_preflight),
actual=review_studio_role_signatures(review_studio),
paths=[report_paths["world_class_preflight"], report_paths["review_studio"]],
detail=(
"The Review Studio world-class action card must carry the same submission-ref versus "
"supporting-evidence contract as the preflight handoff."
),
),
]