CCI report: 015da70b-4661-4d32-80c0-38732ba7b2c2

Request message

{
  "request": "trigger",
  "version": 1,
  "event_type": "patch",
  "repository": {
    "id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
    "name": "heartwood",
    "description": "Radicle Heartwood Protocol & Stack",
    "private": false,
    "default_branch": "master",
    "delegates": [
      "did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
      "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
      "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
    ]
  },
  "action": "Created",
  "patch": {
    "id": "580a449387097e52c0bd347fc1bd14e3d7a5071c",
    "author": {
      "id": "did:key:z6MkrnXJWPndzPBxpBUaE3L3BnMeWpaQdT1V1FvkoCPFSFS3",
      "alias": null
    },
    "title": "radicle/storage: Resolve identity root via founder `rad/id`",
    "state": {
      "status": "open",
      "conflicts": []
    },
    "before": "0e5a56f25f51d07290613a9363bd8c0c9fc8e0be",
    "after": "65b67452e78ca848328f64808f438b8f4a825774",
    "commits": [
      "65b67452e78ca848328f64808f438b8f4a825774"
    ],
    "target": "0e5a56f25f51d07290613a9363bd8c0c9fc8e0be",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "580a449387097e52c0bd347fc1bd14e3d7a5071c",
        "author": {
          "id": "did:key:z6MkrnXJWPndzPBxpBUaE3L3BnMeWpaQdT1V1FvkoCPFSFS3",
          "alias": null
        },
        "description": "Repositories whose founder never published `rad/root` cannot be\ncloned since [388d9855][1] (\"radicle/storage: Secure\n`canonical_identity_head`\"). Every attempt fails with\n\n Fetch failed for <rid> from <nid>: missing identity document\n\nHow a clone ends up there:\n\n1. The fetch worker [clones into a temporary repository][2] and, once\n   the fetch itself succeeds, [moves it into storage][3]. Only then\n   does it [set the canonical `rad/id`][4] of the new copy, which\n   means [computing the canonical identity head][5].\n2. That computation reads the founder from the root identity document\n   and [looks up `rad/root` in the founder's namespace][6]. When the\n   reference is absent it falls back to [walking back from the\n   canonical `rad/id`][7].\n3. On a fresh clone that reference cannot exist yet, because step 1 is\n   what creates it. The walk-back [fails with \"not found\"][8], which is\n   [reported as a missing identity document][9], and the fetch [fails\n   with that error][10] after the repository is already in place.\n\n`rad/root` arrived with the [`root` signed-refs feature level][11] in\nRadicle 1.1.0, long after many repositories were created. Their\nfounders' signed refs are [still at level `none`][12] and are served\nunchanged by seeds, so nobody but the founder can ever produce\n`rad/root` for them.\n\nOn two new 1.10.3 permissive seeds this left ~2,050 such repositories\nunclonable (out of 16K total). Since the half-cloned copies were\nalready in storage, every inventory scan [reported them as\ninvalid][13], because loading their identity document [runs into the\nsame dead end][14], and the nodes retried them every few seconds.\n\nWhen neither `rad/root` nor the canonical `rad/id` is available, walk\nback from the [founder's own `rad/id`][15] instead. That reference is\ncovered by the founder's signed refs, so the root still comes only from\nthe founder, and the root document is still [checked against the\nrepository ID][16] as before. The existing behaviour is unchanged\nwhenever the canonical `rad/id` exists.\n\nTests: a unit test deletes the founder's `rad/root` and the canonical\n`rad/id` from a fresh project and checks the head still resolves; an\nend-to-end test downgrades a seed's copy to level-`none` signed refs\nand clones from it.\n\n[1]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/commits/388d98557809fe24878e2c44b4a9b7cb13ba7485\n[2]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle-node/src/worker/fetch.rs#L53\n[3]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle-node/src/worker/fetch.rs#L79\n[4]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle-node/src/worker/fetch.rs#L127\n[5]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage.rs#L700\n[6]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L913\n[7]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L923\n[8]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L887\n[9]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L925\n[10]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle-protocol/src/service.rs#L1138\n[11]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/refs.rs#L294\n[12]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/refs.rs#L282\n[13]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L155\n[14]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L877\n[15]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L883\n[16]: https://radicle.network/nodes/seed.radicle.garden/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/0e5a56f25f51d07290613a9363bd8c0c9fc8e0be/crates/radicle/src/storage/git.rs#L942",
        "base": "0e5a56f25f51d07290613a9363bd8c0c9fc8e0be",
        "oid": "65b67452e78ca848328f64808f438b8f4a825774",
        "timestamp": 1790774514
      }
    ]
  }
}

Send response

{
  "response": "triggered",
  "run_id": {
    "id": "015da70b-4661-4d32-80c0-38732ba7b2c2"
  },
  "info_url": "https://cci.rad.levitte.org//015da70b-4661-4d32-80c0-38732ba7b2c2.html"
}

Checkout the source (in /opt/radcis/ci.rad.levitte.org/cci/state/015da70b-4661-4d32-80c0-38732ba7b2c2/w)

Started at: 2026-09-30 15:22:04.629280+02:00

Commands:

Read the repo configuration (.radicle/native.yaml in /opt/radcis/ci.rad.levitte.org/cci/state/015da70b-4661-4d32-80c0-38732ba7b2c2/w)

shell: 'export RUSTDOCFLAGS=''-D warnings''


  cargo --version

  rustc --version


  cargo fmt --check

  cargo clippy --all-targets --workspace -- --deny warnings

  cargo build --all-targets --workspace

  cargo doc --workspace --no-deps --all-features

  cargo test --workspace --no-fail-fast

  '

Run the script

Commands:

Send result

{
  "response": "finished",
  "result": "failure"
}