6c5acbf10e
Approving (or sending feedback on) the delivery review card runs employee self-evolution as company work items, but the finalizer required the turn's FINAL chat text to be bare JSON. The hardened native runtime appends a verification status line to every final text and the manager dispatch guard displaces the final message with a justification, so every reflection died with invalid_self_evolution_json even when the model produced valid patches on all three attempts, and the FAILED items polluted the delivered run's terminal verdict. - Add a submit_self_evolution_patches tool as the authoritative result channel (exposed only on self-evolution work items, approval-exempt). The text parser becomes a fallback that scans fenced blocks and balanced JSON objects, and retry feedback now carries the concrete parse failure plus the tool instruction. - Settle abandoned reflections as CANCELLED (self_evolution_abandoned) and exclude kind=self_evolution from run-lifecycle settlement so an opt-in reflection can never dirty a delivered run. - Claim the review card with a consuming CAS before spawning (duplicate approve/feedback replies answer idempotently instead of re-entering), bound the reflection run with a 40-minute deadline that cancels leftover self-evolution items, and hand the claim back to pending when the consumed run crashes mid-flight. Verified live on real runs: the unfixed code failed the approve path in 90s with zero patches recorded; with the fix both the approve and the feedback paths recorded patches end-to-end (CEO->COO and CEO->CMO cascades, zero retries, human feedback reflected in patch content). tests/: 1924 passed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
341 lines
12 KiB
Python
341 lines
12 KiB
Python
"""Canonical company-mode collaboration tool names."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def company_collaboration_enabled(execution_mode: str | None) -> bool:
|
|
"""Return whether company collaboration capabilities should be exposed."""
|
|
return str(execution_mode or "").strip() == "company_mode"
|
|
|
|
|
|
def company_collaboration_enabled_for_task(task: object | None) -> bool:
|
|
"""Return whether collaboration capabilities are enabled for a task-like object."""
|
|
if task is None:
|
|
return False
|
|
metadata = dict(getattr(task, "metadata", {}) or {})
|
|
return company_collaboration_enabled(str(metadata.get("execution_mode", "") or ""))
|
|
|
|
|
|
COLLAB_PROFILE_DISABLED = "disabled"
|
|
COLLAB_PROFILE_WORKER_DEFAULT = "worker_default"
|
|
COLLAB_PROFILE_WORKER_EXECUTE_REVIEW = "worker_execute_review"
|
|
COLLAB_PROFILE_MANAGER_DEFAULT = "manager_default"
|
|
COLLAB_PROFILE_COORDINATOR_DEFAULT = "coordinator_default"
|
|
COLLAB_PROFILE_DEBUG_ADMIN = "debug_admin"
|
|
|
|
WORKER_DEFAULT_TOOL_NAMES: tuple[str, ...] = (
|
|
"inbox",
|
|
"send_dm",
|
|
"ask_peer_and_wait",
|
|
"reply_message",
|
|
)
|
|
|
|
WORKER_EXECUTE_REVIEW_TOOL_NAMES: tuple[str, ...] = WORKER_DEFAULT_TOOL_NAMES
|
|
|
|
MANAGER_DEFAULT_TOOL_NAMES: tuple[str, ...] = (
|
|
*WORKER_DEFAULT_TOOL_NAMES,
|
|
"delegate_work",
|
|
"modify_work_item",
|
|
"delete_work_item",
|
|
"manager_board_read",
|
|
"broadcast_issue",
|
|
"start_meeting",
|
|
)
|
|
|
|
COORDINATOR_DEFAULT_TOOL_NAMES: tuple[str, ...] = (
|
|
*MANAGER_DEFAULT_TOOL_NAMES,
|
|
"propose_task_adjustment",
|
|
"route_work",
|
|
)
|
|
|
|
DEBUG_ADMIN_TOOL_NAMES: tuple[str, ...] = (
|
|
"read_inbox",
|
|
"read_meeting",
|
|
"list_colleagues",
|
|
)
|
|
|
|
MEETING_RESPONSE_TOOL_NAMES: tuple[str, ...] = ("respond_meeting",)
|
|
HUMAN_REVIEW_TOOL_NAMES: tuple[str, ...] = ("close_human_review",)
|
|
SELF_EVOLUTION_TOOL_NAMES: tuple[str, ...] = ("submit_self_evolution_patches",)
|
|
|
|
|
|
COMPANY_COLLABORATION_TOOL_NAMES: tuple[str, ...] = (
|
|
*COORDINATOR_DEFAULT_TOOL_NAMES,
|
|
*MEETING_RESPONSE_TOOL_NAMES,
|
|
*HUMAN_REVIEW_TOOL_NAMES,
|
|
*SELF_EVOLUTION_TOOL_NAMES,
|
|
)
|
|
|
|
COMPANY_DEBUG_TOOL_NAMES: tuple[str, ...] = DEBUG_ADMIN_TOOL_NAMES
|
|
|
|
COMPANY_ALL_COLLABORATION_TOOL_NAMES: tuple[str, ...] = tuple(
|
|
dict.fromkeys(
|
|
[
|
|
*COMPANY_COLLABORATION_TOOL_NAMES,
|
|
*COMPANY_DEBUG_TOOL_NAMES,
|
|
]
|
|
)
|
|
)
|
|
|
|
COMPANY_APPROVAL_EXEMPT_TOOL_NAMES: tuple[str, ...] = (
|
|
*COMPANY_ALL_COLLABORATION_TOOL_NAMES,
|
|
)
|
|
|
|
MULTI_TEAM_COORDINATION_TURN_MODES: frozenset[str] = frozenset(
|
|
{
|
|
"dispatch_required",
|
|
"monitor_children",
|
|
"synthesize_required",
|
|
"deliver_required",
|
|
}
|
|
)
|
|
|
|
# Kanban-push review turn: a dedicated review Task is the only thing running
|
|
# in the seat. The manager emits a structured verdict as part of the turn
|
|
# output; the runtime (``_finalize_review_work_item``) auto-applies it to
|
|
# the child work item. The restricted toolset keeps the turn focused on
|
|
# judgement — no delegation / messaging / dispatch side-channels.
|
|
REVIEW_EXECUTE_TURN_MODE: str = "review_execute"
|
|
REVIEW_EXECUTE_TOOL_NAMES: frozenset[str] = frozenset(
|
|
{
|
|
"manager_board_read",
|
|
}
|
|
)
|
|
|
|
MULTI_TEAM_COORDINATOR_LEGACY_TOOL_NAMES: frozenset[str] = frozenset(
|
|
{
|
|
"propose_task_adjustment",
|
|
"route_work",
|
|
}
|
|
)
|
|
|
|
|
|
def _task_metadata(task: object | None) -> dict[str, Any]:
|
|
return dict(getattr(task, "metadata", {}) or {}) if task is not None else {}
|
|
|
|
|
|
def _task_context_snapshot(task: object | None) -> dict[str, Any]:
|
|
return dict(getattr(task, "context_snapshot", {}) or {}) if task is not None else {}
|
|
|
|
|
|
def _work_item_turn_type(metadata: dict[str, Any]) -> str:
|
|
for key in ("work_item_turn_type", "work_item_turn_type", "work_kind", "delegation_turn_kind"):
|
|
value = str(metadata.get(key, "") or "").strip().lower()
|
|
if value:
|
|
return value
|
|
return ""
|
|
|
|
|
|
def _runtime_state_dict(runtime_state: Any | None) -> dict[str, Any]:
|
|
return dict(runtime_state or {}) if isinstance(runtime_state, dict) else {}
|
|
|
|
|
|
def _role_type_hint(role_cfg: Any | None, runtime_state: dict[str, Any]) -> str:
|
|
if role_cfg is not None:
|
|
runtime_policy = getattr(role_cfg, "runtime_policy", None)
|
|
hinted = str(
|
|
getattr(runtime_policy, "role_type", "")
|
|
or (runtime_policy.get("role_type", "") if isinstance(runtime_policy, dict) else "")
|
|
or getattr(role_cfg, "role_type", "")
|
|
or ""
|
|
).strip().lower()
|
|
if hinted:
|
|
return hinted
|
|
return str(runtime_state.get("role_type", "") or "").strip().lower()
|
|
|
|
|
|
def _can_spawn_hint(role_cfg: Any | None, runtime_state: dict[str, Any]) -> bool:
|
|
if role_cfg is not None:
|
|
can_spawn = [str(item).strip() for item in list(getattr(role_cfg, "can_spawn", []) or []) if str(item).strip()]
|
|
if can_spawn:
|
|
return True
|
|
return bool(
|
|
[
|
|
str(item).strip()
|
|
for item in list(runtime_state.get("can_spawn", []) or [])
|
|
if str(item).strip()
|
|
]
|
|
)
|
|
|
|
|
|
def _is_execute_or_review_work_item(task: object | None) -> bool:
|
|
metadata = _task_metadata(task)
|
|
if not company_collaboration_enabled(str(metadata.get("execution_mode", "") or "")):
|
|
return False
|
|
turn_type = _work_item_turn_type(metadata)
|
|
return turn_type in {"execute", "review"}
|
|
|
|
|
|
def is_self_evolution_work_item(task: object | None) -> bool:
|
|
metadata = _task_metadata(task)
|
|
if _work_item_turn_type(metadata) == "self_evolution":
|
|
return True
|
|
return bool(metadata.get("self_evolution_work_item", False))
|
|
|
|
|
|
def _has_active_meeting(task: object | None, runtime_state: dict[str, Any]) -> bool:
|
|
metadata = _task_metadata(task)
|
|
peer_wait = dict(metadata.get("peer_wait", {}) or {})
|
|
if str(peer_wait.get("kind", "") or "").strip().lower() == "meeting":
|
|
return True
|
|
context_snapshot = _task_context_snapshot(task)
|
|
for bucket in (
|
|
context_snapshot.get("company_member_inbox", []),
|
|
context_snapshot.get("company_member_protocol_backlog", []),
|
|
context_snapshot.get("company_member_notification_backlog", []),
|
|
context_snapshot.get("broker_pending_inbox", []),
|
|
):
|
|
for item in list(bucket or []):
|
|
if isinstance(item, dict) and (
|
|
str(item.get("meeting_room_id", "") or "").strip()
|
|
or str(dict(item.get("metadata", {}) or {}).get("meeting_room_id", "") or "").strip()
|
|
):
|
|
return True
|
|
latest_company_notification = dict(context_snapshot.get("latest_company_notification", {}) or {})
|
|
if str(latest_company_notification.get("meeting_room_id", "") or "").strip():
|
|
return True
|
|
if str(runtime_state.get("meeting_room_id", "") or "").strip():
|
|
return True
|
|
if bool(runtime_state.get("active_meeting", False)):
|
|
return True
|
|
return False
|
|
|
|
|
|
def _human_review_close_allowed(task: object | None, runtime_state: dict[str, Any]) -> bool:
|
|
metadata = _task_metadata(task)
|
|
context_snapshot = _task_context_snapshot(task)
|
|
return any(
|
|
bool(source.get("human_review_close_allowed", False))
|
|
or str(source.get("human_review_checkpoint_type", "") or "").strip() == "company_delivery_feedback"
|
|
for source in (metadata, context_snapshot, runtime_state)
|
|
)
|
|
|
|
|
|
def resolve_company_turn_mode(
|
|
task: object | None,
|
|
runtime_state: dict[str, Any] | None = None,
|
|
) -> str:
|
|
metadata = _task_metadata(task)
|
|
context_snapshot = _task_context_snapshot(task)
|
|
state = _runtime_state_dict(runtime_state)
|
|
runtime_model = str(
|
|
metadata.get("runtime_model", "")
|
|
or context_snapshot.get("runtime_model", "")
|
|
or state.get("runtime_model", "")
|
|
or ""
|
|
).strip()
|
|
if runtime_model != "multi_team_org":
|
|
return ""
|
|
for candidate in (
|
|
state.get("current_turn_mode"),
|
|
dict(state.get("manager_digest", {}) or {}).get("current_turn_mode"),
|
|
metadata.get("current_turn_mode"),
|
|
context_snapshot.get("current_turn_mode"),
|
|
dict(metadata.get("member_session_state", {}) or {}).get("current_turn_mode"),
|
|
dict(context_snapshot.get("member_session", {}) or {}).get("current_turn_mode"),
|
|
dict(metadata.get("resident_assignment", {}) or {}).get("metadata", {}).get("current_turn_mode"),
|
|
dict(context_snapshot.get("resident_assignment", {}) or {}).get("metadata", {}).get("current_turn_mode"),
|
|
dict(context_snapshot.get("manager_digest", {}) or {}).get("current_turn_mode"),
|
|
):
|
|
value = str(candidate or "").strip()
|
|
if value:
|
|
return value
|
|
return ""
|
|
|
|
|
|
def resolve_collaboration_profile(
|
|
task: object | None,
|
|
role: str = "",
|
|
seat: str = "",
|
|
runtime_state: dict[str, Any] | None = None,
|
|
*,
|
|
role_cfg: Any | None = None,
|
|
debug_admin: bool = False,
|
|
) -> str:
|
|
"""Resolve the collaboration capability profile for a task/seat."""
|
|
metadata = _task_metadata(task)
|
|
state = _runtime_state_dict(runtime_state)
|
|
if not company_collaboration_enabled_for_task(task):
|
|
return COLLAB_PROFILE_DISABLED
|
|
if debug_admin or bool(metadata.get("collaboration_debug_admin", False)) or bool(state.get("debug_admin", False)):
|
|
return COLLAB_PROFILE_DEBUG_ADMIN
|
|
|
|
managed_team_id = str(
|
|
metadata.get("managed_team_id", "")
|
|
or state.get("managed_team_id", "")
|
|
or dict(metadata.get("member_session_state", {}) or {}).get("metadata", {}).get("managed_team_id", "")
|
|
or ""
|
|
).strip()
|
|
role_type = _role_type_hint(role_cfg, state)
|
|
can_spawn = _can_spawn_hint(role_cfg, state)
|
|
manager_board_summary = (
|
|
dict(state.get("manager_board_summary", {}) or {})
|
|
or dict(_task_context_snapshot(task).get("manager_board_summary", {}) or {})
|
|
)
|
|
work_item_turn_type = _work_item_turn_type(metadata)
|
|
|
|
if role_type == "coordinator" or can_spawn:
|
|
return COLLAB_PROFILE_COORDINATOR_DEFAULT
|
|
if managed_team_id or manager_board_summary or work_item_turn_type in {"intake", "plan", "dispatch", "monitor", "aggregate", "deliver"}:
|
|
return COLLAB_PROFILE_MANAGER_DEFAULT
|
|
if _is_execute_or_review_work_item(task):
|
|
return COLLAB_PROFILE_WORKER_EXECUTE_REVIEW
|
|
return COLLAB_PROFILE_WORKER_DEFAULT
|
|
|
|
|
|
def resolve_allowed_collaboration_tools(
|
|
profile: str,
|
|
task: object | None = None,
|
|
runtime_state: dict[str, Any] | None = None,
|
|
) -> set[str]:
|
|
"""Return the collaboration tools visible for the resolved profile."""
|
|
state = _runtime_state_dict(runtime_state)
|
|
if profile == COLLAB_PROFILE_DISABLED:
|
|
return set()
|
|
if profile == COLLAB_PROFILE_DEBUG_ADMIN:
|
|
return set(DEBUG_ADMIN_TOOL_NAMES)
|
|
if profile == COLLAB_PROFILE_WORKER_EXECUTE_REVIEW:
|
|
allowed = set(WORKER_EXECUTE_REVIEW_TOOL_NAMES)
|
|
elif profile == COLLAB_PROFILE_MANAGER_DEFAULT:
|
|
allowed = set(MANAGER_DEFAULT_TOOL_NAMES)
|
|
elif profile == COLLAB_PROFILE_COORDINATOR_DEFAULT:
|
|
allowed = set(COORDINATOR_DEFAULT_TOOL_NAMES)
|
|
else:
|
|
allowed = set(WORKER_DEFAULT_TOOL_NAMES)
|
|
turn_mode = resolve_company_turn_mode(task, runtime_state=state)
|
|
if turn_mode == REVIEW_EXECUTE_TURN_MODE and str(_task_metadata(task).get("runtime_model", "") or "").strip() == "multi_team_org":
|
|
return set(REVIEW_EXECUTE_TOOL_NAMES)
|
|
if turn_mode in MULTI_TEAM_COORDINATION_TURN_MODES:
|
|
allowed.discard("ask_peer_and_wait")
|
|
if turn_mode and str(_task_metadata(task).get("runtime_model", "") or "").strip() == "multi_team_org":
|
|
allowed.difference_update(MULTI_TEAM_COORDINATOR_LEGACY_TOOL_NAMES)
|
|
if _has_active_meeting(task, state):
|
|
allowed.update(MEETING_RESPONSE_TOOL_NAMES)
|
|
if _human_review_close_allowed(task, state):
|
|
allowed.update(HUMAN_REVIEW_TOOL_NAMES)
|
|
if is_self_evolution_work_item(task):
|
|
allowed.update(SELF_EVOLUTION_TOOL_NAMES)
|
|
return allowed
|
|
|
|
|
|
def resolve_task_collaboration_tools(
|
|
task: object | None,
|
|
*,
|
|
role: str = "",
|
|
seat: str = "",
|
|
runtime_state: dict[str, Any] | None = None,
|
|
role_cfg: Any | None = None,
|
|
debug_admin: bool = False,
|
|
) -> tuple[str, set[str]]:
|
|
profile = resolve_collaboration_profile(
|
|
task,
|
|
role=role,
|
|
seat=seat,
|
|
runtime_state=runtime_state,
|
|
role_cfg=role_cfg,
|
|
debug_admin=debug_admin,
|
|
)
|
|
return profile, resolve_allowed_collaboration_tools(profile, task=task, runtime_state=runtime_state)
|