microsandbox-rb 0.17.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37f44ca952f2885719237b06ea10b5316c383fee0a2fdfa5c51c76fd295c1591
4
- data.tar.gz: 81e55203c1aea73d0368d93d7c36c73015b9a5a97634b69a3f5d805a48c7446c
3
+ metadata.gz: 8fbc8d09d8029bef1ec00d128bf554b037c937e51ebe8b9b8a6014043fce178e
4
+ data.tar.gz: 626313c0471102e108793f3880bcd1f1e30ba9f48470274bf53495a86cfadff7
5
5
  SHA512:
6
- metadata.gz: 49876e1d24e9e64ab486932f6180c511ea5142a93f8b1c0edb67f04847b861310a4972046b08babe11679f88835883fa80b739fd2f8d5f7ff5d49316f6c26c8d
7
- data.tar.gz: 3bf053fb8c2e63099c128655fce91335c3ce35c7459af3616acad7d3b773f32184107740c124df2e7f122053d807f74c2d9f6337f66d0c6ed9121c4ddadd2eb3
6
+ metadata.gz: 49461a4a9ca44f5af82d62fe30086bd4b153d3885267274fce7de8328b071cb418055f202b3b2feea3f149d76572a2a78874596c707ac094d62f7cc5171269aa
7
+ data.tar.gz: 929b0a19b88eb839d371899191e6a0229eded4eb616100dbd8d316352eac3bf68dcfefa91fb04c4ce41ad540deaa41233c1533d2471222bbf4772d8708451be6
data/CHANGELOG.md CHANGED
@@ -6,6 +6,137 @@ All notable changes to this gem are documented here. The format is based on
6
6
  microsandbox runtime it embeds; each release notes the upstream runtime tag it
7
7
  wraps, and the README's Versioning section keeps the full gem→runtime map.
8
8
 
