Back to feed

codex/ts-ci-coverage

sledtools/pika · branch #22 · target master · updated 2026-03-20 18:25:50

branch: merged tutorial: ready ci: failed

CI

Latest run has 1 failed lane(s). Open the highlighted lane rows below for logs, then rerun from this page after fixing the cause.

Run #27 · failed · 10 lane(s)

head 601b1d42c42f8536dbd8d1bbfc4272d86039a4f5 · queued 2026-03-20 18:24:34

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

Lane #74 · check-pika-rust · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pika-rust

lane id pika_rust · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-3567b842 · target pre-merge-pika-rust

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-3567b842 · pre-merge-pika-rust · Run the VM-backed Rust tests from the pre-merge pika lane
[pikaci] run finished: 20260320T182444Z-3567b842 · status=skipped · skipped; no changed files matched 13 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #75 · check-pika-followup · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pika-followup

lane id pika_followup · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-8767b034 · target pre-merge-pika-followup

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-8767b034 · pre-merge-pika-followup · Run the VM-backed non-Rust follow-up checks from the pre-merge pika lane
[pikaci] run finished: 20260320T182444Z-8767b034 · status=skipped · skipped; no changed files matched 23 filter(s)
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #76 · check-notifications · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-notifications

lane id notifications · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-bea1af97 · target pre-merge-notifications

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-bea1af97 · pre-merge-notifications · Run the VM-backed Rust tests from the notifications lane
[pikaci] run finished: 20260320T182444Z-bea1af97 · status=skipped · skipped; no changed files matched 17 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #77 · check-agent-contracts · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-agent-contracts

lane id agent_contracts · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-bf6c627e · target pre-merge-agent-contracts

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-bf6c627e · pre-merge-agent-contracts · Run the VM-backed pre-merge agent contracts lane
[pikaci] run finished: 20260320T182444Z-bf6c627e · status=skipped · skipped; no changed files matched 18 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #78 · check-rmp · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-rmp

lane id rmp · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-a6b319cd · target pre-merge-rmp

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-a6b319cd · pre-merge-rmp · Run the VM-backed pre-merge RMP lane
[pikaci] run finished: 20260320T182444Z-a6b319cd · status=skipped · skipped; no changed files matched 10 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #79 · check-pikachat · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-rust

lane id pikachat · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-536efaac · target pre-merge-pikachat-rust

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-536efaac · pre-merge-pikachat-rust · Run the VM-backed Rust tests from the pikachat lane
[pikaci] run finished: 20260320T182444Z-536efaac · status=skipped · skipped; no changed files matched 25 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #80 · check-pikachat-typescript · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-typescript

lane id pikachat_typescript · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-fcc734bf · target pre-merge-pikachat-typescript

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-fcc734bf · pre-merge-pikachat-typescript · Run the VM-backed TypeScript tests from the pikachat lane
[pikaci] run finished: 20260320T182444Z-fcc734bf · status=skipped · skipped; no changed files matched 14 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #81 · check-apple-host-sanity · failed · ./scripts/pikaci-apple-github-step remote-run --just-recipe apple-host-sanity

lane id apple_host_sanity · retries 0 · queued 2026-03-20 18:24:34

This lane failed. Check the log output below before rerunning.

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:41

./scripts/pikaci-apple-github-step: line 167: PIKACI_APPLE_SSH_KEY: unbound variable
Lane #82 · check-pikachat-openclaw-e2e · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-openclaw-e2e

lane id pikachat_openclaw_e2e · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-794bd727 · target pre-merge-pikachat-openclaw-e2e

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-794bd727 · pre-merge-pikachat-openclaw-e2e · Run the VM-backed heavy OpenClaw gateway end-to-end scenario
[pikaci] run finished: 20260320T182444Z-794bd727 · status=skipped · skipped; no changed files matched 23 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #83 · check-fixture · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-fixture-rust

