From c7b38bd2bb4546c122b94fff95db7a6c4f8369c5 Mon Sep 17 00:00:00 2001 From: Steve Brown Date: Sat, 24 Oct 2026 22:37:31 -0400 Subject: [PATCH 1/2] fix(stack): pin Bobbin 0.30.0, Yupana 0.16.2, Desire Path v0.10.0 and Shuttle 0.6.1 (aegis-5s32or.5) The reviewed pins trailed every member release, so a fresh install delivered old tools and a host already on current releases read them as drift. - Bobbin 0.27.3 -> 0.30.0. Its archive digests are read from the release's SHA256SUMS.txt at install; every target tambo maps is published under the same asset name. - Yupana 0.12.7 -> 0.16.2. The three archive digests were recomputed from the downloaded archives and agree with SHA256SUMS and each .sha256. - Desire Path v0.3.2 -> v0.10.0, built from the revision the tag names, 06812336. - Shuttle 0.5.0 -> 0.6.1 by `tambo bump-member --tag v0.6.1`; the wheel digest matches a separate download and the release checksums.txt. Its manifest now names intigraph/shuttle: the GitHub API answers the old scbrown name with a 301 that bump-member does not follow. Seeds stays at 0.3.0. Test fixtures move with the pins, keeping each one's relation to the pin (equal, one patch or one minor ahead) as before. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BzgSY2LpdGhBhb7D1nHbiF --- docs/book/src/installing.md | 2 +- docs/book/src/reference.md | 4 +- docs/book/src/using.md | 2 +- members/shuttle.toml | 6 +- src/adapter.rs | 14 ++--- tests/cli.rs | 114 ++++++++++++++++++------------------ 6 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docs/book/src/installing.md b/docs/book/src/installing.md index a6aa2a2..b231bb5 100644 --- a/docs/book/src/installing.md +++ b/docs/book/src/installing.md @@ -476,7 +476,7 @@ prints the exact source-build command where no reviewed release exists. **Commands on PATH.** `curl`, `tar`, `git`, `bash`, `python3`, and `sha256sum` (`brew install coreutils` supplies `sha256sum` on macOS). Yupana verifies its -three pinned v0.12.7 archives in-process and needs only `curl` and `tar` for installation. The `everything` +three pinned v0.16.2 archives in-process and needs only `curl` and `tar` for installation. The `everything` profile also needs Go 1.22+. Rust is only needed for the source builds above. **Accounts and servers.** The default local single-user install needs neither diff --git a/docs/book/src/reference.md b/docs/book/src/reference.md index 9d6fb67..057f407 100644 --- a/docs/book/src/reference.md +++ b/docs/book/src/reference.md @@ -89,8 +89,8 @@ with an absent control, reader-path retrieval, and an idempotent replay. Use `--skip-install` when package installation belongs to another system; the version and functional checks still run. -Yupana installs from its checksum-pinned v0.12.7 release and proves `callers` on -an isolated fixture repository. Tambo builds Desire Path from the revision its `v0.3.2` tag names (`1f457ec`), stamps +Yupana installs from its checksum-pinned v0.16.2 release and proves `callers` on +an isolated fixture repository. Tambo builds Desire Path from the revision its `v0.10.0` tag names (`0681233`), stamps that identity into `dp version`, and proves an isolated ingest/list round trip. Neither verification can write into the user's normal Yupana state or Desire Path DB. diff --git a/docs/book/src/using.md b/docs/book/src/using.md index 25bbb83..4721969 100644 --- a/docs/book/src/using.md +++ b/docs/book/src/using.md @@ -40,7 +40,7 @@ version and functional checks still run. `code-intel` adds checksum-pinned Yupana and proves a caller edge in a temporary repository with isolated HOME/state. `everything` additionally installs Desire -Path by building the revision its `v0.3.2` tag names, reads it back from `dp version`, and +Path by building the revision its `v0.10.0` tag names, reads it back from `dp version`, and proves ingest/list against a temporary database. These checks never use the user's normal evidence stores. `caboodle-intent.toml` names the intended use, zero or more themed crew members, diff --git a/members/shuttle.toml b/members/shuttle.toml index ac471db..8acda1d 100644 --- a/members/shuttle.toml +++ b/members/shuttle.toml @@ -7,8 +7,8 @@ # ed25519) is resolved by pip from the package index at install time. name = "shuttle" kind = "python-wheel" -repo = "scbrown/shuttle" -version = "0.5.0" +repo = "intigraph/shuttle" +version = "0.6.1" tag = "v{version}" asset = "shuttle-{version}-py3-none-any.whl" version_argv = ["version"] @@ -17,7 +17,7 @@ prerequisites = ["python3"] profiles = ["crew", "everything"] [sha256] -any = "537630cd798cbce99c82dcf209529c8408076e8b812dbcdd941b9c78bfba6dee" +any = "a25ecb134aa2c5238ec533297dde0445952bca99c34abb9bba95247d8df55b86" # Every released shuttle (0.2.0 onward) prints this line in --help. [[programs]] diff --git a/src/adapter.rs b/src/adapter.rs index e0d3fae..1836d5b 100644 --- a/src/adapter.rs +++ b/src/adapter.rs @@ -766,7 +766,7 @@ struct Yupana; struct DesirePath; struct Camayoc; -const BOBBIN_VERSION: &str = "0.27.3"; +const BOBBIN_VERSION: &str = "0.30.0"; impl Adapter for Camayoc { fn name(&self) -> ToolName { @@ -938,7 +938,7 @@ impl Adapter for Bobbin { } } -const YUPANA_VERSION: &str = "0.12.7"; +const YUPANA_VERSION: &str = "0.16.2"; impl Adapter for Yupana { fn name(&self) -> ToolName { @@ -1012,15 +1012,15 @@ fn yupana_release_for(arch: &str, os: &str) -> Result<(&'static str, &'static st match (arch, os) { ("x86_64", "linux") => Ok(( "x86_64-linux-gnu", - "44bfefb529a5977cd6ced67e662ca1cab87ec53e62a4cdf173ebbb367b5f8667", + "565507459d3d67b2cc73b6ebd91f784f0522689c5b62257a8fde82793580dc5d", )), ("aarch64", "macos") => Ok(( "aarch64-apple-darwin", - "7f02e1c96b97a21abbc5478341d5ee44d10ea860b803e45d721b1c5a66647770", + "9f3682c6f4dffd7365248ae2d686e9fcdca26ba08ebd915f8ce692e8111179a2", )), ("x86_64", "macos") => Ok(( "x86_64-apple-darwin", - "94b872a6cd3ea9de4bf4271b1d16fa569f1979b4d216e0fd307d88e1b66364a2", + "7763d171c7f6e2df395bdf9961a79991b66b4876c3394ce970d1f3e2cddcb4ed", )), _ => bail!("Yupana v{YUPANA_VERSION} has no checksummed Tambo release for {arch}-{os}"), } @@ -1104,8 +1104,8 @@ fn desire_path_program() -> Result { Ok(PathBuf::from(home).join(".local/bin/dp")) } -const DESIRE_PATH_REVISION: &str = "1f457ec2f30c4a0d47b6f4d1b4cc0f3078f39662"; -const DESIRE_PATH_VERSION: &str = "v0.3.2"; +const DESIRE_PATH_REVISION: &str = "06812336fda6a6fd3fe4cbcae2d50a303e95a024"; +const DESIRE_PATH_VERSION: &str = "v0.10.0"; impl Adapter for DesirePath { fn name(&self) -> ToolName { diff --git a/tests/cli.rs b/tests/cli.rs index 33c2798..212ac82 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -164,7 +164,7 @@ exit 2 bin, "bobbin", r#" -if [ "${1:-}" = "--version" ]; then echo 'bobbin 0.27.3'; exit 0; fi +if [ "${1:-}" = "--version" ]; then echo 'bobbin 0.30.0'; exit 0; fi if [ "${1:-}" = "init" ]; then mkdir -p .bobbin; exit 0; fi if [ "${1:-}" = "index" ]; then if [ -f fixture.rs ]; then cp fixture.rs .bobbin/indexed; else : > .bobbin/indexed; fi @@ -222,7 +222,7 @@ exit 2 bin, "yupana", r#" -if [ "${1:-}" = "--version" ]; then echo 'yupana 0.12.7'; exit 0; fi +if [ "${1:-}" = "--version" ]; then echo 'yupana 0.16.2'; exit 0; fi if [ "${1:-}" = "analyze" ]; then exit 0; fi if [ "${1:-}" = "callers" ]; then if [ -f fixture.rs ]; then echo 'fixture.rs:2 caboodle_yupana_caller'; @@ -236,7 +236,7 @@ exit 2 bin, "dp", r#" -if [ "${1:-}" = "version" ]; then echo 'dp v0.3.2 (1f457ec)'; exit 0; fi +if [ "${1:-}" = "version" ]; then echo 'dp v0.10.0 (0681233)'; exit 0; fi db='' while [ "$#" -gt 0 ]; do if [ "$1" = "--db" ]; then shift; db=$1; fi @@ -710,7 +710,7 @@ fn check_updates_is_green_when_reviewed_versions_run_and_red_on_drift() { .arg("check-updates") .assert() .success() - .stdout(predicate::str::contains("bobbin: current (bobbin 0.27.3)")); + .stdout(predicate::str::contains("bobbin: current (bobbin 0.30.0)")); fake_tool( &bin, @@ -754,7 +754,7 @@ fn package_owned_tools_are_judged_by_receipt_and_never_installed_by_caboodle() { // aegis-6f1 option A: dpkg owns bobbin, so caboodle reads the package // receipt (Debian revision stripped) and leaves delivery to the package lane. for (deb_version, verdict) in [ - ("0.28.0", "bobbin: ahead of reviewed pin; downgrade refused (package-owned: apt bobbin 0.28.0;"), + ("0.31.0", "bobbin: ahead of reviewed pin; downgrade refused (package-owned: apt bobbin 0.31.0;"), ("0.1.0-2", "bobbin: behind reviewed pin; delivered by the package lane, not installed by caboodle (package-owned: apt bobbin 0.1.0;"), ] { let root = tempfile::tempdir().unwrap(); @@ -874,12 +874,12 @@ esac exit 1"#; // (installed by brew, tap stable, bobbin on PATH, expected stdout, brew verb expected) for (installed, stable, path_bobbin, expect, verb) in [ - (None, "0.27.3", None, "bobbin: delivered by brew (scbrown/tap 0.27.3) and verified", Some("install")), - (Some("0.28.0"), "0.28.0", None, "bobbin: current stable channel (package-owned: brew scbrown/tap 0.28.0;", None), - (Some("0.28.0"), "0.29.0", None, "bobbin: delivered by brew (scbrown/tap 0.29.0) and verified", Some("upgrade")), - (Some("0.20.0"), "0.27.3", None, "bobbin: delivered by brew (scbrown/tap 0.27.3) and verified", Some("upgrade")), + (None, "0.30.0", None, "bobbin: delivered by brew (scbrown/tap 0.30.0) and verified", Some("install")), + (Some("0.31.0"), "0.31.0", None, "bobbin: current stable channel (package-owned: brew scbrown/tap 0.31.0;", None), + (Some("0.31.0"), "0.32.0", None, "bobbin: delivered by brew (scbrown/tap 0.32.0) and verified", Some("upgrade")), + (Some("0.20.0"), "0.30.0", None, "bobbin: delivered by brew (scbrown/tap 0.30.0) and verified", Some("upgrade")), (None, "0.20.0", None, "bobbin: current", None), - (None, "0.27.3", Some("0.99.0"), "bobbin: installed bobbin 0.99.0 is newer than scbrown/tap 0.27.3; not installed by brew", None), + (None, "0.30.0", Some("0.99.0"), "bobbin: installed bobbin 0.99.0 is newer than scbrown/tap 0.30.0; not installed by brew", None), ] { let root = tempfile::tempdir().unwrap(); let bin = root.path().join("bin"); @@ -890,10 +890,10 @@ exit 1"#; .assert() .success(); let fake = fs::read_to_string(bin.join("bobbin")).unwrap(); - fs::write(bin.join("bobbin"), fake.replace("echo 'bobbin 0.27.3';", "if [ -f \"$HOME/brew-installed\" ]; then printf 'bobbin %s\\n' \"$(cat \"$HOME/brew-installed\")\"; else echo 'bobbin 0.27.3'; fi;")).unwrap(); + fs::write(bin.join("bobbin"), fake.replace("echo 'bobbin 0.30.0';", "if [ -f \"$HOME/brew-installed\" ]; then printf 'bobbin %s\\n' \"$(cat \"$HOME/brew-installed\")\"; else echo 'bobbin 0.30.0'; fi;")).unwrap(); if let Some(version) = path_bobbin { let fake = fs::read_to_string(bin.join("bobbin")).unwrap(); - fs::write(bin.join("bobbin"), fake.replace("bobbin 0.27.3", &format!("bobbin {version}"))).unwrap(); + fs::write(bin.join("bobbin"), fake.replace("bobbin 0.30.0", &format!("bobbin {version}"))).unwrap(); } fs::write(root.path().join("brew-stable"), stable).unwrap(); if let Some(version) = installed { @@ -978,7 +978,7 @@ fn check_updates_rejects_stale_path_despite_current_cargo_copy() { fake_tool( &cargo_bin, "dp", - "if [ \"${1:-}\" = version ]; then echo 'dp v0.3.2 (1f457ec)'; exit 0; fi\nexit 2", + "if [ \"${1:-}\" = version ]; then echo 'dp v0.10.0 (0681233)'; exit 0; fi\nexit 2", ); command(root.path(), &bin) @@ -992,7 +992,7 @@ fn check_updates_rejects_stale_path_despite_current_cargo_copy() { .assert() .failure() .stdout(predicate::str::contains( - "desire-path: version drift; review required (installed: dp c964ea2 (c964ea2); reviewed: dp v0.3.2 (1f457ec))", + "desire-path: version drift; review required (installed: dp c964ea2 (c964ea2); reviewed: dp v0.10.0 (0681233))", )); } @@ -1007,7 +1007,7 @@ fn check_updates_accepts_current_path_despite_stale_cargo_copy() { fake_tool( &bin, "dp", - "if [ \"${1:-}\" = version ]; then echo 'dp 0.3.2 (1f457ec)'; exit 0; fi\nexit 2", + "if [ \"${1:-}\" = version ]; then echo 'dp 0.10.0 (0681233)'; exit 0; fi\nexit 2", ); fake_tool( &cargo_bin, @@ -1026,7 +1026,7 @@ fn check_updates_accepts_current_path_despite_stale_cargo_copy() { .assert() .success() .stdout(predicate::str::contains( - "desire-path: current (dp 0.3.2 (1f457ec))", + "desire-path: current (dp 0.10.0 (0681233))", )); } @@ -1059,7 +1059,7 @@ fn expanded_adapter_negative_controls_turn_verification_red() { fake_tool( &yupana_bin, "yupana", - "if [ \"${1:-}\" = --version ]; then echo 'yupana 0.12.7'; exit 0; fi\nif [ \"${1:-}\" = analyze ]; then exit 0; fi\nif [ \"${1:-}\" = callers ]; then echo 'fixture.rs:2 caboodle_yupana_caller'; exit 0; fi\nexit 2", + "if [ \"${1:-}\" = --version ]; then echo 'yupana 0.16.2'; exit 0; fi\nif [ \"${1:-}\" = analyze ]; then exit 0; fi\nif [ \"${1:-}\" = callers ]; then echo 'fixture.rs:2 caboodle_yupana_caller'; exit 0; fi\nexit 2", ); command(yupana_root.path(), &yupana_bin) .args(["plan", "--profile", "code-intel"]) @@ -1080,7 +1080,7 @@ fn expanded_adapter_negative_controls_turn_verification_red() { fake_tool( &dp_bin, "dp", - "if [ \"${1:-}\" = version ]; then echo 'dp v0.3.2 (1f457ec)'; exit 0; fi\necho '[{\"tool_name\":\"caboodle_desire_path_marker\"}]'", + "if [ \"${1:-}\" = version ]; then echo 'dp v0.10.0 (0681233)'; exit 0; fi\necho '[{\"tool_name\":\"caboodle_desire_path_marker\"}]'", ); command(dp_root.path(), &dp_bin) .args(["plan", "--profile", "everything"]) @@ -1143,7 +1143,7 @@ fn retrieval_plan_with_bobbin( let bin = root.path().join("bin"); fs::create_dir(&bin).unwrap(); install_fakes(root.path(), &bin); - if !functional || version != "0.27.3" { + if !functional || version != "0.30.0" { // Any subcommand but --version fails like a clap argument error, which is // what an old bobbin says to the reviewed release's verification contract. fake_tool( @@ -1170,14 +1170,14 @@ fn apply_skip_install_refuses_a_stale_tool_naming_both_versions() { .assert() .failure() .stderr(predicate::str::contains("0.1.0")) - .stderr(predicate::str::contains("0.27.3")); + .stderr(predicate::str::contains("0.30.0")); } #[test] fn apply_skip_install_accepts_the_reviewed_release() { // Control for the test above: without it, "fails on a skew" is // indistinguishable from "apply --skip-install always fails". - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", true); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", true); command(root.path(), &bin) .args(["apply", "--skip-install"]) .assert() @@ -1213,7 +1213,7 @@ fn verify_names_a_version_skew_before_the_tools_own_error() { #[test] fn verify_does_not_claim_a_skew_when_the_reviewed_release_fails() { // Control: the skew message must not fire on every verification failure. - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", false); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", false); command(root.path(), &bin) .arg("verify") .assert() @@ -2095,16 +2095,16 @@ fn release_fixture(root: &Path, bin: &Path, broken: bool, bad_checksum: bool) { let stage = root.join("release-stage"); fs::create_dir(&stage).unwrap(); let body = if broken { - "#!/bin/sh\nif [ \"$1\" = --version ]; then echo 'bobbin 0.27.4'; exit 0; fi\nexit 9\n" + "#!/bin/sh\nif [ \"$1\" = --version ]; then echo 'bobbin 0.30.1'; exit 0; fi\nexit 9\n" .to_owned() } else { fs::read_to_string(bin.join("bobbin")) .unwrap() - .replace("0.27.3", "0.27.4") + .replace("0.30.0", "0.30.1") }; fs::write(stage.join("bobbin"), body).unwrap(); fs::set_permissions(stage.join("bobbin"), fs::Permissions::from_mode(0o755)).unwrap(); - let archive = root.join("bobbin-v0.27.4-x86_64-unknown-linux-gnu.tar.gz"); + let archive = root.join("bobbin-v0.30.1-x86_64-unknown-linux-gnu.tar.gz"); assert!(std::process::Command::new("tar") .args(["-czf"]) .arg(&archive) @@ -2122,10 +2122,10 @@ fn release_fixture(root: &Path, bin: &Path, broken: bool, bad_checksum: bool) { }; fs::write( root.join("SHA256SUMS.txt"), - format!("{digest} bobbin-v0.27.4-x86_64-unknown-linux-gnu.tar.gz\n"), + format!("{digest} bobbin-v0.30.1-x86_64-unknown-linux-gnu.tar.gz\n"), ) .unwrap(); - fs::write(root.join("latest.json"), r#"{"tag_name":"v0.27.4","draft":false,"prerelease":false,"assets":[{"name":"bobbin-v0.27.4-x86_64-unknown-linux-gnu.tar.gz"},{"name":"SHA256SUMS.txt"}]}"#).unwrap(); + fs::write(root.join("latest.json"), r#"{"tag_name":"v0.30.1","draft":false,"prerelease":false,"assets":[{"name":"bobbin-v0.30.1-x86_64-unknown-linux-gnu.tar.gz"},{"name":"SHA256SUMS.txt"}]}"#).unwrap(); fake_tool( bin, "curl", @@ -2141,7 +2141,7 @@ done case "$url" in */releases/latest) cat "$HOME/latest.json" ;; */SHA256SUMS.txt) cp "$HOME/SHA256SUMS.txt" "$output" ;; - */bobbin-v0.27.4-x86_64-unknown-linux-gnu.tar.gz) cp "$HOME/bobbin-v0.27.4-x86_64-unknown-linux-gnu.tar.gz" "$output" ;; + */bobbin-v0.30.1-x86_64-unknown-linux-gnu.tar.gz) cp "$HOME/bobbin-v0.30.1-x86_64-unknown-linux-gnu.tar.gz" "$output" ;; *) echo "unexpected URL" >&2; exit 99 ;; esac "#, @@ -2164,9 +2164,9 @@ fn published_release_update_ignores_stale_pin_and_keeps_backup() { .args(["update-release", "--tool", "bobbin"]) .assert() .success() - .stdout(predicate::str::contains("installed and verified v0.27.4")); + .stdout(predicate::str::contains("installed and verified v0.30.1")); let state = fs::read_to_string(root.path().join(".caboodle/state.json")).unwrap(); - assert!(state.contains("0.27.4")); + assert!(state.contains("0.30.1")); let backups: Vec<_> = fs::read_dir(root.path().join(".caboodle/release-backups/bobbin")) .unwrap() .collect(); @@ -2265,7 +2265,7 @@ fn reviewed_pin_update_cannot_undo_newer_published_binary() { let bin = root.path().join("bin"); fs::create_dir(&bin).unwrap(); release_fixture(root.path(), &bin, false, false); - fake_tool(&bin, "bobbin", "echo 'bobbin 0.27.4'"); + fake_tool(&bin, "bobbin", "echo 'bobbin 0.30.1'"); let before = fs::read(bin.join("bobbin")).unwrap(); command(root.path(), &bin) .arg("update") @@ -2286,11 +2286,11 @@ fn published_release_missing_assets_and_ambiguous_identity_never_install() { if mode == "missing" { fs::write( root.path().join("latest.json"), - r#"{"tag_name":"v0.27.4","draft":false,"prerelease":false,"assets":[]}"#, + r#"{"tag_name":"v0.30.1","draft":false,"prerelease":false,"assets":[]}"#, ) .unwrap(); } else if mode == "equal" { - fake_tool(&bin, "bobbin", "echo 'bobbin 0.27.4'"); + fake_tool(&bin, "bobbin", "echo 'bobbin 0.30.1'"); } else if mode == "unreadable" { fake_tool(&bin, "bobbin", "echo 'bobbin unknown'"); } @@ -2311,10 +2311,10 @@ fn published_release_missing_assets_and_ambiguous_identity_never_install() { #[cfg(all(target_os = "linux", target_arch = "x86_64"))] fn local_source_builds_refuse_equal_releases_but_accept_newer_ones() { for (base, suffix, check) in [ - ("0.27.4", "abcdef012345", false), - ("0.27.4", "abcdef012345.dirty", true), - ("0.27.3", "abcdef012345", false), - ("0.27.3", "abcdef012345.dirty", false), + ("0.30.1", "abcdef012345", false), + ("0.30.1", "abcdef012345.dirty", true), + ("0.30.0", "abcdef012345", false), + ("0.30.0", "abcdef012345.dirty", false), ] { let root = tempfile::tempdir().unwrap(); let bin = root.path().join("bin"); @@ -2323,7 +2323,7 @@ fn local_source_builds_refuse_equal_releases_but_accept_newer_ones() { let script = fs::read_to_string(bin.join("bobbin")).unwrap(); fs::write( bin.join("bobbin"), - script.replace("0.27.3", &format!("{base}+local.{suffix}")), + script.replace("0.30.0", &format!("{base}+local.{suffix}")), ) .unwrap(); let before = fs::read(bin.join("bobbin")).unwrap(); @@ -2332,7 +2332,7 @@ fn local_source_builds_refuse_equal_releases_but_accept_newer_ones() { if check { cmd.arg("--check"); } - if base == "0.27.4" { + if base == "0.30.1" { cmd.assert() .failure() .stderr(predicate::str::contains("local source build installed")); @@ -2835,7 +2835,7 @@ fn project_settings_rejects_empty_or_invalid_success_receipts() { #[test] fn install_continues_after_failure_invalidates_old_proof_and_resumes() { - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", true); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", true); command(root.path(), &bin) .args(["install", "--skip-install"]) .assert() @@ -2873,7 +2873,7 @@ fn install_continues_after_failure_invalidates_old_proof_and_resumes() { #[test] fn apply_reports_all_version_failures_and_still_applies_later_tools() { - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", true); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", true); fake_tool(&bin, "quipu", "echo 'broken quipu' >&2; exit 1"); fs::write(root.path().join("camayoc/REVISION"), "").unwrap(); command(root.path(), &bin) @@ -2951,7 +2951,7 @@ fn release_download_recovers_visibly_from_server_and_transport_errors() { .and(predicate::str::contains("retrying in 1s")) .and(predicate::str::contains("succeeded on attempt 2/3")), ) - .stdout(predicate::str::contains("installed and verified v0.27.4")); + .stdout(predicate::str::contains("installed and verified v0.30.1")); assert_eq!( fs::read_to_string(root.path().join("attempts")).unwrap(), "2" @@ -3557,7 +3557,7 @@ fn apply_registers_exactly_the_hook_bundles_of_the_plans_tools() { // script, where quipu must NOT be registered, and a Gas Town host that has it. use std::os::unix::fs::PermissionsExt; for gas_town in [false, true] { - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", true); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", true); if gas_town { let hooks = root.path().join(".gt/hooks"); fs::create_dir_all(&hooks).unwrap(); @@ -3622,7 +3622,7 @@ fn verify_asserts_the_hook_bundles_without_a_crew_plan_and_before_the_tools() { // assert them only inside crew verification, which a plan without a crew // section never reaches, and only after every tool had verified, so on the // measured Mac a bobbin skew failed first and the bundles went unasserted. - let (root, bin) = retrieval_plan_with_bobbin("0.27.3", true); + let (root, bin) = retrieval_plan_with_bobbin("0.30.0", true); let plan = fs::read_to_string(root.path().join("caboodle-plan.toml")).unwrap(); assert!(!plan.contains("[crew]"), "control: no crew section\n{plan}"); fs::remove_file(bin.join("st-versions.log")).unwrap(); @@ -4121,11 +4121,11 @@ case "$*" in esac exit 2"#; for (scenario, installed, pinned, success, upgrade, message) in [ - ("stable", "0.28.0", false, true, true, "delivered by brew"), - ("stable", "0.27.3", false, true, true, "delivered by brew"), + ("stable", "0.31.0", false, true, true, "delivered by brew"), + ("stable", "0.30.0", false, true, true, "delivered by brew"), ( "stable", - "0.30.0", + "0.33.0", false, true, false, @@ -4133,7 +4133,7 @@ exit 2"#; ), ( "stable", - "0.29.0", + "0.32.0", false, true, false, @@ -4141,7 +4141,7 @@ exit 2"#; ), ( "stable", - "0.28.0", + "0.31.0", true, true, false, @@ -4149,7 +4149,7 @@ exit 2"#; ), ( "refresh-fails", - "0.28.0", + "0.31.0", false, false, false, @@ -4157,7 +4157,7 @@ exit 2"#; ), ( "metadata-fails", - "0.28.0", + "0.31.0", false, false, false, @@ -4165,7 +4165,7 @@ exit 2"#; ), ( "upgrade-fails", - "0.28.0", + "0.31.0", false, false, true, @@ -4173,7 +4173,7 @@ exit 2"#; ), ( "unchanged-upgrade", - "0.28.0", + "0.31.0", false, false, true, @@ -4192,7 +4192,7 @@ exit 2"#; fs::write( bin.join("bobbin"), fake.replace( - "echo 'bobbin 0.27.3';", + "echo 'bobbin 0.30.0';", "printf 'bobbin %s\\n' \"$(cat \"$HOME/brew-installed\")\";", ), ) @@ -4201,8 +4201,8 @@ exit 2"#; ("scenario", scenario), ("brew-installed", installed), ("pinned", if pinned { "true" } else { "false" }), - ("local-stable", "0.28.0"), - ("remote-stable", "0.29.0"), + ("local-stable", "0.31.0"), + ("remote-stable", "0.32.0"), ] { fs::write(root.path().join(name), value).unwrap(); } @@ -4248,7 +4248,7 @@ exit 2"#; assert_eq!( actual, if success && upgrade { - "0.29.0" + "0.32.0" } else { installed } From 3e0b55d8bf01cb397de4c45817f6e1900b654d89 Mon Sep 17 00:00:00 2001 From: Steve Brown Date: Sat, 24 Oct 2026 23:28:09 -0400 Subject: [PATCH 2/2] fix(knowledge): re-witness src/adapter.rs after the re-pin (aegis-5s32or.5) The adapter.rs record describes the Adapter trait (desired version, install, read-back, verification). The re-pin changes only version and digest constants, so the claim holds; only the source hash moved. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BzgSY2LpdGhBhb7D1nHbiF --- docs/knowledge/repository-knowledge.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/knowledge/repository-knowledge.json b/docs/knowledge/repository-knowledge.json index 0276da0..5d41e68 100644 --- a/docs/knowledge/repository-knowledge.json +++ b/docs/knowledge/repository-knowledge.json @@ -46,7 +46,7 @@ "source": "src/adapter.rs", "subject": "http://aegis.gastown.local/ontology/code/tambo/src%2Fadapter.rs", "summary": "The Adapter trait separates desired version, installation, version read-back and functional verification. Built-in adapters integrate the selected stack tools; package adapters may bind verification to PATH executables.", - "source_sha256": "ae8f7906c950a5b7f51a9373034323b501b7694c5c6b953d02c39962f76966e7", + "source_sha256": "5d4ac5edb6e61afa747afa1e341ebfb383816cc392c95e20283ec2d1350f2465", "properties": { "interfaceKind": "library", "publicName": "caboodle::adapter::Adapter"