CI: FAILURE radicle-artifact

Table of Contents

Run log

Plan, inside VM without network

plan: Executor starts
After 0.00 seconds at 2026-04-28 11:47:35ZProgram: ambient-execute-plan
Version: 0.14.0@c37ec71
plan: Runnable plan
After 0.00 seconds at 2026-04-28 11:47:35Z
steps:
- action: mkdir
  pathname: /ci
- action: mkdir
  pathname: /ci/artifacts
- action: tar_extract
  archive: /dev/vdc
  directory: /ci/src
- action: tar_extract
  archive: /dev/vdf
  directory: /ci/deps
- action: tar_extract
  archive: /dev/vde
  directory: /ci/cache
- action: shell
  shell: ln -sf /ci /workspace
- action: shell
  shell: git config --global user.name 'Ambient CI'
- action: shell
  shell: git config --global user.email ambient@example.com
- action: cargo_fmt
- action: cargo_clippy
- action: cargo_test
- action: tar_create
  archive: /dev/vde
  directory: /ci/cache
- action: tar_create
  archive: /dev/vdd
  directory: /ci/artifacts
executor_drive: /dev/vdb
source_drive: /dev/vdc
artifact_drive: /dev/vdd
cache_drive: /dev/vde
deps_drive: /dev/vdf
workspace_dir: /ci
source_dir: /ci/src
deps_dir: /ci/deps
cache_dir: /ci/cache
artifacts_dir: /ci/artifacts
envs: {}
plan: Successful action mkdir: /ci
After 0.02 seconds at 2026-04-28 11:47:35Z
  • plan: Start action mkdir: /ci
    After 0.00 seconds at 2026-04-28 11:47:35Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
  • plan: Action succeeded mkdir: /ci
    After 0.00 seconds at 2026-04-28 11:47:35Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
plan: Successful action mkdir: /ci/artifacts
After 0.02 seconds at 2026-04-28 11:47:35Z
  • plan: Start action mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-28 11:47:35Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
  • plan: Action succeeded mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-28 11:47:35Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
plan: Successful action tar_extract
After 0.03 seconds at 2026-04-28 11:47:35Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 11:47:35Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 11:47:35Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
plan: Successful action tar_extract
After 0.06 seconds at 2026-04-28 11:47:35Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 11:47:35Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 11:47:38Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
plan: Successful action tar_extract
After 2.77 seconds at 2026-04-28 11:47:38Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 11:47:38Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 11:47:43Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
plan: Successful action shell: ln -sf /ci /workspace
After 7.90 seconds at 2026-04-28 11:47:43Z
  • plan: Start action shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 11:47:43Z
    • bash
    • -c
    • set -xeuo pipefail ln -sf /ci /workspace
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Exit code: 0
    Stderr:
    + ln -sf /ci /workspace
    
  • plan: Action succeeded shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
plan: Successful action shell: git config --global user.name 'Ambient CI'
After 7.91 seconds at 2026-04-28 11:47:43Z
  • plan: Start action shell: git config --global user.name 'Ambient CI'
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 11:47:43Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.name 'Ambient CI'
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Exit code: 0
    Stderr:
    + git config --global user.name 'Ambient CI'
    
  • plan: Action succeeded shell: git config --global user.name 'Ambient CI'
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
plan: Successful action shell: git config --global user.email ambient@example.com
After 7.93 seconds at 2026-04-28 11:47:43Z
  • plan: Start action shell: git config --global user.email ambient@example.com
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 11:47:43Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.email ambient@example.com
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Exit code: 0
    Stderr:
    + git config --global user.email ambient@example.com
    
  • plan: Action succeeded shell: git config --global user.email ambient@example.com
    After 0.00 seconds at 2026-04-28 11:47:43Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
plan: Start action cargo_fmt
After 7.95 seconds at 2026-04-28 11:47:43Z
CargoFmt(
    CargoFmt,
)
plan: Start program cargo
After 7.95 seconds at 2026-04-28 11:47:43Z
  • cargo
  • --version
plan: Program succeeded
After 8.01 seconds at 2026-04-28 11:47:43Z
Exit code: 0
Stdout:
cargo 1.94.0 (85eff7c80 2026-01-15)
plan: Start program cargo
After 8.01 seconds at 2026-04-28 11:47:43Z
  • cargo
  • clippy
  • --version
