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 13:56:47ZProgram: ambient-execute-plan
Version: 0.14.0@c37ec71
plan: Runnable plan
After 0.00 seconds at 2026-04-28 13:56:47Z
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.00 seconds at 2026-04-28 13:56:47Z
  • plan: Start action mkdir: /ci
    After 0.00 seconds at 2026-04-28 13:56:47Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
  • plan: Action succeeded mkdir: /ci
    After 0.00 seconds at 2026-04-28 13:56:47Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
plan: Successful action mkdir: /ci/artifacts
After 0.00 seconds at 2026-04-28 13:56:47Z
  • plan: Start action mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-28 13:56:47Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
  • plan: Action succeeded mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-28 13:56:47Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
plan: Successful action tar_extract
After 0.00 seconds at 2026-04-28 13:56:47Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 13:56:47Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 13:56:48Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
plan: Successful action tar_extract
After 0.04 seconds at 2026-04-28 13:56:48Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 13:56:48Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 13:56:51Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
plan: Successful action tar_extract
After 3.27 seconds at 2026-04-28 13:56:51Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-28 13:56:51Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-28 13:56:57Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
plan: Successful action shell: ln -sf /ci /workspace
After 9.09 seconds at 2026-04-28 13:56:57Z
  • plan: Start action shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-28 13:56:57Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 13:56:57Z
    • bash
    • -c
    • set -xeuo pipefail ln -sf /ci /workspace
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 13:56:57Z
    Exit code: 0
    Stderr:
    + ln -sf /ci /workspace
    
  • plan: Action succeeded shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-28 13:56:57Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
plan: Successful action shell: git config --global user.name 'Ambient CI'
After 9.10 seconds at 2026-04-28 13:56:57Z
  • plan: Start action shell: git config --global user.name 'Ambient CI'
    After 0.00 seconds at 2026-04-28 13:56:57Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 13:56:57Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.name 'Ambient CI'
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 13:56:57Z
    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 13:56:57Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
plan: Successful action shell: git config --global user.email ambient@example.com
After 9.12 seconds at 2026-04-28 13:56:57Z
  • plan: Start action shell: git config --global user.email ambient@example.com
    After 0.00 seconds at 2026-04-28 13:56:57Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-28 13:56:57Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.email ambient@example.com
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-28 13:56:57Z
    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 13:56:57Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
plan: Start action cargo_fmt
After 9.14 seconds at 2026-04-28 13:56:57Z
CargoFmt(
    CargoFmt,
)
plan: Start program cargo
After 9.14 seconds at 2026-04-28 13:56:57Z
  • cargo
  • --version
plan: Program succeeded
After 9.20 seconds at 2026-04-28 13:56:57Z
Exit code: 0
Stdout:
cargo 1.94.0 (85eff7c80 2026-01-15)
plan: Start program cargo
After 9.21 seconds at 2026-04-28 13:56:57Z
  • cargo
  • clippy
  • --version
plan: Program succeeded
After 9.32 seconds at 2026-04-28 13:56:57Z
Exit code: 0
Stdout:
clippy 0.1.94 (4a4ef493e3 2026-03-02)
plan: Start program rustc
After 9.32 seconds at 2026-04-28 13:56:57Z
  • rustc
  • --version
plan: Program succeeded
After 9.37 seconds at 2026-04-28 13:56:57Z
Exit code: 0
Stdout:
rustc 1.94.0 (4a4ef493e 2026-03-02)
plan: Start program cargo
After 9.37 seconds at 2026-04-28 13:56:57Z
  • cargo
  • fmt
  • --check
