Files
OpenOPC/opc/layer2_organization/prompt_contract.py
T
2026-07-01 17:56:31 +08:00

319 lines
14 KiB
Python

"""Canonical prompt contract for company-mode WorkItems.
The renderer consumes this contract directly. Legacy fields such as
``summary``/``brief`` remain useful for UI and audit, but prompt assembly
should not re-derive its own packet from them after a contract exists.
"""
from __future__ import annotations
import copy
from typing import Any
PROMPT_CONTRACT_VERSION = 2
def normalize_prompt_text_list(value: Any) -> list[str]:
if value is None:
return []
if isinstance(value, (list, tuple, set)):
items: list[str] = []
for item in value:
if isinstance(item, dict):
rendered = str(
item.get("value", "")
or item.get("input", "")
or item.get("raw", "")
or item.get("work_item_id", "")
or ""
).strip()
else:
rendered = str(item).strip()
if rendered:
items.append(rendered)
return items
rendered = str(value).strip()
return [rendered] if rendered else []
def normalize_dependency_specs(value: Any) -> list[Any]:
if value is None:
return []
if isinstance(value, (list, tuple, set)):
return [copy.deepcopy(item) for item in value if str(item).strip() or isinstance(item, dict)]
if isinstance(value, dict):
return [copy.deepcopy(value)]
rendered = str(value).strip()
return [rendered] if rendered else []
def normalize_prompt_contract(value: Any) -> dict[str, Any]:
payload = copy.deepcopy(value) if isinstance(value, dict) else {}
assignment = dict(payload.get("assignment_context", {}) or {})
try:
version = int(payload.get("version") or PROMPT_CONTRACT_VERSION)
except (TypeError, ValueError):
version = PROMPT_CONTRACT_VERSION
normalized = {
"version": version,
"task_brief": str(payload.get("task_brief", "") or "").strip(),
"assignment_context": {
"upstream_intent_summary": str(assignment.get("upstream_intent_summary", "") or "").strip(),
"manager_planning_handoff": str(assignment.get("manager_planning_handoff", "") or "").strip(),
"manager_outcome_dispatch": bool(assignment.get("manager_outcome_dispatch", False)),
"owned_outcome_kind": str(assignment.get("owned_outcome_kind", "") or "execute").strip() or "execute",
"scope_key": str(assignment.get("scope_key", "") or "").strip(),
"deliverables": normalize_prompt_text_list(assignment.get("deliverables", [])),
"acceptance_criteria": normalize_prompt_text_list(assignment.get("acceptance_criteria", [])),
"dependency_specs": normalize_dependency_specs(assignment.get("dependency_specs", [])),
"coordination_notes": str(assignment.get("coordination_notes", "") or "").strip(),
"delegation_rationale": str(assignment.get("delegation_rationale", "") or "").strip(),
"non_overlap_guard": str(assignment.get("non_overlap_guard", "") or "").strip(),
},
"turn_profiles": copy.deepcopy(dict(payload.get("turn_profiles", {}) or {})),
}
if payload.get("target_contract"):
normalized["target_contract"] = normalize_prompt_contract(payload.get("target_contract"))
source = dict(payload.get("source", {}) or {})
if source:
normalized["source"] = copy.deepcopy(source)
return normalized
def has_prompt_contract(value: Any) -> bool:
contract = normalize_prompt_contract(value)
return bool(contract.get("task_brief") or any(_assignment_has_content(contract)))
def _assignment_has_content(contract: dict[str, Any]) -> list[Any]:
assignment = dict(contract.get("assignment_context", {}) or {})
return [
assignment.get("upstream_intent_summary"),
assignment.get("manager_planning_handoff"),
assignment.get("manager_outcome_dispatch"),
assignment.get("scope_key"),
assignment.get("deliverables"),
assignment.get("acceptance_criteria"),
assignment.get("dependency_specs"),
assignment.get("coordination_notes"),
assignment.get("delegation_rationale"),
assignment.get("non_overlap_guard"),
]
def make_prompt_contract(
*,
task_brief: str,
upstream_intent_summary: str = "",
manager_planning_handoff: str = "",
manager_outcome_dispatch: bool = False,
owned_outcome_kind: str = "execute",
scope_key: str = "",
deliverables: Any = None,
acceptance_criteria: Any = None,
dependency_specs: Any = None,
coordination_notes: str = "",
delegation_rationale: str = "",
non_overlap_guard: str = "",
turn_profiles: dict[str, Any] | None = None,
target_contract: dict[str, Any] | None = None,
source: dict[str, Any] | None = None,
) -> dict[str, Any]:
payload: dict[str, Any] = {
"version": PROMPT_CONTRACT_VERSION,
"task_brief": str(task_brief or "").strip(),
"assignment_context": {
"upstream_intent_summary": str(upstream_intent_summary or "").strip(),
"manager_planning_handoff": str(manager_planning_handoff or "").strip(),
"manager_outcome_dispatch": bool(manager_outcome_dispatch),
"owned_outcome_kind": str(owned_outcome_kind or "execute").strip() or "execute",
"scope_key": str(scope_key or "").strip(),
"deliverables": normalize_prompt_text_list(deliverables),
"acceptance_criteria": normalize_prompt_text_list(acceptance_criteria),
"dependency_specs": normalize_dependency_specs(dependency_specs),
"coordination_notes": str(coordination_notes or "").strip(),
"delegation_rationale": str(delegation_rationale or "").strip(),
"non_overlap_guard": str(non_overlap_guard or "").strip(),
},
"turn_profiles": copy.deepcopy(dict(turn_profiles or {})),
}
if target_contract:
payload["target_contract"] = normalize_prompt_contract(target_contract)
if source:
payload["source"] = copy.deepcopy(dict(source))
return normalize_prompt_contract(payload)
def make_prompt_contract_blocker(reason: str) -> dict[str, Any]:
return make_prompt_contract(
task_brief="SYSTEM BLOCKER: prompt_contract is missing or incomplete for this WorkItem.",
deliverables=["Do not execute the original task until a valid prompt_contract exists."],
acceptance_criteria=[str(reason or "Missing prompt contract.").strip()],
source={"kind": "prompt_contract_blocker"},
)
def prompt_contract_from_delegate_item(
item: dict[str, Any],
*,
task_brief: str,
upstream_intent_summary: str = "",
manager_planning_handoff: str = "",
manager_outcome_dispatch: bool = False,
owned_outcome_kind: str = "execute",
scope_key: str = "",
dependency_specs: Any = None,
) -> dict[str, Any]:
return make_prompt_contract(
task_brief=task_brief,
upstream_intent_summary=upstream_intent_summary,
manager_planning_handoff=manager_planning_handoff,
manager_outcome_dispatch=manager_outcome_dispatch,
owned_outcome_kind=owned_outcome_kind,
scope_key=scope_key,
deliverables=item.get("deliverables", item.get("outputs", [])),
acceptance_criteria=item.get("acceptance_criteria", item.get("done_when", [])),
dependency_specs=dependency_specs,
coordination_notes=str(item.get("coordination_notes", "") or "").strip(),
delegation_rationale=str(item.get("delegation_rationale", "") or "").strip(),
non_overlap_guard=str(item.get("non_overlap_guard", "") or "").strip(),
source={"kind": "delegate_work"},
)
def prompt_contract_from_work_item(
work_item: Any,
*,
task_metadata: dict[str, Any] | None = None,
task_description: str = "",
) -> dict[str, Any]:
"""Build a one-time compatibility contract outside the renderer."""
metadata = dict(getattr(work_item, "metadata", {}) or {})
task_metadata = dict(task_metadata or {})
existing = metadata.get("prompt_contract") or task_metadata.get("prompt_contract")
if has_prompt_contract(existing):
return normalize_prompt_contract(existing)
legacy_assignment = dict(metadata.get("prompt_assignment", {}) or task_metadata.get("prompt_assignment", {}) or {})
task_brief = str(
legacy_assignment.get("task_brief", "")
or legacy_assignment.get("primary_task_brief", "")
or metadata.get("brief", "")
or getattr(work_item, "summary", "")
or task_description
or getattr(work_item, "title", "")
or ""
).strip()
if not task_brief:
return make_prompt_contract_blocker(
f"WorkItem `{str(getattr(work_item, 'work_item_id', '') or '').strip()}` has no task_brief."
)
playbook = dict(metadata.get("delegation_playbook", {}) or task_metadata.get("delegation_playbook", {}) or {})
return make_prompt_contract(
task_brief=task_brief,
upstream_intent_summary=str(
legacy_assignment.get("upstream_intent_summary", "")
or metadata.get("upstream_intent_summary", "")
or task_metadata.get("global_intent_summary", "")
or playbook.get("global_intent_summary", "")
or playbook.get("intent_summary", "")
or ""
).strip(),
manager_planning_handoff=str(
legacy_assignment.get("manager_planning_handoff", "")
or metadata.get("manager_planning_handoff", "")
or metadata.get("planning_context", "")
or ""
).strip(),
manager_outcome_dispatch=bool(
legacy_assignment.get("manager_outcome_dispatch", metadata.get("manager_outcome_dispatch", False))
),
owned_outcome_kind=str(
legacy_assignment.get("owned_outcome_kind", metadata.get("owned_outcome_kind", getattr(work_item, "kind", "execute")))
or "execute"
).strip(),
scope_key=str(legacy_assignment.get("scope_key", metadata.get("scope_key", "")) or "").strip(),
deliverables=legacy_assignment.get("deliverables", legacy_assignment.get("outputs", metadata.get("deliverables", metadata.get("outputs", [])))),
acceptance_criteria=legacy_assignment.get(
"acceptance_criteria",
legacy_assignment.get("done_when", metadata.get("acceptance_criteria", metadata.get("done_when", []))),
),
dependency_specs=legacy_assignment.get(
"dependency_specs",
legacy_assignment.get("dependency_work_item_ids", metadata.get("dependency_specs", metadata.get("dependency_work_item_ids", []))),
),
coordination_notes=str(legacy_assignment.get("coordination_notes", metadata.get("coordination_notes", "")) or "").strip(),
delegation_rationale=str(legacy_assignment.get("delegation_rationale", metadata.get("delegation_rationale", "")) or "").strip(),
non_overlap_guard=str(legacy_assignment.get("non_overlap_guard", metadata.get("non_overlap_guard", "")) or "").strip(),
source={"kind": "normalized_legacy_work_item"},
)
def render_assignment_context_from_contract(
contract: dict[str, Any],
*,
include_dispatch_fields: bool = False,
) -> str:
contract = normalize_prompt_contract(contract)
assignment = dict(contract.get("assignment_context", {}) or {})
lines: list[str] = ["## Work Item Assignment Context"]
if include_dispatch_fields and assignment.get("manager_outcome_dispatch"):
owned_kind = str(assignment.get("owned_outcome_kind") or "execute").strip()
lines.append(
"Manager outcome turn: you own the final outcome, but this turn "
"starts with delegation to direct reports before local integration. "
f"Owned outcome kind: {owned_kind}. Do not execute the production "
"work yourself in this dispatch turn unless no downstream seat is a fit."
)
if assignment.get("upstream_intent_summary"):
lines.extend(["", "### Upstream Intent Summary", str(assignment["upstream_intent_summary"])])
if include_dispatch_fields and assignment.get("manager_planning_handoff"):
lines.extend(["", "### Manager Planning Handoff", str(assignment["manager_planning_handoff"])])
if assignment.get("scope_key"):
lines.extend(["", "### Scope Key", str(assignment["scope_key"])])
for title, key in (
("Deliverables", "deliverables"),
("Acceptance Criteria", "acceptance_criteria"),
("Dependencies", "dependency_specs"),
):
items = normalize_prompt_text_list(assignment.get(key, []))
if items:
lines.extend(["", f"### {title}"])
lines.extend(f"- {item}" for item in items)
for title, key in (
("Coordination Notes", "coordination_notes"),
("Delegation Rationale", "delegation_rationale"),
("Boundaries / Non-overlap Guard", "non_overlap_guard"),
):
value = str(assignment.get(key, "") or "").strip()
if value:
lines.extend(["", f"### {title}", value])
if len(lines) == 1:
return ""
return "\n".join(lines).strip()
def render_target_prompt_contract(contract: dict[str, Any], *, heading: str = "### Target Work Item Contract") -> str:
contract = normalize_prompt_contract(contract)
lines: list[str] = [heading]
task_brief = str(contract.get("task_brief", "") or "").strip()
if task_brief:
lines.extend(["", "#### Task Brief", task_brief])
assignment = render_assignment_context_from_contract(contract, include_dispatch_fields=True)
if assignment:
assignment = assignment.replace("## Work Item Assignment Context", "#### Assignment Context", 1)
lines.extend(["", assignment])
if len(lines) == 1:
return ""
return "\n".join(lines).strip()
def is_report_prompt_turn(metadata: dict[str, Any] | None) -> bool:
payload = dict(metadata or {})
return bool(
payload.get("report_execution_work_item")
or str(payload.get("current_turn_mode", "") or "").strip() == "report_required"
or str(payload.get("work_item_turn_type", "") or "").strip() == "report"
or str(payload.get("work_kind", "") or "").strip() == "report"
)