Repository navigation
chore: dependency refresh, Rust 1.99.1, cargo-deny - #148
isc-fschwich wants to merge 9 commits into
Conversation
8ad59db to
e0a4905
Compare
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.
e0a4905 to
786389f
Compare
… 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
left a comment
There was a problem hiding this comment.
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) ortoml_edit::Value, so nothing in src changed behaviour, and trust fingerprints are as you said. - vsce 4 still takes
--patand--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
Rebased on master after #147/#149/#150/#151 merged. It now carries only its own commits. A new last commit holds rmcp:
Cargo.tomlasks for~3.1.4.dependabot.ymlignores 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:
which7, an extension runtime dependency)Redone on 1.7.0. 1.7.0 added dependencies but upgraded none, so every step still applies.
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.cargo test --workspace --all-targets0 failures. Extensionnpm test98/98.cargo auditshows only the 3 accepted unmaintained advisories,cargo denyreports 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 cratecargo auditreported:str::parse::<Value>as a single value, so two tests now usetoml::from_str.deny.tomlplus acargo-denyjob: 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 = falseon both crates, which cargo-deny needs for the path dependency.npm
@azure/msal-nodeoverride.npm audit --audit-level=highis clean on the full tree.audit.ymlnow audits the whole extension tree, not--omit=dev. The dev tools run in the release job beside the Marketplace token.lint-toolingaudit job.Docker
distroless/static-debian12:nonrootpinned 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, extensionnpm test/npm run package, the Python suite, and zizmor. The live-IRIS suite was not run locally.