Trigger 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": "Updated",
"patch": {
"id": "24e3c53626bd5e1d4a71c188e8d897f47eddbbcb",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"title": "crypto: Rewrite",
"state": {
"status": "open",
"conflicts": []
},
"before": "66ab7f35c933278b932657936ce0c52a02962302",
"after": "f45a96f0e908971d2b0a132a873d2a5bd6875e19",
"commits": [
"f45a96f0e908971d2b0a132a873d2a5bd6875e19",
"df6524e7e21027c4eb128dd2eaab0a6d70a6d76d",
"0fd0104e8771fa7f2bec64216b3668485ff6b324",
"8ceef3c40571809910e4c207f3e55e95f8834490"
],
"target": "66ab7f35c933278b932657936ce0c52a02962302",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "24e3c53626bd5e1d4a71c188e8d897f47eddbbcb",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Reasons for the rewrite:\n - Migrate away from `ec25519` as our implementation of Ed25519,\n because that crate is unmaintained.\n Instead of `ec25519` we use `ed25519-dalek` which is the most popular\n implementation of Ed25519 in Rust.\n - Migrate away from `amplify`, because we make very little use of its\n features. Here, we only use `amplify::Bytes32`, which is just a thin\n wrapper of `[u8; 32]`.\n Instead of `amplify::Bytes32` we use `type PublicKeyBytes = [u8; 32]`.\n\nThe realization that `ExtendedSignature` is not really tied to SSH, but\nis merely a representation of a key together with a signature, allows to\nrelax the bounds on traits in `radicle-cob`.\n\nSeparating out uses of \"public key\" (a rather simple model of a key,\njust 32 bytes) and \"verifying key\" (an actual point on the Edwards\ncurve, ready to verify signatures, using more memory than just 32 bytes)\nallows a more sensible definition of `crypto::Signer`, which propagates\nto `radicle-cob`, `radicle`, `radicle-cli`, `radicle-node` and\nsimplifies trait bounds.\n\nIn `radicle-node`, make the fact clearer that actually the secret key\nitself is required (for our implementation of Diffie-Hellman) not\n\"just\" signing. This results in removal of the generic argument\n(usually called `G`) of multiple types.\n\nConcretizing the types in `radicle-node` this way, i.e. by (morally)\nsetting `G = radicle_crypto::SigningKey`, leads to removal of\n`MemorySigner` and `MockSigner`, as they really just wrap a signing\nkey.\n\nRe-exporting `ed25519::Signature` (via re-export in `ed25519-dalek`)\nis hopefully more future-proof than using our own type for signatures.\nHowever, the fact that `ed25519::Signature` is not serializable and\ndoes not implement `std::hash::Hash` means that we have to resort to\nad-hoc solutions in `radicle`:\n 1. The Identity COB requires serialization of signatures. These are\n generally questionable, since the security of the Identity COB\n should rely on the security of Signed References. In the medium\n term we might even want to consider ignoring signatures in actions.\n 2. When reading Signed References, detection of Replay Attacks uses\n a `HashMap` keyed by signatures. This detection only exists for\n backwards compatibility.\nThese two use cases are exotic enough to warrant ad-hoc implementations.\nBy not wrapping `ed25519::Signature`, we encourage writing more widely\ncompatible code in the future.",
"base": "027de89cdb93f9f08e46ab76ab38c62c4005724a",
"oid": "f8d4ff1fd7fd3110681659a4705bc4d0e2e5a2da",
"timestamp": 1784284925
},
{
"id": "f0c57fd16cfb88f1ca13c46a9ec930b6efb238aa",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Optimize compute-heavy dependencies",
"base": "027de89cdb93f9f08e46ab76ab38c62c4005724a",
"oid": "6ce96910bbb6d33857ce04afe27d17491b15ed7d",
"timestamp": 1784289364
},
{
"id": "ed140d9a6f2a111ea19054aa78bbebc9b5bfd15f",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "REVIEW\n\nA lot of these are nits and clarifications.\n\nHowever, there does seem to be a major problem. When I tried to push a I got test failures in `radicle`:\n\n```\n stdout ───\n\n running 1 test\n test node::sync::announce::test::announcer_reached_min_replication_target ... FAILED\n\n failures:\n\n failures:\n node::sync::announce::test::announcer_reached_min_replication_target\n\n test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 399 filtered out; finished in 0.06s\n \n stderr ───\n\n thread 'node::sync::announce::test::announcer_reached_min_replication_target' (1087202) panicked at crates/radicle/src/node/sync/announce.rs:684:9:\n assertion `left == right` failed\n left: {PublicKey([5, 221, 106, 2, 242, 199, 33, 65, 145, 133, 231, 152, 124, 221, 98, 121, 221, 220, 3, 227, 226, 20, 123, 218, 187, 218, 83, 133, 33, 178, 59, 103]), PublicKey([23, 166, 132, 119, 154, 93, 182, 134, 242, 16, 90, 181, 129, 140, 75, 214, 100, 111, 77, 40, 166, 193, 195, 32, 155, 14, 238, 118, 41, 84, 233, 71]), PublicKey([75, 248, 102, 239, 154, 3, 237, 239, 125, 238, 107, 133, 162, 159, 138, 180, 2, 58, 59, 67, 223, 26, 98, 15, 82, 15, 176, 22, 72, 74, 130, 219]), PublicKey([96, 17, 171, 105, 226, 198, 100, 220, 161, 223, 167, 106, 196, 89, 213, 84, 128, 207, 1, 237, 232, 174, 197, 173, 56, 217, 189, 40, 10, 83, 230, 103]), PublicKey([108, 193, 114, 1, 252, 37, 158, 110, 74, 55, 0, 248, 215, 176, 195, 164, 101, 48, 247, 239, 141, 7, 239, 106, 255, 58, 174, 144, 207, 23, 190, 13]), PublicKey([157, 2, 236, 151, 9, 210, 225, 195, 187, 105, 75, 49, 11, 211, 109, 140, 194, 77, 241, 2, 97, 68, 95, 248, 96, 184, 137, 206, 174, 217, 7, 169]), PublicKey([183, 102, 88, 18, 108, 214, 199, 242, 120, 129, 243, 76, 196, 98, 239, 193, 168, 66, 79, 199, 175, 59, 132, 99, 22, 63, 190, 64, 100, 85, 210, 190]), PublicKey([189, 232, 81, 145, 168, 63, 139, 84, 87, 160, 247, 28, 67, 156, 16, 213, 28, 204, 121, 177, 75, 153, 128, 50, 145, 112, 5, 106, 22, 3, 193, 72])}\n right: {PublicKey([5, 221, 106, 2, 242, 199, 33, 65, 145, 133, 231, 152, 124, 221, 98, 121, 221, 220, 3, 227, 226, 20, 123, 218, 187, 218, 83, 133, 33, 178, 59, 103]), PublicKey([23, 166, 132, 119, 154, 93, 182, 134, 242, 16, 90, 181, 129, 140, 75, 214, 100, 111, 77, 40, 166, 193, 195, 32, 155, 14, 238, 118, 41, 84, 233, 71]), PublicKey([59, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50, 21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41]), PublicKey([75, 248, 102, 239, 154, 3, 237, 239, 125, 238, 107, 133, 162, 159, 138, 180, 2, 58, 59, 67, 223, 26, 98, 15, 82, 15, 176, 22, 72, 74, 130, 219]), PublicKey([96, 17, 171, 105, 226, 198, 100, 220, 161, 223, 167, 106, 196, 89, 213, 84, 128, 207, 1, 237, 232, 174, 197, 173, 56, 217, 189, 40, 10, 83, 230, 103]), PublicKey([108, 193, 114, 1, 252, 37, 158, 110, 74, 55, 0, 248, 215, 176, 195, 164, 101, 48, 247, 239, 141, 7, 239, 106, 255, 58, 174, 144, 207, 23, 190, 13]), PublicKey([157, 2, 236, 151, 9, 210, 225, 195, 187, 105, 75, 49, 11, 211, 109, 140, 194, 77, 241, 2, 97, 68, 95, 248, 96, 184, 137, 206, 174, 217, 7, 169]), PublicKey([183, 102, 88, 18, 108, 214, 199, 242, 120, 129, 243, 76, 196, 98, 239, 193, 168, 66, 79, 199, 175, 59, 132, 99, 22, 63, 190, 64, 100, 85, 210, 190]), PublicKey([189, 232, 81, 145, 168, 63, 139, 84, 87, 160, 247, 28, 67, 156, 16, 213, 28, 204, 121, 177, 75, 153, 128, 50, 145, 112, 5, 106, 22, 3, 193, 72])}\n\n stdout ───\n\n running 1 test\n test node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds ... FAILED\n\n failures:\n\n failures:\n node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds\n\n test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 399 filtered out; finished in 0.04s\n \n stderr ───\n\n thread 'node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds' (1087212) panicked at crates/radicle/src/node/sync/announce.rs:1000:21:\n assertion `left == right` failed: Should succeed with preferred seeds even with zero replication factor\n left: PreferredNodes { preferred: 1, total_nodes_synced: 1 }\n right: PreferredNodes { preferred: 2, total_nodes_synced: 2 }\n```\n\nWhen I reran just the `radicle` tests, I got flakey behaviour with two other tests failing randomly:\n\n```\n stdout ───\n\n running 1 test\n test node::policy::store::test::test_node_aliases ... FAILED\n\n failures:\n\n failures:\n node::policy::store::test::test_node_aliases\n\n test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 396 filtered out; finished in 0.06s\n \n stderr ───\n\n thread 'node::policy::store::test::test_node_aliases' (1115523) panicked at crates/radicle/src/node.rs:1553:9:\n assertion `left == right` failed\n left: Some({PublicKey([12, 112, 75, 77, 19, 96, 38, 134, 98, 141, 230, 13, 191, 16, 6, 101, 198, 62, 95, 184, 134, 54, 54, 163, 177, 47, 254, 215, 192, 216, 85, 24]), PublicKey([34, 60, 233, 140, 45, 106, 150, 104, 75, 232, 227, 240, 199, 87, 107, 242, 128, 46, 157, 26, 159, 100, 54, 74, 113, 201, 232, 242, 96, 237, 160, 39])})\n right: Some({PublicKey([12, 112, 75, 77, 19, 96, 38, 134, 98, 141, 230, 13, 191, 16, 6, 101, 198, 62, 95, 184, 134, 54, 54, 163, 177, 47, 254, 215, 192, 216, 85, 24]), PublicKey([34, 60, 233, 140, 45, 106, 150, 104, 75, 232, 227, 240, 199, 87, 107, 242, 128, 46, 157, 26, 159, 100, 54, 74, 113, 201, 232, 242, 96, 237, 160, 39]), PublicKey([118, 161, 89, 32, 68, 166, 228, 245, 17, 38, 91, 202, 115, 166, 4, 217, 11, 5, 41, 209, 223, 96, 43, 227, 10, 25, 169, 37, 118, 96, 209, 245])})\n\n stdout ───\n\n running 1 test\n test node::sync::announce::test::announcer_adapts_target_to_reach ... FAILED\n\n failures:\n\n failures:\n node::sync::announce::test::announcer_adapts_target_to_reach\n\n test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 396 filtered out; finished in 0.03s\n \n stderr ───\n\n thread 'node::sync::announce::test::announcer_adapts_target_to_reach' (1117345) panicked at crates/radicle/src/node/sync/announce.rs:971:9:\n assertion `left == right` failed\n left: 2\n right: 3\n```",
"base": "66ab7f35c933278b932657936ce0c52a02962302",
"oid": "ee65406246ab44a4455ca9b38a61c8bfd59d385d",
"timestamp": 1784312032
},
{
"id": "eeec57800be24d12bb9c22679fd3cf897e05962b",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Respond to review",
"base": "66ab7f35c933278b932657936ce0c52a02962302",
"oid": "86f08be3d6ee58bed8a356bc645ce46d4888c40d",
"timestamp": 1784326540
},
{
"id": "4b3b41f69fd944cd96dc8a7d991dacd1665f4f4d",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Squash feedback, improve stability of tests.",
"base": "66ab7f35c933278b932657936ce0c52a02962302",
"oid": "9edcb11a1d050b1b6f8e11c265d1359d382870b3",
"timestamp": 1784550902
},
{
"id": "7a7ce40ac4fc5eb4bbc2d3644c358a6efafd9c15",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "REVIEW: Fix to wording of `mod signature` docs",
"base": "66ab7f35c933278b932657936ce0c52a02962302",
"oid": "ff4817213ba216a8d0876f4d6740e76a19002de0",
"timestamp": 1784581344
},
{
"id": "abe7cdf39efb234a545dfd025aa7d333a9c0a52d",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Squash in review, minor fixes.",
"base": "66ab7f35c933278b932657936ce0c52a02962302",
"oid": "f45a96f0e908971d2b0a132a873d2a5bd6875e19",
"timestamp": 1784618373
}
]
}
}