CI run for rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5

Radicle repository id rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5

Table of Contents

Run log

[2025-10-07T22:54:16Z 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
sr0     11:0    1   370K  0 rom  
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  31.9M  1 disk 
vdd    254:48   0 953.7M  0 disk 
vde    254:64   0  27.9G  0 disk 
vdf    254:80   0   1.3G  1 disk 
INFO: Extracting tar archive from /dev/vdb
drwxr-xr-x _rad/_rad         0 2025-10-07 22:53 ./
-rw-r--r-- _rad/_rad      2450 2025-10-07 22:53 ./plan.yaml
-rwxr-xr-x _rad/_rad   6369536 2025-10-07 22:53 ./run-ci
INFO: Extracted files:
  3538954      4 drwxr-xr-x   2 1000     1000         4096 Oct  7 22:53 .
  3538955      4 -rw-r--r--   1 1000     1000         2450 Oct  7 22:53 ./plan.yaml
  3538956   6224 -rwxr-xr-x   1 1000     1000      6369536 Oct  7 22:53 ./run-ci
INFO: Running run-ci from /dev/vdb
================================ BEGIN ================================
[2025-10-07T22:53:55Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-07T22:53:55Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-07T22:53:55Z INFO  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-07T22:53:55Z WARN  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
[2025-10-07T22:53:55Z 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: cargo_build
- action: cargo_test
- action: shell
  shell: |
    # Because of a (temporary) limitation in Ambient, we need to set
    # these variables manually. Once Ambient manages environment
    # variables better, these can be deleted.
    export CARGO_TARGET_DIR=/workspace/cache
    export CARGO_HOME=/workspace/deps
    export HOME=/root
    export PATH="/root/.cargo/bin:$PATH"
    export RUSTDOCFLAGS='-D warnings'

    cargo doc --workspace --no-deps
- action: shell
  shell: |
    # Because of a (temporary) limitation in Ambient, we need to set
    # these variables manually. Once Ambient manages environment
    # variables better, these can be deleted.
    export CARGO_TARGET_DIR=/workspace/cache
    export CARGO_HOME=/workspace/deps
    export HOME=/root
    export PATH="/root/.cargo/bin:$PATH"

    # These are based on debian/control.
    export DEBEMAIL=liw@liw.fi
    export DEBFULLNAME="Lars Wirzenius"

    # Clean up after tests and documentation building. The Debian
    # package building tools do not want changes outside the
    # `debian` directory, compared to what is committed to Git, from
    # which the "upstream tarball" is created.
    git reset --hard
    git clean -fdx
    git status --ignored

    # Update debian/changelog with a new version so that every run
    # creates a newer version. This avoids us having to update the
    # file manually for every CI run.
    V="$(dpkg-parsechangelog -SVersion | sed 's/-[^-]*$//')"
    T="$(date -u "+%Y%m%dT%H%M%S")"
    version="$V.ci$T-1"
    dch -v "$version" "CI build under Ambient."
    dch -r ''
- 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-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
        pathname: "/workspace",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
        pathname: "/workspace",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
        pathname: "/workspace/artifacts",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
        pathname: "/workspace/artifacts",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vdc",
        directory: "/workspace/src",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vdc",
        directory: "/workspace/src",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
[2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
[2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vdf",
        directory: "/workspace/deps",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vdf",
        directory: "/workspace/deps",
    }
[2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
[2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
[2025-10-07T22:53:59Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-07T22:53:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:53:59Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
        archive: "/dev/vde",
        directory: "/workspace/cache",
    }
[2025-10-07T22:53:59Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
        archive: "/dev/vde",
        directory: "/workspace/cache",
    }
[2025-10-07T22:53:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
[2025-10-07T22:53:59Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
[2025-10-07T22:54:11Z TRACE ambient_ci::vdrive] extraction OK
[2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action Spawn {
        argv: [
            "find",
            "/workspace",
            "-maxdepth",
            "2",
            "-ls",
        ],
    }
[2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
        argv: [
            "find",
            "/workspace",
            "-maxdepth",
            "2",
            "-ls",
        ],
    }
[2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        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  7 22:53 /workspace
  5242882      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/artifacts
  5243710      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/deps
  5243711      4 drwxr-xr-x   5 root     root         4096 Sep 10 13:40 /workspace/deps/registry
  5291324      0 -rw-r--r--   1 root     root            0 Sep 10 13:40 /workspace/deps/.package-cache-mutate
  5291323    180 -rw-r--r--   1 root     root       184320 Oct  7 22:53 /workspace/deps/.global-cache
  5291325      0 -rw-r--r--   1 root     root            0 Sep 10 13:40 /workspace/deps/.package-cache
  5374530      4 drwxr-xr-x   6 root     root         4096 Oct  7 15:12 /workspace/cache
  5384703      4 -rw-r--r--   1 root     root          218 Oct  7 15:11 /workspace/cache/.rustdoc_fingerprint.json
  5374531      4 -rw-r--r--   1 root     root         1037 Oct  7 16:42 /workspace/cache/.rustc_info.json
  5384704      4 drwxr-xr-x   7 root     root         4096 Oct  7 15:07 /workspace/cache/debug
  5374532      4 drwxr-xr-x   7 root     root         4096 Oct  7 15:17 /workspace/cache/release
  5384702      4 drwxr-xr-x   2 root     root         4096 Oct  7 15:02 /workspace/cache/tmp
  5379246      4 drwxr-xr-x  24 root     root         4096 Oct  7 15:11 /workspace/cache/doc
  5242883      4 drwxr-xr-x  12 root     root         4096 Oct  7 22:53 /workspace/src
  5243572      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.cargo
  5242925      4 drwxr-xr-x  20 root     root         4096 Oct  7 22:53 /workspace/src/crates
  5243551      4 -rw-r--r--   1 root     root         1079 Oct  7 22:53 /workspace/src/LICENSE-MIT
  5243562      4 -rw-r--r--   1 root     root          101 Oct  7 22:53 /workspace/src/.gitignore
  5243552     12 -rw-r--r--   1 root     root         9723 Oct  7 22:53 /workspace/src/LICENSE-APACHE
  5242912      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/src/debian
  5243574      4 drwxr-xr-x   8 root     root         4096 Oct  7 22:53 /workspace/src/.git
  5242893      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/scripts
  5242905      8 -rw-r--r--   1 root     root         8023 Oct  7 22:53 /workspace/src/rad.1.adoc
  5243570      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.config
  5242909     12 -rw-r--r--   1 root     root        10819 Oct  7 22:53 /workspace/src/flake.nix
  5242904      4 -rw-r--r--   1 root     root          426 Oct  7 22:53 /workspace/src/radicle-node.1.adoc
  5243558      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.radicle
  5242903      4 -rw-r--r--   1 root     root           77 Oct  7 22:53 /workspace/src/rust-toolchain.toml
  5242884      4 -rw-r--r--   1 root     root         3376 Oct  7 22:53 /workspace/src/Cargo.toml
  5242908      4 -rw-r--r--   1 root     root          571 Oct  7 22:53 /workspace/src/git-remote-rad.1.adoc
  5242906     12 -rw-r--r--   1 root     root        10975 Oct  7 22:53 /workspace/src/rad-patch.1.adoc
  5242886      4 drwxr-xr-x   5 root     root         4096 Oct  7 22:53 /workspace/src/systemd
  5243569      4 -rw-r--r--   1 root     root           30 Oct  7 22:53 /workspace/src/.dockerignore
  5243550      4 -rw-r--r--   1 root     root         3133 Oct  7 22:53 /workspace/src/README.md
  5243556     16 -rw-r--r--   1 root     root        14022 Oct  7 22:53 /workspace/src/CHANGELOG.md
  5243554      4 -rw-r--r--   1 root     root         1203 Oct  7 22:53 /workspace/src/DCO
  5243561      4 -rw-r--r--   1 root     root         1083 Oct  7 22:53 /workspace/src/.gitsigners
  5243535      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/build
  5243568      4 -rw-r--r--   1 root     root           61 Oct  7 22:53 /workspace/src/.env.seed
  5243563      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/src/.github
  5243553      8 -rw-r--r--   1 root     root         7645 Oct  7 22:53 /workspace/src/HACKING.md
  5243557      4 -rw-r--r--   1 root     root           79 Oct  7 22:53 /workspace/src/ARCHITECTURE.md
  5243548      4 -rw-r--r--   1 root     root         1623 Oct  7 22:53 /workspace/src/build.rs
  5243567      4 -rw-r--r--   1 root     root           42 Oct  7 22:53 /workspace/src/.envrc
  5242911      8 -rw-r--r--   1 root     root         5432 Oct  7 22:53 /workspace/src/deny.toml
  5243549      4 -rw-r--r--   1 root     root         2163 Oct  7 22:53 /workspace/src/VERSIONING.md
  5242907      8 -rw-r--r--   1 root     root         7144 Oct  7 22:53 /workspace/src/rad-id.1.adoc
  5243555     12 -rw-r--r--   1 root     root         9636 Oct  7 22:53 /workspace/src/CONTRIBUTING.md
  5242885    124 -rw-r--r--   1 root     root       122964 Oct  7 22:53 /workspace/src/Cargo.lock
  5242910      8 -rw-r--r--   1 root     root         5102 Oct  7 22:53 /workspace/src/flake.lock
[2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
[2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
[2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "CARGO_TARGET_DIR": "/workspace/cache",
            "CARGO_HOME": "/workspace/deps",
        },
        source_dir: "/workspace/src",
    }
SPAWN: argv=["cargo", "--version"]
       cwd=/workspace/src (exists? true)
cargo 1.88.0 (873a06493 2025-05-10)
SPAWN: argv=["cargo", "clippy", "--version"]
       cwd=/workspace/src (exists? true)
clippy 0.1.88 (6b00bc3880 2025-06-23)
SPAWN: argv=["rustc", "--version"]
       cwd=/workspace/src (exists? true)
rustc 1.88.0 (6b00bc388 2025-06-23)
SPAWN: argv=["cargo", "fmt", "--check"]
       cwd=/workspace/src (exists? true)
Diff in /workspace/src/crates/radicle/src/cob/common.rs:9:
 use serde::{Deserialize, Serialize};
 use thiserror::Error;
 
-use crate::prelude::{Did, PublicKey};
 use crate::git::Oid;
+use crate::prelude::{Did, PublicKey};
 
 /// Timestamp used for COB operations.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
Diff in /workspace/src/crates/radicle/src/cob/external.rs:92:
 use crate::cob::object::collaboration::Evaluate;
 use crate::cob::op::{Op as CobOp, OpEncodingError};
 use crate::cob::store::{Cob, CobAction};
-use crate::storage::ReadRepository;
 use crate::git::Oid;
+use crate::storage::ReadRepository;
 
 /// This prefix is used to generate the name of the command,
 /// which is executed by the helper to apply operations.
Diff in /workspace/src/crates/radicle/src/cob/identity.rs:7:
 use serde::{Deserialize, Serialize};
 use thiserror::Error;
 
+use crate::git::Oid;
 use crate::identity::doc::Doc;
 use crate::node::device::Device;
 use crate::node::NodeId;
Diff in /workspace/src/crates/radicle/src/cob/identity.rs:13:
 use crate::storage;
-use crate::git::Oid;
 use crate::{
     cob,
     cob::{
Diff in /workspace/src/crates/radicle/src/cob/issue.rs:982:
 
     use super::*;
     use crate::cob::{store::CobWithType, ActorId, Reaction};
+    use crate::git::Oid;
     use crate::issue::cache::Issues as _;
     use crate::test::arbitrary;
-    use crate::git::Oid;
     use crate::{assert_matches, test};
 
     #[test]
Diff in /workspace/src/crates/radicle/src/cob/patch.rs:2001:
     }
 
     /// Merge a patch revision.
-    pub fn merge(&mut self, revision: RevisionId, commit: crate::git::Oid) -> Result<(), store::Error> {
+    pub fn merge(
+        &mut self,
+        revision: RevisionId,
+        commit: crate::git::Oid,
+    ) -> Result<(), store::Error> {
         self.push(Action::Merge { revision, commit })
     }
 
Diff in /workspace/src/crates/radicle/src/cob/test.rs:12:
 use crate::cob::{patch, Title};
 use crate::cob::{Entry, History, Manifest, Timestamp, Version};
 use crate::crypto::Signer;
+use crate::git::Oid;
 use crate::node::device::Device;
 use crate::prelude::Did;
 use crate::profile::env;
Diff in /workspace/src/crates/radicle/src/cob/test.rs:18:
 use crate::storage::ReadRepository;
 use crate::test::arbitrary;
-use crate::git::Oid;
 
 use super::store::{Cob, CobWithType};
 use super::thread;
Diff in /workspace/src/crates/radicle/src/cob/test.rs:178:
             "nonce": fastrand::u64(..),
         }))
         .unwrap();
-        let oid = crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Blob, &data).unwrap();
+        let oid =
+            crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Blob, &data).unwrap();
         let id = oid.into();
         let author = *self.signer.public_key();
         let actions = NonEmpty::from_vec(actions).unwrap();
Diff in /workspace/src/crates/radicle/src/cob/test.rs:279:
     .to_string();
 
     let hash =
-        crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Commit, commit.as_bytes()).unwrap();
+        crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Commit, commit.as_bytes())
+            .unwrap();
 
     (data, hash.into())
 }
Diff in /workspace/src/crates/radicle/src/git/canonical/convergence.rs:1:
 use std::{fmt, ops::ControlFlow};
 
-use crate::prelude::Did;
 use crate::git::Oid;
+use crate::prelude::Did;
 
 use super::{effects, error, Object};
 
Diff in /workspace/src/crates/radicle/src/git/canonical/effects.rs:3:
 use crate::git;
 use crate::git::fmt::Qualified;
 use crate::git::raw::ErrorExt as _;
-use crate::prelude::Did;
 use crate::git::Oid;
+use crate::prelude::Did;
 
 use super::{FoundObjects, GraphAheadBehind, MergeBase, Object};
 
Diff in /workspace/src/crates/radicle/src/git/canonical/rules.rs:22:
 use crate::git;
 use crate::git::canonical;
 use crate::git::canonical::Canonical;
+use crate::git::fmt::refspec::QualifiedPattern;
 use crate::git::fmt::Qualified;
 use crate::git::fmt::{refname, RefString};
-use crate::git::fmt::refspec::QualifiedPattern;
 use crate::identity::{doc, Did};
 
 const ASTERISK: char = '*';
Diff in /workspace/src/crates/radicle/src/git/canonical/rules.rs:781:
         doc.delegates().clone()
     }
 
-    fn tag(name: RefString, head: crate::git::Oid, repo: &crate::git::raw::Repository) -> crate::git::Oid {
+    fn tag(
+        name: RefString,
+        head: crate::git::Oid,
+        repo: &crate::git::raw::Repository,
+    ) -> crate::git::Oid {
         let commit = fixtures::commit(name.as_str(), &[head], repo);
         let target = repo.find_object(commit.into(), None).unwrap();
         let tagger = repo.signature().unwrap();
Diff in /workspace/src/crates/radicle/src/git/raw.rs:1:
 //! This module re-exports selected items from the [`git2`] crate and provides
 //! an extension trait for its [`git2::Error`] type to more conveniently handle
 //! errors associated with the code [`git2::ErrorCode::NotFound`].
-//! 
+//!
 // Re-exports created by manually scanning the `heartwood` workspace on 2025-10-04.
 
 // Re-exports that are only used within this crate.
Diff in /workspace/src/crates/radicle/src/git/raw.rs:8:
 pub(crate) use git2::{
-    message_trailers_strs,
-    
-    AutotagOption, Blob,
-    Config,
-    FetchOptions,
-    FetchPrune,
-    Object,
-    RemoteCallbacks,
-    Revwalk,
-    Sort,
+    message_trailers_strs, AutotagOption, Blob, Config, FetchOptions, FetchPrune, Object,
+    RemoteCallbacks, Revwalk, Sort,
 };
 
 // Re-exports that are used by other crates in the workspace, including this crate.
Diff in /workspace/src/crates/radicle/src/git/raw.rs:22:
 pub use git2::{
-    Repository,
-    RepositoryInitOptions,
-    Error, ErrorClass, ErrorCode,
-    BranchType,
-    Commit,
+    Branch, BranchType, Commit, Direction, Error, ErrorClass, ErrorCode, FileMode, ObjectType, Oid,
+    Reference, Remote, Repository, RepositoryInitOptions, RepositoryOpenFlags, Signature, Time,
     Tree,
-    Oid,
-    Direction,
-    Reference,
-    Signature,
-    Remote,
-    ObjectType,
-    Branch,
-    RepositoryOpenFlags,
-    Time,
-    FileMode,
 };
 
 // Re-exports that are used by other crates in the workspace, but *not* this crate.
Diff in /workspace/src/crates/radicle/src/git/raw.rs:42:
 pub use git2::{
-    MergeAnalysis, MergeOptions,
-    AnnotatedCommit,
-    Diff, DiffFindOptions, DiffOptions, DiffStats,
+    AnnotatedCommit, Diff, DiffFindOptions, DiffOptions, DiffStats, MergeAnalysis, MergeOptions,
 };
 
 // Re-exports for `radicle-cli`.
Diff in /workspace/src/crates/radicle/src/git.rs:181:
 
     use radicle_cob as cob;
 
-    use super::*;
     use super::fmt::*;
+    use super::*;
 
     /// Try to get a qualified reference from a generic reference.
-    pub fn qualified_from<'a>(
-        r: &'a raw::Reference,
-    ) -> Result<(Qualified<'a>, Oid), RefError> {
+    pub fn qualified_from<'a>(r: &'a raw::Reference) -> Result<(Qualified<'a>, Oid), RefError> {
         let name = r.name().ok_or(RefError::InvalidName)?;
         let refstr = RefStr::try_from_str(name)?;
         let target = r.resolve()?.target().ok_or(RefError::NoTarget)?;
Diff in /workspace/src/crates/radicle/src/git.rs:380:
             ///
             /// `refs/namespaces/*/refs/drafts/cobs/<typename>/<object_id>`
             ///
-            pub fn cobs(typename: &cob::TypeName, object_id: &cob::ObjectId) -> refspec::PatternString {
+            pub fn cobs(
+                typename: &cob::TypeName,
+                object_id: &cob::ObjectId,
+            ) -> refspec::PatternString {
                 pattern!("refs/namespaces/*")
                     .join(refname!("refs/drafts/cobs"))
                     .join(Component::from(typename))
Diff in /workspace/src/crates/radicle/src/git.rs:742:
     Ok(())
 }
 
-pub fn init_default_branch(
-    repo: &raw::Repository,
-) -> Result<Option<String>, raw::Error> {
+pub fn init_default_branch(repo: &raw::Repository) -> Result<Option<String>, raw::Error> {
     let config = repo.config().and_then(|mut c| c.snapshot())?;
     let default_branch = config.get_str("init.defaultbranch")?;
     let branch = repo.find_branch(default_branch, raw::BranchType::Local)?;
Diff in /workspace/src/crates/radicle/src/identity/doc.rs:1154:
         let remote = arbitrary::gen::<RemoteId>(1);
         let proj = arbitrary::gen::<RepoId>(1);
         let repo = storage.create(proj).unwrap();
-        let oid = crate::git::raw::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap();
+        let oid =
+            crate::git::raw::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap();
 
         let err = repo.identity_head_of(&remote).unwrap_err();
         {
Diff in /workspace/src/crates/radicle/src/identity/project.rs:7:
 use thiserror::Error;
 
 use crate::crypto;
+use crate::git::BranchName;
 use crate::identity::doc;
 use crate::identity::doc::Payload;
-use crate::git::BranchName;
 
 pub use crypto::PublicKey;
 
Diff in /workspace/src/crates/radicle/src/lib.rs:42:
     use super::*;
 
     pub use crypto::{PublicKey, Verified};
+    pub use git::BranchName;
     pub use identity::{project::Project, Did, Doc, RawDoc, RepoId};
     pub use node::{Alias, NodeId, Timestamp};
     pub use profile::Profile;
Diff in /workspace/src/crates/radicle/src/lib.rs:48:
-    pub use git::BranchName;
-    pub use storage::{
-        ReadRepository, ReadStorage, SignRepository, WriteRepository, WriteStorage,
-    };
+    pub use storage::{ReadRepository, ReadStorage, SignRepository, WriteRepository, WriteStorage};
 }
 
Diff in /workspace/src/crates/radicle/src/node/events.rs:10:
 use crossbeam_channel as chan;
 
 use crate::git::fmt::Qualified;
+use crate::git::Oid;
 use crate::node;
 use crate::prelude::*;
 use crate::storage::{refs, RefUpdate};
Diff in /workspace/src/crates/radicle/src/node/events.rs:16:
-use crate::git::Oid;
 
 /// Maximum unconsumed events allowed per subscription.
 pub const MAX_PENDING_EVENTS: usize = 8192;
Diff in /workspace/src/crates/radicle/src/node/notifications/store.rs:11:
 
 use crate::git;
 use crate::git::fmt::RefString;
+use crate::git::Oid;
 use crate::git::RefError;
 use crate::prelude::RepoId;
 use crate::sql::transaction;
Diff in /workspace/src/crates/radicle/src/node/notifications/store.rs:17:
 use crate::storage::RefUpdate;
-use crate::git::Oid;
 
 use super::{
     Notification, NotificationId, NotificationKind, NotificationKindError, NotificationStatus,
Diff in /workspace/src/crates/radicle/src/node/refs/store.rs:7:
 use thiserror::Error;
 
 use crate::git::fmt::Qualified;
+use crate::git::Oid;
 use crate::node::Database;
 use crate::node::NodeId;
 use crate::prelude::RepoId;
Diff in /workspace/src/crates/radicle/src/node/refs/store.rs:13:
 use crate::storage;
 use crate::storage::{ReadRepository, ReadStorage, RemoteRepository, RepositoryError};
-use crate::git::Oid;
 
 #[derive(Error, Debug)]
 pub enum Error {
Diff in /workspace/src/crates/radicle/src/node/seed/store.rs:5:
 use sqlite as sql;
 use thiserror::Error;
 
+use crate::git::Oid;
 use crate::node::address;
 use crate::node::address::Store as _;
 use crate::node::NodeId;
Diff in /workspace/src/crates/radicle/src/node/seed/store.rs:11:
 use crate::node::{seed::SyncedSeed, Database, SyncedAt};
 use crate::prelude::{RepoId, Timestamp};
-use crate::git::Oid;
 
 #[derive(Error, Debug)]
 pub enum Error {
Diff in /workspace/src/crates/radicle/src/node/seed.rs:25:
 
 impl SyncedAt {
     /// Load a new [`SyncedAt`] for the given remote.
-    pub fn load<S: ReadRepository>(repo: &S, remote: RemoteId) -> Result<Self, crate::git::raw::Error> {
+    pub fn load<S: ReadRepository>(
+        repo: &S,
+        remote: RemoteId,
+    ) -> Result<Self, crate::git::raw::Error> {
         let refs = RefsAt::new(repo, remote)?;
         let oid = refs.at;
 
Diff in /workspace/src/crates/radicle/src/node/seed.rs:33:
     }
 
     /// Create a new [`SyncedAt`] given an OID, by looking up the timestamp in the repo.
-    pub fn new<S: ReadRepository>(oid: crate::git::Oid, repo: &S) -> Result<Self, crate::git::raw::Error> {
+    pub fn new<S: ReadRepository>(
+        oid: crate::git::Oid,
+        repo: &S,
+    ) -> Result<Self, crate::git::raw::Error> {
         let timestamp = repo.commit(oid)?.time();
         let timestamp = LocalTime::from_secs(timestamp.seconds() as u64);
 
Diff in /workspace/src/crates/radicle/src/storage/git/transport/local.rs:30:
         &self,
         url: &str,
         service: crate::git::raw::transport::Service,
-    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error> {
-        let url =
-            Url::from_str(url).map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
+    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error>
+    {
+        let url = Url::from_str(url)
+            .map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
         let service: &str = match service {
             crate::git::raw::transport::Service::UploadPack
             | crate::git::raw::transport::Service::UploadPackLs => "upload-pack",
Diff in /workspace/src/crates/radicle/src/storage/git/transport/remote/mock.rs:24:
         &self,
         url: &str,
         service: crate::git::raw::transport::Service,
-    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error> {
-        let url =
-            Url::from_str(url).map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
+    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error>
+    {
+        let url = Url::from_str(url)
+            .map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
         let id = thread::current().id();
         let nodes = NODES.lock().expect("lock cannot be poisoned");
         let storage = if let Some(storage) = nodes.get(&(id, url.node)) {
Diff in /workspace/src/crates/radicle/src/storage/git.rs:27:
     ReadRepository, ReadStorage, Remote, Remotes, RepositoryInfo, SetHead, SignRepository,
     WriteRepository, WriteStorage,
 };
-use crate::{git, node, git::Oid};
+use crate::{git, git::Oid, node};
 
 use crate::git::fmt::{
     refname, refspec, refspec::PatternStr, refspec::PatternString, Qualified, RefString,
Diff in /workspace/src/crates/radicle/src/storage/git.rs:542:
 
     pub fn remote_ids(
         &self,
-    ) -> Result<impl Iterator<Item = Result<RemoteId, refs::Error>> + '_, crate::git::raw::Error> {
+    ) -> Result<impl Iterator<Item = Result<RemoteId, refs::Error>> + '_, crate::git::raw::Error>
+    {
         let iter = self.backend.references_glob(SIGREFS_GLOB.as_str())?.map(
             |reference| -> Result<RemoteId, refs::Error> {
                 let r = reference?;
Diff in /workspace/src/crates/radicle/src/storage/git.rs:991:
     }
 
     pub fn parse_signatures(msg: &str) -> Result<HashMap<PublicKey, Signature>, Error> {
-        let trailers =
-            crate::git::raw::message_trailers_strs(msg).map_err(|_| Error::SignatureTrailerFormat)?;
+        let trailers = crate::git::raw::message_trailers_strs(msg)
+            .map_err(|_| Error::SignatureTrailerFormat)?;
         let mut signatures = HashMap::with_capacity(trailers.len());
 
         for (key, val) in trailers.iter() {
Diff in /workspace/src/crates/radicle/src/storage/git.rs:1102:
         let (rid, _, working, _) =
             fixtures::project(tmp.path().join("project"), &storage, &signer).unwrap();
         let stored = storage.repository(rid).unwrap();
-        let sig = crate::git::raw::Signature::now(&alice.to_string(), "anonymous@radicle.example.com")
-            .unwrap();
+        let sig =
+            crate::git::raw::Signature::now(&alice.to_string(), "anonymous@radicle.example.com")
+                .unwrap();
         let head = working.head().unwrap().peel_to_commit().unwrap();
 
         git::commit(
Diff in /workspace/src/crates/radicle/src/storage/refs.rs:14:
 
 use crate::git;
 use crate::git::raw::ErrorExt as _;
+use crate::git::Oid;
 use crate::node::device::Device;
 use crate::profile::env;
 use crate::storage;
Diff in /workspace/src/crates/radicle/src/storage/refs.rs:20:
 use crate::storage::{ReadRepository, RemoteId, RepoId, WriteRepository};
-use crate::git::Oid;
 
 pub use crate::git::refs::storage::*;
 
Diff in /workspace/src/crates/radicle/src/storage/refs.rs:386:
 }
 
 impl RefsAt {
-    pub fn new<S: ReadRepository>(repo: &S, remote: RemoteId) -> Result<Self, crate::git::raw::Error> {
+    pub fn new<S: ReadRepository>(
+        repo: &S,
+        remote: RemoteId,
+    ) -> Result<Self, crate::git::raw::Error> {
         let at = repo.reference_oid(&remote, &storage::refs::SIGREFS_BRANCH)?;
         Ok(RefsAt { remote, at })
     }
Diff in /workspace/src/crates/radicle/src/storage.rs:18:
 use crate::collections::RandomMap;
 use crate::git::canonical;
 use crate::git::fmt::{refspec::PatternString, refspec::Refspec, Qualified, RefStr, RefString};
-use crate::git::RefError;
 use crate::git::raw::ErrorExt as _;
+use crate::git::RefError;
 use crate::identity::{doc, Did, PayloadError};
 use crate::identity::{Doc, DocAt, DocError};
 use crate::identity::{Identity, RepoId};
Diff in /workspace/src/crates/radicle/src/storage.rs:30:
 
 use self::refs::{RefsAt, SignedRefs};
 use crate::git::UserInfo;
-
 
 /// Basic repository information.
 #[derive(Debug, Clone, PartialEq, Eq)]
Diff in /workspace/src/crates/radicle/src/test/fixtures.rs:161:
 }
 
 /// Create an empty commit on the current branch.
-pub fn commit(msg: &str, parents: &[crate::git::Oid], repo: &crate::git::raw::Repository) -> crate::git::Oid {
+pub fn commit(
+    msg: &str,
+    parents: &[crate::git::Oid],
+    repo: &crate::git::raw::Repository,
+) -> crate::git::Oid {
     let head = repo.head().unwrap();
     let sig = crate::git::raw::Signature::new(
         USER_NAME,
Diff in /workspace/src/crates/radicle/src/test/fixtures.rs:266:
     }
 
     /// Creates a regular repository at the given path with a couple of commits.
-    pub fn repository<P: AsRef<Path>>(path: P) -> (crate::git::raw::Repository, crate::git::raw::Oid) {
+    pub fn repository<P: AsRef<Path>>(
+        path: P,
+    ) -> (crate::git::raw::Repository, crate::git::raw::Oid) {
         let repo = crate::git::raw::Repository::init_opts(
             path,
             crate::git::raw::RepositoryInitOptions::new().external_template(false),
Diff in /workspace/src/crates/radicle-cli/src/commands/inbox.rs:6:
 
 use localtime::LocalTime;
 use radicle::cob::TypedId;
-use radicle::git::BranchName;
 use radicle::git::fmt::Qualified;
+use radicle::git::BranchName;
 use radicle::identity::Identity;
 use radicle::issue::cache::Issues as _;
 use radicle::node::notifications;
Diff in /workspace/src/crates/radicle-cli/src/commands/patch/checkout.rs:58:
     let mut spinner = term::spinner("Performing checkout...");
     let patch_branch = opts.branch(patch_id)?;
 
-    let commit = match working.find_branch(patch_branch.as_str(), radicle::git::raw::BranchType::Local)
-    {
-        Ok(branch) if opts.force => {
-            let commit = find_patch_commit(revision, stored, working)?;
-            let mut r = branch.into_reference();
-            r.set_target(commit.id(), &format!("force update '{patch_branch}'"))?;
-            commit
-        }
-        Ok(branch) => {
-            let head = branch.get().peel_to_commit()?;
-            if revision.head() != head.id() {
-                anyhow::bail!(
-                    "branch '{patch_branch}' already exists (use `--force` to overwrite)"
-                );
+    let commit =
+        match working.find_branch(patch_branch.as_str(), radicle::git::raw::BranchType::Local) {
+            Ok(branch) if opts.force => {
+                let commit = find_patch_commit(revision, stored, working)?;
+                let mut r = branch.into_reference();
+                r.set_target(commit.id(), &format!("force update '{patch_branch}'"))?;
+                commit
             }
-            head
-        }
-        Err(e) if e.is_not_found() => {
-            let commit = find_patch_commit(revision, stored, working)?;
-            // Create patch branch and switch to it.
-            working.branch(patch_branch.as_str(), &commit, true)?;
-            commit
-        }
-        Err(e) => return Err(e.into()),
-    };
+            Ok(branch) => {
+                let head = branch.get().peel_to_commit()?;
+                if revision.head() != head.id() {
+                    anyhow::bail!(
+                        "branch '{patch_branch}' already exists (use `--force` to overwrite)"
+                    );
+                }
+                head
+            }
+            Err(e) if e.is_not_found() => {
+                let commit = find_patch_commit(revision, stored, working)?;
+                // Create patch branch and switch to it.
+                working.branch(patch_branch.as_str(), &commit, true)?;
+                commit
+            }
+            Err(e) => return Err(e.into()),
+        };
 
     if opts.force {
         let mut builder = radicle::git::raw::build::CheckoutBuilder::new();
Diff in /workspace/src/crates/radicle-cli/src/commands/patch/review/builder.rs:24:
 use radicle::crypto;
 use radicle::git;
 use radicle::git::raw;
+use radicle::git::Oid;
 use radicle::node::device::Device;
 use radicle::prelude::*;
 use radicle::storage::git::{cob::DraftStore, Repository};
Diff in /workspace/src/crates/radicle-cli/src/commands/patch/review/builder.rs:30:
-use radicle::git::Oid;
 use radicle_surf::diff::*;
 use radicle_term::{Element, VStack};
 
Diff in /workspace/src/crates/radicle-cli/src/commands/patch/update.rs:1:
 use radicle::cob::patch;
 use radicle::git::raw;
+use radicle::git::Oid;
 use radicle::prelude::*;
 use radicle::storage::git::Repository;
-use radicle::git::Oid;
 
 use crate::terminal as term;
 use crate::terminal::patch::*;
Diff in /workspace/src/crates/radicle-cli/src/git.rs:20:
 
 use radicle::crypto::ssh;
 use radicle::git;
-use radicle::git::{Version, VERSION_REQUIRED};
 use radicle::git::raw;
+use radicle::git::{Version, VERSION_REQUIRED};
 use radicle::prelude::{NodeId, RepoId};
 use radicle::storage::git::transport;
 
Diff in /workspace/src/crates/radicle-cli/src/terminal/patch/common.rs:2:
 
 use radicle::git;
 use radicle::git::raw;
+use radicle::git::Oid;
 use radicle::prelude::*;
 use radicle::storage::git::Repository;
-use radicle::git::Oid;
 
 use crate::terminal as term;
 
Diff in /workspace/src/crates/radicle-fetch/src/git/repository/error.rs:1:
+use radicle::git::raw;
 use radicle::git::{
     fmt::{Namespaced, Qualified},
     Oid,
Diff in /workspace/src/crates/radicle-fetch/src/git/repository/error.rs:4:
 };
-use radicle::git::raw;
 use thiserror::Error;
 
 #[derive(Debug, Error)]
Diff in /workspace/src/crates/radicle-fetch/src/git/repository.rs:1:
 pub mod error;
 
 use either::Either;
+use radicle::git::raw;
 use radicle::git::{
     fmt::{Namespaced, Qualified},
     Oid,
Diff in /workspace/src/crates/radicle-fetch/src/git/repository.rs:7:
 };
-use radicle::git::raw;
 use radicle::storage::git::Repository;
 
 use super::refs::{Applied, Policy, RefUpdate, Update};
[2025-10-07T22:54:12Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
[2025-10-07T22:54:12Z 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-07T22:54:16Z INFO  ambient] ambient ends successfully

Trigger message

{
  "request": "trigger",
  "version": 1,
  "event_type": "patch",
  "repository": {
    "id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
    "name": "heartwood",
    "description": "Radicle Heartwood Protocol & Stack",
    "private": false,
    "default_branch": "master",
    "delegates": [
      "did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
      "did:key:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
      "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
      "did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
      "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
    ]
  },
  "action": "Updated",
  "patch": {
    "id": "1cd8044782249b95d577e0678f10eba8c6f32e35",
    "author": {
      "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
      "alias": "lorenz"
    },
    "title": "A Little Less `git2`",
    "state": {
      "status": "draft",
      "conflicts": []
    },
    "before": "2e77d5ef4df526a8453d38d6d2d735fe9ce7e423",
    "after": "7fe1584106be32b9f2c5c153bd0d6052016dd4eb",
    "commits": [
      "7fe1584106be32b9f2c5c153bd0d6052016dd4eb",
      "5b46299ae5bdd3515d1d737054d18f0597455729",
      "1c975203888e6a3d60f21bf310898922181a95fe",
      "6dfd5a3fbc74281d42e5a6171566c1b655444f84",
      "0ba5356337175ac111e012a0a8002496e54107f4",
      "8bfb20e10449312161862bcb89365691a024072d"
    ],
    "target": "2e77d5ef4df526a8453d38d6d2d735fe9ce7e423",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "1cd8044782249b95d577e0678f10eba8c6f32e35",
        "author": {
          "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
          "alias": "lorenz"
        },
        "description": "(I should write up a lengthy description…)",
        "base": "5caa7b302a7d4f247aaa7cc688a692aac4486464",
        "oid": "d0b815c1715dfd78a7aba632356513370d189eaa",
        "timestamp": 1759707360
      },
      {
        "id": "8a36f8eecf18c0e990125564da0f89bbbbb00aa6",
        "author": {
          "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
          "alias": "lorenz"
        },
        "description": "Make `git2` an *optional* dependency of `radicle-cob`, *no* dependency\n(also not transitively) of `radicle-crypto`, and refactor `radicle` to\ndepend on crates that in turn do not depend on `git2`\n*non-optionally*.\n\n### New Crates\n\n`radicle-git-metadata`, `radicle-git-ref-format`, and `radicle-oid` are\nintroduced. Refer to their documentation in the respective `lib.rs`.\n\n### Refactoring\n\nThe main offending dependency of `radicle-cob` is `radicle-git-ext`\nfrom the `radicle-git` workspace in repository\n(rad:z6cFWeWpnZNHh9rUW8phgA3b5yGt) which *non-optionally* depends on\n`git2`.\n\nSo, to achieve removal of this dependency:\n\n 1. The crate is refactored to depend on the new crates\n    `radicle-git-ref-format` `radicle-git-metadata`, and\n    `radicle-oid` introduced in the previous commits, instead of\n    `radicle-git-ext`.\n 2. Some code from the `radicle-git-ext` crate in the `radicle-git`\n    workspace in repository (rad:z6cFWeWpnZNHh9rUW8phgA3b5yGt) is\n    copied. See `crates/radicle-cob/src/backend/git/commit.rs`.\n\nThis cascades to `radicle` and its dependents.\n\n  Firstly, the there is an\n`impl Deref<Target=git2::Oid> for radicle_git_ext::Oid`. This made\nit very convenient to just deref to obtain the wrapped `git2::Oid`,\nso there are many expressions of the shape `*oid` in `radicle` and\nits dependents. However `radicle-oid` does not provide\n`impl Deref<Target=git2::Oid> for radicle_oid::Oid`, as notably,\n`Target` is an associated type, and not a type parameter, so an\nimplementation of `Deref` would tie the new `Oid` too tightly to a\nparticular implementation.\nInstead, work with `impl From<radicle_oid::Oid> for git2::Oid`\n(which can be enabled using the feature flag `radicle-oid/git2`).\nThis explains the changes from `*oid` to `oid.into()` at every\ntransition to \"`git2` land\".\n\n  Secondly, `radicle` and its dependents are refactored to also depend\non `radicle-git-ref-format` and (much less prominently)\n`radicle-git-metadata` instead of `radicle-git-ext`\nThis is to avoid pulling in `git2` via these dependencies.\n\n  Thirdly, as the re-exports in `crates/radicle/src/git.rs` change,\nthey are at the same time also cleaned up. Notably, the types from\n`radicle-git-ref-format` are re-exported under `fmt` only, not \"twice\".\nAlso, instead of re-exporting all of `git2`, the module `raw` actually\nonly provides the re-exports required to build the workspace\n(potentially breaking dependents outside the workspace, but given just\nhow many types are re-exported, this seems unlikely) and injects an\nextension trait for more ergonomic error handling. Uses of\n`radicle_git_ext::Error` are replaced with uses of the extension trait.\n\nWhile overall this obviously is very much a breaking change, these\nchanges should mostly amount to changing from `Deref` to `Into`, i.e.,\n`*oid` → `oid.into()`, importing the extension trait as necessary, and\nrewriting imports for `radicle::git::fmt`. This is indicated by the\nmostly mechanical nature of the changes to\n`crates/radicle-{cli,node,remote-helper}`.",
        "base": "2e77d5ef4df526a8453d38d6d2d735fe9ce7e423",
        "oid": "7fe1584106be32b9f2c5c153bd0d6052016dd4eb",
        "timestamp": 1759877418
      }
    ]
  }
}

Ambient stdout

[2025-10-07T22:53:44Z INFO  ambient] ambient starts
[2025-10-07T22:53:44Z 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-07T22:53:44Z 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-07T22:53:44Z 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-07T22:53:44Z DEBUG ambient_ci::project] load project state from /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/meta.yaml
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] latest commit: "2e77d5ef4df526a8453d38d6d2d735fe9ce7e423"
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] is a git repository
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] git repository is clean
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] current (HEAD) commit: 7fe1584106be32b9f2c5c153bd0d6052016dd4eb
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] no dry run requested
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] forced run requested
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] run? true
[2025-10-07T22:53:44Z INFO  ambient_ci::run] project rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5: running CI
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] Executing pre-plan steps
[2025-10-07T22:53:44Z DEBUG ambient_ci::plan] RUN: Action CargoFetch {
        sourcedir: "/tmp/.tmpli3Mah/src",
    }
[2025-10-07T22:53:44Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFetch {
        sourcedir: "/tmp/.tmpli3Mah/src",
    }
[2025-10-07T22:53:44Z DEBUG ambient_ci::action] Plan::execute: context=Context {
        envs: {
            "CARGO_HOME": "/home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/dependencies",
            "CARGO_TARGET_DIR": "/home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/cache",
            "PATH": "/root/.cargo/bin:/bin:/home/_rad/.radicle/bin:/home/_rad/.cargo/bin",
        },
        source_dir: "/tmp/.tmpli3Mah/src",
    }
SPAWN: argv=["cargo", "--version"]
       cwd=/tmp/.tmpli3Mah/src (exists? true)
cargo 1.88.0 (873a06493 2025-05-10)
SPAWN: argv=["cargo", "clippy", "--version"]
       cwd=/tmp/.tmpli3Mah/src (exists? true)
clippy 0.1.88 (6b00bc3880 2025-06-23)
SPAWN: argv=["rustc", "--version"]
       cwd=/tmp/.tmpli3Mah/src (exists? true)
rustc 1.88.0 (6b00bc388 2025-06-23)
SPAWN: argv=["cargo", "fetch"]
       cwd=/tmp/.tmpli3Mah/src (exists? true)
[2025-10-07T22:53:44Z DEBUG ambient_ci::plan] RUN: Action finished OK
[2025-10-07T22:53:44Z DEBUG ambient_ci::plan] All actions were performed successfully
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpqo8cQT/src.tar
[2025-10-07T22:53:44Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpqo8cQT/deps.tar
[2025-10-07T22:53:46Z DEBUG ambient_ci::run] create_executor_vdrive: executor="/usr/bin/ambient-execute-plan"
[2025-10-07T22:53:46Z 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,
            CargoBuild,
            CargoTest,
            Shell {
                shell: "# Because of a (temporary) limitation in Ambient, we need to set\n# these variables manually. Once Ambient manages environment\n# variables better, these can be deleted.\nexport CARGO_TARGET_DIR=/workspace/cache\nexport CARGO_HOME=/workspace/deps\nexport HOME=/root\nexport PATH=\"/root/.cargo/bin:$PATH\"\nexport RUSTDOCFLAGS='-D warnings'\n\ncargo doc --workspace --no-deps\n",
            },
            Shell {
                shell: "# Because of a (temporary) limitation in Ambient, we need to set\n# these variables manually. Once Ambient manages environment\n# variables better, these can be deleted.\nexport CARGO_TARGET_DIR=/workspace/cache\nexport CARGO_HOME=/workspace/deps\nexport HOME=/root\nexport PATH=\"/root/.cargo/bin:$PATH\"\n\n# These are based on debian/control.\nexport DEBEMAIL=liw@liw.fi\nexport DEBFULLNAME=\"Lars Wirzenius\"\n\n# Clean up after tests and documentation building. The Debian\n# package building tools do not want changes outside the\n# `debian` directory, compared to what is committed to Git, from\n# which the \"upstream tarball\" is created.\ngit reset --hard\ngit clean -fdx\ngit status --ignored\n\n# Update debian/changelog with a new version so that every run\n# creates a newer version. This avoids us having to update the\n# file manually for every CI run.\nV=\"$(dpkg-parsechangelog -SVersion | sed 's/-[^-]*$//')\"\nT=\"$(date -u \"+%Y%m%dT%H%M%S\")\"\nversion=\"$V.ci$T-1\"\ndch -v \"$version\" \"CI build under Ambient.\"\ndch -r ''\n",
            },
            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-07T22:53:46Z DEBUG ambient_ci::run] executor bin /usr/bin/ambient-execute-plan
[2025-10-07T22:53:46Z DEBUG ambient_ci::run] copying /usr/bin/ambient-execute-plan to /home/_rad/tmp/.tmpqo8cQT/ambient-execute-plan/run-ci
[2025-10-07T22:53:46Z DEBUG ambient_ci::run] copy OK: true
[2025-10-07T22:53:46Z DEBUG ambient_ci::run] create virtual drive /home/_rad/tmp/.tmpqo8cQT/executor.tar
[2025-10-07T22:53:52Z DEBUG ambient_ci::project] removing run log file /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/run.log
[2025-10-07T22:53:52Z DEBUG ambient_ci::project] statedir is /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5, exists? true
[2025-10-07T22:53:52Z DEBUG ambient_ci::project] creating run log file /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/run.log
[2025-10-07T22:53:52Z DEBUG ambient_ci::project] created run log file /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/run.log OK
[2025-10-07T22:53:52Z DEBUG ambient_ci::cloud_init] with_hostname called: "ambient"
[2025-10-07T22:53:52Z DEBUG ambient_ci::cloud_init] with_runcmd called: "echo xyzzy > /dev/ttyS1"
[2025-10-07T22:53:52Z 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-07T22:53:52Z DEBUG ambient_ci::cloud_init] with_runcmd called: "poweroff"
[2025-10-07T22:53:52Z 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-07T22:53:52Z DEBUG ambient_ci::qemu] run QEMU
[2025-10-07T22:53:52Z DEBUG ambient_ci::qemu] create copy-on-write image and UEFI vars file
[2025-10-07T22:53:52Z DEBUG ambient_ci::qemu_utils] qemu-img create /home/_rad/tmp/.tmpgV2DA9/.tmpYOkQ7f/vm.qcow2 backing on /home/_rad/ambient.qcow2
[2025-10-07T22:53:52Z DEBUG ambient_ci::qemu] create cloud-init ISO file
[2025-10-07T22:53:52Z 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-07T22:53:52Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpahnxg7/meta-data
[2025-10-07T22:53:52Z DEBUG ambient_ci::cloud_init] write /tmp/.tmpahnxg7/user-data
[2025-10-07T22:53:52Z DEBUG ambient_ci::qemu] set console log file to /home/_rad/tmp/.tmpgV2DA9/.tmpYOkQ7f/console.log
[2025-10-07T22:53:52Z DEBUG ambient_ci::util] create file /home/_rad/tmp/.tmpgV2DA9/.tmpYOkQ7f/console.log
[2025-10-07T22:53:52Z DEBUG ambient_ci::qemu] set run file to /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/run.log
[2025-10-07T22:53:52Z DEBUG ambient_ci::util] create file /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/run.log
[2025-10-07T22:53:52Z 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/.tmpgV2DA9/.tmpYOkQ7f/console.log",
            "-serial",
            "file:/home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/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/.tmpgV2DA9/.tmpYOkQ7f/vars.fd",
            "-drive",
            "format=qcow2,if=virtio,file=/home/_rad/tmp/.tmpgV2DA9/.tmpYOkQ7f/vm.qcow2",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpqo8cQT/executor.tar,readonly=on",
            "-cdrom",
            "/home/_rad/tmp/.tmpgV2DA9/.tmpYOkQ7f/cloud_init.iso",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpqo8cQT/src.tar,readonly=on",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpqo8cQT/artifacts.tar",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpqo8cQT/cache.tar",
            "-drive",
            "format=raw,if=virtio,file=/home/_rad/tmp/.tmpqo8cQT/deps.tar,readonly=on",
            "-nodefaults",
            "-no-user-config",
        ],
    }
[2025-10-07T22:54:14Z DEBUG ambient_ci::qemu] QEMU finished OK
[2025-10-07T22:54:14Z DEBUG ambient_ci::qemu] run log:
    --------------------==========
    [2025-10-07T22:53:55Z TRACE ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-07T22:53:55Z DEBUG ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-07T22:53:55Z INFO  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-07T22:53:55Z WARN  ambient_execute_plan] ambient-execute-plan version 0.8.0@735cb79 starts
    [2025-10-07T22:53:55Z 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: cargo_build
    - action: cargo_test
    - action: shell
      shell: |
        # Because of a (temporary) limitation in Ambient, we need to set
        # these variables manually. Once Ambient manages environment
        # variables better, these can be deleted.
        export CARGO_TARGET_DIR=/workspace/cache
        export CARGO_HOME=/workspace/deps
        export HOME=/root
        export PATH="/root/.cargo/bin:$PATH"
        export RUSTDOCFLAGS='-D warnings'
    
        cargo doc --workspace --no-deps
    - action: shell
      shell: |
        # Because of a (temporary) limitation in Ambient, we need to set
        # these variables manually. Once Ambient manages environment
        # variables better, these can be deleted.
        export CARGO_TARGET_DIR=/workspace/cache
        export CARGO_HOME=/workspace/deps
        export HOME=/root
        export PATH="/root/.cargo/bin:$PATH"
    
        # These are based on debian/control.
        export DEBEMAIL=liw@liw.fi
        export DEBFULLNAME="Lars Wirzenius"
    
        # Clean up after tests and documentation building. The Debian
        # package building tools do not want changes outside the
        # `debian` directory, compared to what is committed to Git, from
        # which the "upstream tarball" is created.
        git reset --hard
        git clean -fdx
        git status --ignored
    
        # Update debian/changelog with a new version so that every run
        # creates a newer version. This avoids us having to update the
        # file manually for every CI run.
        V="$(dpkg-parsechangelog -SVersion | sed 's/-[^-]*$//')"
        T="$(date -u "+%Y%m%dT%H%M%S")"
        version="$V.ci$T-1"
        dch -v "$version" "CI build under Ambient."
        dch -r ''
    - 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-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
            pathname: "/workspace",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
            pathname: "/workspace",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action Mkdir {
            pathname: "/workspace/artifacts",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=Mkdir {
            pathname: "/workspace/artifacts",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vdc",
            directory: "/workspace/src",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vdc",
            directory: "/workspace/src",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extracting /dev/vdc to /workspace/src
    [2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:53:55Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vdf",
            directory: "/workspace/deps",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vdf",
            directory: "/workspace/deps",
        }
    [2025-10-07T22:53:55Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-07T22:53:55Z TRACE ambient_ci::vdrive] extracting /dev/vdf to /workspace/deps
    [2025-10-07T22:53:59Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-07T22:53:59Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:53:59Z DEBUG ambient_ci::plan] RUN: Action TarExtract {
            archive: "/dev/vde",
            directory: "/workspace/cache",
        }
    [2025-10-07T22:53:59Z DEBUG ambient_ci::action] Plan::execute: plan=TarExtract {
            archive: "/dev/vde",
            directory: "/workspace/cache",
        }
    [2025-10-07T22:53:59Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    [2025-10-07T22:53:59Z TRACE ambient_ci::vdrive] extracting /dev/vde to /workspace/cache
    [2025-10-07T22:54:11Z TRACE ambient_ci::vdrive] extraction OK
    [2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action Spawn {
            argv: [
                "find",
                "/workspace",
                "-maxdepth",
                "2",
                "-ls",
            ],
        }
    [2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: plan=Spawn {
            argv: [
                "find",
                "/workspace",
                "-maxdepth",
                "2",
                "-ls",
            ],
        }
    [2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            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  7 22:53 /workspace
      5242882      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/artifacts
      5243710      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/deps
      5243711      4 drwxr-xr-x   5 root     root         4096 Sep 10 13:40 /workspace/deps/registry
      5291324      0 -rw-r--r--   1 root     root            0 Sep 10 13:40 /workspace/deps/.package-cache-mutate
      5291323    180 -rw-r--r--   1 root     root       184320 Oct  7 22:53 /workspace/deps/.global-cache
      5291325      0 -rw-r--r--   1 root     root            0 Sep 10 13:40 /workspace/deps/.package-cache
      5374530      4 drwxr-xr-x   6 root     root         4096 Oct  7 15:12 /workspace/cache
      5384703      4 -rw-r--r--   1 root     root          218 Oct  7 15:11 /workspace/cache/.rustdoc_fingerprint.json
      5374531      4 -rw-r--r--   1 root     root         1037 Oct  7 16:42 /workspace/cache/.rustc_info.json
      5384704      4 drwxr-xr-x   7 root     root         4096 Oct  7 15:07 /workspace/cache/debug
      5374532      4 drwxr-xr-x   7 root     root         4096 Oct  7 15:17 /workspace/cache/release
      5384702      4 drwxr-xr-x   2 root     root         4096 Oct  7 15:02 /workspace/cache/tmp
      5379246      4 drwxr-xr-x  24 root     root         4096 Oct  7 15:11 /workspace/cache/doc
      5242883      4 drwxr-xr-x  12 root     root         4096 Oct  7 22:53 /workspace/src
      5243572      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.cargo
      5242925      4 drwxr-xr-x  20 root     root         4096 Oct  7 22:53 /workspace/src/crates
      5243551      4 -rw-r--r--   1 root     root         1079 Oct  7 22:53 /workspace/src/LICENSE-MIT
      5243562      4 -rw-r--r--   1 root     root          101 Oct  7 22:53 /workspace/src/.gitignore
      5243552     12 -rw-r--r--   1 root     root         9723 Oct  7 22:53 /workspace/src/LICENSE-APACHE
      5242912      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/src/debian
      5243574      4 drwxr-xr-x   8 root     root         4096 Oct  7 22:53 /workspace/src/.git
      5242893      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/scripts
      5242905      8 -rw-r--r--   1 root     root         8023 Oct  7 22:53 /workspace/src/rad.1.adoc
      5243570      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.config
      5242909     12 -rw-r--r--   1 root     root        10819 Oct  7 22:53 /workspace/src/flake.nix
      5242904      4 -rw-r--r--   1 root     root          426 Oct  7 22:53 /workspace/src/radicle-node.1.adoc
      5243558      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/.radicle
      5242903      4 -rw-r--r--   1 root     root           77 Oct  7 22:53 /workspace/src/rust-toolchain.toml
      5242884      4 -rw-r--r--   1 root     root         3376 Oct  7 22:53 /workspace/src/Cargo.toml
      5242908      4 -rw-r--r--   1 root     root          571 Oct  7 22:53 /workspace/src/git-remote-rad.1.adoc
      5242906     12 -rw-r--r--   1 root     root        10975 Oct  7 22:53 /workspace/src/rad-patch.1.adoc
      5242886      4 drwxr-xr-x   5 root     root         4096 Oct  7 22:53 /workspace/src/systemd
      5243569      4 -rw-r--r--   1 root     root           30 Oct  7 22:53 /workspace/src/.dockerignore
      5243550      4 -rw-r--r--   1 root     root         3133 Oct  7 22:53 /workspace/src/README.md
      5243556     16 -rw-r--r--   1 root     root        14022 Oct  7 22:53 /workspace/src/CHANGELOG.md
      5243554      4 -rw-r--r--   1 root     root         1203 Oct  7 22:53 /workspace/src/DCO
      5243561      4 -rw-r--r--   1 root     root         1083 Oct  7 22:53 /workspace/src/.gitsigners
      5243535      4 drwxr-xr-x   2 root     root         4096 Oct  7 22:53 /workspace/src/build
      5243568      4 -rw-r--r--   1 root     root           61 Oct  7 22:53 /workspace/src/.env.seed
      5243563      4 drwxr-xr-x   3 root     root         4096 Oct  7 22:53 /workspace/src/.github
      5243553      8 -rw-r--r--   1 root     root         7645 Oct  7 22:53 /workspace/src/HACKING.md
      5243557      4 -rw-r--r--   1 root     root           79 Oct  7 22:53 /workspace/src/ARCHITECTURE.md
      5243548      4 -rw-r--r--   1 root     root         1623 Oct  7 22:53 /workspace/src/build.rs
      5243567      4 -rw-r--r--   1 root     root           42 Oct  7 22:53 /workspace/src/.envrc
      5242911      8 -rw-r--r--   1 root     root         5432 Oct  7 22:53 /workspace/src/deny.toml
      5243549      4 -rw-r--r--   1 root     root         2163 Oct  7 22:53 /workspace/src/VERSIONING.md
      5242907      8 -rw-r--r--   1 root     root         7144 Oct  7 22:53 /workspace/src/rad-id.1.adoc
      5243555     12 -rw-r--r--   1 root     root         9636 Oct  7 22:53 /workspace/src/CONTRIBUTING.md
      5242885    124 -rw-r--r--   1 root     root       122964 Oct  7 22:53 /workspace/src/Cargo.lock
      5242910      8 -rw-r--r--   1 root     root         5102 Oct  7 22:53 /workspace/src/flake.lock
    [2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action finished OK
    [2025-10-07T22:54:11Z DEBUG ambient_ci::plan] RUN: Action CargoFmt
    [2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: plan=CargoFmt
    [2025-10-07T22:54:11Z DEBUG ambient_ci::action] Plan::execute: context=Context {
            envs: {
                "PATH": "/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CARGO_TARGET_DIR": "/workspace/cache",
                "CARGO_HOME": "/workspace/deps",
            },
            source_dir: "/workspace/src",
        }
    SPAWN: argv=["cargo", "--version"]
           cwd=/workspace/src (exists? true)
    cargo 1.88.0 (873a06493 2025-05-10)
    SPAWN: argv=["cargo", "clippy", "--version"]
           cwd=/workspace/src (exists? true)
    clippy 0.1.88 (6b00bc3880 2025-06-23)
    SPAWN: argv=["rustc", "--version"]
           cwd=/workspace/src (exists? true)
    rustc 1.88.0 (6b00bc388 2025-06-23)
    SPAWN: argv=["cargo", "fmt", "--check"]
           cwd=/workspace/src (exists? true)
    Diff in /workspace/src/crates/radicle/src/cob/common.rs:9:
     use serde::{Deserialize, Serialize};
     use thiserror::Error;
     
    -use crate::prelude::{Did, PublicKey};
     use crate::git::Oid;
    +use crate::prelude::{Did, PublicKey};
     
     /// Timestamp used for COB operations.
     #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
    Diff in /workspace/src/crates/radicle/src/cob/external.rs:92:
     use crate::cob::object::collaboration::Evaluate;
     use crate::cob::op::{Op as CobOp, OpEncodingError};
     use crate::cob::store::{Cob, CobAction};
    -use crate::storage::ReadRepository;
     use crate::git::Oid;
    +use crate::storage::ReadRepository;
     
     /// This prefix is used to generate the name of the command,
     /// which is executed by the helper to apply operations.
    Diff in /workspace/src/crates/radicle/src/cob/identity.rs:7:
     use serde::{Deserialize, Serialize};
     use thiserror::Error;
     
    +use crate::git::Oid;
     use crate::identity::doc::Doc;
     use crate::node::device::Device;
     use crate::node::NodeId;
    Diff in /workspace/src/crates/radicle/src/cob/identity.rs:13:
     use crate::storage;
    -use crate::git::Oid;
     use crate::{
         cob,
         cob::{
    Diff in /workspace/src/crates/radicle/src/cob/issue.rs:982:
     
         use super::*;
         use crate::cob::{store::CobWithType, ActorId, Reaction};
    +    use crate::git::Oid;
         use crate::issue::cache::Issues as _;
         use crate::test::arbitrary;
    -    use crate::git::Oid;
         use crate::{assert_matches, test};
     
         #[test]
    Diff in /workspace/src/crates/radicle/src/cob/patch.rs:2001:
         }
     
         /// Merge a patch revision.
    -    pub fn merge(&mut self, revision: RevisionId, commit: crate::git::Oid) -> Result<(), store::Error> {
    +    pub fn merge(
    +        &mut self,
    +        revision: RevisionId,
    +        commit: crate::git::Oid,
    +    ) -> Result<(), store::Error> {
             self.push(Action::Merge { revision, commit })
         }
     
    Diff in /workspace/src/crates/radicle/src/cob/test.rs:12:
     use crate::cob::{patch, Title};
     use crate::cob::{Entry, History, Manifest, Timestamp, Version};
     use crate::crypto::Signer;
    +use crate::git::Oid;
     use crate::node::device::Device;
     use crate::prelude::Did;
     use crate::profile::env;
    Diff in /workspace/src/crates/radicle/src/cob/test.rs:18:
     use crate::storage::ReadRepository;
     use crate::test::arbitrary;
    -use crate::git::Oid;
     
     use super::store::{Cob, CobWithType};
     use super::thread;
    Diff in /workspace/src/crates/radicle/src/cob/test.rs:178:
                 "nonce": fastrand::u64(..),
             }))
             .unwrap();
    -        let oid = crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Blob, &data).unwrap();
    +        let oid =
    +            crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Blob, &data).unwrap();
             let id = oid.into();
             let author = *self.signer.public_key();
             let actions = NonEmpty::from_vec(actions).unwrap();
    Diff in /workspace/src/crates/radicle/src/cob/test.rs:279:
         .to_string();
     
         let hash =
    -        crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Commit, commit.as_bytes()).unwrap();
    +        crate::git::raw::Oid::hash_object(crate::git::raw::ObjectType::Commit, commit.as_bytes())
    +            .unwrap();
     
         (data, hash.into())
     }
    Diff in /workspace/src/crates/radicle/src/git/canonical/convergence.rs:1:
     use std::{fmt, ops::ControlFlow};
     
    -use crate::prelude::Did;
     use crate::git::Oid;
    +use crate::prelude::Did;
     
     use super::{effects, error, Object};
     
    Diff in /workspace/src/crates/radicle/src/git/canonical/effects.rs:3:
     use crate::git;
     use crate::git::fmt::Qualified;
     use crate::git::raw::ErrorExt as _;
    -use crate::prelude::Did;
     use crate::git::Oid;
    +use crate::prelude::Did;
     
     use super::{FoundObjects, GraphAheadBehind, MergeBase, Object};
     
    Diff in /workspace/src/crates/radicle/src/git/canonical/rules.rs:22:
     use crate::git;
     use crate::git::canonical;
     use crate::git::canonical::Canonical;
    +use crate::git::fmt::refspec::QualifiedPattern;
     use crate::git::fmt::Qualified;
     use crate::git::fmt::{refname, RefString};
    -use crate::git::fmt::refspec::QualifiedPattern;
     use crate::identity::{doc, Did};
     
     const ASTERISK: char = '*';
    Diff in /workspace/src/crates/radicle/src/git/canonical/rules.rs:781:
             doc.delegates().clone()
         }
     
    -    fn tag(name: RefString, head: crate::git::Oid, repo: &crate::git::raw::Repository) -> crate::git::Oid {
    +    fn tag(
    +        name: RefString,
    +        head: crate::git::Oid,
    +        repo: &crate::git::raw::Repository,
    +    ) -> crate::git::Oid {
             let commit = fixtures::commit(name.as_str(), &[head], repo);
             let target = repo.find_object(commit.into(), None).unwrap();
             let tagger = repo.signature().unwrap();
    Diff in /workspace/src/crates/radicle/src/git/raw.rs:1:
     //! This module re-exports selected items from the [`git2`] crate and provides
     //! an extension trait for its [`git2::Error`] type to more conveniently handle
     //! errors associated with the code [`git2::ErrorCode::NotFound`].
    -//! 
    +//!
     // Re-exports created by manually scanning the `heartwood` workspace on 2025-10-04.
     
     // Re-exports that are only used within this crate.
    Diff in /workspace/src/crates/radicle/src/git/raw.rs:8:
     pub(crate) use git2::{
    -    message_trailers_strs,
    -    
    -    AutotagOption, Blob,
    -    Config,
    -    FetchOptions,
    -    FetchPrune,
    -    Object,
    -    RemoteCallbacks,
    -    Revwalk,
    -    Sort,
    +    message_trailers_strs, AutotagOption, Blob, Config, FetchOptions, FetchPrune, Object,
    +    RemoteCallbacks, Revwalk, Sort,
     };
     
     // Re-exports that are used by other crates in the workspace, including this crate.
    Diff in /workspace/src/crates/radicle/src/git/raw.rs:22:
     pub use git2::{
    -    Repository,
    -    RepositoryInitOptions,
    -    Error, ErrorClass, ErrorCode,
    -    BranchType,
    -    Commit,
    +    Branch, BranchType, Commit, Direction, Error, ErrorClass, ErrorCode, FileMode, ObjectType, Oid,
    +    Reference, Remote, Repository, RepositoryInitOptions, RepositoryOpenFlags, Signature, Time,
         Tree,
    -    Oid,
    -    Direction,
    -    Reference,
    -    Signature,
    -    Remote,
    -    ObjectType,
    -    Branch,
    -    RepositoryOpenFlags,
    -    Time,
    -    FileMode,
     };
     
     // Re-exports that are used by other crates in the workspace, but *not* this crate.
    Diff in /workspace/src/crates/radicle/src/git/raw.rs:42:
     pub use git2::{
    -    MergeAnalysis, MergeOptions,
    -    AnnotatedCommit,
    -    Diff, DiffFindOptions, DiffOptions, DiffStats,
    +    AnnotatedCommit, Diff, DiffFindOptions, DiffOptions, DiffStats, MergeAnalysis, MergeOptions,
     };
     
     // Re-exports for `radicle-cli`.
    Diff in /workspace/src/crates/radicle/src/git.rs:181:
     
         use radicle_cob as cob;
     
    -    use super::*;
         use super::fmt::*;
    +    use super::*;
     
         /// Try to get a qualified reference from a generic reference.
    -    pub fn qualified_from<'a>(
    -        r: &'a raw::Reference,
    -    ) -> Result<(Qualified<'a>, Oid), RefError> {
    +    pub fn qualified_from<'a>(r: &'a raw::Reference) -> Result<(Qualified<'a>, Oid), RefError> {
             let name = r.name().ok_or(RefError::InvalidName)?;
             let refstr = RefStr::try_from_str(name)?;
             let target = r.resolve()?.target().ok_or(RefError::NoTarget)?;
    Diff in /workspace/src/crates/radicle/src/git.rs:380:
                 ///
                 /// `refs/namespaces/*/refs/drafts/cobs/<typename>/<object_id>`
                 ///
    -            pub fn cobs(typename: &cob::TypeName, object_id: &cob::ObjectId) -> refspec::PatternString {
    +            pub fn cobs(
    +                typename: &cob::TypeName,
    +                object_id: &cob::ObjectId,
    +            ) -> refspec::PatternString {
                     pattern!("refs/namespaces/*")
                         .join(refname!("refs/drafts/cobs"))
                         .join(Component::from(typename))
    Diff in /workspace/src/crates/radicle/src/git.rs:742:
         Ok(())
     }
     
    -pub fn init_default_branch(
    -    repo: &raw::Repository,
    -) -> Result<Option<String>, raw::Error> {
    +pub fn init_default_branch(repo: &raw::Repository) -> Result<Option<String>, raw::Error> {
         let config = repo.config().and_then(|mut c| c.snapshot())?;
         let default_branch = config.get_str("init.defaultbranch")?;
         let branch = repo.find_branch(default_branch, raw::BranchType::Local)?;
    Diff in /workspace/src/crates/radicle/src/identity/doc.rs:1154:
             let remote = arbitrary::gen::<RemoteId>(1);
             let proj = arbitrary::gen::<RepoId>(1);
             let repo = storage.create(proj).unwrap();
    -        let oid = crate::git::raw::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap();
    +        let oid =
    +            crate::git::raw::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap();
     
             let err = repo.identity_head_of(&remote).unwrap_err();
             {
    Diff in /workspace/src/crates/radicle/src/identity/project.rs:7:
     use thiserror::Error;
     
     use crate::crypto;
    +use crate::git::BranchName;
     use crate::identity::doc;
     use crate::identity::doc::Payload;
    -use crate::git::BranchName;
     
     pub use crypto::PublicKey;
     
    Diff in /workspace/src/crates/radicle/src/lib.rs:42:
         use super::*;
     
         pub use crypto::{PublicKey, Verified};
    +    pub use git::BranchName;
         pub use identity::{project::Project, Did, Doc, RawDoc, RepoId};
         pub use node::{Alias, NodeId, Timestamp};
         pub use profile::Profile;
    Diff in /workspace/src/crates/radicle/src/lib.rs:48:
    -    pub use git::BranchName;
    -    pub use storage::{
    -        ReadRepository, ReadStorage, SignRepository, WriteRepository, WriteStorage,
    -    };
    +    pub use storage::{ReadRepository, ReadStorage, SignRepository, WriteRepository, WriteStorage};
     }
     
    Diff in /workspace/src/crates/radicle/src/node/events.rs:10:
     use crossbeam_channel as chan;
     
     use crate::git::fmt::Qualified;
    +use crate::git::Oid;
     use crate::node;
     use crate::prelude::*;
     use crate::storage::{refs, RefUpdate};
    Diff in /workspace/src/crates/radicle/src/node/events.rs:16:
    -use crate::git::Oid;
     
     /// Maximum unconsumed events allowed per subscription.
     pub const MAX_PENDING_EVENTS: usize = 8192;
    Diff in /workspace/src/crates/radicle/src/node/notifications/store.rs:11:
     
     use crate::git;
     use crate::git::fmt::RefString;
    +use crate::git::Oid;
     use crate::git::RefError;
     use crate::prelude::RepoId;
     use crate::sql::transaction;
    Diff in /workspace/src/crates/radicle/src/node/notifications/store.rs:17:
     use crate::storage::RefUpdate;
    -use crate::git::Oid;
     
     use super::{
         Notification, NotificationId, NotificationKind, NotificationKindError, NotificationStatus,
    Diff in /workspace/src/crates/radicle/src/node/refs/store.rs:7:
     use thiserror::Error;
     
     use crate::git::fmt::Qualified;
    +use crate::git::Oid;
     use crate::node::Database;
     use crate::node::NodeId;
     use crate::prelude::RepoId;
    Diff in /workspace/src/crates/radicle/src/node/refs/store.rs:13:
     use crate::storage;
     use crate::storage::{ReadRepository, ReadStorage, RemoteRepository, RepositoryError};
    -use crate::git::Oid;
     
     #[derive(Error, Debug)]
     pub enum Error {
    Diff in /workspace/src/crates/radicle/src/node/seed/store.rs:5:
     use sqlite as sql;
     use thiserror::Error;
     
    +use crate::git::Oid;
     use crate::node::address;
     use crate::node::address::Store as _;
     use crate::node::NodeId;
    Diff in /workspace/src/crates/radicle/src/node/seed/store.rs:11:
     use crate::node::{seed::SyncedSeed, Database, SyncedAt};
     use crate::prelude::{RepoId, Timestamp};
    -use crate::git::Oid;
     
     #[derive(Error, Debug)]
     pub enum Error {
    Diff in /workspace/src/crates/radicle/src/node/seed.rs:25:
     
     impl SyncedAt {
         /// Load a new [`SyncedAt`] for the given remote.
    -    pub fn load<S: ReadRepository>(repo: &S, remote: RemoteId) -> Result<Self, crate::git::raw::Error> {
    +    pub fn load<S: ReadRepository>(
    +        repo: &S,
    +        remote: RemoteId,
    +    ) -> Result<Self, crate::git::raw::Error> {
             let refs = RefsAt::new(repo, remote)?;
             let oid = refs.at;
     
    Diff in /workspace/src/crates/radicle/src/node/seed.rs:33:
         }
     
         /// Create a new [`SyncedAt`] given an OID, by looking up the timestamp in the repo.
    -    pub fn new<S: ReadRepository>(oid: crate::git::Oid, repo: &S) -> Result<Self, crate::git::raw::Error> {
    +    pub fn new<S: ReadRepository>(
    +        oid: crate::git::Oid,
    +        repo: &S,
    +    ) -> Result<Self, crate::git::raw::Error> {
             let timestamp = repo.commit(oid)?.time();
             let timestamp = LocalTime::from_secs(timestamp.seconds() as u64);
     
    Diff in /workspace/src/crates/radicle/src/storage/git/transport/local.rs:30:
             &self,
             url: &str,
             service: crate::git::raw::transport::Service,
    -    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error> {
    -        let url =
    -            Url::from_str(url).map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
    +    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error>
    +    {
    +        let url = Url::from_str(url)
    +            .map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
             let service: &str = match service {
                 crate::git::raw::transport::Service::UploadPack
                 | crate::git::raw::transport::Service::UploadPackLs => "upload-pack",
    Diff in /workspace/src/crates/radicle/src/storage/git/transport/remote/mock.rs:24:
             &self,
             url: &str,
             service: crate::git::raw::transport::Service,
    -    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error> {
    -        let url =
    -            Url::from_str(url).map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
    +    ) -> Result<Box<dyn crate::git::raw::transport::SmartSubtransportStream>, crate::git::raw::Error>
    +    {
    +        let url = Url::from_str(url)
    +            .map_err(|e| crate::git::raw::Error::from_str(e.to_string().as_str()))?;
             let id = thread::current().id();
             let nodes = NODES.lock().expect("lock cannot be poisoned");
             let storage = if let Some(storage) = nodes.get(&(id, url.node)) {
    Diff in /workspace/src/crates/radicle/src/storage/git.rs:27:
         ReadRepository, ReadStorage, Remote, Remotes, RepositoryInfo, SetHead, SignRepository,
         WriteRepository, WriteStorage,
     };
    -use crate::{git, node, git::Oid};
    +use crate::{git, git::Oid, node};
     
     use crate::git::fmt::{
         refname, refspec, refspec::PatternStr, refspec::PatternString, Qualified, RefString,
    Diff in /workspace/src/crates/radicle/src/storage/git.rs:542:
     
         pub fn remote_ids(
             &self,
    -    ) -> Result<impl Iterator<Item = Result<RemoteId, refs::Error>> + '_, crate::git::raw::Error> {
    +    ) -> Result<impl Iterator<Item = Result<RemoteId, refs::Error>> + '_, crate::git::raw::Error>
    +    {
             let iter = self.backend.references_glob(SIGREFS_GLOB.as_str())?.map(
                 |reference| -> Result<RemoteId, refs::Error> {
                     let r = reference?;
    Diff in /workspace/src/crates/radicle/src/storage/git.rs:991:
         }
     
         pub fn parse_signatures(msg: &str) -> Result<HashMap<PublicKey, Signature>, Error> {
    -        let trailers =
    -            crate::git::raw::message_trailers_strs(msg).map_err(|_| Error::SignatureTrailerFormat)?;
    +        let trailers = crate::git::raw::message_trailers_strs(msg)
    +            .map_err(|_| Error::SignatureTrailerFormat)?;
             let mut signatures = HashMap::with_capacity(trailers.len());
     
             for (key, val) in trailers.iter() {
    Diff in /workspace/src/crates/radicle/src/storage/git.rs:1102:
             let (rid, _, working, _) =
                 fixtures::project(tmp.path().join("project"), &storage, &signer).unwrap();
             let stored = storage.repository(rid).unwrap();
    -        let sig = crate::git::raw::Signature::now(&alice.to_string(), "anonymous@radicle.example.com")
    -            .unwrap();
    +        let sig =
    +            crate::git::raw::Signature::now(&alice.to_string(), "anonymous@radicle.example.com")
    +                .unwrap();
             let head = working.head().unwrap().peel_to_commit().unwrap();
     
             git::commit(
    Diff in /workspace/src/crates/radicle/src/storage/refs.rs:14:
     
     use crate::git;
     use crate::git::raw::ErrorExt as _;
    +use crate::git::Oid;
     use crate::node::device::Device;
     use crate::profile::env;
     use crate::storage;
    Diff in /workspace/src/crates/radicle/src/storage/refs.rs:20:
     use crate::storage::{ReadRepository, RemoteId, RepoId, WriteRepository};
    -use crate::git::Oid;
     
     pub use crate::git::refs::storage::*;
     
    Diff in /workspace/src/crates/radicle/src/storage/refs.rs:386:
     }
     
     impl RefsAt {
    -    pub fn new<S: ReadRepository>(repo: &S, remote: RemoteId) -> Result<Self, crate::git::raw::Error> {
    +    pub fn new<S: ReadRepository>(
    +        repo: &S,
    +        remote: RemoteId,
    +    ) -> Result<Self, crate::git::raw::Error> {
             let at = repo.reference_oid(&remote, &storage::refs::SIGREFS_BRANCH)?;
             Ok(RefsAt { remote, at })
         }
    Diff in /workspace/src/crates/radicle/src/storage.rs:18:
     use crate::collections::RandomMap;
     use crate::git::canonical;
     use crate::git::fmt::{refspec::PatternString, refspec::Refspec, Qualified, RefStr, RefString};
    -use crate::git::RefError;
     use crate::git::raw::ErrorExt as _;
    +use crate::git::RefError;
     use crate::identity::{doc, Did, PayloadError};
     use crate::identity::{Doc, DocAt, DocError};
     use crate::identity::{Identity, RepoId};
    Diff in /workspace/src/crates/radicle/src/storage.rs:30:
     
     use self::refs::{RefsAt, SignedRefs};
     use crate::git::UserInfo;
    -
     
     /// Basic repository information.
     #[derive(Debug, Clone, PartialEq, Eq)]
    Diff in /workspace/src/crates/radicle/src/test/fixtures.rs:161:
     }
     
     /// Create an empty commit on the current branch.
    -pub fn commit(msg: &str, parents: &[crate::git::Oid], repo: &crate::git::raw::Repository) -> crate::git::Oid {
    +pub fn commit(
    +    msg: &str,
    +    parents: &[crate::git::Oid],
    +    repo: &crate::git::raw::Repository,
    +) -> crate::git::Oid {
         let head = repo.head().unwrap();
         let sig = crate::git::raw::Signature::new(
             USER_NAME,
    Diff in /workspace/src/crates/radicle/src/test/fixtures.rs:266:
         }
     
         /// Creates a regular repository at the given path with a couple of commits.
    -    pub fn repository<P: AsRef<Path>>(path: P) -> (crate::git::raw::Repository, crate::git::raw::Oid) {
    +    pub fn repository<P: AsRef<Path>>(
    +        path: P,
    +    ) -> (crate::git::raw::Repository, crate::git::raw::Oid) {
             let repo = crate::git::raw::Repository::init_opts(
                 path,
                 crate::git::raw::RepositoryInitOptions::new().external_template(false),
    Diff in /workspace/src/crates/radicle-cli/src/commands/inbox.rs:6:
     
     use localtime::LocalTime;
     use radicle::cob::TypedId;
    -use radicle::git::BranchName;
     use radicle::git::fmt::Qualified;
    +use radicle::git::BranchName;
     use radicle::identity::Identity;
     use radicle::issue::cache::Issues as _;
     use radicle::node::notifications;
    Diff in /workspace/src/crates/radicle-cli/src/commands/patch/checkout.rs:58:
         let mut spinner = term::spinner("Performing checkout...");
         let patch_branch = opts.branch(patch_id)?;
     
    -    let commit = match working.find_branch(patch_branch.as_str(), radicle::git::raw::BranchType::Local)
    -    {
    -        Ok(branch) if opts.force => {
    -            let commit = find_patch_commit(revision, stored, working)?;
    -            let mut r = branch.into_reference();
    -            r.set_target(commit.id(), &format!("force update '{patch_branch}'"))?;
    -            commit
    -        }
    -        Ok(branch) => {
    -            let head = branch.get().peel_to_commit()?;
    -            if revision.head() != head.id() {
    -                anyhow::bail!(
    -                    "branch '{patch_branch}' already exists (use `--force` to overwrite)"
    -                );
    +    let commit =
    +        match working.find_branch(patch_branch.as_str(), radicle::git::raw::BranchType::Local) {
    +            Ok(branch) if opts.force => {
    +                let commit = find_patch_commit(revision, stored, working)?;
    +                let mut r = branch.into_reference();
    +                r.set_target(commit.id(), &format!("force update '{patch_branch}'"))?;
    +                commit
                 }
    -            head
    -        }
    -        Err(e) if e.is_not_found() => {
    -            let commit = find_patch_commit(revision, stored, working)?;
    -            // Create patch branch and switch to it.
    -            working.branch(patch_branch.as_str(), &commit, true)?;
    -            commit
    -        }
    -        Err(e) => return Err(e.into()),
    -    };
    +            Ok(branch) => {
    +                let head = branch.get().peel_to_commit()?;
    +                if revision.head() != head.id() {
    +                    anyhow::bail!(
    +                        "branch '{patch_branch}' already exists (use `--force` to overwrite)"
    +                    );
    +                }
    +                head
    +            }
    +            Err(e) if e.is_not_found() => {
    +                let commit = find_patch_commit(revision, stored, working)?;
    +                // Create patch branch and switch to it.
    +                working.branch(patch_branch.as_str(), &commit, true)?;
    +                commit
    +            }
    +            Err(e) => return Err(e.into()),
    +        };
     
         if opts.force {
             let mut builder = radicle::git::raw::build::CheckoutBuilder::new();
    Diff in /workspace/src/crates/radicle-cli/src/commands/patch/review/builder.rs:24:
     use radicle::crypto;
     use radicle::git;
     use radicle::git::raw;
    +use radicle::git::Oid;
     use radicle::node::device::Device;
     use radicle::prelude::*;
     use radicle::storage::git::{cob::DraftStore, Repository};
    Diff in /workspace/src/crates/radicle-cli/src/commands/patch/review/builder.rs:30:
    -use radicle::git::Oid;
     use radicle_surf::diff::*;
     use radicle_term::{Element, VStack};
     
    Diff in /workspace/src/crates/radicle-cli/src/commands/patch/update.rs:1:
     use radicle::cob::patch;
     use radicle::git::raw;
    +use radicle::git::Oid;
     use radicle::prelude::*;
     use radicle::storage::git::Repository;
    -use radicle::git::Oid;
     
     use crate::terminal as term;
     use crate::terminal::patch::*;
    Diff in /workspace/src/crates/radicle-cli/src/git.rs:20:
     
     use radicle::crypto::ssh;
     use radicle::git;
    -use radicle::git::{Version, VERSION_REQUIRED};
     use radicle::git::raw;
    +use radicle::git::{Version, VERSION_REQUIRED};
     use radicle::prelude::{NodeId, RepoId};
     use radicle::storage::git::transport;
     
    Diff in /workspace/src/crates/radicle-cli/src/terminal/patch/common.rs:2:
     
     use radicle::git;
     use radicle::git::raw;
    +use radicle::git::Oid;
     use radicle::prelude::*;
     use radicle::storage::git::Repository;
    -use radicle::git::Oid;
     
     use crate::terminal as term;
     
    Diff in /workspace/src/crates/radicle-fetch/src/git/repository/error.rs:1:
    +use radicle::git::raw;
     use radicle::git::{
         fmt::{Namespaced, Qualified},
         Oid,
    Diff in /workspace/src/crates/radicle-fetch/src/git/repository/error.rs:4:
     };
    -use radicle::git::raw;
     use thiserror::Error;
     
     #[derive(Debug, Error)]
    Diff in /workspace/src/crates/radicle-fetch/src/git/repository.rs:1:
     pub mod error;
     
     use either::Either;
    +use radicle::git::raw;
     use radicle::git::{
         fmt::{Namespaced, Qualified},
         Oid,
    Diff in /workspace/src/crates/radicle-fetch/src/git/repository.rs:7:
     };
    -use radicle::git::raw;
     use radicle::storage::git::Repository;
     
     use super::refs::{Applied, Policy, RefUpdate, Update};
    [2025-10-07T22:54:12Z ERROR ambient_ci::plan] ERROR: Action failed: failed to execute cargo
    [2025-10-07T22:54:12Z 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-07T22:54:14Z DEBUG ambient_ci::qemu] QEMU: CI run under exit code 1
[2025-10-07T22:54:15Z DEBUG ambient_ci::run] CI run exit code from QEMU: 1
[2025-10-07T22:54:15Z DEBUG ambient_ci::project] write project state to /home/_rad/ambient-state/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/meta.yaml
ERROR: CI run failed inside QEMU

Ambient stderr

<empty log>