
> @relayflows/sdk@2.0.30 test
> sh scripts/test.sh


> @relayflows/sdk@2.0.30 test:prep
> ( cd ../../kernel && sh ../ops/cargo.sh build ) && ( [ ! -d ../../testdata/preflight ] || find ../../testdata/preflight -name '*-cli' -type f -exec chmod +x {} + )

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06s

> @relayflows/sdk@2.0.30 typecheck
> tsc --noEmit && tsc -p tsconfig.type-tests.json


> @relayflows/sdk@2.0.30 build
> tsc && node scripts/make-cli-executable.mjs


> @relayflows/sdk@2.0.30 typecheck:tests
> tsc -p tsconfig.tests.json


 RUN  v2.1.9 /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk

stdout | tests/live-kernel.test.ts
LIVE_KERNEL relayflowd=/home/daytona/.relayflows-toolchain/target/2962130851/debug/relayflowd
LIVE_KERNEL flows=/home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk/dist/cli.js

 ✓ tests/preflight.test.ts (67 tests) 131ms
 ✓ tests/cloud-read.test.ts (44 tests) 72ms
 ✓ tests/cli.test.ts (70 tests) 1878ms
   ✓ flows check CLI > binds a checked relative wrapper to the flow directory for worker execution 432ms
   ✓ flows check CLI > resolves a bare PATH-resolved claude with no declared model, in an isolated PATH 461ms
 ❯ tests/hosted-extension-isolation.test.ts (22 tests | 14 failed) 302ms
   × hosted extension capability isolation > executes the exact capability-only handler for a queued receipt 11ms
     → bubblewrap is unavailable
   × hosted extension capability isolation > executes the exact capability-only handler for a duplicate receipt 3ms
     → bubblewrap is unavailable
   × hosted extension capability isolation > launches through the captured process primitive after builtin export synchronization 7ms
     → promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
   × hosted extension capability isolation > ignores inherited launcher overrides and decodes manifests with the captured Buffer intrinsic 3ms
     → promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
   × hosted extension capability isolation > streams verified bytes when the live store is replaced and no writable staging path exists 214ms
     → promise rejected "Error: Hosted extension sandbox exited wi… { code: '…' }" instead of resolving
   × hosted extension capability isolation > mounts pinned private Surface bytes when the live package changes before launch 4ms
     → promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
   × hosted extension capability isolation > refuses oversized Surface files through the bounded descriptor reader 6ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_unsupported', …(1) }
   × hosted extension capability isolation > shields verified Surface files before async settlement 4ms
     → promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
   × hosted extension capability isolation > preserves a typed host refusal while disclosing only a fixed marker to the child 2ms
     → expected Error: bubblewrap is unavailable { code: '…' } to be Error: private Cloud policy detail { code: '…' } // Object.is equality
   × hosted extension capability isolation > denies ambient credentials, host files, writes, network, subprocesses, and undeclared context verbs 7ms
     → bubblewrap is unavailable
   × hosted extension capability isolation > enforces OS address-space and data bounds on native Buffer allocation 2ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_unsupported', …(1) }
   × hosted extension capability isolation > blocks extra handler fields and authority-bearing receipt fields at the parent port 2ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }
   × hosted extension capability isolation > constructs adapter authority with the captured freeze intrinsic 2ms
     → bubblewrap is unavailable
   × hosted extension capability isolation > writes the Surface manifest and protocol without inherited toJSON behavior 2ms
     → promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ✓ tests/cloud-live.test.ts (55 tests) 2073ms
   ✓ argv and wiring > routes both live invocations through runCli, and refuses a missing run id 2005ms
 ✓ tests/cloud-sync.test.ts (40 tests) 997ms
 ✓ tests/plugin-extension.test.ts (90 tests) 444ms
 ✓ tests/cloud-transcript-codex.test.ts (39 tests) 15ms
 ✓ tests/observer-link.test.ts (39 tests) 143ms
(node:24746) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 ✓ tests/authored-flow.test.ts (34 tests) 796ms
 ✓ tests/agent-transcript.test.ts (29 tests) 289ms
 ✓ tests/cli-status.test.ts (27 tests) 1037ms
   ✓ flows status > resolves the run with no arguments from inside a worker-spawned agent 789ms
 ✓ tests/cloud-run.test.ts (58 tests) 726ms
 ✓ tests/relay-cli-surface.test.ts (77 tests) 32ms
 ✓ tests/babysitter-native-extension.test.ts (41 tests | 1 skipped) 1460ms
 ✓ tests/authored-completion-detail.test.ts (59 tests) 148ms
 ✓ tests/worker-cli.test.ts (18 tests) 26564ms
   ✓ registered CLI model defaults > passes the same priced Claude default to the real provider invocation 444ms
   ✓ step discovery environment > names the run, step, attempt and an absolute data dir for a direct agent spawn 462ms
   ✓ step discovery environment > exports none of the four without a data dir, even when the worker inherited them 440ms
   ✓ wrapper discovery environment > sets the four names from the dispatch and still refuses ambient values and other secrets 457ms
   ✓ wrapper discovery environment > exports none of the four to a wrapper without a data dir, even when the worker inherited them 433ms
   ✓ custom wrapper execution identity > passes an explicit safe environment at identification and execution 483ms
   ✓ custom wrapper execution identity > refuses a wrapper symlink retarget before delivering private values 379ms
   ✓ custom wrapper execution identity > bounds wrapper execution after acknowledgement 480ms
   ✓ custom wrapper execution identity > bounds captured wrapper output 425ms
   ✓ custom wrapper execution identity > refuses a duplicate execute protocol frame 415ms
   ✓ custom wrapper execution bounds are reader-owned > resolves when a conforming wrapper leaks a stdio pipe to a background helper 2047ms
   ✓ custom wrapper execution bounds are reader-owned > resolves when the leaked helper inherits stderr only 2013ms
   ✓ custom wrapper execution bounds are reader-owned > resolves when a wrapper leaks a stdio pipe and exits before identifying 3674ms
   ✓ custom wrapper execution bounds are reader-owned > journals a completionReason at the default bound when a wrapper leaks a stdio pipe 11709ms
   ✓ custom wrapper execution bounds are reader-owned > accepts an execute token and an over-8KiB payload flushed in one write 451ms
   ✓ custom wrapper execution bounds are reader-owned > accepts the same over-8KiB payload whether or not it coalesces with the execute token 1362ms
   ✓ custom wrapper execution bounds are reader-owned > still bounds an un-terminated handshake buffer and names the bound 458ms
   ✓ delivers the journaled memory pack to the real wrapper and excludes its charge from completion usage 428ms
 ✓ tests/authored-root.test.ts (20 tests) 167ms
 ✓ tests/step-failure-diagnostic.test.ts (25 tests) 59ms
 ✓ tests/daemon-lifecycle.test.ts (42 tests) 40ms
 ❯ tests/hosted-extension-protocol.test.ts (24 tests | 8 failed) 40097ms
   × hosted extension hostile protocol > uses captured JSON intrinsics for the complete parent boundary 6ms
     → bubblewrap is unavailable
   × hosted extension hostile protocol > rejects an import-time different PR frame with zero adapter calls 5ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }
   × hosted extension hostile protocol > rejects an import-time different delivery frame with zero adapter calls 2ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }
   × hosted extension hostile protocol > rejects an import-time different event frame with zero adapter calls 2ms
     → expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }
   × hosted extension hostile protocol > rejects two forged calls after the authoritative first outcome settles 10005ms
     → hostile child did not invoke the adapter
   × hosted extension hostile protocol > waits for a pending adapter to reject after a forged child error 10006ms
     → hostile child did not invoke the adapter
   × hosted extension hostile protocol > waits for a pending adapter to resolve after a forged child error 10006ms
     → hostile child did not invoke the adapter
   × hosted extension hostile protocol > returns a typed adapter rejection even when the hostile child hangs 10006ms
     → hostile child did not invoke the adapter
 ✓ tests/run-state.test.ts (21 tests) 11ms
 ✓ tests/stop-process-group.test.ts (9 tests) 13538ms
   ✓ every stop reaches the process group, not just the direct child > exits the run after an execution-timeout stop 961ms
   ✓ every stop reaches the process group, not just the direct child > exits the run after a protocol terminate stop 461ms
   ✓ every stop reaches the process group, not just the direct child > kills a SIGTERM-deaf grandchild after a protocol terminate stop 1747ms
   ✓ every stop reaches the process group, not just the direct child > kills a SIGTERM-deaf grandchild after an execution-timeout stop 2145ms
   ✓ every stop reaches the process group, not just the direct child > holds the loop open long enough for the escalation to run 1102ms
   ✓ a wrapper that exits with no execution deadline still drains > reports the wrapper result and reaps a grandchild holding its pipes 777ms
   ✓ a wrapper that exits with no execution deadline still drains > reaps a SIGTERM-deaf grandchild holding its pipes 1769ms
   ✓ a wrapper that exits with no execution deadline still drains > settles on its own deadline when an escaped holder withholds close 4309ms
 ✓ tests/cloud-deploy.test.ts (40 tests) 1019ms
