Skip to content

Holochain 0.6.1 upgrade — sweettest tests, UI dep modernization#56

Open
ThetaSinner wants to merge 11 commits intomainfrom
update-hc-0.6.1
Open

Holochain 0.6.1 upgrade — sweettest tests, UI dep modernization#56
ThetaSinner wants to merge 11 commits intomainfrom
update-hc-0.6.1

Conversation

@ThetaSinner
Copy link
Copy Markdown
Member

@ThetaSinner ThetaSinner commented Apr 25, 2026

Summary

Continues the Holochain 0.6.1 upgrade by retiring the deprecated tryorama JS test stack and modernizing the UI toolchain.

  • test: Replaces the JS tryorama integration suite with a Rust sweettest crate under tests/. 19 tests pass; 3 cross-agent delete-link tests are #[ignore]d for the same reason upstream gates its own consistency tests on transport-iroh (the default tx5/go-pion backend can't reliably deliver must_get_agent_activity deps).
  • chore(types): Bumps types/* crates to edition 2024 to match the rest of the workspace.
  • chore(ui): Modernizes the UI dep stack — TS 6, Vite 8, ESLint 10 (flat config), Vue 3.5, vue-router 5, Pinia 3, @holochain/client 0.20, Tailwind v4 + daisyui v5 (CSS-first config). Includes the source-level adaptations the new strict ruleset requires (catch (e: unknown), drop unused SignalType import) and a fix for Pinia 3's stricter runWithContext: replaces component-scoped provide('client', ...) / inject('client') with a module-level Ref in src/holochain-client.ts, since Pinia 3 setup stores can no longer see component-level provides.
  • ci: Renames the integration test step and drops ubuntu-latest from the cli-test matrix (the nix test job already covers it).

Test plan

  • cargo fmt --check clean across root, checked_cli, and tests workspaces
  • cargo clippy -- --deny warnings clean across all three workspaces
  • cargo test passes for unit tests
  • npm run test:integration — 8 fetch + 11 signing_keys pass; 3 ignored
  • npm run lint and npm run build for ui workspace pass
  • UI loads in browser, signal handlers register without runtime errors

Summary by CodeRabbit

Release Notes

  • Chores

    • Updated CI/CD workflows and development toolchain versions across GitHub Actions, Rust compiler, and Nix dependencies.
    • Upgraded multiple runtime dependencies including Holochain, web frameworks, and build tools.
    • Migrated integration test suite to Rust-based testing framework.
  • Refactor

    • Updated code to align with new dependency APIs and patterns.
    • Simplified client initialization and state management in UI components.
  • Style

    • Reorganized imports and reformatted code for consistency across the codebase.

- actions/checkout v4 -> v6
- actions/setup-go v5 -> v6
- cachix/cachix-action v16 -> v17
- peter-evans/create-pull-request v7 -> v8
- Align Nix install URL to 2.34.6 across all workflows
- Remove duplicate Swatinem/rust-cache entry in cli-test job
Workspace and checked_cli bumps:
- anyhow 1.0.81 -> 1.0.102
- chrono 0.4.34 -> 0.4.44
- clap 4.5.2 -> 4.6.1
- ed25519-dalek 2.1.1 -> 2.2.0
- indicatif 0.18 -> 0.18.4
- minisign 0.8 -> 0.9.1
- minisign-verify 0.2.1 -> 0.2.5
- proc-ctl 0.4.0 -> 0.4.1
- rand 0.9/0.10 -> 0.10.1 (aligned across workspace and CLI; added thread_rng feature)
- regex 1.10.3 -> 1.12.3
- reqwest 0.13 -> 0.13.2
- rpassword 7.3.1 -> 7.4.0
- tempfile 3.10.1 -> 3.27.0
- tokio 1.37.0 -> 1.52.1
- url 2.5.0 -> 2.5.8
- warp 0.4 -> 0.4.2

Migrate fetch zome rand call sites: choose_multiple -> sample.

Holochain crates pinned at 0.6.1-rc.8 (no change).
….6.1

Workarounds for unrelaxable transitive pins in the Holochain dev-dep
chain:

- Pin sha1, sha2, digest down to versions where the iroh-base
  /pkarr -> ed25519-dalek 3.0.0-pre.1 -> curve25519-dalek 5.0.0-pre.1
  chain compiles (curve25519-dalek-5.0.0-pre.1 references
  digest::crypto_common, removed at digest 0.11.0-rc.11+).
- Enable transport-tx5-backend-go-pion on the holochain dev-dep so
  kitsune2's Builder gets its required transport field set (avoids
  the iroh-holochain crypto_box/chacha20 pin chain).
- Enable warp's server feature now that warp 0.4 dropped default
  features.

Update test source for HC 0.6.1 admin API drift:
- InstallAppPayload: drop allow_throwaway_random_agent_key
- InterfaceDriver::Websocket: add danger_bind_addr: None
- AppStatusFilter::Running -> Enabled
- warp::serve(...).bind_ephemeral(...) replaced with explicit
  TcpListener::bind + .incoming()
Tryorama is no longer maintained for Holochain 0.6.x, so the JS
integration suite is replaced with a Rust sweettest crate under tests/.
Three cross-agent delete-link tests are #[ignore]d for the same reason
upstream gates its own consistency tests on transport-iroh — the
default tx5/go-pion backend can't reliably deliver the
must_get_agent_activity deps the validators require.
Aligns the three types crates with the rest of the workspace, which is
already on edition 2024 in the zome and CLI crates.
Bumps the UI to a current toolchain:
- TypeScript 4 -> 6 (moduleResolution switched to Bundler)
- vue-tsc 1 -> 3
- Vite 4 -> 8 with @vitejs/plugin-vue 6 and vite-plugin-checker 0.13
- ESLint 8 -> 10, migrated to flat config (eslint.config.mjs)
- @vue/eslint-config-typescript 12 -> 14, eslint-plugin-vue 9 -> 10
- Vue 3.2 -> 3.5, vue-router 4 -> 5, pinia 2 -> 3
- @holochain/client 0.19 -> 0.20 (matches Holochain 0.6.x)
- date-fns 3 -> 4, @fortawesome/* 6 -> 7, postcss/autoprefixer/cssnano refresh
- tailwindcss 3 -> 4, daisyui 4 -> 5: CSS-first config via @plugin and
  @source directives in src/style.css; the daisyui plugin is loaded via
  the explicit "daisyui/index.js" path because Tailwind's module resolver
  picks daisyui's "browser" field (./daisyui.css) over "main" otherwise.

Source-level adaptations:
- Fix 'catch (e: any)' -> 'catch (e: unknown)' for the new strict ruleset.
- Drop unused SignalType import from signals.ts.
- Replace inject('client') with a module-level Ref in holochain-client.ts.
  Pinia 3's runWithContext only sees app-level provides, so the previous
  component-scoped provide('client', ...) returned undefined when
  injected from setup stores, breaking the watch source.
- Rename "Run Tryorama tests" -> "Run integration tests" to match the
  new sweettest crate.
- Drop ubuntu-latest from the cli-test matrix; the nix-based test job
  already runs the same npm run test:cli on Linux.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 25, 2026

📝 Walkthrough

Walkthrough

This pull request performs comprehensive toolchain and dependency upgrades while migrating the test infrastructure from TypeScript/Vitest to Rust-based integration tests. It updates Rust editions to 2024, bumps Holochain and related crate versions, refactors link-query patterns in zomes, and transitions the UI to use a shared holochain client reference instead of Vue dependency injection.

Changes

Cohort / File(s) Summary
Workflow & Tooling Updates
.github/workflows/flake_update.yaml, .github/workflows/release.yaml, .github/workflows/test.yaml, rust-toolchain.toml, flake.nix
Bumps GitHub Actions checkout/setup-go/cachix versions; updates Nix from 2.25.4/2.28.3 to 2.34.6; upgrades Node.js from 22 to 24; removes hc-launch, clang, cmake packages; refactors crane usage; updates Rust toolchain from 1.83.0 to 1.95.0.
Rust Edition & Workspace Dependency Upgrades
Cargo.toml, checked_cli/Cargo.toml, dnas/checked/zomes/coordinator/fetch/Cargo.toml, dnas/checked/zomes/coordinator/signing_keys/Cargo.toml, dnas/checked/zomes/integrity/.../Cargo.toml, types/.../Cargo.toml
Upgrades workspace and per-crate editions to 2024; bumps Holochain core deps (hdi, hdk, holochain_zome_types, holo_hash) to *-rc.5; adds holochain_serialized_bytes; updates rand (0.8.5 → 0.10.1) with thread_rng feature; refreshes utility/security/networking crates.
Zome Link Query Refactoring
dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs, dnas/checked/zomes/coordinator/signing_keys/src/key_collection.rs, dnas/checked/zomes/coordinator/signing_keys/src/verification_key_dist.rs
Replaces GetLinksInputBuilder + chained .get_options().build() pattern with LinkQuery::try_new() + explicit GetStrategy; updates delete_link calls to use GetOptions::local(); refactors random selection from choose_multiple to sample using rand::rng(); improves conditional logic in nested if let structures.
Signal Action Control Flow Simplification
dnas/checked/zomes/coordinator/fetch/src/lib.rs, dnas/checked/zomes/coordinator/signing_keys/src/lib.rs
Flattens Action::Update signal logic by combining nested conditionals into single && predicate; preserves Signal::EntryUpdated emission with no behavioral changes.
Test Infrastructure Migration
tests/Cargo.toml, tests/src/lib.rs, tests/tests/fetch.rs, tests/tests/signing_keys.rs, package.json
Introduces new Rust-based integration test framework with CheckedPlayer wrapper and async helpers (setup_one, setup_players, sync, with_retry); creates comprehensive Rust test suites for fetch and signing_keys zomes with DHT sync and error-path validation; removes npm test workspace; adds Rust test execution via cargo.
TypeScript Test Removal
tests/package.json, tests/eslint.config.js, tests/vitest.config.ts, tests/src/checked/common.ts, tests/src/checked/fetch/common.ts, tests/src/checked/fetch/fetch.test.ts, tests/src/checked/signing_keys/common.ts, tests/src/checked/signing_keys/*.test.ts
Deletes entire TypeScript test infrastructure including Vitest config, ESLint setup, npm workspace config, zome test helpers, and all feature test files (fetch, signing_keys validation/reference-count).
CLI Dependency & Logic Updates
checked_cli/src/distribute.rs, checked_cli/src/fetch.rs, checked_cli/src/hc_client.rs, checked_cli/src/hc_discover.rs, checked_cli/tests/happ_integration.rs, checked_cli/src/lib.rs
Updates rand trait from Rng to RngExt; refactors websocket connection setup with additional None params; simplifies conditional logic in credential/interface discovery; adjusts filter from AppStatusFilter::Running to Enabled; reformats print statements into multi-line calls; updates server test to use tokio::net::TcpListener; reorders imports/prelude exports.
Manifest & Build Configuration
dnas/checked/workdir/dna.yaml, workdir/happ.yaml, workdir/web-happ.yaml, .gitignore
Updates manifest versions from "1" to "0"; switches zome/artifact references from bundled field to path field; ignores tests/target instead of tests/node_modules.
UI Client Architecture Migration
ui/src/holochain-client.ts, ui/src/App.vue, ui/src/checked/signing_keys/*.vue, ui/src/store/*.ts, ui/src/signals.ts
Introduces shared holochainClient ref; removes Vue dependency injection pattern (inject("client")) from components and stores; updates component watchers to depend on shared client; tightens error typing from any to unknown; narrows AppClient import.
UI Build & Styling Configuration
ui/eslint.config.mjs, ui/package.json, ui/postcss.config.js, ui/tailwind.config.js, ui/vite.config.ts, ui/style.css, ui/tsconfig.json, ui/tsconfig.node.json, ui/.eslintrc.cjs
Migrates ESLint from .cjs to flat mjs format with Vue/TypeScript/Prettier plugins; deletes PostCSS and Tailwind config files (inlined into CSS/Vite); adds Tailwind Vite plugin; converts CSS from @tailwind directives to @import; updates Tailwind globs and adds DaisyUI theme config; upgrades dependencies (FontAwesome 6→7, Vue 3.2→3.5, Router 4→5, Pinia 2→3, Vite 4→8, TypeScript 4.9→6, ESLint 8→10); changes moduleResolution from Node to Bundler; simplifies lint script.
Integrity Zome Refactoring & Minor Updates
dnas/checked/zomes/integrity/fetch/src/asset_signature.rs, dnas/checked/zomes/integrity/fetch/src/lib.rs, dnas/checked/zomes/integrity/signing_keys/src/key_collection.rs, dnas/checked/zomes/integrity/signing_keys/src/lib.rs
Updates Rust edition to 2024; refactors ChainFilter::until_hash() in delete-link validation; reorders imports and prelude exports; no functional signature changes.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant UIApp as UI App
    participant HoloClient as Holochain Client (Shared Ref)
    participant ZomeCall as Zome (Coordinator)
    participant DHT as DHT

    User->>UIApp: Mount / Interact
    activate UIApp
    UIApp->>HoloClient: Connect via AppWebsocket.connect()
    activate HoloClient
    HoloClient-->>UIApp: Client instance stored (holochainClient.value)
    deactivate HoloClient
    
    UIApp->>UIApp: watch(holochainClient, callback)
    note over UIApp: Stores register signal handlers & load initial state
    
    User->>UIApp: Trigger action (e.g., distribute key)
    UIApp->>ZomeCall: client.callZome(request)
    activate ZomeCall
    ZomeCall->>DHT: Commit entry + emit signal
    activate DHT
    DHT-->>ZomeCall: Action hash
    deactivate DHT
    ZomeCall-->>UIApp: Response
    deactivate ZomeCall
    
    ZomeCall->>UIApp: Emit signal (via AppWebsocket)
    UIApp->>UIApp: Signal handler updates store state
    UIApp->>User: UI reflects new state
    deactivate UIApp
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 Hoppity-hop through the Rust 2024 dawn,
Tests now in Cargo, the TypeScript is gone!
Link queries refactored with query-try-new,
Holochain client shared—one reference true,
Zomes sync DHT as the UI stays sleek,
A symphony of updates, comprehensive and chic! 🚀

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly describes the primary change: upgrading to Holochain 0.6.1 and modernizing the test framework (sweettest) alongside UI dependency updates.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch update-hc-0.6.1

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
flake.nix (1)

93-111: ⚠️ Potential issue | 🟠 Major

hc-launch removal breaks start:tauri and launch:tauri npm scripts.

package.json still defines launch:tauri and start:tauri scripts that invoke hc launch --piped, but hc-launch has been removed from the devShell. Running npm run start:tauri inside nix develop will fail when reaching the hc launch step.

Either restore hc-launch to the devShell packages (line 98 in flake.nix), or update/remove these scripts to use hc-spin instead (as suggested by the launch:happ script which already uses hc-spin).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@flake.nix` around lines 93 - 111, The devShell removed hc-launch but
package.json still calls it from the npm scripts start:tauri and launch:tauri;
either restore hc-launch into the devShell packages list (add hc-launch to the
packages array in the devShells.default block) or update the npm scripts
start:tauri and launch:tauri to invoke hc-spin --piped (matching launch:happ) so
the commands available in nix develop match what's referenced by the scripts;
reference the hc-launch and hc-spin symbols and the start:tauri/launch:tauri
script names when making the change.
ui/src/checked/signing_keys/CreateKeyCollection.vue (1)

15-41: ⚠️ Potential issue | 🟠 Major

callZome is not awaited inside this async handler.

Although createKeyCollection is async, line 21 fires client.value.callZome(...) without await. Consequences:

  • Any rejection becomes an unhandled promise rejection and never reaches catch (e: unknown) — the just-tightened error-handling block can never be triggered for backend failures.
  • emit("created", keyCollectionName.value) and the input-clear run synchronously, so the parent treats creation as successful even on failure.
  • finally { creating.value = false } resets state before the call is actually done, allowing rapid duplicate submissions.
🛠️ Suggested fix
   try {
-    client.value.callZome({
+    await client.value.callZome({
       role_name: "checked",
       zome_name: "signing_keys",
       fn_name: "create_key_collection",
       payload: {
         name: keyCollectionName.value,
       },
     });
     emit("created", keyCollectionName.value);

     keyCollectionName.value = "";
   } catch (e: unknown) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/checked/signing_keys/CreateKeyCollection.vue` around lines 15 - 41,
The handler createKeyCollection calls client.value.callZome without awaiting it,
causing unhandled rejections and premature state/reset; change it to await the
callZome call (await client.value.callZome(...)) inside the try block, only
emit("created", keyCollectionName.value) and clear keyCollectionName.value after
the await succeeds, and let the catch(e) handle rejections so creating.value is
only reset in finally after the awaited call completes; reference
createKeyCollection, client.value.callZome, emit, keyCollectionName, and
creating.value when making these changes.
ui/src/checked/signing_keys/AddKeyToCollection.vue (1)

59-96: ⚠️ Potential issue | 🟠 Major

Async zome call is not awaited; bare block on lines 93–95 looks like a stray finally.

client.value.callZome(...) returns a Promise but the function is synchronous, so:

  • Rejections from the zome call will become unhandled promise rejections and will not reach the catch (e: unknown) block — the error toast will never fire on backend failure.
  • The success notification, emit("added"), and keyCollectionsStore.addKeyToCollection(...) all run before the zome call has actually completed, so the UI claims success even when the call later fails.
  • The trailing { linking.value = false; } is a bare block, not a finally clause. It currently runs because nothing throws synchronously, but the intent was clearly finally { ... } and the current shape will silently misbehave if anyone later adds a return or throw inside try.

Recommend making the handler async, awaiting the zome call, and using a real finally:

🛠️ Proposed fix
-const addKeyToCollection = () => {
+const addKeyToCollection = async () => {
   if (!selectedCollection.value || !client.value || linking.value) return;

   linking.value = true;

   try {
-    client.value.callZome({
+    await client.value.callZome({
       role_name: "checked",
       zome_name: "signing_keys",
       fn_name: "link_verification_key_to_key_collection",
       payload: {
         verification_key_dist_address: props.selectedKey.key_dist_address,
         key_collection_name: selectedCollection.value,
       },
     });

     keyCollectionsStore.addKeyToCollection(
       selectedCollection.value,
       props.selectedKey,
     );

     emit("added");

     notificationsStore.pushNotification({
       message: `Key added to collection '${selectedCollection.value}'`,
       type: "info",
     });
   } catch (e: unknown) {
     notificationsStore.pushNotification({
       message: `Error adding key to collection - ${e}`,
       type: "error",
       timeout: 5000,
     });
-  }
-  {
-    linking.value = false;
-  }
+  } finally {
+    linking.value = false;
+  }
 };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/checked/signing_keys/AddKeyToCollection.vue` around lines 59 - 96, The
addKeyToCollection handler currently calls client.value.callZome() without
awaiting it and uses a stray bare block to reset linking.value; convert
addKeyToCollection to an async function, await client.value.callZome(...) so the
try/catch can catch rejections, move
keyCollectionsStore.addKeyToCollection(...), emit("added"), and the success
notification to run after the awaited call, and replace the trailing bare block
with a proper finally { linking.value = false; } so linking is always reset even
on throw; keep the same role/zome/fn payload and preserve the error notification
in the catch.
ui/src/checked/signing_keys/DistributeSigningKey.vue (1)

154-158: ⚠️ Potential issue | 🟡 Minor

Minor: duplicated word in user-facing error message.

The notification reads "Failed to distribute the verification key key: …" — the trailing "key" is duplicated.

📝 Suggested fix
-      message: `Failed to distribute the verification key key: ${e}`,
+      message: `Failed to distribute the verification key: ${e}`,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/checked/signing_keys/DistributeSigningKey.vue` around lines 154 - 158,
The error notification message in the catch block for the distribution flow
duplicates the word "key"; update the notifications.pushNotification call in
DistributeSigningKey.vue (the catch handling that currently sets message:
`Failed to distribute the verification key key: ${e}`) to remove the extra "key"
so it reads e.g. `Failed to distribute the verification key: ${e}` while keeping
the existing error interpolation and type:"error".
🧹 Nitpick comments (13)
dnas/checked/zomes/integrity/fetch/src/asset_signature.rs (1)

1-5: Optional: avoid importing this crate's own prelude from an internal module.

make_asset_url_address is defined in crate::common; re-exporting it through prelude and then importing it back via crate::prelude::make_asset_url_address from an internal sibling module adds an indirection. Internal modules typically use the canonical path (crate::common::make_asset_url_address), reserving the prelude for downstream consumers. Functionally equivalent — feel free to ignore.

♻️ Proposed change
 use super::UnitEntryTypes;
 use crate::LinkTypes;
-use crate::prelude::make_asset_url_address;
+use crate::common::make_asset_url_address;
 use fetch_types::AssetSignature;
 use hdi::prelude::*;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dnas/checked/zomes/integrity/fetch/src/asset_signature.rs` around lines 1 -
5, The import uses crate::prelude::make_asset_url_address from an internal
sibling module; change it to import the canonical path
crate::common::make_asset_url_address instead to avoid indirection. Locate the
use of make_asset_url_address in this module (asset_signature.rs) and replace
the prelude import with the direct crate::common::make_asset_url_address import
while keeping other imports (UnitEntryTypes, LinkTypes, AssetSignature,
hdi::prelude) unchanged.
.github/workflows/test.yaml (1)

78-78: Pinned to the latest release candidate (0.6.1-rc.8).

Matches the PR objective of upgrading to 0.6.1. Consider tracking a follow-up to update to the GA 0.6.1 release once it's published, to avoid keeping CI on a pre-release tag indefinitely.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/test.yaml at line 78, The workflow currently pins
holochain_cli to the release candidate string "[email protected]"; update
this to the GA release when it's published by replacing the package spec with
"[email protected]" (remove the "-rc.8" suffix) and re-run CI to ensure the
change installs cleanly, and add a short TODO or create a follow-up ticket
referencing this pin so we remember to switch to the GA version if it's not
already available.
checked_cli/Cargo.toml (1)

39-46: Track removal of these RC-version pins once upstream stabilizes.

The comment captures the iroh-relay/ed25519-dalek/curve25519-dalek/digest mismatch nicely. Two follow-ups worth filing so this doesn't silently linger:

  1. Once holochain 0.6.1 leaves RC and updates its transitive iroh-relay/pkarr chain to a digest crate that no longer relies on the removed crypto_common alias, these = pins (sha1, sha2, digest) should be removed — pre-release pins won't be picked up by cargo update and will mask future security advisories on the stable lines.
  2. Because these are pinned with =, any other workspace member that needs a newer sha1/sha2/digest will fail to resolve. Worth verifying no other crate in the repo is on a different version line.

Want me to open a tracking issue for removing the RC pins once HC 0.6.1 is stable?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@checked_cli/Cargo.toml` around lines 39 - 46, Add a short tracking task and
follow-up checklist to remove the RC-version exact pins for sha1, sha2, and
digest in Cargo.toml once upstream holochain/i​roh-relay (and transitive
ed25519-dalek/curve25519-dalek) are updated; specifically create an issue that
references the exact pinned symbols (sha1, sha2, digest) and the Cargo.toml
change, include steps to (a) wait for holochain 0.6.1 stable and confirm
iroh-relay/ pkarr no longer require digest::crypto_common, (b) remove the "="
exact-version pins for sha1/sha2/digest, (c) run cargo update and cargo metadata
to ensure no other workspace member pins or conflicts remain, and (d) verify
security advisory pickup works after unpinning.
ui/src/holochain-client.ts (1)

1-4: Clean module-level holder; consider whether a Pinia store would fit better.

The shared Ref<AppClient | null> is a reasonable replacement for the old provide/inject pattern. Consumers correctly guard via watch(holochainClient, (client) => { if (!client) return; ... }), and the assignment in App.vue's onMounted hook does not race against consumer reads.

Optional consideration: since this codebase has standardized on Pinia 3, exposing the client through a tiny Pinia store (e.g., useHolochainClientStore) would give you devtools visibility, easier mocking in tests, and a natural place to colocate connect/disconnect lifecycle and any future reconnect/auth-refresh logic. Not blocking — the current shape is fine for an SPA.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/holochain-client.ts` around lines 1 - 4, The module exports a
module-level ref holochainClient storing AppClient|null which works but would be
better surfaced via a small Pinia store for devtools, testing, and lifecycle
cohesion; create a Pinia store (e.g., useHolochainClientStore) that exposes the
same state currently held by holochainClient plus actions for connect/disconnect
(used by App.vue onMounted to assign the client) so consumers import the store
and access the client via store.client or subscribe to changes instead of the
raw holochainClient ref, and move any connect/disconnect/reconnect/auth-refresh
logic into that store for future maintenance and mocking.
ui/src/style.css (1)

6-8: Prefer the canonical @plugin "daisyui" form.

DaisyUI v5's documented Tailwind v4 integration uses @plugin "daisyui" rather than the file path daisyui/index.js. The current form works, but the canonical form aligns with official documentation and is more resilient to upstream packaging changes.

♻️ Suggested change
-@plugin "daisyui/index.js" {
+@plugin "daisyui" {
   themes: bumblebee --default, luxury --prefersdark;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/style.css` around lines 6 - 8, Replace the non-canonical plugin
specification `@plugin` "daisyui/index.js" with the canonical `@plugin` "daisyui"
form in the CSS block that defines themes (the `@plugin` declaration around the
themes: bumblebee --default, luxury --prefersdark;). Keep the themes content
unchanged and only update the plugin identifier to "daisyui" so it matches
DaisyUI v5/Tailwind v4 documentation and is resilient to packaging path changes.
ui/src/store/key-collections-store.ts (1)

48-59: Optional: align floating-promise style with my-keys-store.ts.

loadKeyCollections already handles its own errors in a try/catch/finally, so this is purely cosmetic, but the sibling my-keys-store.ts attaches an explicit .catch((e) => console.error(...)) to the load call. Mirroring that here (and in my-asset-signatures-store.ts) would keep the three stores consistent and silence @typescript-eslint/no-floating-promises if it ever gets enabled.

♻️ Suggested tweak
-      loadKeyCollections(client);
+      loadKeyCollections(client).catch((e) => {
+        console.error("Error loading key collections", e);
+      });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/src/store/key-collections-store.ts` around lines 48 - 59, The watch
callback invokes loadKeyCollections(client) but leaves the returned promise
unhandled; change the call in the watch callback inside key-collections-store.ts
to append a .catch(...) that logs the error (mirroring my-keys-store.ts) so the
promise is not floating and ESLint won’t complain; update the same pattern in
my-asset-signatures-store.ts as well, keeping the existing try/catch inside
loadKeyCollections and only adding the .catch on the external invocation
(reference: watch(..., (client) => { ... registerSignalHandler(..., {
keyCollectionsStore: { pushKeyCollection } }); loadKeyCollections(client) }) and
the pushKeyCollection registration).
Cargo.toml (1)

14-32: LGTM — workspace deps line up with downstream crate manifests and call-site usage.

A few cross-checks: rand 0.10.1 with the thread_rng feature enables rand::rng(), which is exactly what asset_signature.rs uses; holochain_serialized_bytes = "0.0.57" matches the SerializedBytes derives in types/signing_keys; and excluding tests from the workspace is correct now that it's the sweettest crate with a heavier holochain dep tree.

Optional: the HC core crates are pinned with =0.6.1-rc.5 while holochain_zome_types/holo_hash use a non-= constraint — minor inconsistency that could let cargo pick a different rc minor if one ships before the final 0.6.1 release. Consider = on all four for fully reproducible builds until 0.6.1 stabilizes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Cargo.toml` around lines 14 - 32, The workspace dependency pins are
inconsistent: hdi and hdk use exact (=0.7.1-rc.5 and =0.6.1-rc.5) but
holochain_zome_types and holo_hash use loose constraints; update the entries for
holochain_zome_types and holo_hash in the workspace.dependencies to use the same
exact-version („=0.6.1-rc.5“) format as hdk/hdi so Cargo cannot accidentally
pick a different rc minor — adjust the version strings for holochain_zome_types
and holo_hash to include the leading '=' to match the other HC core crates.
tests/src/lib.rs (2)

345-372: Consider promoting these request types to a shared *_types crate.

The local mirrors (LinkVfKeyDistToKeyCollectionRequest, UnlinkVfKeyFromKeyCollectionRequest, SearchKeysRequest, MarkVfKeyDistRequest) are intentional copies of structs declared inside coordinator zomes. This works (sweettest's call_fallible only needs Serialize), but any future field rename/addition in the coordinator's struct will silently desync this mirror — the call will succeed but deserialize to default/unexpected values on the zome side. Long term, exposing these via types/signing_keys/ (similar to how DistributeVfKeyRequest already lives there) avoids the drift class entirely.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/src/lib.rs` around lines 345 - 372, The four local mirror structs
(LinkVfKeyDistToKeyCollectionRequest, UnlinkVfKeyFromKeyCollectionRequest,
SearchKeysRequest, MarkVfKeyDistRequest) should be moved into the shared types
crate (e.g., types::signing_keys) and re-exported so both the coordinator zomes
and tests import the canonical definitions; remove the duplicated local
declarations in tests/src/lib.rs, add use imports from the shared crate where
these types are referenced (matching the existing DistributeVfKeyRequest
pattern), and run cargo to ensure serialization traits (Serialize/Deserialize)
and any dependent enums like MarkVfKeyDistOpt/AgentPubKey/ActionHash are
properly exported or re-exported from the types crate.

100-129: Retry helper uses fixed-delay; consider exponential backoff.

with_retry polls every 500 ms for up to 10 attempts (~5 s total). For the in-process sweettest network, a fixed cadence is usually fine, but for the must_get_agent_activity cascade path this is sometimes too short, which is partially why several call sites are still #[ignore]d. Switching to exponential backoff (e.g., 250 ms → ~10 s budget) would absorb more of the cascade-warming variance without ballooning best-case latency. Optional.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/src/lib.rs` around lines 100 - 129, Update the with_retry helper to use
exponential backoff instead of a fixed 500ms delay: replace the DELAY_MS
constant with an initial_delay_ms (e.g., 250) and on each retry compute
sleep_duration = initial_delay_ms * 2u64.pow(attempt_index) (optionally cap with
a max_delay_ms to avoid unbounded waits), then call
tokio::time::sleep(Duration::from_millis(sleep_duration)). Keep the same
MAX_ATTEMPTS, preserve the error handling and last_err logic in with_retry, and
ensure you use the loop index to compute the backoff for the tokio::time::sleep
call.
dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs (1)

436-436: Unusual &mut rand::rng() binding — verify intent.

let mut rng = &mut rand::rng(); binds rng to a &mut ThreadRng over a temporary. This compiles because rust extends the temporary's lifetime, and rand::seq::IndexedRandom examples in the rand 0.9 docs use this same form. So calls like shuffle(&mut rng) (passing &mut &mut R) are accepted via the blanket Rng for &mut R impl. No correctness bug, but the simpler let mut rng = rand::rng(); is more idiomatic. Optional cleanup.

Also applies to: 529-529, 589-589

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs` at line 436, The
current binding let mut rng = &mut rand::rng(); creates a mutable reference to a
temporary and is non-idiomatic; change it to let mut rng = rand::rng(); in the
places noted (the rng variable at the three occurrences) so subsequent uses
(e.g., calls that pass &mut rng such as shuffle/sample_slice/choose) continue to
work via the &mut R impl but without binding to a temporary reference. Update
each occurrence (the declarations of rng at the three highlighted lines)
accordingly.
tests/Cargo.toml (1)

18-25: Document-only: track removal of the digest/sha1/sha2 RC pins.

Pinning to RC versions of sha1/sha2/digest with = is a reasonable short-term workaround, but it will silently block any patch fixes (including security fixes) that land on those RC streams and bumping Holochain past the rc.8 dev-dep chain may flip the resolver back to a digest 0.11.x that no longer needs this pin. Consider opening a tracking issue/TODO so these pins get revisited when the upstream chain updates iroh-relay/ed25519-dalek/curve25519-dalek to a stable digest 0.11+.

Want me to draft a short tracking issue referencing the upstream curve25519-dalek/ed25519-dalek pre-releases that this pin is gating on?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Cargo.toml` around lines 18 - 25, Update this document-only workaround
by adding a short tracking TODO and creating a repository issue so the RC pins
for sha1/sha2/digest (the entries "sha1", "sha2", and "digest" in Cargo.toml)
are revisited when upstream stabilizes; modify the existing comment block to
reference that tracking issue and to note the exact upstream pre-releases
(curve25519-dalek/ed25519-dalek) that this pin is gating on, and open the issue
with a brief description and links to those upstream pre-releases so maintainers
can remove the "=" RC pins once upstream updates.
tests/tests/fetch.rs (1)

271-298: Index-based reason assertions assume pick_signatures ordering stays stable.

check_signatures_alice[0].reason == Mine / [1] == RandomRecent (and the same shape for bob) rely on the implicit category order produced by pick_signatures. That's currently Mine → Pinned → Historical → Recent, but an implementation tweak that reorders categories or stably sorts results would silently break these without indicating a real regression. Consider asserting via iter().any(|r| r.reason == ...) or matching the multiset of reasons.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/tests/fetch.rs` around lines 271 - 298, The tests currently assert
fixed positions for FetchCheckSignatureReason values produced by prepare_fetch
and pick_signatures (e.g., check_signatures_alice[0].reason == Mine), which is
fragile to category reordering; update the assertions to check for presence
rather than index: for each of check_signatures_alice and check_signatures_bob,
collect or iterate the reasons (or the (author,reason) pairs) and assert the
expected reasons exist (use iter().any(|r| r.reason ==
FetchCheckSignatureReason::Mine), iter().any(...RandomRecent), or compare
multisets of reasons), and for bob keep the pinned-specific checks by finding
the entry whose reason matches FetchCheckSignatureReason::Pinned and then assert
its pinned.key_name/key_collection and author match expectations. Ensure you
reference prepare_fetch, pick_signatures, check_signatures_alice,
check_signatures_bob, and FetchCheckSignatureReason when locating code to
change.
tests/tests/signing_keys.rs (1)

174-177: Brittle substring match on error message.

err.to_string().contains("maximum") is fine as a smoke check, but tightly couples this test to the exact error text in create_key_collection. Consider matching a more specific phrase (or asserting on a typed error) so harmless wording tweaks in the zome don't silently turn this from a real-failure assertion into a no-op.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/tests/signing_keys.rs` around lines 174 - 177, The test currently does
a brittle substring check on the error string from create_key_collection
(err.to_string().contains("maximum")); instead, assert a specific error type or
a more precise phrase: capture err from create_key_collection(&conductor,
&alice, "a test too many").await.unwrap_err() and either pattern-match the error
to the concrete variant (e.g. match/assert that
err.downcast_ref::<SigningError>() == Some(&SigningError::TooManyKeyCollections)
or use assert_matches! on the returned Err), or at minimum check a tighter
message fragment like "too many key collections" rather than the generic
"maximum" to avoid fragile wording changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/release.yaml:
- Around line 26-29: The cachix step using cachix/cachix-action@v17 in the
release workflow is missing the authToken so it cannot push artifacts to the
esl-checked cache; update the step for the release job (the cachix action block)
to include authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} so release builds can
push, or if intentional, add a brief comment above the cachix step explaining
why writes are disabled for releases; target the cachix action block (uses:
cachix/cachix-action@v17 / with: name: esl-checked) when making this change.

In `@dnas/checked/zomes/coordinator/fetch/Cargo.toml`:
- Line 12: Remove the unused dependency entry holochain_serialized_bytes from
the crate's Cargo.toml (the dependency line "holochain_serialized_bytes = {
workspace = true }"); there are no references to that crate in the source and
hdk already re-exports the needed serialization types/traits, so delete that
dependency line to avoid an unnecessary dependency.

In `@dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs`:
- Around line 306-309: Fix the typo in the warn! message inside
asset_signature.rs where the string currently reads "asset signature signature";
update the warn! call (referencing sig.key_dist_address and the warn! invocation
in the same block) to remove the duplicated "signature" so it reads e.g.
"Discarding my existing asset signature because the key distribution could not
be fetched: {:?}" while keeping the sig.key_dist_address interpolation
unchanged.

In `@types/checked_types/Cargo.toml`:
- Line 8: Remove the unused holochain_serialized_bytes dependency from
Cargo.toml by deleting the line "holochain_serialized_bytes = { workspace = true
}"; then run cargo check/build to verify no remaining references to
SerializedBytes. Also scan the crate for any leftover use/imports or types named
SerializedBytes and remove them if present, ensuring only holochain_zome_types
and serde are imported and used.

---

Outside diff comments:
In `@flake.nix`:
- Around line 93-111: The devShell removed hc-launch but package.json still
calls it from the npm scripts start:tauri and launch:tauri; either restore
hc-launch into the devShell packages list (add hc-launch to the packages array
in the devShells.default block) or update the npm scripts start:tauri and
launch:tauri to invoke hc-spin --piped (matching launch:happ) so the commands
available in nix develop match what's referenced by the scripts; reference the
hc-launch and hc-spin symbols and the start:tauri/launch:tauri script names when
making the change.

In `@ui/src/checked/signing_keys/AddKeyToCollection.vue`:
- Around line 59-96: The addKeyToCollection handler currently calls
client.value.callZome() without awaiting it and uses a stray bare block to reset
linking.value; convert addKeyToCollection to an async function, await
client.value.callZome(...) so the try/catch can catch rejections, move
keyCollectionsStore.addKeyToCollection(...), emit("added"), and the success
notification to run after the awaited call, and replace the trailing bare block
with a proper finally { linking.value = false; } so linking is always reset even
on throw; keep the same role/zome/fn payload and preserve the error notification
in the catch.

In `@ui/src/checked/signing_keys/CreateKeyCollection.vue`:
- Around line 15-41: The handler createKeyCollection calls client.value.callZome
without awaiting it, causing unhandled rejections and premature state/reset;
change it to await the callZome call (await client.value.callZome(...)) inside
the try block, only emit("created", keyCollectionName.value) and clear
keyCollectionName.value after the await succeeds, and let the catch(e) handle
rejections so creating.value is only reset in finally after the awaited call
completes; reference createKeyCollection, client.value.callZome, emit,
keyCollectionName, and creating.value when making these changes.

In `@ui/src/checked/signing_keys/DistributeSigningKey.vue`:
- Around line 154-158: The error notification message in the catch block for the
distribution flow duplicates the word "key"; update the
notifications.pushNotification call in DistributeSigningKey.vue (the catch
handling that currently sets message: `Failed to distribute the verification key
key: ${e}`) to remove the extra "key" so it reads e.g. `Failed to distribute the
verification key: ${e}` while keeping the existing error interpolation and
type:"error".

---

Nitpick comments:
In @.github/workflows/test.yaml:
- Line 78: The workflow currently pins holochain_cli to the release candidate
string "[email protected]"; update this to the GA release when it's
published by replacing the package spec with "[email protected]" (remove the
"-rc.8" suffix) and re-run CI to ensure the change installs cleanly, and add a
short TODO or create a follow-up ticket referencing this pin so we remember to
switch to the GA version if it's not already available.

In `@Cargo.toml`:
- Around line 14-32: The workspace dependency pins are inconsistent: hdi and hdk
use exact (=0.7.1-rc.5 and =0.6.1-rc.5) but holochain_zome_types and holo_hash
use loose constraints; update the entries for holochain_zome_types and holo_hash
in the workspace.dependencies to use the same exact-version („=0.6.1-rc.5“)
format as hdk/hdi so Cargo cannot accidentally pick a different rc minor —
adjust the version strings for holochain_zome_types and holo_hash to include the
leading '=' to match the other HC core crates.

In `@checked_cli/Cargo.toml`:
- Around line 39-46: Add a short tracking task and follow-up checklist to remove
the RC-version exact pins for sha1, sha2, and digest in Cargo.toml once upstream
holochain/i​roh-relay (and transitive ed25519-dalek/curve25519-dalek) are
updated; specifically create an issue that references the exact pinned symbols
(sha1, sha2, digest) and the Cargo.toml change, include steps to (a) wait for
holochain 0.6.1 stable and confirm iroh-relay/ pkarr no longer require
digest::crypto_common, (b) remove the "=" exact-version pins for
sha1/sha2/digest, (c) run cargo update and cargo metadata to ensure no other
workspace member pins or conflicts remain, and (d) verify security advisory
pickup works after unpinning.

In `@dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs`:
- Line 436: The current binding let mut rng = &mut rand::rng(); creates a
mutable reference to a temporary and is non-idiomatic; change it to let mut rng
= rand::rng(); in the places noted (the rng variable at the three occurrences)
so subsequent uses (e.g., calls that pass &mut rng such as
shuffle/sample_slice/choose) continue to work via the &mut R impl but without
binding to a temporary reference. Update each occurrence (the declarations of
rng at the three highlighted lines) accordingly.

In `@dnas/checked/zomes/integrity/fetch/src/asset_signature.rs`:
- Around line 1-5: The import uses crate::prelude::make_asset_url_address from
an internal sibling module; change it to import the canonical path
crate::common::make_asset_url_address instead to avoid indirection. Locate the
use of make_asset_url_address in this module (asset_signature.rs) and replace
the prelude import with the direct crate::common::make_asset_url_address import
while keeping other imports (UnitEntryTypes, LinkTypes, AssetSignature,
hdi::prelude) unchanged.

In `@tests/Cargo.toml`:
- Around line 18-25: Update this document-only workaround by adding a short
tracking TODO and creating a repository issue so the RC pins for
sha1/sha2/digest (the entries "sha1", "sha2", and "digest" in Cargo.toml) are
revisited when upstream stabilizes; modify the existing comment block to
reference that tracking issue and to note the exact upstream pre-releases
(curve25519-dalek/ed25519-dalek) that this pin is gating on, and open the issue
with a brief description and links to those upstream pre-releases so maintainers
can remove the "=" RC pins once upstream updates.

In `@tests/src/lib.rs`:
- Around line 345-372: The four local mirror structs
(LinkVfKeyDistToKeyCollectionRequest, UnlinkVfKeyFromKeyCollectionRequest,
SearchKeysRequest, MarkVfKeyDistRequest) should be moved into the shared types
crate (e.g., types::signing_keys) and re-exported so both the coordinator zomes
and tests import the canonical definitions; remove the duplicated local
declarations in tests/src/lib.rs, add use imports from the shared crate where
these types are referenced (matching the existing DistributeVfKeyRequest
pattern), and run cargo to ensure serialization traits (Serialize/Deserialize)
and any dependent enums like MarkVfKeyDistOpt/AgentPubKey/ActionHash are
properly exported or re-exported from the types crate.
- Around line 100-129: Update the with_retry helper to use exponential backoff
instead of a fixed 500ms delay: replace the DELAY_MS constant with an
initial_delay_ms (e.g., 250) and on each retry compute sleep_duration =
initial_delay_ms * 2u64.pow(attempt_index) (optionally cap with a max_delay_ms
to avoid unbounded waits), then call
tokio::time::sleep(Duration::from_millis(sleep_duration)). Keep the same
MAX_ATTEMPTS, preserve the error handling and last_err logic in with_retry, and
ensure you use the loop index to compute the backoff for the tokio::time::sleep
call.

In `@tests/tests/fetch.rs`:
- Around line 271-298: The tests currently assert fixed positions for
FetchCheckSignatureReason values produced by prepare_fetch and pick_signatures
(e.g., check_signatures_alice[0].reason == Mine), which is fragile to category
reordering; update the assertions to check for presence rather than index: for
each of check_signatures_alice and check_signatures_bob, collect or iterate the
reasons (or the (author,reason) pairs) and assert the expected reasons exist
(use iter().any(|r| r.reason == FetchCheckSignatureReason::Mine),
iter().any(...RandomRecent), or compare multisets of reasons), and for bob keep
the pinned-specific checks by finding the entry whose reason matches
FetchCheckSignatureReason::Pinned and then assert its
pinned.key_name/key_collection and author match expectations. Ensure you
reference prepare_fetch, pick_signatures, check_signatures_alice,
check_signatures_bob, and FetchCheckSignatureReason when locating code to
change.

In `@tests/tests/signing_keys.rs`:
- Around line 174-177: The test currently does a brittle substring check on the
error string from create_key_collection (err.to_string().contains("maximum"));
instead, assert a specific error type or a more precise phrase: capture err from
create_key_collection(&conductor, &alice, "a test too many").await.unwrap_err()
and either pattern-match the error to the concrete variant (e.g. match/assert
that err.downcast_ref::<SigningError>() ==
Some(&SigningError::TooManyKeyCollections) or use assert_matches! on the
returned Err), or at minimum check a tighter message fragment like "too many key
collections" rather than the generic "maximum" to avoid fragile wording changes.

In `@ui/src/holochain-client.ts`:
- Around line 1-4: The module exports a module-level ref holochainClient storing
AppClient|null which works but would be better surfaced via a small Pinia store
for devtools, testing, and lifecycle cohesion; create a Pinia store (e.g.,
useHolochainClientStore) that exposes the same state currently held by
holochainClient plus actions for connect/disconnect (used by App.vue onMounted
to assign the client) so consumers import the store and access the client via
store.client or subscribe to changes instead of the raw holochainClient ref, and
move any connect/disconnect/reconnect/auth-refresh logic into that store for
future maintenance and mocking.

In `@ui/src/store/key-collections-store.ts`:
- Around line 48-59: The watch callback invokes loadKeyCollections(client) but
leaves the returned promise unhandled; change the call in the watch callback
inside key-collections-store.ts to append a .catch(...) that logs the error
(mirroring my-keys-store.ts) so the promise is not floating and ESLint won’t
complain; update the same pattern in my-asset-signatures-store.ts as well,
keeping the existing try/catch inside loadKeyCollections and only adding the
.catch on the external invocation (reference: watch(..., (client) => { ...
registerSignalHandler(..., { keyCollectionsStore: { pushKeyCollection } });
loadKeyCollections(client) }) and the pushKeyCollection registration).

In `@ui/src/style.css`:
- Around line 6-8: Replace the non-canonical plugin specification `@plugin`
"daisyui/index.js" with the canonical `@plugin` "daisyui" form in the CSS block
that defines themes (the `@plugin` declaration around the themes: bumblebee
--default, luxury --prefersdark;). Keep the themes content unchanged and only
update the plugin identifier to "daisyui" so it matches DaisyUI v5/Tailwind v4
documentation and is resilient to packaging path changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 496165e0-7e8e-4b61-a1d0-d90683c9664e

📥 Commits

Reviewing files that changed from the base of the PR and between 99883b2 and b475004.

⛔ Files ignored due to path filters (5)
  • Cargo.lock is excluded by !**/*.lock
  • checked_cli/Cargo.lock is excluded by !**/*.lock
  • flake.lock is excluded by !**/*.lock
  • package-lock.json is excluded by !**/package-lock.json
  • tests/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (69)
  • .github/workflows/flake_update.yaml
  • .github/workflows/release.yaml
  • .github/workflows/test.yaml
  • .gitignore
  • Cargo.toml
  • checked_cli/Cargo.toml
  • checked_cli/src/distribute.rs
  • checked_cli/src/fetch.rs
  • checked_cli/src/hc_client.rs
  • checked_cli/src/hc_discover.rs
  • checked_cli/src/lib.rs
  • checked_cli/src/sign.rs
  • checked_cli/tests/commands.rs
  • checked_cli/tests/happ_integration.rs
  • dnas/checked/workdir/dna.yaml
  • dnas/checked/zomes/coordinator/fetch/Cargo.toml
  • dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs
  • dnas/checked/zomes/coordinator/fetch/src/lib.rs
  • dnas/checked/zomes/coordinator/signing_keys/Cargo.toml
  • dnas/checked/zomes/coordinator/signing_keys/src/key_collection.rs
  • dnas/checked/zomes/coordinator/signing_keys/src/lib.rs
  • dnas/checked/zomes/coordinator/signing_keys/src/verification_key_dist.rs
  • dnas/checked/zomes/integrity/fetch/Cargo.toml
  • dnas/checked/zomes/integrity/fetch/src/asset_signature.rs
  • dnas/checked/zomes/integrity/fetch/src/lib.rs
  • dnas/checked/zomes/integrity/signing_keys/Cargo.toml
  • dnas/checked/zomes/integrity/signing_keys/src/key_collection.rs
  • dnas/checked/zomes/integrity/signing_keys/src/lib.rs
  • flake.nix
  • package.json
  • rust-toolchain.toml
  • tests/Cargo.toml
  • tests/eslint.config.js
  • tests/package.json
  • tests/src/checked/common.ts
  • tests/src/checked/fetch/common.ts
  • tests/src/checked/fetch/fetch.test.ts
  • tests/src/checked/signing_keys/common.ts
  • tests/src/checked/signing_keys/key-collection.test.ts
  • tests/src/checked/signing_keys/reference-count.test.ts
  • tests/src/checked/signing_keys/validation-key-dist.test.ts
  • tests/src/lib.rs
  • tests/tests/fetch.rs
  • tests/tests/signing_keys.rs
  • tests/vitest.config.ts
  • types/checked_types/Cargo.toml
  • types/fetch/Cargo.toml
  • types/signing_keys/Cargo.toml
  • ui/.eslintrc.cjs
  • ui/eslint.config.mjs
  • ui/package.json
  • ui/postcss.config.js
  • ui/src/App.vue
  • ui/src/checked/signing_keys/AddKeyToCollection.vue
  • ui/src/checked/signing_keys/CreateKeyCollection.vue
  • ui/src/checked/signing_keys/DistributeSigningKey.vue
  • ui/src/checked/signing_keys/SearchKeys.vue
  • ui/src/holochain-client.ts
  • ui/src/signals.ts
  • ui/src/store/key-collections-store.ts
  • ui/src/store/my-asset-signatures-store.ts
  • ui/src/store/my-keys-store.ts
  • ui/src/style.css
  • ui/tailwind.config.js
  • ui/tsconfig.json
  • ui/tsconfig.node.json
  • ui/vite.config.ts
  • workdir/happ.yaml
  • workdir/web-happ.yaml