9
+ ## [Unreleased]
10
+
11
+ ## [0.17.1] - 2026-10-12
12
+
13
+ Gem-only security and hardening release; the embedded runtime stays at
14
+ **`v0.6.18`**. Upgrading is recommended for everyone on `0.17.0` or earlier.
15
+ Two fixes tighten input handling and can reject input that used to be
16
+ accepted: `Volume.fs` paths containing a `..` segment, and
17
+ `Microsandbox.runtime_path = nil`.
18
+
19
+ ### Security
20
+
21
+ - **Relative host paths are pinned when a sandbox is created**
22
+ ([GHSA-mcw9-9rf6-p4rm](https://github.com/superradcompany/microsandbox/security/advisories/GHSA-mcw9-9rf6-p4rm),
23
+ high; fixed upstream in runtime `v0.7.6`, which this gem does not embed yet).
24
+ The embedded runtime stored a relative host path exactly as written and
25
+ resolved it against the working directory of whichever process later
26
+ started the sandbox, so restarting a sandbox from another directory mounted
27
+ a different host directory than the one originally intended. The native
28
+ layer now anchors every relative host path to the creating process's
29
+ directory before the configuration is persisted: bind and disk mount
30
+ sources in `volumes:`, a directory or disk-image `image:`, a `root_disk:`
31
+ image path, `Patch.copy_file` / `Patch.copy_dir` sources, the `tls:`
32
+ certificate paths, and a path-form `from_snapshot:`. This covers sandboxes
33
+ created through the gem; the `msb` CLI the gem installs is unchanged, so use
34
+ absolute paths with it. Paths are anchored
35
+ without following symlinks and without requiring the target to exist, so a
36
+ symlinked bind-mount root is still refused unless
37
+ `follow_root_symlinks: true`. Absolute paths, named volumes, and OCI
38
+ references are unchanged, and on a cloud backend paths are forwarded as
39
+ written (they belong to the remote host).
40
+
41
+ **Existing sandboxes are not rewritten.** A sandbox created by an earlier
42
+ gem version with a relative path keeps that saved path and its old
43
+ behaviour: recreate it, or only ever start it from its original directory.
44
+ Affects every earlier `microsandbox-rb` release; the upstream advisory does
45
+ not list this gem.
46
+ - **Errors no longer repeat values that can be credentials.** A URL-style
47
+ proxy address (`socks5://user:pass@host:port`) is refused by shape without
48
+ being echoed; an `env:` / `labels:` / `scripts:` value that is not a Hash
49
+ (or convertible to one, like `ENV`), a malformed patch, and a non-Hash
50
+ secret spec are reported by class name only.
51
+ - **Dependencies with published advisories updated in `Cargo.lock`**:
52
+ `russh` 0.63.1 → 0.63.3 (GHSA-35g8-35p8-c8fw, SSH server side),
53
+ `rustls` 0.23.41 → 0.23.45 (RUSTSEC-2026-0285), `h2` 0.4.15 → 0.4.16
54
+ (RUSTSEC-2026-0258), plus `anyhow` 1.0.104 and `event-listener` 5.4.2
55
+ (unsoundness fixes). Those pulled in `aws-lc-rs` 1.18.1, `aws-lc-sys`
56
+ 0.45.0, `rustls-webpki` 0.103.15, and `num-bigint` 0.5.1 in place of
57
+ `internal-russh-num-bigint`. `rkyv` and `rsa` have no compatible fixed
58
+ release at the pinned runtime and are unchanged.
59
+
60
+ ### Added
61
+
62
+ - `SECURITY.md`: how to report a vulnerability privately, and a table mapping
63
+ upstream microsandbox advisories to the `microsandbox-rb` versions they
64
+ affect (upstream advisories do not list this gem). Shipped in the gem.
65
+ - `require "microsandbox-rb"` as an entry point named after the gem. Outside
66
+ Bundler, `require "microsandbox"` can resolve to the unrelated `microsandbox`
67
+ gem on RubyGems.
68
+
69
+ ### Fixed
70
+
71
+ - **Documentation examples that did not run.** The README quick start failed
72
+ on its second run (`SandboxAlreadyExistsError`; it now uses
73
+ `ephemeral: true`), and the README / configuration-guide `secrets:` example
74
+ used the `#modify` shape and raised `TypeError`. The observability and
75
+ errors guides named the wrong error class for the metrics startup window
76
+ (it is the base `Microsandbox::Error`, matched by message), and
77
+ `log_stream(follow: true)` was documented as ending when the sandbox stops
78
+ (it does not). The guides now also state that an inline secret `value:` is
79
+ stored in cleartext in the local catalog until the sandbox is removed, that
80
+ the block form stops but does not remove, that a runtime home belongs to one
81
+ runtime line (`MSB_HOME`), and list known issues at the pinned runtime
82
+ (including guest `fallocate` truncating bind-mounted files on macOS hosts).
83
+ - **A rejected option no longer triggers a runtime download.** The first-use
84
+ runtime check ran before most argument validation, so `Sandbox.create` with
85
+ a bad option downloaded and installed `msb` before raising. It now runs
86
+ after the options are validated, in `create`, `connect_or_create` and
87
+ `create_with_progress`.
88
+ - **First-use provisioning is serialized within a process.** Several threads
89
+ making their first `Sandbox.create` at once each ran the installer, which
90
+ replaces files in place. `Microsandbox.install`, `Microsandbox.setup` and
91
+ the first-use check now share one lock, and the check runs once.
92
+ - **`Microsandbox.runtime_path = nil` / `libkrunfw_path = nil`** (or `""`)
93
+ raise `ArgumentError` instead of writing an empty path into the set-once
94
+ slot for the rest of the process.
95
+ - **Companion gem detection no longer depends on the host project's name.**
96
+ When the host project is itself a gem with its bundle installed inside the
97
+ project directory, `microsandbox-rb-binaries` could be attributed to the
98
+ host project and ignored, depending on gem load order. The owner is now
99
+ the gem with the innermost matching root.
100
+ - **`patches:` with `from_snapshot:`** raises `ArgumentError` up front. The
101
+ runtime rejects the pair only after claiming the sandbox name on disk,
102
+ which left an empty directory holding the name.
103
+ - **Block forms keep the caller's exception.** `fs.write_stream { }`,
104
+ `ssh.open_client { }` and `client.sftp { }` closed in a bare `ensure`, so a
105
+ failing close replaced whatever the block had raised. The block's exception
106
+ now wins; a close failure is still raised when the block itself succeeded.
107
+ - **`PullSession#sandbox`** re-raises the original create failure when called
108
+ again, instead of an unrelated "already taken" error.
109
+ - **Timestamps are exact to the millisecond.** `Time.at(ms / 1000.0)` went
110
+ through a Float and reported one millisecond low for about half of all
111
+ values (`FsEntry#modified`, `FsMetadata#modified` / `#created`,
112
+ `LogEntry#timestamp`, `Metrics#timestamp`, and every `created_at` /
113
+ `updated_at` / `last_used_at` / `observed_at` reader).
114
+ - **`secrets:` given as a `{ "NAME" => { ... } }` Hash** (the `#modify`
115
+ shape) raises a descriptive `ArgumentError` instead of `TypeError`; a single
116
+ bare spec Hash is accepted as a list of one, as is a single patch Hash for
117
+ `patches:`.
118
+
119
+ ### Changed
120
+
121
+ - **`Volume.fs` paths may not contain a `..` segment.** Every `VolumeFs` operation
122
+ (`read`, `read_text`, `write`, `list`, `mkdir`, `remove_file`, `remove_dir`,
123
+ `exists?`, `copy`, `rename`, `stat`) now refuses a path that contains a `..`
124
+ segment with `FilesystemError`, in the native layer as well as the Ruby
125
+ wrapper. Volume paths are relative to the volume root and never need one.
126
+ A path such as `"a/../b"` that used to be accepted must now be written as
127
+ `"b"`. Names that merely contain dots (`"..hidden"`, `"a..b"`) are fine.
128
+ - **README restructured** along the lines of a conventional Ruby SDK README:
129
+ badges, a Highlights list, a short install + quick start, a Documentation
130
+ table, and a sourced comparison with the official `microsandbox` gem. The
131
+ detailed guides moved into `docs/` (`lifecycle`, `configuration`,
132
+ `execution`, `filesystem`, `observability`, `images`, `runtime`, `errors`,
133
+ `surface`, `releasing`), which the gem now ships (`spec.files`), so the
134
+ links resolve on rubygems.org and rubydoc.info. `docs/surface.md` replaces
135
+ the duplicated implemented-surface prose in README and `DESIGN.md` as the
136
+ single scope statement. `docs/errors.md` lists every error class and marks
137
+ the four the native layer does not currently raise (`PathNotFoundError`,
138
+ `ImagePullFailedError`, `SecretViolationError`, `TlsError`) as reserved.
139
+
9
140
  ## [0.17.0] - 2026-09-13
10
141
 
11
142
  Adopts upstream runtime **`v0.6.16` → `v0.6.18`**, stepping through the
@@ -1260,7 +1391,11 @@ microsandbox runtime, aligned with the official Python/Node/Go SDKs.
1260
1391
  core crate has Apple-native deps). Until precompiled gems are published,