stdout | tests/live-kernel.test.ts > surface resume after a real daemon kill > resumes a three-step run with each successful completion exactly once
LIVE_KERNEL kill -9 pid=26721 run=01M390STPPJXMPYQ2HD54Y20JF while step=two state=Running

 ✓ tests/hosted-base-snapshot.test.ts (18 tests) 2326ms
   ✓ hosted base private snapshot > stops streaming project entries at the shared count limit 2155ms
 ❯ tests/live-kernel.test.ts (32 tests | 9 failed) 55488ms
   ✓ built flows CLI against live relayflowd > twenty-six-step reuses 25 durable completions after editing the failed final step 2242ms
   ✓ built flows CLI against live relayflowd > runs rung (a), parks rung (b), and keeps JSON report-shaped 2704ms
   ✓ built flows CLI against live relayflowd > allows a deterministic run to exceed the bounded request timeout 32507ms
   ✓ built flows CLI against live relayflowd > follows a live worker dispatch through flows run 610ms
   ✓ built flows CLI against live relayflowd > runs an agent CLI end to end through the SDK worker 488ms
   ✓ built flows CLI against live relayflowd > f.agent lowers to a real agent step and dispatches through a live worker 961ms
   ✓ built flows CLI against live relayflowd > can always get a parked run to a late-attaching worker 5584ms
   ✓ built flows CLI against live relayflowd > reports a real manual-recovery NeedsHuman state as parked 479ms
   × built flows CLI against live relayflowd > runs hn-monitor analyze-story end-to-end via a stub agent CLI (gate 2 clause 2 demo) 523ms
     → expected { …(12) } to match object { output: { …(3) }, …(1) }
(22 matching properties omitted from actual)
   × built flows CLI against live relayflowd > hn-monitor analyze-story FAILS verification when the CLI omits required schema fields 608ms
     → expected { …(12) } to match object { …(3) }
(21 matching properties omitted from actual)
   × built flows CLI against live relayflowd > agent step preserves the CliResult wrapper as output when the CLI emits non-JSON text 513ms
     → expected null not to be null
   × built flows CLI against live relayflowd > AgentWorker exposes wake_context to the CLI via RELAYFLOW_WAKE_CONTEXT env var (real analyzer prerequisite) 594ms
     → Cannot read properties of null (reading 'story_title')
   × built flows CLI against live relayflowd > AgentWorker leaves RELAYFLOW_WAKE_CONTEXT UNSET when the run has no wake_context (undefined-vs-null pin) 539ms
     → Cannot read properties of null (reading 'env_present')
   ✓ built flows CLI against live relayflowd > AgentWorker passes a declared model to an identified wrapper as RELAYFLOW_MODEL 536ms
   ✓ built flows CLI against live relayflowd > AgentWorker refuses a nonconforming journal-submitted wrapper before exposing RELAYFLOW_MODEL 510ms
   ✓ built flows CLI against live relayflowd > AgentWorker executes the raw claude adapter with its real model flag 467ms
   ✓ built flows CLI against live relayflowd > AgentWorker executes the raw codex adapter with its real model flag 465ms
   × built flows CLI against live relayflowd > AgentWorker leaves RELAYFLOW_MODEL UNSET when the step declares no model 463ms
     → Cannot read properties of null (reading 'story_title')
   × built flows CLI against live relayflowd > hn-monitor analyze-story reaches done through the real Claude analyzer CLI 29ms
     → LIVE_ANALYZER_UNAVAILABLE: "/home/daytona/.relayflow-v2-supervisor/durable/repository/testdata/preflight/analyze-story-claude-cli" does not identify as relayflows-agent-cli-v1 — failing because gate-2 acceptance requires the real analyzer to execute. Set RELAYFLOWS_ALLOW_ANALYZER_SKIP=1 only if this run is not gate evidence.
   ✓ built flows CLI against live relayflowd > preflights before journaling and names an unreachable socket 830ms
   × built flows CLI against live relayflowd > starts exactly one daemon when two runs race for one empty data dir 567ms
     → WARNING [unprovable_effects] Step "greet" command "echo" resolves, but its effects cannot be proven before execution.
WARNING [unprovable_effects] Step "shout" command "echo" resolves, but its effects cannot be proven before execution.
WARNING [editor_schema_missing] For editor validation, add this first line: # yaml-language-server: $schema=https://schema.relayflows.dev/v0.1/flows.schema.json
REFUSED [relayflowd_not_found] No relayflowd binary could be found. Install the runtime package for this host (@relayflows/runtime-linux-x64), or set RELAYFLOWD_BIN to a relayflowd executable. Tried: /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk/dist/relayflowd.
: expected 2 to be +0 // Object.is equality
   ✓ subprocess_gate output capture against live relayflowd > journals the gate command output and reports both tails 1091ms
   ✓ surface resume after a real daemon kill > resumes a three-step run with each successful completion exactly once 898ms
   × a relayflow can be scheduled: tick source against live relayflowd > a tick spawns a real run whose step reports the SCHEDULED instant 502ms
     → expected null to deeply equal { schedule_id: 'heartbeat-1m', …(3) }
 ❯ tests/artifact-gates.test.ts (27 tests | 1 failed) 253ms
   × artifact_exists named gate: static scan coverage > does not refuse a gate the bundled worker itself can satisfy through JSON output 10ms
     → expected [ 'invalid_spec' ] to deeply equal [ 'gate_path_unscanned' ]
 ✓ tests/journal-client.test.ts (17 tests) 80ms
 ✓ tests/cloud-connect.test.ts (24 tests) 3226ms
   ✓ hosted verbs connect before they submit > flows run --cloud submits once the prompt connected the integration 2167ms
 ✓ tests/flow-extension-compose.test.ts (22 tests) 4827ms
   ✓ composing flow extensions onto a base flow > composes two extensions in declaration order, and the order is the lockfile order 501ms
   ✓ composing flow extensions onto a base flow > flows check reports the composition and keeps the composed triggers deliverable 936ms
   ✓ composing flow extensions onto a base flow > flows check probes extension preflight before reporting the project healthy 344ms
   ✓ composing flow extensions onto a base flow > uses extension permissions for hosted deploy preflight and the deploy body 345ms
 ✓ tests/verb-field-lint.test.ts (102 tests) 343ms
 ❯ tests/authored-node-runtime.test.ts (14 tests | 14 skipped) 12ms
 ✓ tests/close-pr-flow.test.ts (28 tests) 330ms
 ✓ tests/validate.test.ts (68 tests) 28ms
 ❯ tests/mcp.test.ts (30 tests | 4 skipped) 9829ms
   ✓ MCP preflight and transports > flows check refuses an undeclared server with exit 2 and no daemon 596ms
   ✓ MCP preflight and transports > flows check reports a refusing server and leaves no PID 653ms
   ✓ MCP preflight and transports > kills a SIGTERM-resistant silent child after a parent-owned handshake deadline 1318ms
   ✓ MCP preflight and transports > reaps a SIGTERM-resistant descendant with inherit stdio before cleanup finishes 1109ms
   ✓ MCP preflight and transports > reaps a SIGTERM-resistant descendant with ignore stdio before cleanup finishes 2065ms
   ✓ MCP preflight and transports > reports malformed connection configuration as config_invalid 798ms
 ✓ tests/agent-relay-transport.test.ts (17 tests) 2291ms
   ✓ Relay completion at the journal boundary > does not complete at readiness and journals exact output, receipt, and priced accounting 1007ms
   ✓ Relay completion at the journal boundary > aborts polling on rejected renewal and never writes a stale completion 1003ms
 ✓ tests/tick-source.test.ts (33 tests) 23ms
 ✓ tests/bundle.test.ts (26 tests) 10723ms
   ✓ immutable bundles > returns exit 2 naming a byte-flipped payload and refuses to reuse corruption 362ms
   ✓ immutable bundles > verifies with --verify in any position and answers --json with one object 815ms
   ✓ immutable bundles > refuses --out with --verify rather than ignoring the destination 477ms
   ✓ immutable bundles > builds and verifies the canonical YAML fixture through the compiled CLI 1183ms
   ✓ immutable bundles > emits the ephemeral warning on CLI stderr and uses the default output directory 1002ms
   ✓ immutable bundles > refuses build-provable CLI resolution errors without environment probes 386ms
   ✓ immutable bundles > builds a standalone TS fixture twice with identical executable hashes 3441ms
   ✓ immutable bundles > refuses to label installed dependency drift with lockfile pins 470ms
   ✓ immutable bundles > refuses invalid CLI arguments %j 434ms
   ✓ immutable bundles > refuses invalid CLI arguments "--out" 604ms
   ✓ immutable bundles > refuses invalid CLI arguments "--verify" 591ms
   ✓ immutable bundles > refuses invalid CLI arguments "--verify" 396ms
   ✓ immutable bundles > refuses invalid CLI arguments "--out" 403ms
 ✓ tests/authored-node-result.test.ts (43 tests) 51ms
 ✓ tests/authored-step-graph.test.ts (25 tests) 1067ms
   ✓ the authored step DAG > does not walk a long-running step's own polling chain to find its dependents' edges 378ms
   ✓ the authored step DAG > does not walk a long-running step's chain when a wrapper awaits it 368ms
 ✓ tests/authored-flow-lifecycle-executor.test.ts (27 tests) 612ms
 ✓ tests/step-failure-excerpt.test.ts (42 tests) 274ms
 ✓ tests/pr-review-post.test.ts (21 tests) 2631ms
 ✓ tests/flow-executor-chain.test.ts (14 tests) 12335ms
   ✓ flow executor LLM and output-binding chain > runs f.llm -> f.agent -> f.run with schema-verified journal output and the exact allowed model 965ms
   ✓ flow executor LLM and output-binding chain > runs a dollar-budgeted authored Claude agent with the same default used by preflight 905ms
   ✓ flow executor LLM and output-binding chain > runs the exact authored flagship f.llm -> f.agent -> f.run path through the durable CLI root 2563ms
   ✓ flow executor LLM and output-binding chain > resumes an interrupted durable authored root without replaying completed flagship effects 3551ms
   ✓ flow executor LLM and output-binding chain > passes a declarative verified value through an agent into a deterministic artifact 1090ms
   ✓ flow executor LLM and output-binding chain > flows run consumes YAML bindings and resume reuses the original journal output 1291ms
 ✓ tests/authored-flow-slack.test.ts (7 tests) 1746ms
   ✓ authored Slack helper effects > replays after SIGKILL before confirm with the same token and one successful completion 496ms
   ✓ authored Slack helper effects > replays after SIGKILL before complete with the same token and one successful completion 518ms
 ✓ tests/authored-step-index.test.ts (17 tests) 17ms
 ✓ tests/tick-runner.test.ts (22 tests) 2417ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > refuses --interval-ms fractional as an invocation error 446ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > refuses --interval-ms exponent notation as an invocation error 389ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > refuses --interval-ms hex as an invocation error 397ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > refuses --interval-ms trailing text as an invocation error 380ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > refuses --interval-ms empty as an invocation error 382ms
   ✓ CLI argument parsing refuses coercion rather than accepting it > accepts an exact integer and proceeds past parsing 393ms
 ✓ tests/authored-agent-artifacts.test.ts (5 tests) 335ms
 ✓ tests/worker-transcript.test.ts (9 tests) 377ms