💤 Files with no reviewable changes (13)
  • ui/.eslintrc.cjs
  • tests/src/checked/signing_keys/key-collection.test.ts
  • tests/src/checked/signing_keys/reference-count.test.ts
  • tests/package.json
  • tests/src/checked/signing_keys/validation-key-dist.test.ts
  • tests/src/checked/fetch/fetch.test.ts
  • tests/vitest.config.ts
  • tests/src/checked/common.ts
  • tests/src/checked/fetch/common.ts
  • tests/eslint.config.js
  • ui/postcss.config.js
  • ui/tailwind.config.js
  • tests/src/checked/signing_keys/common.ts

Comment on lines +26 to 29
- uses: cachix/cachix-action@v17
with:
name: esl-checked
extraPullNames: holochain-ci
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Missing authToken for cachix/cachix-action@v17 — release builds will not push to the binary cache.

Compared to .github/workflows/test.yaml (lines 26-29 in the relevant snippet) which passes authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}, this release job omits it. Without an auth token, cachix is read-only: derivations built during release won't be pushed to esl-checked, so subsequent CI/dev environments lose the caching benefit of the release build. If this is intentional (e.g., release should not write to cache), a brief comment would help; otherwise add the token.

🔧 Proposed fix
       - uses: cachix/cachix-action@v17
         with:
           name: esl-checked
           extraPullNames: holochain-ci
