Merge pull request 'feat: require Controller Handoff plus Thread State Ledger (Closes #507)' (#511) from feat/issue-507-controller-thread-ledger into master

This commit was merged in pull request #511.
This commit is contained in:
2026-07-09 08:27:44 -05:00
10 changed files with 1207 additions and 0 deletions
+20
View File
@@ -831,6 +831,7 @@ import pr_work_lease # noqa: E402
import workflow_skill # noqa: E402
import conflict_fix_classification # noqa: E402
import native_mcp_preference # noqa: E402
import thread_state_ledger_validator # noqa: E402
import master_parity_gate # noqa: E402
# Master-parity baseline (#420): the commit this server process started at.
@@ -6722,6 +6723,23 @@ def gitea_list_issue_comments(
return {"success": True, "issue_number": issue_number, "comments": out}
def _two_comment_workflow_comment_gate(body: str) -> list[str]:
"""Fail closed on invalid tagged workflow comments (#507)."""
text = body or ""
reasons: list[str] = []
if thread_state_ledger_validator.has_controller_handoff_marker(text):
result = thread_state_ledger_validator.assess_controller_handoff_comment(
text
)
reasons.extend(result.get("reasons") or [])
if thread_state_ledger_validator.has_thread_state_ledger_marker(text):
result = thread_state_ledger_validator.assess_thread_state_ledger_comment(
text
)
reasons.extend(result.get("reasons") or [])
return reasons
@mcp.tool()
def gitea_create_issue_comment(
issue_number: int,
@@ -6766,6 +6784,8 @@ def gitea_create_issue_comment(
reasons = list(gate_reasons)
if not (body or "").strip():
reasons.append("comment body must be a non-empty string")
if not reasons:
reasons.extend(_two_comment_workflow_comment_gate(body))
if reasons:
blocked = {"success": False, "performed": False,
"issue_number": issue_number, "reasons": reasons}