CI run for rad:zwTxygwuz5LDGBq255RA2CbNGrz8

Radicle repository id rad:zwTxygwuz5LDGBq255RA2CbNGrz8

Table of Contents

Run log

[2025-10-10T05:57:03Z INFO  ambient] ambient starts
deprecated: the `cpus` field is replaced by `qemu.cpus`
deprecated: the `memory` field is replaced by `qemu.memory`
[=3h[=3hBdsDxe: failed to load Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0): Not Found
BdsDxe: loading Boot0002 "UEFI Misc Device" from PciRoot(0x0)/Pci(0x2,0x0)
BdsDxe: starting Boot0002 "UEFI Misc Device" from PciRoot(0x0)/Pci(0x2,0x0)
Welcome to GRUB!


INFO: Block devices
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
vda    254:0    0   100G  0 disk 
├─vda1 254:1    0   953M  0 part 
└─vda2 254:2    0  99.1G  0 part /
vdb    254:16   0   6.1M  1 disk 
vdc    254:32   0     9M  1 disk 
vdd    254:48   0 953.7M  0 disk 
vde    254:64   0  27.9G  0 disk 
vdf    254:80   0 896.3M  1 disk 
INFO: Extracting tar archive from /dev/vdb
drwxr-xr-x _rad/_rad         0 2025-10-10 05:56 ./
-rw-r--r-- _rad/_rad      1789 2025-10-10 05:56 ./plan.yaml
-rwxr-xr-x _rad/_rad   6369536 2025-10-10 05:56 ./run-ci
INFO: Extracted files:
  3538954      4 drwxr-xr-x   2 1000     1000         4096 Oct 10 05:56 .
  3538955      4 -rw-r--r--   1 1000     1000         1789 Oct 10 05:56 ./plan.yaml
  3538956   6224 -rwxr-xr-x   1 1000     1000      6369536 Oct 10 05:56 ./run-ci
INFO: Running run-ci from /dev/vdb
================================ BEGIN ================================
[2025-10-10T05:56:48Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z INFO  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z WARN  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-10T05:56:48Z ERROR ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
RunnablePlan::from_file: filename=plan.yaml
steps:
- action: mkdir
  pathname: /workspace
- action: mkdir
  pathname: /workspace/artifacts
- action: tar_extract
  archive: /dev/vdc
  directory: /workspace/src
- action: tar_extract
  archive: /dev/vdf
  directory: /workspace/deps
- action: tar_extract
  archive: /dev/vde
  directory: /workspace/cache
- action: spawn
  argv:
  - find
  - /workspace
  - -maxdepth
  - '2'
  - -ls
- action: cargo_fmt
- action: cargo_clippy
- action: shell
  shell: |
    export CARGO_TARGET_DIR=/workspace/cache
    export CARGO_HOME=/workspace/deps
    export HOME=/root
    export PATH="/root/.cargo/bin:/root/.radicle/bin:$PATH"

    # Check that `rad` is there.
    rad --help >/dev/null || (echo rad is not there; exit 1)

    cargo doc --workspace --no-deps

    # FIXME: We can't run upgrade tests from older versions because
    # Ambient only fetches dependencies for the current version.
    # Thus, we can't build the old versions. This is an Ambient
    # problem that we can't fix here. So we skip the upgrade tests.
    cargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2

    subplot docgen ci-broker.subplot -o doc/ci-broker.html
    subplot docgen doc/userguide.subplot -o doc/userguide.html
    make -C doc
    cp doc/*.html /workspace/artifacts/.
- action: custom
  name: dch
  args:
    debemail: liw@liw.fi
    debfullname: Lars Wirzenius
- action: deb
- action: tar_create
  archive: /dev/vde
  directory: /workspace/cache
- action: tar_create
  archive: /dev/vdd
  directory: /workspace/artifacts
executor_drive: /dev/vdb
source_drive: /dev/vdc
artifact_drive: /dev/vdd
cache_drive: /dev/vde
deps_drive: /dev/vdf
workspace_dir: /workspace
source_dir: /workspace/src
deps_dir: /workspace/deps
cache_dir: /workspace/cache
artifacts_dir: /workspace/artifacts


[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
        pathname: "/workspace",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
        pathname: "/workspace",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
        pathname: "/workspace/artifacts",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
        pathname: "/workspace/artifacts",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vdc",
        directory: "/workspace/src",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vdc",
        directory: "/workspace/src",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vdf",
        directory: "/workspace/deps",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vdf",
        directory: "/workspace/deps",
    }
[2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
[2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
[2025-10-10T05:56:50Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vde",
        directory: "/workspace/cache",
    }
[2025-10-10T05:56:50Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vde",
        directory: "/workspace/cache",
    }
[2025-10-10T05:56:51Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
[2025-10-10T05:56:51Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
[2025-10-10T05:56:59Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action Spawn {
        argv: [
            "find",
            "/workspace",
            "-maxdepth",
            "2",
            "-ls",
        ],
    }
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
        argv: [
            "find",
            "/workspace",
            "-maxdepth",
            "2",
            "-ls",
        ],
    }
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
SPAWN: argv=["find", "/workspace", "-maxdepth", "2", "-ls"]
       cwd=/workspace/src (exists? true)
  5242881      4 drwxr-xr-x   6 root     root         4096 Oct 10 05:56 /workspace
  5242882      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/artifacts
  5243191      4 drwxr-xr-x   3 root     root         4096 Oct 10 05:56 /workspace/deps
  5243192      4 drwxr-xr-x   5 root     root         4096 Sep 10 13:33 /workspace/deps/registry
  5271461      0 -rw-r--r--   1 root     root            0 Sep 10 13:33 /workspace/deps/.package-cache-mutate
  5271460    120 -rw-r--r--   1 root     root       122880 Oct 10 05:56 /workspace/deps/.global-cache
  5271462      0 -rw-r--r--   1 root     root            0 Sep 10 13:33 /workspace/deps/.package-cache
  5271463      4 drwxr-xr-x   6 root     root         4096 Sep 20 06:05 /workspace/cache
  5276158      4 -rw-r--r--   1 root     root          218 Sep 20 05:56 /workspace/cache/.rustdoc_fingerprint.json
  5271464      4 -rw-r--r--   1 root     root         1038 Oct 10 05:56 /workspace/cache/.rustc_info.json
  5276159      4 drwxr-xr-x   7 root     root         4096 Oct  8 05:48 /workspace/cache/debug
  5271465      4 drwxr-xr-x   7 root     root         4096 Oct  8 05:49 /workspace/cache/release
  5276157      4 drwxr-xr-x   2 root     root         4096 Sep 20 05:52 /workspace/cache/tmp
  5275606      4 drwxr-xr-x  12 root     root         4096 Oct  8 05:45 /workspace/cache/doc
  5242883      4 drwxr-xr-x  10 root     root         4096 Oct 10 05:56 /workspace/src
  5242978      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.cargo
  5242959      4 -rw-r--r--   1 root     root          386 Oct 10 05:56 /workspace/src/cibtool.1
  5242981      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.ambient
  5242970      4 -rw-r--r--   1 root     root         1079 Oct 10 05:56 /workspace/src/LICENSE-MIT
  5242976      4 -rw-r--r--   1 root     root           44 Oct 10 05:56 /workspace/src/.gitignore
  5242971     12 -rw-r--r--   1 root     root         9723 Oct 10 05:56 /workspace/src/LICENSE-APACHE
  5242888      4 -rw-r--r--   1 root     root          469 Oct 10 05:56 /workspace/src/test.yaml
  5242947      4 drwxr-xr-x   3 root     root         4096 Oct 10 05:56 /workspace/src/debian
  5242983      4 drwxr-xr-x   8 root     root         4096 Oct 10 05:56 /workspace/src/.git
  5242960      4 -rw-r--r--   1 root     root          440 Oct 10 05:56 /workspace/src/cib.1
  5242934      8 -rw-r--r--   1 root     root         5951 Oct 10 05:56 /workspace/src/flake.nix
  5242966      4 -rw-r--r--   1 root     root         2245 Oct 10 05:56 /workspace/src/RELEASE.md
  5242964   2932 -rw-r--r--   1 root     root      3002368 Oct 10 05:56 /workspace/src/ci-broker.db
  5242885      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/tests
  5242974      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.radicle
  5242968     40 -rw-r--r--   1 root     root        37786 Oct 10 05:56 /workspace/src/NEWS.md
  5242884      4 -rw-r--r--   1 root     root         1716 Oct 10 05:56 /workspace/src/Cargo.toml
  5242961      4 -rw-r--r--   1 root     root          732 Oct 10 05:56 /workspace/src/ci-broker.yaml
  5242969      4 -rw-r--r--   1 root     root          334 Oct 10 05:56 /workspace/src/Makefile
  5242967      8 -rw-r--r--   1 root     root         4796 Oct 10 05:56 /workspace/src/README.md
  5242963     92 -rw-r--r--   1 root     root        92634 Oct 10 05:56 /workspace/src/ci-broker.md
  5242965      4 -rw-r--r--   1 root     root          802 Oct 10 05:56 /workspace/src/build.rs
  5242977      4 -rw-r--r--   1 root     root           10 Oct 10 05:56 /workspace/src/.envrc
  5242973      4 -rw-r--r--   1 root     root         1188 Oct 10 05:56 /workspace/src/CONTRIBUTING.md
  5242972    100 -rw-r--r--   1 root     root        98580 Oct 10 05:56 /workspace/src/Cargo.lock
  5242962      4 -rw-r--r--   1 root     root          257 Oct 10 05:56 /workspace/src/ci-broker.subplot
  5242936      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/doc
  5242935      8 -rw-r--r--   1 root     root         6528 Oct 10 05:56 /workspace/src/flake.lock
  5242887      4 -rw-r--r--   1 root     root          905 Oct 10 05:56 /workspace/src/test2.yaml
  5242889      4 drwxr-xr-x   4 root     root         4096 Oct 10 05:56 /workspace/src/src
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
[2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        },
        source_dir: "/workspace/src",
    }
SPAWN: argv=["cargo", "--version"]
       cwd=/workspace/src (exists? true)
cargo 1.90.0 (840b83a10 2025-07-30)
SPAWN: argv=["cargo", "clippy", "--version"]
       cwd=/workspace/src (exists? true)
clippy 0.1.90 (1159e78c47 2025-09-14)
SPAWN: argv=["rustc", "--version"]
       cwd=/workspace/src (exists? true)
rustc 1.90.0 (1159e78c4 2025-09-14)
SPAWN: argv=["cargo", "fmt", "--check"]
       cwd=/workspace/src (exists? true)
Diff in /workspace/src/src/bin/cibtool.rs:18:
 
 use clap::Parser;
 
-use radicle::{git::Oid, prelude::NodeId, Profile};
+use radicle::{Profile, git::Oid, prelude::NodeId};
 
 use radicle_ci_broker::{
     broker::BrokerError,
Diff in /workspace/src/src/bin/cibtool.rs:335:
     #[error("when adding a branch-update event, the --base option is required")]
     BaseRequired,
 
-    #[error(
-        "when adding a patch-create or patch--update event, the --patch-id option is required"
-    )]
+    #[error("when adding a patch-create or patch--update event, the --patch-id option is required")]
     PatchIdRequired,
 
     #[error("failed to construct a CI event")]
Diff in /workspace/src/src/bin/cibtoolcmd/log.rs:1:
 use std::{
     convert::TryFrom,
-    fs::{read, File},
+    fs::{File, read},
     io::{Read, Write},
     path::{Path, PathBuf},
 };
Diff in /workspace/src/src/bin/synthetic-events.rs:7:
 
 use std::{
     env::current_exe,
-    fs::{read, remove_file, File, OpenOptions},
+    fs::{File, OpenOptions, read, remove_file},
     io::{Read, Write},
     net::Shutdown,
     os::unix::net::{UnixListener, UnixStream},
Diff in /workspace/src/src/adapter.rs:17:
 };
 
 use serde::Serialize;
-use tempfile::{tempdir, TempDir};
+use tempfile::{TempDir, tempdir};
 use url::Url;
 
 use crate::{
Diff in /workspace/src/src/adapter.rs:454:
 mod test {
     use std::{fs::write, io::ErrorKind, path::PathBuf, time::Duration};
 
-    use tempfile::{tempdir, NamedTempFile, TempDir};
+    use tempfile::{NamedTempFile, TempDir, tempdir};
 
     use radicle::git::Oid;
     use radicle::prelude::RepoId;
Diff in /workspace/src/src/adapter.rs:465:
         msg::{MessageError, Response, RunId, RunResult},
         notif::NotificationChannel,
         run::{RunBuilder, Whence},
-        test::{mock_adapter, trigger_request, TestResult},
+        test::{TestResult, mock_adapter, trigger_request},
     };
 
     const MAX: Duration = Duration::from_secs(10);
Diff in /workspace/src/src/broker.rs:8:
     time::Duration,
 };
 
-use time::{macros::format_description, OffsetDateTime};
-use tracing::{span, Level};
+use time::{OffsetDateTime, macros::format_description};
+use tracing::{Level, span};
 
 use radicle::prelude::RepoId;
 
Diff in /workspace/src/src/broker.rs:205:
         msg::{RunId, RunResult},
         notif::NotificationChannel,
         run::RunState,
-        test::{mock_adapter, trigger_request, TestResult},
+        test::{TestResult, mock_adapter, trigger_request},
     };
 
     fn broker(filename: &Path) -> anyhow::Result<Broker> {
Diff in /workspace/src/src/ci_event.rs:12:
     storage::RefUpdate,
 };
 
-use crate::refs::{ref_string, GenericRefName, TagName};
+use crate::refs::{GenericRefName, TagName, ref_string};
 
 #[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
 #[non_exhaustive]
Diff in /workspace/src/src/ci_event.rs:423:
     const MAIN_BRANCH_REF_NAME: &str =
         "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/main";
 
-    const PATCH_REF_NAME: &str =
-        "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
+    const PATCH_REF_NAME: &str = "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
     const PATCH_ID: &str = "f9fa90725474de9002be503ae3cda4670c9a174";
 
     fn nid() -> NodeId {
Diff in /workspace/src/src/cob.rs:13:
 use radicle::{
     git::Oid,
     node::{
-        sync::{Announcer, AnnouncerConfig, ReplicationFactor},
         Handle, Node,
+        sync::{Announcer, AnnouncerConfig, ReplicationFactor},
     },
     prelude::{Profile, ReadStorage, RepoId},
     storage::git::Repository,
Diff in /workspace/src/src/db.rs:18:
 
 use serde::{Deserialize, Serialize};
 use sqlite::{Connection, State, Statement};
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
 use uuid::Uuid;
 
 use crate::{ci_event::CiEvent, msg::RunId, run::Run};
Diff in /workspace/src/src/ergo.rs:8:
 use std::str::FromStr;
 
 use radicle::{
-    cob::patch::{cache::Patches, Patch, PatchId},
+    cob::patch::{Patch, PatchId, cache::Patches},
     git::Oid,
     identity::{Project, RepoId},
     profile::Profile,
Diff in /workspace/src/src/ergo.rs:15:
-    storage::{git::Repository, ReadStorage, RepositoryInfo},
+    storage::{ReadStorage, RepositoryInfo, git::Repository},
 };
 
 /// A Radicle node.
Diff in /workspace/src/src/filter.rs:5:
 
 use radicle::{
     cob::patch::PatchId,
-    git::{raw::ObjectType, BranchName, Oid},
+    git::{BranchName, Oid, raw::ObjectType},
     node::NodeId,
     prelude::{Profile, RepoId},
     storage::git::Repository,
Diff in /workspace/src/src/filter.rs:418:
     use qcheck_macros::quickcheck;
     use radicle::prelude::{Did, RepoId};
 
-    use crate::refs::{branch_from_str, TagName};
+    use crate::refs::{TagName, branch_from_str};
 
     use super::*;
 
Diff in /workspace/src/src/logger.rs:4:
 
 use clap::ValueEnum;
 use serde_json::Value;
-use tracing::{debug, error, info, trace, warn, Level};
-use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
+use tracing::{Level, debug, error, info, trace, warn};
+use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
 use uuid::Uuid;
 
 use radicle::{git::Oid, identity::RepoId, node::Event, patch::PatchId};
Diff in /workspace/src/src/msg.rs:20:
 use serde_json::Value;
 use uuid::Uuid;
 
-pub use radicle::{
-    cob::patch::PatchId,
-    git::Oid,
-    prelude::{NodeId, RepoId},
-};
 use radicle::{
+    Profile,
     identity::Did,
     node::{Alias, AliasStore},
     patch::{self, RevisionId},
Diff in /workspace/src/src/msg.rs:32:
-    storage::{git::paths, ReadRepository, ReadStorage},
-    Profile,
+    storage::{ReadRepository, ReadStorage, git::paths},
 };
+pub use radicle::{
+    cob::patch::PatchId,
+    git::Oid,
+    prelude::{NodeId, RepoId},
+};
 
 use crate::{
     ci_event::{CiEvent, CiEventV1},
Diff in /workspace/src/src/msg.rs:1266:
         process::Command,
     };
 
-    use nonempty::{nonempty, NonEmpty};
+    use nonempty::{NonEmpty, nonempty};
     use radicle::prelude::{Profile, RepoId};
 
-    use time::{macros::format_description, OffsetDateTime};
+    use time::{OffsetDateTime, macros::format_description};
 
     use super::{MessageError, Oid, Request, Response, RunId, RunResult};
 
Diff in /workspace/src/src/node_event_source.rs:3:
 use std::{fmt, path::PathBuf, time};
 
 use radicle::{
-    node::{Event, Handle},
     Profile,
+    node::{Event, Handle},
 };
 
 use crate::logger;
Diff in /workspace/src/src/notif.rs:1:
 //! Notification channel between threads.
 
 use std::{
-    sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender},
+    sync::mpsc::{Receiver, RecvTimeoutError, Sender, channel},
     time::Duration,
 };
 
Diff in /workspace/src/src/pages.rs:16:
 use html_page::{Element, HtmlPage, Tag};
 use rss::{Channel, ChannelBuilder, Guid, Item, ItemBuilder};
 use serde::Serialize;
-use time::{macros::format_description, OffsetDateTime};
+use time::{OffsetDateTime, macros::format_description};
 
 use radicle::{
+    Profile,
     git::Oid,
     prelude::RepoId,
     storage::{ReadRepository, ReadStorage},
Diff in /workspace/src/src/pages.rs:25:
-    Profile,
 };
 
 use crate::{
Diff in /workspace/src/src/sensitive.rs:17:
 
 use std::fmt;
 
-use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
+use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
 
 const PLACEHOLDER: &str = "<REDACTED>";
 
Diff in /workspace/src/src/test.rs:7:
 use crate::adapter::Adapter;
 use crate::ci_event::{CiEvent, CiEventV1};
 use crate::msg::{Request, RequestBuilder};
+use radicle::Profile;
 use radicle::crypto::ssh::Keystore;
 use radicle::crypto::test::signer::MockSigner;
 use radicle::git::RefString;
Diff in /workspace/src/src/test.rs:13:
 use radicle::profile::{Config, Home};
 use radicle::storage::ReadRepository;
 use radicle::test::setup::Node;
-use radicle::Profile;
 
 use tempfile::tempdir;
 
Diff in /workspace/src/src/timeoutcmd.rs:50:
     io::{Read, Seek, Write},
     process::{Child, Command, ExitStatus, Stdio},
     sync::{
+        Arc, Condvar, Mutex, MutexGuard,
         mpsc::{
-            channel, sync_channel, Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError,
+            Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError, channel, sync_channel,
         },
-        Arc, Condvar, Mutex, MutexGuard,
     },
-    thread::{sleep, spawn, JoinHandle},
+    thread::{JoinHandle, sleep, spawn},
     time::{Duration, Instant},
 };
 
Diff in /workspace/src/src/timeoutcmd.rs:705:
     }
 
     #[test]
-    fn sleep_for_too_long_while_reading_with_realtimelines(
-    ) -> Result<(), Box<dyn std::error::Error>> {
+    fn sleep_for_too_long_while_reading_with_realtimelines()
+    -> Result<(), Box<dyn std::error::Error>> {
         let (running, mut stdout) = setup("exec sleep 1000", SHORT_TIMEOUT, None)?;
         while stdout.line().is_some() {}
         let result = running.wait();
Diff in /workspace/src/src/util.rs:8:
 
 use tempfile::NamedTempFile;
 use time::{
-    format_description::{well_known::Rfc2822, FormatItem},
+    OffsetDateTime, PrimitiveDateTime,
+    format_description::{FormatItem, well_known::Rfc2822},
     macros::format_description,
     parsing::Parsable,
-    OffsetDateTime, PrimitiveDateTime,
 };
 
 use radicle::{
Diff in /workspace/src/src/util.rs:18:
+    Profile, Storage,
     cob::ObjectId,
     git::Oid,
     prelude::{NodeId, RepoId},
Diff in /workspace/src/src/util.rs:21:
     storage::ReadStorage,
-    Profile, Storage,
 };
 
 pub fn lookup_repo(profile: &Profile, wanted: &str) -> Result<(RepoId, String), UtilError> {
Diff in /workspace/src/src/worker.rs:4:
 //! are implemented and used, as well as logging. A worker thread does
 //! what it does. The abstraction is not meant to constrain that.
 
-use std::thread::{spawn, JoinHandle};
+use std::thread::{JoinHandle, spawn};
 
 /// Start a new thread. Caller must catch the thread handle and
 /// join it to wait for thread to end.
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
[2025-10-10T05:57:00Z ERROR ambient_ci::plan] caused by: command failed: "cargo": exit code 1
ERROR: failed to execute cargo
caused by: command failed: "cargo": exit code 1
EXIT CODE: 1
[2025-10-10T05:57:03Z INFO  ambient] ambient ends successfully

Trigger message

{
  "request": "trigger",
  "version": 1,
  "event_type": "patch",
  "repository": {
    "id": "rad:zwTxygwuz5LDGBq255RA2CbNGrz8",
    "name": "radicle-ci-broker",
    "description": "Radicle CI broker",
    "private": false,
    "default_branch": "main",
    "delegates": [
      "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
      "did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT"
    ]
  },
  "action": "Created",
  "patch": {
    "id": "ec247266bdb98d0b4ca2093188d97a9389f3c635",
    "author": {
      "id": "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
      "alias": "liw"
    },
    "title": "refactor(src/queueproc.rs): simplify thread structure",
    "state": {
      "status": "open",
      "conflicts": []
    },
    "before": "5379b676d52127a5c828eb488fb4e67d5f382850",
    "after": "dd9347b8acdce0022f0d8eb6378de849ba830834",
    "commits": [
      "dd9347b8acdce0022f0d8eb6378de849ba830834"
    ],
    "target": "5379b676d52127a5c828eb488fb4e67d5f382850",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "ec247266bdb98d0b4ca2093188d97a9389f3c635",
        "author": {
          "id": "did:key:z6MkgEMYod7Hxfy9qCvDv5hYHkZ4ciWmLFgfvm3Wn1b2w2FV",
          "alias": "liw"
        },
        "description": "Change the queue processing to spawn a new thread for each new event\nto process (run adapters for).\n\nPreviously we had N long-lived threads, where N is set in the\nconfiguration setting `concurrent_adapters`. This is awkward if we\nwant to reload configuration, which is an open feature request.\n\nThe new structure is also a lot simpler, which hopefully means it'll\nbe more reliable.",
        "base": "5379b676d52127a5c828eb488fb4e67d5f382850",
        "oid": "dd9347b8acdce0022f0d8eb6378de849ba830834",
        "timestamp": 1760075796
      }
    ]
  }
}

Ambient stdout

[2025-10-10T05:56:40Z INFO  ambient] ambient starts
[2025-10-10T05:56:40Z DEBUG ambient] load default configuration file /home/_rad/.config/ambient/config.yaml if it exists
deprecated: the `cpus` field is replaced by `qemu.cpus`
deprecated: the `memory` field is replaced by `qemu.memory`
[2025-10-10T05:56:40Z DEBUG ambient] complete configuration: Config {
        tmpdir: "/home/_rad/tmp",
        image_store: "/home/_rad/ambient-images",
        projects: "/dev/null",
        state: "/home/_rad/ambient-state",
        rsync_target: None,
        rsync_target_base: None,
        rsync_target_map: None,
        dput_target: None,
        executor: Some(
            "/usr/bin/ambient-execute-plan",
        ),
        artifacts_max_size: Byte(
            1000000000,
        ),
        cache_max_size: Byte(
            30000000000,
        ),
        qemu: QemuConfig {
            cpus: 2,
            memory: Byte(
                12000000000,
            ),
            kvm_binary: "/usr/bin/kvm",
            ovmf_vars_file: "/usr/share/ovmf/OVMF.fd",
            ovmf_code_file: "/usr/share/ovmf/OVMF.fd",
        },
    }
[2025-10-10T05:56:40Z DEBUG ambient] configuration: Config {
        tmpdir: "/home/_rad/tmp",
        image_store: "/home/_rad/ambient-images",
        projects: "/dev/null",
        state: "/home/_rad/ambient-state",
        rsync_target: None,
        rsync_target_base: None,
        rsync_target_map: None,
        dput_target: None,
        executor: Some(
            "/usr/bin/ambient-execute-plan",
        ),
        artifacts_max_size: Byte(
            1000000000,
        ),
        cache_max_size: Byte(
            30000000000,
        ),
        qemu: QemuConfig {
            cpus: 2,
            memory: Byte(
                12000000000,
            ),
            kvm_binary: "/usr/bin/kvm",
            ovmf_vars_file: "/usr/share/ovmf/OVMF.fd",
            ovmf_code_file: "/usr/share/ovmf/OVMF.fd",
        },
    }
[2025-10-10T05:56:40Z DEBUG ambient_ci::project] load project state from /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/meta.yaml
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] latest commit: "5379b676d52127a5c828eb488fb4e67d5f382850"
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] is a git repository
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] git repository is clean
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] current (HEAD) commit: dd9347b8acdce0022f0d8eb6378de849ba830834
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] no dry run requested
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] forced run requested
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] run? true
[2025-10-10T05:56:40Z INFO  ambient_ci::run] project rad:zwTxygwuz5LDGBq255RA2CbNGrz8: running CI
[2025-10-10T05:56:40Z DEBUG ambient_ci::run] Executing pre-plan steps
[2025-10-10T05:56:40Z DEBUG ambient_ci::plan] RUN: Action CargoFetch {
        sourcedir: "/tmp/.tmpirAEHm/src",
    }
[2025-10-10T05:56:40Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFetch {
        sourcedir: "/tmp/.tmpirAEHm/src",
    }
[2025-10-10T05:56:40Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_HOME": "/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/dependencies",
            "CARGO_TARGET_DIR": "/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/cache",
            "PATH": "/root/.cargo/bin:/bin:/home/_rad/.radicle/bin:/home/_rad/.cargo/bin",
        },
        source_dir: "/tmp/.tmpirAEHm/src",
    }
SPAWN: argv=["cargo", "--version"]
       cwd=/tmp/.tmpirAEHm/src (exists? true)
cargo 1.90.0 (840b83a10 2025-07-30)
SPAWN: argv=["cargo", "clippy", "--version"]
       cwd=/tmp/.tmpirAEHm/src (exists? true)
clippy 0.1.90 (1159e78c47 2025-09-14)
SPAWN: argv=["rustc", "--version"]
       cwd=/tmp/.tmpirAEHm/src (exists? true)
rustc 1.90.0 (1159e78c4 2025-09-14)
SPAWN: argv=["cargo", "fetch"]
       cwd=/tmp/.tmpirAEHm/src (exists? true)
[2025-10-10T05:56:41Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-10T05:56:41Z DEBUG ambient_ci::plan] All actions were performed successfully
[2025-10-10T05:56:41Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/src.tar
[2025-10-10T05:56:41Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/deps.tar
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create_executor_vdrive: executor="/usr/bin/ambient-execute-plan"
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create_executor_vdrive: plan=RunnablePlan {
        steps: [
            Mkdir {
                pathname: "/workspace",
            },
            Mkdir {
                pathname: "/workspace/artifacts",
            },
            TarExtract {
                archive: "/dev/vdc",
                directory: "/workspace/src",
            },
            TarExtract {
                archive: "/dev/vdf",
                directory: "/workspace/deps",
            },
            TarExtract {
                archive: "/dev/vde",
                directory: "/workspace/cache",
            },
            Spawn {
                argv: [
                    "find",
                    "/workspace",
                    "-maxdepth",
                    "2",
                    "-ls",
                ],
            },
            CargoFmt,
            CargoClippy,
            Shell {
                shell: "export CARGO_TARGET_DIR=/workspace/cache\nexport CARGO_HOME=/workspace/deps\nexport HOME=/root\nexport PATH=\"/root/.cargo/bin:/root/.radicle/bin:$PATH\"\n\n# Check that `rad` is there.\nrad --help >/dev/null || (echo rad is not there; exit 1)\n\ncargo doc --workspace --no-deps\n\n# FIXME: We can't run upgrade tests from older versions because\n# Ambient only fetches dependencies for the current version.\n# Thus, we can't build the old versions. This is an Ambient\n# problem that we can't fix here. So we skip the upgrade tests.\ncargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2\n\nsubplot docgen ci-broker.subplot -o doc/ci-broker.html\nsubplot docgen doc/userguide.subplot -o doc/userguide.html\nmake -C doc\ncp doc/*.html /workspace/artifacts/.\n",
            },
            Custom(
                Custom {
                    name: "dch",
                    args: {
                        "debemail": String("liw@liw.fi"),
                        "debfullname": String("Lars Wirzenius"),
                    },
                },
            ),
            Deb,
            TarCreate {
                archive: "/dev/vde",
                directory: "/workspace/cache",
            },
            TarCreate {
                archive: "/dev/vdd",
                directory: "/workspace/artifacts",
            },
        ],
        executor_drive: Some(
            "/dev/vdb",
        ),
        source_drive: Some(
            "/dev/vdc",
        ),
        artifact_drive: Some(
            "/dev/vdd",
        ),
        cache_drive: Some(
            "/dev/vde",
        ),
        deps_drive: Some(
            "/dev/vdf",
        ),
        workspace_dir: Some(
            "/workspace",
        ),
        source_dir: Some(
            "/workspace/src",
        ),
        deps_dir: Some(
            "/workspace/deps",
        ),
        cache_dir: Some(
            "/workspace/cache",
        ),
        artifacts_dir: Some(
            "/workspace/artifacts",
        ),
    }
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] executor bin /usr/bin/ambient-execute-plan
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] copying /usr/bin/ambient-execute-plan to /home/_rad/tmp/.tmpC1780l/ambient-execute-plan/run-ci
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] copy OK: true
[2025-10-10T05:56:42Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpC1780l/executor.tar
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] removing run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] statedir is /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8, exists? true
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] creating run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::project] created run log file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log OK
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_hostname called: "ambient"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "echo xyzzy > /dev/ttyS1"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n        echo \"EXIT CODE: 0\"\nelse\n        echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] with_runcmd called: "poweroff"
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] LocalDataStoreBuilder: LocalDataStoreBuilder {
        hostname: Some(
            "ambient",
        ),
        network: false,
        bootcmd: [],
        runcmd: [
            "echo xyzzy > /dev/ttyS1",
            "\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n        echo \"EXIT CODE: 0\"\nelse\n        echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n",
            "poweroff",
        ],
    }
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] run QEMU
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] create copy-on-write image and UEFI vars file
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu_utils] qemu-img create /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vm.qcow2 backing on /home/_rad/ambient.qcow2
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] create cloud-init ISO file
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] LocalDataStore: LocalDataStore {
        hostname: "ambient",
        network: false,
        bootcmd: [],
        runcmd: [
            "echo xyzzy > /dev/ttyS1",
            "\n(set -xeu\nenv\ndir=\"$(mktemp -d)\"\ncd \"$dir\"\ntar -xvf /dev/vdb\nfind -ls || true\nldd ./run-ci || true\necho ================================ BEGIN ================================\nexport RUST_BACKTRACE=1\nif ./run-ci; then\n        echo \"EXIT CODE: 0\"\nelse\n        echo \"EXIT CODE: $?\"\nfi) > /dev/ttyS1 2>&1\n",
            "poweroff",
        ],
    }
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpEsjznh/meta-data
[2025-10-10T05:56:46Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpEsjznh/user-data
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] set console log file to /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::util] create file /home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] set run file to /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::util] create file /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log
[2025-10-10T05:56:46Z DEBUG ambient_ci::qemu] run QEMU: QemuArgs {
        args: [
            "-m",
            "11444",
            "-smp",
            "cpus=2",
            "-cpu",
            "kvm64",
            "-machine",
            "type=q35,accel=kvm,usb=off",
            "-uuid",
            "a85c9de7-edc0-4e54-bead-112e5733582c",
            "-boot",
            "strict=on",
            "-name",
            "ambient-ci-vm",
            "-rtc",
            "base=utc,driftfix=slew",
            "-display",
            "none",
            "-device",
            "virtio-rng-pci",
            "-serial",
            "file:/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/console.log",
            "-serial",
            "file:/home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/run.log",
            "-drive",
            "if=pflash,format=raw,unit=0,file=/usr/share/ovmf/OVMF.fd,readonly=on",
            "-drive",
            "if=pflash,format=raw,unit=1,file=/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vars.fd",
            "-drive",
            "format=qcow2,if=virtio,file=/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/vm.qcow2",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/executor.tar,readonly=on",
            "-cdrom",
            "/home/_rad/tmp/.tmpWBMrQy/.tmpKHh12m/cloud_init.iso",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/src.tar,readonly=on",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/artifacts.tar",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/cache.tar",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpC1780l/deps.tar,readonly=on",
            "-nodefaults",
            "-no-user-config",
        ],
    }
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] QEMU finished OK
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] run log:
    --------------------==========
    [2025-10-10T05:56:48Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-10T05:56:48Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-10T05:56:48Z INFO  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-10T05:56:48Z WARN  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-10T05:56:48Z ERROR ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    RunnablePlan::from_file: filename=plan.yaml
    steps:
    - action: mkdir
      pathname: /workspace
    - action: mkdir
      pathname: /workspace/artifacts
    - action: tar_extract
      archive: /dev/vdc
      directory: /workspace/src
    - action: tar_extract
      archive: /dev/vdf
      directory: /workspace/deps
    - action: tar_extract
      archive: /dev/vde
      directory: /workspace/cache
    - action: spawn
      argv:
      - find
      - /workspace
      - -maxdepth
      - '2'
      - -ls
    - action: cargo_fmt
    - action: cargo_clippy
    - action: shell
      shell: |
        export CARGO_TARGET_DIR=/workspace/cache
        export CARGO_HOME=/workspace/deps
        export HOME=/root
        export PATH="/root/.cargo/bin:/root/.radicle/bin:$PATH"
    
        # Check that `rad` is there.
        rad --help >/dev/null || (echo rad is not there; exit 1)
    
        cargo doc --workspace --no-deps
    
        # FIXME: We can't run upgrade tests from older versions because
        # Ambient only fetches dependencies for the current version.
        # Thus, we can't build the old versions. This is an Ambient
        # problem that we can't fix here. So we skip the upgrade tests.
        cargo test --workspace --no-fail-fast -- --skip upgrade --test-threads 2
    
        subplot docgen ci-broker.subplot -o doc/ci-broker.html
        subplot docgen doc/userguide.subplot -o doc/userguide.html
        make -C doc
        cp doc/*.html /workspace/artifacts/.
    - action: custom
      name: dch
      args:
        debemail: liw@liw.fi
        debfullname: Lars Wirzenius
    - action: deb
    - action: tar_create
      archive: /dev/vde
      directory: /workspace/cache
    - action: tar_create
      archive: /dev/vdd
      directory: /workspace/artifacts
    executor_drive: /dev/vdb
    source_drive: /dev/vdc
    artifact_drive: /dev/vdd
    cache_drive: /dev/vde
    deps_drive: /dev/vdf
    workspace_dir: /workspace
    source_dir: /workspace/src
    deps_dir: /workspace/deps
    cache_dir: /workspace/cache
    artifacts_dir: /workspace/artifacts
    
    
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
            pathname: "/workspace",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
            pathname: "/workspace",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
            pathname: "/workspace/artifacts",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
            pathname: "/workspace/artifacts",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vdc",
            directory: "/workspace/src",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vdc",
            directory: "/workspace/src",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
    [2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:48Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vdf",
            directory: "/workspace/deps",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vdf",
            directory: "/workspace/deps",
        }
    [2025-10-10T05:56:48Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-10T05:56:48Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
    [2025-10-10T05:56:50Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:50Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vde",
            directory: "/workspace/cache",
        }
    [2025-10-10T05:56:50Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vde",
            directory: "/workspace/cache",
        }
    [2025-10-10T05:56:51Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-10T05:56:51Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
    [2025-10-10T05:56:59Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action Spawn {
            argv: [
                "find",
                "/workspace",
                "-maxdepth",
                "2",
                "-ls",
            ],
        }
    [2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
            argv: [
                "find",
                "/workspace",
                "-maxdepth",
                "2",
                "-ls",
            ],
        }
    [2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    SPAWN: argv=["find", "/workspace", "-maxdepth", "2", "-ls"]
           cwd=/workspace/src (exists? true)
      5242881      4 drwxr-xr-x   6 root     root         4096 Oct 10 05:56 /workspace
      5242882      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/artifacts
      5243191      4 drwxr-xr-x   3 root     root         4096 Oct 10 05:56 /workspace/deps
      5243192      4 drwxr-xr-x   5 root     root         4096 Sep 10 13:33 /workspace/deps/registry
      5271461      0 -rw-r--r--   1 root     root            0 Sep 10 13:33 /workspace/deps/.package-cache-mutate
      5271460    120 -rw-r--r--   1 root     root       122880 Oct 10 05:56 /workspace/deps/.global-cache
      5271462      0 -rw-r--r--   1 root     root            0 Sep 10 13:33 /workspace/deps/.package-cache
      5271463      4 drwxr-xr-x   6 root     root         4096 Sep 20 06:05 /workspace/cache
      5276158      4 -rw-r--r--   1 root     root          218 Sep 20 05:56 /workspace/cache/.rustdoc_fingerprint.json
      5271464      4 -rw-r--r--   1 root     root         1038 Oct 10 05:56 /workspace/cache/.rustc_info.json
      5276159      4 drwxr-xr-x   7 root     root         4096 Oct  8 05:48 /workspace/cache/debug
      5271465      4 drwxr-xr-x   7 root     root         4096 Oct  8 05:49 /workspace/cache/release
      5276157      4 drwxr-xr-x   2 root     root         4096 Sep 20 05:52 /workspace/cache/tmp
      5275606      4 drwxr-xr-x  12 root     root         4096 Oct  8 05:45 /workspace/cache/doc
      5242883      4 drwxr-xr-x  10 root     root         4096 Oct 10 05:56 /workspace/src
      5242978      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.cargo
      5242959      4 -rw-r--r--   1 root     root          386 Oct 10 05:56 /workspace/src/cibtool.1
      5242981      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.ambient
      5242970      4 -rw-r--r--   1 root     root         1079 Oct 10 05:56 /workspace/src/LICENSE-MIT
      5242976      4 -rw-r--r--   1 root     root           44 Oct 10 05:56 /workspace/src/.gitignore
      5242971     12 -rw-r--r--   1 root     root         9723 Oct 10 05:56 /workspace/src/LICENSE-APACHE
      5242888      4 -rw-r--r--   1 root     root          469 Oct 10 05:56 /workspace/src/test.yaml
      5242947      4 drwxr-xr-x   3 root     root         4096 Oct 10 05:56 /workspace/src/debian
      5242983      4 drwxr-xr-x   8 root     root         4096 Oct 10 05:56 /workspace/src/.git
      5242960      4 -rw-r--r--   1 root     root          440 Oct 10 05:56 /workspace/src/cib.1
      5242934      8 -rw-r--r--   1 root     root         5951 Oct 10 05:56 /workspace/src/flake.nix
      5242966      4 -rw-r--r--   1 root     root         2245 Oct 10 05:56 /workspace/src/RELEASE.md
      5242964   2932 -rw-r--r--   1 root     root      3002368 Oct 10 05:56 /workspace/src/ci-broker.db
      5242885      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/tests
      5242974      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/.radicle
      5242968     40 -rw-r--r--   1 root     root        37786 Oct 10 05:56 /workspace/src/NEWS.md
      5242884      4 -rw-r--r--   1 root     root         1716 Oct 10 05:56 /workspace/src/Cargo.toml
      5242961      4 -rw-r--r--   1 root     root          732 Oct 10 05:56 /workspace/src/ci-broker.yaml
      5242969      4 -rw-r--r--   1 root     root          334 Oct 10 05:56 /workspace/src/Makefile
      5242967      8 -rw-r--r--   1 root     root         4796 Oct 10 05:56 /workspace/src/README.md
      5242963     92 -rw-r--r--   1 root     root        92634 Oct 10 05:56 /workspace/src/ci-broker.md
      5242965      4 -rw-r--r--   1 root     root          802 Oct 10 05:56 /workspace/src/build.rs
      5242977      4 -rw-r--r--   1 root     root           10 Oct 10 05:56 /workspace/src/.envrc
      5242973      4 -rw-r--r--   1 root     root         1188 Oct 10 05:56 /workspace/src/CONTRIBUTING.md
      5242972    100 -rw-r--r--   1 root     root        98580 Oct 10 05:56 /workspace/src/Cargo.lock
      5242962      4 -rw-r--r--   1 root     root          257 Oct 10 05:56 /workspace/src/ci-broker.subplot
      5242936      4 drwxr-xr-x   2 root     root         4096 Oct 10 05:56 /workspace/src/doc
      5242935      8 -rw-r--r--   1 root     root         6528 Oct 10 05:56 /workspace/src/flake.lock
      5242887      4 -rw-r--r--   1 root     root          905 Oct 10 05:56 /workspace/src/test2.yaml
      5242889      4 drwxr-xr-x   4 root     root         4096 Oct 10 05:56 /workspace/src/src
    [2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-10T05:56:59Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
    [2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
    [2025-10-10T05:56:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            },
            source_dir: "/workspace/src",
        }
    SPAWN: argv=["cargo", "--version"]
           cwd=/workspace/src (exists? true)
    cargo 1.90.0 (840b83a10 2025-07-30)
    SPAWN: argv=["cargo", "clippy", "--version"]
           cwd=/workspace/src (exists? true)
    clippy 0.1.90 (1159e78c47 2025-09-14)
    SPAWN: argv=["rustc", "--version"]
           cwd=/workspace/src (exists? true)
    rustc 1.90.0 (1159e78c4 2025-09-14)
    SPAWN: argv=["cargo", "fmt", "--check"]
           cwd=/workspace/src (exists? true)
    Diff in /workspace/src/src/bin/cibtool.rs:18:
     
     use clap::Parser;
     
    -use radicle::{git::Oid, prelude::NodeId, Profile};
    +use radicle::{Profile, git::Oid, prelude::NodeId};
     
     use radicle_ci_broker::{
         broker::BrokerError,
    Diff in /workspace/src/src/bin/cibtool.rs:335:
         #[error("when adding a branch-update event, the --base option is required")]
         BaseRequired,
     
    -    #[error(
    -        "when adding a patch-create or patch--update event, the --patch-id option is required"
    -    )]
    +    #[error("when adding a patch-create or patch--update event, the --patch-id option is required")]
         PatchIdRequired,
     
         #[error("failed to construct a CI event")]
    Diff in /workspace/src/src/bin/cibtoolcmd/log.rs:1:
     use std::{
         convert::TryFrom,
    -    fs::{read, File},
    +    fs::{File, read},
         io::{Read, Write},
         path::{Path, PathBuf},
     };
    Diff in /workspace/src/src/bin/synthetic-events.rs:7:
     
     use std::{
         env::current_exe,
    -    fs::{read, remove_file, File, OpenOptions},
    +    fs::{File, OpenOptions, read, remove_file},
         io::{Read, Write},
         net::Shutdown,
         os::unix::net::{UnixListener, UnixStream},
    Diff in /workspace/src/src/adapter.rs:17:
     };
     
     use serde::Serialize;
    -use tempfile::{tempdir, TempDir};
    +use tempfile::{TempDir, tempdir};
     use url::Url;
     
     use crate::{
    Diff in /workspace/src/src/adapter.rs:454:
     mod test {
         use std::{fs::write, io::ErrorKind, path::PathBuf, time::Duration};
     
    -    use tempfile::{tempdir, NamedTempFile, TempDir};
    +    use tempfile::{NamedTempFile, TempDir, tempdir};
     
         use radicle::git::Oid;
         use radicle::prelude::RepoId;
    Diff in /workspace/src/src/adapter.rs:465:
             msg::{MessageError, Response, RunId, RunResult},
             notif::NotificationChannel,
             run::{RunBuilder, Whence},
    -        test::{mock_adapter, trigger_request, TestResult},
    +        test::{TestResult, mock_adapter, trigger_request},
         };
     
         const MAX: Duration = Duration::from_secs(10);
    Diff in /workspace/src/src/broker.rs:8:
         time::Duration,
     };
     
    -use time::{macros::format_description, OffsetDateTime};
    -use tracing::{span, Level};
    +use time::{OffsetDateTime, macros::format_description};
    +use tracing::{Level, span};
     
     use radicle::prelude::RepoId;
     
    Diff in /workspace/src/src/broker.rs:205:
             msg::{RunId, RunResult},
             notif::NotificationChannel,
             run::RunState,
    -        test::{mock_adapter, trigger_request, TestResult},
    +        test::{TestResult, mock_adapter, trigger_request},
         };
     
         fn broker(filename: &Path) -> anyhow::Result<Broker> {
    Diff in /workspace/src/src/ci_event.rs:12:
         storage::RefUpdate,
     };
     
    -use crate::refs::{ref_string, GenericRefName, TagName};
    +use crate::refs::{GenericRefName, TagName, ref_string};
     
     #[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
     #[non_exhaustive]
    Diff in /workspace/src/src/ci_event.rs:423:
         const MAIN_BRANCH_REF_NAME: &str =
             "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/main";
     
    -    const PATCH_REF_NAME: &str =
    -        "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
    +    const PATCH_REF_NAME: &str = "refs/namespaces/z6MkiB8T5cBEQHnrs2MgjMVqvpSVj42X81HjKfFi2XBoMbtr/refs/heads/patches/f9fa90725474de9002be503ae3cda4670c9a174";
         const PATCH_ID: &str = "f9fa90725474de9002be503ae3cda4670c9a174";
     
         fn nid() -> NodeId {
    Diff in /workspace/src/src/cob.rs:13:
     use radicle::{
         git::Oid,
         node::{
    -        sync::{Announcer, AnnouncerConfig, ReplicationFactor},
             Handle, Node,
    +        sync::{Announcer, AnnouncerConfig, ReplicationFactor},
         },
         prelude::{Profile, ReadStorage, RepoId},
         storage::git::Repository,
    Diff in /workspace/src/src/db.rs:18:
     
     use serde::{Deserialize, Serialize};
     use sqlite::{Connection, State, Statement};
    -use time::{macros::format_description, OffsetDateTime};
    +use time::{OffsetDateTime, macros::format_description};
     use uuid::Uuid;
     
     use crate::{ci_event::CiEvent, msg::RunId, run::Run};
    Diff in /workspace/src/src/ergo.rs:8:
     use std::str::FromStr;
     
     use radicle::{
    -    cob::patch::{cache::Patches, Patch, PatchId},
    +    cob::patch::{Patch, PatchId, cache::Patches},
         git::Oid,
         identity::{Project, RepoId},
         profile::Profile,
    Diff in /workspace/src/src/ergo.rs:15:
    -    storage::{git::Repository, ReadStorage, RepositoryInfo},
    +    storage::{ReadStorage, RepositoryInfo, git::Repository},
     };
     
     /// A Radicle node.
    Diff in /workspace/src/src/filter.rs:5:
     
     use radicle::{
         cob::patch::PatchId,
    -    git::{raw::ObjectType, BranchName, Oid},
    +    git::{BranchName, Oid, raw::ObjectType},
         node::NodeId,
         prelude::{Profile, RepoId},
         storage::git::Repository,
    Diff in /workspace/src/src/filter.rs:418:
         use qcheck_macros::quickcheck;
         use radicle::prelude::{Did, RepoId};
     
    -    use crate::refs::{branch_from_str, TagName};
    +    use crate::refs::{TagName, branch_from_str};
     
         use super::*;
     
    Diff in /workspace/src/src/logger.rs:4:
     
     use clap::ValueEnum;
     use serde_json::Value;
    -use tracing::{debug, error, info, trace, warn, Level};
    -use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
    +use tracing::{Level, debug, error, info, trace, warn};
    +use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
     use uuid::Uuid;
     
     use radicle::{git::Oid, identity::RepoId, node::Event, patch::PatchId};
    Diff in /workspace/src/src/msg.rs:20:
     use serde_json::Value;
     use uuid::Uuid;
     
    -pub use radicle::{
    -    cob::patch::PatchId,
    -    git::Oid,
    -    prelude::{NodeId, RepoId},
    -};
     use radicle::{
    +    Profile,
         identity::Did,
         node::{Alias, AliasStore},
         patch::{self, RevisionId},
    Diff in /workspace/src/src/msg.rs:32:
    -    storage::{git::paths, ReadRepository, ReadStorage},
    -    Profile,
    +    storage::{ReadRepository, ReadStorage, git::paths},
     };
    +pub use radicle::{
    +    cob::patch::PatchId,
    +    git::Oid,
    +    prelude::{NodeId, RepoId},
    +};
     
     use crate::{
         ci_event::{CiEvent, CiEventV1},
    Diff in /workspace/src/src/msg.rs:1266:
             process::Command,
         };
     
    -    use nonempty::{nonempty, NonEmpty};
    +    use nonempty::{NonEmpty, nonempty};
         use radicle::prelude::{Profile, RepoId};
     
    -    use time::{macros::format_description, OffsetDateTime};
    +    use time::{OffsetDateTime, macros::format_description};
     
         use super::{MessageError, Oid, Request, Response, RunId, RunResult};
     
    Diff in /workspace/src/src/node_event_source.rs:3:
     use std::{fmt, path::PathBuf, time};
     
     use radicle::{
    -    node::{Event, Handle},
         Profile,
    +    node::{Event, Handle},
     };
     
     use crate::logger;
    Diff in /workspace/src/src/notif.rs:1:
     //! Notification channel between threads.
     
     use std::{
    -    sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender},
    +    sync::mpsc::{Receiver, RecvTimeoutError, Sender, channel},
         time::Duration,
     };
     
    Diff in /workspace/src/src/pages.rs:16:
     use html_page::{Element, HtmlPage, Tag};
     use rss::{Channel, ChannelBuilder, Guid, Item, ItemBuilder};
     use serde::Serialize;
    -use time::{macros::format_description, OffsetDateTime};
    +use time::{OffsetDateTime, macros::format_description};
     
     use radicle::{
    +    Profile,
         git::Oid,
         prelude::RepoId,
         storage::{ReadRepository, ReadStorage},
    Diff in /workspace/src/src/pages.rs:25:
    -    Profile,
     };
     
     use crate::{
    Diff in /workspace/src/src/sensitive.rs:17:
     
     use std::fmt;
     
    -use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
    +use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
     
     const PLACEHOLDER: &str = "<REDACTED>";
     
    Diff in /workspace/src/src/test.rs:7:
     use crate::adapter::Adapter;
     use crate::ci_event::{CiEvent, CiEventV1};
     use crate::msg::{Request, RequestBuilder};
    +use radicle::Profile;
     use radicle::crypto::ssh::Keystore;
     use radicle::crypto::test::signer::MockSigner;
     use radicle::git::RefString;
    Diff in /workspace/src/src/test.rs:13:
     use radicle::profile::{Config, Home};
     use radicle::storage::ReadRepository;
     use radicle::test::setup::Node;
    -use radicle::Profile;
     
     use tempfile::tempdir;
     
    Diff in /workspace/src/src/timeoutcmd.rs:50:
         io::{Read, Seek, Write},
         process::{Child, Command, ExitStatus, Stdio},
         sync::{
    +        Arc, Condvar, Mutex, MutexGuard,
             mpsc::{
    -            channel, sync_channel, Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError,
    +            Receiver, RecvTimeoutError, Sender, SyncSender, TryRecvError, channel, sync_channel,
             },
    -        Arc, Condvar, Mutex, MutexGuard,
         },
    -    thread::{sleep, spawn, JoinHandle},
    +    thread::{JoinHandle, sleep, spawn},
         time::{Duration, Instant},
     };
     
    Diff in /workspace/src/src/timeoutcmd.rs:705:
         }
     
         #[test]
    -    fn sleep_for_too_long_while_reading_with_realtimelines(
    -    ) -> Result<(), Box<dyn std::error::Error>> {
    +    fn sleep_for_too_long_while_reading_with_realtimelines()
    +    -> Result<(), Box<dyn std::error::Error>> {
             let (running, mut stdout) = setup("exec sleep 1000", SHORT_TIMEOUT, None)?;
             while stdout.line().is_some() {}
             let result = running.wait();
    Diff in /workspace/src/src/util.rs:8:
     
     use tempfile::NamedTempFile;
     use time::{
    -    format_description::{well_known::Rfc2822, FormatItem},
    +    OffsetDateTime, PrimitiveDateTime,
    +    format_description::{FormatItem, well_known::Rfc2822},
         macros::format_description,
         parsing::Parsable,
    -    OffsetDateTime, PrimitiveDateTime,
     };
     
     use radicle::{
    Diff in /workspace/src/src/util.rs:18:
    +    Profile, Storage,
         cob::ObjectId,
         git::Oid,
         prelude::{NodeId, RepoId},
    Diff in /workspace/src/src/util.rs:21:
         storage::ReadStorage,
    -    Profile, Storage,
     };
     
     pub fn lookup_repo(profile: &Profile, wanted: &str) -> Result<(RepoId, String), UtilError> {
    Diff in /workspace/src/src/worker.rs:4:
     //! are implemented and used, as well as logging. A worker thread does
     //! what it does. The abstraction is not meant to constrain that.
     
    -use std::thread::{spawn, JoinHandle};
    +use std::thread::{JoinHandle, spawn};
     
     /// Start a new thread. Caller must catch the thread handle and
     /// join it to wait for thread to end.
    [2025-10-10T05:57:00Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
    [2025-10-10T05:57:00Z ERROR ambient_ci::plan] caused by: command failed: "cargo": exit code 1
    ERROR: failed to execute cargo
    caused by: command failed: "cargo": exit code 1
    EXIT CODE: 1
    
    ====================
[2025-10-10T05:57:02Z DEBUG ambient_ci::qemu] QEMU: CI run under exit code 1
[2025-10-10T05:57:03Z DEBUG ambient_ci::run] CI run exit code from QEMU: 1
[2025-10-10T05:57:03Z DEBUG ambient_ci::project] write project state to /home/_rad/ambient-state/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/meta.yaml
ERROR: CI run failed inside QEMU

Ambient stderr

<empty log>