From 947f5dd4b1b78cf46190983a0496073d36beb2d2 Mon Sep 17 00:00:00 2001 From: schickling-assistant <261620128+schickling-assistant@users.noreply.github.com> Date: Sun, 1 Nov 2026 19:20:10 +0100 Subject: [PATCH 1/3] Rename Fabric adapter binary with legacy package bridge agent-identity: agent/dotfiles/fabric-mesh agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: anthropic/claude-opus-5-5 --- crates/fractal-fabric-adapter/Cargo.toml | 2 +- crates/fractal/src/fleet_cli.rs | 4 ++-- crates/smallclaims/src/fleet/join.rs | 4 ++-- flake.nix | 15 ++++++++++----- release-notes/fractal-fabric-adapter-binary.json | 11 +++++++++++ 5 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 release-notes/fractal-fabric-adapter-binary.json diff --git a/crates/fractal-fabric-adapter/Cargo.toml b/crates/fractal-fabric-adapter/Cargo.toml index 6a4f3d8ec20..284262ef108 100644 --- a/crates/fractal-fabric-adapter/Cargo.toml +++ b/crates/fractal-fabric-adapter/Cargo.toml @@ -21,5 +21,5 @@ tokio = { version = "1", features = ["io-util", "macros", "net", "rt", "signal", tempfile = "3" [[bin]] -name = "st-fabric-adapter" +name = "fractal-fabric-adapter" path = "src/main.rs" diff --git a/crates/fractal/src/fleet_cli.rs b/crates/fractal/src/fleet_cli.rs index 73e4476bd13..41a22695ded 100644 --- a/crates/fractal/src/fleet_cli.rs +++ b/crates/fractal/src/fleet_cli.rs @@ -124,7 +124,7 @@ fn read_code_without_echo() -> Result { Ok(line.trim().to_owned()) } -const FABRIC_PAIRING_UNAVAILABLE: &str = "Fabric invitations need st-fabric-adapter installed and \ +const FABRIC_PAIRING_UNAVAILABLE: &str = "Fabric invitations need fractal-fabric-adapter installed and \ Fabric running with --runtime-peers; use --via tailscale for a Tailscale-only invitation"; /// A configured path that is not a file counts as no helper, so `auto` invitations @@ -497,7 +497,7 @@ async fn bootstrap_fabric_invite( let output = child.wait_with_output().await?; anyhow::ensure!( output.status.success(), - "Fabric pairing failed; it needs st-fabric-adapter running on this machine and Fabric \ + "Fabric pairing failed; it needs fractal-fabric-adapter running on this machine and Fabric \ running with --runtime-peers" ); #[derive(serde::Deserialize)] diff --git a/crates/smallclaims/src/fleet/join.rs b/crates/smallclaims/src/fleet/join.rs index f914a1af940..600990d4165 100644 --- a/crates/smallclaims/src/fleet/join.rs +++ b/crates/smallclaims/src/fleet/join.rs @@ -532,7 +532,7 @@ impl PairingHelper { Some(path) => Some(path.to_path_buf()), None => resolve_fabric_adapter()?, } - .context("st-fabric-adapter is unavailable; install it alongside st or set ST_FABRIC_ADAPTER")?; + .context("fractal-fabric-adapter is unavailable; install it alongside fractal or set FRACTAL_FABRIC_ADAPTER")?; let mut child = tokio::process::Command::new(executable) .arg(command) .stdin(Stdio::piped()) @@ -540,7 +540,7 @@ impl PairingHelper { .stderr(Stdio::inherit()) .kill_on_drop(true) .spawn() - .with_context(|| format!("start st-fabric-adapter {command}"))?; + .with_context(|| format!("start fractal-fabric-adapter {command}"))?; let input = child.stdin.take().context("open adapter input")?; let output = tokio::io::BufReader::new(child.stdout.take().context("open adapter output")?).lines(); Ok(Self { child, input, output }) diff --git a/flake.nix b/flake.nix index 0c8ff945084..2b355f4a2d0 100644 --- a/flake.nix +++ b/flake.nix @@ -735,19 +735,23 @@ }; }; - stFabricAdapter = pkgs.rustPlatform.buildRustPackage { - pname = "st-fabric-adapter"; + fractalFabricAdapter = pkgs.rustPlatform.buildRustPackage { + pname = "fractal-fabric-adapter"; inherit version cargoDeps; src = self; - cargoBuildFlags = [ "-p" "fractal-fabric-adapter" "--bin" "st-fabric-adapter" ]; + cargoBuildFlags = [ "-p" "fractal-fabric-adapter" "--bin" "fractal-fabric-adapter" ]; nativeBuildInputs = pkgs.lib.optionals pkgs.stdenv.hostPlatform.isLinux [ pkgs.mold ]; # The shared daemon check runs the adapter's Rust tests. doCheck = false; + # One-release bridge for pinned consumers of the old package and binary. + postInstall = '' + ln -s fractal-fabric-adapter "$out/bin/st-fabric-adapter" + ''; meta = { description = "External Fractal fleet to Fabric runtime-peers adapter"; homepage = "https://github.com/compoundingtech/fractal"; license = pkgs.lib.licenses.mit; - mainProgram = "st-fabric-adapter"; + mainProgram = "fractal-fabric-adapter"; }; }; @@ -1100,7 +1104,8 @@ packages.fractal-web = fractalWeb; packages.fractal = fractal; packages.st-chatgpt = stChatgpt; - packages.st-fabric-adapter = stFabricAdapter; + packages.fractal-fabric-adapter = fractalFabricAdapter; + packages.st-fabric-adapter = fractalFabricAdapter; # Isolated bootstrap/live proofs use the exact pairing API revision. packages.fabric-pairing = fabric.packages.${system}.default; packages.st3-migrate = st3; diff --git a/release-notes/fractal-fabric-adapter-binary.json b/release-notes/fractal-fabric-adapter-binary.json new file mode 100644 index 00000000000..a9d20948cde --- /dev/null +++ b/release-notes/fractal-fabric-adapter-binary.json @@ -0,0 +1,11 @@ +{ + "version": 1, + "summary": "Publish the Fabric adapter as fractal-fabric-adapter with an old-name package and executable bridge", + "replay": {"status": "none", "detail": "No claim replay or recovery behavior changes."}, + "schema": {"status": "none", "detail": "No schema or stored-state changes."}, + "rules": {"status": "none", "detail": "No checkpoint rules or digest changes."}, + "compatibility": {"status": "changed", "detail": "The primary Nix output and Cargo binary are fractal-fabric-adapter. For one release, packages.st-fabric-adapter refers to the same package and bin/st-fabric-adapter is a relative symlink to bin/fractal-fabric-adapter. Discovery accepts both names, preferring the new name within each searched directory."}, + "downtime": {"status": "none", "detail": "No service, host or runtime changes."}, + "manual": {"status": "none", "detail": "Existing Nix consumers can keep using the old package attribute and binary path during the bridge. Cargo users select --bin fractal-fabric-adapter."}, + "recovery": {"status": "none", "detail": "Identity, adapter journals and state paths are unchanged."} +} From 7505c98e0f25d01d5ace9fd02c0475e813ff0c0a Mon Sep 17 00:00:00 2001 From: schickling-assistant <261620128+schickling-assistant@users.noreply.github.com> Date: Sun, 1 Nov 2026 21:38:58 +0100 Subject: [PATCH 2/3] Update Fabric adapter diagnostic test and installation docs agent-identity: agent/dotfiles/fabric-mesh agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: anthropic/claude-opus-5-5 --- crates/fractal/tests/fleet.rs | 2 +- docs/fleet-join.md | 13 ++++++++----- docs/site/guides/two-machines.md | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/fractal/tests/fleet.rs b/crates/fractal/tests/fleet.rs index a4a93911888..e81e31f1b3d 100644 --- a/crates/fractal/tests/fleet.rs +++ b/crates/fractal/tests/fleet.rs @@ -4633,7 +4633,7 @@ async fn an_invitation_only_fabric_could_carry_fails_before_it_exists() { assert!(!output.status.success(), "{delivery:?} succeeded"); let stderr = String::from_utf8_lossy(&output.stderr); assert!( - stderr.contains("Fabric invitations need st-fabric-adapter installed"), + stderr.contains("Fabric invitations need fractal-fabric-adapter installed"), "{delivery:?}: {stderr}" ); assert!(output.stdout.is_empty(), "{delivery:?} printed a code"); diff --git a/docs/fleet-join.md b/docs/fleet-join.md index 1415dbcb8a5..79dced68509 100644 --- a/docs/fleet-join.md +++ b/docs/fleet-join.md @@ -247,9 +247,9 @@ allow the peer port. See [Tailscale](st3/tailscale.md) for setup. ### Fabric -Run Fabric with `--runtime-peers` and install the external `st-fabric-adapter` on -both machines. Keep the adapter running on the sponsor. No prior peer trust is -needed: +Run Fabric with `--runtime-peers` and install the external `fractal-fabric-adapter` on +both machines. The old executable name `st-fabric-adapter` is still accepted. +Keep the adapter running on the sponsor. No prior peer trust is needed: ```sh # On a member: @@ -288,8 +288,11 @@ the exposure. The adapter maintains trust and grants; Fractal does not edit #### Adapter helper boundary -The CLI discovers `st-fabric-adapter` beside its executable or on `PATH`; -`ST_FABRIC_ADAPTER` selects an explicit helper for isolated tests. +The CLI discovers `fractal-fabric-adapter` beside its executable or on `PATH`, +then accepts `st-fabric-adapter` within each searched directory. +`FRACTAL_FABRIC_ADAPTER` selects an explicit helper for isolated tests; +`ST_FABRIC_ADAPTER` is still accepted. If both variables are set, they must name +the same path. `pairing-invite` accepts one JSON line `{"code":"..."}` on standard input and returns a JSON line containing the augmented `code`. `pairing-join` is a private interactive JSON-line protocol: the code produces `node_id`, the signed diff --git a/docs/site/guides/two-machines.md b/docs/site/guides/two-machines.md index c5b701a8530..8bd04abbc5c 100644 --- a/docs/site/guides/two-machines.md +++ b/docs/site/guides/two-machines.md @@ -36,7 +36,7 @@ Success means both machines show the expected membership and initial synchroniza ## Using Fabric -Run Fabric with `--runtime-peers` and install `st-fabric-adapter` on both machines. Keep the external adapter running as a separate service on the sponsor. Create the fleet with `--transports fabric`; the machines need no prior Fabric trust or manual grants. +Run Fabric with `--runtime-peers` and install `fractal-fabric-adapter` on both machines; the old name `st-fabric-adapter` is still accepted. Keep the external adapter running as a separate service on the sponsor. Create the fleet with `--transports fabric`; the machines need no prior Fabric trust or manual grants. On studio: From c7ccba94422d561327854b1262388ecfaa3502d5 Mon Sep 17 00:00:00 2001 From: schickling-assistant <261620128+schickling-assistant@users.noreply.github.com> Date: Mon, 2 Nov 2026 06:47:16 +0100 Subject: [PATCH 3/3] Separate additive adapter binary from Nix package cutover agent-identity: agent/dotfiles/fabric-mesh agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: anthropic/claude-opus-5-5 --- crates/fractal-fabric-adapter/Cargo.toml | 5 +++++ flake.nix | 15 +++++---------- release-notes/fractal-fabric-adapter-binary.json | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/fractal-fabric-adapter/Cargo.toml b/crates/fractal-fabric-adapter/Cargo.toml index 284262ef108..cb5d7a8ef93 100644 --- a/crates/fractal-fabric-adapter/Cargo.toml +++ b/crates/fractal-fabric-adapter/Cargo.toml @@ -23,3 +23,8 @@ tempfile = "3" [[bin]] name = "fractal-fabric-adapter" path = "src/main.rs" + +# Keep the existing Nix package buildable until its package-name cutover. +[[bin]] +name = "st-fabric-adapter" +path = "src/main.rs" diff --git a/flake.nix b/flake.nix index 0505c1f99de..493331b74a1 100644 --- a/flake.nix +++ b/flake.nix @@ -739,23 +739,19 @@ }; }; - fractalFabricAdapter = pkgs.rustPlatform.buildRustPackage { - pname = "fractal-fabric-adapter"; + stFabricAdapter = pkgs.rustPlatform.buildRustPackage { + pname = "st-fabric-adapter"; inherit version cargoDeps; src = self; - cargoBuildFlags = [ "-p" "fractal-fabric-adapter" "--bin" "fractal-fabric-adapter" ]; + cargoBuildFlags = [ "-p" "fractal-fabric-adapter" "--bin" "st-fabric-adapter" ]; nativeBuildInputs = pkgs.lib.optionals pkgs.stdenv.hostPlatform.isLinux [ pkgs.mold ]; # The shared daemon check runs the adapter's Rust tests. doCheck = false; - # One-release bridge for pinned consumers of the old package and binary. - postInstall = '' - ln -s fractal-fabric-adapter "$out/bin/st-fabric-adapter" - ''; meta = { description = "External Fractal fleet to Fabric runtime-peers adapter"; homepage = "https://github.com/compoundingtech/fractal"; license = pkgs.lib.licenses.mit; - mainProgram = "fractal-fabric-adapter"; + mainProgram = "st-fabric-adapter"; }; }; @@ -1108,8 +1104,7 @@ packages.fractal-web = fractalWeb; packages.fractal = fractal; packages.st-chatgpt = stChatgpt; - packages.fractal-fabric-adapter = fractalFabricAdapter; - packages.st-fabric-adapter = fractalFabricAdapter; + packages.st-fabric-adapter = stFabricAdapter; # Isolated bootstrap/live proofs use the exact pairing API revision. packages.fabric-pairing = fabric.packages.${system}.default; packages.st3-migrate = st3; diff --git a/release-notes/fractal-fabric-adapter-binary.json b/release-notes/fractal-fabric-adapter-binary.json index a9d20948cde..a492242726e 100644 --- a/release-notes/fractal-fabric-adapter-binary.json +++ b/release-notes/fractal-fabric-adapter-binary.json @@ -1,11 +1,11 @@ { "version": 1, - "summary": "Publish the Fabric adapter as fractal-fabric-adapter with an old-name package and executable bridge", + "summary": "Add the fractal-fabric-adapter Cargo binary while preserving the existing Nix adapter package", "replay": {"status": "none", "detail": "No claim replay or recovery behavior changes."}, "schema": {"status": "none", "detail": "No schema or stored-state changes."}, "rules": {"status": "none", "detail": "No checkpoint rules or digest changes."}, - "compatibility": {"status": "changed", "detail": "The primary Nix output and Cargo binary are fractal-fabric-adapter. For one release, packages.st-fabric-adapter refers to the same package and bin/st-fabric-adapter is a relative symlink to bin/fractal-fabric-adapter. Discovery accepts both names, preferring the new name within each searched directory."}, + "compatibility": {"status": "changed", "detail": "Cargo accepts both fractal-fabric-adapter and st-fabric-adapter binary targets from the same implementation. The existing Nix package still builds and ships st-fabric-adapter. Discovery accepts both names, preferring the new name within each searched directory."}, "downtime": {"status": "none", "detail": "No service, host or runtime changes."}, - "manual": {"status": "none", "detail": "Existing Nix consumers can keep using the old package attribute and binary path during the bridge. Cargo users select --bin fractal-fabric-adapter."}, + "manual": {"status": "none", "detail": "Cargo users can select --bin fractal-fabric-adapter; existing Nix consumers keep their package attribute and executable path."}, "recovery": {"status": "none", "detail": "Identity, adapter journals and state paths are unchanged."} }