(node:29577) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 ✓ tests/gate-contract.test.ts (20 tests) 179ms
 ✓ tests/cli-replay.test.ts (37 tests) 1237ms
   ✓ flows replay > --json is byte-identical across two CLI invocations (diff) 822ms
 ✓ tests/authored-human.test.ts (13 tests) 84ms
 ✓ tests/cloud-schedule.test.ts (17 tests) 4085ms
   ✓ schedule lowering > marks a non-grid cron as Cloud-only rather than approximating it, with a silence budget from its own cadence 1770ms
   ✓ flows check prints declared schedules > shows the lowering for a fixed interval and the Cloud-only note for a real cron 1744ms
 ✓ tests/direct-input.test.ts (6 tests) 5484ms
   ✓ direct .flow.ts input through the built CLI and live runtime > returns exit 3 for an authored human handoff and persists its outcome 588ms
   ✓ direct .flow.ts input through the built CLI and live runtime > returns exit 1 for an authored step_failed verdict and persists its outcome 616ms
   ✓ direct .flow.ts input through the built CLI and live runtime > executes inline and file JSON input through relayflowd 1893ms
   ✓ direct .flow.ts input through the built CLI and live runtime > refuses missing and malformed input before contacting relayflowd 1526ms
   ✓ direct .flow.ts input through the built CLI and live runtime > does not run the authored body before daemon availability 482ms
   ✓ direct .flow.ts input through the built CLI and live runtime > refuses oversized file input before contacting relayflowd 377ms
 ✓ tests/cli-hn-monitor.test.ts (16 tests) 95ms
 ✓ tests/wrapper-execution-duration.test.ts (7 tests) 10896ms
   ✓ keeps the handshake deadline independent of the removed execution deadline 10095ms
   ✓ still lets a lease abort stop an unlimited wrapper before it produces output 513ms
 ✓ tests/authored-run-failure-evidence.test.ts (9 tests) 1075ms
   ✓ the child index after the process that wrote it is gone > still names every child, with its own run id, after a daemon restart 496ms
 ✓ tests/daemon-lifecycle-live.test.ts (9 tests) 6556ms
   ✓ flows run against a data dir with no daemon (§6 test 7) > cold start spawns exactly one daemon, the run succeeds, and the daemon outlives the CLI 531ms
   ✓ flows run against a data dir with no daemon (§6 test 7) > polls, bounded, for a daemon that holds the lock before it binds 1378ms
   ✓ flows run against a data dir with no daemon (§6 test 7) > attaches to a serving daemon that has not published a connection file 475ms
   ✓ flows run against a data dir with no daemon (§6 test 7) > a second run attaches to the daemon the first one started, spawning nothing 863ms
   ✓ flows run against a data dir with no daemon (§6 test 7) > detects a stale connection file left by a hard kill and starts a fresh daemon 916ms
   ✓ concurrent invocations against one empty data dir (§6 test 15) > ends with exactly one daemon owning the socket, and both runs succeed 1079ms
   ✓ refusals from a spawn that cannot produce a daemon > names relayflowd_not_found rather than falling through to PATH 394ms
   ✓ refusals from a spawn that cannot produce a daemon > names daemon_start_failed and quotes the daemon log when startup dies 466ms
   ✓ refusals from a spawn that cannot produce a daemon > refuses a daemon speaking another protocol version instead of binding over it 453ms
(node:30721) Warning: Transcript tail for run-9/analyze attempt 1 (stdout) could not be written; the step continues without it: EACCES: permission denied, mkdir '/tmp/transcript-tail-gRZaq0/runs/run-9/steps'
(Use `node --trace-warnings ...` to show where the warning was created)
 ✓ tests/transcript-tail.test.ts (11 tests) 786ms
   ✓ direct agent spawn > tees stdout and stderr into tail files that name the dispatch 361ms
   ✓ direct agent spawn > completes the step when the tail directory cannot be created 342ms
 ✓ tests/advisory-outcome.test.ts (23 tests) 75ms
 ✓ tests/agent-cwd-live.test.ts (4 tests) 29685ms
   ✓ agents drive two checkouts under one run root > runs each CLI in its declared directory, and the run is not refused as an unknown field 953ms
   ✓ agents drive two checkouts under one run root > gates on an artifact path relative to the agent directory 817ms
   ✓ a declaration this contract cannot honour is refused at its own edge > refuses a path that climbs out of the run root without starting a run at all 14385ms
   ✓ a declaration this contract cannot honour is refused at its own edge > fails the step with the reason when the directory is not there, rather than running somewhere else 13529ms
 ✓ tests/agent-artifacts-live.test.ts (5 tests) 41901ms
   ✓ agent artifacts and gates through the built CLI, a real daemon and the local agent > journals the files the agent wrote, including under a dot-directory, and every artifact gate passes on that journal 1154ms
   ✓ agent artifacts and gates through the built CLI, a real daemon and the local agent > fails the run when the artifact_exists gate names a file the agent did not write 12894ms
   ✓ agent artifacts and gates through the built CLI, a real daemon and the local agent > fails the run with the author reason when a predicate gate returns false, journaling the verdict 13194ms
   ✓ review follow-ups > applies a predicate gate on a helper step too, and journals its verdict 13864ms
   ✓ review follow-ups > records predicate verdicts on the root run so a resume reuses them instead of re-running the closure 794ms
 ✓ tests/authored-helpers.test.ts (6 tests) 3486ms
   ✓ runs every available provider through the real kernel and resumes completed effects without a second write 1844ms
   ✓ replays after SIGKILL before confirm with the same token and one successful completion 629ms
   ✓ replays after SIGKILL before complete with the same token and one successful completion 527ms
 ✓ tests/agent-cwd.test.ts (53 tests) 55ms
 ✓ tests/authored-flow-operation.test.ts (24 tests) 634ms
   ✓ completes the gate in linear time over a body with 30000 ordinary awaits 317ms
 ✓ tests/backlog-picker.test.ts (14 tests) 42ms
 ✓ tests/plugin-store-bounds.test.ts (11 tests) 81ms
 ✓ tests/flow-requirements.test.ts (14 tests) 601ms
   ✓ flows check prints REQUIRES > names the helper, the harness and the mcp server of an authored flow 365ms
 ✓ tests/backlog-picker-flow.test.ts (6 tests) 264ms
 ✓ tests/hosted-extension-protocol-intrinsics.test.ts (6 tests) 13ms
 ✓ tests/authored-completion-recovery.test.ts (5 tests) 478ms
 ✓ tests/agent-transcript-live.test.ts (4 tests) 44643ms
   ✓ the transcript digest through the built CLI, a real daemon and the local agent > preserves structured agent failure details and its completed root index 14158ms
   ✓ the transcript digest through the built CLI, a real daemon and the local agent > preserves structured llm failure details and its completed root index 14230ms
   ✓ the transcript digest through the built CLI, a real daemon and the local agent > journals the digest in trajectory_tail on a successful agent step and writes the file it points at 821ms
   ✓ the transcript digest through the built CLI, a real daemon and the local agent > on a failed agent step, names the failure and the transcript in the terminal diagnostic, redacted 15432ms
 ✓ tests/preflight-permissions-unenforced.test.ts (17 tests) 255ms
 ✓ tests/hosted-extension-routing.test.ts (7 tests) 8ms
 ✓ tests/webhook.test.ts (9 tests) 495ms
   ✓ webhook ingress > checks TS declarations against flows.json without invoking handlers 422ms
 ✓ tests/wrapper-exit-drain.test.ts (8 tests) 2631ms
   ✓ reports a signalled wrapper death while a pipe is held, with its output intact 387ms
   ✓ lets a lease abort outrank a successful exit still being drained 533ms
 ✓ tests/redact.test.ts (54 tests) 10ms
 ✓ tests/stuck-run-triage.test.ts (22 tests) 3122ms
   ✓ stuck-run-triage shell text > collects tails with no GNU timeout on PATH, as on a stock macOS 3078ms
 ✓ tests/spec-parity.test.ts (38 tests) 375ms
 ✓ tests/authored-advisory-run-live.test.ts (16 tests) 1002ms
 ✓ tests/human-live.test.ts (3 tests) 7506ms
   ✓ f.human against a real daemon > parks with the question, refuses wrong answers, records one, and resumes to success 3986ms
   ✓ f.human against a real daemon > a "no" is a value the body branches on: declined, exit 0, no effect 2315ms
   ✓ f.human against a real daemon > refuses to answer a run the daemon does not know 1204ms
 ✓ tests/check-worker-surface.test.ts (11 tests) 110ms
 ✓ tests/authored-step-failed.test.ts (10 tests) 39ms