lane id fixture · retries 0 · queued 2026-03-20 18:24:34

pikaci run 20260320T182444Z-2752c244 · target pre-merge-fixture-rust

started 2026-03-20 18:24:41

finished 2026-03-20 18:24:44

[pikaci] run started: 20260320T182444Z-2752c244 · pre-merge-fixture-rust · Run the VM-backed Rust tests from the fixture lane
[pikaci] run finished: 20260320T182444Z-2752c244 · status=skipped · skipped; no changed files matched 39 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/1a76f20b6688a34b96b535b80c9e5a8fe67e2d58da09655029616c80962abead.sqlite' is busy
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output

Run #26 · failed · 10 lane(s)

head 3dc018e78d3d63e2ce1bd023a1735ee827696dbe · queued 2026-03-20 18:17:10

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:44

Lane #64 · check-pika-rust · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pika-rust

lane id pika_rust · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181742Z-e8628f19 · target pre-merge-pika-rust

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181742Z-e8628f19 · pre-merge-pika-rust · Run the VM-backed Rust tests from the pre-merge pika lane
[pikaci] run finished: 20260320T181742Z-e8628f19 · status=skipped · skipped; no changed files matched 13 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #65 · check-pika-followup · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pika-followup

lane id pika_followup · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181743Z-4e4160d7 · target pre-merge-pika-followup

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181743Z-4e4160d7 · pre-merge-pika-followup · Run the VM-backed non-Rust follow-up checks from the pre-merge pika lane
[pikaci] run finished: 20260320T181743Z-4e4160d7 · status=skipped · skipped; no changed files matched 23 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #66 · check-notifications · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-notifications

lane id notifications · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181743Z-ef3fd1b4 · target pre-merge-notifications

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181743Z-ef3fd1b4 · pre-merge-notifications · Run the VM-backed Rust tests from the notifications lane
[pikaci] run finished: 20260320T181743Z-ef3fd1b4 · status=skipped · skipped; no changed files matched 17 filter(s)
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #67 · check-agent-contracts · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-agent-contracts

lane id agent_contracts · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181744Z-2735d7a0 · target pre-merge-agent-contracts

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:44

[pikaci] run started: 20260320T181744Z-2735d7a0 · pre-merge-agent-contracts · Run the VM-backed pre-merge agent contracts lane
[pikaci] run finished: 20260320T181744Z-2735d7a0 · status=skipped · skipped; no changed files matched 18 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #68 · check-rmp · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-rmp

lane id rmp · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181742Z-68458e57 · target pre-merge-rmp

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181742Z-68458e57 · pre-merge-rmp · Run the VM-backed pre-merge RMP lane
[pikaci] run finished: 20260320T181742Z-68458e57 · status=skipped · skipped; no changed files matched 10 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #69 · check-pikachat · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-rust

lane id pikachat · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181743Z-7dc8ab70 · target pre-merge-pikachat-rust

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181743Z-7dc8ab70 · pre-merge-pikachat-rust · Run the VM-backed Rust tests from the pikachat lane
[pikaci] run finished: 20260320T181743Z-7dc8ab70 · status=skipped · skipped; no changed files matched 25 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #70 · check-pikachat-typescript · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-typescript

lane id pikachat_typescript · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181743Z-5fd8eb37 · target pre-merge-pikachat-typescript

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181743Z-5fd8eb37 · pre-merge-pikachat-typescript · Run the VM-backed TypeScript tests from the pikachat lane
[pikaci] run finished: 20260320T181743Z-5fd8eb37 · status=skipped · skipped; no changed files matched 14 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #71 · check-apple-host-sanity · failed · ./scripts/pikaci-apple-github-step remote-run --just-recipe apple-host-sanity

lane id apple_host_sanity · retries 0 · queued 2026-03-20 18:17:10

This lane failed. Check the log output below before rerunning.

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:19

