Skip to content

chore: dependency refresh, Rust 1.99.1, cargo-deny - #148

Open
isc-fschwich wants to merge 9 commits into
intersystems-community:masterfrom
isc-fschwich:chore/dependency-refresh
Open

isc-fschwich wants to merge 9 commits into
intersystems-community:masterfrom
isc-fschwich:chore/dependency-refresh

Conversation

@isc-fschwich

@isc-fschwich isc-fschwich commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Rebased on master after #147/#149/#150/#151 merged. It now carries only its own commits. A new last commit holds rmcp:

  • Cargo.toml asks for ~3.1.4.
  • dependabot.yml ignores rmcp and rmcp-macros from 3.2 on.

Dependabot's grouped #158 already proposes rmcp 3.7.0, the protocol-negotiation change, so I'd close #158 in favour of this PR.

This PR also covers these Dependabot PRs:

Still worth reviewing on their own:

Redone on 1.7.0. 1.7.0 added dependencies but upgraded none, so every step still applies.

  • The toml 1 move was checked against 1.7.0's trust fingerprints. toml::Value::String(..).to_string() renders the same in 0.8 and 1 for quoting, escapes, control characters, non-ASCII, paths and URLs, so saved trust entries stay valid.
  • The bin crate's toml_edit moves 0.22 → 0.25, so the graph keeps one copy.
  • Results: unit 3513 passed, bin_unit 101 passed, cargo test --workspace --all-targets 0 failures. Extension npm test 98/98. cargo audit shows only the 3 accepted unmaintained advisories, cargo deny reports all ok, and zizmor is clean.

Builds on #147 (CI hardening). Review that one first; this diff includes its commits until it merges.

Rust

  • cargo update (187 packages). This clears every unsound and yanked crate cargo audit reported:
    • tokio 1.50.0 → 1.54.1 (RUSTSEC-2026-0386)
    • anyhow → 1.0.104 (RUSTSEC-2026-0190)
    • event-listener → 5.4.2 (RUSTSEC-2026-0221)
    • keyring 4.1.3 → 4.2.0 (4.1.3 was yanked)
    • chacha20 → 0.10.2 (yanked)
  • rmcp stays on 3.1.x (3.1.4). From 3.2 on, it changes protocol-version negotiation (SEP-2567), which clients can see. That belongs in its own PR.
  • thiserror 2, which 8, toml 1, tokio-tungstenite 0.30. toml 1 parses str::parse::<Value> as a single value, so two tests now use toml::from_str.
  • Toolchain 1.92.0 → 1.99.1. One new clippy lint, fixed with no allow.
  • deny.toml plus a cargo-deny job: advisories (yanked, unsound and unmaintained all deny), licenses, sources (crates.io only), bans. The only ignores are the three unmaintained zbus/zvariant advisories from keyring's Linux backend, each with a reason. publish = false on both crates, which cargo-deny needs for the path dependency.

npm

  • Extension: vsce 4, servermanager 3.14.1, and an @azure/msal-node override. npm audit --audit-level=high is clean on the full tree.
  • audit.yml now audits the whole extension tree, not --omit=dev. The dev tools run in the release job beside the Marketplace token.
  • Root lint tooling: markdownlint-cli2 0.24.0, prettier 3.9.10, plus a lint-tooling audit job.

Docker

  • distroless/static-debian12:nonroot pinned by digest, USER nonroot.

Held back

Checked locally: clippy -D warnings, fmt, cargo test --workspace --all-targets --features testing (0 failures), cargo audit (only the 3 accepted unmaintained), cargo deny check, extension npm test / npm run package, the Python suite, and zizmor. The live-IRIS suite was not run locally.

@isc-fschwich
isc-fschwich force-pushed the chore/dependency-refresh branch from 8ad59db to e0a4905 Compare October 25, 2026 16:45
cargo update moves the lockfile forward, among others to tokio 1.54.1
(RUSTSEC-2026-0386), anyhow 1.0.104 and event-listener 5.4.2, and replaces
the yanked keyring 4.1.3 and chacha20 0.10.1. keyring gets a 4.2 floor so the
yanked release cannot come back through a fresh resolve.

rmcp is held at 3.1.4, the newest 3.1.x. From 3.2 on, rmcp answers an
initialize that asks for 2026-07-28 with 2025-11-25 (SEP-2567), which clients
can see. That change gets its own branch.

cargo audit is left with the unmaintained zbus_names/zvariant/zvariant_derive
warnings, which come in through the keyring Linux backend.
rust-toolchain.toml and every dtolnay/rust-toolchain step in ci, audit and
release move together, so local builds and CI lint with the same clippy. The
action stays pinned by commit, now the head of its 1.99.1 branch.

The one new lint is clippy::unnecessary_sort_by on the release-notes sort in
test_changelog.rs, fixed with sort_by_key and Reverse.
deny.toml makes the checks cargo audit only prints fail the build: yanked
crates, unsound and unmaintained advisories anywhere in the graph, licenses
outside an allowlist taken from the current graph, and any source other than
crates.io. The three unmaintained zbus crates behind the keyring Linux backend
are ignored by ID, with the reason next to each. Duplicate versions warn.

Both workspace crates are marked publish = false. They never go to crates.io,
and without it cargo-deny reads the version-less path dependency between them
as a wildcard.