plan: Program succeeded
After 8.12 seconds at 2026-04-28 11:47:43Z
Exit code: 0
Stdout:
clippy 0.1.94 (4a4ef493e3 2026-03-02)
plan: Start program rustc
After 8.12 seconds at 2026-04-28 11:47:43Z
  • rustc
  • --version
plan: Program succeeded
After 8.17 seconds at 2026-04-28 11:47:43Z
Exit code: 0
Stdout:
rustc 1.94.0 (4a4ef493e 2026-03-02)
plan: Start program cargo
After 8.17 seconds at 2026-04-28 11:47:43Z
  • cargo
  • fmt
  • --check
plan: ERROR: Program failed
After 8.37 seconds at 2026-04-28 11:47:43Z
Exit code: 1
Stdout:
Diff in /ci/src/src/bin/rad-artifact.rs:175:
             let signer = profile.signer().map_err(error::Signer)?;
             match loc.command {
                 LocationCommand::Add(cmd) => {
-                    location_add(
-                        cmd,
-                        args.no_input,
-                        &mut releases,
-                        &repo,
-                        &profile,
-                        &signer,
-                    )?;
+                    location_add(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;
                 }
                 LocationCommand::Remove(cmd) => {
-                    location_remove(
-                        cmd,
-                        args.no_input,
-                        &mut releases,
-                        &repo,
-                        &profile,
-                        &signer,
-                    )?;
+                    location_remove(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;
                 }
             }
             if !args.no_sync {
Diff in /ci/src/src/bin/rad-artifact.rs:201:
         }
         Command::Attest(cmd) => {
             let signer = profile.signer().map_err(error::Signer)?;
-            attest_artifact(
-                cmd,
-                args.no_input,
-                &mut releases,
-                &repo,
-                &profile,
-                &signer,
-            )?;
+            attest_artifact(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;
             if !args.no_sync {
                 announce(&profile, repo.id)?;
             }
Diff in /ci/src/src/bin/rad-artifact.rs:215:
         }
         Command::Redact(cmd) => {
             let signer = profile.signer().map_err(error::Signer)?;
-            redact_artifact(
-                cmd,
-                args.no_input,
-                &mut releases,
-                &repo,
-                &profile,
-                &signer,
-            )?;
+            redact_artifact(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;
             if !args.no_sync {
                 announce(&profile, repo.id)?;
             }
Diff in /ci/src/src/bin/rad-artifact.rs:442:
     let (id, cid) = match (release, revision, cid) {
         (Some(_), _, Some(cid)) | (_, Some(_), Some(cid)) => {
             let id = resolve_target_release(
-                release,
-                revision,
-                releases,
-                repo,
-                &delegates,
-                no_input,
-                aliases,
+                release, revision, releases, repo, &delegates, no_input, aliases,
             )?;
             (id, cid)
         }
Diff in /ci/src/src/bin/rad-artifact.rs:494:
     let (id, cid) = match (release, revision, cid) {
         (Some(_), _, Some(cid)) | (_, Some(_), Some(cid)) => {
             let id = resolve_target_release(
-                release,
-                revision,
-                releases,
-                repo,
-                &delegates,
-                no_input,
-                aliases,
+                release, revision, releases, repo, &delegates, no_input, aliases,
             )?;
             (id, cid)
         }
Diff in /ci/src/src/bin/rad-artifact.rs:604:
                 let id = parse_release_id(s, repo)?;
                 let r = releases
                     .get(&id)
-                    .map_err(|err| error::Find::LookupId { release_id: id, err })?
+                    .map_err(|err| error::Find::LookupId {
+                        release_id: id,
+                        err,
+                    })?
                     .ok_or(error::Find::NoReleaseId(id))?;
                 vec![(id, r)]
             }
Diff in /ci/src/src/bin/rad-artifact.rs:629:
         all_authors,
         local: Some(local),
     };
-    let shown =
-        display::Releases::new(candidates.into_iter(), aliases, filters, true, repo, repo);
+    let shown = display::Releases::new(candidates.into_iter(), aliases, filters, true, repo, repo);
     if use_pretty(pretty, json) {
         // Expand per-location rows on `show -v`. List intentionally
         // keeps the compact scheme summary even with -v to stay terse.
Diff in /ci/src/src/bin/rad-artifact.rs:1010:
         repo: &Repository,
         aliases: &impl AliasStore,
     ) -> Result<ReleaseId, String> {
-        select_release(candidates, None, repo, aliases)?
-            .ok_or_else(|| "no release selected".into())
+        select_release(candidates, None, repo, aliases)?.ok_or_else(|| "no release selected".into())
     }
 
     /// Show a multi-release picker. Returns `Some(id)` when the user
Diff in /ci/src/src/bin/rad-artifact.rs:1298:
                     name, commit_oid, ..
                 } => {
                     let short = &commit_oid.to_string()[..7];
-                    let title =
-                        display::CommitTitle::title(repo, commit_oid).unwrap_or_default();
+                    let title = display::CommitTitle::title(repo, commit_oid).unwrap_or_default();
                     format!("{name} -> {short}  {title}")
                 }
                 Entry::Commit { oid } => {
Diff in /ci/src/src/bin/rad-artifact.rs:1425:
             match releases.get(&id) {
                 Ok(Some(_)) => Ok(id),
                 Ok(None) => Err(error::Find::NoReleaseId(id).into()),
-                Err(err) => Err(error::Find::LookupId { release_id: id, err }.into()),
+                Err(err) => Err(error::Find::LookupId {
+                    release_id: id,
+                    err,
+                }
+                .into()),
             }
         }
         (None, Some(rev)) => {
Diff in /ci/src/src/bin/rad-artifact.rs:1453:
 /// `git revparse_single` accepts short OIDs, full OIDs, and any other
 /// ref name that points at the COB.
 fn parse_release_id(s: &str, repo: &Repository) -> Result<ReleaseId, error::Resolve> {
-    let object = repo.raw().revparse_single(s).map_err(|err| error::Resolve {
-        revision: s.to_owned(),
-        err,
-    })?;
+    let object = repo
+        .raw()
+        .revparse_single(s)
+        .map_err(|err| error::Resolve {
+            revision: s.to_owned(),
+            err,
+        })?;
     Ok(cob::ObjectId::from(object.id()).into())
 }
 
Diff in /ci/src/src/bin/rad-artifact.rs:1470:
     })?;
     if object.kind() == Some(ObjectType::Tag) {
         let tag_oid: Oid = object.id().into();
-        let peeled = object.peel(ObjectType::Commit).map_err(|err| error::Resolve {
-            revision: rev.to_owned(),
-            err,
-        })?;
+        let peeled = object
+            .peel(ObjectType::Commit)
+            .map_err(|err| error::Resolve {
+                revision: rev.to_owned(),
+                err,
+            })?;
         Ok(ResolvedRef {
             commit: peeled.id().into(),
             tag: Some(tag_oid),
Diff in /ci/src/src/display.rs:438:
                 rows.push(vec![cid_cell, artifact.name.clone(), locations_cell]);
                 rows.push(vec![format!("  by {author}")]);
             } else {
-                rows.push(vec![cid_cell, author, artifact.name.clone(), locations_cell]);
+                rows.push(vec![
+                    cid_cell,
+                    author,
+                    artifact.name.clone(),
+                    locations_cell,
+                ]);
             }
 
             // Extras (locations, attestations, redactions) render as
Diff in /ci/src/src/lib.rs:712:
             store: self,
         })
     }
-
 }
 
 /// A `ReleaseMut` is a [`Release`] where the underlying `Release` can be
Diff in /ci/src/src/lib.rs:972:
 
     /// Collect the delegate set for a Radicle storage repository for use
     /// with `find_unique_by_commit`.
-    fn delegates(
-        repo: &radicle::storage::git::Repository,
-    ) -> std::collections::BTreeSet<Did> {
+    fn delegates(repo: &radicle::storage::git::Repository) -> std::collections::BTreeSet<Did> {
         use radicle::prelude::ReadRepository;
         repo.delegates().unwrap().into_iter().collect()
     }
Diff in /ci/src/src/lib.rs:2002:
             node: _alice, repo, ..
         } = test::setup::NodeWithRepo::default();
         let test::setup::NodeWithRepo { node: bob, .. } = test::setup::NodeWithRepo::default();
-        let test::setup::NodeWithRepo { node: carol, .. } =
-            test::setup::NodeWithRepo::default();
+        let test::setup::NodeWithRepo { node: carol, .. } = test::setup::NodeWithRepo::default();
         let oid = commit(&repo.backend, "Test Commit");
         let delegates = delegates(&repo);
         let mut releases = Releases::open(&*repo).unwrap();
plan: Action failed: cargo_fmt
After 8.49 seconds at 2026-04-28 11:47:44Z
CargoFmt(
    CargoFmt,
)

Raw log messages for Ambient troubleshooting

Raw log messages

These raw log messages are meant to help Ambient developers figure out problems. You can ignore them.

  1. {
      "type": "executor_starts",
      "name": "ambient-execute-plan",
      "version": "0.14.0@c37ec71",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 530668723
      },
      "log_source": "Plan"
    }
  2. {
      "type": "runnable_plan",
      "steps": [
        {
          "action": "mkdir",
          "pathname": "/ci"
        },
        {
          "action": "mkdir",
          "pathname": "/ci/artifacts"
        },
        {
          "action": "tar_extract",
          "archive": "/dev/vdc",
          "directory": "/ci/src"
        },
        {
          "action": "tar_extract",
          "archive": "/dev/vdf",
          "directory": "/ci/deps"
        },
        {
          "action": "tar_extract",
          "archive": "/dev/vde",
          "directory": "/ci/cache"
        },
        {
          "action": "shell",
          "shell": "ln -sf /ci /workspace"
        },
        {
          "action": "shell",
          "shell": "git config --global user.name 'Ambient CI'"
        },
        {
          "action": "shell",
          "shell": "git config --global user.email ambient@example.com"
        },
        {
          "action": "cargo_fmt"
        },
        {
          "action": "cargo_clippy"
        },
        {
          "action": "cargo_test"
        },
        {
          "action": "tar_create",
          "archive": "/dev/vde",
          "directory": "/ci/cache"
        },
        {
          "action": "tar_create",
          "archive": "/dev/vdd",
          "directory": "/ci/artifacts"
        }
      ],
      "executor_drive": "/dev/vdb",
      "source_drive": "/dev/vdc",
      "artifact_drive": "/dev/vdd",
      "cache_drive": "/dev/vde",
      "deps_drive": "/dev/vdf",
      "workspace_dir": "/ci",
      "source_dir": "/ci/src",
      "deps_dir": "/ci/deps",
      "cache_dir": "/ci/cache",
      "artifacts_dir": "/ci/artifacts",
      "envs": {},
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 534347993
      },
      "log_source": "Plan"
    }
  3. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 549271056
      },
      "log_source": "Plan"
    }
  4. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 551736413
      },
      "log_source": "Plan"
    }
  5. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 554020866
      },
      "log_source": "Plan"
    }
  6. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 556480151
      },
      "log_source": "Plan"
    }
  7. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 558782921
      },
      "log_source": "Plan"
    }
  8. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 584247900
      },
      "log_source": "Plan"
    }
  9. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777376855,
        "nanos_since_epoch": 586836392
      },
      "log_source": "Plan"
    }
  10. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777376858,
        "nanos_since_epoch": 298806330
      },
      "log_source": "Plan"
    }
  11. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777376858,
        "nanos_since_epoch": 301450137
      },
      "log_source": "Plan"
    }
  12. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 427821251
      },
      "log_source": "Plan"
    }
  13. {
      "type": "execute_action",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 430415142
      },
      "log_source": "Plan"
    }
  14. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            98,
            97,
            115,
            104
          ]
        },
        {
          "Unix": [
            45,
            99
          ]
        },
        {
          "Unix": [
            115,
            101,
            116,
            32,
            45,
            120,
            101,
            117,
            111,
            32,
            112,
            105,
            112,
            101,
            102,
            97,
            105,
            108,
            10,
            108,
            110,
            32,
            45,
            115,
            102,
            32,
            47,
            99,
            105,
            32,
            47,
            119,
            111,
            114,
            107,
            115,
            112,
            97,
            99,
            101,
            10
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 432688482
      },
      "log_source": "Plan"
    }
  15. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ ln -sf /ci /workspace\n",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 439775874
      },
      "log_source": "Plan"
    }
  16. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 442303757
      },
      "log_source": "Plan"
    }
  17. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 444587784
      },
      "log_source": "Plan"
    }
  18. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            98,
            97,
            115,
            104
          ]
        },
        {
          "Unix": [
            45,
            99
          ]
        },
        {
          "Unix": [
            115,
            101,
            116,
            32,
            45,
            120,
            101,
            117,
            111,
            32,
            112,
            105,
            112,
            101,
            102,
            97,
            105,
            108,
            10,
            103,
            105,
            116,
            32,
            99,
            111,
            110,
            102,
            105,
            103,
            32,
            45,
            45,
            103,
            108,
            111,
            98,
            97,
            108,
            32,
            117,
            115,
            101,
            114,
            46,
            110,
            97,
            109,
            101,
            32,
            39,
            65,
            109,
            98,
            105,
            101,
            110,
            116,
            32,
            67,
            73,
            39,
            10
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 447091393
      },
      "log_source": "Plan"
    }
  19. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ git config --global user.name 'Ambient CI'\n",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 457412342
      },
      "log_source": "Plan"
    }
  20. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 460178665
      },
      "log_source": "Plan"
    }
  21. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 462745250
      },
      "log_source": "Plan"
    }
  22. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            98,
            97,
            115,
            104
          ]
        },
        {
          "Unix": [
            45,
            99
          ]
        },
        {
          "Unix": [
            115,
            101,
            116,
            32,
            45,
            120,
            101,
            117,
            111,
            32,
            112,
            105,
            112,
            101,
            102,
            97,
            105,
            108,
            10,
            103,
            105,
            116,
            32,
            99,
            111,
            110,
            102,
            105,
            103,
            32,
            45,
            45,
            103,
            108,
            111,
            98,
            97,
            108,
            32,
            117,
            115,
            101,
            114,
            46,
            101,
            109,
            97,
            105,
            108,
            32,
            97,
            109,
            98,
            105,
            101,
            110,
            116,
            64,
            101,
            120,
            97,
            109,
            112,
            108,
            101,
            46,
            99,
            111,
            109,
            10
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 465397491
      },
      "log_source": "Plan"
    }
  23. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ git config --global user.email ambient@example.com\n",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 473242997
      },
      "log_source": "Plan"
    }
  24. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 476131440
      },
      "log_source": "Plan"
    }
  25. {
      "type": "execute_action",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 478831181
      },
      "log_source": "Plan"
    }
  26. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            99,
            97,
            114,
            103,
            111
          ]
        },
        {
          "Unix": [
            45,
            45,
            118,
            101,
            114,
            115,
            105,
            111,
            110
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 480741198
      },
      "log_source": "Plan"
    }
  27. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "cargo 1.94.0 (85eff7c80 2026-01-15)\n",
      "stderr": "",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 538722492
      },
      "log_source": "Plan"
    }
  28. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            99,
            97,
            114,
            103,
            111
          ]
        },
        {
          "Unix": [
            99,
            108,
            105,
            112,
            112,
            121
          ]
        },
        {
          "Unix": [
            45,
            45,
            118,
            101,
            114,
            115,
            105,
            111,
            110
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 541445963
      },
      "log_source": "Plan"
    }
  29. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "clippy 0.1.94 (4a4ef493e3 2026-03-02)\n",
      "stderr": "",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 650709448
      },
      "log_source": "Plan"
    }
  30. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            114,
            117,
            115,
            116,
            99
          ]
        },
        {
          "Unix": [
            45,
            45,
            118,
            101,
            114,
            115,
            105,
            111,
            110
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 653457885
      },
      "log_source": "Plan"
    }
  31. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "rustc 1.94.0 (4a4ef493e 2026-03-02)\n",
      "stderr": "",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 697974394
      },
      "log_source": "Plan"
    }
  32. {
      "type": "start_program",
      "argv": [
        {
          "Unix": [
            99,
            97,
            114,
            103,
            111
          ]
        },
        {
          "Unix": [
            102,
            109,
            116
          ]
        },
        {
          "Unix": [
            45,
            45,
            99,
            104,
            101,
            99,
            107
          ]
        }
      ],
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 698016330
      },
      "log_source": "Plan"
    }
  33. {
      "type": "program_failed",
      "exit_code": 1,
      "stdout": "Diff in /ci/src/src/bin/rad-artifact.rs:175:\n             let signer = profile.signer().map_err(error::Signer)?;\n             match loc.command {\n                 LocationCommand::Add(cmd) => {\n-                    location_add(\n-                        cmd,\n-                        args.no_input,\n-                        &mut releases,\n-                        &repo,\n-                        &profile,\n-                        &signer,\n-                    )?;\n+                    location_add(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;\n                 }\n                 LocationCommand::Remove(cmd) => {\n-                    location_remove(\n-                        cmd,\n-                        args.no_input,\n-                        &mut releases,\n-                        &repo,\n-                        &profile,\n-                        &signer,\n-                    )?;\n+                    location_remove(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;\n                 }\n             }\n             if !args.no_sync {\nDiff in /ci/src/src/bin/rad-artifact.rs:201:\n         }\n         Command::Attest(cmd) => {\n             let signer = profile.signer().map_err(error::Signer)?;\n-            attest_artifact(\n-                cmd,\n-                args.no_input,\n-                &mut releases,\n-                &repo,\n-                &profile,\n-                &signer,\n-            )?;\n+            attest_artifact(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;\n             if !args.no_sync {\n                 announce(&profile, repo.id)?;\n             }\nDiff in /ci/src/src/bin/rad-artifact.rs:215:\n         }\n         Command::Redact(cmd) => {\n             let signer = profile.signer().map_err(error::Signer)?;\n-            redact_artifact(\n-                cmd,\n-                args.no_input,\n-                &mut releases,\n-                &repo,\n-                &profile,\n-                &signer,\n-            )?;\n+            redact_artifact(cmd, args.no_input, &mut releases, &repo, &profile, &signer)?;\n             if !args.no_sync {\n                 announce(&profile, repo.id)?;\n             }\nDiff in /ci/src/src/bin/rad-artifact.rs:442:\n     let (id, cid) = match (release, revision, cid) {\n         (Some(_), _, Some(cid)) | (_, Some(_), Some(cid)) => {\n             let id = resolve_target_release(\n-                release,\n-                revision,\n-                releases,\n-                repo,\n-                &delegates,\n-                no_input,\n-                aliases,\n+                release, revision, releases, repo, &delegates, no_input, aliases,\n             )?;\n             (id, cid)\n         }\nDiff in /ci/src/src/bin/rad-artifact.rs:494:\n     let (id, cid) = match (release, revision, cid) {\n         (Some(_), _, Some(cid)) | (_, Some(_), Some(cid)) => {\n             let id = resolve_target_release(\n-                release,\n-                revision,\n-                releases,\n-                repo,\n-                &delegates,\n-                no_input,\n-                aliases,\n+                release, revision, releases, repo, &delegates, no_input, aliases,\n             )?;\n             (id, cid)\n         }\nDiff in /ci/src/src/bin/rad-artifact.rs:604:\n                 let id = parse_release_id(s, repo)?;\n                 let r = releases\n                     .get(&id)\n-                    .map_err(|err| error::Find::LookupId { release_id: id, err })?\n+                    .map_err(|err| error::Find::LookupId {\n+                        release_id: id,\n+                        err,\n+                    })?\n                     .ok_or(error::Find::NoReleaseId(id))?;\n                 vec![(id, r)]\n             }\nDiff in /ci/src/src/bin/rad-artifact.rs:629:\n         all_authors,\n         local: Some(local),\n     };\n-    let shown =\n-        display::Releases::new(candidates.into_iter(), aliases, filters, true, repo, repo);\n+    let shown = display::Releases::new(candidates.into_iter(), aliases, filters, true, repo, repo);\n     if use_pretty(pretty, json) {\n         // Expand per-location rows on `show -v`. List intentionally\n         // keeps the compact scheme summary even with -v to stay terse.\nDiff in /ci/src/src/bin/rad-artifact.rs:1010:\n         repo: &Repository,\n         aliases: &impl AliasStore,\n     ) -> Result<ReleaseId, String> {\n-        select_release(candidates, None, repo, aliases)?\n-            .ok_or_else(|| \"no release selected\".into())\n+        select_release(candidates, None, repo, aliases)?.ok_or_else(|| \"no release selected\".into())\n     }\n \n     /// Show a multi-release picker. Returns `Some(id)` when the user\nDiff in /ci/src/src/bin/rad-artifact.rs:1298:\n                     name, commit_oid, ..\n                 } => {\n                     let short = &commit_oid.to_string()[..7];\n-                    let title =\n-                        display::CommitTitle::title(repo, commit_oid).unwrap_or_default();\n+                    let title = display::CommitTitle::title(repo, commit_oid).unwrap_or_default();\n                     format!(\"{name} -> {short}  {title}\")\n                 }\n                 Entry::Commit { oid } => {\nDiff in /ci/src/src/bin/rad-artifact.rs:1425:\n             match releases.get(&id) {\n                 Ok(Some(_)) => Ok(id),\n                 Ok(None) => Err(error::Find::NoReleaseId(id).into()),\n-                Err(err) => Err(error::Find::LookupId { release_id: id, err }.into()),\n+                Err(err) => Err(error::Find::LookupId {\n+                    release_id: id,\n+                    err,\n+                }\n+                .into()),\n             }\n         }\n         (None, Some(rev)) => {\nDiff in /ci/src/src/bin/rad-artifact.rs:1453:\n /// `git revparse_single` accepts short OIDs, full OIDs, and any other\n /// ref name that points at the COB.\n fn parse_release_id(s: &str, repo: &Repository) -> Result<ReleaseId, error::Resolve> {\n-    let object = repo.raw().revparse_single(s).map_err(|err| error::Resolve {\n-        revision: s.to_owned(),\n-        err,\n-    })?;\n+    let object = repo\n+        .raw()\n+        .revparse_single(s)\n+        .map_err(|err| error::Resolve {\n+            revision: s.to_owned(),\n+            err,\n+        })?;\n     Ok(cob::ObjectId::from(object.id()).into())\n }\n \nDiff in /ci/src/src/bin/rad-artifact.rs:1470:\n     })?;\n     if object.kind() == Some(ObjectType::Tag) {\n         let tag_oid: Oid = object.id().into();\n-        let peeled = object.peel(ObjectType::Commit).map_err(|err| error::Resolve {\n-            revision: rev.to_owned(),\n-            err,\n-        })?;\n+        let peeled = object\n+            .peel(ObjectType::Commit)\n+            .map_err(|err| error::Resolve {\n+                revision: rev.to_owned(),\n+                err,\n+            })?;\n         Ok(ResolvedRef {\n             commit: peeled.id().into(),\n             tag: Some(tag_oid),\nDiff in /ci/src/src/display.rs:438:\n                 rows.push(vec![cid_cell, artifact.name.clone(), locations_cell]);\n                 rows.push(vec![format!(\"  by {author}\")]);\n             } else {\n-                rows.push(vec![cid_cell, author, artifact.name.clone(), locations_cell]);\n+                rows.push(vec![\n+                    cid_cell,\n+                    author,\n+                    artifact.name.clone(),\n+                    locations_cell,\n+                ]);\n             }\n \n             // Extras (locations, attestations, redactions) render as\nDiff in /ci/src/src/lib.rs:712:\n             store: self,\n         })\n     }\n-\n }\n \n /// A `ReleaseMut` is a [`Release`] where the underlying `Release` can be\nDiff in /ci/src/src/lib.rs:972:\n \n     /// Collect the delegate set for a Radicle storage repository for use\n     /// with `find_unique_by_commit`.\n-    fn delegates(\n-        repo: &radicle::storage::git::Repository,\n-    ) -> std::collections::BTreeSet<Did> {\n+    fn delegates(repo: &radicle::storage::git::Repository) -> std::collections::BTreeSet<Did> {\n         use radicle::prelude::ReadRepository;\n         repo.delegates().unwrap().into_iter().collect()\n     }\nDiff in /ci/src/src/lib.rs:2002:\n             node: _alice, repo, ..\n         } = test::setup::NodeWithRepo::default();\n         let test::setup::NodeWithRepo { node: bob, .. } = test::setup::NodeWithRepo::default();\n-        let test::setup::NodeWithRepo { node: carol, .. } =\n-            test::setup::NodeWithRepo::default();\n+        let test::setup::NodeWithRepo { node: carol, .. } = test::setup::NodeWithRepo::default();\n         let oid = commit(&repo.backend, \"Test Commit\");\n         let delegates = delegates(&repo);\n         let mut releases = Releases::open(&*repo).unwrap();\n",
      "stderr": "",
      "timestamp": {
        "secs_since_epoch": 1777376863,
        "nanos_since_epoch": 905186464
      },
      "log_source": "Plan"
    }
  34. {
      "type": "action_failed",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777376864,
        "nanos_since_epoch": 22556721
      },
      "log_source": "Plan"
    }
  35. {
      "type": "executor_ends_in_failure",
      "exit_code": 1,
      "timestamp": {
        "secs_since_epoch": 1777376864,
        "nanos_since_epoch": 26066617
      },
      "log_source": "Plan"
    }

