CCI report: 513337bd-739c-4798-a728-cf4b3019ce97

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:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
      "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
      "did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
      "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
    ]
  },
  "action": "Created",
  "patch": {
    "id": "afbed8b741c45ac08c71c55c805dd2c1af99b1d8",
    "author": {
      "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
      "alias": "lorenz"
    },
    "title": "radicle: the great Canonical rewrite",
    "state": {
      "status": "open",
      "conflicts": []
    },
    "before": "a568e7f4848729ca02d5d5373dfacba289658493",
    "after": "b155828c29a819435b1d494d4ab4cccaa4df6b71",
    "commits": [
      "b155828c29a819435b1d494d4ab4cccaa4df6b71",
      "d9e62b75d478d222984bc8560f35907f383a9f0b",
      "d73d0895777097be18d131ee0166ad04f9338699",
      "bc50f5ab7bcf00800ab627c824bbbd3b9e1d6ba6",
      "f33c46dd82fb153dba6d679b7a3b84865bd9de73",
      "2265a61c41aee8273fb7a593e81850e863cc7b53",
      "92b03f1690f43dc73838f9adf34a4e6cd06eecf9",
      "bf0630bf6bbc9745e50c5d37a0603b63414394c6",
      "6510d0865df63311f19fd0c4a7e3449fcfbb0a2c",
      "05354e81a44dfc75677c30e0745e93c04f17f8f5",
      "149073b56648d3bf60c63603e22660bccfc3727b",
      "99c502732f770de71f0b24ee1470e0590486e06b",
      "ace14b9758be8e88210e02418a1c9e97057f43a1"
    ],
    "target": "a568e7f4848729ca02d5d5373dfacba289658493",
    "labels": [],
    "assignees": [],
    "revisions": [
      {
        "id": "afbed8b741c45ac08c71c55c805dd2c1af99b1d8",
        "author": {
          "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
          "alias": "lorenz"
        },
        "description": "This change was inspired by the a story as old as time:\n\n    \ud835\udd43\ud835\udd56\ud835\udd65 \ud835\udd66\ud835\udd64 \ud835\udd5e\ud835\udd5a\ud835\udd69 \ud835\udd60\ud835\udd66\ud835\udd63 \ud835\udd53\ud835\udd66\ud835\udd64\ud835\udd5a\ud835\udd5f\ud835\udd56\ud835\udd64\ud835\udd64 \ud835\udd5d\ud835\udd60\ud835\udd58\ud835\udd5a\ud835\udd54 \ud835\udd68\ud835\udd5a\ud835\udd65\ud835\udd59 \ud835\udd60\ud835\udd66\ud835\udd63 \ud835\udd40\ud835\udd46!\n\nIt was motivated by the fact that the canonical quorum logic was spread across\ntwo modules and also two different repositories (in the API sense). The\n`radicle-remote-helper` contained special logic for computing the quorum, and\nalso relied on the logic with `radicle` itself. It would also mix using the\nRadicle storage repository and the working copy repository \u2013 resulting in issues\nwhere objects could exist in one and not the other.\n\nThe change begins by separating away the IO away from any of the business logic\nin the `git::canonical` module. To follow along, there are two important submodules:\n\n1. `voting` captures the different type of voting processes for commits and tags\n\ta. Tags are simple, where one `Oid` means one vote\n\tb. Commits are slightly more complicated. They begin with one `Oid` means one\n     vote, but then it is expected that merge bases are calculated for pairs of\n     commits. These merge bases are used to increase a vote for an `Oid` if it\n     is the merge base of another commit.\n2. `quorum` builds on top of `voting` and uses the voting processes as well as\nthe `threshold` to find the quorum for the tag or commit reference.\n\ta. For tags, the first past the threshold wins, but if multiple pass then it\n     is an error.\n\tb. For commits, the merge base process should be used to increase the votes,\n     until the caller is ready to find the quorum. At this point, the commits\n     that pass the `threshold` are then compared to find the commit that is the\n     child-most commit of all other candidates. If they diverge, then an error\n     is returned.\n\nThere is also a `convergence` module that captures the logic that is required\nfor the `radicle-remote-helper`. It essentially checks if a candidate object\nmatches the expected objects, tags or commits, and performs the necessary\nconvergence logic \u2013 checking that the candidate commit is converging with\nat least of the other `Did`s.\n\nThese two quorum processes, and the convergence process, essentially act as\nstate machines and can be driven by the use of a Git repository for finding the\nmerge bases. This is where the `effects` module comes in. The `effects` capture\nthe necessary traits that are required to drive the state machines of the quorum\nprocesses. It is expected that a Git repository implements these, and in fact, a\n`git2::Repository` implementation is provided. The traits are useful, since it\nmeans that a `git2::Repository` can be swapped out and the logic would stay the\nsame.\n\nThis all culminates into the new and improved `Canonical` and\n`CanonicalWithConvergence`. Both of which have methods `find_quorum` for\nperforming the quorum process using a *single* provided repository.\n\nThis resulted in the semantic change of requiring that the\n`radicle-remote-helper` pushes the candidate commit, irregardless of whether it\nwill be a fast-forward. For now, this is something that will be accepted while\nthe UX can be improved in the future by providing detailed warnings of the\ndivergence and ways to fix it. The benefit is that the tooling will never stop\nsomeone from diverging if that is in fact what they want to do.",
        "base": "7a9d4512f99156681ca879e0794a6ade154af33b",
        "oid": "7346d737188d23150ddc5f4ecec11e596ec28b75",
        "timestamp": 1754503567
      },
      {
        "id": "d04ac96aaa9c85b62257d732c348f80ea4733227",
        "author": {
          "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
          "alias": "lorenz"
        },
        "description": "Changes:\n- Removed extra newline",
        "base": "7a9d4512f99156681ca879e0794a6ade154af33b",
        "oid": "b413ece6d33a5864ecfe07696e221fdae75a3f5c",
        "timestamp": 1754905210
      },
      {
        "id": "37941020cdf30eecc3d1560bebe5e5029f9c5089",
        "author": {
          "id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
          "alias": "lorenz"
        },
        "description": "Review",
        "base": "a568e7f4848729ca02d5d5373dfacba289658493",
        "oid": "b155828c29a819435b1d494d4ab4cccaa4df6b71",
        "timestamp": 1756135764
      }
    ]
  }
}

Send response

{
  "response": "triggered",
  "run_id": {
    "id": "513337bd-739c-4798-a728-cf4b3019ce97"
  },
  "info_url": "https://cci.rad.levitte.org//513337bd-739c-4798-a728-cf4b3019ce97.html"
}

Checkout the source (in /opt/radcis/ci.rad.levitte.org/cci/state/513337bd-739c-4798-a728-cf4b3019ce97/w)

Started at: 2025-08-25 17:29:48.856392+02:00

Commands:

Read the repo configuration (.radicle/native.yaml in /opt/radcis/ci.rad.levitte.org/cci/state/513337bd-739c-4798-a728-cf4b3019ce97/w)

shell: 'cargo --version

  rustc --version


  cargo fmt --check

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

  cargo build --all-targets --workspace

  cargo doc --workspace --no-deps

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

  '

Run the script

Commands:

Send result

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