The extension audit drops --omit=dev. vsce and the other dev tools run in the
release job with VSCE_PAT set, so their advisories matter as much as the
shipped ones. The root lint tooling (prettier, markdownlint-cli2) gets its own
audit job. Both new jobs pin their actions by commit and check out without
persisted credentials, like the rest of the workflow.

test_audit_workflow.py asserted --omit=dev; it now asserts the full-tree
audit, the lint-tooling audit and a version-pinned cargo-deny reading
deny.toml.
@vscode/vsce moves to 4.0.0 (needs Node 22, which every workflow already
uses) and the servermanager API types to 3.14.1. @types/vscode, @types/node
and esbuild update within their existing ranges. @types/vscode stays declared
as ^1.99.0 so it still matches engines.vscode, which does not change.

vsce 4 still reaches @azure/msal-node 6 through @azure/identity 4.14, and the
fix for GHSA-xcx6-jx8p-x3h5 is only in 7.1. An override lifts it to 7.1.1.
vsce loads identity only for --azure-credential; the release job publishes
with a PAT. npm audit fix took care of undici, markdown-it and the rest, so
npm audit --audit-level=high is clean on the full tree.

tsc --noEmit, npm test (98 tests) and npm run package pass.
Both stay pinned exactly, as before. The update clears the high advisories in
the root tree (smol-toml, markdown-it); npm audit --audit-level=high is clean.

What remains is four low-severity entries for katex
(GHSA-238p-pmpm-9mq7), pulled in by markdownlint through
micromark-extension-math, which asks for katex ^0.16. The fix is in 0.19, and
forcing it past that range is not worth it for a math renderer the lint run
never uses.

verify.sh --boundary ci passes: prettier, markdownlint, shellcheck, spec and
parity.
The image moves from the bare static-debian12 tag, running as root, to the
:nonroot variant pinned by the digest of its multi-arch index, with an
explicit USER nonroot:nonroot. Everything the server writes (audit log,
servers config, trust file, telemetry, open hints) goes under the home
directory, which is /home/nonroot in that image and writable by that user.

The image was not built locally: the Dockerfile copies prebuilt release
binaries from bin/, which only the release job produces.
All four compiled without source changes. The one behaviour change that
reached a test is in toml 1: str::parse::<toml::Value>() now parses a single
TOML value, not a document, so the two tests that read iris-agentic-dev.toml
that way failed with "unexpected content, expected nothing". They now use
toml::from_str. Every parse in src/ goes to toml::Table or through from_str,
which still read a whole document.

The trust fingerprint renders each loosening setting with
toml::Value::to_string, so a rendering change would lapse every saved trust
entry. 0.8 and 1 render strings, including quotes, backslashes, control
characters and non-ASCII, and a whole table identically.

toml_edit, which `trust` uses to edit the operator file, moves from 0.22 to
0.25 with it. toml 1 no longer builds on toml_edit, and 0.25 is the version
already in the graph through the Linux keyring backend, so this keeps one
copy instead of two.

thiserror 1 stays in the lockfile only for redox_users, behind dirs 5.
tokio-tungstenite 0.30 keeps rustls on ring with native roots, the same as
reqwest, so there is still a single crypto provider in the build.
@isc-fschwich
isc-fschwich force-pushed the chore/dependency-refresh branch from e0a4905 to 786389f Compare October 26, 2026 16:45
isc-fschwich and others added 2 commits October 26, 2026 12:48
… own PR

rmcp 3.2 and later negotiate protocol versions per SEP-2567, which clients can see. Cargo.toml now asks for ~3.1.4 instead of 3.1.3, so cargo update no longer reaches 3.7, and Dependabot ignores rmcp and rmcp-macros from 3.2 on. The grouped cargo-minor PR had already proposed 3.7.0. The lockfile is unchanged.
On Linux, a listener that answers and closes with the request unread
sends a reset, and the updated HTTP stack reports that reset instead of
the 401 or 503 it was sent. The two tests failed on the CI runner and
passed on macOS.

@isc-tdyar isc-tdyar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks, Frank. This is a good refresh, and holding rmcp at 3.1.x is good.

One thing blocks the merge: the test job fails on two tests in test_probe_server_offline (probe_reports_auth_failure_on_401 and probe_reports_http_status_when_the_server_answers_with_an_error). They pass on master and on macOS, which is why you saw 0 failures. I reproduced it in rust:1.99.1 on Linux. The stand-in listener writes its 401 or 503 and closes with the request still unread, so Linux sends a reset, and the updated HTTP stack now reports that reset instead of the status. I pushed one commit to your branch that has each stand-in read the request head before answering; it passes 3 of 3 on Linux and on macOS.

What I checked beyond CI:

  • toml 1: the only source parses go into toml::Table (still a whole document) or toml_edit::Value, so nothing in src changed behaviour, and trust fingerprints are as you said.
  • vsce 4 still takes --pat and --packagePath, so the release job's publish step is unchanged.
  • The live suite against IRIS 2026.2, which CI doesn't run on pull requests: the CI e2e command with --include-ignored, 6834 passed, 0 failed. That covers iris_ws_exec on tokio-tungstenite 0.30, the keyring and TLS paths, and the trust tests on toml 1.

deny.toml, the audit jobs (auditing dev dependencies is right, given VSCE_PAT sits in that job), the distroless digest with nonroot, and the keyring 4.2 floor all look right to me.

Thomas

This branch has not been deployed

No deployments
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.

2 participants