feat: merge-report lease proof fields and handoff audit (#535)

Surface lease_proof_source / recovery reason from sanctioned session
provenance on gitea_merge_pr results, and block final reports that claim
manual/seeded/injected lease proof without MCP adoption evidence.

Closes #535
This commit is contained in:
2026-07-09 12:56:12 -04:00
parent c738e5b10d
commit 2b4c291f12
5 changed files with 330 additions and 0 deletions
+20
View File
@@ -14,6 +14,7 @@ from typing import Any, Callable
import branch_cleanup_guard
import issue_acceptance_gate
import issue_lock_provenance
import merger_lease_adoption
import reviewer_handoff_consistency
import thread_state_ledger_validator
from mcp_native_cleanup_proof import assess_mcp_native_cleanup_proof
@@ -1263,6 +1264,24 @@ def _rule_shared_manual_lock_pr_override(report_text: str) -> list[dict[str, str
)
def _rule_shared_manual_lease_proof_handoff(report_text: str) -> list[dict[str, str]]:
"""Block merge/review handoffs that claim unsafe lease seeding (#535)."""
result = merger_lease_adoption.assess_manual_lease_proof_handoff(report_text)
if result.get("proven"):
return []
return _findings_from_reasons(
"shared.manual_lease_proof_handoff",
result.get("reasons") or [],
field="Merge mutations",
severity="block",
safe_next_action=(
"use gitea_adopt_merger_pr_lease or gitea_acquire_reviewer_pr_lease; "
"cite lease_proof_source / adoption_comment_id; never claim manual "
"seeded/injected lease proof"
),
)
def _rule_shared_issue_acceptance_gate(report_text: str) -> list[dict[str, str]]:
result = issue_acceptance_gate.validate_final_report_issue_acceptance(report_text)
if not result.get("applicable") or result.get("valid"):
@@ -1459,6 +1478,7 @@ def _rule_shared_mcp_native_cleanup_proof(report_text: str) -> list[dict[str, st
_SHARED_ISSUE_LOCK_RULES = (
_rule_shared_issue_lock_external_state,
_rule_shared_manual_lock_pr_override,
_rule_shared_manual_lease_proof_handoff,
_rule_shared_author_reviewer_same_run,
_rule_shared_raw_branch_delete_bypass,
_rule_shared_canonical_state_update,