plan: ERROR: Program failed
After 9.60 seconds at 2026-04-28 13:56:57Z
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 9.73 seconds at 2026-04-28 13:56:57Z
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": 1777384607,
        "nanos_since_epoch": 985444307
      },
      "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": 1777384607,
        "nanos_since_epoch": 986259587
      },
      "log_source": "Plan"
    }
  3. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777384607,
        "nanos_since_epoch": 986380011
      },
      "log_source": "Plan"
    }
  4. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777384607,
        "nanos_since_epoch": 986882280
      },
      "log_source": "Plan"
    }
  5. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777384607,
        "nanos_since_epoch": 987046082
      },
      "log_source": "Plan"
    }
  6. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777384607,
        "nanos_since_epoch": 987093050
      },
      "log_source": "Plan"
    }
  7. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777384607,
        "nanos_since_epoch": 987689630
      },
      "log_source": "Plan"
    }
  8. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777384608,
        "nanos_since_epoch": 25744189
      },
      "log_source": "Plan"
    }
  9. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777384608,
        "nanos_since_epoch": 26240026
      },
      "log_source": "Plan"
    }
  10. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777384611,
        "nanos_since_epoch": 248445750
      },
      "log_source": "Plan"
    }
  11. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777384611,
        "nanos_since_epoch": 251150691
      },
      "log_source": "Plan"
    }
  12. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 70250549
      },
      "log_source": "Plan"
    }
  13. {
      "type": "execute_action",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 72943641
      },
      "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": 1777384617,
        "nanos_since_epoch": 75280733
      },
      "log_source": "Plan"
    }
  15. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ ln -sf /ci /workspace\n",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 82518876
      },
      "log_source": "Plan"
    }
  16. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 85331899
      },
      "log_source": "Plan"
    }
  17. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 87991667
      },
      "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": 1777384617,
        "nanos_since_epoch": 90584156
      },
      "log_source": "Plan"
    }
  19. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ git config --global user.name 'Ambient CI'\n",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 101650649
      },
      "log_source": "Plan"
    }
  20. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 104812076
      },
      "log_source": "Plan"
    }
  21. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 107506342
      },
      "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": 1777384617,
        "nanos_since_epoch": 110354647
      },
      "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": 1777384617,
        "nanos_since_epoch": 119015525
      },
      "log_source": "Plan"
    }
  24. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 122219108
      },
      "log_source": "Plan"
    }
  25. {
      "type": "execute_action",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 125180834
      },
      "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": 1777384617,
        "nanos_since_epoch": 127192366
      },
      "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": 1777384617,
        "nanos_since_epoch": 189205100
      },
      "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": 1777384617,
        "nanos_since_epoch": 192239807
      },
      "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": 1777384617,
        "nanos_since_epoch": 307079191
      },
      "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": 1777384617,
        "nanos_since_epoch": 307539475
      },
      "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": 1777384617,
        "nanos_since_epoch": 355848495
      },
      "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": 1777384617,
        "nanos_since_epoch": 356317507
      },
      "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": 1777384617,
        "nanos_since_epoch": 589611842
      },
      "log_source": "Plan"
    }
  34. {
      "type": "action_failed",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 713567040
      },
      "log_source": "Plan"
    }
  35. {
      "type": "executor_ends_in_failure",
      "exit_code": 1,
      "timestamp": {
        "secs_since_epoch": 1777384617,
        "nanos_since_epoch": 716975117
      },
      "log_source": "Plan"
    }

Trigger message

{
  "request": "trigger",
  "version": 1,
  "event_type": "patch",
  "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"
    ]
  },
  "action": "Updated",
  "patch": {
    "id": "44e9aae2b27a407547209e6a74a1a0b9f686587c",
    "author": {
      "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
      "alias": "2color"
    },
    "title": "feat: register artifacts in release COB",
    "state": {
      "status": "open",
      "conflicts": []
    },
    "before": "d33a5131739af72586dbea33a141ad531ef5f8bc",
    "after": "c555a60e9b517decc083c30525ea62c0f5872458",
    "commits": [
      "c555a60e9b517decc083c30525ea62c0f5872458",
      "feecc88a89f270ebc6d69557f8e019222e90fa27",
      "9567a43c7142bc2c550712a134ed8eaffd20a2cc",
      "7158e0e9147807844d2a4e9e200981ca01142b63"
    ],
    "target": "d33a5131739af72586dbea33a141ad531ef5f8bc",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "44e9aae2b27a407547209e6a74a1a0b9f686587c",
        "author": {
          "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
          "alias": "2color"
        },
        "description": "- add `make register-artifacts` that computes each binary CID,\n  adds it under `releases/X.Y.Z`, and announces the download URL\n- document the new step in RELEASE.md\n\nDogfoods rad-artifact on its own release so users can discover,\nverify, and attest to the published binaries through the tool.\n\n\nrefactor: drop redundant build in register-artifacts\n\n`make release` is responsible for builds; this target only\nreads the cross-compiled binaries it produced. `cargo run`\nwill build the native rad-artifact on demand if needed.\n\n\nrefactor: DRY up the Makefile\n\n- hoist target triples into ALL_TARGETS / MACOS_TARGETS /\n  LINUX_TARGETS and derive RELEASE_BINS once\n- collapse per-triple build+cp blocks into a single build-%\n  pattern rule driven by BUILD_CMD_<triple>\n- extract the binary-existence pre-flight into a shared\n  check-bins target depended on by upload and register-artifacts\n\nAdding a new target triple is now a one-line change.",
        "base": "1af9b4fc79a1e5816b92292bab422287c2dc65a3",
        "oid": "9d085afe14ec23c82995e76bcc43cb24eb682e1e",
        "timestamp": 1777043977
      },
      {
        "id": "650b7944a8b3593250ad102d1310899c3435c4e8",
        "author": {
          "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
          "alias": "2color"
        },
        "description": "",
        "base": "d33a5131739af72586dbea33a141ad531ef5f8bc",
        "oid": "c555a60e9b517decc083c30525ea62c0f5872458",
        "timestamp": 1777384598
      }
    ]
  }
}

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>