fix(ui): enforce durable org identity for runtime followups
This commit is contained in:
@@ -260,6 +260,155 @@ def test_work_item_chat_resume_uses_canonical_ui_anchor_as_engine_origin() -> No
|
||||
asyncio.run(scenario())
|
||||
|
||||
|
||||
def test_company_suspend_reply_routes_selected_org_to_engine() -> None:
|
||||
async def scenario() -> None:
|
||||
_tasks, checkpoint = _runtime_records()
|
||||
handler = WSHandler.__new__(WSHandler)
|
||||
handler._exec_mode = "task"
|
||||
handler._company_profile = "corporate"
|
||||
handler._shutting_down = False
|
||||
handler._active_runtime_children = {}
|
||||
handler._session_to_task = {}
|
||||
handler._task_bg_context = {}
|
||||
handler._company_suspend_reply_locks = {"runtime-session": asyncio.Lock()}
|
||||
handler.chat_store = None
|
||||
handler._set_company_runtime_control = AsyncMock()
|
||||
handler._normalize_session_exec_mode = MagicMock(return_value="task")
|
||||
handler._normalize_session_company_profile = MagicMock(return_value="corporate")
|
||||
handler._resolve_task_session_config = MagicMock(return_value=("org", "custom"))
|
||||
handler._resolve_task_org_id = MagicMock(return_value="selected-org")
|
||||
handler._extract_checkpoint_metadata = AsyncMock(return_value=None)
|
||||
handler._sync_task_transcript_messages = AsyncMock()
|
||||
handler.on_kanban_changed = AsyncMock()
|
||||
handler._flush_progress = AsyncMock()
|
||||
run_engine = SimpleNamespace(
|
||||
project_id="project-a",
|
||||
process_message=AsyncMock(return_value="resumed"),
|
||||
)
|
||||
target = {
|
||||
"ui_anchor_task_id": "ui-anchor",
|
||||
"config_task": SimpleNamespace(
|
||||
metadata={"exec_mode": "org", "company_profile": "custom"},
|
||||
org_id="selected-org",
|
||||
),
|
||||
}
|
||||
|
||||
await handler._process_company_suspend_reply(
|
||||
ui_task_id="final-decider",
|
||||
runtime_session_id="runtime-session",
|
||||
content="continue",
|
||||
attachment_refs=None,
|
||||
message_metadata={"ui_force_resume": True},
|
||||
user_message_id=None,
|
||||
user_message_created_at=None,
|
||||
run_engine=run_engine,
|
||||
run_project_id="project-a",
|
||||
target=target,
|
||||
checkpoint=checkpoint,
|
||||
lock=handler._company_suspend_reply_locks["runtime-session"],
|
||||
)
|
||||
|
||||
call = run_engine.process_message.await_args
|
||||
assert call.kwargs["org_id"] == "selected-org"
|
||||
|
||||
asyncio.run(scenario())
|
||||
|
||||
|
||||
def test_delivery_feedback_reply_fails_closed_without_durable_parent_task() -> None:
|
||||
async def scenario() -> None:
|
||||
handler = WSHandler.__new__(WSHandler)
|
||||
handler._exec_mode = "task"
|
||||
handler._company_profile = "corporate"
|
||||
handler._shutting_down = False
|
||||
handler._active_runtime_children = {}
|
||||
handler._session_to_task = {}
|
||||
handler._task_bg_context = {}
|
||||
handler._company_delivery_feedback_reply_locks = {}
|
||||
handler.chat_store = None
|
||||
handler._store_is_ready = MagicMock(return_value=True)
|
||||
handler._normalize_session_exec_mode = MagicMock(return_value="task")
|
||||
handler._normalize_session_company_profile = MagicMock(return_value="corporate")
|
||||
handler._resolve_task_session_config = MagicMock(return_value=("org", "custom"))
|
||||
handler._resolve_task_org_id = MagicMock(return_value="")
|
||||
handler._chat_store_is_ready = MagicMock(return_value=False)
|
||||
handler._flush_progress = AsyncMock()
|
||||
run_engine = SimpleNamespace(
|
||||
project_id="project-a",
|
||||
store=SimpleNamespace(get_task=AsyncMock(return_value=None)),
|
||||
run_company_delivery_self_evolution_checkpoint=AsyncMock(return_value="ran"),
|
||||
)
|
||||
|
||||
await handler._process_company_delivery_feedback_reply(
|
||||
parent_task_id="delivery-task",
|
||||
parent_session_id="delivery-session",
|
||||
reply_channel_id="session:delivery-task",
|
||||
content="approved",
|
||||
attachment_refs=None,
|
||||
message_metadata=None,
|
||||
user_message_id=None,
|
||||
user_message_created_at=None,
|
||||
run_engine=run_engine,
|
||||
run_project_id="project-a",
|
||||
checkpoint=SimpleNamespace(checkpoint_id="cp-delivery", payload={}),
|
||||
waiting_task_id="delivery-task",
|
||||
lock=asyncio.Lock(),
|
||||
)
|
||||
|
||||
run_engine.run_company_delivery_self_evolution_checkpoint.assert_not_awaited()
|
||||
handler._resolve_task_org_id.assert_not_called()
|
||||
|
||||
asyncio.run(scenario())
|
||||
|
||||
|
||||
def test_delivery_feedback_reply_proceeds_with_durable_parent_task() -> None:
|
||||
async def scenario() -> None:
|
||||
handler = WSHandler.__new__(WSHandler)
|
||||
handler._exec_mode = "task"
|
||||
handler._company_profile = "corporate"
|
||||
handler._shutting_down = False
|
||||
handler._active_runtime_children = {}
|
||||
handler._session_to_task = {}
|
||||
handler._task_bg_context = {}
|
||||
handler._company_delivery_feedback_reply_locks = {}
|
||||
handler.chat_store = None
|
||||
handler._store_is_ready = MagicMock(return_value=True)
|
||||
handler._normalize_session_exec_mode = MagicMock(return_value="task")
|
||||
handler._normalize_session_company_profile = MagicMock(return_value="corporate")
|
||||
handler._resolve_task_session_config = MagicMock(return_value=("org", "custom"))
|
||||
handler._resolve_task_org_id = MagicMock(return_value="selected-org")
|
||||
handler._chat_store_is_ready = MagicMock(return_value=False)
|
||||
handler._flush_progress = AsyncMock()
|
||||
parent_task = SimpleNamespace(id="delivery-task")
|
||||
run_engine = SimpleNamespace(
|
||||
project_id="project-a",
|
||||
store=SimpleNamespace(get_task=AsyncMock(return_value=parent_task)),
|
||||
run_company_delivery_self_evolution_checkpoint=AsyncMock(return_value="ran"),
|
||||
)
|
||||
|
||||
await handler._process_company_delivery_feedback_reply(
|
||||
parent_task_id="delivery-task",
|
||||
parent_session_id="delivery-session",
|
||||
reply_channel_id="session:delivery-task",
|
||||
content="approved",
|
||||
attachment_refs=None,
|
||||
message_metadata=None,
|
||||
user_message_id=None,
|
||||
user_message_created_at=None,
|
||||
run_engine=run_engine,
|
||||
run_project_id="project-a",
|
||||
checkpoint=SimpleNamespace(checkpoint_id="cp-delivery", payload={}),
|
||||
waiting_task_id="delivery-task",
|
||||
lock=asyncio.Lock(),
|
||||
)
|
||||
|
||||
call = run_engine.run_company_delivery_self_evolution_checkpoint.await_args
|
||||
assert call is not None
|
||||
assert call.kwargs["action"] == "approve"
|
||||
handler._resolve_task_org_id.assert_called_once_with(parent_task)
|
||||
|
||||
asyncio.run(scenario())
|
||||
|
||||
|
||||
def test_suspend_reply_missing_custom_org_id_fails_closed_before_engine_call() -> None:
|
||||
async def scenario() -> None:
|
||||
_tasks, checkpoint = _runtime_records()
|
||||
|
||||
Reference in New Issue
Block a user