1261
1392
  installing from source requires a Rust toolchain (stable >= 1.91).
1262
1393
 
1263
- [Unreleased]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.14.0...HEAD
1394
+ [Unreleased]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.17.1...HEAD
1395
+ [0.17.1]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.17.0...v0.17.1
1396
+ [0.17.0]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.16.0...v0.17.0
1397
+ [0.16.0]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.15.0...v0.16.0
1398
+ [0.15.0]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.14.0...v0.15.0
1264
1399
  [0.14.0]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.13.0...v0.14.0
1265
1400
  [0.9.0]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.8.2...v0.9.0
1266
1401
  [0.8.2]: https://github.com/ya-luotao/microsandbox-rb/compare/v0.8.1...v0.8.2
data/Cargo.lock CHANGED
@@ -169,9 +169,9 @@ dependencies = [
169
169
 
170
170
  [[package]]
171
171
  name = "anyhow"
172
- version = "1.0.102"
172
+ version = "1.0.104"
173
173
  source = "registry+https://github.com/rust-lang/crates.io-index"
174
- checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
174
+ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
175
175
 
176
176
  [[package]]
177
177
  name = "argon2"
@@ -249,7 +249,7 @@ checksum = "b9552f96391c005e6ab449fa941420935e7e062489b12b8b1b08879b2163f5b5"
249
249
  dependencies = [
250
250
  "bytes",
251
251
  "half",
252
- "num-bigint",
252
+ "num-bigint 0.4.6",
253
253
  "num-traits",
254
254
  ]
255
255
 
@@ -579,9 +579,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
579
579
 
580
580
  [[package]]
581
581
  name = "aws-lc-rs"
582
- version = "1.17.0"
582
+ version = "1.18.1"
583
583
  source = "registry+https://github.com/rust-lang/crates.io-index"
584
- checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00"
584
+ checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e"
585
585
  dependencies = [
586
586
  "aws-lc-sys",
587
587
  "untrusted 0.7.1",
@@ -590,14 +590,15 @@ dependencies = [
590
590
 
591
591
  [[package]]
592
592
  name = "aws-lc-sys"
593
- version = "0.41.0"
593
+ version = "0.45.0"
594
594
  source = "registry+https://github.com/rust-lang/crates.io-index"
595
- checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4"
595
+ checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27"
596
596
  dependencies = [
597
597
  "cc",
598
598
  "cmake",
599
599
  "dunce",
600
600
  "fs_extra",
601
+ "pkg-config",
601
602
  ]
602
603
 
603
604
  [[package]]
@@ -643,7 +644,7 @@ checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695"
643
644
  dependencies = [
644
645
  "autocfg",
645
646
  "libm",
646
- "num-bigint",
647
+ "num-bigint 0.4.6",
647
648
  "num-integer",
648
649
  "num-traits",
649
650
  "serde",
@@ -1614,7 +1615,7 @@ dependencies = [
1614
1615
  "asn1-rs",
1615
1616
  "displaydoc",
1616
1617
  "nom",
1617
- "num-bigint",
1618
+ "num-bigint 0.4.6",
1618
1619
  "num-traits",
1619
1620
  "rusticata-macros",
1620
1621
  ]
@@ -1922,7 +1923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1922
1923
  checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1923
1924
  dependencies = [
1924
1925
  "libc",
1925
- "windows-sys 0.61.2",
1926
+ "windows-sys 0.52.0",
1926
1927
  ]
1927
1928
 
1928
1929
  [[package]]
@@ -1937,11 +1938,10 @@ dependencies = [
1937
1938
 
1938
1939
  [[package]]
1939
1940
  name = "event-listener"
1940
- version = "5.4.1"
1941
+ version = "5.4.2"
1941
1942
  source = "registry+https://github.com/rust-lang/crates.io-index"
1942
- checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
1943
+ checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2"
1943
1944
  dependencies = [
1944
- "concurrent-queue",
1945
1945
  "parking",
1946
1946
  "pin-project-lite",
1947
1947
  ]
@@ -2051,7 +2051,7 @@ checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a"
2051
2051
  dependencies = [
2052
2052
  "io-lifetimes 2.0.4",
2053
2053
  "rustix",
2054
- "windows-sys 0.59.0",
2054
+ "windows-sys 0.52.0",
2055
2055
  ]
2056
2056
 
2057
2057
  [[package]]
@@ -2300,9 +2300,9 @@ dependencies = [
2300
2300
 
2301
2301
  [[package]]
2302
2302
  name = "h2"
2303
- version = "0.4.15"
2303
+ version = "0.4.16"
2304
2304
  source = "registry+https://github.com/rust-lang/crates.io-index"
2305
- checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155"
2305
+ checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27"
2306
2306
  dependencies = [
2307
2307
  "atomic-waker",
2308
2308
  "bytes",
@@ -2851,18 +2851,6 @@ dependencies = [
2851
2851
  "hybrid-array",
2852
2852
  ]
2853
2853
 
2854
- [[package]]
2855
- name = "internal-russh-num-bigint"
2856
- version = "0.5.0"
2857
- source = "registry+https://github.com/rust-lang/crates.io-index"
2858
- checksum = "ae8e22120c32fb4d19ec55fba35015f57095cd95a2e3b732e44457f5915b2ee8"
2859
- dependencies = [
2860
- "num-integer",
2861
- "num-traits",
2862
- "rand 0.10.2",
2863
- "rand_core 0.10.1",
2864
- ]
2865
-
2866
2854
  [[package]]
2867
2855
  name = "io-extras"
2868
2856
  version = "0.19.0"
@@ -2870,7 +2858,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2870
2858
  checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f"
2871
2859
  dependencies = [
2872
2860
  "io-lifetimes 3.0.1",
2873
- "windows-sys 0.60.2",
2861
+ "windows-sys 0.52.0",
2874
2862
  ]
2875
2863
 
2876
2864
  [[package]]
@@ -3672,7 +3660,7 @@ dependencies = [
3672
3660
 
3673
3661
  [[package]]
3674
3662
  name = "microsandbox_rb"
3675
- version = "0.17.0"
3663
+ version = "0.17.1"
3676
3664
  dependencies = [
3677
3665
  "chrono",
3678
3666
  "futures",
@@ -4033,7 +4021,7 @@ version = "0.4.3"
4033
4021
  source = "registry+https://github.com/rust-lang/crates.io-index"
4034
4022
  checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
4035
4023
  dependencies = [
4036
- "num-bigint",
4024
+ "num-bigint 0.4.6",
4037
4025
  "num-complex",
4038
4026
  "num-integer",
4039
4027
  "num-iter",
@@ -4051,6 +4039,18 @@ dependencies = [
4051
4039
  "num-traits",
4052
4040
  ]
4053
4041
 
4042
+ [[package]]
4043
+ name = "num-bigint"
4044
+ version = "0.5.1"
4045
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4046
+ checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
4047
+ dependencies = [
4048
+ "num-integer",
4049
+ "num-traits",
4050
+ "rand 0.10.2",
4051
+ "rand_core 0.10.1",
4052
+ ]
4053
+
4054
4054
  [[package]]
4055
4055
  name = "num-complex"
4056
4056
  version = "0.4.6"
@@ -4092,7 +4092,7 @@ version = "0.4.2"
4092
4092
  source = "registry+https://github.com/rust-lang/crates.io-index"
4093
4093
  checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
4094
4094
  dependencies = [
4095
- "num-bigint",
4095
+ "num-bigint 0.4.6",
4096
4096
  "num-integer",
4097
4097
  "num-traits",
4098
4098
  ]
@@ -4733,7 +4733,7 @@ dependencies = [
4733
4733
  "once_cell",
4734
4734
  "socket2",
4735
4735
  "tracing",
4736
- "windows-sys 0.60.2",
4736
+ "windows-sys 0.52.0",
4737
4737
  ]
4738
4738
 
4739
4739
  [[package]]
@@ -5106,9 +5106,9 @@ dependencies = [
5106
5106
 
5107
5107
  [[package]]
5108
5108
  name = "russh"
5109
- version = "0.63.1"
5109
+ version = "0.63.3"
5110
5110
  source = "registry+https://github.com/rust-lang/crates.io-index"
5111
- checksum = "35bab1b87d915817d5d9cc352637cd40d5f0b298a48c6309af9156a4addc3031"
5111
+ checksum = "036204edbd199552a5b3832f63c60dcdf395dc44c7f06b4af1c0e8139cc11bce"
5112
5112
  dependencies = [
5113
5113
  "aes 0.9.1",
5114
5114
  "aws-lc-rs",
@@ -5137,13 +5137,12 @@ dependencies = [
5137
5137
  "hex-literal",
5138
5138
  "hmac 0.13.0",
5139
5139
  "inout 0.2.2",
5140
- "internal-russh-num-bigint",
5141
5140
  "keccak",
5142
5141
  "log",
5143
5142
  "md5",
5144
5143
  "ml-kem",
5145
5144
  "module-lattice",
5146
- "num-bigint",
5145
+ "num-bigint 0.5.1",
5147
5146
  "p256",
5148
5147
  "p384",
5149
5148
  "p521",
@@ -5271,7 +5270,7 @@ dependencies = [
5271
5270
  "errno",
5272
5271
  "libc",
5273
5272
  "linux-raw-sys",
5274
- "windows-sys 0.61.2",
5273
+ "windows-sys 0.52.0",
5275
5274
  ]
5276
5275
 
5277
5276
  [[package]]
@@ -5286,9 +5285,9 @@ dependencies = [
5286
5285
 
5287
5286
  [[package]]
5288
5287
  name = "rustls"
5289
- version = "0.23.41"
5288
+ version = "0.23.45"
5290
5289
  source = "registry+https://github.com/rust-lang/crates.io-index"
5291
- checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f"
5290
+ checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
5292
5291
  dependencies = [
5293
5292
  "aws-lc-rs",
5294
5293
  "log",
@@ -5340,7 +5339,7 @@ dependencies = [
5340
5339
  "security-framework 3.7.0",
5341
5340
  "security-framework-sys",
5342
5341
  "webpki-root-certs",
5343
- "windows-sys 0.61.2",
5342
+ "windows-sys 0.52.0",
5344
5343
  ]
5345
5344
 
5346
5345
  [[package]]
@@ -5351,9 +5350,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
5351
5350
 
5352
5351
  [[package]]
5353
5352
  name = "rustls-webpki"
5354
- version = "0.103.13"
5353
+ version = "0.103.15"
5355
5354
  source = "registry+https://github.com/rust-lang/crates.io-index"
5356
- checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
5355
+ checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
5357
5356
  dependencies = [
5358
5357
  "aws-lc-rs",
5359
5358
  "ring",
@@ -6414,7 +6413,7 @@ dependencies = [
6414
6413
  "getrandom 0.4.2",
6415
6414
  "once_cell",
6416
6415
  "rustix",
6417
- "windows-sys 0.61.2",
6416
+ "windows-sys 0.52.0",
6418
6417
  ]
6419
6418
 
6420
6419
  [[package]]
@@ -7211,7 +7210,7 @@ version = "0.1.11"
7211
7210
  source = "registry+https://github.com/rust-lang/crates.io-index"
7212
7211
  checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
7213
7212
  dependencies = [
7214
- "windows-sys 0.61.2",
7213
+ "windows-sys 0.52.0",
7215
7214
  ]
7216
7215
 
7217
7216
  [[package]]
@@ -7522,7 +7521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
7522
7521
  checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d"
7523
7522
  dependencies = [
7524
7523
  "bitflags 2.13.0",
7525
- "windows-sys 0.59.0",
7524
+ "windows-sys 0.52.0",
7526
7525
  ]
7527
7526
 
7528
7527
  [[package]]
data/DESIGN.md CHANGED
@@ -211,7 +211,7 @@ git. The override must never be committed — it would break container builds.
211
211
  The job is gated to `workflow_dispatch` and **not** auto-published on tags:
212
212
  since CI can't boot a microVM to prove a built gem actually works, gems are
213
213
  promoted to the publish path manually after per-platform validation. Published
214
- to RubyGems via Trusted Publishing (OIDC). See [Releasing](README.md#releasing).
214
+ to RubyGems via Trusted Publishing (OIDC). See [docs/releasing.md](docs/releasing.md).
215
215
  * **Runtime binaries gems** (`microsandbox-rb-binaries`): a distinct artifact
216
216
  from the precompiled *extension* gems above — no Ruby code beyond a small
217
217
  locator module, just the verified upstream `msb` + `libkrunfw` for one
@@ -232,42 +232,11 @@ git. The override must never be committed — it would break container builds.
232
232
 
233
233
  ## Implemented surface (v1) vs roadmap
234
234
 
235
- **Implemented:** sandbox lifecycle (`create`/`start`/`get`/`list`/`list_with`/
236
- `remove`; the live `Sandbox` exposes `stop`/`stop_and_wait`/`kill`/`drain`/
237
- `wait` (→ `ExitStatus`) / `status` / `detach` / `owns_lifecycle?`, while the
238
- controllable `SandboxHandle` from `get`/`list` carries the fine-grained
239
- `stop_with_timeout`/`request_stop`/`request_kill`/`request_drain`/
240
- `wait_until_stopped` (→ `SandboxStopResult`) controls — the v0.5.8 live-vs-handle
241
- split that mirrors the official SDKs), backend routing (`set_default_backend`/
242
- `with_backend`/`default_backend_kind`), block form), `exec`/`shell` with collected `ExecOutput`,
243
- **streaming** `exec_stream`/`shell_stream` (`ExecHandle` is `Enumerable` over
244
- `ExecEvent`s, with stdin sink + signal/kill/resize), the full guest filesystem
245
- API (`fs.read`/`write`/`list`/`mkdir`/`remove`/`stat`/…), `metrics`,
246
- `Microsandbox.all_sandbox_metrics`, **streaming `metrics_stream`/`log_stream`**
247
- (`Enumerable` over `Metrics`/`LogEntry`), `logs`,
248
- **OCI image-cache management** (`Image.get`/`list`/`inspect`/`remove`/`prune`),
249
- **named volumes** (`Volume.create`/`get`/`list`/`remove` + `volumes:` mounts),
250
- **snapshots** (`Snapshot.create`/`get`/`list`/`remove`/`verify`/`export`/`import`
251
- + `from_snapshot:` boot), **rootfs patches** (`Patch.text`/`file`/`append`/
252
- `copy_file`/`copy_dir`/`symlink`/`mkdir`/`remove` via `create(patches:)`),
253
- **custom per-rule network policies** (`NetworkPolicy`/`Rule`/`Destination` —
254
- CIDR/IP/domain/suffix/group allow-deny rules with per-direction defaults and
255
- bulk domain denials, alongside the presets), interactive **`attach`/
256
- `attach_shell`** (host-TTY coupled — raw mode + SIGWINCH), **SSH**
257
- (`Sandbox#ssh` → `SshClient`/`SftpClient`/`SshServer`), the **raw agent client**
258
- (`AgentClient` → `AgentStream`/`AgentFrame`),
259
- `version`/`install`/`installed?`/`ensure_runtime!`, **registry auth**
260
- (`registry_auth`/`registry_insecure`/`registry_ca_certs` on `create`, for
261
- private/authenticated registries), and the typed error hierarchy.
262
-
263
- Create options now cover `image`, `cpus`, `memory`, `oci_upper_size`, `env`,
264
- `workdir`, `shell`, `user`, `hostname`, `labels`, `scripts`, `entrypoint`,
265
- `ports`/`ports_udp`, `volumes`, `patches`, `network` (policy presets
266
- `public_only`/`none`/`allow_all`/`non_local`, or a custom `NetworkPolicy`/Hash),
267
- `log_level`, `quiet_logs`, `security`, `max_duration`, `idle_timeout`, `rlimits`,
268
- `pull_policy`, `registry_auth`/`registry_insecure`/`registry_ca_certs`,
269
- `secrets`, `from_snapshot`, `detached`, and `replace`/`replace_with_timeout`.
270
- `exec`/`shell` add per-call `rlimits`.
235
+ The authoritative, up-to-date scope statement — every implemented API family,
236
+ the full create-option list, and the handful of upstream knobs not yet exposed —
237
+ lives in [docs/surface.md](docs/surface.md), with the typed counterpart in
238
+ `sig/microsandbox.rbs`. It is maintained there (and only there) so this file
239
+ and the README cannot drift from each other.
271
240
 
272
241
  ## Verification
273
242