+          authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: cachix/cachix-action@v17
with:
name: esl-checked
extraPullNames: holochain-ci
- uses: cachix/cachix-action@v17
with:
name: esl-checked
extraPullNames: holochain-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release.yaml around lines 26 - 29, The cachix step using
cachix/cachix-action@v17 in the release workflow is missing the authToken so it
cannot push artifacts to the esl-checked cache; update the step for the release
job (the cachix action block) to include authToken: ${{
secrets.CACHIX_AUTH_TOKEN }} so release builds can push, or if intentional, add
a brief comment above the cachix step explaining why writes are disabled for
releases; target the cachix action block (uses: cachix/cachix-action@v17 / with:
name: esl-checked) when making this change.


[dependencies]
hdk = { workspace = true }
holochain_serialized_bytes = { workspace = true }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for any direct references to holochain_serialized_bytes in the fetch coordinator crate.
fd -t f -e rs . dnas/checked/zomes/coordinator/fetch | xargs rg -nP '\bholochain_serialized_bytes\b' || echo "No direct references found."

Repository: EphyraSoftware/checked

Length of output: 94


Remove the unused holochain_serialized_bytes dependency.

No direct references to holochain_serialized_bytes exist in the crate's source. Since hdk already re-exports the serialization types and traits, this dependency is unnecessary and should be removed from line 12.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dnas/checked/zomes/coordinator/fetch/Cargo.toml` at line 12, Remove the
unused dependency entry holochain_serialized_bytes from the crate's Cargo.toml
(the dependency line "holochain_serialized_bytes = { workspace = true }"); there
are no references to that crate in the source and hdk already re-exports the
needed serialization types/traits, so delete that dependency line to avoid an
unnecessary dependency.