(node:33859) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 ✓ tests/authored-status-detail.test.ts (20 tests) 81ms
 ✓ tests/cli-watch.test.ts (10 tests) 17034ms
   ✓ flows check --watch > rechecks syntax errors, clears once, and returns the last refusal on Ctrl-C 1329ms
   ✓ flows check --watch > streams JSON lines without ANSI, recovers after atomic saves, and exits zero after repair 1905ms
   ✓ flows check --watch > coalesces 20 concurrent saves into at most two rechecks 2039ms
   ✓ flows check --watch > watches transitive relative use imports, cycles, and nearest config changes 3028ms
   ✓ flows check --watch > refreshes the import graph and notices missing imports being created 2595ms
   ✓ flows check --watch > reloads authored TypeScript instead of reusing the first imported definition 1578ms
   ✓ flows check --watch > detects a nearer config appearing and falls back after it is deleted 1920ms
   ✓ flows check --watch > keeps watching after the target is deleted and recreated 1853ms
   ✓ flows check --watch > queues changes during a slow check without overlapping checks 782ms
 ✓ tests/authored-parallel-agents.test.ts (8 tests) 9375ms
   ✓ authored steps under local workers with capacity > runs more concurrent f.llm calls than the worker holds side by side, never more than its capacity 1127ms
   ✓ authored steps under local workers with capacity > completes more concurrent f.agent calls than the worker holds: the overflow waits for a slot instead of parking 1551ms
   ✓ authored steps under local workers with capacity > runs agents in distinct working directories side by side (the kernel carries cwd) 654ms
   ✓ authored steps under local workers with capacity > serializes agents whose cwd is a symlink alias of the same directory 1089ms
   ✓ authored steps under local workers with capacity > serializes agents whose cwd is a directory nested inside the other 1054ms
   ✓ authored steps under local workers with capacity > never starts queued agents once the body has failed 1614ms
   ✓ authored steps under local workers with capacity > never starts a queued agent when the agent holding the only slot fails 1637ms
   ✓ authored steps under local workers with capacity > parks the overflow when the body is not told the capacity (the defect this closes) 648ms
 ✓ tests/budget-preflight.test.ts (25 tests) 17ms
 ✓ tests/budget-unmetered-live.test.ts (3 tests) 1262ms
   ✓ unmetered budget spend through the live kernel > runs an unpriced step under a dollar budget without tripping it, journaling unknown dollars 594ms
   ✓ unmetered budget spend through the live kernel > still counts an unpriced step toward a token budget 365ms
   ✓ unmetered budget spend through the live kernel > accrues a priced step and stops the run when it crosses the dollar budget 301ms
 ✓ tests/provider-trigger-contract.test.ts (7 tests) 811ms
   ✓ provider trigger contract > fails `flows check` before deployment and passes once the event is real 534ms
 ✓ tests/work-package-consumer.test.ts (13 tests) 111ms
 ✓ tests/helpers-fanout.test.ts (96 tests) 149ms
(node:34861) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 ✓ tests/authored-step-graph-live.test.ts (1 test) 918ms
   ✓ the authored step DAG through the live kernel > carries labels and predecessors on every index record and journal step, ids unchanged 917ms
 ✓ tests/generate-triggers.test.ts (7 tests) 1091ms
   ✓ discovers new adapters, preserves exact event names, and prefers adapter-local mappings 343ms
 ✓ tests/authored-detail-live.test.ts (3 tests) 4761ms
   ✓ carries done("step_failed", { detail }) into the report, the journal and flows status 2480ms
   ✓ reports a detail a caller sliced through an emoji, instead of hanging on it 994ms
   ✓ leaves a one-argument done("step_failed") reporting exactly as it always did 1287ms
 ✓ tests/pty-sidechannel.test.ts (11 tests) 7658ms
   ✓ view attach preserves worker completion and marks only drive 985ms
   ✓ drive attach preserves worker completion and marks only drive 525ms
   ✓ passthrough attach preserves worker completion and marks only drive 1040ms
   ✓ none attach preserves worker completion and marks only drive 1027ms
   ✓ none subscriber lets an unattended CLI read EOF 602ms
   ✓ view subscriber lets an unattended CLI read EOF 537ms
   ✓ passthrough subscriber lets an unattended CLI read EOF 597ms
   ✓ incomplete subscriber lets an unattended CLI read EOF 615ms
   ✓ rejects drive after EOF without marking human intervention 950ms
   ✓ delivers all drive bytes in order across child stdin backpressure 774ms
 ✓ tests/webhook-hardening.test.ts (11 tests) 66ms
 ✓ tests/worker-cli-result-exit.test.ts (5 tests) 32881ms
   ✓ a Claude agent step completes on its result, not only on process exit > settles a hung, successful run within the grace and stops its whole tree 31630ms
   ✓ a Claude agent step completes on its result, not only on process exit > maps an error result on a hung run to a failed exit 31631ms
   ✓ a Claude agent step completes on its result, not only on process exit > leaves a hang before any result to the existing stops 32013ms
   ✓ an agent tree does not outlive the process that spawned it > kills the agent group when the run process is terminated by SIGTERM 778ms
 ✓ tests/human-to.test.ts (8 tests) 10ms
 ✓ tests/authored-agent-permissions.test.ts (26 tests) 758ms
 ✓ tests/plugin-loader.test.ts (9 tests) 178ms
 ❯ tests/webhook-live.test.ts (6 tests | 6 failed) 62960ms
   × executes and deduplicates 'app_mention' only for its provider and matching payload 10487ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × executes and deduplicates 'reaction_added' only for its provider and matching payload 10483ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × executes and deduplicates 'pull_request' only for its provider and matching payload 10598ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × flows serve-webhook writes JSON before the daemon starts, then journals and archives exactly once 10535ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × replays a dropped file after SIGKILL before spawn 10435ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × resumes the same journal after SIGKILL after spawn and before acknowledgement 10421ms
     → webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ✓ tests/worker-lease.test.ts (7 tests) 13ms
 ✓ tests/yaml-helpers.test.ts (33 tests) 79ms
 ✓ tests/authored-probe-cache.test.ts (5 tests) 22612ms
   ✓ authored run CLI probe cache > nine calls have no expired attempts at capacity 1 7298ms
   ✓ authored run CLI probe cache > nine calls have no expired attempts at capacity 4 5436ms
   ✓ authored run CLI probe cache > does not serialize nine starts behind nine probes, and probes again on a new run 7812ms
   ✓ authored run CLI probe cache > caches probe failures while refusing all nine calls 428ms
   ✓ authored run CLI probe cache > shares probe results across agent calls too 1636ms
 ✓ tests/babysitter-catalog-export.test.ts (14 tests) 820ms
   ✓ Babysitter catalog artifact export > CLI refuses an existing output and leaves no file on validation failure 691ms
 ✓ tests/communication.test.ts (10 tests) 13ms
 ✓ tests/worker-lease-lost.test.ts (16 tests) 15ms
 ✓ tests/typed-output.test.ts (14 tests) 201ms
 ✓ tests/canonical-software-factory.test.ts (3 tests) 120ms
 ✓ tests/budget-attribution.test.ts (5 tests) 9ms
 ✓ tests/deploy.test.ts (11 tests) 5367ms
   ✓ flows deploy file buckets > publishes the full signed layout byte-for-byte and redeploys as a noop 807ms
   ✓ flows deploy file buckets > answers --json with one object per outcome 839ms
   ✓ flows deploy file buckets > reports a refusal as JSON under --json 386ms
   ✓ flows deploy file buckets > refuses a missing local bundle before creating the bucket 388ms
   ✓ flows deploy file buckets > refuses an unreachable bucket before copying 405ms
   ✓ flows deploy file buckets > refuses an unwritable bucket 411ms
   ✓ flows deploy file buckets > refuses local tampering of spec.canonical.json 396ms
   ✓ flows deploy file buckets > refuses local tampering of identity.json 401ms
   ✓ flows deploy file buckets > refuses asset bundles instead of using daemon-relative files 413ms
   ✓ flows deploy file buckets > never labels a corrupt existing deployment as a noop 849ms
 ✓ tests/json-schema-bound.test.ts (71 tests) 2368ms
   ✓ JSON Schema termination bound > walks a deep schema with an explicit stack rather than recursion 1930ms
 ✓ tests/mcp-lifecycle.test.ts (4 tests) 17ms
 ✓ tests/effect-channel.test.ts (5 tests) 819ms
 ✓ tests/model-selection.test.ts (10 tests) 23ms
 ✓ tests/relayflowd-path.test.ts (10 tests) 5ms
 ✓ tests/agent-artifacts.test.ts (9 tests) 21ms
 ✓ tests/f-memory.test.ts (7 tests) 894ms
 ✓ tests/authored-plugin-effect.test.ts (6 tests) 59ms
 ✓ tests/yaml-local-agent-live.test.ts (7 tests) 4335ms
   ✓ YAML --local-agent through the built CLI and real daemon > runs with the checked step CLI and model and journals done 700ms
   ✓ YAML --local-agent through the built CLI and real daemon > runs with the checked named CLI and model and journals done 646ms
   ✓ YAML --local-agent through the built CLI and real daemon > runs with the checked flow CLI and model and journals done 590ms
   ✓ YAML --local-agent through the built CLI and real daemon > runs with the checked project CLI and model and journals done 622ms
   ✓ YAML --local-agent through the built CLI and real daemon > still parks without --local-agent 548ms
   ✓ YAML --local-agent through the built CLI and real daemon > reports the agent process failure 646ms
   ✓ YAML --local-agent through the built CLI and real daemon > preserves declared workspace surfaces that the local worker cannot pin 583ms
 ✓ tests/worker-slots.test.ts (7 tests) 6ms
 ✓ tests/local-dev-ux.test.ts (8 tests) 17ms
 ↓ tests/relay-cli-surface-live.test.ts (3 tests | 3 skipped)
 ✓ tests/authored-declined.test.ts (13 tests) 52ms
 ✓ tests/resume-failure.test.ts (2 tests) 5ms
 ✓ tests/dependency-validation.test.ts (6 tests) 720ms
   ✓ dependency validation > accepts a valid 10,000-step reverse chain through every direct public boundary 395ms
 ✓ tests/worker-lease-lost-live.test.ts (3 tests) 997ms
   ✓ reports journal success after completion rejects with lease_conflict 303ms
   ✓ reports journal success after completion rejects with run_terminal 326ms
   ✓ reports journal success when a renewal rejects after completion landed 368ms
 ✓ tests/authored-hooks.test.ts (5 tests) 5ms
 ✓ tests/input-binding.test.ts (12 tests) 209ms
 ✓ tests/communication-review.test.ts (5 tests) 338ms
 ✓ tests/yaml-helper-effect.test.ts (4 tests) 94ms
 ✓ tests/deterministic-llm.test.ts (5 tests) 52ms
 ✓ tests/scope-preflight.test.ts (6 tests) 8ms
 ✓ tests/bin.test.ts (7 tests) 2360ms
   ✓ built flows binary > refuses through a symlink to the built artifact 374ms
   ✓ built flows binary > refuses through a symlinked directory component 386ms
   ✓ built flows binary > classifies a signal-terminated auth probe as probe_failed 392ms
   ✓ built flows binary > classifies an unavailable PATH resolver as probe_failed 399ms
   ✓ built flows binary > does not describe a present non-executable CLI as missing 404ms
   ✓ built flows binary > runs one auth probe for three steps sharing a flow CLI 402ms
 ✓ tests/build-gate.test.ts (3 tests) 1168ms
   ✓ flows build gates on flows check green (#318) > refuses a flow with an unresolvable named-agent CLI and leaves no artifacts 388ms
   ✓ flows build gates on flows check green (#318) > --json emits one CheckReport object on stdout on refusal, exits 2, no artifacts 392ms
   ✓ flows build gates on flows check green (#318) > builds the bundle on success (regression: gate must not block valid flows) 387ms
 ✓ tests/scope-compiler.test.ts (25 tests) 13ms
 ✓ tests/run-from-digest.test.ts (6 tests) 4494ms
   ✓ flows run digest input > submits the sealed canonical spec through the normal journal path without checkout 447ms
   ✓ flows run digest input > uses a verified cache hit even after the bucket is removed 442ms
   ✓ flows run digest input > resolves deploy.bucket from flows.json and honors explicit override 1216ms
   ✓ flows run digest input > refuses an unconfigured bucket 792ms
   ✓ flows run digest input > refuses tampered spec.canonical.json before creating run data 809ms
   ✓ flows run digest input > refuses tampered identity.json before creating run data 786ms
 ✓ tests/communication-worker.test.ts (15 tests) 1502ms
 ✓ tests/hn-poller.test.ts (6 tests) 6ms
 ✓ tests/plugin-add.test.ts (7 tests) 1187ms
   ✓ typechecks the augmented verb and rejects unknown namespaces 889ms
 ✓ tests/authored-step-failed-exit.test.ts (3 tests) 8ms
 ✓ tests/direct-run-failure.test.ts (8 tests) 12ms
 ✓ tests/dir-watcher-poller.test.ts (6 tests) 4ms
 ✓ tests/model-pricing.test.ts (10 tests) 5ms
 ✓ tests/yaml-helper-live.test.ts (1 test) 962ms
   ✓ runs compiled YAML helpers through the built CLI and kernel effect journal 961ms
 ❯ tests/provider-trigger-executor.test.ts (4 tests | 3 failed) 18ms
   × the kernel executes compiled 'app_mention' subscriptions with provider isolation and durable dedupe 10ms
     → spawnSync /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × the kernel executes compiled 'reaction_added' subscriptions with provider isolation and durable dedupe 3ms
     → spawnSync /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
   × the kernel executes compiled 'pull_request' subscriptions with provider isolation and durable dedupe 2ms
     → spawnSync /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ✓ tests/transcript-tail-close.test.ts (2 tests) 1334ms
   ✓ a stalled transcript-tail close > does not hold the spawn open past its bounded window 722ms
   ✓ a stalled tail close beside a transcript that finished > still journals the transcript pointer 611ms
 ✓ tests/wrapper-artifacts-cwd.test.ts (2 tests) 74ms
 ✓ tests/hello-deterministic.test.ts (5 tests) 17ms
 ✓ tests/transcript-exclusion-timeout.test.ts (1 test) 189ms
 ✓ tests/cli-adapter.test.ts (4 tests) 5ms
 ❯ tests/communication-mixed-resume.test.ts (1 test | 1 failed) 14ms
   × resumes mixed ordinary and linked agents through the real daemon without stealing peer capacity 13ms
     → ENOENT: no such file or directory, open '/tmp/communication-resume-k0mAUw/data/connection.json'
 ✓ tests/work-package-validator.test.ts (7 tests) 5ms
 ✓ tests/authored-use-loader.test.ts (5 tests) 783ms
 ✓ tests/authored-declined-live.test.ts (1 test) 1666ms
   ✓ runs an input guard and resumes its completed declined root without repeated effects 1666ms
 ✓ tests/cli-answer.test.ts (15 tests) 10ms
 ✓ tests/bundle-preflight.test.ts (4 tests) 958ms
   ✓ bundle execution preflight > ignores surrounding cache configuration on a verified cache hit 486ms
   ✓ bundle execution preflight > uses the built alias for a nameless flow even in a digest-only cache directory 455ms
 ✓ tests/agent-relay-hardening.test.ts (12 tests) 14ms
 ✓ tests/classify-outcome.test.ts (2 tests) 2162ms
   ✓ classifyOutcome > gives up and reports when a running run never becomes classifiable 2008ms
 ✓ tests/communication-preflight.test.ts (13 tests) 38ms
 ↓ tests/real-cli-adapters.test.ts (3 tests | 3 skipped)
 ✓ tests/memoization.test.ts (57 tests) 62ms
 ✓ tests/fs-descriptor.test.ts (1 test) 6ms
 ✓ tests/parse-json-output.test.ts (7 tests) 3ms
 ✓ tests/journal-client-completion.test.ts (4 tests) 99ms
 ✓ tests/worker-cli-abort.test.ts (2 tests) 2821ms
   ✓ stops claude and its process group when lease ownership is lost 1425ms
   ✓ stops wrapper.mjs and its process group when lease ownership is lost 1395ms
 ✓ tests/communication-environment-preflight.test.ts (6 tests) 4ms
 ✓ tests/budget-authored-live.test.ts (2 tests) 217ms
 ✓ tests/slack-writeback.test.ts (1 test) 257ms
 ✓ tests/step-lease.test.ts (36 tests) 66713ms
   ✓ f.run leases against the live kernel > enforces 10000 ms for 'sleep 5; printf ok' 5245ms
   ✓ f.run leases against the live kernel > enforces 40000 ms for 'sleep 31; printf ok' 31125ms
   ✓ f.run leases against the live kernel > enforces 30000 ms for 'sleep 31; printf ok' 30129ms
 ✓ tests/adapters/claude.test.ts (7 tests) 4ms
 ✓ tests/authored-surface-authority.test.ts (2 tests) 17ms
 ✓ tests/adapters/codex.test.ts (7 tests) 5ms
 ✓ tests/worker-cli-cwd.test.ts (2 tests) 368ms
   ✓ runAgentCli — cwd propagation (flows#357) > omits cwd when not provided (inherits parent cwd) 363ms
 ✓ tests/slack-block-kit.test.ts (5 tests) 22ms
 ✓ tests/communication-history.test.ts (1 test) 3ms
 ✓ tests/worker-lease-sweep.test.ts (2 tests) 6ms
 ✓ tests/adapters/registry.test.ts (4 tests) 5ms
 ✓ tests/resume-worker-lease.test.ts (2 tests) 4ms
 ✓ tests/direct-run-worker-lease.test.ts (2 tests) 8ms
 ✓ tests/authored-declined-report.test.ts (6 tests) 7ms
 ✓ tests/promise-ancestry.test.ts (2 tests) 286ms
 ✓ tests/communication-refusal.test.ts (1 test) 13ms
 ✓ tests/agent-cwd-validation.test.ts (2 tests) 408ms
   ✓ declarative agent cwd > is refused by `flows check` on a YAML flow before anything runs 405ms
 ✓ tests/catalog-plugins.test.ts (2 tests) 3ms
 ✓ tests/check-command-cwd.test.ts (1 test) 13ms
 ✓ tests/communication-lazy.test.ts (1 test) 4ms
 ✓ tests/cli-progress-wait.test.ts (2 tests) 3ms
 ↓ tests/run-digest-live.test.ts (1 test | 1 skipped)
 ✓ tests/placement.test.ts (54 tests) 17ms
 ✓ tests/canonical-tree.test.ts (1 test) 2ms
 ✓ tests/bundle-transport.test.ts (20 tests) 2466ms
   ✓ digest references > accepts and deploys the build output for hello 416ms
   ✓ digest references > accepts and deploys the build output for Hello 410ms
   ✓ digest references > accepts and deploys the build output for hello.world 404ms
   ✓ digest references > accepts and deploys the build output for hello_world 412ms
   ✓ digest references > accepts and deploys the build output for 123 413ms
   ✓ digest references > accepts and deploys the build output for A_b.c-1 409ms
 ✓ tests/communication-tools.test.ts (1 test) 65ms
 ✓ tests/authored-admission.test.ts (2 tests) 3ms
 ✓ tests/memory.test.ts (18 tests) 9ms
 ✓ tests/worker-platform.test.ts (1 test) 3ms
 ✓ tests/run-digest.test.ts (4 tests) 1549ms
   ✓ digest run configuration refusals > reports config_invalid before fetching or starting a run for {invalid json 393ms
   ✓ digest run configuration refusals > reports config_invalid before fetching or starting a run for {"deploy":{}} 379ms
   ✓ digest run configuration refusals > reports config_invalid before fetching or starting a run for {"deploy":{"bucket":123}} 393ms
   ✓ digest run configuration refusals > reports config_invalid before fetching or starting a run for {"deploy":{"bucket":""}} 383ms
 ✓ tests/local-agent-live.test.ts (5 tests) 64448ms
   ✓ built CLI local agent against a real daemon > dispatches through the wrapper and keeps --json stdout report-shaped 877ms
   ✓ built CLI local agent against a real daemon > runs beyond the initial 30-second lease without a second invocation 35881ms
   ✓ built CLI local agent against a real daemon > renders actual agent completion in text output 799ms
   ✓ built CLI local agent against a real daemon > returns a failed run when the agent process fails 12704ms
   ✓ built CLI local agent against a real daemon > refuses a workspace it cannot pin before invoking the agent 14186ms

⎯⎯⎯⎯⎯⎯ Failed Suites 2 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  tests/authored-node-runtime.test.ts [ tests/authored-node-runtime.test.ts ]
AssertionError: expected '1.3.6' to be '1.4.0' // Object.is equality

Expected: "1.4.0"
Received: "1.3.6"

 ❯ tests/authored-node-runtime.test.ts:18:77
     16| 
     17| beforeAll(() => {
     18|   expect(spawnSync(bun, ['--version'], { encoding: 'utf8' }).stdout.tr…
       |                                                                             ^
     19|   expect(existsSync(daemon), 'build the current kernel or set RELAYFLO…
     20|   stage = mkdtempSync(join(tmpdir(), 'authored-standalone-build-'));

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/44]⎯

 FAIL  tests/mcp.test.ts > authored MCP effects against the real kernel
Error: journal client: connect failed: connect ENOENT /tmp/relayflowd-2de231bf0d98.sock
 ❯ Socket.onError src/journal-client.ts:103:16
    101|         socket.removeAllListeners();
    102|         this.failAll(err);
    103|         reject(new Error(`journal client: connect failed: ${err.messag…
       |                ^
    104|       };
    105|       socket.once('error', onError);

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/44]⎯

⎯⎯⎯⎯⎯⎯ Failed Tests 42 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  tests/artifact-gates.test.ts > artifact_exists named gate: static scan coverage > does not refuse a gate the bundled worker itself can satisfy through JSON output
AssertionError: expected [ 'invalid_spec' ] to deeply equal [ 'gate_path_unscanned' ]

- Expected
+ Received

  Array [
-   "gate_path_unscanned",
+   "invalid_spec",
  ]

 ❯ tests/artifact-gates.test.ts:318:50
    316|     const checked = preflight(authored as never, { probes: { ...probes…
    317|       cli: () => ({ exists: true, authenticated: true, modelAvailable:…
    318|     expect(checked.diagnostics.map(d => d.kind)).toEqual(['gate_path_u…
       |                                                  ^
    319|     expect(checked.ok).toBe(true);
    320| 

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/44]⎯

 FAIL  tests/communication-mixed-resume.test.ts > resumes mixed ordinary and linked agents through the real daemon without stealing peer capacity
Error: ENOENT: no such file or directory, open '/tmp/communication-resume-k0mAUw/data/connection.json'
 ❯ tests/communication-mixed-resume.test.ts:54:35
     52|   } finally {
     53|     clearTimeout(timeout); state.release(); client.close();
     54|     try { process.kill(JSON.parse(readFileSync(join(dataDir, 'connecti…
       |                                   ^
     55|     finally { rmSync(root, { recursive: true, force: true }); }
     56|   }

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > executes the exact capability-only handler for a queued receipt
 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > executes the exact capability-only handler for a duplicate receipt
Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
    486| 
    487| function unsupported(message: string): never {
    488|   throw new PluginError('plugin_unsupported', message);
       |         ^
    489| }
    490| 
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:221:26

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > launches through the captured process primitive after builtin export synchronization
AssertionError: promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:283:11
    281|           input: descriptor(),
    282|           babysitterTurn: { queue: async () => ({ receiptId: 'receipt-…
    283|         })).resolves.toEqual({ completionReason: 'success', capability…
       |           ^
    284|       } finally {
    285|         process.execPath = originalExecPath;

Caused by: Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:277:22

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > ignores inherited launcher overrides and decodes manifests with the captured Buffer intrinsic
AssertionError: promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:373:11
    371|           input: descriptor('delivery-options'),
    372|           babysitterTurn: { queue: async () => ({ receiptId: 'receipt-…
    373|         })).resolves.toEqual({ completionReason: 'success', capability…
       |           ^
    374|       } finally {
    375|         Buffer.prototype.toString = bufferToString;

Caused by: Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:367:22

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > streams verified bytes when the live store is replaced and no writable staging path exists
AssertionError: promise rejected "Error: Hosted extension sandbox exited wi… { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:431:7
    429|         return { receiptId: 'receipt-1', status: 'queued' };
    430|       } },
    431|     })).resolves.toEqual({ completionReason: 'success', capabilityCall…
       |       ^
    432|     expect(calls).toBe(1);
    433|     expect(readFileSync(join(installed.directory, 'babysitter.flow.ts'…

Caused by: Error: Hosted extension sandbox exited without a valid completion (exit 1): /tmp/hosted-bwrap-wrapper-4k52jw/bwrap-wrapper:20
if (child.error) throw child.error;
                 ^

Error: spawnSync /usr/bin/bwrap ENOENT
    at Object.spawnSync (node:internal/child_process:1103:20)
    at spawnSync (node:child_process:911:24)
    at Object.<anonymous> (/tmp/hosted-bwrap-wrapper-4k52jw/bwrap-wrapper:19:15)
    at Module._compile (node:internal/modules/cjs/loader:1809:14)
    at Object..js (node:internal/modules/cjs/loader:1940:10)
    at Module.load (node:internal/modules/cjs/loader:1530:32)
    at Module._load (node:internal/modules/cjs/loader:1332:12)
    at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
    at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
    at node:internal/main/run_main_module:33:47 {
  errno: -2,
  code: 'ENOENT',
  syscall: 'spawnSync /usr/bin/bwrap',
  path: '/usr/bin/bwrap',
  spawnargs: [
    '--unshare-all',
    '--die-with-parent',
    '--new-session',
    '--clearenv',
    '--cap-drop',
    'ALL',
    '--dir',
    '/usr',
    '--ro-bind',
    '/usr/lib',
    '/usr/lib',
    '--ro-bind',
    '/usr/lib64',
    '/usr/lib64',
    '--ro-bind',
    '/usr/lib',
    '/lib',
    '--ro-bind',
    '/usr/lib64',
    '/lib64',
    '--proc',
    '/proc',
    '--dev',
    '/dev',
    '--tmpfs',
    '/tmp',
    '--dir',
    '/runtime',
    '--dir',
    '/extension',
    '--dir',
    '/extension/node_modules',
    '--dir',
    '/extension/node_modules/@relayflows',
    '--dir',
    '/extension/node_modules/@relayflows/surface',
    '--dir',
    '/extension/node_modules/@relayflows/surface/dist',
    '--dir',
    '/extension/node_modules/@relayflows/surface/dist/helpers',
    '--dir',
    '/extension/node_modules/@relayflows/surface/dist/triggers',
    '--dir',
    '/extension/src',
    '--perms',
    '0500',
    '--ro-bind-data',
    '4',
    '/runtime/node',
    '--perms',
    '0400',
    '--ro-bind-data',
    '5',
    '/runtime/runner.mjs',
    '--perms',
    '0400',
    '--ro-bind-data',
    '6',
    '/extension/node_modules/@relayflows/surface/package.json',
    '--perms',
    '0400',
    '--ro-bind-data',
    '7',
    '/extension/node_modules/@relayflows/surface/index.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '8',
    '/extension/node_modules/@relayflows/surface/runtime.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '9',
    '/extension/node_modules/@relayflows/surface/dist/flow.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '10',
    '/extension/node_modules/@relayflows/surface/dist/helpers/providers.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '11',
    '/extension/node_modules/@relayflows/surface/dist/provider-trigger.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '12',
    '/extension/node_modules/@relayflows/surface/dist/schedule.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '13',
    '/extension/node_modules/@relayflows/surface/dist/triggers.js',
    '--perms',
    '0400',
    '--ro-bind-data',
    '14',
    '/extension/node_modules/@relayflows/surface/dist/triggers/github.js',
    '--perms',
    ... 27 more items
  ]
}

Node.js v25.6.0

 ❯ Object.<anonymous> ../../../../../../../tmp/hosted-bwrap-wrapper-4k52jw/bwrap-wrapper:19:15
 ❯ refuse src/hosted-extension-protocol.ts:135:21
 ❯ ChildProcess.<anonymous> src/hosted-extension-protocol.ts:234:21

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > mounts pinned private Surface bytes when the live package changes before launch
AssertionError: promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:456:7
    454|         return { receiptId: 'receipt-1', status: 'queued' };
    455|       } },
    456|     })).resolves.toEqual({ completionReason: 'success', capabilityCall…
       |       ^
    457|     expect(calls).toBe(1);
    458|     expect(readFileSync(join(surfaceRoot, 'dist/flow.js'), 'utf8')).to…

Caused by: Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:443:18

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > refuses oversized Surface files through the bounded descriptor reader
AssertionError: expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_unsupported', …(1) }

- Expected
+ Received

- Object {
+ PluginError {
    "code": "plugin_unsupported",
-   "message": StringContaining "cannot read pinned Surface runtime flow.js",
  }

 ❯ tests/hosted-extension-isolation.test.ts:489:5
    487|     });
    488|     let calls = 0;
    489|     await expect(runVerifiedNativeExtensionSandbox({
       |     ^
    490|       artifact: await artifact(),
    491|       manifest: validateFlowExtensionManifest(manifest()),

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > shields verified Surface files before async settlement
AssertionError: promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:532:9
    530|         surfaceRoot,
    531|         babysitterTurn: { queue: async () => ({ receiptId: 'receipt-1'…
    532|       })).resolves.toEqual({ completionReason: 'success', capabilityCa…
       |         ^
    533|     } finally {
    534|       if (previous === undefined) delete (Array.prototype as { then?: …

Caused by: Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:525:20

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > preserves a typed host refusal while disclosing only a fixed marker to the child
AssertionError: expected Error: bubblewrap is unavailable { code: '…' } to be Error: private Cloud policy detail { code: '…' } // Object.is equality

- Expected
+ Received

- [Error: private Cloud policy detail]
+ [Error: bubblewrap is unavailable]

 ❯ tests/hosted-extension-isolation.test.ts:560:5
    558|       provider: 'github', eventType: 'pull_request.labeled', deliveryI…
    559|     });
    560|     await expect(runVerifiedNativeExtensionSandbox({
       |     ^
    561|       artifact: await artifact(source), manifest: validateFlowExtensio…
    562|       babysitterTurn: { queue: async () => { throw refusal; } },

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > denies ambient credentials, host files, writes, network, subprocesses, and undeclared context verbs
Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
    486| 
    487| function unsupported(message: string): never {
    488|   throw new PluginError('plugin_unsupported', message);
       |         ^
    489| }
    490| 
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:624:13

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > enforces OS address-space and data bounds on native Buffer allocation
AssertionError: expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_unsupported', …(1) }

- Expected
+ Received

- Object {
+ PluginError {
    "code": "plugin_unsupported",
-   "message": StringMatching /(?:Failed to allocate memory|Array buffer allocation failed)/u,
  }

 ❯ tests/hosted-extension-isolation.test.ts:646:5
    644|     });
    645|     let calls = 0;
    646|     await expect(runVerifiedNativeExtensionSandbox({
       |     ^
    647|       artifact: installed,
    648|       manifest: validateFlowExtensionManifest(manifest()),

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > blocks extra handler fields and authority-bearing receipt fields at the parent port
AssertionError: expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }

- Expected
+ Received

- Object {
-   "code": "plugin_event_unroutable",
+ PluginError {
+   "code": "plugin_unsupported",
  }

 ❯ tests/hosted-extension-isolation.test.ts:675:5
    673|     });
    674|     let calls = 0;
    675|     await expect(runVerifiedNativeExtensionSandbox({
       |     ^
    676|       artifact: await artifact(source), manifest: validateFlowExtensio…
    677|       babysitterTurn: { queue: async () => { calls += 1; return { rece…

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > constructs adapter authority with the captured freeze intrinsic
Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
    486| 
    487| function unsupported(message: string): never {
    488|   throw new PluginError('plugin_unsupported', message);
       |         ^
    489| }
    490| 
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:745:22

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/44]⎯

 FAIL  tests/hosted-extension-isolation.test.ts > hosted extension capability isolation > writes the Surface manifest and protocol without inherited toJSON behavior
AssertionError: promise rejected "Error: bubblewrap is unavailable { code: '…' }" instead of resolving
 ❯ tests/hosted-extension-isolation.test.ts:788:11
    786|           babysitterTurn: { queue: async () => ({ receiptId: 'receipt-…
    787|           timeoutMs: 3_000,
    788|         })).resolves.toEqual({ completionReason: 'success', capability…
       |           ^
    789|       } finally {
    790|         if (previous === undefined) delete (Object.prototype as { toJS…

Caused by: Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-isolation.test.ts:781:22

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/44]⎯

 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > uses captured JSON intrinsics for the complete parent boundary
Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
    486| 
    487| function unsupported(message: string): never {
    488|   throw new PluginError('plugin_unsupported', message);
       |         ^
    489| }
    490| 
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-protocol.test.ts:309:24

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/44]⎯

 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > rejects an import-time different PR frame with zero adapter calls
 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > rejects an import-time different delivery frame with zero adapter calls
 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > rejects an import-time different event frame with zero adapter calls
AssertionError: expected Error: bubblewrap is unavailable { code: '…' } to match object { code: 'plugin_event_unroutable' }

- Expected
+ Received

- Object {
-   "code": "plugin_event_unroutable",
+ PluginError {
+   "code": "plugin_unsupported",
  }

 ❯ tests/hosted-extension-protocol.test.ts:430:5
    428|   ])('rejects an import-time %s frame with zero adapter calls', async …
    429|     let calls = 0;
    430|     await expect(runVerifiedNativeExtensionSandbox({
       |     ^
    431|       artifact: await artifact(hostileImport([frame, { type: 'error', …
    432|       manifest: validateFlowExtensionManifest(manifest()), dispatch: d…

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/44]⎯

 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > rejects two forged calls after the authoritative first outcome settles
 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > waits for a pending adapter to reject after a forged child error
 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > waits for a pending adapter to resolve after a forged child error
 FAIL  tests/hosted-extension-protocol.test.ts > hosted extension hostile protocol > returns a typed adapter rejection even when the hostile child hangs
Error: hostile child did not invoke the adapter
 ❯ Timeout._onTimeout tests/hosted-extension-protocol.test.ts:118:45
    116| async function waitForInvocation(invoked: Promise<void>): Promise<void…
    117|   await new Promise<void>((resolve, reject) => {
    118|     const timeout = setTimeout(() => reject(new Error('hostile child d…
       |                                             ^
    119|     void invoked.then(() => { clearTimeout(timeout); resolve(); }, rej…
    120|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > runs hn-monitor analyze-story end-to-end via a stub agent CLI (gate 2 clause 2 demo)
AssertionError: expected { …(12) } to match object { output: { …(3) }, …(1) }
(22 matching properties omitted from actual)

- Expected
+ Received

  Object {
-   "output": Object {
-     "reasoning": "stub agent runtime — deterministic output for gate-2 clause-2 demo",
-     "relevance_score": 5,
-     "story_title": "stub",
-   },
+   "output": null,
    "verification": Object {
-     "gate": "json_schema",
-     "verdict": "pass",
+     "gate": "execution",
+     "verdict": "fail",
    },
  }

 ❯ tests/live-kernel.test.ts:657:36
    655|         && (entry as { step_id?: string }).step_id === 'analyze-story',
    656|     ) as { payload: { output: unknown; verification: unknown } } | und…
    657|     expect(stepCompleted?.payload).toMatchObject({
       |                                    ^
    658|       output: {
    659|         story_title: 'stub',

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > hn-monitor analyze-story FAILS verification when the CLI omits required schema fields
AssertionError: expected { …(12) } to match object { …(3) }
(21 matching properties omitted from actual)

- Expected
+ Received

  Object {
-   "completionReason": "retries_exhausted",
+   "completionReason": "worker_error",
    "output": null,
    "verification": Object {
-     "gate": "json_schema",
+     "gate": "execution",
      "verdict": "fail",
    },
  }

 ❯ tests/live-kernel.test.ts:752:36
    750|     // its verification record names the json_schema rejection. The re…
    751|     // parsed value is nulled before the completion is persisted.
    752|     expect(stepCompleted?.payload).toMatchObject({
       |                                    ^
    753|       completionReason: 'retries_exhausted',
    754|       output: null,

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > agent step preserves the CliResult wrapper as output when the CLI emits non-JSON text
AssertionError: expected null not to be null
 ❯ tests/live-kernel.test.ts:823:24
    821|     // here (parseJsonOutput returned null on non-JSON stdout) and
    822|     // these assertions would all fail.
    823|     expect(output).not.toBeNull();
       |                        ^
    824|     expect(output.exit_code).toBe(0);
    825|     expect(output.stdout_tail).toContain('looked at the story');

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > AgentWorker exposes wake_context to the CLI via RELAYFLOW_WAKE_CONTEXT env var (real analyzer prerequisite)
TypeError: Cannot read properties of null (reading 'story_title')
 ❯ tests/live-kernel.test.ts:891:42
    889|     ) as { payload: { output: { story_title: string; reasoning: string…
    890|     expect(stepCompleted).toBeDefined();
    891|     expect(stepCompleted!.payload.output.story_title).toBe(`echoed:${s…
       |                                          ^
    892|     expect(stepCompleted!.payload.output.reasoning).toContain(String(s…
    893| 

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > AgentWorker leaves RELAYFLOW_WAKE_CONTEXT UNSET when the run has no wake_context (undefined-vs-null pin)
TypeError: Cannot read properties of null (reading 'env_present')
 ❯ tests/live-kernel.test.ts:958:38
    956|     ) as { payload: { output: { env_present: boolean } } } | undefined;
    957|     expect(completed).toBeDefined();
    958|     expect(completed!.payload.output.env_present).toBe(false);
       |                                      ^
    959| 
    960|     delete process.env.RELAYFLOW_WAKE_CONTEXT;

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > AgentWorker leaves RELAYFLOW_MODEL UNSET when the step declares no model
TypeError: Cannot read properties of null (reading 'story_title')
 ❯ tests/live-kernel.test.ts:1194:38
    1192|     expect(completed).toBeDefined();
    1193|     // UNSET, not EMPTY and not the leaked parent value.
    1194|     expect(completed!.payload.output.story_title).toBe('model:UNSET');
       |                                      ^
    1195| 
    1196|     delete process.env.RELAYFLOW_MODEL;

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > hn-monitor analyze-story reaches done through the real Claude analyzer CLI
Error: LIVE_ANALYZER_UNAVAILABLE: "/home/daytona/.relayflow-v2-supervisor/durable/repository/testdata/preflight/analyze-story-claude-cli" does not identify as relayflows-agent-cli-v1 — failing because gate-2 acceptance requires the real analyzer to execute. Set RELAYFLOWS_ALLOW_ANALYZER_SKIP=1 only if this run is not gate evidence.
 ❯ tests/live-kernel.test.ts:1223:15
    1221|       const notice = `LIVE_ANALYZER_UNAVAILABLE: ${readiness.detail}`;
    1222|       if (process.env['RELAYFLOWS_ALLOW_ANALYZER_SKIP'] !== '1') {
    1223|         throw new Error(
       |               ^
    1224|           `${notice} — failing because gate-2 acceptance requires the …
    1225|           + 'Set RELAYFLOWS_ALLOW_ANALYZER_SKIP=1 only if this run is …

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/44]⎯

 FAIL  tests/live-kernel.test.ts > built flows CLI against live relayflowd > starts exactly one daemon when two runs race for one empty data dir
AssertionError: WARNING [unprovable_effects] Step "greet" command "echo" resolves, but its effects cannot be proven before execution.
WARNING [unprovable_effects] Step "shout" command "echo" resolves, but its effects cannot be proven before execution.
WARNING [editor_schema_missing] For editor validation, add this first line: # yaml-language-server: $schema=https://schema.relayflows.dev/v0.1/flows.schema.json
REFUSED [relayflowd_not_found] No relayflowd binary could be found. Install the runtime package for this host (@relayflows/runtime-linux-x64), or set RELAYFLOWD_BIN to a relayflowd executable. Tried: /home/daytona/.relayflow-v2-supervisor/durable/repository/packages/sdk/dist/relayflowd.
: expected 2 to be +0 // Object.is equality

- Expected
+ Received

- 0
+ 2

 ❯ tests/live-kernel.test.ts:1388:40
    1386|     ]);
    1387| 
    1388|     expect(first.status, first.stderr).toBe(0);
       |                                        ^
    1389|     expect(second.status, second.stderr).toBe(0);
    1390|     expect(first.stdout).toContain('completionReason: success');

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/44]⎯

 FAIL  tests/live-kernel.test.ts > a relayflow can be scheduled: tick source against live relayflowd > a tick spawns a real run whose step reports the SCHEDULED instant
AssertionError: expected null to deeply equal { schedule_id: 'heartbeat-1m', …(3) }

- Expected: 
Object {
  "lag_ms": 43000,
  "schedule_id": "heartbeat-1m",
  "scheduled_for_ms": 1764000000000,
  "slot": 29400000,
}

+ Received: 
null

 ❯ tests/live-kernel.test.ts:1739:39
    1737|     // The bound: the run reports the grid instant and its own lag, so…
    1738|     // backfilled run can tell it is running for a slot from the past.
    1739|     expect(completed!.payload.output).toEqual({
       |                                       ^
    1740|       schedule_id: 'heartbeat-1m',
    1741|       slot: 29_400_000,

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/44]⎯

 FAIL  tests/provider-trigger-executor.test.ts > the kernel executes compiled 'app_mention' subscriptions with provider isolation and durable dedupe
 FAIL  tests/provider-trigger-executor.test.ts > the kernel executes compiled 'reaction_added' subscriptions with provider isolation and durable dedupe
 FAIL  tests/provider-trigger-executor.test.ts > the kernel executes compiled 'pull_request' subscriptions with provider isolation and durable dedupe
Error: spawnSync /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ❯ submit tests/provider-trigger-executor.test.ts:43:89
     41|     steps: [{ id: 'effect', type: 'deterministic', command: `printf ac…
     42|   }))));
     43|   const submit = (envelope: unknown, key: string, executor = source.na…
       |                                                                                         ^
     44|     '--data-dir', dir, 'run', spec, '--event', JSON.stringify({ type: …
     45|   ], { encoding: 'utf8', stdio: 'pipe' })) as { matched: boolean; dedu…
 ❯ tests/provider-trigger-executor.test.ts:50:12

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/44]⎯

 FAIL  tests/webhook-live.test.ts > executes and deduplicates 'app_mention' only for its provider and matching payload
 FAIL  tests/webhook-live.test.ts > executes and deduplicates 'reaction_added' only for its provider and matching payload
 FAIL  tests/webhook-live.test.ts > executes and deduplicates 'pull_request' only for its provider and matching payload
Error: webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ❯ until tests/webhook-live.test.ts:39:9
     37|   const deadline = Date.now() + 10_000;
     38|   while (Date.now() < deadline) { if (await predicate()) return; await…
     39|   throw new Error(`webhook integration timed out: ${detail()}`);
       |         ^
     40| }
     41| async function daemon(dir: string): Promise<ChildProcess> {
 ❯ daemon tests/webhook-live.test.ts:43:3
 ❯ tests/webhook-live.test.ts:100:3

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/44]⎯

 FAIL  tests/webhook-live.test.ts > flows serve-webhook writes JSON before the daemon starts, then journals and archives exactly once
Error: webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ❯ until tests/webhook-live.test.ts:39:9
     37|   const deadline = Date.now() + 10_000;
     38|   while (Date.now() < deadline) { if (await predicate()) return; await…
     39|   throw new Error(`webhook integration timed out: ${detail()}`);
       |         ^
     40| }
     41| async function daemon(dir: string): Promise<ChildProcess> {
 ❯ daemon tests/webhook-live.test.ts:43:3
 ❯ tests/webhook-live.test.ts:121:3

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/44]⎯

 FAIL  tests/webhook-live.test.ts > replays a dropped file after SIGKILL before spawn
Error: webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ❯ until tests/webhook-live.test.ts:39:9
     37|   const deadline = Date.now() + 10_000;
     38|   while (Date.now() < deadline) { if (await predicate()) return; await…
     39|   throw new Error(`webhook integration timed out: ${detail()}`);
       |         ^
     40| }
     41| async function daemon(dir: string): Promise<ChildProcess> {
 ❯ daemon tests/webhook-live.test.ts:43:3
 ❯ tests/webhook-live.test.ts:137:17

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/44]⎯

 FAIL  tests/webhook-live.test.ts > resumes the same journal after SIGKILL after spawn and before acknowledgement
Error: webhook integration timed out: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/debug/relayflowd ENOENT
 ❯ until tests/webhook-live.test.ts:39:9
     37|   const deadline = Date.now() + 10_000;
     38|   while (Date.now() < deadline) { if (await predicate()) return; await…
     39|   throw new Error(`webhook integration timed out: ${detail()}`);
       |         ^
     40| }
     41| async function daemon(dir: string): Promise<ChildProcess> {
 ❯ daemon tests/webhook-live.test.ts:43:3
 ❯ tests/webhook-live.test.ts:150:17

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/44]⎯

⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯

Vitest caught 2 unhandled errors during the test run.
This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected.

⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
Error: bubblewrap is unavailable
 ❯ unsupported src/hosted-extension-sandbox.ts:488:9
    486| 
    487| function unsupported(message: string): never {
    488|   throw new PluginError('plugin_unsupported', message);
       |         ^
    489| }
    490| 
 ❯ executable src/hosted-extension-sandbox.ts:469:18
 ❯ Module.runHostedExtensionSandbox src/hosted-extension-sandbox.ts:160:17
 ❯ Module.runVerifiedNativeExtensionSandbox src/hosted-extension-isolation.ts:173:16
 ❯ tests/hosted-extension-protocol.test.ts:454:17
 ❯ node_modules/@vitest/runner/dist/index.js:533:5
 ❯ runTest node_modules/@vitest/runner/dist/index.js:1056:11
 ❯ runSuite node_modules/@vitest/runner/dist/index.js:1205:15
 ❯ runSuite node_modules/@vitest/runner/dist/index.js:1205:15
 ❯ runFiles node_modules/@vitest/runner/dist/index.js:1262:5

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { code: 'plugin_unsupported' }
This error originated in "tests/hosted-extension-protocol.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The latest test that might've caused the error is "rejects two forged calls after the authoritative first outcome settles". It might mean one of the following:
- The error was thrown, while Vitest was running this test.
- If the error occurred after the test had been completed, this was the last documented test before it was thrown.

⎯⎯⎯⎯⎯ Uncaught Exception ⎯⎯⎯⎯⎯
Error: spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/release/relayflowd ENOENT
 ❯ Process.ChildProcess._handle.onexit node:internal/child_process:285:19
 ❯ onErrorNT node:internal/child_process:483:16
 ❯ processTicksAndRejections node:internal/process/task_queues:90:21

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Serialized Error: { errno: -2, code: 'ENOENT', syscall: 'spawn /home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/release/relayflowd', path: '/home/daytona/.relayflow-v2-supervisor/durable/repository/kernel/target/release/relayflowd', spawnargs: [ '--data-dir', '/tmp/flows-mcp-daemon-4iiY74', 'serve' ] }
This error originated in "tests/mcp.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running.
The latest test that might've caused the error is "authored MCP effects against the real kernel". It might mean one of the following:
- The error was thrown, while Vitest was running this test.
- If the error occurred after the test had been completed, this was the last documented test before it was thrown.
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

 Test Files  9 failed | 186 passed | 3 skipped (198)
      Tests  42 failed | 3174 passed | 26 skipped (3242)
     Errors  2 errors
   Start at  06:13:21
   Duration  271.86s (transform 4.22s, setup 0ms, collect 57.58s, tests 711.01s, environment 26ms, prepare 8.10s)

