Skip to content

Integration tests ​

Issue #25, verification run on 2026-10-12 against loop/issue-25 at 2393e75. Testing-plan rows: T2.

uv run pytest tests/integration (Temporal's time-skipping test server, the local dev server, and embedded mode; every model is scripted)

text
86 passed, 626 warnings in 79.58s (0:01:19)
rc=0 secs=81

Scenarios ​

the-loop scenarios --root "$PWD" --glob 'tests/integration/**/*.py' --format markdown

#FeatureScenarioRequirementLocation
1A2A serverno asserted participant is refused everywheredocs/specs/issue-3/requirements.md#R14 (abuse case 4)tests/integration/a2a/test_access.py:92
2Commands over the A2A serverA command that changes the task replies on the sender's streamdocs/specs/issue-25/requirements.md#R9tests/integration/a2a/test_command_stream.py:59
3SubscribeToTaskA subscriber to a parked conversation stays attached for live eventsdocs/specs/issue-3/requirements.md#R20tests/integration/a2a/test_command_stream.py:127
4A2A serverSendStreamingMessage streams a Task then status updates through the bridgedocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:99
5A2A serverGetTask and ListTasks read the workflowdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:134
6A2A serveran unadvertised extension is rejecteddocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:156
7A2A serverreturnImmediately returns after the task existsdocs/specs/issue-3/requirements.md#R15tests/integration/a2a/test_server.py:185
8A2A serverpush notification configs receive status updatesdocs/specs/issue-3/requirements.md#R15tests/integration/a2a/test_server.py:218
9A2A servera push config's credentials round-trip through get, list and deletedocs/specs/issue-23/requirements.md#R2tests/integration/a2a/test_server.py:289
10A2A servera push config stored encrypted by an earlier version is dropped, not delivereddocs/specs/issue-23/requirements.md#R4tests/integration/a2a/test_server.py:344
11A2A servercancel emits CANCELEDdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:390
12A2A serverSubscribeToTask after a server restart replays the event logdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:426
13A2UIemit_ui streams A2UI parts and an action from the renderer reaches the taskdocs/specs/issue-3/requirements.md#R20tests/integration/a2ui/test_a2ui.py:103
14Remote agentsdelegation to a remote A2A agent tracks the sub-task statedocs/specs/issue-3/requirements.md#R7tests/integration/agents/test_remote_agents.py:55
15OpenAI-compatible endpointsHarness completes a task against an OpenAI-compatible Responses endpointdocs/specs/issue-19/requirements.md#R3tests/integration/compat/test_compat_endpoint.py:68
16OpenAI-compatible endpointsHarness completes a task against an OpenAI-compatible Chat Completions endpointdocs/specs/issue-19/requirements.md#R3tests/integration/compat/test_compat_endpoint.py:94
17OpenAI-compatible endpointsA retryable endpoint failure is retried and the task completesdocs/specs/issue-19/requirements.md#R5tests/integration/compat/test_compat_endpoint.py:122
18Built-in commands/sub-task creates a linked conversation task and replies with its iddocs/specs/issue-25/requirements.md#R9tests/integration/durable/test_builtin_commands.py:84
19Built-in commandsa participant's /sub-task is noted in the parent's historydocs/specs/issue-25/requirements.md#R9tests/integration/durable/test_builtin_commands.py:132
20Built-in commands/model and /effort sent as commands change the next model requestdocs/specs/issue-25/requirements.md#R7tests/integration/durable/test_builtin_commands.py:172
21Built-in commandsA plugin command overrides a built-in and a pre hook can refuse itdocs/specs/issue-25/requirements.md#R6atests/integration/durable/test_builtin_commands.py:213
22Built-in commandsA remote command executor that fails leaves the task unchangeddocs/specs/issue-25/requirements.md#R6atests/integration/durable/test_builtin_commands.py:275
23Slash commandsA command runs without invoking the model and the state is unchangeddocs/specs/issue-25/requirements.md#R6tests/integration/durable/test_commands.py:93
24Slash commandsA command sent during a running turn replies without joining the historydocs/specs/issue-25/requirements.md#R6tests/integration/durable/test_commands.py:138
25Slash commandsA failing command replies with the error and changes nothingdocs/specs/issue-25/requirements.md#R6tests/integration/durable/test_commands.py:176
26Slash commandsA command's intents are applied by the workflow, settings then spawn then replydocs/specs/issue-25/requirements.md#R9tests/integration/durable/test_commands.py:215
27Slash commandsA participant task still completes on the assignee's answer, and a command does notdocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_commands.py:275
28Participant completionA participant completes a task and every subscriber sees COMPLETEDdocs/specs/issue-25/requirements.md#R5tests/integration/durable/test_complete.py:98
29Participant completionCompleting a task interrupts the turn in progressdocs/specs/issue-25/requirements.md#R5tests/integration/durable/test_complete.py:155
30Participant completionCompleting or cancelling a terminal task names its statedocs/specs/issue-25/requirements.md#R5tests/integration/durable/test_complete.py:201
31Participant completionCompletion is refused while a sub-task is opendocs/specs/issue-25/requirements.md#R5tests/integration/durable/test_complete.py:239
32Conversation task lifecycleA reply leaves a conversation task awaiting the next messagedocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_conversation_lifecycle.py:66
33Conversation task lifecycleThe next message resumes the same task and clears the sub-statedocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_conversation_lifecycle.py:107
34Conversation task lifecycleA refused message does not wake a parked conversationdocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_conversation_lifecycle.py:157
35Conversation task lifecycleask_participant parks the task awaiting an answerdocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_conversation_lifecycle.py:193
36Conversation task lifecycleA delegated sub-task still completes when its loop endsdocs/specs/issue-25/requirements.md#R3tests/integration/durable/test_conversation_lifecycle.py:240
37Durable core loopa task runs the loop to its reply with recorded activity resultsdocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:52
38Durable core loopa worker crash mid-activity resumes without a second LLM calldocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:90
39Durable core loopa non-idempotent tool failure is not retrieddocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:128
40Durable core loopactivity.failed and activity.retried hooks run between workflow-managed attemptsdocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:171
41Durable core loopan inbox message to an executing task is drained at the next iterationdocs/specs/issue-3/requirements.md#R15tests/integration/durable/test_core_loop.py:220
42Durable core loopcompaction runs before the LLM call when the first message is over budgetdocs/specs/issue-3/requirements.md#R10tests/integration/durable/test_core_loop.py:255
43Durable core loopcontinue-as-new carries the mailbox, event log and pending help requestdocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:282
44Durable core loopa parent waits for an unresolved sub-task before completingdocs/specs/issue-3/requirements.md#R8tests/integration/durable/test_core_loop.py:336
45Inbox and eventsa task envelope updates an existing task within its sender's rightsdocs/specs/issue-3/requirements.md#R15tests/integration/durable/test_envelopes.py:63
46Per-task model and effort/model and /effort change the next model request, compaction and help includeddocs/specs/issue-25/requirements.md#R7tests/integration/durable/test_model_settings.py:58
47Per-task model and effortA task without settings uses the configured defaultsdocs/specs/issue-25/requirements.md#R7tests/integration/durable/test_model_settings.py:90
48Per-task model and effortThe compaction budget follows the task's modeldocs/specs/issue-25/requirements.md#R7tests/integration/durable/test_model_settings.py:113
49Sub-task lifecycle and settingsSub-tasks inherit the parent's model and effortdocs/specs/issue-25/requirements.md#R7tests/integration/durable/test_sub_tasks.py:62
50Sub-task lifecycle and settingsA conversation sub-task with no first message waits for onedocs/specs/issue-25/requirements.md#R9tests/integration/durable/test_sub_tasks.py:133
51Embedded Temporal modeTUI hosts its own harness in embedded modedocs/specs/issue-17/requirements.md#R5tests/integration/embedded/test_cli_embedded.py:73
52TUI participant assertionTUI sends a message under the asserted participantdocs/specs/issue-20/bugfix.md#R1tests/integration/embedded/test_cli_embedded.py:129
53TUI task controlsThe real TUI completes a conversation and its sub-taskdocs/specs/issue-25/requirements.md#R9tests/integration/embedded/test_cli_embedded.py:183
54Embedded Temporal modeTUI with a URL starts no embedded serverdocs/specs/issue-17/requirements.md#R5tests/integration/embedded/test_cli_embedded.py:263
55Embedded Temporal modeAdmin commands act on persisted embedded statedocs/specs/issue-17/requirements.md#R5tests/integration/embedded/test_cli_embedded.py:292
56Embedded Temporal modeEmbedded server stops when serve receives SIGTERMdocs/specs/issue-17/requirements.md#R2tests/integration/embedded/test_cli_embedded.py:326
57Embedded Temporal modeEmbedded server stops when a program running serve receives SIGTERMdocs/specs/issue-17/requirements.md#R6tests/integration/embedded/test_cli_embedded.py:400
58Embedded Temporal modeEmbedded mode starts without Temporal credentialsdocs/specs/issue-17/requirements.md#R1tests/integration/embedded/test_embedded_temporal.py:149
59Embedded Temporal modeEmbedded server binds loopback onlydocs/specs/issue-17/requirements.md#R2tests/integration/embedded/test_embedded_temporal.py:167
60Embedded Temporal modeEmbedded server stops when the harness exitsdocs/specs/issue-17/requirements.md#R2tests/integration/embedded/test_embedded_temporal.py:197
61Embedded Temporal modeEmbedded state survives a restartdocs/specs/issue-17/requirements.md#R3tests/integration/embedded/test_embedded_temporal.py:230
62Embedded Temporal modeA second process cannot open the same embedded statedocs/specs/issue-17/design.md#security-designtests/integration/embedded/test_embedded_temporal.py:263
63Embedded Temporal modeProgrammatic harness runs a task in embedded modedocs/specs/issue-17/requirements.md#R6tests/integration/embedded/test_running_harness.py:105
64Embedded Temporal modeEmbedded server registers search attributes and the heartbeat scheduledocs/specs/issue-17/requirements.md#R2tests/integration/embedded/test_running_harness.py:131
65Embedded Temporal modeAn SDK harness serves its own commands and never touches the home directorydocs/specs/issue-25/requirements.md#R11tests/integration/embedded/test_running_harness.py:152
66Heartbeata schedule tick forwards a pull-channel message to its taskdocs/specs/issue-3/requirements.md#R16tests/integration/heartbeat/test_heartbeat.py:83
67Heartbeatthe heartbeat is a Temporal scheduledocs/specs/issue-3/requirements.md#R16tests/integration/heartbeat/test_heartbeat.py:154
68Help requestsa reply on the channel resumes an INPUT_REQUIRED taskdocs/specs/issue-3/requirements.md#R12tests/integration/help/test_help_requests.py:78
69Help requestsa need that blocks on another participant's work creates a sub-taskdocs/specs/issue-3/requirements.md#R12tests/integration/help/test_help_requests.py:109
70Help requestsa non-member's channel message is rejecteddocs/specs/issue-3/requirements.md#R13tests/integration/help/test_help_requests.py:150
71Observabilityone span per operation with GenAI attributes crosses the workflow boundarydocs/specs/issue-3/requirements.md#R17tests/integration/o11y/test_observability.py:66
72Pluginsthe built-in plugin loads first and is overridable by a lower-priority executordocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_builtin_plugin.py:26
73Pluginsa directory plugin registers its skills, MCP tools, hooks and promptsdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:44
74Pluginsa programmatic plugin registers the same componentsdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:79
75Pluginsa duplicate (id, version) is refused unless the loading order overrides itdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:119
76Pluginsa loaded skill's MCP tools appear and disappear with load and unloaddocs/specs/issue-3/requirements.md#R5tests/integration/plugins/test_skill_tools.py:55
77tiny_harness is installable as a packagethe built wheel installs and exposes the package versiondocs/specs/issue-2/requirements.md#R2tests/integration/test_package.py:22
78MCP toolsa stdio MCP server's tools are registered with their schemasdocs/specs/issue-3/requirements.md#R6tests/integration/tools/test_mcp.py:27
79MCP toolsa tool's text result is returned untrusteddocs/specs/issue-3/requirements.md#R6tests/integration/tools/test_mcp.py:65