CI: FAILURE radicle-artifact

Table of Contents

Run log

Plan, inside VM without network

plan: Executor starts
After 0.00 seconds at 2026-04-27 13:54:02ZProgram: ambient-execute-plan
Version: 0.14.0@c37ec71
plan: Runnable plan
After 0.00 seconds at 2026-04-27 13:54:02Z
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-27 13:54:02Z
  • plan: Start action mkdir: /ci
    After 0.00 seconds at 2026-04-27 13:54:02Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
  • plan: Action succeeded mkdir: /ci
    After 0.00 seconds at 2026-04-27 13:54:02Z
    Mkdir(
        Mkdir {
            pathname: "/ci",
        },
    )
plan: Successful action mkdir: /ci/artifacts
After 0.00 seconds at 2026-04-27 13:54:02Z
  • plan: Start action mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-27 13:54:02Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
  • plan: Action succeeded mkdir: /ci/artifacts
    After 0.00 seconds at 2026-04-27 13:54:02Z
    Mkdir(
        Mkdir {
            pathname: "/ci/artifacts",
        },
    )
plan: Successful action tar_extract
After 0.00 seconds at 2026-04-27 13:54:02Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-27 13:54:02Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-27 13:54:02Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdc",
            directory: "/ci/src",
        },
    )
plan: Successful action tar_extract
After 0.03 seconds at 2026-04-27 13:54:02Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-27 13:54:02Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-27 13:54:05Z
    TarExtract(
        TarExtract {
            archive: "/dev/vdf",
            directory: "/ci/deps",
        },
    )
plan: Successful action tar_extract
After 2.69 seconds at 2026-04-27 13:54:05Z
  • plan: Start action tar_extract
    After 0.00 seconds at 2026-04-27 13:54:05Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
  • plan: Action succeeded tar_extract
    After 0.00 seconds at 2026-04-27 13:54:10Z
    TarExtract(
        TarExtract {
            archive: "/dev/vde",
            directory: "/ci/cache",
        },
    )
plan: Successful action shell: ln -sf /ci /workspace
After 7.82 seconds at 2026-04-27 13:54:10Z
  • plan: Start action shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-27 13:54:10Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-27 13:54:10Z
    • bash
    • -c
    • set -xeuo pipefail ln -sf /ci /workspace
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-27 13:54:10Z
    Exit code: 0
    Stderr:
    + ln -sf /ci /workspace
    
  • plan: Action succeeded shell: ln -sf /ci /workspace
    After 0.00 seconds at 2026-04-27 13:54:10Z
    Shell(
        Shell {
            shell: "ln -sf /ci /workspace",
        },
    )
plan: Successful action shell: git config --global user.name 'Ambient CI'
After 7.83 seconds at 2026-04-27 13:54:10Z
  • plan: Start action shell: git config --global user.name 'Ambient CI'
    After 0.00 seconds at 2026-04-27 13:54:10Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-27 13:54:10Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.name 'Ambient CI'
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-27 13:54:10Z
    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-27 13:54:10Z
    Shell(
        Shell {
            shell: "git config --global user.name 'Ambient CI'",
        },
    )
plan: Successful action shell: git config --global user.email ambient@example.com
After 7.85 seconds at 2026-04-27 13:54:10Z
  • plan: Start action shell: git config --global user.email ambient@example.com
    After 0.00 seconds at 2026-04-27 13:54:10Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
  • plan: Start program bash
    After 0.00 seconds at 2026-04-27 13:54:10Z
    • bash
    • -c
    • set -xeuo pipefail git config --global user.email ambient@example.com
  • plan: Program succeeded
    After 0.00 seconds at 2026-04-27 13:54:10Z
    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-27 13:54:10Z
    Shell(
        Shell {
            shell: "git config --global user.email ambient@example.com",
        },
    )
plan: Start action cargo_fmt
After 7.86 seconds at 2026-04-27 13:54:10Z
CargoFmt(
    CargoFmt,
)
plan: Start program cargo
After 7.87 seconds at 2026-04-27 13:54:10Z
  • cargo
  • --version
plan: Program succeeded
After 7.92 seconds at 2026-04-27 13:54:10Z
Exit code: 0
Stdout:
cargo 1.94.0 (85eff7c80 2026-01-15)
plan: Start program cargo
After 7.93 seconds at 2026-04-27 13:54:10Z
  • cargo
  • clippy
  • --version
plan: Program succeeded
After 8.03 seconds at 2026-04-27 13:54:10Z
Exit code: 0
Stdout:
clippy 0.1.94 (4a4ef493e3 2026-03-02)
plan: Start program rustc
After 8.03 seconds at 2026-04-27 13:54:10Z
  • rustc
  • --version