./scripts/pikaci-apple-github-step: line 167: PIKACI_APPLE_SSH_KEY: unbound variable
Lane #72 · check-pikachat-openclaw-e2e · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-pikachat-openclaw-e2e

lane id pikachat_openclaw_e2e · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181742Z-2941d84a · target pre-merge-pikachat-openclaw-e2e

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:43

[pikaci] run started: 20260320T181742Z-2941d84a · pre-merge-pikachat-openclaw-e2e · Run the VM-backed heavy OpenClaw gateway end-to-end scenario
[pikaci] run finished: 20260320T181742Z-2941d84a · status=skipped · skipped; no changed files matched 23 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output
Lane #73 · check-fixture · success · ./scripts/pikaci-staged-linux-remote.sh run pre-merge-fixture-rust

lane id fixture · retries 0 · queued 2026-03-20 18:17:10

pikaci run 20260320T181741Z-01acbd0e · target pre-merge-fixture-rust

started 2026-03-20 18:17:19

finished 2026-03-20 18:17:42

[pikaci] run started: 20260320T181741Z-01acbd0e · pre-merge-fixture-rust · Run the VM-backed Rust tests from the fixture lane
[pikaci] run finished: 20260320T181741Z-01acbd0e · status=skipped · skipped; no changed files matched 39 filter(s)
error (ignored): SQLite database '/var/lib/pika-news/.cache/nix/eval-cache-v6/c54a98656bb4d9af9309296a9cc0e19af16a65deaf1bcea8b325cd6ebb7d1f64.sqlite' is busy
this derivation will be built:
  /nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv
building '/nix/store/v76p347z90mzqi4fbzway8l6fvvjdjbh-pikaci-0.1.0.drv'...
[pikaci-tools] staged-linux-remote: resolution=nix-build package_root=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0
[pikaci-tools] staged-linux-remote: pikaci=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci
[pikaci-tools] staged-linux-remote: helper=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-fulfill-prepared-output
[pikaci-tools] staged-linux-remote: launcher=/nix/store/0bhnwd39ga6y0z1vw3h196g82a35vf4i-pikaci-0.1.0/bin/pikaci-launch-fulfill-prepared-output

merge commit 3da79e21fae01876cc4b464c1edbc4aefa382da6

Summary

This branch introduces a dedicated, path-scoped TypeScript CI lane (pikachat_typescript) for the pikachat-claude and pikachat-openclaw TypeScript packages. Previously, TypeScript checks were either bundled into the broader Rust-oriented pikachat CI lane or invoked ad-hoc via npx. The new lane adds a standalone shell script (scripts/pikachat-typescript-ci.sh) that stages each package into a clean temporary directory, runs npm install, tsc --noEmit, and npm test. The lane is wired end-to-end: forge lane manifest registration with path globs, pikaci target and job model enums, a Nix-built VM guest wrapper, justfile integration, CI shim routing, documentation in ci-selectors.md, and comprehensive Rust and Python tests proving that a change to e.g. pikachat-claude/src/channel-runtime.ts selects only the new TypeScript lane and not the Rust lane.

Tutorial Steps

Register the new forge lane in the manifest

Intent: Declare a new `pikachat_typescript` branch lane in the forge lane manifest so the CI selector can match TypeScript-related path changes to a dedicated lane instead of falling through to the broader pikachat Rust lane.

Affected files: ci/forge-lanes.toml

