rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodc4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98
{
"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": "7535a1425881289a79dac4dceaa21a9df98435ed",
"author": {
"id": "did:key:z6MkwGoyYxt6A2VE3fvZyH2rgiWdsXHBeV7jm7GSByS2aagA",
"alias": "ade"
},
"title": "policy: change the default scope from 'all' to 'follow'",
"state": {
"status": "open",
"conflicts": []
},
"before": "91eb6fc078727337449c203b8cf54aba4f40d816",
"after": "c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98",
"commits": [
"c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98",
"83d24ea10d2d93197b350db7823f958e2ebdabf6",
"2fa54ebbb17a5b0a7d4f5ef4d652091372efc061",
"53eb52fed3c928416b47bb5478d793c28cd0947c"
],
"target": "91eb6fc078727337449c203b8cf54aba4f40d816",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "7535a1425881289a79dac4dceaa21a9df98435ed",
"author": {
"id": "did:key:z6MkwGoyYxt6A2VE3fvZyH2rgiWdsXHBeV7jm7GSByS2aagA",
"alias": "ade"
},
"description": "As per the [Security > Issue with default value for Scope being All](https://radicle.zulipchat.com/#narrow/channel/498262-Security/topic/Issue.20with.20default.20value.20for.20Scope.20being.20All) zulip conversation. Change the default scope for cloned, seeded and newly initialised repositories from 'all' to 'follow'.",
"base": "91eb6fc078727337449c203b8cf54aba4f40d816",
"oid": "c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98",
"timestamp": 1769532387
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "5794277c-2eb5-4c22-8e50-03b9c3f455ad"
},
"info_url": "https://cci.rad.levitte.org//5794277c-2eb5-4c22-8e50-03b9c3f455ad.html"
}
Started at: 2026-01-27 17:46:29.890937+01:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/5794277c-2eb5-4c22-8e50-03b9c3f455ad/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 136 issues · 18 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 7535a1425881289a79dac4dceaa21a9df98435ed
✓ Switched to branch patch/7535a14 at revision 7535a14
✓ Branch patch/7535a14 setup to track rad/patches/7535a1425881289a79dac4dceaa21a9df98435ed
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98
HEAD is now at c4b43cc3 protocol: note on peering and fetches
Exit code: 0
$ rad patch show 7535a1425881289a79dac4dceaa21a9df98435ed -p
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Title policy: change the default scope from 'all' to 'follow' │
│ Patch 7535a1425881289a79dac4dceaa21a9df98435ed │
│ Author ade z6MkwGo…yS2aagA │
│ Head c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98 │
│ Base 91eb6fc078727337449c203b8cf54aba4f40d816 │
│ Branches patch/7535a14 │
│ Commits ahead 4, behind 0 │
│ Status open │
│ │
│ As per the [Security > Issue with default value for Scope being │
│ All](https://radicle.zulipchat.com/#narrow/channel/498262-Security/topic/Issue.20with.20default.20value.20for.20Scope.20being.20All) │
│ zulip conversation. Change the default scope for cloned, seeded and newly │
│ initialised repositories from 'all' to 'follow'. │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ c4b43cc protocol: note on peering and fetches │
│ 83d24ea radicle/policy: changed the default scope from all to followed │
│ 2fa54eb cli: do not print scope in block table │
│ 53eb52f fetch: change ordering of rad/id resolution │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 7535a14 @ c4b43cc by ade z6MkwGo…yS2aagA 4 seconds ago │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
commit c4b43cc3c94c0f6d354f1d8ad9ca25a941c3bd98
Author: Adrian Duke <adrian.duke@gmail.com>
Date: Tue Jan 27 16:30:42 2026 +0000
protocol: note on peering and fetches
As part of the work to change the default scope, one of the tests
surfaced an issue where the topology was Alice <--> Bob <--> Eve,
however because of the previous 'all' scope Alice could receive Eve
references via Bob, but since the scope was changed to 'follow' Alice
would need to have a direct connection to Eve. TODO left here for future
consideration.
diff --git a/crates/radicle-protocol/src/service.rs b/crates/radicle-protocol/src/service.rs
index b36c5e957..d295cbfd1 100644
--- a/crates/radicle-protocol/src/service.rs
+++ b/crates/radicle-protocol/src/service.rs
@@ -1723,6 +1723,13 @@ where
// Refs can be relayed by peers who don't have the data in storage,
// therefore we only check whether we are connected to the *announcer*,
// which is required by the protocol to only announce refs it has.
+ //
+ // TODO(Ade): Perhaps it makes sense in a more peer-to-peer arrangement
+ // to establish connections to peers whom you follow but aren't directly connected
+ // to. E.g. Alice <--> Bob <--> Eve
+ // Alice follows Eve, Eve announces refs of interest but because Alice
+ // is not directly connected she cant see said refs if Bob isn't also interested in
+ // Eve's refs.
let Some(remote) = self.sessions.get(announcer).cloned() else {
trace!(
target: "service",
commit 83d24ea10d2d93197b350db7823f958e2ebdabf6
Author: Adrian Duke <adrian.duke@gmail.com>
Date: Tue Jan 27 16:27:34 2026 +0000
radicle/policy: changed the default scope from all to followed
The previous implementation used 'all' as the default for scope, this
could lead to surprising behaviour where a user would fetch all
references for cloned, seeded and newly initialised repositories.
Instead have a progressive, safe by default value - where it fetches
only 'followed' references. Later a user can decide to set the scope to
'all'.
diff --git a/crates/radicle-cli/examples/rad-clone-connect.md b/crates/radicle-cli/examples/rad-clone-connect.md
index 169ede975..f6566a1b1 100644
--- a/crates/radicle-cli/examples/rad-clone-connect.md
+++ b/crates/radicle-cli/examples/rad-clone-connect.md
@@ -3,7 +3,7 @@ automatically connect to the necessary seeds.
```
$ rad clone rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
-✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all'
+✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from the network, found 2 potential seed(s).
✓ Target met: 1 seed(s)
✓ Creating checkout in ./heartwood..
diff --git a/crates/radicle-cli/examples/rad-clone-partial-fail.md b/crates/radicle-cli/examples/rad-clone-partial-fail.md
index d16cc0407..56f6bed4c 100644
--- a/crates/radicle-cli/examples/rad-clone-partial-fail.md
+++ b/crates/radicle-cli/examples/rad-clone-partial-fail.md
@@ -10,12 +10,13 @@ $ rad node routing
│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk │
╰──────────────────────────────────────────────────────────────────────────────────────╯
```
+
When she tries to clone, one of those will fail to fetch. But the clone command
still returns successfully.
```
$ rad clone rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --timeout 3
-✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all'
+✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from the network, found 3 potential seed(s).
✓ Target met: 1 seed(s)
✓ Creating checkout in ./heartwood..
diff --git a/crates/radicle-cli/examples/rad-clone.md b/crates/radicle-cli/examples/rad-clone.md
index 7eab6124b..543d49aba 100644
--- a/crates/radicle-cli/examples/rad-clone.md
+++ b/crates/radicle-cli/examples/rad-clone.md
@@ -2,7 +2,7 @@ To create a local copy of a repository on the radicle network, we use the
`clone` command, followed by the identifier or *RID* of the repository:
```
-$ rad clone rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --scope followed
+$ rad clone rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from the network, found [..] potential seed(s).
✓ Target met: [..] seed(s)
diff --git a/crates/radicle-cli/examples/rad-fetch.md b/crates/radicle-cli/examples/rad-fetch.md
index 43a359868..89a4dd783 100644
--- a/crates/radicle-cli/examples/rad-fetch.md
+++ b/crates/radicle-cli/examples/rad-fetch.md
@@ -10,7 +10,7 @@ have to update our seeding policy for the project.
```
$ rad seed rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --no-fetch
-✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all'
+✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
```
Now that the project is seeding we can fetch it and we will have it in
diff --git a/crates/radicle-cli/examples/rad-id-threshold.md b/crates/radicle-cli/examples/rad-id-threshold.md
index 924a90053..06a6c85bd 100644
--- a/crates/radicle-cli/examples/rad-id-threshold.md
+++ b/crates/radicle-cli/examples/rad-id-threshold.md
@@ -170,7 +170,7 @@ sync` and fetch his references:
``` ~bob
$ rad clone rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
-✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all'
+✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from the network, found 2 potential seed(s).
✓ Target met: 1 seed(s)
✓ Creating checkout in ./heartwood..
diff --git a/crates/radicle-cli/examples/rad-init-no-seed.md b/crates/radicle-cli/examples/rad-init-no-seed.md
index 03176c77f..8163f07df 100644
--- a/crates/radicle-cli/examples/rad-init-no-seed.md
+++ b/crates/radicle-cli/examples/rad-init-no-seed.md
@@ -21,7 +21,7 @@ If we then seed it, it becomes advertised in our inventory:
```
$ rad seed rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK
✓ Inventory updated with rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK
-✓ Seeding policy updated for rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK with scope 'all'
+✓ Seeding policy updated for rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK with scope 'followed'
```
```
$ rad node inventory
diff --git a/crates/radicle-cli/examples/rad-init-private-clone-seed.md b/crates/radicle-cli/examples/rad-init-private-clone-seed.md
index 5c5685f96..7d92732e4 100644
--- a/crates/radicle-cli/examples/rad-init-private-clone-seed.md
+++ b/crates/radicle-cli/examples/rad-init-private-clone-seed.md
@@ -30,7 +30,7 @@ $ rad inspect --identity
``` ~bob
$ rad ls --all --private
$ rad clone rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu --seed z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi --timeout 1
-✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'all'
+✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'followed'
Fetching rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu from the network, found 1 potential seed(s).
✓ Target met: 1 preferred seed(s).
✓ Creating checkout in ./heartwood..
@@ -49,7 +49,7 @@ We can also use `rad seed` to seed and fetch without creating a checkout.
``` ~bob
$ rad seed rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu --from z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi --timeout 1
-✓ Seeding policy exists for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'all'
+✓ Seeding policy exists for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'followed'
Fetching rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu from the network, found 1 potential seed(s).
✓ Target met: 1 seed(s)
```
diff --git a/crates/radicle-cli/examples/rad-init-private-clone.md b/crates/radicle-cli/examples/rad-init-private-clone.md
index 852538d95..bb0c0d77b 100644
--- a/crates/radicle-cli/examples/rad-init-private-clone.md
+++ b/crates/radicle-cli/examples/rad-init-private-clone.md
@@ -6,7 +6,7 @@ $ rad ls
```
``` ~bob (fail)
$ rad clone rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu --seed z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi --timeout 1
-✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'all'
+✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'followed'
Fetching rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu from the network, found 1 potential seed(s).
✗ Target not met: could not fetch from [z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi], and required 1 more seed(s)
! Warning: Failed to fetch from 1 seed(s).
diff --git a/crates/radicle-cli/examples/rad-init-private-no-seed.md b/crates/radicle-cli/examples/rad-init-private-no-seed.md
index 9b3bd246b..2250e8448 100644
--- a/crates/radicle-cli/examples/rad-init-private-no-seed.md
+++ b/crates/radicle-cli/examples/rad-init-private-no-seed.md
@@ -28,7 +28,7 @@ We can decide to seed it later, so that others can fetch it from us, given
that they are part of the allow list:
```
$ rad seed rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu
-✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'all'
+✓ Seeding policy updated for rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu with scope 'followed'
```
But it still won't show up in our inventory, since it's private:
diff --git a/crates/radicle-cli/examples/rad-node.md b/crates/radicle-cli/examples/rad-node.md
index 3be1ef596..c6d44d23d 100644
--- a/crates/radicle-cli/examples/rad-node.md
+++ b/crates/radicle-cli/examples/rad-node.md
@@ -108,7 +108,7 @@ up in our inventory:
```
$ rad seed rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
✓ Inventory updated with rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
-✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all'
+✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
$ rad node inventory
rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji
```
diff --git a/crates/radicle-cli/examples/rad-patch-pull-update.md b/crates/radicle-cli/examples/rad-patch-pull-update.md
index fefcee864..e5f37ec2e 100644
--- a/crates/radicle-cli/examples/rad-patch-pull-update.md
+++ b/crates/radicle-cli/examples/rad-patch-pull-update.md
@@ -22,7 +22,7 @@ To push changes, run `git push`.
``` ~bob
$ rad clone rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK
-✓ Seeding policy updated for rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK with scope 'all'
+✓ Seeding policy updated for rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK with scope 'followed'
Fetching rad:zhbMU4DUXrzB8xT6qAJh6yZ7bFMK from the network, found 1 potential seed(s).
✓ Target met: 1 seed(s)
✓ Creating checkout in ./heartwood..
diff --git a/crates/radicle-cli/examples/rad-seed-many.md b/crates/radicle-cli/examples/rad-seed-many.md
index 4880b059c..96e946e05 100644
--- a/crates/radicle-cli/examples/rad-seed-many.md
+++ b/crates/radicle-cli/examples/rad-seed-many.md
@@ -4,10 +4,10 @@ is used):
```
$ rad seed rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW rad:z3zTnCfi6cVSZG8eCGn6AMDypgAPm
-✓ Seeding policy updated for rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW with scope 'all'
+✓ Seeding policy updated for rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW with scope 'followed'
Fetching rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW from the network, found 1 potential seed(s).
✓ Target met: 1 seed(s)
-✓ Seeding policy updated for rad:z3zTnCfi6cVSZG8eCGn6AMDypgAPm with scope 'all'
+✓ Seeding policy updated for rad:z3zTnCfi6cVSZG8eCGn6AMDypgAPm with scope 'followed'
Fetching rad:z3zTnCfi6cVSZG8eCGn6AMDypgAPm from the network, found 1 potential seed(s).
✓ Target met: 1 seed(s)
```
diff --git a/crates/radicle-cli/examples/rad-sync-without-node.md b/crates/radicle-cli/examples/rad-sync-without-node.md
index e7ed81801..cb80789c3 100644
--- a/crates/radicle-cli/examples/rad-sync-without-node.md
+++ b/crates/radicle-cli/examples/rad-sync-without-node.md
@@ -14,5 +14,5 @@ Note that seeding works fine without a running node:
``` ~alice
$ rad seed rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
-✓ Seeding policy updated for rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 with scope 'all'
+✓ Seeding policy updated for rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 with scope 'followed'
```
diff --git a/crates/radicle-cli/examples/rad-sync.md b/crates/radicle-cli/examples/rad-sync.md
index 43d861837..f90cd35da 100644
--- a/crates/radicle-cli/examples/rad-sync.md
+++ b/crates/radicle-cli/examples/rad-sync.md
@@ -107,7 +107,7 @@ It's also possible to receive an error if a repository is not found anywhere.
```
$ rad seed rad:z39mP9rQAaGmERfUMPULfPUi473tY --no-fetch
-✓ Seeding policy updated for rad:z39mP9rQAaGmERfUMPULfPUi473tY with scope 'all'
+✓ Seeding policy updated for rad:z39mP9rQAaGmERfUMPULfPUi473tY with scope 'followed'
```
``` (fail)
$ rad sync rad:z39mP9rQAaGmERfUMPULfPUi473tY
diff --git a/crates/radicle-cli/src/commands/clone/args.rs b/crates/radicle-cli/src/commands/clone/args.rs
index 0c763bfed..21f12ed58 100644
--- a/crates/radicle-cli/src/commands/clone/args.rs
+++ b/crates/radicle-cli/src/commands/clone/args.rs
@@ -62,7 +62,7 @@ pub struct Args {
/// Follow scope
#[arg(
long,
- default_value_t = Scope::All,
+ default_value_t,
value_parser = terminal::args::ScopeParser
)]
pub(super) scope: Scope,
diff --git a/crates/radicle-cli/src/commands/seed/args.rs b/crates/radicle-cli/src/commands/seed/args.rs
index e654d1c2e..8eaccbdc7 100644
--- a/crates/radicle-cli/src/commands/seed/args.rs
+++ b/crates/radicle-cli/src/commands/seed/args.rs
@@ -49,7 +49,7 @@ pub struct Args {
/// Peer follow scope for this repository
#[arg(
long,
- default_value_t = Scope::All,
+ default_value_t,
value_parser = terminal::args::ScopeParser
)]
pub(super) scope: Scope,
diff --git a/crates/radicle-cli/tests/commands.rs b/crates/radicle-cli/tests/commands.rs
index 73f0638a7..8c4df0668 100644
--- a/crates/radicle-cli/tests/commands.rs
+++ b/crates/radicle-cli/tests/commands.rs
@@ -572,6 +572,7 @@ fn rad_id_multi_delegate() {
alice.handle.seed(acme, Scope::All).unwrap();
bob.handle.follow(eve.id, None).unwrap();
+ eve.handle.follow(bob.id, None).unwrap();
alice.connect(&bob).converge([&bob]);
eve.connect(&alice).converge([&alice]);
@@ -2059,17 +2060,19 @@ fn rad_remote() {
.handle
.follow(bob.id, Some(Alias::new("bob")))
.unwrap();
+ alice
+ .handle
+ .follow(eve.id, Some(Alias::new("eve")))
+ .unwrap();
bob.connect(&alice);
bob.routes_to(&[(rid, alice.id)]);
bob.fork(rid, bob.home.path()).unwrap();
- bob.announce(rid, 2, bob.home.path()).unwrap();
alice.has_remote_of(&rid, &bob.id);
- eve.connect(&bob);
+ eve.connect(&alice);
eve.routes_to(&[(rid, alice.id)]);
eve.fork(rid, eve.home.path()).unwrap();
- eve.announce(rid, 2, eve.home.path()).unwrap();
alice.has_remote_of(&rid, &eve.id);
test(
diff --git a/crates/radicle/src/node/policy.rs b/crates/radicle/src/node/policy.rs
index 029a1c98a..eef4f1128 100644
--- a/crates/radicle/src/node/policy.rs
+++ b/crates/radicle/src/node/policy.rs
@@ -162,9 +162,9 @@ impl TryFrom<&sqlite::Value> for Policy {
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub enum Scope {
/// Seed remotes that are explicitly followed.
+ #[default]
Followed,
/// Seed all remotes.
- #[default]
All,
}
commit 2fa54ebbb17a5b0a7d4f5ef4d652091372efc061
Author: Adrian Duke <adrian.duke@gmail.com>
Date: Tue Jan 27 16:19:34 2026 +0000
cli: do not print scope in block table
Previous implementation used the default scope when a scope wasn't
present. Scope is not present when the policy is block, because block
doesn't have a scope. Instead use an empty string when printing the
block policy.
diff --git a/crates/radicle-cli/examples/rad-block.md b/crates/radicle-cli/examples/rad-block.md
index 413350273..a29630cda 100644
--- a/crates/radicle-cli/examples/rad-block.md
+++ b/crates/radicle-cli/examples/rad-block.md
@@ -38,7 +38,7 @@ $ rad seed
╭───────────────────────────────────────────────────────────╮
│ Repository Name Policy Scope │
├───────────────────────────────────────────────────────────┤
-│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji block all │
+│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji block │
╰───────────────────────────────────────────────────────────╯
```
diff --git a/crates/radicle-cli/src/commands/seed.rs b/crates/radicle-cli/src/commands/seed.rs
index 7482a8354..edc311490 100644
--- a/crates/radicle-cli/src/commands/seed.rs
+++ b/crates/radicle-cli/src/commands/seed.rs
@@ -84,7 +84,9 @@ pub fn seeding(profile: &Profile) -> anyhow::Result<()> {
.repository(rid)
.and_then(|repo| repo.project().map(|proj| proj.name().to_string()))
.unwrap_or_default();
- let scope = policy.scope().unwrap_or_default().to_string();
+ let scope = policy
+ .scope()
+ .map_or(String::new(), |scope| scope.to_string());
let policy = term::format::policy(&Policy::from(policy));
t.push([
commit 53eb52fed3c928416b47bb5478d793c28cd0947c
Author: Adrian Duke <adrian.duke@gmail.com>
Date: Tue Jan 27 16:18:26 2026 +0000
fetch: change ordering of rad/id resolution
The cached_tip represents the rad/id fetched from the other node. This
should be checked first to ensure that newer updates to the identity
document are used, as opposed to the possibly old state of the document.
diff --git a/crates/radicle-fetch/src/state.rs b/crates/radicle-fetch/src/state.rs
index 42469ab5e..2ae82eeb5 100644
--- a/crates/radicle-fetch/src/state.rs
+++ b/crates/radicle-fetch/src/state.rs
@@ -641,7 +641,8 @@ where
let tip = self.refname_to_id(refs::REFS_RAD_ID.clone())?;
let cached_tip = self.canonical_rad_id();
- tip.or(cached_tip)
+ cached_tip
+ .or(tip)
.map(|tip| self.verified(tip).map_err(error::Canonical::from))
.transpose()
}
Exit code: 0
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 '
Commands:
$ podman run --name 5794277c-2eb5-4c22-8e50-03b9c3f455ad -v /opt/radcis/ci.rad.levitte.org/cci/state/5794277c-2eb5-4c22-8e50-03b9c3f455ad/s:/5794277c-2eb5-4c22-8e50-03b9c3f455ad/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/5794277c-2eb5-4c22-8e50-03b9c3f455ad/w:/5794277c-2eb5-4c22-8e50-03b9c3f455ad/w -w /5794277c-2eb5-4c22-8e50-03b9c3f455ad/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /5794277c-2eb5-4c22-8e50-03b9c3f455ad/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
Diff in /5794277c-2eb5-4c22-8e50-03b9c3f455ad/w/crates/radicle-protocol/src/service.rs:221:
SelfConnection,
#[error("outbound connection limit reached when attempting {nid} ({addr})")]
LimitReached { nid: NodeId, addr: Address },
- #[error("attempted connection to {nid}, via {addr} but addresses of this kind are not supported")]
+ #[error(
+ "attempted connection to {nid}, via {addr} but addresses of this kind are not supported"
+ )]
UnsupportedAddress { nid: NodeId, addr: Address },
}
Exit code: 1
{
"response": "finished",
"result": "failure"
}