plan: Program succeeded
After 8.08 seconds at 2026-04-27 13:54:10Z
Exit code: 0
Stdout:
rustc 1.94.0 (4a4ef493e 2026-03-02)
plan: Start program cargo
After 8.08 seconds at 2026-04-27 13:54:10Z
  • cargo
  • fmt
  • --check
plan: ERROR: Program failed
After 8.28 seconds at 2026-04-27 13:54:10Z
Exit code: 1
Stdout:
Diff in /ci/src/src/bin/rad-artifact.rs:1057:
                     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:1171:
     })?;
     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/lib.rs:1039:
 
     /// Collect the delegate set for a Radicle storage repository for use
     /// with `find_or_create_by_oid` and `find_unique_by_oid`.
-    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:2006:
             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, "v1.0");
         // Bob and Carol are not delegates of repo.
         let delegates = delegates(&repo);
Diff in /ci/src/src/lib.rs:2270:
             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.32 seconds at 2026-04-27 13:54:10Z
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": 1777298042,
        "nanos_since_epoch": 545565204
      },
      "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": 1777298042,
        "nanos_since_epoch": 545769110
      },
      "log_source": "Plan"
    }
  3. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 545826218
      },
      "log_source": "Plan"
    }
  4. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 546293013
      },
      "log_source": "Plan"
    }
  5. {
      "type": "execute_action",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 546489986
      },
      "log_source": "Plan"
    }
  6. {
      "type": "action_succeeded",
      "action": "mkdir",
      "pathname": "/ci/artifacts",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 546520668
      },
      "log_source": "Plan"
    }
  7. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 546696745
      },
      "log_source": "Plan"
    }
  8. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdc",
      "directory": "/ci/src",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 574352721
      },
      "log_source": "Plan"
    }
  9. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777298042,
        "nanos_since_epoch": 574389667
      },
      "log_source": "Plan"
    }
  10. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vdf",
      "directory": "/ci/deps",
      "timestamp": {
        "secs_since_epoch": 1777298045,
        "nanos_since_epoch": 231950256
      },
      "log_source": "Plan"
    }
  11. {
      "type": "execute_action",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777298045,
        "nanos_since_epoch": 234959482
      },
      "log_source": "Plan"
    }
  12. {
      "type": "action_succeeded",
      "action": "tar_extract",
      "archive": "/dev/vde",
      "directory": "/ci/cache",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 358600406
      },
      "log_source": "Plan"
    }
  13. {
      "type": "execute_action",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 361168747
      },
      "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": 1777298050,
        "nanos_since_epoch": 363443796
      },
      "log_source": "Plan"
    }
  15. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ ln -sf /ci /workspace\n",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 370398590
      },
      "log_source": "Plan"
    }
  16. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "ln -sf /ci /workspace",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 372929969
      },
      "log_source": "Plan"
    }
  17. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 375215831
      },
      "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": 1777298050,
        "nanos_since_epoch": 377685197
      },
      "log_source": "Plan"
    }
  19. {
      "type": "program_succeeded",
      "exit_code": 0,
      "stdout": "",
      "stderr": "+ git config --global user.name 'Ambient CI'\n",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 388329186
      },
      "log_source": "Plan"
    }
  20. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.name 'Ambient CI'",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 391141548
      },
      "log_source": "Plan"
    }
  21. {
      "type": "execute_action",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 393634026
      },
      "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": 1777298050,
        "nanos_since_epoch": 396269291
      },
      "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": 1777298050,
        "nanos_since_epoch": 404065438
      },
      "log_source": "Plan"
    }
  24. {
      "type": "action_succeeded",
      "action": "shell",
      "shell": "git config --global user.email ambient@example.com",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 406937989
      },
      "log_source": "Plan"
    }
  25. {
      "type": "execute_action",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 409534072
      },
      "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": 1777298050,
        "nanos_since_epoch": 411482209
      },
      "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": 1777298050,
        "nanos_since_epoch": 469471596
      },
      "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": 1777298050,
        "nanos_since_epoch": 472223391
      },
      "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": 1777298050,
        "nanos_since_epoch": 577189216
      },
      "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": 1777298050,
        "nanos_since_epoch": 580008194
      },
      "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": 1777298050,
        "nanos_since_epoch": 624090080
      },
      "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": 1777298050,
        "nanos_since_epoch": 626831503
      },
      "log_source": "Plan"
    }
  33. {
      "type": "program_failed",
      "exit_code": 1,
      "stdout": "Diff in /ci/src/src/bin/rad-artifact.rs:1057:\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:1171:\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/lib.rs:1039:\n \n     /// Collect the delegate set for a Radicle storage repository for use\n     /// with `find_or_create_by_oid` and `find_unique_by_oid`.\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:2006:\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, \"v1.0\");\n         // Bob and Carol are not delegates of repo.\n         let delegates = delegates(&repo);\nDiff in /ci/src/src/lib.rs:2270:\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": 1777298050,
        "nanos_since_epoch": 823505855
      },
      "log_source": "Plan"
    }
  34. {
      "type": "action_failed",
      "action": "cargo_fmt",
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 862256043
      },
      "log_source": "Plan"
    }
  35. {
      "type": "executor_ends_in_failure",
      "exit_code": 1,
      "timestamp": {
        "secs_since_epoch": 1777298050,
        "nanos_since_epoch": 865801971
      },
      "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": "Created",
  "patch": {
    "id": "38c7fa789850450f8936febdad50dfe59d89648f",
    "author": {
      "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
      "alias": "2color"
    },
    "title": "Add support for tags in releases",
    "state": {
      "status": "open",
      "conflicts": []
    },
    "before": "1af9b4fc79a1e5816b92292bab422287c2dc65a3",
    "after": "09680ca0635cc64ebdae618c63b798af78b17c88",
    "commits": [
      "09680ca0635cc64ebdae618c63b798af78b17c88",
      "d8d7319f181c4f640a65a2e1ada5824e4903be96",
      "35a619ce9659d3d971c179942f4e57f68dccf626",
      "58dd5a7c4f6be9236bd656be066e5f64f3bccafa",
      "479cd44bbe4721492964549b784806c071ca609a",
      "acf7cc89bfd393f9ba4d3660c4fe5f5a4147081a",
      "c0e2958fa068ac9c32ffaca65600b5a69269281b",
      "b04d6befebf153c845a3e7b553cd65cf33b893ed",
      "6796786e4047995656d118008aa5f576b4c60ac1"
    ],
    "target": "1af9b4fc79a1e5816b92292bab422287c2dc65a3",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "38c7fa789850450f8936febdad50dfe59d89648f",
        "author": {
          "id": "did:key:z6MktwkohCx8aHZ1QCjVZUiLmX92oPZFxRiFZkbq32Tk5Tkm",
          "alias": "2color"
        },
        "description": "feat: add optional tag OID to Release schema\n\n- extend Action::Create with tag: Option<Oid> (serde default and\n  skip_serializing_if to keep existing COB payloads byte-identical)\n- add Release.tag field with matching serde defaults so older COBs\n  deserialize to None\n- thread tag through Release::new and Cob::from_root\n- expose Release::tag() accessor\n- thread tag through Transaction::create; current caller passes None\n\nWhy: a release can now durably record an annotated tag association\nin the COB content, without changing the commit-keyed parent that\nthe COB store requires. First-writer-wins semantics fall out of the\nexisting rule that subsequent Action::Create are ignored.\n\n\nfeat: record COB creator on Release\n\n- add Release.creator: Did, populated in Cob::from_root from the\n  signer of the initial op\n- expose Release::creator() accessor\n- thread creator through Release::new\n\nWhy: needed to apply delegate-priority rules when selecting the\ncanonical COB among duplicates for the same commit. Per-op author\nis still tracked separately for artifact attribution.\n\n\nfeat: delegate-priority canonical COB selection\n\n- find_or_create_by_oid now takes a tag and a delegate set\n- selection rule: prefer delegate-authored release; if none and the\n  signer is a delegate, bootstrap a fresh COB; otherwise reuse any\n  existing release; otherwise create new\n- create() takes a tag argument that is recorded only at creation\n  time (first-writer-wins via the existing \"subsequent Create\n  ignored\" rule)\n- thread the delegate set through the rad-artifact add path\n\nWhy: a non-delegate creating a release first would otherwise lock\nin their tag and timestamp metadata for every subsequent delegate\nwrite to the same commit. With this rule, a delegate always lands\non a delegate-authored COB, while non-delegates still converge\ndeterministically to existing releases.\n\n\nfeat: delegate-priority lookup in find_unique_by_oid\n\n- prefer delegate-authored releases (smallest ReleaseId among them)\n- fall back to a single non-delegate release when no delegate\n  release exists; only error Ambiguous when there are multiple\n  non-delegate releases and no delegate canonical\n- thread &BTreeSet<Did> through every CLI read/write path that\n  calls find_unique_by_oid (location_add, attest, redact,\n  location_remove, show); add Delegates error variants where needed\n\nWhy: read paths now surface the same canonical COB the write path\nselects, so show / attest / redact resolve unambiguously when a\ndelegate has bootstrapped their own COB alongside an earlier\nnon-delegate one.\n\n\nfeat: resolve refs to (commit, optional tag) pair\n\n- replace resolve_commit with resolve_ref returning ResolvedRef\n  { commit, tag: Option<Oid> }; for annotated tag refs the tag's\n  own OID is returned alongside the peeled commit\n- update every CLI entry point to take .commit; add path threads\n  resolved.tag into find_or_create_by_oid so the COB records the\n  annotated tag association on first creation\n- picker now returns a ResolvedRef and shows both annotated tag\n  entries and the commits they point to as separate options, so\n  the user can explicitly opt out of tag-association by picking\n  the commit entry\n\nWhy: every CLI entry point now resolves an annotated tag ref to a\ncommit OID before passing it to the COB store, fixing the\n\"parent is not a commit object\" creation failure and the lookup\nmiss that affected show / attest / redact / location / fetch when\nthe user passed a tag name.\n\n\nfeat: surface tag association in release display\n\n- display::Release carries an optional tag OID, serialized when set\n- pretty output renders 'tag <short> -> commit <short>' for\n  tag-associated releases and 'commit <short>' otherwise\n- title resolution prefers the tag message's first line, falling\n  back to the commit summary when the tag object isn't present\n  locally\n- CommitTitle for Repository now handles both commit and annotated\n  tag OIDs\n\nWhy: with the tag OID now durably recorded on the COB, display\noutput should reflect the tag association so users see the same\nref label they used to create the release.\n\n\ntest: cover tag field, creator, and delegate priority\n\n- update existing tests for new Releases API signatures (tag arg\n  on create, plus tag/delegates/signer on find_or_create_by_oid\n  and find_unique_by_oid)\n- add a delegates() helper for collecting the repo's delegate set\n  in tests\n- replace find_or_create_picks_smallest_id_when_duplicates_exist\n  with find_or_create_prefers_delegate_release; the smallest-id\n  rule now only applies inside the delegate class\n- add new tests:\n  - find_or_create_creates_new_when_only_non_delegate_exists\n  - find_or_create_non_delegate_reuses_non_delegate_release\n  - create_records_tag_oid / create_without_tag_leaves_none\n  - find_or_create_first_writer_wins_tag\n  - tag_persists_through_reload\n  - creator_persists_through_reload\n  - find_unique_prefers_delegate_release\n  - find_unique_returns_single_non_delegate\n  - find_unique_ambiguous_only_among_non_delegates\n  - tag_field_default_none_on_old_actions\n\nWhy: lock in the schema additions, the delegate-priority rules in\nboth lookup paths, and the backward-compat handling for COBs\ncreated before the tag field existed.\n\n\ndocs: tighten comments and remove stale notes\n\n- collapse Release struct doc and field docs that duplicated each\n  other\n- shorten Release::tag and Release::creator accessor docs\n- replace stale \"no delegate filter needed\" comments on attest /\n  redact paths now that both pass the delegate set\n- drop the \"unlike location_add\" comment on location_remove now\n  that both paths share the same canonical-release lookup\n- update picker doc: tag and peeled commit now both appear as\n  separate entries, not deduped\n- tighten CommitTitle trait and impl docs; the release is always\n  commit-keyed, the tag is metadata\n- trim find_or_create_by_oid body comments that restated the\n  function's doc list\n\nWhy: comments and docs got out of sync as semantics changed\nthrough the schema, lookup, and display steps; stale prose was\nasserting things the code no longer does.\n\n\nrefactor: rename CLI commit args to revision\n\n- positional <COMMIT> placeholders renamed to <REVISION> on show,\n  attest, redact, fetch, location add, location remove\n- the --commit named flag on `add` becomes --revision; --commit is\n  kept as a hidden alias for backward compatibility\n- error::Resolve { commit } renamed to { revision } and the error\n  message updated\n- ResolvedRef.commit and resolve_ref's `rev` parameter unchanged\n  (they describe what the resolution outputs, not the user input)\n- examples in --help refreshed to use tag-shaped values where\n  natural (e.g. v1.0)\n\nWhy: the args accept commit hashes, abbreviated OIDs, annotated\ntag names, lightweight tags — anything revparse_single resolves\nto a commit. \"Revision\" matches git's vocabulary for that and is\nno longer misleading after we added explicit tag support.",
        "base": "1af9b4fc79a1e5816b92292bab422287c2dc65a3",
        "oid": "09680ca0635cc64ebdae618c63b798af78b17c88",
        "timestamp": 1777298029
      }
    ]
  }
}

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>