Comment on lines +306 to +309
warn!(
"Discarding my existing asset signature signature because the key distribution could not be fetched: {:?}",
sig.key_dist_address
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Typo in warning message: duplicated "signature".

The reflowed warn! reads "asset signature signature". Looks like a stray duplicated word.

📝 Proposed fix
                 warn!(
-                    "Discarding my existing asset signature signature because the key distribution could not be fetched: {:?}",
+                    "Discarding my existing asset signature because the key distribution could not be fetched: {:?}",
                     sig.key_dist_address
                 );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
warn!(
"Discarding my existing asset signature signature because the key distribution could not be fetched: {:?}",
sig.key_dist_address
);
warn!(
"Discarding my existing asset signature because the key distribution could not be fetched: {:?}",
sig.key_dist_address
);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dnas/checked/zomes/coordinator/fetch/src/asset_signature.rs` around lines 306
- 309, Fix the typo in the warn! message inside asset_signature.rs where the
string currently reads "asset signature signature"; update the warn! call
(referencing sig.key_dist_address and the warn! invocation in the same block) to
remove the duplicated "signature" so it reads e.g. "Discarding my existing asset
signature because the key distribution could not be fetched: {:?}" while keeping
the sig.key_dist_address interpolation unchanged.

[dependencies]
serde = { workspace = true }
holochain_zome_types = { workspace = true }
holochain_serialized_bytes = { workspace = true }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Look for direct references to holochain_serialized_bytes in the checked_types crate
fd -t f -e rs . types/checked_types/src 2>/dev/null | xargs rg -nP '\bholochain_serialized_bytes\b|\bSerializedBytes\b' || true
# Also look for derive macros that require SB to be in scope
fd -t f -e rs . types/checked_types/src 2>/dev/null | xargs rg -nP 'derive\([^)]*SerializedBytes' || true

Repository: EphyraSoftware/checked

Length of output: 48


🏁 Script executed:

# Verify the dependency actually exists in Cargo.toml
cat types/checked_types/Cargo.toml

# List all Rust files in the crate
echo "=== All Rust files in checked_types ==="
find types/checked_types/src -type f -name "*.rs"

# Search for any imports or use statements that might reference the crate indirectly
echo "=== Search for use statements and imports ==="
find types/checked_types/src -type f -name "*.rs" -exec grep -l "use\|extern" {} \;

Repository: EphyraSoftware/checked

Length of output: 421


🏁 Script executed:

# Read the lib.rs file to see what's actually imported/exported
cat types/checked_types/src/lib.rs

Repository: EphyraSoftware/checked

Length of output: 2204


Remove the unused holochain_serialized_bytes dependency.

The crate imports only from holochain_zome_types (for ActionHash, AgentPubKey, Timestamp) and serde. No code in the crate references holochain_serialized_bytes or SerializedBytes. This dependency adds unnecessary bloat and should be removed from Cargo.toml.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@types/checked_types/Cargo.toml` at line 8, Remove the unused
holochain_serialized_bytes dependency from Cargo.toml by deleting the line
"holochain_serialized_bytes = { workspace = true }"; then run cargo check/build
to verify no remaining references to SerializedBytes. Also scan the crate for
any leftover use/imports or types named SerializedBytes and remove them if
present, ensuring only holochain_zome_types and serde are imported and used.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant