diff --git a/Cargo.lock b/Cargo.lock
index c72e84f14..b10044c1b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -82,7 +82,7 @@ version = "0.7.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.11",
  "once_cell",
  "version_check",
 ]
@@ -191,7 +191,7 @@ dependencies = [
  "omicron-workspace-hack",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -226,14 +226,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
 name = "async-stream"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
 dependencies = [
  "async-stream-impl",
  "futures-core",
@@ -242,13 +242,13 @@ dependencies = [
 
 [[package]]
 name = "async-stream-impl"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -259,7 +259,7 @@ checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -312,7 +312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
 dependencies = [
  "futures-core",
- "getrandom",
+ "getrandom 0.2.11",
  "instant",
  "pin-project-lite",
  "rand 0.8.5",
@@ -475,7 +475,7 @@ dependencies = [
  "proc-macro-crate 2.0.0",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
  "syn_derive",
 ]
 
@@ -593,7 +593,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
 dependencies = [
  "camino",
  "cargo-platform",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "thiserror 1.0.69",
@@ -684,7 +684,7 @@ dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -924,7 +924,7 @@ dependencies = [
  "crucible-common",
  "crucible-protocol",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "expectorate",
  "futures",
  "futures-core",
@@ -946,6 +946,7 @@ dependencies = [
  "reqwest",
  "ringbuffer",
  "schemars",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "slog",
@@ -975,7 +976,7 @@ dependencies = [
  "crucible-common",
  "crucible-smf 0.0.0",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "expectorate",
  "futures",
  "http 0.2.12",
@@ -984,6 +985,7 @@ dependencies = [
  "openapi-lint",
  "openapiv3",
  "schemars",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "slog",
@@ -1028,7 +1030,7 @@ dependencies = [
  "anyhow",
  "atty",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "nix 0.29.0",
  "proptest",
  "rustls-pemfile 1.0.4",
@@ -1077,7 +1079,7 @@ dependencies = [
  "crucible-common",
  "crucible-protocol",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "expectorate",
  "futures",
  "futures-core",
@@ -1104,6 +1106,7 @@ dependencies = [
  "ringbuffer",
  "rusqlite",
  "schemars",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "sha2",
@@ -1113,7 +1116,7 @@ dependencies = [
  "slog-term",
  "statistical",
  "tempfile",
- "thiserror 1.0.66",
+ "thiserror 1.0.69",
  "tokio",
  "tokio-rustls 0.24.1",
  "tokio-util",
@@ -1158,7 +1161,7 @@ dependencies = [
  "crucible-pantry",
  "crucible-pantry-client",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "futures",
  "futures-core",
  "hex",
@@ -1224,7 +1227,7 @@ dependencies = [
  "crucible-common",
  "crucible-smf 0.0.0",
  "crucible-workspace-hack",
- "dropshot",
+ "dropshot 0.16.0",
  "expectorate",
  "futures",
  "hex",
@@ -1235,6 +1238,7 @@ dependencies = [
  "openapiv3",
  "reqwest",
  "schemars",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "sha2",
@@ -1324,12 +1328,12 @@ dependencies = [
  "futures-executor",
  "futures-sink",
  "futures-util",
- "getrandom",
+ "getrandom 0.2.11",
  "hex",
  "hyper",
  "hyper-rustls",
  "hyper-util",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "libc",
  "log",
  "memchr",
@@ -1349,13 +1353,13 @@ dependencies = [
  "rustls-pki-types",
  "schemars",
  "scopeguard",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "slog",
  "smallvec",
  "spin 0.9.8",
- "syn 2.0.96",
+ "syn 2.0.99",
  "time",
  "time-macros",
  "tokio",
@@ -1506,7 +1510,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strsim 0.10.0",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1517,7 +1521,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
 dependencies = [
  "darling_core",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1552,7 +1556,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1582,7 +1586,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1595,7 +1599,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustc_version 0.4.0",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1707,7 +1711,7 @@ dependencies = [
  "camino",
  "chrono",
  "debug-ignore",
- "dropshot_endpoint",
+ "dropshot_endpoint 0.12.0",
  "form_urlencoded",
  "futures",
  "hostname 0.4.0",
@@ -1715,7 +1719,7 @@ dependencies = [
  "http-body-util",
  "hyper",
  "hyper-util",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "multer",
  "openapiv3",
  "paste",
@@ -1743,6 +1747,57 @@ dependencies = [
  "waitgroup",
 ]
 
+[[package]]
+name = "dropshot"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a37c505dad56e0c1fa5ed47e29fab1a1ab2d1a9d93e952024bb47168969705f6"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "base64 0.22.1",
+ "bytes",
+ "camino",
+ "chrono",
+ "debug-ignore",
+ "dropshot_endpoint 0.16.0",
+ "form_urlencoded",
+ "futures",
+ "hostname 0.4.0",
+ "http 1.2.0",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "indexmap 2.7.1",
+ "multer",
+ "openapiv3",
+ "paste",
+ "percent-encoding",
+ "rustls 0.22.4",
+ "rustls-pemfile 2.1.3",
+ "schemars",
+ "scopeguard",
+ "semver 1.0.26",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sha1",
+ "slog",
+ "slog-async",
+ "slog-bunyan",
+ "slog-json",
+ "slog-term",
+ "thiserror 2.0.11",
+ "tokio",
+ "tokio-rustls 0.25.0",
+ "toml 0.8.20",
+ "usdt",
+ "uuid",
+ "version_check",
+ "waitgroup",
+]
+
 [[package]]
 name = "dropshot_endpoint"
 version = "0.12.0"
@@ -1754,7 +1809,22 @@ dependencies = [
  "quote",
  "serde",
  "serde_tokenstream",
- "syn 2.0.96",
+ "syn 2.0.99",
+]
+
+[[package]]
+name = "dropshot_endpoint"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b1a6db3728f0195e3ad62807649913aaba06d45421e883416e555e51464ef67"
+dependencies = [
+ "heck 0.5.0",
+ "proc-macro2",
+ "quote",
+ "semver 1.0.26",
+ "serde",
+ "serde_tokenstream",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1768,7 +1838,7 @@ dependencies = [
  "crucible-common",
  "crucible-workspace-hack",
  "csv",
- "dropshot",
+ "dropshot 0.16.0",
  "dsc-client",
  "expectorate",
  "openapi-lint",
@@ -1776,6 +1846,7 @@ dependencies = [
  "rand 0.8.5",
  "rand_chacha 0.3.1",
  "schemars",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "statistical",
@@ -1858,7 +1929,7 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -1984,7 +2055,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -2076,7 +2147,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -2162,7 +2233,19 @@ checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
 dependencies = [
  "cfg-if",
  "libc",
- "wasi",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.13.3+wasi-0.2.2",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -2213,7 +2296,7 @@ dependencies = [
  "futures-core",
  "futures-sink",
  "http 1.2.0",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "slab",
  "tokio",
  "tokio-util",
@@ -2444,9 +2527,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
 
 [[package]]
 name = "httparse"
-version = "1.8.0"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
 
 [[package]]
 name = "httpdate"
@@ -2513,9 +2596,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
 [[package]]
 name = "hyper"
-version = "1.4.1"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
+checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
 dependencies = [
  "bytes",
  "futures-channel",
@@ -2702,9 +2785,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.7.0"
+version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
+checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
 dependencies = [
  "equivalent",
  "hashbrown 0.15.2",
@@ -2865,7 +2948,7 @@ version = "0.1.0"
 source = "git+https://github.com/oxidecomputer/opte?rev=76878de67229ea113d70503c441eab47ac5dc653#76878de67229ea113d70503c441eab47ac5dc653"
 dependencies = [
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -3137,7 +3220,7 @@ dependencies = [
  "hermit-abi 0.3.9",
  "libc",
  "log",
- "wasi",
+ "wasi 0.11.0+wasi-snapshot-preview1",
  "windows-sys 0.52.0",
 ]
 
@@ -3273,7 +3356,7 @@ dependencies = [
  "derive-where",
  "derive_more",
  "dns-service-client",
- "dropshot",
+ "dropshot 0.12.0",
  "futures",
  "gateway-client",
  "http 1.2.0",
@@ -3426,7 +3509,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -3530,7 +3613,7 @@ dependencies = [
  "proc-macro-crate 2.0.0",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -3583,7 +3666,7 @@ dependencies = [
  "backoff",
  "camino",
  "chrono",
- "dropshot",
+ "dropshot 0.12.0",
  "futures",
  "hex",
  "http 1.2.0",
@@ -3601,7 +3684,7 @@ dependencies = [
  "regress 0.9.1",
  "reqwest",
  "schemars",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_human_bytes",
  "serde_json",
@@ -3663,7 +3746,7 @@ dependencies = [
  "hex",
  "reqwest",
  "ring 0.16.20",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_derive",
  "serde_json",
@@ -3694,7 +3777,7 @@ version = "0.4.0"
 source = "git+https://github.com/oxidecomputer/openapi-lint?branch=main#ef442ee4343e97b6d9c217d3e7533962fe7d7236"
 dependencies = [
  "heck 0.4.1",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "lazy_static",
  "openapiv3",
  "regex",
@@ -3706,7 +3789,7 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cc02deea53ffe807708244e5914f6b099ad7015a207ee24317c22112e17d9c5c"
 dependencies = [
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "serde",
  "serde_json",
 ]
@@ -3734,7 +3817,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -3763,7 +3846,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
 dependencies = [
  "futures-core",
  "futures-sink",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "js-sys",
  "once_cell",
  "pin-project-lite",
@@ -3931,7 +4014,7 @@ dependencies = [
  "oximeter-timeseries-macro",
  "oximeter-types",
  "prettyplease",
- "syn 2.0.96",
+ "syn 2.0.99",
  "toml 0.8.20",
  "uuid",
 ]
@@ -3944,7 +4027,7 @@ dependencies = [
  "omicron-workspace-hack",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -3953,7 +4036,7 @@ version = "0.1.0"
 source = "git+https://github.com/oxidecomputer/omicron?branch=main#75214e1423796d7b885aa8a1981b43005b6cbf6a"
 dependencies = [
  "chrono",
- "dropshot",
+ "dropshot 0.12.0",
  "internal-dns",
  "nexus-client",
  "omicron-common",
@@ -3985,7 +4068,7 @@ dependencies = [
  "schemars",
  "serde",
  "slog-error-chain",
- "syn 2.0.96",
+ "syn 2.0.99",
  "toml 0.8.20",
 ]
 
@@ -3999,7 +4082,7 @@ dependencies = [
  "oximeter-types",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4106,7 +4189,7 @@ dependencies = [
  "regex",
  "regex-syntax",
  "structmeta",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4163,7 +4246,7 @@ dependencies = [
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4184,7 +4267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
 dependencies = [
  "fixedbitset",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "serde",
  "serde_derive",
 ]
@@ -4317,7 +4400,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba"
 dependencies = [
  "proc-macro2",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4432,7 +4515,7 @@ checksum = "d85934a440963a69f9f04f48507ff6e7aa2952a5b2d8f96cc37fa3dd5c270f66"
 dependencies = [
  "heck 0.5.0",
  "http 1.2.0",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "openapiv3",
  "proc-macro2",
  "quote",
@@ -4440,7 +4523,7 @@ dependencies = [
  "schemars",
  "serde",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.99",
  "thiserror 1.0.69",
  "typify 0.2.0",
  "unicode-ident",
@@ -4454,7 +4537,7 @@ checksum = "37adc80a94c9cae890e82deeeecc9d8f2a5cb153256caaf1bf0f03611e537214"
 dependencies = [
  "heck 0.5.0",
  "http 1.2.0",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "openapiv3",
  "proc-macro2",
  "quote",
@@ -4462,7 +4545,7 @@ dependencies = [
  "schemars",
  "serde",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.99",
  "thiserror 2.0.11",
  "typify 0.3.0",
  "unicode-ident",
@@ -4483,7 +4566,7 @@ dependencies = [
  "serde_json",
  "serde_tokenstream",
  "serde_yaml",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4501,7 +4584,7 @@ dependencies = [
  "serde_json",
  "serde_tokenstream",
  "serde_yaml",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -4684,7 +4767,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.11",
 ]
 
 [[package]]
@@ -4811,7 +4894,7 @@ version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.11",
  "libredox",
  "thiserror 1.0.69",
 ]
@@ -4995,7 +5078,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b"
 dependencies = [
  "cc",
- "getrandom",
+ "getrandom 0.2.11",
  "libc",
  "spin 0.9.8",
  "untrusted 0.9.0",
@@ -5094,7 +5177,7 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
 dependencies = [
- "semver 1.0.24",
+ "semver 1.0.26",
 ]
 
 [[package]]
@@ -5280,7 +5363,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde_derive_internals",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5306,7 +5389,7 @@ checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5356,9 +5439,9 @@ checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"
 
 [[package]]
 name = "semver"
-version = "1.0.24"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba"
+checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
 dependencies = [
  "serde",
 ]
@@ -5389,7 +5472,7 @@ checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5400,7 +5483,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5442,7 +5525,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5463,7 +5546,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5488,7 +5571,7 @@ dependencies = [
  "chrono",
  "hex",
  "indexmap 1.9.3",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "serde",
  "serde_derive",
  "serde_json",
@@ -5505,7 +5588,7 @@ dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5514,7 +5597,7 @@ version = "0.9.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c"
 dependencies = [
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "itoa",
  "ryu",
  "serde",
@@ -5702,7 +5785,7 @@ source = "git+https://github.com/oxidecomputer/slog-error-chain?branch=main#15f6
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5855,7 +5938,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "structmeta-derive",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5866,7 +5949,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5888,7 +5971,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5901,7 +5984,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -5939,9 +6022,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.96"
+version = "2.0.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
+checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -5957,7 +6040,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6078,7 +6161,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "structmeta",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6107,7 +6190,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6118,7 +6201,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6237,7 +6320,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6358,7 +6441,7 @@ version = "0.19.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
 dependencies = [
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -6371,7 +6454,7 @@ version = "0.20.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
 dependencies = [
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "toml_datetime",
  "winnow 0.5.19",
 ]
@@ -6382,7 +6465,7 @@ version = "0.22.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
 dependencies = [
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -6441,7 +6524,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -6550,10 +6633,10 @@ dependencies = [
  "quote",
  "regress 0.10.1",
  "schemars",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.99",
  "thiserror 1.0.69",
  "unicode-ident",
 ]
@@ -6570,10 +6653,10 @@ dependencies = [
  "quote",
  "regress 0.10.1",
  "schemars",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.99",
  "thiserror 2.0.11",
  "unicode-ident",
 ]
@@ -6587,11 +6670,11 @@ dependencies = [
  "proc-macro2",
  "quote",
  "schemars",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "serde_tokenstream",
- "syn 2.0.96",
+ "syn 2.0.99",
  "typify-impl 0.2.0",
 ]
 
@@ -6604,11 +6687,11 @@ dependencies = [
  "proc-macro2",
  "quote",
  "schemars",
- "semver 1.0.24",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "serde_tokenstream",
- "syn 2.0.96",
+ "syn 2.0.99",
  "typify-impl 0.3.0",
 ]
 
@@ -6713,7 +6796,7 @@ dependencies = [
  "either",
  "futures",
  "indent_write",
- "indexmap 2.7.0",
+ "indexmap 2.7.1",
  "libsw",
  "linear-map",
  "omicron-workspace-hack",
@@ -6773,7 +6856,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde_tokenstream",
- "syn 2.0.96",
+ "syn 2.0.99",
  "usdt-impl",
 ]
 
@@ -6791,7 +6874,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.99",
  "thiserror 1.0.69",
  "thread-id",
  "version_check",
@@ -6807,7 +6890,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde_tokenstream",
- "syn 2.0.96",
+ "syn 2.0.99",
  "usdt-impl",
 ]
 
@@ -6825,11 +6908,11 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
 
 [[package]]
 name = "uuid"
-version = "1.11.0"
+version = "1.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
+checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587"
 dependencies = [
- "getrandom",
+ "getrandom 0.3.1",
  "serde",
 ]
 
@@ -6930,6 +7013,15 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasi"
+version = "0.13.3+wasi-0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+dependencies = [
+ "wit-bindgen-rt",
+]
+
 [[package]]
 name = "wasite"
 version = "0.1.0"
@@ -6958,7 +7050,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
  "wasm-bindgen-shared",
 ]
 
@@ -6992,7 +7084,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -7424,6 +7516,15 @@ dependencies = [
  "windows-sys 0.48.0",
 ]
 
+[[package]]
+name = "wit-bindgen-rt"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
+dependencies = [
+ "bitflags 2.6.0",
+]
+
 [[package]]
 name = "wyz"
 version = "0.5.1"
@@ -7470,7 +7571,7 @@ checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
@@ -7481,7 +7582,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.99",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 19f33c392..7f20798e2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -83,6 +83,7 @@ ringbuffer = "0.15.0"
 rusqlite = { version = "0.32" }
 rustls-pemfile = { version = "1.0.4" }
 schemars = { version = "0.8", features = [ "chrono", "uuid1" ] }
+semver = "1"
 serde = { version = "1", features = [ "derive" ] }
 serde_json = "1"
 sha2 = "0.10"
@@ -114,7 +115,7 @@ usdt = "0.5.0"
 uuid = { version = "1", features = [ "serde", "v4" ] }
 
 # git
-dropshot = { version = "0.12.0", features = [ "usdt-probes" ] }
+dropshot = { version = "0.16.0", features = [ "usdt-probes" ] }
 omicron-common = { git = "https://github.com/oxidecomputer/omicron", branch = "main" }
 nexus-client = { git = "https://github.com/oxidecomputer/omicron", branch = "main" }
 internal-dns = { git = "https://github.com/oxidecomputer/omicron", branch = "main" }
diff --git a/agent/Cargo.toml b/agent/Cargo.toml
index 754859d3d..eb0127acf 100644
--- a/agent/Cargo.toml
+++ b/agent/Cargo.toml
@@ -16,6 +16,7 @@ http.workspace = true
 hyper.workspace = true
 omicron-common.workspace = true
 schemars.workspace = true
+semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 slog.workspace = true
diff --git a/agent/src/main.rs b/agent/src/main.rs
index 8f3a61855..93157bb4b 100644
--- a/agent/src/main.rs
+++ b/agent/src/main.rs
@@ -3,6 +3,7 @@
 use anyhow::{anyhow, bail, Result};
 use clap::Parser;
 use dropshot::{ConfigLogging, ConfigLoggingIfExists, ConfigLoggingLevel};
+use semver::Version;
 use slog::{debug, error, info, o, Logger};
 use std::collections::HashSet;
 use std::io::Write;
@@ -341,7 +342,8 @@ async fn main() -> Result<()> {
 
 fn write_openapi<W: Write>(f: &mut W) -> Result<()> {
     let api = server::make_api()?;
-    api.openapi("Crucible Agent", "0.0.0").write(f)?;
+    api.openapi("Crucible Agent", Version::new(0, 0, 1))
+        .write(f)?;
     Ok(())
 }
 
diff --git a/agent/src/server.rs b/agent/src/server.rs
index 63bf68dea..5f339d776 100644
--- a/agent/src/server.rs
+++ b/agent/src/server.rs
@@ -352,7 +352,7 @@ pub async fn run_server(
     let server = dropshot::HttpServerStarter::new(
         &dropshot::ConfigDropshot {
             bind_address,
-            request_body_max_bytes: 1024 * 10,
+            default_request_body_max_bytes: 1024 * 10,
             default_handler_task_mode: HandlerTaskMode::Detached,
             log_headers: vec![],
         },
diff --git a/downstairs/Cargo.toml b/downstairs/Cargo.toml
index cd47457e8..0902d9844 100644
--- a/downstairs/Cargo.toml
+++ b/downstairs/Cargo.toml
@@ -37,6 +37,7 @@ reqwest.workspace = true
 ringbuffer.workspace = true
 rusqlite.workspace = true
 schemars.workspace = true
+semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 sha2.workspace = true
diff --git a/downstairs/src/repair.rs b/downstairs/src/repair.rs
index 64dfed894..93e624449 100644
--- a/downstairs/src/repair.rs
+++ b/downstairs/src/repair.rs
@@ -13,6 +13,7 @@ use dropshot::RequestContext;
 use dropshot::{endpoint, Path};
 use hyper::{Response, StatusCode};
 use schemars::JsonSchema;
+use semver::Version;
 use serde::Deserialize;
 
 use super::*;
@@ -30,7 +31,8 @@ pub struct FileServerContext {
 
 pub fn write_openapi<W: Write>(f: &mut W) -> Result<()> {
     let api = build_api();
-    api.openapi("Downstairs Repair", "0.0.0").write(f)?;
+    api.openapi("Downstairs Repair", Version::new(0, 0, 1))
+        .write(f)?;
     Ok(())
 }
 
@@ -57,7 +59,7 @@ pub fn repair_main(
      */
     let config_dropshot = ConfigDropshot {
         bind_address: addr,
-        request_body_max_bytes: 1024,
+        default_request_body_max_bytes: 1024,
         default_handler_task_mode: HandlerTaskMode::Detached,
         log_headers: vec![],
     };
diff --git a/dsc/Cargo.toml b/dsc/Cargo.toml
index 341f33378..ae038f720 100644
--- a/dsc/Cargo.toml
+++ b/dsc/Cargo.toml
@@ -17,6 +17,7 @@ dropshot.workspace = true
 rand.workspace = true
 rand_chacha.workspace = true
 schemars.workspace = true
+semver.workspace = true
 serde.workspace = true
 statistical.workspace = true
 tokio.workspace = true
diff --git a/dsc/src/control.rs b/dsc/src/control.rs
index 371b2a70e..0d19ec641 100644
--- a/dsc/src/control.rs
+++ b/dsc/src/control.rs
@@ -11,6 +11,7 @@ use dropshot::Path;
 use dropshot::RequestContext;
 use dropshot::{HttpResponseOk, HttpResponseUpdatedNoContent};
 use schemars::JsonSchema;
+use semver::Version;
 use serde::Deserialize;
 use std::sync::Arc;
 
@@ -51,7 +52,7 @@ pub async fn begin(dsci: Arc<DscInfo>, addr: SocketAddr) -> Result<(), String> {
     // Setup dropshot
     let config_dropshot = ConfigDropshot {
         bind_address: addr,
-        request_body_max_bytes: 1024,
+        default_request_body_max_bytes: 1024,
         default_handler_task_mode: HandlerTaskMode::Detached,
         log_headers: vec![],
     };
@@ -588,6 +589,7 @@ async fn dsc_enable_random_max(
 #[cfg(test)]
 mod test {
     use openapiv3::OpenAPI;
+    use semver::Version;
 
     use super::build_api;
 
@@ -595,7 +597,7 @@ mod test {
     fn test_dsc_openapi() {
         let api = build_api();
         let mut raw = Vec::new();
-        api.openapi("DownStairs Control", "0.0.0")
+        api.openapi("DownStairs Control", Version::new(0, 0, 1))
             .write(&mut raw)
             .unwrap();
         let actual = String::from_utf8(raw).unwrap();
diff --git a/openapi/crucible-agent.json b/openapi/crucible-agent.json
index f46982f1e..fe3856308 100644
--- a/openapi/crucible-agent.json
+++ b/openapi/crucible-agent.json
@@ -2,7 +2,7 @@
   "openapi": "3.0.3",
   "info": {
     "title": "Crucible Agent",
-    "version": "0.0.0"
+    "version": "0.0.1"
   },
   "paths": {
     "/crucible/0/regions": {
diff --git a/openapi/crucible-control.json b/openapi/crucible-control.json
index 5ff114574..9bca66e42 100644
--- a/openapi/crucible-control.json
+++ b/openapi/crucible-control.json
@@ -2,7 +2,7 @@
   "openapi": "3.0.3",
   "info": {
     "title": "Crucible Control",
-    "version": "0.0.0"
+    "version": "0.0.1"
   },
   "paths": {
     "/info": {
diff --git a/openapi/crucible-pantry.json b/openapi/crucible-pantry.json
index 62d7f0187..f8984fb53 100644
--- a/openapi/crucible-pantry.json
+++ b/openapi/crucible-pantry.json
@@ -2,7 +2,7 @@
   "openapi": "3.0.3",
   "info": {
     "title": "Crucible Pantry",
-    "version": "0.0.0"
+    "version": "0.0.1"
   },
   "paths": {
     "/crucible/pantry/0": {
diff --git a/openapi/downstairs-repair.json b/openapi/downstairs-repair.json
index bbcee6e71..ee171e912 100644
--- a/openapi/downstairs-repair.json
+++ b/openapi/downstairs-repair.json
@@ -2,7 +2,7 @@
   "openapi": "3.0.3",
   "info": {
     "title": "Downstairs Repair",
-    "version": "0.0.0"
+    "version": "0.0.1"
   },
   "paths": {
     "/extent/{eid}/files": {
diff --git a/openapi/dsc-control.json b/openapi/dsc-control.json
index 367ac701f..5c3332bf2 100644
--- a/openapi/dsc-control.json
+++ b/openapi/dsc-control.json
@@ -2,7 +2,7 @@
   "openapi": "3.0.3",
   "info": {
     "title": "DownStairs Control",
-    "version": "0.0.0"
+    "version": "0.0.1"
   },
   "paths": {
     "/allrunning": {
diff --git a/pantry/Cargo.toml b/pantry/Cargo.toml
index 745c41a0d..b37203c4c 100644
--- a/pantry/Cargo.toml
+++ b/pantry/Cargo.toml
@@ -15,6 +15,7 @@ futures.workspace = true
 http.workspace = true
 hyper.workspace = true
 schemars.workspace = true
+semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 slog.workspace = true
diff --git a/pantry/src/main.rs b/pantry/src/main.rs
index b94d45b53..2efce87ef 100644
--- a/pantry/src/main.rs
+++ b/pantry/src/main.rs
@@ -2,6 +2,7 @@
 
 use anyhow::{anyhow, Result};
 use clap::Parser;
+use semver::Version;
 use std::io::Write;
 use std::net::SocketAddr;
 use std::path::PathBuf;
@@ -46,7 +47,8 @@ async fn main() -> Result<()> {
 
 fn write_openapi<W: Write>(f: &mut W) -> Result<()> {
     let api = server::make_api().map_err(|e| anyhow!(e))?;
-    api.openapi("Crucible Pantry", "0.0.0").write(f)?;
+    api.openapi("Crucible Pantry", Version::new(0, 0, 1))
+        .write(f)?;
     Ok(())
 }
 
diff --git a/pantry/src/pantry.rs b/pantry/src/pantry.rs
index 1ba318d06..9c81555e6 100644
--- a/pantry/src/pantry.rs
+++ b/pantry/src/pantry.rs
@@ -851,7 +851,7 @@ impl Pantry {
                             "volume {} is no longer active!",
                             volume_id
                         )),
-                        hyper::StatusCode::GONE,
+                        dropshot::ClientErrorStatusCode::GONE,
                         format!("volume {} is no longer active!", volume_id),
                     ))
                 } else {
diff --git a/pantry/src/server.rs b/pantry/src/server.rs
index 35b95ec3e..f6a9448a0 100644
--- a/pantry/src/server.rs
+++ b/pantry/src/server.rs
@@ -469,7 +469,7 @@ pub fn run_server(
             bind_address,
             // max import, multiplied by worst case base64 overhead, plus room
             // for metadata
-            request_body_max_bytes: 1024
+            default_request_body_max_bytes: 1024
                 + crate::pantry::PantryEntry::MAX_CHUNK_SIZE * 2,
             default_handler_task_mode: HandlerTaskMode::Detached,
             log_headers: vec![],
diff --git a/upstairs/Cargo.toml b/upstairs/Cargo.toml
index b344d4e28..0744d3ea1 100644
--- a/upstairs/Cargo.toml
+++ b/upstairs/Cargo.toml
@@ -39,6 +39,7 @@ rand.workspace = true
 rayon.workspace = true
 ringbuffer.workspace = true
 schemars.workspace = true
+semver.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 slog.workspace = true
diff --git a/upstairs/src/control.rs b/upstairs/src/control.rs
index ec172f412..cddf43de0 100644
--- a/upstairs/src/control.rs
+++ b/upstairs/src/control.rs
@@ -35,7 +35,7 @@ pub async fn start(
      */
     let config_dropshot = ConfigDropshot {
         bind_address: addr,
-        request_body_max_bytes: 1024,
+        default_request_body_max_bytes: 1024,
         default_handler_task_mode: HandlerTaskMode::Detached,
         log_headers: vec![],
     };
@@ -186,6 +186,7 @@ async fn downstairs_work_queue(
 #[cfg(test)]
 mod test {
     use openapiv3::OpenAPI;
+    use semver::Version;
 
     use super::build_api;
 
@@ -193,7 +194,7 @@ mod test {
     fn test_crucible_control_openapi() {
         let api = build_api();
         let mut raw = Vec::new();
-        api.openapi("Crucible Control", "0.0.0")
+        api.openapi("Crucible Control", Version::new(0, 0, 1))
             .write(&mut raw)
             .unwrap();
         let actual = String::from_utf8(raw).unwrap();
diff --git a/workspace-hack/Cargo.toml b/workspace-hack/Cargo.toml
index f64b1c887..3a1bb1679 100644
--- a/workspace-hack/Cargo.toml
+++ b/workspace-hack/Cargo.toml
@@ -30,7 +30,6 @@ futures-core = { version = "0.3" }
 futures-executor = { version = "0.3" }
 futures-sink = { version = "0.3" }
 futures-util = { version = "0.3", features = ["channel", "io", "sink"] }
-getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hex = { version = "0.4", features = ["serde"] }
 indexmap = { version = "2", features = ["serde"] }
 libc = { version = "0.2", features = ["extra_traits"] }
@@ -79,7 +78,6 @@ futures-core = { version = "0.3" }
 futures-executor = { version = "0.3" }
 futures-sink = { version = "0.3" }
 futures-util = { version = "0.3", features = ["channel", "io", "sink"] }
-getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hex = { version = "0.4", features = ["serde"] }
 indexmap = { version = "2", features = ["serde"] }
 libc = { version = "0.2", features = ["extra_traits"] }
@@ -117,6 +115,7 @@ zerocopy = { version = "0.7", features = ["derive", "simd"] }
 [target.x86_64-unknown-linux-gnu.dependencies]
 bitflags-dff4ba8e3ae991db = { package = "bitflags", version = "1" }
 dof = { version = "0.3", default-features = false, features = ["des"] }
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }
@@ -129,6 +128,7 @@ tokio-util = { version = "0.7", features = ["codec", "io"] }
 
 [target.x86_64-unknown-linux-gnu.build-dependencies]
 dof = { version = "0.3", default-features = false, features = ["des"] }
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }
@@ -140,6 +140,7 @@ spin = { version = "0.9", default-features = false, features = ["once", "spin_mu
 tokio-util = { version = "0.7", features = ["codec", "io"] }
 
 [target.aarch64-apple-darwin.dependencies]
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }
@@ -150,6 +151,7 @@ rustls-pki-types = { version = "1", features = ["std"] }
 tokio-util = { version = "0.7", features = ["codec", "io"] }
 
 [target.aarch64-apple-darwin.build-dependencies]
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }
@@ -162,6 +164,7 @@ tokio-util = { version = "0.7", features = ["codec", "io"] }
 [target.x86_64-unknown-illumos.dependencies]
 bitflags-dff4ba8e3ae991db = { package = "bitflags", version = "1" }
 dof = { version = "0.3", default-features = false, features = ["des"] }
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }
@@ -175,6 +178,7 @@ toml_edit = { version = "0.19", features = ["serde"] }
 
 [target.x86_64-unknown-illumos.build-dependencies]
 dof = { version = "0.3", default-features = false, features = ["des"] }
+getrandom = { version = "0.2", default-features = false, features = ["std"] }
 hyper = { version = "1", features = ["full"] }
 hyper-rustls = { version = "0.27", default-features = false, features = ["http1", "http2", "ring", "tls12", "webpki-tokio"] }
 hyper-util = { version = "0.1", features = ["full"] }