Skip to content

Integration tests — T2 ​

Temporal's time-skipping test server (WorkflowEnvironment.start_time_skipping(), binary cached under ~/.cache/temporalio), the fixture MCP server over stdio, FakeLLM, and the A2A server in-process over httpx.ASGITransport. Run on 2026-10-10 at the head of the Layer 9 stack.

Run ​

text
## uv run pytest tests/integration -q
32 passed, 304 warnings in 50.94s

The warnings are Pydantic deprecation notices raised inside temporalio's payload converter, not in tiny-harness.

Scenarios ​

the-loop scenarios --root . --glob 'tests/integration/**/*.py' --format markdown:

#FeatureScenarioRequirementLocation
1A2A serverSendStreamingMessage streams a Task then status updates through the bridgedocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:90
2A2A serverGetTask and ListTasks read the workflowdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:121
3A2A serveran unadvertised extension is rejecteddocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:141
4A2A serverreturnImmediately returns after the task existsdocs/specs/issue-3/requirements.md#R15tests/integration/a2a/test_server.py:170
5A2A serverpush notification configs receive status updatesdocs/specs/issue-3/requirements.md#R15tests/integration/a2a/test_server.py:208
6A2A servercancel emits CANCELEDdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:255
7A2A serverSubscribeToTask after a server restart replays the event logdocs/specs/issue-3/requirements.md#R14tests/integration/a2a/test_server.py:291
8A2UIemit_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
9Remote agentsdelegation to a remote A2A agent tracks the sub-task statedocs/specs/issue-3/requirements.md#R7tests/integration/agents/test_remote_agents.py:46
10Durable core loopa task runs the loop to completion with recorded activity resultsdocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:43
11Durable core loopa worker crash mid-activity resumes without a second LLM calldocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:77
12Durable core loopa non-idempotent tool failure is not retrieddocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:114
13Durable core loopactivity.failed and activity.retried hooks run between workflow-managed attemptsdocs/specs/issue-3/requirements.md#R19tests/integration/durable/test_core_loop.py:156
14Durable 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:204
15Durable 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:237
16Durable 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:263
17Durable core loopa parent waits for an unresolved sub-task before completingdocs/specs/issue-3/requirements.md#R8tests/integration/durable/test_core_loop.py:316
18Heartbeata schedule tick forwards a pull-channel message to its taskdocs/specs/issue-3/requirements.md#R16tests/integration/heartbeat/test_heartbeat.py:75
19Heartbeatthe heartbeat is a Temporal scheduledocs/specs/issue-3/requirements.md#R16tests/integration/heartbeat/test_heartbeat.py:145
20Help requestsa reply on the channel resumes an INPUT_REQUIRED taskdocs/specs/issue-3/requirements.md#R12tests/integration/help/test_help_requests.py:69
21Help 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:99
22Help requestsa non-member's channel message is rejecteddocs/specs/issue-3/requirements.md#R13tests/integration/help/test_help_requests.py:138
23Observabilityone span per operation with GenAI attributes crosses the workflow boundarydocs/specs/issue-3/requirements.md#R17tests/integration/o11y/test_observability.py:58
24Pluginsthe 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
25Pluginsa directory plugin registers its skills, MCP tools, hooks and promptsdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:44
26Pluginsa programmatic plugin registers the same componentsdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:79
27Pluginsa duplicate (id, version) is refused unless the loading order overrides itdocs/specs/issue-3/requirements.md#R3tests/integration/plugins/test_plugin_loading.py:119
28Pluginsa 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
29tiny_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
30MCP toolsa stdio MCP server's tools are registered with their schemasdocs/specs/issue-3/requirements.md#R6tests/integration/tools/test_mcp.py:27
31MCP toolsa tool's text result is returned untrusteddocs/specs/issue-3/requirements.md#R6tests/integration/tools/test_mcp.py:65