Trigger message

{
  "request": "trigger",
  "version": 1,
  "event_type": "push",
  "repository": {
    "id": "rad:z4VYyJ9KuwMNkXGQnmKuGPGKw3inv",
    "name": "radicle-artifact",
    "description": "A Radicle Collaborative Object (COB) for content-addressed release artifacts and their discovery locations",
    "private": false,
    "default_branch": "main",
    "delegates": [
      "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm"
    ]
  },
  "pusher": {
    "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
    "alias": "2color"
  },
  "before": "5ecab5f11424d91100c42fc8be379aa5568ed665",
  "after": "5ecab5f11424d91100c42fc8be379aa5568ed665",
  "branch": "main",
  "commits": [
    "5ecab5f11424d91100c42fc8be379aa5568ed665",
    "2f0e6b5662870045260e52ec392f83ec980538f5",
    "1e72006266445d1db954f39c24c9979b78f61de8",
    "c86237d54fecf046d6dc1721c5a2e2b3be86f63b",
    "e2e9e721eae37358fffe4e18da3bc60a35fe96cf",
    "b6c4673e57a15769fe40804b239b03eda9c15419",
    "b9ed5aeaa4286301484782485668b25099c032b4",
    "98e9c91a275c40b43c387def0fdfec63595e7341",
    "41ab3b0563f37823fd25443b3250731cd327f1b7",
    "4e7289ff8b89b55a9b6203e86620687860ab2b56",
    "b98035f10aba068726bec077ded55ac78e514486",
    "88e573e3df4c403fd1d251605c6943c98e97c34a",
    "55899e0beea3b673c11a48c7debd60cbce7feee4",
    "9876154252f0bfa228a6684fa6873cf9e156c7a4",
    "09680ca0635cc64ebdae618c63b798af78b17c88",
    "d8d7319f181c4f640a65a2e1ada5824e4903be96",
    "35a619ce9659d3d971c179942f4e57f68dccf626",
    "58dd5a7c4f6be9236bd656be066e5f64f3bccafa",
    "479cd44bbe4721492964549b784806c071ca609a",
    "acf7cc89bfd393f9ba4d3660c4fe5f5a4147081a",
    "c0e2958fa068ac9c32ffaca65600b5a69269281b",
    "b04d6befebf153c845a3e7b553cd65cf33b893ed",
    "6796786e4047995656d118008aa5f576b4c60ac1"
  ]
}

Ambient stdout

executor from config: /usr/bin/ambient-execute-plan
executor from PATH: /usr/bin/ambient-execute-plan
run CI for rad:z4VYyJ9KuwMNkXGQnmKuGPGKw3inv
ERROR: CI run failed inside QEMU

Ambient stderr

<empty log>