Skip to content

Repo hygiene, CI gate hardening, panic-path fixes, and a rand 0.9 build fix#860

Merged
adolago merged 11 commits into
mainfrom
improvements/hygiene-ci-panics
Jun 13, 2026
Merged

Repo hygiene, CI gate hardening, panic-path fixes, and a rand 0.9 build fix#860
adolago merged 11 commits into
mainfrom
improvements/hygiene-ci-panics

Conversation

@adolago

@adolago adolago commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Summary

A codebase-improvement sweep across four areas — repo hygiene/docs accuracy, lint & CI gate hardening, targeted production panic fixes, and the beta-readiness queue — plus a critical build fix: main did not compile when this branch started.

⚠️ main was broken

The dependabot PR #859 (merged after the repo ownership change) bumped rand 0.8 → 0.9 — a breaking API change — without migrating any code, leaving the crate uncompilable (11 errors: OsRng moved to the fallible TryRngCore, thread_rng/gen/gen_range renamed, StdRng::from_entropy removed). The soft CI gates let it merge, which is exactly the gap the lint-hardening commits here close. The migration is 4633b45d.

What's in here (11 commits)

Repo hygiene & docs (#849)

  • Remove git-tracked junk: a 3.9 MB compiled bench_security binary, two already-applied patch*.diff files, test_output.txt, and 799 runtime .rustible_state/ snapshots; ignore them going forward.
  • CLAUDE.md listed npm scripts for this cargo project — replaced with the real cargo commands.
  • Point issue links and Cargo.toml repository at adolago/rustible (the repo had moved; Cargo.toml pointed at a third, unrelated URL). Reconcile WinRM / azure / gcp / rollback status in ROADMAP.md and the winrm feature comment against the canonical docs/FEATURE_STATUS.md. Drop the stale RUSTSEC-2026-0009 audit ignore (the lockfile already resolves the fixed time 0.3.47).

rand 0.9 migration (#850)4633b45d

  • thread_rng()rng(), gen*random*. Crypto paths (vault, vars, CLI vault) now use the rand_core 0.6 OsRng re-exported by aes-gcm's aead, matching what argon2/aes-gcm expect rather than relying on rand's version lining up by coincidence. Signing-key generation uses TryRngCore::try_fill_bytes with an explicit panic on OS-entropy failure. The russh test key helper uses ssh-key's own OsRng (its "seeded for reproducibility" comment was wrong — from_entropy was never reproducible).

Lint & CI gate hardening

  • Cleared all 56 default-target clippy warnings (sort_by_key+Reverse for descending sorts, checked_div, is_multiple_of, collapsed match arms, and if let replacing unwrap-after-is_some in the privilege-escalation and DB paths).
  • ci.yml clippy is now a hard gate: cargo clippy --all-targets -- -D warnings (was warning-only on lib/bins, with a stale "tests don't compile" comment the feature_matrix job already disproved). clippy.toml allows unwrap/expect/panic in tests so the security SAST scan reports production signal instead of ~4000 test hits. Cargo.toml [lints.clippy] denies dbg_macro/todo.
  • security.yml license gate is now hard: deny.toml is checked in (was generated inline and run with || true, so it could never fail). Advisory checks stay owned by cargo-audit/.cargo/audit.toml to avoid two ignore-lists drifting.

Production panic-path fixes0f9919ac

  • Skip inventory hosts that compose rules removed mid-iteration; degrade a pre-epoch system clock to zeroed timestamps instead of killing a distributed controller; JSON CLI output falls back to a serialization-error object instead of panicking mid-render (new json_line/json_pretty, 18 sites); resolver template captures degrade gracefully.

Beta-readiness: vault zeroization331f45cd

  • The library vault already used SecretString; the CLI VaultEngine kept a plain String alive for the whole command. It now uses zeroizing storage from all three password sources (file, RUSTIBLE_VAULT_PASSWORD, interactive prompt), and transient read buffers are wiped. Closes the alpha-readiness tracker's vault item.

Verification

Local, default features unless noted:

Check Result
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings ✅ 0
cargo test --lib ✅ 2961 passed
bash scripts/smoke_tests.sh ✅ 3
cargo test --test secrets_zeroization_tests ✅ 49
vault unit tests (incl. new SecretString round-trip) ✅ 4
cargo check --all-targets --no-default-features --features experimental,full-provisioning,api,database (CI aggregate bundle)
cargo check --features kubernetes,ssh2-backend --lib

The aggregate bundle caught a real bug pre-push: clippy --fix (run under default features) had underscored two bindings whose only uses are behind non-default cfg gates, breaking the feature builds — fixed in f4c47efd.

Notes & risks

  • Behavior-neutral: the panic-path and clippy rewrites preserve semantics (stable sorts/tie order, identical division results, identical branch conditions). Escalation-path if let rewrites are privilege-sensitive but verified via connection tests + smoke.
  • Self-validating gates: the newly-hardened ci.yml clippy gate and security.yml license gate run on this PR. Accepted ratchet: a future rolling-stable clippy may add lints and fail CI without code changes — fix-forward rather than pinning the toolchain here.
  • deny.toml first hard run: the license gate has never failed-hard before; the checked-in policy mirrors what CI previously generated. If it flags a license, triage against the allow list rather than restoring || true.

Follow-ups (not in this PR)

🤖 Generated with Claude Code

adolago and others added 11 commits June 12, 2026 21:57
Remove a 3.9MB compiled benchmark binary (bench_security), two stale
patch files whose changes are already applied to src/executor/mod.rs,
a leftover cargo test log, and 799 runtime state snapshots under
.rustible_state/ that were never read by tests or source. Ignore all
of these going forward.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The file listed npm scripts that have never applied to this cargo
project, which misleads agentic tooling into wrong build/test/lint
invocations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Point issue links and Cargo.toml repository at adolago/rustible
  (repo transferred from kernelfirma; Cargo.toml pointed at a third,
  unrelated URL)
- Reconcile WinRM and azure_vm/gcp_compute status with canonical
  docs/FEATURE_STATUS.md (beta and experimental respectively, not
  stub/complete)
- Soften ROADMAP rollback rows to Beta quality, matching the Remaining
  Beta Gate section in the same file
- Drop the RUSTSEC-2026-0009 audit ignore: the lock already resolves
  time 0.3.47 (the fixed release) since MSRV moved to 1.88

Progresses #849.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PR #859 bumped rand 0.8 -> 0.9 (a breaking release) without touching
code, leaving main uncompilable: OsRng moved to fallible TryRngCore,
thread_rng/gen/gen_range were renamed, and StdRng::from_entropy was
removed. The soft clippy/check gates let it merge; this lands the
actual migration:

- thread_rng() -> rng(), gen() -> random(), gen_range -> random_range
- vault/vars/cli-vault crypto paths now use the rand_core 0.6 OsRng
  re-exported by aes-gcm's aead, matching what argon2/aes-gcm expect,
  instead of relying on rand's version coincidentally lining up
- signing key generation uses TryRngCore::try_fill_bytes with an
  explicit panic on OS entropy failure
- russh test key helper uses ssh-key's own rand_core OsRng (the
  'seeded for reproducibility' comment was wrong: from_entropy was
  never reproducible)
- same renames applied to tests/ and benches/ssh_comparison

Progresses #850.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Resolves the 56 outstanding warnings so the lint gate can be enforced:
sort_by_key with Reverse for descending sorts, checked_div for manual
zero-guarded division, is_multiple_of, collapsed match arms, and
if-let bindings replacing unwrap-after-is_some in the privilege
escalation paths (local/ssh/russh/kubernetes), junos commit-confirm,
and postgresql socket handling. Bench helpers used only by env-gated
ssh2 benches and unit tests get explicit allow(dead_code).

Behavior-neutral: identical ordering (stable sorts, tie behavior
preserved), identical division results, identical branch conditions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ci.yml: clippy now runs with --all-targets and -D warnings instead
  of warning-only on lib/bins. The old comment claimed tests do not
  compile under feature combinations; the feature_matrix job has been
  proving otherwise with cargo check --all-targets per bundle.
- clippy.toml: allow unwrap/expect/panic in test code so the
  security workflow's unwrap_used/expect_used scan reports production
  signal instead of ~4000 test-code hits.
- Cargo.toml [lints.clippy]: deny dbg_macro and todo, warn on
  unimplemented, so debugging leftovers cannot land on main. The two
  test mocks using unimplemented! switch to descriptive panics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The licenses job previously generated deny.toml on the fly and ran
cargo deny with '|| true', so license/ban/source violations could
never fail the workflow. The policy file is now version-controlled
(same content CI used to generate) and the gate is hard. Advisory
checking stays owned by cargo-audit and .cargo/audit.toml; the deny
gate covers licenses, bans, and sources to avoid two advisory ignore
lists drifting apart.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
is_multiple_of, collapsed match guards, and rustfmt normalization in
files missed by the previous lint-cleanup commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- inventory/constructed: skip hosts that compose rules removed from
  the inventory mid-iteration instead of unwrapping the lookup
- distributed/types: a pre-epoch system clock now degrades to zeroed
  timestamps instead of killing the controller; the static default
  bind address parse documents its infallibility with expect
- cli/output: JSON rendering falls back to a serialization-error
  object instead of panicking mid-output (new json_line/json_pretty
  helpers replace 18 unwrap/expect sites)
- provisioning/resolver: template capture groups degrade gracefully
  if the regex ever changes shape, instead of unwrapping

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Closes the remaining alpha-readiness tracker item on vault password
hygiene: the library vault already stored its password as
SecretString, but the CLI VaultEngine kept a plain String alive for
the whole command. The engine now uses SecretString, the password
acquisition helpers return SecretString from all three sources
(password file, RUSTIBLE_VAULT_PASSWORD, interactive prompt), and
transient file-read buffers are zeroized after trimming. No call-site
ripple: the constructor takes impl Into<SecretString>.

Covered by tests/secrets_zeroization_tests.rs (49 green) and a new
SecretString round-trip test in the vault unit suite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cargo clippy --fix ran under default features and underscored two
bindings whose only uses are behind non-default cfg gates, breaking
compilation under those features:

- src/cli/commands/state.rs: the `state` path in the Mv and
  ReplaceProvider arms is consumed only inside
  #[cfg(feature = "provisioning")]; it had been turned into
  `state: _`. Restore the binding and reference it in the
  not-provisioning branch so it stays used in every config.
- tests/cloud_integration_tests.rs: `registry` is asserted on only
  under the aws/azure/gcp gates; it had become `_registry`. Restore
  it with a statement-level allow(unused_variables).

Caught by the aggregate feature-bundle compile
(experimental,full-provisioning,api,database) — the CI feature_matrix
job mirrors this. Default-features clippy -D warnings stays clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@qodo-code-review

qodo-code-review Bot commented Jun 13, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (1)

Context used

Grey Divider


Action required

1. CLAUDE clippy command mismatched 📎 Requirement gap ⚙ Maintainability
Description
CLAUDE.md documents cargo clippy --lib --bins -- -D warnings, but CI now runs `cargo clippy
--all-targets -- -D warnings`, so contributors following the documented steps may miss lint failures
that block merges.
Code

CLAUDE.md[6]

+- `cargo clippy --lib --bins -- -D warnings` - Lint
Evidence
Compliance requires documenting a locally reproducible subset of required CI checks. The PR updates
CI to run clippy with --all-targets but updates CLAUDE.md to a narrower --lib --bins command,
so the documented steps no longer reproduce the required gate.

Required CI/test subset is documented and reproducible locally
CLAUDE.md[4-7]
.github/workflows/ci.yml[45-48]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`CLAUDE.md` documents a clippy command (`--lib --bins`) that does not match the merge-gating CI clippy job (`--all-targets`). This breaks the goal of having locally reproducible required checks.

## Issue Context
CI was updated to run `cargo clippy --all-targets -- -D warnings`.

## Fix Focus Areas
- CLAUDE.md[4-7]
- .github/workflows/ci.yml[45-48]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Invalid JSON fallback 🐞 Bug ≡ Correctness
Description
json_line/json_pretty interpolate serde_json::Error into a hand-built JSON string without escaping,
so the fallback can become invalid JSON if the error contains quotes/backslashes/newlines. This
breaks machine JSON output exactly in the serialization-failure scenario the helpers are meant to
handle.
Code

src/cli/output.rs[R14-25]

+/// Serialize for line-oriented JSON output without panicking; emits a JSON
+/// error object if serialization itself fails.
+fn json_line<T: serde::Serialize>(value: &T) -> String {
+    serde_json::to_string(value)
+        .unwrap_or_else(|e| format!(r#"{{"error":"serialization failed: {}"}}"#, e))
+}
+
+/// Pretty-printing variant of [`json_line`].
+fn json_pretty<T: serde::Serialize>(value: &T) -> String {
+    serde_json::to_string_pretty(value)
+        .unwrap_or_else(|e| format!(r#"{{"error":"serialization failed: {}"}}"#, e))
+}
Evidence
The helpers manually embed the error text into a JSON string via format!, which does not JSON-escape
the inserted message. These helpers are used for JSON-mode printing, so malformed fallback JSON
breaks downstream consumers.

src/cli/output.rs[14-25]
src/cli/output.rs[232-240]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`json_line`/`json_pretty` currently build a JSON fallback via `format!(r#"{"error":"... {}"}"#, e)`, inserting the error string unescaped. This can produce invalid JSON (and/or multi-line output) when serialization fails.

### Issue Context
These helpers are used for JSON-mode CLI output, so the fallback must itself always be valid JSON.

### Fix Focus Areas
- Replace the `format!(...)` fallback with a `serde_json::json!({...})` value and serialize that (which guarantees proper escaping).
- Ensure both line-oriented and pretty variants remain single JSON values (and consider keeping the fallback schema stable, e.g. `{ "error": "serialization_failed", "details": "..." }`).

### Fix Focus Areas (code pointers)
- src/cli/output.rs[14-25]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Pre-epoch ID collisions 🐞 Bug ☼ Reliability
Description
ControllerId::generate (and similar generators) now use unwrap_or_default() when SystemTime is
before UNIX_EPOCH, collapsing the timestamp to 0 and producing repeatable IDs like ctrl-0. Because
ControllerId/WorkUnitId are used as HashMap keys in distributed state, duplicates can conflate peers
or overwrite work-unit entries under this (rare) clock condition.
Code

src/distributed/types.rs[R24-29]

        use std::time::{SystemTime, UNIX_EPOCH};
        let timestamp = SystemTime::now()
            .duration_since(UNIX_EPOCH)
-            .unwrap()
+            .unwrap_or_default()
            .as_nanos();
        Self(format!("ctrl-{:x}", timestamp))
Evidence
ID generation is derived solely from epoch duration; when that duration defaults to zero, IDs
repeat. ControllerId/WorkUnitId are used as HashMap keys in cluster/controller state, so duplicates
can overwrite entries.

src/distributed/types.rs[22-30]
src/distributed/controller.rs[23-37]
src/distributed/cluster.rs[21-29]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`ControllerId::generate` (and other ID generators) now use `unwrap_or_default()` on `duration_since(UNIX_EPOCH)`. When the system clock is before 1970, this yields a constant `Duration::default()` and therefore generates duplicate IDs (e.g. `ctrl-0`).

### Issue Context
These IDs are used as keys in cluster/work-unit HashMaps; collisions can overwrite entries or conflate nodes.

### Fix Focus Areas
- On `duration_since` error, generate a uniqueness-preserving suffix (e.g. `Uuid::new_v4()` or cryptographic random bytes) rather than defaulting to 0.
- Consider switching ID generation entirely to UUIDs if ordering is not required.
- Apply consistently across `ControllerId`, `WorkUnitId`, `RunId`, and any other IDs derived from epoch time.

### Fix Focus Areas (code pointers)
- src/distributed/types.rs[22-30]
- src/distributed/types.rs[49-57]
- src/distributed/types.rs[76-84]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

@qodo-code-review

qodo-code-review Bot commented Jun 13, 2026

Copy link
Copy Markdown

CI Feedback 🧐

(Feedback updated until commit f4c47ef)

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Cargo Audit

Failed stage: Run cargo audit [❌]

Failed test name: ""

Failure summary:

The action failed during the cargo audit security check because RustSec reported vulnerabilities in
the dependency tree.
- cargo audit reported error: 16 vulnerabilities found! and the workflow step
explicitly converts this into a CI failure by printing ::error::Security vulnerabilities detected!
and exiting with code 1 (see log lines ~987-991 and ~1927-1931).
- Example vulnerable dependencies
called out by the report:
- aws-lc-sys 0.35.0 (e.g., advisories RUSTSEC-2026-0045 and another
AWS-LC issue) with suggested fix: upgrade to >=0.38.0.
- rustls-webpki 0.103.8 (advisories
RUSTSEC-2026-0099 and RUSTSEC-2026-0098) with suggested fix: upgrade to >=0.103.12 (with the noted
version constraints).
Note: there is also an "unmaintained" warning for proc-macro-error2 2.0.1
(RUSTSEC-2026-0173), but the CI failure is caused by the detected vulnerabilities, not the allowed
warnings.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

224:  env:
225:  CARGO_TERM_COLOR: always
226:  targets: 
227:  components: 
228:  ##[endgroup]
229:  ##[group]Run : set $CARGO_HOME
230:  �[36;1m: set $CARGO_HOME�[0m
231:  �[36;1mecho CARGO_HOME=${CARGO_HOME:-"$HOME/.cargo"} >> $GITHUB_ENV�[0m
232:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
233:  env:
234:  CARGO_TERM_COLOR: always
235:  ##[endgroup]
236:  ##[group]Run : install rustup if needed
237:  �[36;1m: install rustup if needed�[0m
238:  �[36;1mif ! command -v rustup &>/dev/null; then�[0m
239:  �[36;1m  curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused --location --silent --show-error --fail https://sh.rustup.rs | sh -s -- --default-toolchain none -y�[0m
240:  �[36;1m  echo "$CARGO_HOME/bin" >> $GITHUB_PATH�[0m
...

301:  �[36;1mif [ -z "${CARGO_REGISTRIES_CRATES_IO_PROTOCOL+set}" -o -f "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol ]; then�[0m
302:  �[36;1m  if rustc +stable --version --verbose | grep -q '^release: 1\.6[89]\.'; then�[0m
303:  �[36;1m    touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true�[0m
304:  �[36;1m    echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse >> $GITHUB_ENV�[0m
305:  �[36;1m  elif rustc +stable --version --verbose | grep -q '^release: 1\.6[67]\.'; then�[0m
306:  �[36;1m    touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true�[0m
307:  �[36;1m    echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git >> $GITHUB_ENV�[0m
308:  �[36;1m  fi�[0m
309:  �[36;1mfi�[0m
310:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
311:  env:
312:  CARGO_TERM_COLOR: always
313:  CARGO_HOME: /home/runner/.cargo
314:  CARGO_INCREMENTAL: 0
315:  ##[endgroup]
316:  ##[group]Run : work around spurious network errors in curl 8.0
317:  �[36;1m: work around spurious network errors in curl 8.0�[0m
318:  �[36;1m# https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/timeout.20investigation�[0m
...

376:  �[1m�[92m  Downloaded�[0m form_urlencoded v1.2.2
377:  �[1m�[92m  Downloaded�[0m faster-hex v0.10.0
378:  �[1m�[92m  Downloaded�[0m errno v0.3.14
379:  �[1m�[92m  Downloaded�[0m generic-array v0.14.7
380:  �[1m�[92m  Downloaded�[0m deranged v0.5.8
381:  �[1m�[92m  Downloaded�[0m fnv v1.0.7
382:  �[1m�[92m  Downloaded�[0m cpufeatures v0.2.17
383:  �[1m�[92m  Downloaded�[0m gix-validate v0.11.2
384:  �[1m�[92m  Downloaded�[0m is_terminal_polyfill v1.70.2
385:  �[1m�[92m  Downloaded�[0m gix-hash v0.25.1
386:  �[1m�[92m  Downloaded�[0m gix-attributes v0.33.1
387:  �[1m�[92m  Downloaded�[0m gix-quote v0.7.2
388:  �[1m�[92m  Downloaded�[0m colorchoice v1.0.5
389:  �[1m�[92m  Downloaded�[0m auditable-info v0.10.0
390:  �[1m�[92m  Downloaded�[0m block-buffer v0.10.4
391:  �[1m�[92m  Downloaded�[0m gix-error v0.2.4
392:  �[1m�[92m  Downloaded�[0m gix-discover v0.52.0
...

523:  �[1m�[92m  Downloaded�[0m tracing-subscriber v0.3.23
524:  �[1m�[92m  Downloaded�[0m tokio-util v0.7.18
525:  �[1m�[92m  Downloaded�[0m tower v0.5.3
526:  �[1m�[92m  Downloaded�[0m toml_writer v1.1.1+spec-1.1.0
527:  �[1m�[92m  Downloaded�[0m toml v0.9.12+spec-1.1.0
528:  �[1m�[92m  Downloaded�[0m regex-automata v0.4.14
529:  �[1m�[92m  Downloaded�[0m nonempty v0.12.0
530:  �[1m�[92m  Downloaded�[0m hash32 v0.3.1
531:  �[1m�[92m  Downloaded�[0m color-eyre v0.6.5
532:  �[1m�[92m  Downloaded�[0m syn v2.0.117
533:  �[1m�[92m  Downloaded�[0m matchers v0.2.0
534:  �[1m�[92m  Downloaded�[0m lru-slab v0.1.2
535:  �[1m�[92m  Downloaded�[0m indenter v0.3.4
536:  �[1m�[92m  Downloaded�[0m toml_parser v1.1.2+spec-1.1.0
537:  �[1m�[92m  Downloaded�[0m toml_datetime v1.1.1+spec-1.1.0
538:  �[1m�[92m  Downloaded�[0m thiserror-impl v2.0.18
539:  �[1m�[92m  Downloaded�[0m stable_deref_trait v1.2.1
540:  �[1m�[92m  Downloaded�[0m try-lock v0.2.5
541:  �[1m�[92m  Downloaded�[0m toml-span v0.7.1
542:  �[1m�[92m  Downloaded�[0m tinyvec_macros v0.1.1
543:  �[1m�[92m  Downloaded�[0m rustix v1.1.4
544:  �[1m�[92m  Downloaded�[0m gix-path v0.12.1
545:  �[1m�[92m  Downloaded�[0m tokio-rustls v0.26.4
546:  �[1m�[92m  Downloaded�[0m tinyvec v1.11.0
547:  �[1m�[92m  Downloaded�[0m time-macros v0.2.27
548:  �[1m�[92m  Downloaded�[0m thiserror v2.0.18
549:  �[1m�[92m  Downloaded�[0m termcolor v1.4.1
...

652:  �[1m�[92m  Downloaded�[0m anstream v1.0.0
653:  �[1m�[92m  Downloaded�[0m gix-prompt v0.15.1
654:  �[1m�[92m  Downloaded�[0m gix-negotiate v0.32.0
655:  �[1m�[92m  Downloaded�[0m gix-config-value v0.18.1
656:  �[1m�[92m  Downloaded�[0m gix-command v0.9.1
657:  �[1m�[92m  Downloaded�[0m gix-actor v0.41.1
658:  �[1m�[92m  Downloaded�[0m futures-sink v0.3.32
659:  �[1m�[92m  Downloaded�[0m clap_lex v1.1.0
660:  �[1m�[92m  Downloaded�[0m gix-fs v0.21.2
661:  �[1m�[92m  Downloaded�[0m fixedbitset v0.5.7
662:  �[1m�[92m  Downloaded�[0m fastrand v2.4.1
663:  �[1m�[92m  Downloaded�[0m crossbeam-deque v0.8.6
664:  �[1m�[92m  Downloaded�[0m arrayvec v0.7.6
665:  �[1m�[92m  Downloaded�[0m gix-chunk v0.7.2
666:  �[1m�[92m  Downloaded�[0m gix-bitmap v0.3.2
667:  �[1m�[92m  Downloaded�[0m display-error-chain v0.2.2
668:  �[1m�[92m  Downloaded�[0m canonical-path v2.0.2
...

677:  �[1m�[92m   Compiling�[0m proc-macro2 v1.0.106
678:  �[1m�[92m   Compiling�[0m quote v1.0.45
679:  �[1m�[92m   Compiling�[0m unicode-ident v1.0.24
680:  �[1m�[92m   Compiling�[0m libc v0.2.186
681:  �[1m�[92m   Compiling�[0m memchr v2.8.0
682:  �[1m�[92m   Compiling�[0m cfg-if v1.0.4
683:  �[1m�[92m   Compiling�[0m aho-corasick v1.1.4
684:  �[1m�[92m   Compiling�[0m regex-syntax v0.8.10
685:  �[1m�[92m   Compiling�[0m syn v2.0.117
686:  �[1m�[92m   Compiling�[0m regex-automata v0.4.14
687:  �[1m�[92m   Compiling�[0m smallvec v1.15.1
688:  �[1m�[92m   Compiling�[0m once_cell v1.21.4
689:  �[1m�[92m   Compiling�[0m bytes v1.11.1
690:  �[1m�[92m   Compiling�[0m bstr v1.12.1
691:  �[1m�[92m   Compiling�[0m stable_deref_trait v1.2.1
692:  �[1m�[92m   Compiling�[0m thiserror v2.0.18
693:  �[1m�[92m   Compiling�[0m thiserror-impl v2.0.18
694:  �[1m�[92m   Compiling�[0m crc32fast v1.5.0
...

703:  �[1m�[92m   Compiling�[0m gix-path v0.12.1
704:  �[1m�[92m   Compiling�[0m unicode-normalization v0.1.25
705:  �[1m�[92m   Compiling�[0m itoa v1.0.18
706:  �[1m�[92m   Compiling�[0m scopeguard v1.2.0
707:  �[1m�[92m   Compiling�[0m lock_api v0.4.14
708:  �[1m�[92m   Compiling�[0m gix-utils v0.3.3
709:  �[1m�[92m   Compiling�[0m crossbeam-channel v0.5.15
710:  �[1m�[92m   Compiling�[0m parking_lot v0.12.5
711:  �[1m�[92m   Compiling�[0m foldhash v0.2.0
712:  �[1m�[92m   Compiling�[0m same-file v1.0.6
713:  �[1m�[92m   Compiling�[0m equivalent v1.0.2
714:  �[1m�[92m   Compiling�[0m allocator-api2 v0.2.21
715:  �[1m�[92m   Compiling�[0m walkdir v2.5.0
716:  �[1m�[92m   Compiling�[0m prodash v31.0.0
717:  �[1m�[92m   Compiling�[0m zlib-rs v0.6.3
718:  �[1m�[92m   Compiling�[0m gix-error v0.2.4
719:  �[1m�[92m   Compiling�[0m version_check v0.9.5
...

951:  �[1m�[92m   Compiling�[0m toml v1.1.2+spec-1.1.0
952:  �[1m�[92m   Compiling�[0m color-eyre v0.6.5
953:  �[1m�[92m   Compiling�[0m cargo-lock v11.0.1
954:  �[1m�[92m   Compiling�[0m clap v4.6.1
955:  �[1m�[92m   Compiling�[0m auditable-info v0.10.0
956:  �[1m�[92m   Compiling�[0m quitters v0.1.0
957:  �[1m�[92m   Compiling�[0m secrecy v0.10.3
958:  �[1m�[92m   Compiling�[0m cvss v2.2.0
959:  �[1m�[92m   Compiling�[0m platforms v3.10.0
960:  �[1m�[92m   Compiling�[0m wasmparser v0.247.0
961:  �[1m�[92m   Compiling�[0m wait-timeout v0.2.1
962:  �[1m�[92m   Compiling�[0m home v0.5.12
963:  �[1m�[92m   Compiling�[0m canonical-path v2.0.2
964:  �[1m�[92m   Compiling�[0m termcolor v1.4.1
965:  �[1m�[92m   Compiling�[0m abscissa_core v0.9.0
966:  �[1m�[92m   Compiling�[0m display-error-chain v0.2.2
967:  �[1m�[92m   Compiling�[0m rustls-webpki v0.103.13
...

975:  �[1m�[92m   Compiling�[0m gix v0.84.0
976:  �[1m�[92m   Compiling�[0m rustsec v0.33.0
977:  �[1m�[92m   Compiling�[0m cargo-audit v0.22.2
978:  �[1m�[92m    Finished�[0m `release` profile [optimized] target(s) in 3m 13s
979:  �[1m�[92m  Installing�[0m /home/runner/.cargo/bin/cargo-audit
980:  �[1m�[92m   Installed�[0m package `cargo-audit v0.22.2` (executable `cargo-audit`)
981:  ##[group]Run cargo audit --json > audit-report.json 2>&1 || true
982:  �[36;1mcargo audit --json > audit-report.json 2>&1 || true�[0m
983:  �[36;1mcargo audit 2>&1 | tee audit-report.txt�[0m
984:  �[36;1m�[0m
985:  �[36;1m# Check for vulnerabilities (not warnings about unmaintained crates)�[0m
986:  �[36;1m# Uses .cargo/audit.toml for ignored advisories�[0m
987:  �[36;1mif cargo audit 2>&1; then�[0m
988:  �[36;1m  echo "No critical vulnerabilities found"�[0m
989:  �[36;1melse�[0m
990:  �[36;1m  echo "::error::Security vulnerabilities detected!"�[0m
991:  �[36;1m  exit 1�[0m
...

1085:  │       ├── hyper-rustls 0.27.7
1086:  │       └── aws-smithy-http-client 1.1.9
1087:  ├── rustls 0.23.35
1088:  └── russh 0.55.0
1089:  └── rustible 0.1.1-alpha
1090:  �[0m�[0m�[1m�[31mCrate:    �[0m aws-lc-sys
1091:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.35.0
1092:  �[0m�[0m�[1m�[31mTitle:    �[0m Timing Side-Channel in AES-CCM Tag Verification in AWS-LC
1093:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-03-02
1094:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0045
1095:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0045
1096:  �[0m�[0m�[1m�[31mSeverity: �[0m 5.9 (medium)
1097:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.38.0
1098:  �[0m�[0m�[1m�[31mCrate:    �[0m aws-lc-sys
1099:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.35.0
1100:  �[0m�[0m�[1m�[31mTitle:    �[0m CRL Distribution Point Scope Check Logic Error in AWS-LC
1101:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-03-19
...

1319:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.10
1320:  �[0m�[0m�[1m�[31mCrate:    �[0m rustls-webpki
1321:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.103.8
1322:  �[0m�[0m�[1m�[31mTitle:    �[0m Name constraints were accepted for certificates asserting a wildcard name
1323:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-04-14
1324:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0099
1325:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0099
1326:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.12, <0.104.0-alpha.1 OR >=0.104.0-alpha.6
1327:  �[0m�[0m�[1m�[31mCrate:    �[0m rustls-webpki
1328:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.103.8
1329:  �[0m�[0m�[1m�[31mTitle:    �[0m Name constraints for URI names were incorrectly accepted
1330:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-04-14
1331:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0098
1332:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0098
1333:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.12, <0.104.0-alpha.1 OR >=0.104.0-alpha.6
1334:  �[0m�[0m�[1m�[33mCrate:    �[0m proc-macro-error2
1335:  �[0m�[0m�[1m�[33mVersion:  �[0m 2.0.1
1336:  �[0m�[0m�[1m�[33mWarning:  �[0m unmaintained
1337:  �[0m�[0m�[1m�[33mTitle:    �[0m proc-macro-error2 is unmaintained
1338:  �[0m�[0m�[1m�[33mDate:     �[0m 2026-06-07
1339:  �[0m�[0m�[1m�[33mID:       �[0m RUSTSEC-2026-0173
1340:  �[0m�[0m�[1m�[33mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0173
1341:  �[0m�[0m�[1m�[33mDependency tree:
1342:  �[0mproc-macro-error2 2.0.1
1343:  └── hax-lib-macros 0.3.5
...

1447:  │       └── reqwest 0.12.28
1448:  │           └── rustible 0.1.1-alpha
1449:  ├── proptest 1.9.0
1450:  │   └── rustible 0.1.1-alpha
1451:  ├── libcrux-traits 0.0.4
1452:  │   ├── libcrux-sha3 0.0.4
1453:  │   │   └── libcrux-ml-kem 0.0.4
1454:  │   │       └── russh 0.55.0
1455:  │   │           └── rustible 0.1.1-alpha
1456:  │   └── libcrux-ml-kem 0.0.4
1457:  ├── libcrux-ml-kem 0.0.4
1458:  └── core-models 0.0.4
1459:  └── libcrux-intrinsics 0.0.4
1460:  ├── libcrux-sha3 0.0.4
1461:  └── libcrux-ml-kem 0.0.4
1462:  �[0m�[0m�[1m�[31merror:�[0m 16 vulnerabilities found!
1463:  �[0m�[0m�[1m�[33mwarning:�[0m 3 allowed warnings found
...

1550:  │       ├── hyper-rustls 0.27.7
1551:  │       └── aws-smithy-http-client 1.1.9
1552:  ├── rustls 0.23.35
1553:  └── russh 0.55.0
1554:  └── rustible 0.1.1-alpha
1555:  �[0m�[0m�[1m�[31mCrate:    �[0m aws-lc-sys
1556:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.35.0
1557:  �[0m�[0m�[1m�[31mTitle:    �[0m Timing Side-Channel in AES-CCM Tag Verification in AWS-LC
1558:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-03-02
1559:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0045
1560:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0045
1561:  �[0m�[0m�[1m�[31mSeverity: �[0m 5.9 (medium)
1562:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.38.0
1563:  �[0m�[0m�[1m�[31mCrate:    �[0m aws-lc-sys
1564:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.35.0
1565:  �[0m�[0m�[1m�[31mTitle:    �[0m CRL Distribution Point Scope Check Logic Error in AWS-LC
1566:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-03-19
...

1784:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.10
1785:  �[0m�[0m�[1m�[31mCrate:    �[0m rustls-webpki
1786:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.103.8
1787:  �[0m�[0m�[1m�[31mTitle:    �[0m Name constraints were accepted for certificates asserting a wildcard name
1788:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-04-14
1789:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0099
1790:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0099
1791:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.12, <0.104.0-alpha.1 OR >=0.104.0-alpha.6
1792:  �[0m�[0m�[1m�[31mCrate:    �[0m rustls-webpki
1793:  �[0m�[0m�[1m�[31mVersion:  �[0m 0.103.8
1794:  �[0m�[0m�[1m�[31mTitle:    �[0m Name constraints for URI names were incorrectly accepted
1795:  �[0m�[0m�[1m�[31mDate:     �[0m 2026-04-14
1796:  �[0m�[0m�[1m�[31mID:       �[0m RUSTSEC-2026-0098
1797:  �[0m�[0m�[1m�[31mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0098
1798:  �[0m�[0m�[1m�[31mSolution: �[0m Upgrade to >=0.103.12, <0.104.0-alpha.1 OR >=0.104.0-alpha.6
1799:  �[0m�[0m�[1m�[33mCrate:    �[0m proc-macro-error2
1800:  �[0m�[0m�[1m�[33mVersion:  �[0m 2.0.1
1801:  �[0m�[0m�[1m�[33mWarning:  �[0m unmaintained
1802:  �[0m�[0m�[1m�[33mTitle:    �[0m proc-macro-error2 is unmaintained
1803:  �[0m�[0m�[1m�[33mDate:     �[0m 2026-06-07
1804:  �[0m�[0m�[1m�[33mID:       �[0m RUSTSEC-2026-0173
1805:  �[0m�[0m�[1m�[33mURL:      �[0m https://rustsec.org/advisories/RUSTSEC-2026-0173
1806:  �[0m�[0m�[1m�[33mDependency tree:
1807:  �[0mproc-macro-error2 2.0.1
1808:  └── hax-lib-macros 0.3.5
...

1912:  │       └── reqwest 0.12.28
1913:  │           └── rustible 0.1.1-alpha
1914:  ├── proptest 1.9.0
1915:  │   └── rustible 0.1.1-alpha
1916:  ├── libcrux-traits 0.0.4
1917:  │   ├── libcrux-sha3 0.0.4
1918:  │   │   └── libcrux-ml-kem 0.0.4
1919:  │   │       └── russh 0.55.0
1920:  │   │           └── rustible 0.1.1-alpha
1921:  │   └── libcrux-ml-kem 0.0.4
1922:  ├── libcrux-ml-kem 0.0.4
1923:  └── core-models 0.0.4
1924:  └── libcrux-intrinsics 0.0.4
1925:  ├── libcrux-sha3 0.0.4
1926:  └── libcrux-ml-kem 0.0.4
1927:  �[0m�[0m�[1m�[31merror:�[0m 16 vulnerabilities found!
1928:  �[0m�[0m�[1m�[33mwarning:�[0m 3 allowed warnings found
1929:  ##[error]Security vulnerabilities detected!
1930:  ##[error]Process completed with exit code 1.
1931:  ##[group]Run actions/upload-artifact@v4

@adolago adolago merged commit 9471c3e into main Jun 13, 2026
10 of 13 checks passed
@adolago adolago deleted the improvements/hygiene-ci-panics branch June 13, 2026 02:22
Comment thread CLAUDE.md
- `npm run lint` - Linting
- `cargo check` - Fast typecheck; `cargo build` - Build project
- `cargo test -- --test-threads=1` - Run tests (CI runs single-threaded)
- `cargo clippy --lib --bins -- -D warnings` - Lint

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. Claude clippy command mismatched 📎 Requirement gap ⚙ Maintainability

CLAUDE.md documents cargo clippy --lib --bins -- -D warnings, but CI now runs `cargo clippy
--all-targets -- -D warnings`, so contributors following the documented steps may miss lint failures
that block merges.
Agent Prompt
## Issue description
`CLAUDE.md` documents a clippy command (`--lib --bins`) that does not match the merge-gating CI clippy job (`--all-targets`). This breaks the goal of having locally reproducible required checks.

## Issue Context
CI was updated to run `cargo clippy --all-targets -- -D warnings`.

## Fix Focus Areas
- CLAUDE.md[4-7]
- .github/workflows/ci.yml[45-48]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/cli/output.rs
Comment on lines +14 to +25
/// Serialize for line-oriented JSON output without panicking; emits a JSON
/// error object if serialization itself fails.
fn json_line<T: serde::Serialize>(value: &T) -> String {
serde_json::to_string(value)
.unwrap_or_else(|e| format!(r#"{{"error":"serialization failed: {}"}}"#, e))
}

/// Pretty-printing variant of [`json_line`].
fn json_pretty<T: serde::Serialize>(value: &T) -> String {
serde_json::to_string_pretty(value)
.unwrap_or_else(|e| format!(r#"{{"error":"serialization failed: {}"}}"#, e))
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

2. Invalid json fallback 🐞 Bug ≡ Correctness

json_line/json_pretty interpolate serde_json::Error into a hand-built JSON string without escaping,
so the fallback can become invalid JSON if the error contains quotes/backslashes/newlines. This
breaks machine JSON output exactly in the serialization-failure scenario the helpers are meant to
handle.
Agent Prompt
### Issue description
`json_line`/`json_pretty` currently build a JSON fallback via `format!(r#"{"error":"... {}"}"#, e)`, inserting the error string unescaped. This can produce invalid JSON (and/or multi-line output) when serialization fails.

### Issue Context
These helpers are used for JSON-mode CLI output, so the fallback must itself always be valid JSON.

### Fix Focus Areas
- Replace the `format!(...)` fallback with a `serde_json::json!({...})` value and serialize that (which guarantees proper escaping).
- Ensure both line-oriented and pretty variants remain single JSON values (and consider keeping the fallback schema stable, e.g. `{ "error": "serialization_failed", "details": "..." }`).

### Fix Focus Areas (code pointers)
- src/cli/output.rs[14-25]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Fix rand 0.9 breakage, harden CI gates, and eliminate panic paths
🐞 Bug fix ✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🧪 Tests 🕐 40+ Minutes

Grey Divider

Walkthroughs

Description
• Restore builds by migrating rand 0.8 usage to rand 0.9 APIs and RNG traits.
• Make clippy and license compliance hard CI gates with checked-in configurations.
• Remove production panic paths (JSON output, template resolution, inventory iteration, clock skew).
• Clean up repo/docs pointers (repo URL, issue links, and correct Rust build commands).
Diagram
graph TD
  CI["ci.yml"] --> CLIP["Clippy -D warnings"] --> CODE["Core code"] --> RNG["rand 0.9"]
  CLIP --> CLTOML["clippy.toml"]
  SEC["security.yml"] --> DENY["cargo-deny gate"] --> DNY["deny.toml"]
  CODE --> VAULT["Vault + CLI"]
  CODE --> OUT["CLI JSON output"]
  subgraph Legend
    direction LR
    _wf[[Workflow]] ~~~ _cfg["Config file"] ~~~ _mod["Module"]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Introduce a small internal RNG facade (crate::crypto::rng)
  • ➕ Localizes future rand API churn to one module
  • ➕ Enforces consistent fallible entropy handling policies
  • ➕ Helps avoid accidental rand vs rand_core mismatches
  • ➖ Adds abstraction for mostly mechanical changes
  • ➖ Requires follow-up refactor across call sites to adopt facade
2. Revert/pin rand to 0.8 short-term
  • ➕ Fastest compilation restore
  • ➖ Defers necessary migration and breaks dependabot/security expectations
  • ➖ Does not address soft CI gates that allowed breakage to land
3. Pin toolchain to stabilize clippy gate
  • ➕ Avoids CI failures from newly introduced clippy lints
  • ➖ Adds toolchain management overhead
  • ➖ May lag lint improvements; fix-forward is often preferable

Recommendation: Keep the PR’s approach: complete the rand 0.9 migration and harden CI/security gates so future breaking bumps can’t merge silently. Consider an RNG facade later if dependency churn becomes frequent; it’s not required to land these fixes safely.

Grey Divider

File Changes

Enhancement (1)
vault.rs Zeroize CLI vault passwords and update RNG usage +42/-18

Zeroize CLI vault passwords and update RNG usage

• Stores passwords as SecretString and wipes transient buffers for file/env password sources. Migrates salt/nonce/password generation to rand_core-compatible OsRng and adds SecretString round-trip coverage.

src/cli/commands/vault.rs


Bug fix (15)
main.rs Migrate benchmark RNG usage to rand 0.9 +2/-2

Migrate benchmark RNG usage to rand 0.9

• Updates thread_rng/gen usage to rand 0.9’s rng/random APIs to restore compilation for benchmarks.

benches/ssh_comparison/src/main.rs


state.rs Fix cfg-gated unused variables and simplify loops +3/-1

Fix cfg-gated unused variables and simplify loops

• Adds explicit ignores for state bindings only used behind provisioning cfg and removes unused enumeration indices to satisfy clippy.

src/cli/commands/state.rs


output.rs Avoid panics during JSON output serialization +31/-21

Avoid panics during JSON output serialization

• Adds json_line/json_pretty helpers that emit an error JSON object on serialization failure. Replaces many unwrap/expect JSON serialization call sites.

src/cli/output.rs


russh.rs Fix escalation unwraps and update test key RNG +8/-9

Fix escalation unwraps and update test key RNG

• Eliminates unwrap patterns in escalation handling and updates test key generation to use ssh-key’s rand_core OsRng re-export, matching trait expectations under rand 0.9.

src/connection/russh.rs


types.rs Degrade pre-epoch timestamps and migrate rand APIs +10/-9

Degrade pre-epoch timestamps and migrate rand APIs

• Replaces unwraps on duration_since(UNIX_EPOCH) with unwrap_or_default to avoid panics on bad system clocks. Migrates election-timeout RNG usage to rand 0.9 rng/random_range APIs.

src/distributed/types.rs


constructed.rs Skip hosts removed during constructed inventory pass +3/-1

Skip hosts removed during constructed inventory pass

• Avoids unwrap when looking up hosts that may have been removed mid-iteration, preventing a panic and continuing gracefully.

src/inventory/constructed.rs


password.rs Migrate RNG usage to rand 0.9 APIs +2/-2

Migrate RNG usage to rand 0.9 APIs

• Updates password generation to use rand::rng and random_range instead of thread_rng/gen_range.

src/lookup/password.rs


password.rs Migrate plugin RNG usage to rand 0.9 APIs +2/-2

Migrate plugin RNG usage to rand 0.9 APIs

• Updates the password lookup plugin’s RNG calls to rand 0.9 (rng/random_range) to restore compilation.

src/plugins/lookup/password.rs


resolver.rs Prevent panics on missing template captures +7/-4

Prevent panics on missing template captures

• Replaces unwraps on regex capture groups with safe handling and skip logic so template rendering degrades gracefully.

src/provisioning/resolver.rs


state_encryption.rs Align RNG imports for state encryption +1/-1

Align RNG imports for state encryption

• Small RNG/crypto import adjustments to remain compatible with updated rand/crypto expectations.

src/provisioning/state_encryption.rs


rotation.rs Migrate secret generation RNG usage to rand 0.9 +10/-10

Migrate secret generation RNG usage to rand 0.9

• Updates multiple random selection and fill_bytes call sites to rand 0.9 (rng/random_range). Maintains the same generation constraints and distributions.

src/secrets/rotation.rs


keys.rs Use fallible OS entropy fill under rand 0.9 +4/-2

Use fallible OS entropy fill under rand 0.9

• Switches signing key generation to TryRngCore::try_fill_bytes and explicitly fails if OS entropy is unavailable, matching rand 0.9’s fallible OsRng behavior.

src/security/signing/keys.rs


filters.rs Update shuffle RNG and parity checks +2/-3

Update shuffle RNG and parity checks

• Uses rand 0.9’s rng() for shuffle filter and replaces modulo parity check with is_multiple_of in median filter.

src/templating/filters.rs


mod.rs Align vars vault RNG with rand_core expectations +2/-2

Align vars vault RNG with rand_core expectations

• Uses aes-gcm’s OsRng and rand_core RngCore for nonce generation to avoid cross-crate rand version coupling.

src/vars/mod.rs


vault.rs Align library vault RNG with rand_core expectations +2/-2

Align library vault RNG with rand_core expectations

• Switches to aes-gcm’s OsRng and rand_core RngCore for nonce generation, reducing dependency version coupling issues.

src/vault.rs


Refactor (34)
event.rs Use is_multiple_of for leap-year logic +1/-1

Use is_multiple_of for leap-year logic

• Refactors leap-year calculation to use is_multiple_of for readability and clippy compliance; behavior remains the same.

src/audit/event.rs


scenarios.rs Use is_multiple_of in latency profile selection +2/-2

Use is_multiple_of in latency profile selection

• Replaces '% 2 == 0' checks with is_multiple_of(2) for clippy compliance; behavior unchanged.

src/benchmarks/scenarios.rs


manager.rs Simplify callback plugin sorting +1/-1

Simplify callback plugin sorting

• Uses sort_by_key for sorting plugins by priority instead of a manual comparator.

src/callback/manager.rs


full_skip.rs Clippy-driven cleanup in full-skip plugin +2/-2

Clippy-driven cleanup in full-skip plugin

• Minor refactors to satisfy hardened clippy gates; no intended behavior change.

src/callback/plugins/full_skip.rs


logfile.rs Clippy-driven cleanup in logfile plugin +1/-1

Clippy-driven cleanup in logfile plugin

• Minor refactors to satisfy hardened clippy gates; no intended behavior change.

src/callback/plugins/logfile.rs


profile_tasks.rs Clippy-driven cleanup in profiling plugin +4/-4

Clippy-driven cleanup in profiling plugin

• Minor refactors to satisfy hardened clippy gates; no intended behavior change.

src/callback/plugins/profile_tasks.rs


stats.rs Clippy-driven cleanup in stats plugin +1/-1

Clippy-driven cleanup in stats plugin

• Minor refactors to satisfy hardened clippy gates; no intended behavior change.

src/callback/plugins/stats.rs


timer.rs Clippy-driven cleanup in timer plugin +2/-2

Clippy-driven cleanup in timer plugin

• Minor refactors to satisfy hardened clippy gates; no intended behavior change.

src/callback/plugins/timer.rs


lock.rs Clippy cleanup in lock command +1/-1

Clippy cleanup in lock command

• Small refactors to keep lock CLI code warning-free under '-D warnings'.

src/cli/commands/lock.rs


kubernetes.rs Remove unwraps in escalation password path +1/-2

Remove unwraps in escalation password path

• Rewrites escalation stdin handling with pattern matching ('if let (true, Some(..))') to avoid unwrap and reduce panic risk.

src/connection/kubernetes.rs


local.rs Remove unwraps in escalation password path +1/-2

Remove unwraps in escalation password path

• Uses pattern matching for escalation password injection instead of unwrap-after-is_some.

src/connection/local.rs


retry.rs Clippy cleanup in connection retry logic +1/-1

Clippy cleanup in connection retry logic

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/connection/retry.rs


ssh.rs Remove unwraps in escalation password path +1/-2

Remove unwraps in escalation password path

• Uses pattern matching for escalation password injection instead of unwrap-after-is_some.

src/connection/ssh.rs


stats.rs Use checked_div for insert-width calculation +3/-5

Use checked_div for insert-width calculation

• Replaces manual division-by-zero guard with checked_div for clippy compliance; behavior unchanged for zero totals.

src/diff/stats.rs


correlation.rs Clippy cleanup in drift correlation +1/-1

Clippy cleanup in drift correlation

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/drift/history/correlation.rs


async_runtime.rs Use checked_div for average wait metrics +3/-5

Use checked_div for average wait metrics

• Simplifies average wait time computation using checked_div, preserving the zero-events behavior.

src/executor/async_runtime.rs


host_pinned.rs Use checked_div for average task time metrics +1/-5

Use checked_div for average task time metrics

• Computes avg_task_time_ms via checked_div to avoid manual branching and division-by-zero warnings.

src/executor/host_pinned.rs


best_practices.rs Collapse match arms to reduce clippy noise +40/-30

Collapse match arms to reduce clippy noise

• Refactors rule checks to combine predicates and configuration gating inline, reducing nesting while keeping lint rule behavior consistent.

src/lint/best_practices.rs


sampling.rs Use match guard for sampling decision +5/-7

Use match guard for sampling decision

• Refactors task_execution sampling into a match guard (same 5% random sampling behavior).

src/logging/sampling.rs


postgresql_db.rs Remove unix_socket unwraps when building commands +6/-15

Remove unix_socket unwraps when building commands

• Uses if-let on unix_socket for psql/pg_dump/pg_restore argument construction, avoiding unwrap-after-is_some patterns.

src/modules/database/postgresql_db.rs


postgresql_user.rs Clippy cleanup in PostgreSQL user module +1/-1

Clippy cleanup in PostgreSQL user module

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/modules/database/postgresql_user.rs


known_hosts.rs Clippy cleanup in known_hosts module +1/-1

Clippy cleanup in known_hosts module

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/modules/known_hosts.rs


common.rs Clippy cleanup in network common utilities +2/-3

Clippy cleanup in network common utilities

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/modules/network/common.rs


junos_config.rs Avoid unwrap in commit_confirm messaging +2/-5

Avoid unwrap in commit_confirm messaging

• Uses if-let to format confirm-timeout messaging without unwrap while preserving output wording.

src/modules/network/junos_config.rs


systemd.rs Clippy cleanup in systemd integration +2/-4

Clippy cleanup in systemd integration

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/native/systemd.rs


users.rs Remove redundant cfg-gated gid rebinding +0/-3

Remove redundant cfg-gated gid rebinding

• Deletes an unnecessary binding workaround; behavior of group enumeration is unchanged.

src/native/users.rs


mod.rs Clippy cleanup in parser module +3/-3

Clippy cleanup in parser module

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/parser/mod.rs


hash.rs Clippy cleanup in hash filter plugin +2/-2

Clippy cleanup in hash filter plugin

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/plugins/filter/hash.rs


checkpoint.rs Clippy cleanup in checkpoint recovery +2/-2

Clippy cleanup in checkpoint recovery

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/recovery/checkpoint.rs


retry.rs Clippy cleanup in recovery retry +4/-4

Clippy cleanup in recovery retry

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/recovery/retry.rs


rollback.rs Clippy cleanup in rollback flow +1/-1

Clippy cleanup in rollback flow

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/recovery/rollback.rs


verifier.rs Clippy cleanup in signature verifier +1/-1

Clippy cleanup in signature verifier

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/security/signing/verifier.rs


metrics.rs Clippy cleanup in startup metrics +1/-1

Clippy cleanup in startup metrics

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/startup/metrics.rs


persistence.rs Clippy cleanup in state persistence +3/-3

Clippy cleanup in state persistence

• Minor refactor to satisfy hardened clippy gates; no intended behavior change.

src/state/persistence.rs


Tests (6)
russh_benchmark.rs Silence dead_code warnings for env-gated benches +5/-0

Silence dead_code warnings for env-gated benches

• Adds targeted allow attributes so env-gated helpers don’t trip hardened clippy when unused under some configurations.

benches/russh_benchmark.rs


chaos_tests.rs Update test RNG usage to rand 0.9 +2/-2

Update test RNG usage to rand 0.9

• Migrates test randomness APIs to rand 0.9 to keep tests compiling under the dependency bump.

tests/chaos_tests.rs


cloud_integration_tests.rs Clippy/compilation cleanup in cloud integration tests +1/-0

Clippy/compilation cleanup in cloud integration tests

• Minor adjustment to keep feature-gated integration tests warning-free under hardened clippy.

tests/cloud_integration_tests.rs


security_cron_injection.rs Update test RNG usage to rand 0.9 +2/-2

Update test RNG usage to rand 0.9

• Migrates any rand APIs in this test to rand 0.9 equivalents.

tests/security_cron_injection.rs


timeout_tests.rs Update test RNG usage to rand 0.9 +2/-2

Update test RNG usage to rand 0.9

• Migrates any rand APIs in this test to rand 0.9 equivalents.

tests/timeout_tests.rs


timer_callback_tests.rs Update test RNG usage to rand 0.9 +1/-1

Update test RNG usage to rand 0.9

• Migrates any rand APIs in this test to rand 0.9 equivalents.

tests/timer_callback_tests.rs


Documentation (4)
CLAUDE.md Fix build/test/lint commands for Rust toolchain +6/-3

Fix build/test/lint commands for Rust toolchain

• Replaces incorrect npm commands with cargo equivalents and adds a pointer to docs/FEATURE_STATUS.md as canonical status documentation.

CLAUDE.md


FEATURE_STATUS.md Update beta-readiness issue links to new repo owner +7/-7

Update beta-readiness issue links to new repo owner

• Repoints issue links from the previous GitHub org to the current repository owner for the beta-readiness tracker.

docs/FEATURE_STATUS.md


GITHUB_ISSUES_SUMMARY.md Repoint issue summary links to new repo owner +9/-9

Repoint issue summary links to new repo owner

• Updates issue hyperlinks to github.com/adolago/rustible while keeping the table content unchanged.

docs/GITHUB_ISSUES_SUMMARY.md


ROADMAP.md Align roadmap module statuses with reality +4/-4

Align roadmap module statuses with reality

• Marks azure_vm and gcp_compute as experimental and adjusts rollback-related rows to Beta quality to match the readiness narrative.

docs/ROADMAP.md


Other (6)
audit.toml Remove stale RustSec ignore for time +0/-7

Remove stale RustSec ignore for time

• Drops the RUSTSEC-2026-0009 ignore entry now that the lockfile resolves a fixed time release. Keeps the audit ignore list focused on current exceptions.

.cargo/audit.toml


ci.yml Make clippy warnings a hard CI failure +4/-3

Make clippy warnings a hard CI failure

• Runs clippy across all targets and fails on warnings ('-D warnings'). Removes prior test-skipping rationale and makes linting self-enforcing.

.github/workflows/ci.yml


security.yml Make cargo-deny license/bans/sources a hard gate +7/-48

Make cargo-deny license/bans/sources a hard gate

• Removes inline deny.toml generation and the non-failing '|| true' behavior. Runs 'cargo deny check licenses bans sources' with pipefail and uploads the report artifact.

.github/workflows/security.yml


Cargo.toml Update repository URL and add clippy lint denies +8/-2

Update repository URL and add clippy lint denies

• Points 'repository' to github.com/adolago/rustible and updates the winrm feature comment to match status docs. Adds clippy lint policy to deny dbg_macro and todo.

Cargo.toml


clippy.toml Allow unwrap/expect/panic in tests via clippy config +4/-0

Allow unwrap/expect/panic in tests via clippy config

• Adds clippy configuration to allow unwrap/expect/panic within tests while keeping production warnings as CI failures.

clippy.toml


deny.toml Add checked-in cargo-deny policy +52/-0

Add checked-in cargo-deny policy

• Introduces deny.toml with license allowlist, bans, and sources rules. Advisories are mirrored for local use while CI uses the file for licenses/bans/sources gating.

deny.toml


Grey Divider

Qodo Logo

adolago added a commit that referenced this pull request Jun 13, 2026
test_release_docs_do_not_reference_legacy_repo_namespace forbade
github.com/adolago/rustible, but adolago/rustible is now the canonical
home of the repository. PR #860's docs alignment moved the issue links
onto adolago/rustible, which tripped this guard and turned the entire
Test matrix red on one assertion (38 passed; 1 failed).

Point the guard at the actual previous owner, kernelfirma/rustible,
so it still prevents stale-namespace references from creeping back in
while allowing the current adolago namespace. None of the seven
guarded docs reference kernelfirma anymore, so the suite is green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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