Evidence
@@ -201,6 +201,27 @@ paths = [
+[[branch.lanes]]
+id = "pikachat_typescript"
+title = "check-pikachat-typescript"
+staged_linux_target = "pre-merge-pikachat-typescript"
+paths = [
+  "ci/forge-lanes.toml",
+  ".github/workflows/pre-merge.yml",
+  "crates/pikaci/**",
+  "nix/ci/linux-rust.nix",
+  "scripts/forge-github-ci-shim.py",
+  "scripts/pikaci-staged-linux-remote.sh",
+  "scripts/pikachat-typescript-ci.sh",
+  "pikachat-claude/package.json",
+  "pikachat-claude/tsconfig.json",
+  "pikachat-claude/src/**",
+  "pikachat-openclaw/openclaw/extensions/pikachat-openclaw/package.json",
+  "pikachat-openclaw/openclaw/extensions/pikachat-openclaw/tsconfig.json",
+  "pikachat-openclaw/openclaw/extensions/pikachat-openclaw/index.ts",
+  "pikachat-openclaw/openclaw/extensions/pikachat-openclaw/src/**",
+]

A new [[branch.lanes]] entry is appended to ci/forge-lanes.toml with id = "pikachat_typescript" and staged_linux_target = "pre-merge-pikachat-typescript". The paths array is carefully scoped to only the TypeScript package surfaces (pikachat-claude/src/**, pikachat-openclaw/.../src/**, their package.json and tsconfig.json files) plus the CI plumbing files that govern the lane itself. This means a pure .ts file change will select only this lane and not the heavier Rust-oriented pikachat lane.

Extend the pikaci model with TypeScript target and lane enums

Intent: Add the new `PreMergePikachatTypescript` target variant and `PikachatTypescript` lane variant to the pikaci Rust model so the CI orchestrator can resolve, configure, and dispatch jobs for the TypeScript lane.

Affected files: crates/pikaci/src/model.rs

Evidence
@@ -155,6 +155,7 @@ pub enum StagedLinuxRustTarget {
+    PreMergePikachatTypescript,
@@ -197,6 +198,7 @@ pub enum StagedLinuxRustLane {
+    PikachatTypescript,
@@ -230,6 +232,7 @@ impl StagedLinuxRustLane {
+            Self::PikachatTypescript => "pikachat_typescript",
@@ -271,6 +274,7 @@ impl StagedLinuxRustLane {
+            Self::PikachatTypescript => StagedLinuxRustTarget::PreMergePikachatTypescript,
@@ -364,6 +368,9 @@ impl StagedLinuxRustLane {
+            Self::PikachatTypescript => {
+                "/staged/linux-rust/workspace-build/bin/run-pikachat-typescript"
+            }
@@ -497,6 +506,18 @@ impl StagedLinuxRustTarget {
+            Self::PreMergePikachatTypescript => StagedLinuxRustTargetConfig {
+                target_id: "pre-merge-pikachat-typescript",
+                ...
+                shadow_recipe: "",
+            },

The StagedLinuxRustTarget enum gains PreMergePikachatTypescript and StagedLinuxRustLane gains PikachatTypescript. All the required trait-like method arms are filled in:

  • selector_key() returns "pikachat_typescript".
  • target() maps the lane back to PreMergePikachatTypescript.
  • execute_wrapper_command() returns "/staged/linux-rust/workspace-build/bin/run-pikachat-typescript".
  • from_target_id("pre-merge-pikachat-typescript") parses correctly.
  • config() reuses the existing pikachatWorkspaceDeps / pikachatWorkspaceBuild Nix outputs since the TypeScript lane shares the same workspace derivation. Notably shadow_recipe is set to the empty string — there is no shadow justfile recipe for this lane.

Extensive new unit tests (pikachat_lane_uses_pikachat_workspace_outputs, selector_key, target config round-trip assertions, and the exhaustive target list test) validate every new arm.

Wire the pikaci target spec and job definition

Intent: Register the `pre-merge-pikachat-typescript` target name in the pikaci dispatcher so that `pikaci run pre-merge-pikachat-typescript` resolves to a single job that runs inside a staged Linux microVM.

Affected files: crates/pikaci/src/main.rs

Evidence
@@ -586,6 +586,26 @@ fn target_spec(name: &str) -> anyhow::Result<TargetSpec> {
+        "pre-merge-pikachat-typescript" => Ok(staged_linux_target_spec(
+            StagedLinuxRustTarget::PreMergePikachatTypescript,
+            &[
+                ...path globs...
+            ],
+            pikachat_typescript_jobs(),
+        )),
@@ -1417,6 +1437,17 @@ fn pikachat_openclaw_e2e_jobs() -> Vec<JobSpec> {
+fn pikachat_typescript_jobs() -> Vec<JobSpec> {
+    vec![JobSpec {
+        id: "pikachat-typescript",
+        description: "Run the Claude and OpenClaw TypeScript typecheck and unit tests in a remote Linux microVM",
+        timeout_secs: 1800,
+        writable_workspace: false,
+        guest_command: GuestCommand::ShellCommand { command: "ignored" },
+        staged_linux_rust_lane: Some(StagedLinuxRustLane::PikachatTypescript),
+    }]
@@ -2040,6 +2071,19 @@ mod tests {
+    #[test]
+    fn pre_merge_pikachat_typescript_target_uses_staged_linux_runner() {

In target_spec(), a new match arm maps "pre-merge-pikachat-typescript" to a staged_linux_target_spec with the same set of path globs used in the forge lane manifest. The pikachat_typescript_jobs() helper returns a single JobSpec with:

  • 30-minute timeout (1800 seconds).
  • writable_workspace: false — the TypeScript CI script stages into /tmp, so it does not need a writable snapshot.
  • guest_command is "ignored" because the staged Linux runner uses execute_wrapper_command() from the lane enum instead.

A new test pre_merge_pikachat_typescript_target_uses_staged_linux_runner asserts the job count, lane mapping, and runner kind.

Create the TypeScript CI shell script

Intent: Provide a standalone, scope-aware shell script that installs, typechecks, and unit-tests the pikachat TypeScript packages in an isolated staging directory.

Affected files: scripts/pikachat-typescript-ci.sh

Evidence
@@ -0,0 +1,113 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+usage() {
+  cat <<'EOF'
+Usage: ./scripts/pikachat-typescript-ci.sh [--scope all|claude|openclaw]
+...

This is the core new artifact. scripts/pikachat-typescript-ci.sh is a self-contained Bash script with the following design:

  1. Scope flag (--scope all|claude|openclaw) — defaults to all. Allows callers to run only one package, which the justfile leverages for the OpenClaw-only deterministic recipe.
  2. Stagingstage_package_dir() uses tar --exclude='./node_modules' --exclude='./package-lock.json' to copy the source package into a fresh mktemp directory. This isolates CI from any local node_modules state.
  3. Cleanup trap — a trap cleanup EXIT removes all staging directories on exit.
  4. npm binary overridePIKACHAT_TYPESCRIPT_CI_NPM_BIN allows the Nix VM wrapper to inject a Nix-store npm path, falling back to the ambient npm.
  5. Three-phase per-packagerun_package() runs npm install --include=dev, npm run typecheck (which invokes tsc --noEmit), and npm test.

The script handles both pikachat-claude and the deeply nested pikachat-openclaw/openclaw/extensions/pikachat-openclaw package.

Add the Nix VM guest wrapper for the TypeScript lane

Intent: Create a `run-pikachat-typescript` wrapper script inside the Nix-built workspace so the staged Linux microVM can execute the TypeScript CI lane with the correct Node.js binary.

Affected files: nix/ci/linux-rust.nix

Evidence
@@ -1521,6 +1521,16 @@ CFG
+          cat >"$out/bin/run-pikachat-typescript" <<'EOF'
+          #!${pkgs.bash}/bin/bash
+          set -euo pipefail
+
+          if [ -f /workspace/snapshot/Cargo.toml ]; then
+            cd /workspace/snapshot
+          fi
+          export PIKACHAT_TYPESCRIPT_CI_NPM_BIN="${pkgs.nodejs_22}/bin/npm"
+          exec ./scripts/pikachat-typescript-ci.sh
+          EOF
@@ -1610,6 +1620,7 @@ CFG
+            "$out/bin/run-pikachat-typescript" \

The Nix derivation for pikachatWorkspaceBuild now emits a run-pikachat-typescript wrapper alongside the existing Rust integration test wrappers. Key details:

  • It cds into /workspace/snapshot if a Cargo.toml is present (the standard workspace snapshot convention).
  • It exports PIKACHAT_TYPESCRIPT_CI_NPM_BIN pointing to the Nix-store nodejs_22 npm binary, ensuring a reproducible Node version inside the VM.
  • It execs into ./scripts/pikachat-typescript-ci.sh with no scope flag, so both packages are tested.
  • The wrapper path is added to the chmod +x list so it is executable in the output.

Update the justfile to delegate to the new script

Intent: Replace the inline `npx --yes tsx --test ...` invocation in the `openclaw-pikachat-deterministic` recipe with a call to the new CI script, keeping one canonical entry point for TypeScript testing.

Affected files: just/checks.just

Evidence
@@ -280,7 +280,7 @@ openclaw-pikachat-deterministic:
-    npx --yes tsx --test pikachat-openclaw/openclaw/extensions/pikachat-openclaw/src/channel-behavior.test.ts
+    ./scripts/pikachat-typescript-ci.sh --scope openclaw

The openclaw-pikachat-deterministic justfile recipe previously ran npx --yes tsx --test directly against the OpenClaw test file. This is replaced with ./scripts/pikachat-typescript-ci.sh --scope openclaw, which not only runs the test but also performs a fresh npm install and tsc --noEmit typecheck in a staged directory. The --scope openclaw flag limits execution to only the OpenClaw package, keeping the recipe focused.

Add a test script to the openclaw package.json

Intent: Give the openclaw package a proper `npm test` script so the CI shell script can invoke `npm test` uniformly across both packages.

Affected files: pikachat-openclaw/openclaw/extensions/pikachat-openclaw/package.json

Evidence
@@ -7,13 +7,15 @@
-    "typecheck": "tsc --noEmit"
+    "typecheck": "tsc --noEmit",
+    "test": "node --import tsx --test src/**/*.test.ts"
+    "tsx": "^4.19.3",

Two changes to the openclaw extension package.json:

  1. A "test" script is added: node --import tsx --test src/**/*.test.ts. This uses the Node.js built-in test runner with tsx as a loader, replacing the previous npx --yes tsx --test approach.
  2. tsx is added as an explicit devDependency (^4.19.3) instead of relying on npx to fetch it on-the-fly. This makes the dependency explicit and reproducible.

Add a comment to the channel-runtime TypeScript source

Intent: Annotate the pruned baseline persistence step in `PikachatClaudeChannel` to clarify its purpose relative to the daemon lifecycle.

Affected files: pikachat-claude/src/channel-runtime.ts

Evidence
@@ -111,6 +111,7 @@ export class PikachatClaudeChannel {
+    // Persist a pruned baseline before the daemon starts mutating access state.

A single clarifying comment is added before the pruneExpiredPairings / saveAccessState call in the channel boot path. This makes it clear that the pruned state is written as a baseline before the daemon begins mutating access state, which is relevant context for understanding the access-file lifecycle.

Add the Rust selector test for TypeScript path routing

Intent: Prove that a change to a TypeScript source file selects only the new `pikachat_typescript` lane and does not trigger the Rust-oriented `pikachat` lane.

Affected files: crates/pika-news/src/ci_manifest.rs

Evidence
@@ -200,6 +200,20 @@ mod tests {
+    #[test]
+    fn typescript_plugin_branch_selects_only_typescript_lane() {
+        let manifest =
+            parse_manifest(include_str!("../../../ci/forge-lanes.toml")).expect("manifest");
+        let changed = vec!["pikachat-claude/src/channel-runtime.ts".to_string()];
+        let selected = select_branch_lanes(&manifest, &changed).expect("select lanes");
+        let ids = selected.into_iter().map(|lane| lane.id).collect::<Vec<_>>();
+
+        assert!(ids.contains(&"pikachat_typescript".to_string()));
+        assert!(!ids.contains(&"pikachat".to_string()));
+        assert!(!ids.contains(&"pika_rust".to_string()));
+        assert!(!ids.contains(&"pika_followup".to_string()));
+    }
@@ -262,6 +276,7 @@ command = ["./nightly.sh"]
+            ("pikachat_typescript", "pre-merge-pikachat-typescript"),

Two test additions in ci_manifest.rs:

  1. typescript_plugin_branch_selects_only_typescript_lane — parses the real forge-lanes.toml, simulates a single changed file pikachat-claude/src/channel-runtime.ts, and asserts that pikachat_typescript is selected while pikachat, pika_rust, and pika_followup are not. This is the critical routing correctness test.
  2. The exhaustive canonical_manifest_change_selects_branch_lanes test gains the ("pikachat_typescript", "pre-merge-pikachat-typescript") pair, ensuring the lane's target mapping is verified against the real manifest.

Add the Python end-to-end CI shim test for TypeScript routing

Intent: Verify that the forge GitHub CI shim correctly routes a TypeScript file change through the full git-based selection pipeline to the dedicated lane.

Affected files: scripts/test_forge_github_ci_shim.py

Evidence
@@ -271,6 +271,95 @@ command = ["python3", "-c", "print('nightly')"]
+    def test_branch_selection_routes_typescript_changes_to_dedicated_lane(self) -> None:
+        with tempfile.TemporaryDirectory() as tmp:
+            repo = Path(tmp)
+            ...
+            payload = json.loads(completed.stdout)
+            self.assertEqual(
+                [lane["id"] for lane in payload["include"]],
+                ["pikachat_typescript"],
+            )
@@ -721,6 +810,7 @@ command = ["python3", "-c", "print('nightly')"]
+                "pikachat_typescript",
@@ -758,6 +848,18 @@ command = ["python3", "-c", "print('nightly')"]
+        self.assertEqual(
+            commands["pikachat_typescript"],
+            [
+                "./scripts/pikaci-staged-linux-remote.sh",
+                "run",
+                "pre-merge-pikachat-typescript",
+            ],
+        )

The Python test suite for the forge GitHub CI shim gets a new test test_branch_selection_routes_typescript_changes_to_dedicated_lane. It:

  1. Creates a temporary git repo with a minimal forge-lanes.toml containing both pikachat_typescript and pikachat lanes.
  2. Commits a base state, then modifies only pikachat-claude/src/channel-runtime.ts.
  3. Runs the select --mode branch command and asserts the output JSON includes only pikachat_typescript.

Additionally, the exhaustive lane ordering test and the command/group mapping tests are extended to include the new pikachat_typescript lane with its expected command ["./scripts/pikaci-staged-linux-remote.sh", "run", "pre-merge-pikachat-typescript"] and group "staged-linux:pre-merge-pikachat-typescript".

Update documentation and help text

Intent: Record the new lane's contract in the CI selectors documentation and update the staged runner help text.

Affected files: docs/testing/ci-selectors.md, scripts/pikaci-staged-linux-remote.sh

Evidence
@@ -27,6 +27,7 @@ This document defines the selector-first contract and current policy ownership f
+| `check-pikachat-typescript` | `./scripts/pikachat-typescript-ci.sh` over the checked-in `pikachat-claude` and `pikachat-openclaw` TypeScript package surfaces. This is a path-scoped pre-merge lane: it should trigger only for those TypeScript/plugin package paths and the lane plumbing that governs them. |
@@ -13,6 +13,7 @@ Targets:
+  pre-merge-pikachat-typescript

The ci-selectors.md documentation table gains a row for check-pikachat-typescript with its canonical contract description — it runs the TypeScript CI script and is path-scoped to only trigger for TypeScript package paths.

The pikaci-staged-linux-remote.sh help text's target list is updated to include pre-merge-pikachat-typescript so operators can discover it.

Diff