From f2bb8a62929c9bc4a594c8683327705e947f7d13 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Fri, 9 Oct 2026 23:33:04 -0700 Subject: [PATCH 01/11] chore: update flake.lock + Cargo --- Cargo.lock | 146 ++++--- Cargo.nix | 1143 ++++++++++++++++++++++++++++++++++++++++++++++++---- flake.lock | 24 +- 3 files changed, 1178 insertions(+), 135 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51a21dda..14b56a2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,7 +205,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +checksum = "50a649af8a827553c29fb0cb4bd4a6f1a0dd695bd3232b9bc98bd9c8a3ffbb8b" dependencies = [ "find-msvc-tools", "shlex", @@ -319,7 +319,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -499,7 +499,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -510,7 +510,7 @@ checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ "darling_core", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -585,9 +585,9 @@ dependencies = [ [[package]] name = "either" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" [[package]] name = "enum_dispatch" @@ -655,9 +655,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "finl_unicode" @@ -1043,9 +1043,9 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +checksum = "a37b2691796cffeb8a8cd305ac66e65841559f147f4e63231d0eafa4db5384d1" dependencies = [ "rustversion", ] @@ -1060,7 +1060,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -1114,15 +1114,15 @@ checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "libc" -version = "0.2.189" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libm" @@ -1177,12 +1177,12 @@ dependencies = [ [[package]] name = "mac_address" -version = "1.1.8" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +checksum = "b367b50a9be9a5d3b5718c1da74e5d6b9c17647f89752ee2562a470cc3c4eb1a" dependencies = [ - "nix", - "winapi", + "nix 0.30.1", + "windows-sys", ] [[package]] @@ -1224,9 +1224,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", "log", @@ -1239,6 +1239,18 @@ name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ "bitflags 2.13.2", "cfg-if", @@ -1413,19 +1425,21 @@ dependencies = [ [[package]] name = "pest" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d3aca230fad2e6f6317ca0a72724338c4960cb97168a85cdee66df4a9a21a8" +checksum = "b568374ba38b33a6c627141f891faf16902b08d2db26b8ede1bcb0a15b1919fa" dependencies = [ "memchr", + "psm", + "stacker", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284b60557f2c4a2e72ad3f2d34d42685a2fa4a6a61d0d2a10c0ae2a5e916c2cf" +checksum = "b66e184b924cebaaff20ab2256ca52f12332d528a39aa76553b5d96f92aacf7f" dependencies = [ "pest", "pest_generator", @@ -1433,22 +1447,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9d1f08a115309ee99268cf85e5228e0e56aa9caf8841ec12866b6be07c3109" +checksum = "a87478d267e4de54a626af9754f2f0f58e927aac6ed0575fe89bc05ad6851694" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.7", ] [[package]] name = "pest_meta" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed93ba1a9ffcca32130a5188701c81c0c49cf00d4b7c5007d5148951d743adcb" +checksum = "4f986f248b4241ac359b831f6139aaa34e03b08a37b6caf7e201a33f95c869e1" dependencies = [ "pest", ] @@ -1519,9 +1533,9 @@ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "powerfmt" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" [[package]] name = "ppv-lite86" @@ -1569,6 +1583,15 @@ dependencies = [ "unarray", ] +[[package]] +name = "psm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +dependencies = [ + "cc", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1922,7 +1945,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -2005,9 +2028,9 @@ checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "siphasher" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" [[package]] name = "slab" @@ -2017,9 +2040,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.16.2" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" +checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" [[package]] name = "socket2" @@ -2031,6 +2054,19 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "stacker" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2088,9 +2124,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +checksum = "d62a2e0561533f2ca2561d0cf27fd9fedb640a1bf2616ff5d5c80d99017faadc" dependencies = [ "proc-macro2", "quote", @@ -2162,7 +2198,7 @@ dependencies = [ "libc", "log", "memmem", - "nix", + "nix 0.29.0", "num-derive", "num-traits", "ordered-float", @@ -2223,7 +2259,7 @@ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -2249,9 +2285,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "tokio" -version = "1.53.1" +version = "1.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" dependencies = [ "bytes", "libc", @@ -2270,7 +2306,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", ] [[package]] @@ -2351,9 +2387,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" [[package]] name = "unicode-ident" @@ -2392,9 +2428,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.26.1" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" dependencies = [ "atomic", "getrandom 0.4.3", @@ -2484,7 +2520,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.6", + "syn 3.0.7", "wasm-bindgen-shared", ] @@ -2696,18 +2732,18 @@ checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "zerocopy" -version = "0.8.58" +version = "0.8.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e8fafad82b542ff3717217ecdc736231b59e387768c9630123b4ce4d2db44" +checksum = "86502bf56ac7c77571a32e2647bb2a15894565e981fb2a48d7bde2d91c965a9d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.58" +version = "0.8.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595f56e044df4f46a0c9a626f65c3d99eb8488f7e8a8baa12dd76326d9710bf2" +checksum = "5457206954b06561e2608c7e19cf58b1926586d999c246eebe4502f7e2039d1a" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index b78b6f31..0f6374d2 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -149,6 +149,16 @@ rec { packageId = "improvise-ws-server"; }; + # Debug support which might change between releases. + # File a bug if you depend on any for non-debug work! + debug = internal.debugCrate { inherit packageId; }; + }; + "numtower" = rec { + packageId = "numtower"; + build = internal.buildRustCrateWithFeatures { + packageId = "numtower"; + }; + # Debug support which might change between releases. # File a bug if you depend on any for non-debug work! debug = internal.debugCrate { inherit packageId; }; @@ -186,6 +196,7 @@ rec { version = "2.0.1"; edition = "2021"; sha256 = "1ymy18s9hs7ya1pjc9864l30wk8p2qfqdi7mhhcc5nfakxbij09j"; + license = "0BSD OR MIT OR Apache-2.0"; authors = [ "Jonas Schievink " "oyvindln " @@ -202,6 +213,7 @@ rec { edition = "2021"; sha256 = "1fhjkp2nbs7gg4y1b68hpc8028rpax8aiscfh9b60q78m4pn90n9"; libName = "aho_corasick"; + license = "Unlicense OR MIT"; authors = [ "Andrew Gallant " ]; @@ -227,6 +239,7 @@ rec { edition = "2018"; sha256 = "08zrzs022xwndihvzdn78yqarv2b9696y67i6h78nla3ww87jgb8"; libName = "allocator_api2"; + license = "MIT OR Apache-2.0"; authors = [ "Zakarum " ]; @@ -242,6 +255,7 @@ rec { version = "0.1.6"; edition = "2018"; sha256 = "1g3z4ga15a9022vbgi31qqyb7pgk23saq7xfarn6yslpr54ic8mf"; + license = "MIT OR Apache-2.0"; authors = [ "Nicolas Silva " ]; @@ -258,6 +272,7 @@ rec { version = "1.0.0"; edition = "2021"; sha256 = "13d2bj0xfg012s4rmq44zc8zgy1q8k9yp7yhvfnarscnmwpj2jl2"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "anstyle"; @@ -303,6 +318,7 @@ rec { version = "1.0.14"; edition = "2021"; sha256 = "0030szmgj51fxkic1hpakxxgappxzwm6m154a3gfml83lq63l2wl"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; }; @@ -314,6 +330,7 @@ rec { edition = "2021"; sha256 = "03hkv2690s0crssbnmfkr76kw1k7ah2i6s5amdy9yca2n8w7zkjj"; libName = "anstyle_parse"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "utf8parse"; @@ -334,6 +351,7 @@ rec { edition = "2021"; sha256 = "1p6shfpnbghs6jsa0vnqd8bb8gd7pjd0jr7w0j8jikakzmr8zi20"; libName = "anstyle_query"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "windows-sys"; @@ -350,6 +368,7 @@ rec { edition = "2021"; sha256 = "0zblannm70sk3xny337mz7c6d8q8i24vhbqi42ld8v7q1wjnl7i9"; libName = "anstyle_wincon"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "anstyle"; @@ -374,6 +393,7 @@ rec { version = "1.0.104"; edition = "2021"; sha256 = "0w34jjcm02p5g9kvsjr1dvpw0zs2fi7igi6nr414fkm5gz85w2ik"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -387,6 +407,7 @@ rec { version = "0.5.1"; edition = "2015"; sha256 = "1ilpv3dgd58rasslss0labarq7jawxmivk17wsh8wmkdm3q15cfa"; + license = "Apache-2.0"; authors = [ "Brendan Zabarauskas " ]; @@ -403,11 +424,29 @@ rec { }; resolvedDefaultFeatures = [ "std" ]; }; + "arrayvec" = rec { + crateName = "arrayvec"; + version = "0.7.8"; + edition = "2018"; + sha256 = "0mmd8lrijbvg1qp4c5zis5dq41a3mjv2rb6bxkyj9kwaw2k6gyyk"; + license = "MIT OR Apache-2.0"; + authors = [ + "bluss" + ]; + features = { + "borsh" = [ "dep:borsh" ]; + "default" = [ "std" ]; + "serde" = [ "dep:serde" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "atomic" = rec { crateName = "atomic"; version = "0.6.1"; edition = "2018"; sha256 = "0h43ljcgbl6vk62hs6yk7zg7qn3myzvpw8k7isb9nzhkbdvvz758"; + license = "Apache-2.0/MIT"; authors = [ "Amanieu d'Antras " ]; @@ -434,6 +473,7 @@ rec { version = "1.5.1"; edition = "2015"; sha256 = "0lqasy5i30flcgih1b50kvsk6z32g09r1q4ql7q81pj6228jy0zj"; + license = "Apache-2.0 OR MIT"; authors = [ "Josh Stone " ]; @@ -444,6 +484,7 @@ rec { version = "0.22.1"; edition = "2018"; sha256 = "1imqzgh7bxcikp5vx3shqvw9j09g9ly0xr0jma0q66i52r7jbcvj"; + license = "MIT OR Apache-2.0"; authors = [ "Marshall Pierce " ]; @@ -459,6 +500,7 @@ rec { edition = "2015"; sha256 = "1wcm9vxi00ma4rcxkl3pzzjli6ihrpn9cfdi0c5b4cvga2mxs007"; libName = "bit_set"; + license = "MIT/Apache-2.0"; authors = [ "Alexis Beingessner " ]; @@ -481,6 +523,7 @@ rec { edition = "2015"; sha256 = "18riaa10s6n59n39vix0cr7l2dgwdhcpbcm97x1xbyfp1q47x008"; libName = "bit_set"; + license = "Apache-2.0 OR MIT"; authors = [ "Alexis Beingessner " ]; @@ -504,6 +547,7 @@ rec { edition = "2015"; sha256 = "1ywqjnv60cdh1slhz67psnp422md6jdliji6alq0gmly2xm9p7rl"; libName = "bit_vec"; + license = "MIT/Apache-2.0"; authors = [ "Alexis Beingessner " ]; @@ -521,6 +565,7 @@ rec { edition = "2015"; sha256 = "1xxa1s2cj291r7k1whbxq840jxvmdsq9xgh7bvrxl46m80fllxjy"; libName = "bit_vec"; + license = "Apache-2.0 OR MIT"; authors = [ "Alexis Beingessner " ]; @@ -541,6 +586,7 @@ rec { version = "1.3.2"; edition = "2018"; sha256 = "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"; + license = "MIT/Apache-2.0"; authors = [ "The Rust Project Developers" ]; @@ -556,6 +602,7 @@ rec { version = "2.13.2"; edition = "2021"; sha256 = "01hbgjwvid66850fzi76mvn5f2bqycx6sf165ng1kfjqq9bl1v9x"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" ]; @@ -573,6 +620,7 @@ rec { edition = "2018"; sha256 = "0w9sa2ypmrsqqvc20nhwr75wbb5cjr4kkyhpjm1z1lv2kdicfy1h"; libName = "block_buffer"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -590,6 +638,7 @@ rec { edition = "2024"; sha256 = "1ak0cvmxz3yifqmzv6aba9606brsz7d5g3piv5xdcvjsx7dwgxnj"; libName = "block_buffer"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -603,11 +652,101 @@ rec { "zeroize" = [ "dep:zeroize" ]; }; }; + "borsh" = rec { + crateName = "borsh"; + version = "1.8.1"; + edition = "2018"; + crateBin = []; + sha256 = "02p2lhz49944wc6j5dzr42y1mkrv0znbicg3cl61b9bbda25sg2m"; + license = "MIT OR Apache-2.0"; + authors = [ + "Near Inc " + ]; + dependencies = [ + { + name = "borsh-derive"; + packageId = "borsh-derive"; + optional = true; + } + { + name = "bytes"; + packageId = "bytes"; + optional = true; + usesDefaultFeatures = false; + } + ]; + buildDependencies = [ + { + name = "cfg_aliases"; + packageId = "cfg_aliases"; + } + ]; + features = { + "ascii" = [ "dep:ascii" ]; + "borsh-derive" = [ "dep:borsh-derive" ]; + "bson" = [ "dep:bson" ]; + "bytes" = [ "dep:bytes" ]; + "default" = [ "std" ]; + "derive" = [ "borsh-derive" ]; + "hashbrown" = [ "dep:hashbrown" ]; + "indexmap" = [ "dep:indexmap" ]; + "std" = [ "bytes?/std" ]; + "unstable__schema" = [ "derive" "borsh-derive/schema" ]; + "uuid" = [ "dep:uuid" ]; + }; + resolvedDefaultFeatures = [ "borsh-derive" "derive" "std" "unstable__schema" ]; + }; + "borsh-derive" = rec { + crateName = "borsh-derive"; + version = "1.8.1"; + edition = "2018"; + sha256 = "0mlzrbwzcr7qaky1iap09m0nrzp6crjd79sinj4iz808cxjzxk8j"; + procMacro = true; + libName = "borsh_derive"; + license = "Apache-2.0"; + authors = [ + "Near Inc " + ]; + dependencies = [ + { + name = "once_cell"; + packageId = "once_cell"; + } + { + name = "proc-macro-crate"; + packageId = "proc-macro-crate"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn 3.0.7"; + features = [ "full" "fold" ]; + } + ]; + devDependencies = [ + { + name = "syn"; + packageId = "syn 3.0.7"; + features = [ "full" "fold" "parsing" ]; + } + ]; + features = { + }; + resolvedDefaultFeatures = [ "default" "schema" ]; + }; "bumpalo" = rec { crateName = "bumpalo"; version = "3.20.3"; edition = "2021"; sha256 = "0jc6va3nwcqikm7chnpdv1s87my3gs2j7g1sc7g3k91brg3arxbj"; + license = "MIT OR Apache-2.0"; authors = [ "Nick Fitzgerald " ]; @@ -623,6 +762,7 @@ rec { version = "1.2.1"; edition = "2021"; sha256 = "01idmag3lcwnnqrnnyik2gmbrr34drsi97q15ihvcbbidf2kryk4"; + license = "MIT OR Apache-2.0"; authors = [ "Matt Brubeck " ]; @@ -633,6 +773,7 @@ rec { version = "1.25.2"; edition = "2018"; sha256 = "15rp2m7j7kq22s76cbjwmrkd5r8lvacnm0mnrj013cnzka22x0wm"; + license = "Zlib OR Apache-2.0 OR MIT"; authors = [ "Lokathor " ]; @@ -651,6 +792,7 @@ rec { version = "1.12.1"; edition = "2021"; sha256 = "017z19dpg4f942h051m7bpnzcgng042hhcpd7bmg7bjjqd42lrgw"; + license = "MIT"; authors = [ "Carl Lerche " "Sean McArthur " @@ -667,6 +809,7 @@ rec { version = "0.2.4"; edition = "2018"; sha256 = "0nn5his5f8q20nkyg1nwb40xc19a08yaj4y76a8q2y3mdsmm3ify"; + license = "MIT"; authors = [ "Stephen M. Coakley " ]; @@ -684,9 +827,10 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.4.7"; + version = "1.7.0"; edition = "2021"; - sha256 = "04z3q2wqsg4qgx4vsqsd01s27svz0bgdymjiyccgbnn24gg3whal"; + sha256 = "12xvzyiwincbr6djn8ykbdlxv87ilva4pjxhkz156xc2iaplk9jh"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "find-msvc-tools"; @@ -707,6 +851,7 @@ rec { edition = "2018"; sha256 = "0026j56901nzjraap3da0a8njw42j66zcxnn6s2s9aa5bcblhxjf"; libName = "cfg_if"; + license = "MIT OR Apache-2.0"; authors = [ "Alex Crichton " ]; @@ -720,6 +865,7 @@ rec { version = "0.2.2"; edition = "2018"; sha256 = "09rm3dv28gbsal7w6q76lg2nfyn8wp789ska9b8vr1w750xfhygh"; + license = "MIT"; authors = [ "Zicklag " ]; @@ -730,6 +876,7 @@ rec { version = "0.10.2"; edition = "2024"; sha256 = "01hvvbgdmqkcgs2s4f12s9wa5h2gbq05rqvypv61azlwd55mxhv5"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -765,6 +912,7 @@ rec { version = "0.4.45"; edition = "2021"; sha256 = "09rkcgk6is2sdhqs9142zv8xqnj8ryx8m9hknllqwyv9wxi9x9qs"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "iana-time-zone"; @@ -833,6 +981,7 @@ rec { edition = "2024"; crateBin = []; sha256 = "0il98y2rfw75984ck59znd4n592p07bxz8yy3a9blddb02rpd25a"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "clap_builder"; @@ -874,6 +1023,7 @@ rec { version = "4.6.7"; edition = "2024"; sha256 = "0kbhai5rv1vj9r4np52g2b9fmhvy3y82digs9v40c57bgbxrf1zc"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "anstream"; @@ -914,6 +1064,7 @@ rec { edition = "2024"; sha256 = "1q36bgbkfb9rdz7jcvd0ffv0wwlyw0lg3z6iwdcybm0mjjvm3izr"; procMacro = true; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "heck"; @@ -929,7 +1080,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; features = [ "full" ]; } ]; @@ -945,6 +1096,7 @@ rec { version = "1.1.1"; edition = "2024"; sha256 = "11k4m4ngn39iz39lnq6nn6kyxzp62mnm1d86qfad3q0vlk33n4qw"; + license = "MIT OR Apache-2.0"; }; "colorchoice" = rec { @@ -952,6 +1104,7 @@ rec { version = "1.0.5"; edition = "2021"; sha256 = "0w75k89hw39p0mnnhlrwr23q50rza1yjki44qvh2mgrnj065a1qx"; + license = "MIT OR Apache-2.0"; }; "compact_str" = rec { @@ -959,6 +1112,7 @@ rec { version = "0.9.1"; edition = "2021"; sha256 = "1aq0vx3xnaxf9k8p1pwch5v5av0xj2ddq2av25aa76jd4z1d3zcx"; + license = "MIT"; authors = [ "Parker Timmerman " ]; @@ -1022,6 +1176,7 @@ rec { edition = "2024"; sha256 = "0p7m286mp8aai4sa72g7ji6qm0d4ns8wg4i4b2hj9p9615zm3vx6"; libName = "const_oid"; + license = "Apache-2.0 OR MIT"; authors = [ "RustCrypto Developers" ]; @@ -1034,6 +1189,7 @@ rec { version = "0.10.0"; edition = "2021"; sha256 = "1fff1x78mp2c233g68my0ag0zrmjdbym8bfyahjbfy4cxza5hd33"; + license = "MIT"; authors = [ "rutrum " ]; @@ -1051,6 +1207,7 @@ rec { edition = "2018"; sha256 = "12w8j73lazxmr1z0h98hf3z623kl8ms7g07jch7n4p8f9nwlhdkp"; libName = "core_foundation_sys"; + license = "MIT OR Apache-2.0"; authors = [ "The Servo Project Developers" ]; @@ -1064,6 +1221,7 @@ rec { version = "0.2.17"; edition = "2018"; sha256 = "10023dnnaghhdl70xcds12fsx2b966sxbxjq5sxs49mvxqw5ivar"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1100,6 +1258,7 @@ rec { version = "0.3.1"; edition = "2024"; sha256 = "0rkm1l35jy1z1yfg723fddsxc7vr0gc1hhfvc138hnqiwc58p8jw"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1136,6 +1295,7 @@ rec { version = "1.5.2"; edition = "2021"; sha256 = "0y0f955n2hr5a8rd9nw9sr23nhjc42ddx3bjc47dnlmqssgpk9q1"; + license = "MIT OR Apache-2.0"; authors = [ "Sam Rijs " "Alex Crichton " @@ -1157,6 +1317,7 @@ rec { edition = "2018"; sha256 = "02ylhcykxjc40xrfhk1lwc21jqgz4dbwv3jr49ymw733c51yl3kr"; libName = "critical_section"; + license = "MIT OR Apache-2.0"; features = { "std" = [ "restore-state-bool" ]; }; @@ -1166,6 +1327,7 @@ rec { version = "0.29.0"; edition = "2021"; sha256 = "0yzqxxd90k7d2ac26xq1awsznsaq0qika2nv1ik3p0vzqvjg5ffq"; + license = "MIT"; authors = [ "T. Post" ]; @@ -1248,6 +1410,7 @@ rec { version = "0.9.1"; edition = "2018"; sha256 = "0axbfb2ykbwbpf1hmxwpawwfs8wvmkcka5m561l7yp36ldi7rpdc"; + license = "MIT"; authors = [ "T. Post" ]; @@ -1267,6 +1430,7 @@ rec { edition = "2018"; sha256 = "02nn2rhfy7kvdkdjl457q2z0mklcvj9h662xrq6dzhfialh2kj3q"; libName = "crypto_common"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1293,6 +1457,7 @@ rec { edition = "2024"; sha256 = "0lql5wjlrjkd3r0w32rwbgqfmgg84ms3h65ldnlckmkc3nb4qvnf"; libName = "crypto_common"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1313,6 +1478,7 @@ rec { version = "0.6.2"; edition = "2018"; sha256 = "1gxh11hajx96mf5sd0az6mfsxdryfqvcfcphny3yfbfscqq7sapb"; + license = "MIT OR Apache-2.0"; authors = [ "Nor Khasyatillah " ]; @@ -1346,6 +1512,7 @@ rec { version = "1.4.0"; edition = "2021"; sha256 = "0f7r2ip0rbi7k377c3xmsh9xd69sillffhpfmbgnvz3yrxl9vkaj"; + license = "Unlicense/MIT"; authors = [ "Andrew Gallant " ]; @@ -1375,6 +1542,7 @@ rec { edition = "2018"; sha256 = "10lppd3fdb1i5npgx9xqjs5mjmy2qbdi8n16i48lg03ak4k3qjkh"; libName = "csv_core"; + license = "Unlicense/MIT"; authors = [ "Andrew Gallant " ]; @@ -1395,6 +1563,7 @@ rec { version = "0.24.1"; edition = "2021"; sha256 = "1v625grpyqddgaslgc0kzha41vzqy91yyg80ra9vjc363f8ga5zd"; + license = "MIT"; authors = [ "Ted Driggs " ]; @@ -1421,6 +1590,7 @@ rec { version = "0.24.1"; edition = "2021"; sha256 = "1zyxlb9ypzb3pzm0l8jy09x2kvd7x7qd50b1z0caxal5fk7y4dv8"; + license = "MIT"; authors = [ "Ted Driggs " ]; @@ -1444,7 +1614,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; features = [ "full" "extra-traits" ]; } ]; @@ -1461,6 +1631,7 @@ rec { edition = "2021"; sha256 = "1197l1qqsxssys3nnz58x36nv5kzpbjipsxv6dw2yazh7rf17ira"; procMacro = true; + license = "MIT"; authors = [ "Ted Driggs " ]; @@ -1475,7 +1646,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; } ]; @@ -1486,6 +1657,7 @@ rec { edition = "2018"; sha256 = "01hzn6jwv19320gvk85vvvay5ljhx12srvicz292fvpl3mas90s5"; libName = "data_encoding"; + license = "MIT"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -1497,6 +1669,7 @@ rec { version = "0.3.2"; edition = "2018"; sha256 = "1d3hw9hpvicl9x0x34jr2ybjk5g5ym1lhbyz6zj31110gq8zaaap"; + license = "MIT"; authors = [ "Ryan O'Beirne " ]; @@ -1507,6 +1680,7 @@ rec { version = "0.5.8"; edition = "2021"; sha256 = "0711df3w16vx80k55ivkwzwswziinj4dz05xci3rvmn15g615n3w"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " ]; @@ -1528,6 +1702,7 @@ rec { version = "2.1.1"; edition = "2021"; sha256 = "0d5i10l4aff744jw7v4n8g6cv15rjk5mp0f1z522pc2nj7jfjlfp"; + license = "MIT"; authors = [ "Jelte Fennema " ]; @@ -1576,6 +1751,7 @@ rec { sha256 = "1jwdp836vymp35d7mfvvalplkdgk2683nv3zjlx65n1194k9g6kr"; procMacro = true; libName = "derive_more_impl"; + license = "MIT"; authors = [ "Jelte Fennema " ]; @@ -1632,6 +1808,7 @@ rec { version = "0.10.7"; edition = "2018"; sha256 = "14p2n6ih29x81akj097lvz7wi9b6b9hvls0lwrv7b6xwyy0s5ncy"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1666,6 +1843,7 @@ rec { version = "0.11.3"; edition = "2024"; sha256 = "1hnmhd4rkybr11292w42pz9ppzx1h49glrhqg107k4s1b2xnvpgi"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -1707,6 +1885,7 @@ rec { procMacro = true; libName = "document_features"; libPath = "lib.rs"; + license = "MIT OR Apache-2.0"; authors = [ "Slint Developers " ]; @@ -1722,9 +1901,10 @@ rec { }; "either" = rec { crateName = "either"; - version = "1.18.0"; + version = "1.19.0"; edition = "2021"; - sha256 = "0d7dx31sf8rakcgp63070ngb2vkjynrni866pnx879pawndgnai5"; + sha256 = "1gjq21g0sgk5ylpj85zafcinwhh3jj91i6drhb4278vw2v17370f"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; "serde" = [ "dep:serde" ]; @@ -1738,6 +1918,7 @@ rec { edition = "2018"; sha256 = "1kby2jz173ggg7wk41vjsskmkdyx7749ll8lhqhv6mb5qqmww65a"; procMacro = true; + license = "MIT OR Apache-2.0"; authors = [ "Anton Lazarev " ]; @@ -1767,6 +1948,7 @@ rec { version = "1.0.2"; edition = "2015"; sha256 = "03swzqznragy8n0x31lqc78g2af054jwivp7lkrbrc0khz74lyl7"; + license = "Apache-2.0 OR MIT"; }; "errno" = rec { @@ -1774,6 +1956,7 @@ rec { version = "0.3.14"; edition = "2018"; sha256 = "1szgccmh8vgryqyadg8xd58mnwwicf39zmin3bsn63df2wbbgjir"; + license = "MIT OR Apache-2.0"; authors = [ "Chris Wong " "Dan Gohman " @@ -1815,6 +1998,7 @@ rec { version = "0.22.14"; edition = "2021"; sha256 = "01ksjl4vb8ms89laswnjpld3z4n6c1s7qlqq0djx3imiwdjm787i"; + license = "MIT OR Apache-2.0"; authors = [ "The Servo Project Developers" ]; @@ -1843,6 +2027,7 @@ rec { edition = "2018"; sha256 = "18j0mmzfycibhxhhhfja00dxd1vf8x5c28lbry224574h037qpxr"; libName = "fancy_regex"; + license = "MIT"; authors = [ "Raph Levien " "Robin Stocker " @@ -1875,6 +2060,7 @@ rec { version = "2.5.0"; edition = "2018"; sha256 = "08q2r30y62winysimnlpbvw9kiwn0rmdlidqlmzd6z90mv764z6s"; + license = "Apache-2.0 OR MIT"; authors = [ "Stjepan Glavina " ]; @@ -1891,6 +2077,7 @@ rec { version = "0.8.3"; edition = "2018"; sha256 = "0bb8qqa9h9sj2mzf09yqxn260qkcqvmhmyrmdjvyxcn94knmh1z4"; + license = "MIT"; authors = [ "Wez Furlong" ]; @@ -1914,10 +2101,11 @@ rec { }; "find-msvc-tools" = rec { crateName = "find-msvc-tools"; - version = "0.1.13"; + version = "0.1.14"; edition = "2021"; - sha256 = "16ykhz2icc0xx8i3vr8fpp6h3djpik2zw5bcxbff9bxba5g909gg"; + sha256 = "112ljldlv150fpl8xr2jl5czg51k3kdfn6cy5fqdsvkl14sgpp5f"; libName = "find_msvc_tools"; + license = "MIT OR Apache-2.0"; }; "finl_unicode" = rec { @@ -1925,6 +2113,7 @@ rec { version = "1.5.0"; edition = "2021"; sha256 = "18j7s1is44yzgmbli7v1sf0lw16nmpczqs6a1kpcjj21if605fw0"; + license = "(MIT OR Apache-2.0) AND Unicode-DFS-2016"; features = { "default" = [ "categories" "grapheme_clusters" ]; }; @@ -1935,6 +2124,7 @@ rec { version = "0.4.2"; edition = "2015"; sha256 = "101v41amgv5n9h4hcghvrbfk5vrncx1jwm35rn5szv4rk55i7rqc"; + license = "MIT/Apache-2.0"; authors = [ "bluss" ]; @@ -1949,6 +2139,7 @@ rec { version = "1.1.10"; edition = "2018"; sha256 = "1jvd2cl8j5hyf8imi62y1x7gwzz1hajirni0801yxhds1qp4wqvf"; + license = "MIT OR Apache-2.0"; authors = [ "Alex Crichton " "Josh Triplett " @@ -2000,6 +2191,7 @@ rec { edition = "2015"; sha256 = "1hc2mcqha06aibcaza94vbi81j6pr9a1bbxrxjfhc91zin8yr7iz"; libPath = "lib.rs"; + license = "Apache-2.0 / MIT"; authors = [ "Alex Crichton " ]; @@ -2013,6 +2205,7 @@ rec { version = "0.2.0"; edition = "2021"; sha256 = "1nvgylb099s11xpfm1kn2wcsql080nqmnhj1l25bp3r2b35j9kkp"; + license = "Zlib"; authors = [ "Orson Peters " ]; @@ -2026,6 +2219,7 @@ rec { edition = "2018"; sha256 = "0pjgv4fx0np6hrs5sz5a2phabwv0z70yr51v03injbi44bjrkmlj"; libName = "futures_core"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; "portable-atomic" = [ "dep:portable-atomic" ]; @@ -2039,6 +2233,7 @@ rec { edition = "2018"; sha256 = "07cfvrgc3vxk6sw5g8a8dnrm1mzg6d5mwy08ywa1sgyhyxml4i0r"; libName = "futures_sink"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -2050,6 +2245,7 @@ rec { edition = "2018"; sha256 = "1zfilqs8nwlfqz4prk7ihvpp5avvzins87ibzlxzq5fhs7ipshfd"; libName = "futures_task"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -2062,6 +2258,7 @@ rec { edition = "2018"; sha256 = "1g3r9ghzq7c2fh34lis43i72xavk9p84npgfwgb5vfpqcwjajl0d"; libName = "futures_util"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "futures-core"; @@ -2125,6 +2322,7 @@ rec { edition = "2015"; sha256 = "16lyyrzrljfq424c3n8kfwkqihlimmsg5nhshbbp48np3yjrqr45"; libName = "generic_array"; + license = "MIT"; authors = [ "Bartłomiej Kamiński " "Aaron Trent " @@ -2147,11 +2345,49 @@ rec { }; resolvedDefaultFeatures = [ "more_lengths" ]; }; + "getrandom 0.2.17" = rec { + crateName = "getrandom"; + version = "0.2.17"; + edition = "2018"; + sha256 = "1l2ac6jfj9xhpjjgmcx6s1x89bbnw9x6j9258yy6xjkzpq0bqapz"; + license = "MIT OR Apache-2.0"; + authors = [ + "The Rand Project Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "libc"; + packageId = "libc"; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + } + { + name = "wasi"; + packageId = "wasi"; + usesDefaultFeatures = false; + target = { target, features }: ("wasi" == target."os" or null); + } + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "js" = [ "wasm-bindgen" "js-sys" ]; + "js-sys" = [ "dep:js-sys" ]; + "rustc-dep-of-std" = [ "compiler_builtins" "core" "libc/rustc-dep-of-std" "wasi/rustc-dep-of-std" ]; + "wasm-bindgen" = [ "dep:wasm-bindgen" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "getrandom 0.3.4" = rec { crateName = "getrandom"; version = "0.3.4"; edition = "2021"; sha256 = "1zbpvpicry9lrbjmkd4msgj3ihff1q92i334chk7pzf46xffz7c9"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" ]; @@ -2231,6 +2467,7 @@ rec { version = "0.4.3"; edition = "2024"; sha256 = "16b0202fkdwz3p2cyll82dv24ljbn0wiyy829v4lwbkbflyqh3ih"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" ]; @@ -2311,6 +2548,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/gp-tree; }; libName = "gp_tree"; + license = "Apache-2.0"; dependencies = [ { name = "serde"; @@ -2331,6 +2569,7 @@ rec { version = "0.16.1"; edition = "2021"; sha256 = "004i3njw38ji3bzdp9z178ba9x3k0c1pgy8x69pj7yfppv4iq7c4"; + license = "MIT OR Apache-2.0"; authors = [ "Amanieu d'Antras " ]; @@ -2374,6 +2613,7 @@ rec { version = "0.17.1"; edition = "2024"; sha256 = "0jmqz7i4yl6cm7rbn0i2ffkfrmwi6xkmzkaldr2v8bcsx2v0jngd"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "allocator-api2"; @@ -2414,6 +2654,7 @@ rec { version = "0.5.0"; edition = "2021"; sha256 = "1sjmpsdl8czyh9ywl3qcsfsq9a307dg4ni2vnlwgnzzqhc4y0113"; + license = "MIT OR Apache-2.0"; }; "hex" = rec { @@ -2421,6 +2662,7 @@ rec { version = "0.4.3"; edition = "2018"; sha256 = "0w1a4davm1lgzpamwnba907aysmlrnygbqmfis2mqjx5m552a93z"; + license = "MIT OR Apache-2.0"; authors = [ "KokaKiwi " ]; @@ -2436,6 +2678,7 @@ rec { version = "1.5.0"; edition = "2021"; sha256 = "1q4wpz5hb4cf37g3jrdyffrpa6ngidmd9wrfph92fddzprl3b3ci"; + license = "MIT OR Apache-2.0"; authors = [ "Alex Crichton " "Carl Lerche " @@ -2461,6 +2704,7 @@ rec { version = "1.10.1"; edition = "2018"; sha256 = "11ycd554bw2dkgw0q61xsa7a4jn1wb1xbfacmf3dbwsikvkkvgvd"; + license = "MIT OR Apache-2.0"; authors = [ "Sean McArthur " ]; @@ -2475,6 +2719,7 @@ rec { edition = "2024"; sha256 = "05wsyp2n5gyf49qk51mblj9qyb15aay74m6fwmf74mpv1pqn9y17"; libName = "hybrid_array"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -2501,6 +2746,7 @@ rec { edition = "2021"; sha256 = "0w64khw5p8s4nzwcf36bwnsmqzf61vpwk9ca1920x82bk6nwj6z3"; libName = "iana_time_zone"; + license = "MIT OR Apache-2.0"; authors = [ "Andrew Straw " "René Kijewski " @@ -2553,6 +2799,7 @@ rec { edition = "2018"; sha256 = "17r6jmj31chn7xs9698r122mapq85mfnv98bb4pg6spm0si2f67k"; libName = "iana_time_zone_haiku"; + license = "MIT OR Apache-2.0"; authors = [ "René Kijewski " ]; @@ -2569,6 +2816,7 @@ rec { version = "1.0.1"; edition = "2015"; sha256 = "0fac21q6pwns8gh1hz3nbq15j8fi441ncl6w4vlnd1cmc55kiq5r"; + license = "MIT/Apache-2.0"; authors = [ "Ted Driggs " ]; @@ -2586,6 +2834,7 @@ rec { } ]; src = lib.cleanSourceWith { filter = sourceFilter; src = ./.; }; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2707,6 +2956,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-command; }; libName = "improvise_command"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2775,6 +3025,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-core; }; libName = "improvise_core"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2822,6 +3073,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-formula; }; libName = "improvise_formula"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2859,6 +3111,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-gp; }; libName = "improvise_gp"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2885,6 +3138,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-io; }; libName = "improvise_io"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -2977,6 +3231,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-protocol; }; libName = "improvise_protocol"; + license = "Apache-2.0"; dependencies = [ { name = "improvise-core"; @@ -3015,6 +3270,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-wasm-client; }; libName = "improvise_wasm_client";type = [ "cdylib" "rlib" ]; + license = "Apache-2.0"; dependencies = [ { name = "improvise-protocol"; @@ -3062,6 +3318,7 @@ rec { edition = "2024"; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-worker-server; }; libName = "improvise_worker_server";type = [ "cdylib" "rlib" ]; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -3119,6 +3376,7 @@ rec { ]; src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/improvise-ws-server; }; libName = "improvise_ws_server"; + license = "Apache-2.0"; dependencies = [ { name = "anyhow"; @@ -3185,6 +3443,7 @@ rec { version = "2.14.2"; edition = "2024"; sha256 = "0mf86hbjkkcd82cpq683bblbs0zwa8ndla96ci8p1ji6bl7ijknc"; + license = "Apache-2.0 OR MIT"; dependencies = [ { name = "equivalent"; @@ -3210,10 +3469,11 @@ rec { }; "indoc" = rec { crateName = "indoc"; - version = "2.0.7"; + version = "2.0.8"; edition = "2021"; - sha256 = "01np60qdq6lvgh8ww2caajn9j4dibx9n58rvzf7cya1jz69mrkvr"; + sha256 = "1lc4agds9bqf3lin6kkz2jgmahaqwrkaq1fkij5fpzvcg68jcyx3"; procMacro = true; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -3237,6 +3497,7 @@ rec { edition = "2021"; sha256 = "085yvxd818iy7rad63ccg9gyv2pbs4rxm2538583gn9g3v65lfsc"; procMacro = true; + license = "MIT"; authors = [ "Stephen M. Coakley " "The Ratatui Developers" @@ -3260,7 +3521,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; features = [ "derive" "full" ]; } ]; @@ -3271,6 +3532,7 @@ rec { version = "1.70.2"; edition = "2021"; sha256 = "15anlc47sbz0jfs9q8fhwf0h3vs2w4imc030shdnq54sny5i7jx6"; + license = "MIT OR Apache-2.0"; features = { }; resolvedDefaultFeatures = [ "default" ]; @@ -3280,6 +3542,7 @@ rec { version = "0.14.0"; edition = "2018"; sha256 = "118j6l1vs2mx65dqhwyssbrxpawa90886m3mzafdvyip41w2q69b"; + license = "MIT OR Apache-2.0"; authors = [ "bluss" ]; @@ -3301,6 +3564,7 @@ rec { version = "1.0.18"; edition = "2021"; sha256 = "10jnd1vpfkb8kj38rlkn2a6k02afvj3qmw054dfpzagrpl6achlg"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -3314,6 +3578,7 @@ rec { edition = "2021"; sha256 = "1icwmpjw54lb7vg5926k5y4y5jbiih0zxhwgjwnzn475v90xk0vq"; libName = "js_sys"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -3346,6 +3611,7 @@ rec { version = "0.4.12"; edition = "2021"; sha256 = "1688q59qh1mxa28k00lnddn73mh3jcdmj3yrc7l99k23c5yhbrdx"; + license = "MIT OR Apache-2.0"; authors = [ "Dylan Ede " "The Ratatui Developers" @@ -3381,6 +3647,7 @@ rec { version = "0.11.0"; edition = "2015"; sha256 = "13ymsn5cwl5i9pmp5mfmbap7q688dcp9a17q82crkvb784yifdmz"; + license = "MIT"; authors = [ "Jesse Bees " ]; @@ -3388,9 +3655,10 @@ rec { }; "lazy_static" = rec { crateName = "lazy_static"; - version = "1.5.0"; + version = "1.5.1"; edition = "2015"; - sha256 = "1zk6dqqni0193xg6iijh7i3i44sryglwgvx20spdvwk3r6sbrlmv"; + sha256 = "1yqaqmp510xw2ldpw88mx9b5s5qj8flb4rw0wd9ks1zpk9j0z1r0"; + license = "MIT OR Apache-2.0"; authors = [ "Marvin Löbel " ]; @@ -3401,9 +3669,10 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.189"; + version = "0.2.190"; edition = "2021"; - sha256 = "1whjfs375vlng2q6yrbzs73cvp5lm3w1n2gfqajb2vgf7zg3xbry"; + sha256 = "0y5yap4bfp7rfsldcbk9pb5alcgygca5xn1n2pmh181zdpf3spff"; + license = "MIT OR Apache-2.0"; features = { "default" = [ "std" ]; "rustc-dep-of-std" = [ "align" "rustc-std-workspace-core" ]; @@ -3417,6 +3686,7 @@ rec { version = "0.2.16"; edition = "2021"; sha256 = "10brh0a3qjmbzkr5mf5xqi887nhs5y9layvnki89ykz9xb1wxlmn"; + license = "MIT"; authors = [ "Alex Crichton " "Amanieu d'Antras " @@ -3434,6 +3704,7 @@ rec { edition = "2024"; sha256 = "0pjgrq705wmyyx9i5k015x05hrlj44lpdalc388ssi3w0cfijlp7"; libName = "line_clipping"; + license = "MIT OR Apache-2.0"; authors = [ "Josh McKinney" ]; @@ -3451,6 +3722,7 @@ rec { edition = "2021"; sha256 = "0lwasljrqxjjfk9l2j8lyib1babh2qjlnhylqzl01nihw14nk9ij"; libName = "linux_raw_sys"; + license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT"; authors = [ "Dan Gohman " ]; @@ -3466,6 +3738,7 @@ rec { version = "1.0.0"; edition = "2021"; sha256 = "14p0kzzkavnngvybl88nvfwv031cc2qx4vaxpfwsiifm8grdglqi"; + license = "MIT OR Apache-2.0"; authors = [ "Lukas Kalbertodt " ]; @@ -3480,6 +3753,7 @@ rec { version = "0.4.14"; edition = "2021"; sha256 = "0rg9mhx7vdpajfxvdjmgmlyrn20ligzqvn8ifmaz7dc79gkrjhr2"; + license = "MIT OR Apache-2.0"; authors = [ "Amanieu d'Antras " ]; @@ -3502,6 +3776,7 @@ rec { version = "0.4.34"; edition = "2021"; sha256 = "1ihkzn0m33ab79fcl4mkb04n5iwqzbxzyw7l7hazqkffaqzbvy7r"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" ]; @@ -3526,6 +3801,7 @@ rec { version = "0.18.5"; edition = "2015"; sha256 = "1dc9gxqi3rqv1zpphix7f62454zbsijnrdq26y766kj78y4c36pg"; + license = "MIT"; authors = [ "Jerome Froelich " ]; @@ -3547,24 +3823,25 @@ rec { }; "mac_address" = rec { crateName = "mac_address"; - version = "1.1.8"; + version = "1.2.0"; edition = "2018"; - sha256 = "00r3n18mxglq1dzshnm0vxk1fgsp3c2hd08w6hfcqdp8ymmv5bn0"; + sha256 = "06pbqk1hqiraavi2wxc9gxj1g73bbm7af7ccf6sx79g9kc5barxk"; + license = "MIT OR Apache-2.0"; authors = [ "rep-nop " ]; dependencies = [ { name = "nix"; - packageId = "nix"; + packageId = "nix 0.30.1"; target = { target, features }: (("linux" == target."os" or null) || ("macos" == target."os" or null) || ("freebsd" == target."os" or null) || ("netbsd" == target."os" or null) || ("openbsd" == target."os" or null) || ("android" == target."os" or null) || ("illumos" == target."os" or null)); features = [ "net" ]; } { - name = "winapi"; - packageId = "winapi"; + name = "windows-sys"; + packageId = "windows-sys"; target = { target, features }: (target."windows" or false); - features = [ "winerror" "ws2def" "iphlpapi" ]; + features = [ "Win32_Networking_WinSock" "Win32_NetworkManagement_IpHelper" "Win32_NetworkManagement_Ndis" ]; } ]; features = { @@ -3576,6 +3853,7 @@ rec { version = "2.8.3"; edition = "2021"; sha256 = "161xa63ipfanf8v3nb82xd5hqgydv55nzw59wyngqbz6alfaz2yg"; + license = "Unlicense OR MIT"; authors = [ "Andrew Gallant " "bluss" @@ -3595,6 +3873,7 @@ rec { version = "0.1.1"; edition = "2015"; sha256 = "05ccifqgxdfxk6yls41ljabcccsz3jz6549l1h3cwi17kr494jm6"; + license = "MIT/Apache-2.0"; authors = [ "Joe Neeman " ]; @@ -3605,6 +3884,7 @@ rec { version = "0.9.1"; edition = "2015"; sha256 = "12i17wh9a9plx869g7j4whf62xw68k5zd4k0k5nh6ys5mszid028"; + license = "MIT"; authors = [ "Gilad Naaman " ]; @@ -3624,6 +3904,7 @@ rec { edition = "2018"; sha256 = "16ppc5g84aijpri4jzv14rvcnslvlpphbszc7zzp6vfkddf4qdb8"; libName = "minimal_lexical"; + license = "MIT/Apache-2.0"; authors = [ "Alex Huszagh " ]; @@ -3637,6 +3918,7 @@ rec { version = "0.9.1"; edition = "2021"; sha256 = "0k2bgjzk2sbsynpsv4wizwxbqp6vs7g08y5anbkrh3l6a15bqgxn"; + license = "MIT OR Zlib OR Apache-2.0"; authors = [ "Frommi " "oyvindln " @@ -3669,9 +3951,10 @@ rec { }; "mio" = rec { crateName = "mio"; - version = "1.2.3"; + version = "1.2.4"; edition = "2021"; - sha256 = "1n5ryp7j5fga38z7php5yy9k7ia24rp6cl9gm27zwar6khz4862b"; + sha256 = "1vl6px9zy0pwhlwnw3cknsqyzkg8bcpiwiq4cgicf2fwgywfv20p"; + license = "MIT"; authors = [ "Carl Lerche " "Thomas de Zeeuw " @@ -3707,11 +3990,60 @@ rec { }; resolvedDefaultFeatures = [ "default" "log" "net" "os-ext" "os-poll" ]; }; - "nix" = rec { + "nix 0.29.0" = rec { crateName = "nix"; version = "0.29.0"; edition = "2021"; sha256 = "0ikvn7s9r2lrfdm3mx1h7nbfjvcc6s9vxdzw7j5xfkd2qdnp9qki"; + license = "MIT"; + authors = [ + "The nix-rust Project Developers" + ]; + dependencies = [ + { + name = "bitflags"; + packageId = "bitflags 2.13.2"; + } + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "libc"; + packageId = "libc"; + features = [ "extra_traits" ]; + } + ]; + buildDependencies = [ + { + name = "cfg_aliases"; + packageId = "cfg_aliases"; + } + ]; + features = { + "aio" = [ "pin-utils" ]; + "dir" = [ "fs" ]; + "memoffset" = [ "dep:memoffset" ]; + "mount" = [ "uio" ]; + "mqueue" = [ "fs" ]; + "net" = [ "socket" ]; + "pin-utils" = [ "dep:pin-utils" ]; + "ptrace" = [ "process" ]; + "sched" = [ "process" ]; + "signal" = [ "process" ]; + "socket" = [ "memoffset" ]; + "ucontext" = [ "signal" ]; + "user" = [ "feature" ]; + "zerocopy" = [ "fs" "uio" ]; + }; + resolvedDefaultFeatures = [ "default" "fs" "mman" ]; + }; + "nix 0.30.1" = rec { + crateName = "nix"; + version = "0.30.1"; + edition = "2021"; + sha256 = "1dixahq9hk191g0c2ydc0h1ppxj0xw536y6rl63vlnp06lx3ylkl"; + license = "MIT"; authors = [ "The nix-rust Project Developers" ]; @@ -3744,6 +4076,7 @@ rec { features = { "aio" = [ "pin-utils" ]; "dir" = [ "fs" ]; + "event" = [ "poll" ]; "memoffset" = [ "dep:memoffset" ]; "mount" = [ "uio" ]; "mqueue" = [ "fs" ]; @@ -3757,13 +4090,14 @@ rec { "user" = [ "feature" ]; "zerocopy" = [ "fs" "uio" ]; }; - resolvedDefaultFeatures = [ "default" "fs" "memoffset" "mman" "net" "socket" ]; + resolvedDefaultFeatures = [ "default" "memoffset" "net" "socket" ]; }; "nom" = rec { crateName = "nom"; version = "7.1.3"; edition = "2018"; sha256 = "0jha9901wxam390jcf5pfa0qqfrgh8li787jx2ip0yk5b8y9hwyj"; + license = "MIT"; authors = [ "contact@geoffroycouprie.com" ]; @@ -3785,12 +4119,47 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "std" ]; }; + "num-bigint" = rec { + crateName = "num-bigint"; + version = "0.4.8"; + edition = "2021"; + sha256 = "0ry3xjal8f5xhdinani268ci13h14mf7j4w0y1gflfzhw3knk7n8"; + libName = "num_bigint"; + license = "MIT OR Apache-2.0"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "default" = [ "std" ]; + "quickcheck" = [ "dep:quickcheck" ]; + "rand" = [ "dep:rand" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "num-integer/std" "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "num-conv" = rec { crateName = "num-conv"; version = "0.2.2"; edition = "2021"; sha256 = "0hg4f9bwmy7cwpxdkm165dmkfc8jhkkayci234jsmi5ssb33j5sj"; libName = "num_conv"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " ]; @@ -3803,6 +4172,7 @@ rec { sha256 = "00p2am9ma8jgd2v6xpsz621wc7wbn1yqi71g15gc3h67m7qmafgd"; procMacro = true; libName = "num_derive"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" ]; @@ -3822,12 +4192,76 @@ rec { ]; }; + "num-integer" = rec { + crateName = "num-integer"; + version = "0.1.47"; + edition = "2018"; + sha256 = "02z1p3azy6p10n99skrab4a6hhfd4amf2i9gm8sxqd1p9dfxkqkw"; + libName = "num_integer"; + license = "MIT OR Apache-2.0"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "i128" "std" ]; + }; + "num-rational" = rec { + crateName = "num-rational"; + version = "0.4.2"; + edition = "2021"; + sha256 = "093qndy02817vpgcqjnj139im3jl7vkq4h68kykdqqh577d18ggq"; + libName = "num_rational"; + license = "MIT OR Apache-2.0"; + authors = [ + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "num-bigint"; + packageId = "num-bigint"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + ]; + features = { + "default" = [ "num-bigint" "std" ]; + "num-bigint" = [ "dep:num-bigint" ]; + "num-bigint-std" = [ "num-bigint/std" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "num-bigint?/std" "num-integer/std" "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "default" "num-bigint" "num-bigint-std" "std" ]; + }; "num-traits" = rec { crateName = "num-traits"; version = "0.2.19"; edition = "2021"; sha256 = "0h984rhdkkqd4ny9cif7y2azl3xdfb7768hb9irhpsch4q3gq787"; libName = "num_traits"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" ]; @@ -3841,13 +4275,14 @@ rec { "default" = [ "std" ]; "libm" = [ "dep:libm" ]; }; - resolvedDefaultFeatures = [ "default" "std" ]; + resolvedDefaultFeatures = [ "default" "i128" "std" ]; }; "num_threads" = rec { crateName = "num_threads"; version = "0.1.7"; edition = "2015"; sha256 = "1ngajbmhrgyhzrlc4d5ga9ych1vrfcvfsiqz6zv0h2dpr2wrhwsw"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " ]; @@ -3859,12 +4294,62 @@ rec { } ]; + }; + "numtower" = rec { + crateName = "numtower"; + version = "0.1.0"; + edition = "2024"; + src = lib.cleanSourceWith { filter = sourceFilter; src = ./crates/numtower; }; + license = "Apache-2.0"; + dependencies = [ + { + name = "num-bigint"; + packageId = "num-bigint"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + } + { + name = "num-rational"; + packageId = "num-rational"; + usesDefaultFeatures = false; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "rust_decimal"; + packageId = "rust_decimal"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + ]; + devDependencies = [ + { + name = "num-rational"; + packageId = "num-rational"; + features = [ "num-bigint-std" ]; + } + { + name = "proptest"; + packageId = "proptest"; + } + ]; + }; "once_cell" = rec { crateName = "once_cell"; version = "1.21.4"; edition = "2021"; sha256 = "0l1v676wf71kjg2khch4dphwh1jp3291ffiymr2mvy1kxd5kwz4z"; + license = "MIT OR Apache-2.0"; authors = [ "Aleksey Kladov " ]; @@ -3884,6 +4369,7 @@ rec { version = "1.70.2"; edition = "2021"; sha256 = "1zmla628f0sk3fhjdjqzgxhalr2xrfna958s632z65bjsfv8ljrq"; + license = "MIT OR Apache-2.0"; features = { }; resolvedDefaultFeatures = [ "default" ]; @@ -3894,6 +4380,7 @@ rec { edition = "2021"; sha256 = "0ldrcgilsiijd141vw51fbkziqmh5fpllil3ydhirjm67wdixdvv"; libName = "ordered_float"; + license = "MIT"; authors = [ "Jonathan Reem " "Matt Brubeck " @@ -3933,6 +4420,7 @@ rec { version = "0.7.7"; edition = "2021"; sha256 = "0r7wf2529m3whivv49l56dc040nwngqaa1ng7nzjlz9l1mcdivnx"; + license = "MIT OR Apache-2.0"; authors = [ "Erik Hedvall " ]; @@ -3984,6 +4472,7 @@ rec { edition = "2021"; sha256 = "1gjn5sh46pz4wcpyb7pnw9vz9429pwdwyk4rps0rswcv50h70lw8"; procMacro = true; + license = "MIT OR Apache-2.0"; authors = [ "Erik Hedvall " ]; @@ -4016,6 +4505,7 @@ rec { version = "0.7.7"; edition = "2021"; sha256 = "04mgvcld8krwgnfpwc4c8gyddv6jxawwaig3n1gk6r4djm1b2vkf"; + license = "MIT OR Apache-2.0"; authors = [ "Erik Hedvall " ]; @@ -4040,6 +4530,7 @@ rec { version = "0.12.5"; edition = "2021"; sha256 = "06jsqh9aqmc94j2rlm8gpccilqm6bskbd67zf6ypfc0f4m9p91ck"; + license = "MIT OR Apache-2.0"; authors = [ "Amanieu d'Antras " ]; @@ -4067,6 +4558,7 @@ rec { version = "0.9.12"; edition = "2021"; sha256 = "1hb4rggy70fwa1w9nb0svbyflzdc69h047482v2z3sx2hmcnh896"; + license = "MIT OR Apache-2.0"; authors = [ "Amanieu d'Antras " ]; @@ -4103,9 +4595,10 @@ rec { }; "pest" = rec { crateName = "pest"; - version = "2.9.2"; + version = "2.9.3"; edition = "2021"; - sha256 = "1a11k95dyrpfrn2ql5lprdh4k31k4hksg83w67vfdlps62iarls5"; + sha256 = "1yhr35ds3c5ww7nvh9nvs842p40nmwgqj7ql4z3accwbld5kfs5m"; + license = "MIT OR Apache-2.0"; authors = [ "Dragoș Tiselice " ]; @@ -4115,6 +4608,16 @@ rec { packageId = "memchr"; optional = true; } + { + name = "psm"; + packageId = "psm"; + optional = true; + } + { + name = "stacker"; + packageId = "stacker"; + optional = true; + } { name = "ucd-trie"; packageId = "ucd-trie"; @@ -4126,16 +4629,17 @@ rec { "memchr" = [ "dep:memchr" ]; "miette-error" = [ "std" "pretty-print" "dep:miette" ]; "pretty-print" = [ "dep:serde" "dep:serde_json" ]; - "std" = [ "ucd-trie/std" ]; + "std" = [ "ucd-trie/std" "dep:stacker" "dep:psm" ]; }; resolvedDefaultFeatures = [ "default" "memchr" "std" ]; }; "pest_derive" = rec { crateName = "pest_derive"; - version = "2.9.2"; + version = "2.9.3"; edition = "2021"; - sha256 = "1ky22vlsbqha1jhx5l31d95gm8l54va38b9zmmr2wjicgxan0jr8"; + sha256 = "0zygma96zndmadjsg6m353ak48ziab55c8mb43zsmsscj95ihvmn"; procMacro = true; + license = "MIT OR Apache-2.0"; authors = [ "Dragoș Tiselice " ]; @@ -4160,9 +4664,10 @@ rec { }; "pest_generator" = rec { crateName = "pest_generator"; - version = "2.9.2"; + version = "2.9.3"; edition = "2021"; - sha256 = "029igkh6nsw62bn4325gkjm5c3lf4bjqbkv8jblrwc0ml441z78x"; + sha256 = "150nhpb5mh4vx1gmgl3fmix953pmy3r595xg4sk59pp4cz97hx58"; + license = "MIT OR Apache-2.0"; authors = [ "Dragoș Tiselice " ]; @@ -4186,7 +4691,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.119"; + packageId = "syn 3.0.7"; } ]; features = { @@ -4198,9 +4703,10 @@ rec { }; "pest_meta" = rec { crateName = "pest_meta"; - version = "2.9.2"; + version = "2.9.3"; edition = "2021"; - sha256 = "1jxd8gbm328lsl3m0z2b1pq9ri60h4f7122i189k5jpwkwdbm4zd"; + sha256 = "1qb9r2akz8q1wbvwmdipiaq06km3m8wn27w3kcssqha2icj6z62g"; + license = "MIT OR Apache-2.0"; authors = [ "Dragoș Tiselice " ]; @@ -4219,6 +4725,7 @@ rec { version = "0.11.3"; edition = "2021"; sha256 = "0y6hxp1d48rx2434wgi5g8j1pr8s5jja29ha2b65435fh057imhz"; + license = "MIT"; authors = [ "Steven Fackler " ]; @@ -4250,6 +4757,7 @@ rec { version = "0.11.3"; edition = "2021"; sha256 = "0si1n6zr93kzjs3wah04ikw8z6npsr39jw4dam8yi9czg2609y5f"; + license = "MIT"; authors = [ "Steven Fackler " ]; @@ -4271,6 +4779,7 @@ rec { edition = "2021"; crateBin = []; sha256 = "0gc4np7s91ynrgw73s2i7iakhb4lzdv1gcyx7yhlc0n214a2701w"; + license = "MIT"; authors = [ "Steven Fackler " ]; @@ -4297,6 +4806,7 @@ rec { edition = "2021"; sha256 = "05kjfbyb439344rhmlzzw0f9bwk9fp95mmw56zs7yfn1552c0jpq"; procMacro = true; + license = "MIT"; authors = [ "Steven Fackler " ]; @@ -4334,6 +4844,7 @@ rec { version = "0.11.3"; edition = "2021"; sha256 = "1rallyvh28jqd9i916gk5gk2igdmzlgvv5q0l3xbf3m6y8pbrsk7"; + license = "MIT"; authors = [ "Steven Fackler " ]; @@ -4356,6 +4867,7 @@ rec { edition = "2018"; sha256 = "1kfmwvs271si96zay4mm8887v5khw0c27jc9srw1a75ykvgj54x8"; libName = "pin_project_lite"; + license = "Apache-2.0 OR MIT"; }; "portable-atomic" = rec { @@ -4364,6 +4876,7 @@ rec { edition = "2018"; sha256 = "11csag858ndk5w4yz17h91vy53ynh67r2903gwwdn2cnilzbdj05"; libName = "portable_atomic"; + license = "Apache-2.0 OR MIT"; features = { "critical-section" = [ "dep:critical-section" ]; "default" = [ "fallback" ]; @@ -4373,9 +4886,10 @@ rec { }; "powerfmt" = rec { crateName = "powerfmt"; - version = "0.2.0"; + version = "0.2.1"; edition = "2021"; - sha256 = "14ckj2xdpkhv3h6l5sdmb9f1d57z8hbfpdldjc2vl5givq2y77j3"; + sha256 = "0n293rvnpisjmxdqhq6zmrvcdql7j1c4zrcy5053vrv5x6wr8qsa"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " ]; @@ -4391,6 +4905,7 @@ rec { edition = "2021"; sha256 = "1abxx6qz5qnd43br1dd9b2savpihzjza8gb4fbzdql1gxp2f7sl5"; libName = "ppv_lite86"; + license = "MIT OR Apache-2.0"; authors = [ "The CryptoCorrosion Contributors" ]; @@ -4406,12 +4921,33 @@ rec { }; resolvedDefaultFeatures = [ "simd" "std" ]; }; + "proc-macro-crate" = rec { + crateName = "proc-macro-crate"; + version = "3.5.0"; + edition = "2021"; + sha256 = "0kv1g1d1zjwxlgcaba2qlshzyy32j03xic8rskqlcr5mnblsfyz6"; + libName = "proc_macro_crate"; + license = "MIT OR Apache-2.0"; + authors = [ + "Bastian Köcher " + ]; + dependencies = [ + { + name = "toml_edit"; + packageId = "toml_edit"; + usesDefaultFeatures = false; + features = [ "parse" ]; + } + ]; + + }; "proc-macro2" = rec { crateName = "proc-macro2"; version = "1.0.107"; edition = "2021"; sha256 = "1nb6ly8kp65f724kj73ippc7lvydss24sm2vagk6qpklpg4pwplq"; libName = "proc_macro2"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " "Alex Crichton " @@ -4432,6 +4968,7 @@ rec { version = "1.11.0"; edition = "2021"; sha256 = "0i27rr5drw4ic8hjzx6i1c6q8s7kmsgpfmzy4m80ys2c6k1gqiab"; + license = "MIT OR Apache-2.0"; authors = [ "Jason Lingle" ]; @@ -4463,7 +5000,7 @@ rec { } { name = "rand_chacha"; - packageId = "rand_chacha"; + packageId = "rand_chacha 0.9.0"; usesDefaultFeatures = false; } { @@ -4511,12 +5048,30 @@ rec { }; resolvedDefaultFeatures = [ "bit-set" "default" "fork" "regex-syntax" "rusty-fork" "std" "tempfile" "timeout" ]; }; + "psm" = rec { + crateName = "psm"; + version = "0.1.24"; + edition = "2015"; + sha256 = "0428cnwx8i9dhkcjwzap0amg9cjk8nhj0xr5hkhm6zl543r9y2r0"; + license = "MIT OR Apache-2.0"; + authors = [ + "Simonas Kazlauskas " + ]; + buildDependencies = [ + { + name = "cc"; + packageId = "cc"; + } + ]; + + }; "quick-error" = rec { crateName = "quick-error"; version = "1.2.3"; edition = "2015"; sha256 = "1q6za3v78hsspisc197bg3g7rpc989qycy8ypr8ap8igv10ikl51"; libName = "quick_error"; + license = "MIT/Apache-2.0"; authors = [ "Paul Colomiets " "Colin Kiegel " @@ -4528,6 +5083,7 @@ rec { version = "1.0.47"; edition = "2021"; sha256 = "00ch0yyzvv6s671ik0kcsbw8nigdaj2g3fr61kcahwx48aqlvgqz"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -4550,6 +5106,7 @@ rec { edition = "2018"; sha256 = "03sbfm3g7myvzyylff6qaxk4z6fy76yv860yy66jiswc2m6b7kb9"; libName = "r_efi"; + license = "MIT OR Apache-2.0 OR LGPL-2.1-or-later"; features = { "core" = [ "dep:core" ]; "examples" = [ "native" ]; @@ -4562,6 +5119,7 @@ rec { edition = "2018"; sha256 = "1gyrl2k5fyzj9k7kchg2n296z5881lg7070msabid09asp3wkp7q"; libName = "r_efi"; + license = "MIT OR Apache-2.0 OR LGPL-2.1-or-later"; features = { "core" = [ "dep:core" ]; "rustc-dep-of-std" = [ "core" ]; @@ -4572,6 +5130,7 @@ rec { version = "0.10.3"; edition = "2024"; sha256 = "1bxlhj4m9zrgfgk1yirf0nny86izrngscydfx9w387n9rfbgpjb5"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -4611,11 +5170,25 @@ rec { version = "0.8.8"; edition = "2018"; sha256 = "0k3d9psya5icpiylff1w1wjbnc3q4pb1953n1iw7gbr61ggcfn70"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" ]; dependencies = [ + { + name = "libc"; + packageId = "libc"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (target."unix" or false); + } + { + name = "rand_chacha"; + packageId = "rand_chacha 0.3.1"; + optional = true; + usesDefaultFeatures = false; + } { name = "rand_core"; packageId = "rand_core 0.6.4"; @@ -4632,13 +5205,14 @@ rec { "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; "std_rng" = [ "rand_chacha" ]; }; - resolvedDefaultFeatures = [ "small_rng" ]; + resolvedDefaultFeatures = [ "alloc" "getrandom" "libc" "rand_chacha" "small_rng" "std" ]; }; "rand 0.9.5" = rec { crateName = "rand"; version = "0.9.5"; edition = "2021"; sha256 = "0hbvllk8g28mqjld6hqmckk69w296qpzg95whm3didsyg46ivvxr"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -4646,7 +5220,7 @@ rec { dependencies = [ { name = "rand_chacha"; - packageId = "rand_chacha"; + packageId = "rand_chacha 0.9.0"; optional = true; usesDefaultFeatures = false; } @@ -4666,11 +5240,43 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "os_rng" "std" ]; }; - "rand_chacha" = rec { + "rand_chacha 0.3.1" = rec { + crateName = "rand_chacha"; + version = "0.3.1"; + edition = "2018"; + sha256 = "123x2adin558xbhvqb8w4f6syjsdkmqff8cxwhmjacpsl1ihmhg6"; + license = "MIT OR Apache-2.0"; + authors = [ + "The Rand Project Developers" + "The Rust Project Developers" + "The CryptoCorrosion Contributors" + ]; + dependencies = [ + { + name = "ppv-lite86"; + packageId = "ppv-lite86"; + usesDefaultFeatures = false; + features = [ "simd" ]; + } + { + name = "rand_core"; + packageId = "rand_core 0.6.4"; + } + ]; + features = { + "default" = [ "std" ]; + "serde" = [ "dep:serde" ]; + "serde1" = [ "serde" ]; + "std" = [ "ppv-lite86/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "rand_chacha 0.9.0" = rec { crateName = "rand_chacha"; version = "0.9.0"; edition = "2021"; sha256 = "1jr5ygix7r60pz0s1cv3ms1f6pd1i9pcdmnxzzhjc3zn3mgjn0nk"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -4708,6 +5314,7 @@ rec { version = "0.10.1"; edition = "2024"; sha256 = "0s9wiacxrr100icl7i41308gcj85nlcclrc5jx1jd6p10dhigf33"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" ]; @@ -4718,22 +5325,32 @@ rec { version = "0.6.4"; edition = "2018"; sha256 = "0b4j2v4cb5krak1pv6kakv4sz6xcwbrmy2zckc32hsigbrwy82zc"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" ]; + dependencies = [ + { + name = "getrandom"; + packageId = "getrandom 0.2.17"; + optional = true; + } + ]; features = { "getrandom" = [ "dep:getrandom" ]; "serde" = [ "dep:serde" ]; "serde1" = [ "serde" ]; "std" = [ "alloc" "getrandom" "getrandom/std" ]; }; + resolvedDefaultFeatures = [ "alloc" "getrandom" "std" ]; }; "rand_core 0.9.5" = rec { crateName = "rand_core"; version = "0.9.5"; edition = "2021"; sha256 = "0g6qc5r3f0hdmz9b11nripyp9qqrzb0xqk9piip8w8qlvqkcibvn"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -4757,6 +5374,7 @@ rec { version = "0.4.0"; edition = "2021"; sha256 = "0njsn25pis742gb6b89cpq7jp48v9n23a9fvks10yczwks8n4fai"; + license = "MIT OR Apache-2.0"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -4776,6 +5394,7 @@ rec { version = "0.30.2"; edition = "2024"; sha256 = "0zfmk50bl3ahjjq0z55h5rmx5njrvks20p80lb9cl6sy5h5blx1j"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -4853,6 +5472,7 @@ rec { edition = "2024"; sha256 = "1727mqrvy80hmg5nbf0dwh68rrlnmsi76mqzkn08mqn86g27bcfb"; libName = "ratatui_core"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -4954,6 +5574,7 @@ rec { edition = "2024"; sha256 = "1w59rh1xdvd133yxnqskxcjnf9lp2j3b8h6y4cy21a76n2iq8xan"; libName = "ratatui_crossterm"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -4996,6 +5617,7 @@ rec { edition = "2024"; sha256 = "056q80hzmwamv511xfygzcw0rq97hh3ypq389lza963lma6wczgd"; libName = "ratatui_macros"; + license = "MIT"; authors = [ "The Ratatui Developers" ]; @@ -5018,6 +5640,7 @@ rec { edition = "2024"; sha256 = "1hj35knwflynqim7sxdbaarqda0f51m3hbnrb6kmgw36kqnr3gy0"; libName = "ratatui_termina"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -5051,6 +5674,7 @@ rec { edition = "2024"; sha256 = "0xz95i63n7nafpsk6jbm56h65w5dwd7j4x6bsra40x5ph01kxw7s"; libName = "ratatui_termwiz"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -5079,6 +5703,7 @@ rec { edition = "2024"; sha256 = "1l87cjanipc1bzwza1mywfn23wbzfrh3pnbpc8vwlc4irjdx3qv6"; libName = "ratatui_widgets"; + license = "MIT"; authors = [ "Florian Dehau " "The Ratatui Developers" @@ -5159,6 +5784,7 @@ rec { edition = "2021"; sha256 = "0b9n38zsxylql36vybw18if68yc9jczxmbyzdwyhb9sifmag4azd"; libName = "syscall"; + license = "MIT"; authors = [ "Jeremy Soller " ]; @@ -5180,6 +5806,7 @@ rec { version = "1.13.1"; edition = "2021"; sha256 = "1391a0a4100ik8cp7l577p3ip3haqq03rd9c5vdr7vcfdixj687h"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" "Andrew Gallant " @@ -5239,6 +5866,7 @@ rec { edition = "2021"; sha256 = "1cml0rm0ssqfkibh9nh3gy4b6hbsbicj1rihpwf2a4v4nawm71dd"; libName = "regex_automata"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" "Andrew Gallant " @@ -5300,6 +5928,7 @@ rec { edition = "2021"; sha256 = "1m25h5q2wp976fb9gc3dsc9l99svcvd5cri8lncb51c46ydgzxnn"; libName = "regex_syntax"; + license = "MIT OR Apache-2.0"; authors = [ "The Rust Project Developers" "Andrew Gallant " @@ -5311,11 +5940,154 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" "unicode" "unicode-age" "unicode-bool" "unicode-case" "unicode-gencat" "unicode-perl" "unicode-script" "unicode-segment" ]; }; + "rust_decimal" = rec { + crateName = "rust_decimal"; + version = "1.43.0"; + edition = "2021"; + sha256 = "0fnd56zidby90qy98ffkmx7rjcvng7ssdglz37f43b6wflp2flvn"; + license = "MIT"; + authors = [ + "Paul Mason " + ]; + dependencies = [ + { + name = "arrayvec"; + packageId = "arrayvec"; + usesDefaultFeatures = false; + } + { + name = "borsh"; + packageId = "borsh"; + optional = true; + usesDefaultFeatures = false; + features = [ "derive" "unstable__schema" ]; + } + { + name = "bytes"; + packageId = "bytes"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + { + name = "rand"; + packageId = "rand 0.8.8"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "rand"; + packageId = "rand 0.9.5"; + rename = "rand-0_9"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "serde_json"; + packageId = "serde_json"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: ("wasm32" == target."arch" or null); + } + ]; + devDependencies = [ + { + name = "bytes"; + packageId = "bytes"; + usesDefaultFeatures = false; + target = { target, features }: (!("wasm32" == target."arch" or null)); + } + { + name = "rand"; + packageId = "rand 0.8.8"; + usesDefaultFeatures = false; + target = { target, features }: (!("wasm32" == target."arch" or null)); + features = [ "getrandom" ]; + } + { + name = "rand"; + packageId = "rand 0.9.5"; + rename = "rand-0_9"; + usesDefaultFeatures = false; + target = { target, features }: (!("wasm32" == target."arch" or null)); + features = [ "thread_rng" ]; + } + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + usesDefaultFeatures = false; + target = { target, features }: ("wasm32" == target."arch" or null); + } + ]; + features = { + "borsh" = [ "dep:borsh" "std" ]; + "bytemuck" = [ "c-repr" "dep:bytemuck" "dep:bytemuck_derive" ]; + "db-diesel-mysql" = [ "diesel/mysql_backend" "std" ]; + "db-diesel-postgres" = [ "diesel/postgres_backend" "std" ]; + "db-diesel2-mysql" = [ "db-diesel-mysql" ]; + "db-diesel2-postgres" = [ "db-diesel-postgres" ]; + "db-postgres" = [ "dep:bytes" "dep:postgres-types" "std" ]; + "db-tokio-postgres" = [ "dep:bytes" "dep:postgres-types" "std" ]; + "default" = [ "serde" "std" ]; + "diesel" = [ "dep:diesel" ]; + "macros" = [ "dep:rust_decimal_macros" ]; + "maths-nopanic" = [ "maths" ]; + "ndarray" = [ "dep:ndarray" ]; + "proptest" = [ "dep:proptest" ]; + "rand" = [ "dep:rand" ]; + "rand-0_9" = [ "dep:rand-0_9" ]; + "rocket-traits" = [ "dep:rocket" "std" ]; + "rust-fuzz" = [ "dep:arbitrary" ]; + "serde" = [ "dep:serde" "wasm-bindgen?/serde" ]; + "serde-arbitrary-precision" = [ "serde-with-arbitrary-precision" ]; + "serde-bincode" = [ "serde-str" ]; + "serde-float" = [ "serde-with-float" ]; + "serde-str" = [ "serde-with-str" ]; + "serde-with-arbitrary-precision" = [ "serde" "serde_json/arbitrary_precision" "serde_json/std" "zmij" ]; + "serde-with-float" = [ "serde" ]; + "serde-with-str" = [ "serde" ]; + "serde_json" = [ "dep:serde_json" ]; + "std" = [ "arrayvec/std" "wasm-bindgen?/std" "borsh?/std" "bytes?/std" "rand?/std" "rand-0_9?/std" "serde?/std" "serde_json?/std" ]; + "tokio-pg" = [ "db-tokio-postgres" ]; + "tokio-postgres" = [ "dep:tokio-postgres" ]; + "wasm" = [ "dep:wasm-bindgen" ]; + "zmij" = [ "dep:zmij" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "rustc_version" = rec { crateName = "rustc_version"; version = "0.4.1"; edition = "2018"; sha256 = "14lvdsmr5si5qbqzrajgb6vfn69k0sfygrvfvr2mps26xwi3mjyg"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "semver"; @@ -5329,6 +6101,7 @@ rec { version = "1.1.5"; edition = "2021"; sha256 = "17b2srw7rcqmrs1shj89g8i3r1447lihv7qrbxvp11j1psxgl7l9"; + license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT"; authors = [ "Dan Gohman " "Jakub Konka " @@ -5438,6 +6211,7 @@ rec { sha256 = "07z2a843fs80fawwflj9jwn49k9b0bd0dhhbvy0ar69vaxd72m6g"; procMacro = true; build = "build/build.rs"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -5449,6 +6223,7 @@ rec { edition = "2018"; sha256 = "1qkf9rvz2irb1wlbkrhrns8n9hnax48z1lgql5nqyr2fyagzfsyc"; libName = "rusty_fork"; + license = "MIT/Apache-2.0"; authors = [ "Jason Lingle" ]; @@ -5483,6 +6258,7 @@ rec { version = "1.0.23"; edition = "2021"; sha256 = "0zs70sg00l2fb9jwrf6cbkdyscjs53anrvai2hf7npyyfi5blx4p"; + license = "Apache-2.0 OR BSL-1.0"; authors = [ "David Tolnay " ]; @@ -5495,6 +6271,7 @@ rec { version = "1.2.0"; edition = "2015"; sha256 = "0jcz9sd47zlsgcnm1hdw0664krxwb5gczlif4qngj2aif8vky54l"; + license = "MIT OR Apache-2.0"; authors = [ "bluss" ]; @@ -5507,6 +6284,7 @@ rec { version = "1.0.28"; edition = "2021"; sha256 = "1kaimrpy876bcgi8bfj0qqfxk77zm9iz2zhn1hp9hj685z854y4a"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -5521,6 +6299,7 @@ rec { version = "1.0.229"; edition = "2021"; sha256 = "1fp04fq4a79bpm61xz1zy0pbz4kpc7d771zii1k3inmszq55jj21"; + license = "MIT OR Apache-2.0"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -5554,6 +6333,7 @@ rec { version = "1.0.229"; edition = "2021"; sha256 = "0j1ajiha76h3nmd976il9li6975k121xa7jb39ws8n0yqp4s5p37"; + license = "MIT OR Apache-2.0"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -5582,6 +6362,7 @@ rec { edition = "2021"; sha256 = "0j4k63i7h1bikxwz2c89ig0hrwbnl9mz1czn85xx99x5cc9dg9g7"; procMacro = true; + license = "MIT OR Apache-2.0"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -5601,7 +6382,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } @@ -5615,6 +6396,7 @@ rec { version = "1.0.151"; edition = "2021"; sha256 = "051zww7lvpw147vvwss1ng6w587qyrkzg75fvj08q2dfrmgbahf8"; + license = "MIT OR Apache-2.0"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -5666,6 +6448,7 @@ rec { version = "0.11.0"; edition = "2024"; sha256 = "05025pf8d8zr2qq5xyh5m3wqls1fn7813gz1mfs7551mk724rk5a"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -5704,6 +6487,7 @@ rec { version = "0.10.9"; edition = "2018"; sha256 = "10xjj843v31ghsksd9sl9y12qfc48157j1xpb8v1ml39jy0psl57"; + license = "MIT OR Apache-2.0"; authors = [ "RustCrypto Developers" ]; @@ -5744,6 +6528,7 @@ rec { version = "2.0.1"; edition = "2018"; sha256 = "1fjsll1cd7d2bcpdij9kd6w62rpbc7qqzvydvs021vsmr1cxvypq"; + license = "MIT OR Apache-2.0"; authors = [ "comex " "Fenhl " @@ -5763,6 +6548,7 @@ rec { edition = "2018"; sha256 = "1qnnbq4g2vixfmlv28i1whkr0hikrf1bsc4xjy2aasj2yina30fq"; libName = "signal_hook"; + license = "Apache-2.0/MIT"; authors = [ "Michal 'vorner' Vaner " "Thomas Himmelstoss " @@ -5792,6 +6578,7 @@ rec { edition = "2018"; sha256 = "1k20rr76ngvmzr6kskkl7dv8iyb84cbydpjbjk3mpcj0lykijnmp"; libName = "signal_hook_mio"; + license = "MIT OR Apache-2.0"; authors = [ "Michal 'vorner' Vaner " "Thomas Himmelstoss " @@ -5832,6 +6619,7 @@ rec { edition = "2015"; sha256 = "06vc7pmnki6lmxar3z31gkyg9cw7py5x9g7px70gy2hil75nkny4"; libName = "signal_hook_registry"; + license = "MIT OR Apache-2.0"; authors = [ "Michal 'vorner' Vaner " "Masaki Hara " @@ -5854,6 +6642,7 @@ rec { edition = "2018"; sha256 = "1sny4y2qa5mwyxx5x59ln2p02vsdh92004njlslnx98imjc9489s"; libName = "simd_adler32"; + license = "MIT"; authors = [ "Marvin Countryman " ]; @@ -5863,9 +6652,10 @@ rec { }; "siphasher" = rec { crateName = "siphasher"; - version = "1.0.3"; + version = "1.0.4"; edition = "2018"; - sha256 = "0jg6l9xyzca5vy4h6gf8r6p4kk84g98fk95pzig1kq6cr4z8grcf"; + sha256 = "0mn28y43123jdpskdn6r9wibmn066f7h30zkkqn88bd6hj8zxx1k"; + license = "MIT OR Apache-2.0"; authors = [ "Frank Denis " ]; @@ -5883,6 +6673,7 @@ rec { version = "0.4.12"; edition = "2018"; sha256 = "1xcwik6s6zbd3lf51kkrcicdq2j4c1fw0yjdai2apy9467i0sy8c"; + license = "MIT"; authors = [ "Carl Lerche " ]; @@ -5894,9 +6685,10 @@ rec { }; "smallvec" = rec { crateName = "smallvec"; - version = "1.16.2"; + version = "1.16.3"; edition = "2018"; - sha256 = "13iai5hhwyp8z0pbn8r11q4j5956jaxhcbvvf2drm17f1q7myfgr"; + sha256 = "06z0akmcq2zc9qg22dxda298p50gg3di5ggl3y2nllag8ypwhgav"; + license = "MIT OR Apache-2.0"; authors = [ "The Servo Project Developers" ]; @@ -5916,6 +6708,7 @@ rec { version = "0.6.5"; edition = "2021"; sha256 = "1m7diygswpvlpvrxd6ap169nxgax014jr8220nqlr3bzyb3y5lf3"; + license = "MIT OR Apache-2.0"; authors = [ "Alex Crichton " "Thomas de Zeeuw " @@ -5937,11 +6730,56 @@ rec { }; resolvedDefaultFeatures = [ "all" ]; }; + "stacker" = rec { + crateName = "stacker"; + version = "0.1.25"; + edition = "2021"; + sha256 = "0rwrws4iyh8cay7pghzf2dy55pprwfn1vm805f5czfh6cza4jzvh"; + license = "MIT OR Apache-2.0"; + authors = [ + "Alex Crichton " + "Simonas Kazlauskas " + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "libc"; + packageId = "libc"; + } + { + name = "psm"; + packageId = "psm"; + } + { + name = "windows-sys"; + packageId = "windows-sys"; + target = { target, features }: (target.name == "arm64ec-pc-windows-msvc"); + features = [ "Win32_System_Memory" "Win32_System_Threading" "Win32_Foundation" ]; + } + { + name = "windows-sys"; + packageId = "windows-sys"; + target = { target, features }: ((target."windows" or false) && (!("arm64ec" == target."arch" or null))); + features = [ "Win32_System_Memory" "Win32_System_Threading" "Win32_Foundation" ]; + } + ]; + buildDependencies = [ + { + name = "cc"; + packageId = "cc"; + } + ]; + + }; "static_assertions" = rec { crateName = "static_assertions"; version = "1.1.0"; edition = "2015"; sha256 = "0gsl6xmw10gvn3zs1rv99laj5ig7ylffnh71f9l34js4nr4r7sx2"; + license = "MIT OR Apache-2.0"; authors = [ "Nikolai Vazquez" ]; @@ -5953,6 +6791,7 @@ rec { version = "0.11.1"; edition = "2015"; sha256 = "0kzvqlw8hxqb7y598w1s0hxlnmi84sg5vsipp3yg5na5d1rvba3x"; + license = "MIT"; authors = [ "Danny Guo " "maxbachmann " @@ -5964,6 +6803,7 @@ rec { version = "0.28.0"; edition = "2021"; sha256 = "1ggr0if083c1mz9w33hkdjsp0iqk2fz9n49bvb73knwihydxwa4n"; + license = "MIT"; authors = [ "Peter Glotfelty " ]; @@ -5988,6 +6828,7 @@ rec { edition = "2021"; sha256 = "0r7n6v5b3x85m52isyc8wq78irmr22g0hmj1xn3pbq8f4yhfx1db"; procMacro = true; + license = "MIT"; authors = [ "Peter Glotfelty " ]; @@ -6017,6 +6858,7 @@ rec { version = "1.0.109"; edition = "2018"; sha256 = "0ds2if4600bd59wsv7jjgfkayfzy3hnazs394kz6zdkmna8l3dkj"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6051,6 +6893,7 @@ rec { version = "2.0.119"; edition = "2021"; sha256 = "15vjy620l91a3q4n4f4gzhnflmdr6pnm38v2m6cpk86i8av32a47"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6079,11 +6922,12 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "full" "parsing" "printing" "proc-macro" ]; }; - "syn 3.0.6" = rec { + "syn 3.0.7" = rec { crateName = "syn"; - version = "3.0.6"; + version = "3.0.7"; edition = "2021"; - sha256 = "1vmw7s58rzrs926nv5m06x7qbgswm1aa9iw3s1bj5var47kyi4w5"; + sha256 = "1p5agw0rj3f8spsnyqgj3c569nzyv5zz430xasi2qgskc42jwann"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6110,13 +6954,14 @@ rec { "proc-macro" = [ "proc-macro2/proc-macro" "quote?/proc-macro" ]; "test" = [ "syn-test-suite/all-features" ]; }; - resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "full" "parsing" "printing" "proc-macro" "visit" "visit-mut" ]; + resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "fold" "full" "parsing" "printing" "proc-macro" "visit" "visit-mut" ]; }; "tempfile" = rec { crateName = "tempfile"; version = "3.27.0"; edition = "2021"; sha256 = "1gblhnyfjsbg9wjg194n89wrzah7jy3yzgnyzhp56f3v9jd7wj9j"; + license = "MIT OR Apache-2.0"; authors = [ "Steven Allen " "The Rust Project Developers" @@ -6165,6 +7010,7 @@ rec { version = "0.3.3"; edition = "2021"; sha256 = "0km0c8zdpprqin2i1r9vr9nv362i519pzbz0vv6sad7yxy4shj4h"; + license = "MIT OR MPL-2.0"; authors = [ "Michael Davis " ]; @@ -6208,6 +7054,7 @@ rec { version = "0.9.0"; edition = "2021"; sha256 = "0qp6rrzkxcg08vjzsim2bw7mid3vi29mizrg70dzbycj0q7q3snl"; + license = "WTFPL"; authors = [ "meh. " ]; @@ -6240,6 +7087,7 @@ rec { version = "0.3.3"; edition = "2015"; sha256 = "0sxcs0g00538jqh5xbdqakkzijadr8nj7zmip0c7jz3k83vmn721"; + license = "MIT"; authors = [ "David Cuddeback " ]; @@ -6256,6 +7104,7 @@ rec { version = "0.23.3"; edition = "2018"; sha256 = "1xzq6l7rx285ax57dz8gdh44kp1790x0knvfynmimgfc89rb6xj6"; + license = "MIT"; authors = [ "Wez Furlong" ]; @@ -6310,7 +7159,7 @@ rec { } { name = "nix"; - packageId = "nix"; + packageId = "nix 0.29.0"; target = { target, features }: (target."unix" or false); features = [ "mman" "fs" ]; } @@ -6419,6 +7268,7 @@ rec { version = "1.0.69"; edition = "2021"; sha256 = "0lizjay08agcr5hs9yfzzj6axs53a2rgx070a1dsi3jpkcrzbamn"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6435,6 +7285,7 @@ rec { version = "2.0.21"; edition = "2021"; sha256 = "17hq1lh5dyr3bkc7zzjrbrp4qgkvhc48kgq1n5fdxkindaw2rr89"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6456,6 +7307,7 @@ rec { sha256 = "1h84fmn2nai41cxbhk6pqf46bxqq1b344v8yz089w1chzi76rvjg"; procMacro = true; libName = "thiserror_impl"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6482,6 +7334,7 @@ rec { sha256 = "0945n8agp7kg6n6b35yyjb4g5xv2q22vrw15h6jj1nw76a99flgy"; procMacro = true; libName = "thiserror_impl"; + license = "MIT OR Apache-2.0"; authors = [ "David Tolnay " ]; @@ -6496,7 +7349,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; } ]; @@ -6506,6 +7359,7 @@ rec { version = "0.3.55"; edition = "2024"; sha256 = "0d6iyws47z50zlksf5m3cflxvjrcgfhjglhn112gmpahxjappf6d"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " "Time contributors" @@ -6580,6 +7434,7 @@ rec { edition = "2024"; sha256 = "028ix0ax7ixp1h1k5zsqwgw85w6y1q32irslma7ci6ddd5kr074y"; libName = "time_core"; + license = "MIT OR Apache-2.0"; authors = [ "Jacob Pratt " "Time contributors" @@ -6589,9 +7444,10 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.53.1"; + version = "1.53.2"; edition = "2021"; - sha256 = "1v8b3b45pkpbibls75yniqbvx5dlks2708141ljni5mnf6lawb10"; + sha256 = "0i202ksji8q2asvii0adzgi8m0z93z3j7apn62qfh8d6qzy92pz9"; + license = "MIT"; authors = [ "Tokio Contributors " ]; @@ -6704,6 +7560,7 @@ rec { sha256 = "03kvy2r5gr4zccm4vdx8vvv3q69kbjc1b006rs11aibz74m3lxvq"; procMacro = true; libName = "tokio_macros"; + license = "MIT"; authors = [ "Tokio Contributors " ]; @@ -6718,7 +7575,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; features = [ "full" ]; } ]; @@ -6730,6 +7587,7 @@ rec { edition = "2018"; sha256 = "0wdx24sfglza6fcvz2p04aawv4wa80qq01ksd4va4gsnxnzp780p"; libName = "tokio_tungstenite"; + license = "MIT"; authors = [ "Daniel Abramov " "Alexey Galakhov " @@ -6785,11 +7643,91 @@ rec { }; resolvedDefaultFeatures = [ "connect" "default" "handshake" "stream" ]; }; + "toml_datetime" = rec { + crateName = "toml_datetime"; + version = "1.1.2+spec-1.1.0"; + edition = "2024"; + sha256 = "0lrhcmqvhjr259w4f2kijya7fgi0kpmhg9fb3m144v3cj1kxg1ib"; + license = "MIT OR Apache-2.0"; + dependencies = [ + { + name = "serde_core"; + packageId = "serde_core"; + optional = true; + usesDefaultFeatures = false; + } + ]; + features = { + "alloc" = [ "serde_core?/alloc" ]; + "default" = [ "std" ]; + "serde" = [ "dep:serde_core" ]; + "std" = [ "alloc" "serde_core?/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; + }; + "toml_edit" = rec { + crateName = "toml_edit"; + version = "0.25.17+spec-1.1.0"; + edition = "2024"; + sha256 = "174w1b2fjg1jb0wi7384v1m59g7ga79458i022gafjakpddisr73"; + license = "MIT OR Apache-2.0"; + dependencies = [ + { + name = "indexmap"; + packageId = "indexmap"; + features = [ "std" ]; + } + { + name = "toml_datetime"; + packageId = "toml_datetime"; + } + { + name = "toml_parser"; + packageId = "toml_parser"; + optional = true; + } + { + name = "winnow"; + packageId = "winnow"; + optional = true; + } + ]; + features = { + "debug" = [ "toml_parser?/debug" "dep:anstream" "dep:anstyle" "display" ]; + "default" = [ "parse" "display" ]; + "display" = [ "dep:toml_writer" ]; + "parse" = [ "dep:toml_parser" "dep:winnow" ]; + "serde" = [ "dep:serde_core" "toml_datetime/serde" "dep:serde_spanned" ]; + }; + resolvedDefaultFeatures = [ "parse" ]; + }; + "toml_parser" = rec { + crateName = "toml_parser"; + version = "1.1.5+spec-1.1.0"; + edition = "2024"; + sha256 = "0k3lljyi4zxchdklaqghkwbl7wkd2ab1w16hlyniqzid0fl979ms"; + license = "MIT OR Apache-2.0"; + dependencies = [ + { + name = "winnow"; + packageId = "winnow"; + usesDefaultFeatures = false; + } + ]; + features = { + "debug" = [ "std" "dep:anstream" "dep:anstyle" ]; + "default" = [ "std" ]; + "simd" = [ "winnow/simd" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; + }; "tungstenite" = rec { crateName = "tungstenite"; version = "0.30.0"; edition = "2021"; sha256 = "08lxarf1fbb0zf9y04hf1ss9rb0m8ar2h8dba051375ifiqwg2p4"; + license = "MIT OR Apache-2.0"; authors = [ "Alexey Galakhov" "Daniel Abramov" @@ -6864,6 +7802,7 @@ rec { version = "1.20.1"; edition = "2018"; sha256 = "086s9ly0906kw5yw41249fba97w5zfxf03pyfwdkffvcprqfixdn"; + license = "MIT OR Apache-2.0"; features = { "scale-info" = [ "dep:scale-info" ]; "scale_info" = [ "scale-info/derive" ]; @@ -6876,6 +7815,7 @@ rec { edition = "2021"; sha256 = "0wc9p07sqwz320848i52nvyjvpsxkx3kv5bfbmm6s35809fdk5i8"; libName = "ucd_trie"; + license = "MIT OR Apache-2.0"; authors = [ "Andrew Gallant " ]; @@ -6889,13 +7829,15 @@ rec { version = "0.1.4"; edition = "2018"; sha256 = "154smf048k84prsdgh09nkm2n0w0336v84jd4zikyn6v6jrqbspa"; + license = "MIT OR Apache-2.0"; }; "unicase" = rec { crateName = "unicase"; - version = "2.9.0"; + version = "2.10.0"; edition = "2018"; - sha256 = "0hh1wrfd7807mfph2q67jsxqgw8hm82xg2fb8ln8cvblkwxbri6v"; + sha256 = "13x2h9s4jhch7rknqkqb1pb35irpj00fswy9ssgh0dm0qsnc6z1m"; + license = "MIT OR Apache-2.0"; authors = [ "Sean McArthur " ]; @@ -6908,6 +7850,7 @@ rec { edition = "2021"; sha256 = "0m3915ipi4zz7isncf5k1dz47ys0nq9j7l4l2n2rm03zaxwg8ifj"; libName = "unicode_ident"; + license = "(MIT OR Apache-2.0) AND Unicode-3.0"; authors = [ "David Tolnay " ]; @@ -6919,6 +7862,7 @@ rec { edition = "2018"; sha256 = "1a47zaq83p386r3baq4m018xd5q4q0grdg56i1x042dzn71x7xf6"; libName = "unicode_segmentation"; + license = "MIT OR Apache-2.0"; authors = [ "kwantam " "Manish Goregaokar " @@ -6932,6 +7876,7 @@ rec { edition = "2018"; sha256 = "19g9af5v0a8xaigqbs9hi9csxkg1fff07ycilvwfaqw64fhq1cqn"; libName = "unicode_truncate"; + license = "MIT OR Apache-2.0"; authors = [ "Aetf " ]; @@ -6962,6 +7907,7 @@ rec { edition = "2021"; sha256 = "0m7jjzlcccw716dy9423xxh0clys8pfpllc5smvfxrzdf66h9b5l"; libName = "unicode_width"; + license = "MIT OR Apache-2.0"; authors = [ "kwantam " "Manish Goregaokar " @@ -6979,6 +7925,7 @@ rec { version = "0.2.2"; edition = "2018"; sha256 = "088807qwjq46azicqwbhlmzwrbkz7l4hpw43sdkdyyk524vdxaq6"; + license = "Apache-2.0 OR MIT"; authors = [ "Joe Wilm " "Christian Duerr " @@ -6989,9 +7936,10 @@ rec { }; "uuid" = rec { crateName = "uuid"; - version = "1.26.1"; + version = "1.28.0"; edition = "2021"; - sha256 = "1kl5nb7r3gpmkc43d6nbayvzqhcp2grczk6c7bxv80b6x70xmxif"; + sha256 = "01mnlhz09hwdjaxwzjd6bql3fjb5zl9n8dzaxn7dvdxyhiiiihbw"; + license = "Apache-2.0 OR MIT"; authors = [ "Ashley Mannix" "Dylan DPC" @@ -7064,6 +8012,7 @@ rec { version = "0.9.5"; edition = "2015"; sha256 = "0nhhi4i5x89gm911azqbn7avs9mdacw2i3vcz3cnmz3mv4rqz4hb"; + license = "MIT/Apache-2.0"; authors = [ "Sergio Benitez " ]; @@ -7074,6 +8023,7 @@ rec { version = "0.6.2"; edition = "2018"; sha256 = "1l5yz9650zhkaffxn28cvfys7plcw2wd6drajyf41pshn37jm6vd"; + license = "MIT"; authors = [ "Wez Furlong " ]; @@ -7092,6 +8042,7 @@ rec { crateBin = []; sha256 = "04azqv9mnfxgvnc8j2wp362xraybakh2dy1nj22gj51rdl93pb09"; libName = "wait_timeout"; + license = "MIT/Apache-2.0"; authors = [ "Alex Crichton " ]; @@ -7109,6 +8060,7 @@ rec { version = "0.11.1+wasi-snapshot-preview1"; edition = "2018"; sha256 = "0jx49r7nbkbhyfrfyhz0bm4817yrnxgd3jiwwwfv0zl439jyrwyc"; + license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT"; authors = [ "The Cranelift Project Developers" ]; @@ -7125,6 +8077,7 @@ rec { version = "1.0.4+wasi-0.2.12"; edition = "2021"; sha256 = "11wl7lqwq4pbmlmzr6n7bwz0hzy1z6sxc4554bkmrr86w4vznzmn"; + license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT"; dependencies = [ { name = "wit-bindgen"; @@ -7146,6 +8099,7 @@ rec { edition = "2021"; sha256 = "02flhqld01jqb6vbfyx1gb8s78g1pnq2164daxad93y6mhrlzdcv"; libName = "wasm_bindgen"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7191,6 +8145,7 @@ rec { edition = "2021"; sha256 = "03k1wcg5j3wqk6vgy6gzcq868vsa9k81dlhqissfk0nrw96v7fiw"; libName = "wasm_bindgen_futures"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7227,6 +8182,7 @@ rec { sha256 = "0dc5xq09sy1v9ns1fhb0cnyqz5p1wcjjvkdmxskj9qhnbg1x0a9f"; procMacro = true; libName = "wasm_bindgen_macro"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7250,6 +8206,7 @@ rec { edition = "2021"; sha256 = "1dx6w90f14avmhri7ss9lyz03060g6475r4axy3bm7biqf5ill3g"; libName = "wasm_bindgen_macro_support"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7268,7 +8225,7 @@ rec { } { name = "syn"; - packageId = "syn 3.0.6"; + packageId = "syn 3.0.7"; features = [ "visit" "visit-mut" "full" "extra-traits" ]; } { @@ -7287,6 +8244,7 @@ rec { links = "wasm_bindgen"; sha256 = "1ilmp5d3sl8lrq9djhcs90gk66yvk8mgwk4sfrvpvkd75b2wkw13"; libName = "wasm_bindgen_shared"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7304,6 +8262,7 @@ rec { edition = "2021"; sha256 = "195bd1m14w3hsw5fg3sr938mh7y4cb260d0sq6a6brffxjfin9l8"; libName = "web_sys"; + license = "MIT OR Apache-2.0"; authors = [ "The wasm-bindgen Developers" ]; @@ -7805,6 +8764,7 @@ rec { edition = "2021"; sha256 = "1fx05yqx83dhx628wb70fyy10yjfq1jpl20qfqhdkymi13rq0ras"; libName = "web_time"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "js-sys"; @@ -7828,6 +8788,7 @@ rec { edition = "2021"; sha256 = "1v7kwmnxfplv9kgdmamn6csbn2ag5xjr0y6gs797slk0alsnw2hc"; libName = "wezterm_bidi"; + license = "MIT AND Unicode-DFS-2016"; dependencies = [ { name = "log"; @@ -7846,6 +8807,7 @@ rec { edition = "2021"; sha256 = "1dwf8bm3cwdi37fandwbk7nsfhn9spv4wm0l86gf551xv7vaybb9"; libName = "wezterm_blob_leases"; + license = "MIT"; dependencies = [ { name = "getrandom"; @@ -7881,6 +8843,7 @@ rec { edition = "2018"; sha256 = "15j29f60p1dc0msx50x940niyv9d5zpynavpcc6jf44hbkrixs3x"; libName = "wezterm_color_types"; + license = "MIT"; authors = [ "Wez Furlong" ]; @@ -7914,6 +8877,7 @@ rec { edition = "2021"; sha256 = "1b6mrk09xxiz66dj3912kmiq8rl7dqig6rwminkfmmhg287bcajz"; libName = "wezterm_dynamic"; + license = "MIT"; dependencies = [ { name = "log"; @@ -7945,6 +8909,7 @@ rec { sha256 = "0nspip7gwzmfn66fbnbpa2yik2sb97nckzmgir25nr4wacnwzh26"; procMacro = true; libName = "wezterm_dynamic_derive"; + license = "MIT"; dependencies = [ { name = "proc-macro2"; @@ -7968,6 +8933,7 @@ rec { edition = "2021"; sha256 = "0zp557014d458a69yqn9dxfy270b6kyfdiynr5p4algrb7aas4kh"; libName = "wezterm_input_types"; + license = "MIT"; authors = [ "Wez Furlong " ]; @@ -8006,6 +8972,7 @@ rec { version = "0.3.9"; edition = "2015"; sha256 = "06gl025x418lchw1wxj64ycr7gha83m44cjr5sarhynd9xkrm0sw"; + license = "MIT/Apache-2.0"; authors = [ "Peter Atashian " ]; @@ -8024,7 +8991,7 @@ rec { features = { "debug" = [ "impl-debug" ]; }; - resolvedDefaultFeatures = [ "consoleapi" "fileapi" "handleapi" "impl-default" "iphlpapi" "memoryapi" "namedpipeapi" "processenv" "processthreadsapi" "synchapi" "winbase" "winerror" "winnls" "winnt" "winsock2" "winuser" "ws2def" ]; + resolvedDefaultFeatures = [ "consoleapi" "fileapi" "handleapi" "impl-default" "memoryapi" "namedpipeapi" "processenv" "processthreadsapi" "synchapi" "winbase" "winerror" "winnls" "winnt" "winsock2" "winuser" ]; }; "winapi-i686-pc-windows-gnu" = rec { crateName = "winapi-i686-pc-windows-gnu"; @@ -8032,6 +8999,7 @@ rec { edition = "2015"; sha256 = "1dmpa6mvcvzz16zg6d5vrfy4bxgg541wxrcip7cnshi06v38ffxc"; libName = "winapi_i686_pc_windows_gnu"; + license = "MIT/Apache-2.0"; authors = [ "Peter Atashian " ]; @@ -8043,6 +9011,7 @@ rec { edition = "2015"; sha256 = "0gqq64czqb64kskjryj8isp62m2sgvx25yyj3kpc2myh85w24bki"; libName = "winapi_x86_64_pc_windows_gnu"; + license = "MIT/Apache-2.0"; authors = [ "Peter Atashian " ]; @@ -8054,6 +9023,7 @@ rec { edition = "2021"; sha256 = "1swxpv1a8qvn3bkxv8cn663238h2jccq35ff3nsj61jdsca3ms5q"; libName = "windows_core"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "windows-implement"; @@ -8094,6 +9064,7 @@ rec { sha256 = "1psxhmklzcf3wjs4b8qb42qb6znvc142cb5pa74rsyxm1822wgh5"; procMacro = true; libName = "windows_implement"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "proc-macro2"; @@ -8121,6 +9092,7 @@ rec { sha256 = "0n73cwrn4247d0axrk7gjp08p34x1723483jxjxjdfkh4m56qc9z"; procMacro = true; libName = "windows_interface"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "proc-macro2"; @@ -8147,6 +9119,7 @@ rec { edition = "2021"; sha256 = "1rag186yfr3xx7piv5rg8b6im2dwcf8zldiflvb22xbzwli5507h"; libName = "windows_link"; + license = "MIT OR Apache-2.0"; }; "windows-result" = rec { @@ -8155,6 +9128,7 @@ rec { edition = "2021"; sha256 = "1d9yhmrmmfqh56zlj751s5wfm9a2aa7az9rd7nn5027nxa4zm0bp"; libName = "windows_result"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "windows-link"; @@ -8173,6 +9147,7 @@ rec { edition = "2021"; sha256 = "14bhng9jqv4fyl7lqjz3az7vzh8pw0w4am49fsqgcz67d67x0dvq"; libName = "windows_strings"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "windows-link"; @@ -8191,6 +9166,7 @@ rec { edition = "2021"; sha256 = "1z7k3y9b6b5h52kid57lvmvm05362zv1v8w0gc7xyv5xphlp44xf"; libName = "windows_sys"; + license = "MIT OR Apache-2.0"; dependencies = [ { name = "windows-link"; @@ -8445,7 +9421,33 @@ rec { "Win32_Web" = [ "Win32" ]; "Win32_Web_InternetExplorer" = [ "Win32_Web" ]; }; - resolvedDefaultFeatures = [ "Wdk" "Wdk_Foundation" "Wdk_Storage" "Wdk_Storage_FileSystem" "Wdk_System" "Wdk_System_IO" "Win32" "Win32_Foundation" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_IO" "Win32_System_Pipes" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_WindowsProgramming" "default" ]; + resolvedDefaultFeatures = [ "Wdk" "Wdk_Foundation" "Wdk_Storage" "Wdk_Storage_FileSystem" "Wdk_System" "Wdk_System_IO" "Win32" "Win32_Foundation" "Win32_NetworkManagement" "Win32_NetworkManagement_IpHelper" "Win32_NetworkManagement_Ndis" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_IO" "Win32_System_Memory" "Win32_System_Pipes" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_WindowsProgramming" "default" ]; + }; + "winnow" = rec { + crateName = "winnow"; + version = "1.0.4"; + edition = "2021"; + sha256 = "10fzxipa7lx16172p3aca9j60hzbqgjki2f95kqksd5qywcp7f93"; + license = "MIT"; + dependencies = [ + { + name = "memchr"; + packageId = "memchr"; + optional = true; + usesDefaultFeatures = false; + } + ]; + features = { + "ascii" = [ "parser" ]; + "binary" = [ "parser" ]; + "debug" = [ "std" "dep:anstream" "dep:anstyle" "dep:is_terminal_polyfill" "dep:terminal_size" ]; + "default" = [ "std" "ascii" "binary" ]; + "simd" = [ "dep:memchr" ]; + "std" = [ "alloc" "memchr?/std" ]; + "unstable-doc" = [ "alloc" "std" "ascii" "binary" "simd" "unstable-recover" ]; + "unstable-recover" = [ "parser" ]; + }; + resolvedDefaultFeatures = [ "alloc" "ascii" "binary" "default" "parser" "std" ]; }; "wit-bindgen" = rec { crateName = "wit-bindgen"; @@ -8453,6 +9455,7 @@ rec { edition = "2024"; sha256 = "0vjk2jb593ri9k1aq4iqs2si9mrw5q46wxnn78im7hm7hx799gqy"; libName = "wit_bindgen"; + license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT"; authors = [ "Alex Crichton " ]; @@ -8469,9 +9472,10 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.58"; + version = "0.8.62"; edition = "2021"; - sha256 = "0i6vsbj4qfqj62b8qxl7wdcin8rnqz6pw88p6zzl5dc2mnpqyzn1"; + sha256 = "17asjqfdkqmxsx42myw1x5jlb28m5axlf9ifldqpbiy7dbsjnl46"; + license = "BSD-2-Clause OR Apache-2.0 OR MIT"; dependencies = [ { name = "zerocopy-derive"; @@ -8501,11 +9505,12 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.58"; + version = "0.8.62"; edition = "2021"; - sha256 = "1whbf7cjcqyp5nhvma78yy489swr7mfgc9m6r6h4ckyz8kh5cpsr"; + sha256 = "06lx0gigf0j5pvp4dhlrv636b4mib37ijzlcc3i62rdhailj0msl"; procMacro = true; libName = "zerocopy_derive"; + license = "BSD-2-Clause OR Apache-2.0 OR MIT"; dependencies = [ { name = "proc-macro2"; @@ -8536,6 +9541,7 @@ rec { edition = "2021"; sha256 = "04j158293bx73kv5pj1i89ai411q7fxc9zwk3wkpqgb9gj7fas5j"; libName = "zlib_rs"; + license = "Zlib"; features = { "__internal-fuzz" = [ "arbitrary" ]; "__internal-test" = [ "quickcheck" ]; @@ -8552,6 +9558,7 @@ rec { version = "1.0.23"; edition = "2021"; sha256 = "06zwri21nnrl34rwinmvbciap8yk1mrl8qfg9pff7lgspc56sri9"; + license = "MIT"; authors = [ "David Tolnay " ]; diff --git a/flake.lock b/flake.lock index f0a00207..60fb16ca 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ }, "crane": { "locked": { - "lastModified": 1789760033, - "narHash": "sha256-jtT4yxZpR8seYnlCMMWSSPlFN92zO6ICuZ8pJrmi86k=", + "lastModified": 1790899423, + "narHash": "sha256-THGtz65UGJU+sonZidRboyCMk+9DclpMF7pwL4uDV4M=", "owner": "ipetkov", "repo": "crane", - "rev": "73b980519cefc727a5f6cc8e5c0947a2f9be6edd", + "rev": "47b6b27ed9a3a9181415e4367d0c30ab2a0e0250", "type": "github" }, "original": { @@ -71,11 +71,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1782759041, - "narHash": "sha256-2577vxyoBa8+ZRiXr3CuPtOuEtPRYsFPSZuEc/KI/80=", + "lastModified": 1790579054, + "narHash": "sha256-S2NrwKB7aQa6HZsg2UGCmzQPI5Dw+bqUPm8R23BAUh8=", "owner": "nix-community", "repo": "crate2nix", - "rev": "5e1ecfd2d15b34ec90c2e51fdffbe8116595a767", + "rev": "1cb60331b14f15dad145dbd4e207c1ec110e5675", "type": "github" }, "original": { @@ -297,11 +297,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1790185690, - "narHash": "sha256-xJ+X4hBtOcAFGBOe5nAMyMUeF9foJBmIOu3NjBqBycU=", + "lastModified": 1791456040, + "narHash": "sha256-H83yz/do+hjOO0uujHyH8RgtIQP2v7Mw+cLwcZK/xKc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4975466d324710c576dc11ad614684e6bd8cad8e", + "rev": "e7439b6b14ad3cc35d05608ebca9bce01a25f5f8", "type": "github" }, "original": { @@ -368,11 +368,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1790234952, - "narHash": "sha256-tjQa1vDoHJir4lasZTakz/xgmsfB6SRjeQqaIbefFOk=", + "lastModified": 1791535654, + "narHash": "sha256-QFgGi6Wgh7AgqPFdAXEmkTgnR0B5M0omheIHvo/02dU=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "ed34466c59b766481248959a21a6e46cf0c60468", + "rev": "4ca2963243427cb86bd6b4d9ca6010db0162a619", "type": "github" }, "original": { From d8843181f936565f5df8473add81dda5f691a3de Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Fri, 9 Oct 2026 23:37:42 -0700 Subject: [PATCH 02/11] chore: upgrades --- Cargo.toml | 6 +++--- crates/improvise-core/Cargo.toml | 2 +- crates/improvise-formula/Cargo.toml | 6 +++--- crates/improvise-io/Cargo.toml | 6 +++--- flake.nix | 2 ++ 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a07fe043..ad5765f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,9 +70,9 @@ improvise-wasm-client = { path = "crates/improvise-wasm-client" } improvise-protocol = { path = "crates/improvise-protocol", features = ["test-support"] } # `tests/headless_cli.rs` detaches the binary from any terminal with `setsid`. libc = "0.2" -pest = "2.9.2" -pest_derive = "2.9.2" -pest_meta = "2.9.2" +pest = "2.9.3" +pest_derive = "2.9.3" +pest_meta = "2.9.3" proptest = "1" tempfile = "3" diff --git a/crates/improvise-core/Cargo.toml b/crates/improvise-core/Cargo.toml index a83cf35b..ee52b099 100644 --- a/crates/improvise-core/Cargo.toml +++ b/crates/improvise-core/Cargo.toml @@ -17,7 +17,7 @@ serde = { version = "1", features = ["derive"] } # wasm-clean. siphasher = "1" # Unicode full case folding for slugify (ADR 007 answer 26). no_std, no dependencies. -unicase = "2.9" +unicase = "2.10" [features] # Exposes the fold-evaluation counter to other crates' tests (improvise-0jw5). diff --git a/crates/improvise-formula/Cargo.toml b/crates/improvise-formula/Cargo.toml index 00bf407c..823bd23e 100644 --- a/crates/improvise-formula/Cargo.toml +++ b/crates/improvise-formula/Cargo.toml @@ -8,11 +8,11 @@ repository = "https://github.com/fiddlerwoaroof/improvise" [dependencies] anyhow = "1" -pest = "2.9.2" -pest_derive = "2.9.2" +pest = "2.9.3" +pest_derive = "2.9.3" # For FormulaId alone, which crosses the wire (improvise-km71); no AST derive. serde = { version = "1", features = ["derive"] } [dev-dependencies] -pest_meta = "2.9.2" +pest_meta = "2.9.3" proptest = "1" diff --git a/crates/improvise-io/Cargo.toml b/crates/improvise-io/Cargo.toml index bb8d367f..88f544ee 100644 --- a/crates/improvise-io/Cargo.toml +++ b/crates/improvise-io/Cargo.toml @@ -14,8 +14,8 @@ chrono = { version = "0.4", features = ["serde"] } csv = "1" flate2 = "1" indexmap = "2" -pest = "2.9.2" -pest_derive = "2.9.2" +pest = "2.9.3" +pest_derive = "2.9.3" serde = { version = "1", features = ["derive"] } # Parses JSON a user's numbers cross, so it must read back the f64 written: per crate, # because each build stands alone (improvise-6yvg, context/code/protocol.md). @@ -47,6 +47,6 @@ features = [ ] [dev-dependencies] -pest_meta = "2.9.2" +pest_meta = "2.9.3" proptest = "1" tempfile = "3" diff --git a/flake.nix b/flake.nix index 278b5d65..dce8b0e9 100644 --- a/flake.nix +++ b/flake.nix @@ -121,8 +121,10 @@ pkgs.rust-analyzer crate2nix.packages.${system}.default pkgs.cargo-expand + pkgs.cargo-edit pkgs.cargo-llvm-cov pkgs.global + pkgs.iconv pkgs.universal-ctags beads.packages.${system}.default codeMaat From 7b75a8e9bdecb8aae040f0746551e6fd0d8327d7 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Fri, 9 Oct 2026 23:38:07 -0700 Subject: [PATCH 03/11] chore: upgrades --- Cargo.lock | 14 +++++++++++-- Cargo.nix | 40 +++++++++++++++++++++++++++++++++++--- crates/numtower/Cargo.toml | 2 +- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14b56a2d..ef31d5a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,6 +1279,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.2" @@ -1311,7 +1321,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -1338,7 +1348,7 @@ dependencies = [ name = "numtower" version = "0.1.0" dependencies = [ - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-rational", "num-traits", diff --git a/Cargo.nix b/Cargo.nix index 0f6374d2..3b674182 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4119,7 +4119,7 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "std" ]; }; - "num-bigint" = rec { + "num-bigint 0.4.8" = rec { crateName = "num-bigint"; version = "0.4.8"; edition = "2021"; @@ -4153,6 +4153,40 @@ rec { }; resolvedDefaultFeatures = [ "std" ]; }; + "num-bigint 0.5.1" = rec { + crateName = "num-bigint"; + version = "0.5.1"; + edition = "2021"; + sha256 = "1h77ycws79m3j1s68jq5pvaiifi9z4b76cjhwqw042m8q05q5rwk"; + libName = "num_bigint"; + license = "MIT OR Apache-2.0"; + dependencies = [ + { + name = "num-integer"; + packageId = "num-integer"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + { + name = "num-traits"; + packageId = "num-traits"; + usesDefaultFeatures = false; + features = [ "i128" ]; + } + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "default" = [ "std" ]; + "quickcheck" = [ "dep:quickcheck" ]; + "rand_0_10" = [ "rand_core_0_10" "dep:rand_0_10" ]; + "rand_0_9" = [ "rand_core_0_9" "dep:rand_0_9" ]; + "rand_core_0_10" = [ "dep:rand_core_0_10" ]; + "rand_core_0_9" = [ "dep:rand_core_0_9" ]; + "serde" = [ "dep:serde" ]; + "std" = [ "num-integer/std" "num-traits/std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "num-conv" = rec { crateName = "num-conv"; version = "0.2.2"; @@ -4229,7 +4263,7 @@ rec { dependencies = [ { name = "num-bigint"; - packageId = "num-bigint"; + packageId = "num-bigint 0.4.8"; optional = true; usesDefaultFeatures = false; } @@ -4304,7 +4338,7 @@ rec { dependencies = [ { name = "num-bigint"; - packageId = "num-bigint"; + packageId = "num-bigint 0.5.1"; usesDefaultFeatures = false; features = [ "std" ]; } diff --git a/crates/numtower/Cargo.toml b/crates/numtower/Cargo.toml index 54ca4e27..3d9b93c0 100644 --- a/crates/numtower/Cargo.toml +++ b/crates/numtower/Cargo.toml @@ -12,7 +12,7 @@ categories = ["mathematics"] [dependencies] rust_decimal = { version = "1.43", default-features = false, features = ["std"] } num-rational = { version = "0.4.2", default-features = false } -num-bigint = { version = "0.4", default-features = false, features = ["std"] } +num-bigint = { version = "0.5", default-features = false, features = ["std"] } num-integer = { version = "0.1", default-features = false } num-traits = { version = "0.2", default-features = false, features = ["std"] } From c0e6bd8f3366a18d1f056bf1f5753f82576a795b Mon Sep 17 00:00:00 2001 From: "Claude (adr009-derived)" Date: Fri, 9 Oct 2026 23:46:47 -0700 Subject: [PATCH 04/11] feat(incremental): the Derived trait, Eager and the differential harness (improvise-t8ow) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- Cargo.lock | 8 + Cargo.toml | 2 +- context/code/improvise-incremental.md | 74 ++++ .../test-evidence/improvise-incremental.md | 102 ++++++ crates/improvise-incremental/Cargo.toml | 14 + crates/improvise-incremental/src/eager.rs | 42 +++ crates/improvise-incremental/src/edit.rs | 46 +++ crates/improvise-incremental/src/harness.rs | 156 ++++++++ crates/improvise-incremental/src/lib.rs | 24 ++ crates/improvise-incremental/tests/oracle.rs | 338 ++++++++++++++++++ nix/ci.nix | 2 + scripts/build-doc-site.mjs | 2 + 12 files changed, 809 insertions(+), 1 deletion(-) create mode 100644 context/code/improvise-incremental.md create mode 100644 context/test-evidence/improvise-incremental.md create mode 100644 crates/improvise-incremental/Cargo.toml create mode 100644 crates/improvise-incremental/src/eager.rs create mode 100644 crates/improvise-incremental/src/edit.rs create mode 100644 crates/improvise-incremental/src/harness.rs create mode 100644 crates/improvise-incremental/src/lib.rs create mode 100644 crates/improvise-incremental/tests/oracle.rs diff --git a/Cargo.lock b/Cargo.lock index d09a5591..b05c1bdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -952,6 +952,14 @@ dependencies = [ "improvise-formula", ] +[[package]] +name = "improvise-incremental" +version = "0.1.0" +dependencies = [ + "improvise-core", + "improvise-io", +] + [[package]] name = "improvise-io" version = "0.1.0-rc2" diff --git a/Cargo.toml b/Cargo.toml index 1f99d257..6a0b57ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = [".", "crates/improvise-formula", "crates/improvise-core", "crates/improvise-protocol", "crates/improvise-io", "crates/improvise-command", "crates/improvise-wasm-client", "crates/improvise-ws-server", "crates/improvise-worker-server", "crates/gp-tree", "crates/improvise-gp", "crates/numtower", "crates/zset"] +members = [".", "crates/improvise-formula", "crates/improvise-core", "crates/improvise-protocol", "crates/improvise-io", "crates/improvise-command", "crates/improvise-wasm-client", "crates/improvise-ws-server", "crates/improvise-worker-server", "crates/gp-tree", "crates/improvise-gp", "crates/numtower", "crates/zset", "crates/improvise-incremental"] [package] name = "improvise" diff --git a/context/code/improvise-incremental.md b/context/code/improvise-incremental.md new file mode 100644 index 00000000..1c150859 --- /dev/null +++ b/context/code/improvise-incremental.md @@ -0,0 +1,74 @@ +# `improvise-incremental`: the reasoning + +`crates/improvise-incremental` is ADR 009 step 2 (improvise-t8ow, epic improvise-bw4p): the +plug. It holds the `Derived` trait, `Eager` (today's evaluator behind it) and the +differential harness every later backend is checked with. There is no incremental backend +here, the evaluator is untouched and no existing crate changed. The decisions are the ADR's +(`context/adr/009-incremental-evaluation.md`, clause 2). The evidence for each test is in +`context/test-evidence/improvise-incremental.md`. + +## The shape + +| item | what it is | +|---|---| +| `Derived` | the two things the evaluator reads: `value(key, agg)` and `raw_fold(partial)` | +| `Eager` | an owned `Model` plus its None categories; every answer is a call into `Model` | +| `Maintained` | a `Derived` that is told each `Edit`; `Eager` is one | +| `Edit` | one model mutation as data (set, clear, add or remove a formula, set a measure's aggregation) | +| `probes`, `Probe` | every question worth asking of a model, and a way to put it to any backend | +| `differential` | runs one edit sequence on a candidate and on `Eager`, comparing every probe at every step | +| `Divergence`, `Report` | what a failure names (step, probe, both answers) and what a pass compared | + +## Interpretations + +Clause 2 names the trait and says what it carries ("the formula result at a key, and the raw +fold of the cells that match a partial key") and nothing else. These are the readings taken. + +1. **`Derived` lives in this crate, not in improvise-core.** The ADR says improvise-core + "gains a trait". Putting it there changes an existing crate's source, which this step does + not do. Nothing is lost: the seam crate depends on core and core never on `zset`, which is + the clause's actual constraint. Moving the trait into core, when the evaluator is made to + read through it, is a move of one file. +2. **Two methods, the minimum.** `value(key, agg)` is the formula result at a key, or the cell + as stored or folded; `raw_fold(partial)` is the fold of matching stored cells. `agg` is + `Aggregation`, the evaluator's own type, because exact and over-hidden reads differ and + the harness must be able to ask both. Collapsed-group `covers`, totals and occupancy are + not in the trait: nothing reads them through it yet, and a method with no caller is + designed blind. The ADR's differential test compares "every drawn cell, total and occupancy + count"; those enter with the steps that maintain them. +3. **`Eager::raw_fold` is `evaluate_aggregated(partial, OverHidden)`.** The evaluator's raw + fold (`aggregate_raw`, `aggregate_cell_values`) is private to core, and wrapping without + editing core leaves the public path. The two agree for a partial that names no formula + target and no collapsed group, which is what the harness probes. For a partial that does + name a formula target the cache answers instead, so `raw_fold` is not "never a formula" + there. Step 3 should expose the raw fold from core when it moves the evaluator behind the + trait, and `Eager` should call that. +4. **`Eager` recomputes formulas after every edit.** Production does it in `rebuild_layout` + (`Model::recompute_formulas(none_cats)`), and an over-hidden read of a formula cell reads + the cache it fills. So `Eager` carries the None categories of the view it stands for and + recomputes under them after each edit, as a layout rebuild does. +5. **`Edit` is the vocabulary of the harness, not of the wire.** Five variants, each one + public `Model` call. A later step adds variants for what it maintains (an item added, a + category removed); the harness does not care which. +6. **Values agree by float rules with every NaN one value** (`same_value`), the rule clause 3 + states for cell deltas. A NaN answer is not a divergence from itself. Signed zero compares + equal, so a later `ExactSum` cannot be told from eager's sum by the sign of a zero here; + clause 8 has its own property test for that. +7. **No `zset` dependency yet.** The brief and the ADR name it, but nothing in this step uses + a Z-set, and an unused dependency is noise. It arrives with the first backend, as the + cell delta of step 3. + +## What the harness checks + +`differential(model, none_cats, candidate, edits)` builds `Eager` over a clone of the model, +applies each edit to both, and after step 0 and after every edit asks both every probe. A +probe set is derived from the post-edit model: each stored key, each partial of one and each +formula cell over them under both aggregations, plus the raw fold of every partial. The key an +edit names is probed too, so a cleared cell is asked about after it is gone. The first +disagreement is returned as a `Divergence` whose message reads +`divergence at step N: : eager != candidate `. A pass returns a `Report` of how +many states and answers were compared, so a run that compared nothing shows as zero. + +The corpus the tests use is `examples/demo.improv` and `web/demo.improv`, loaded through +`improvise_io::persistence::load`, every view's None categories in turn, plus a hand-built +model with formulas, text and mixed values. diff --git a/context/test-evidence/improvise-incremental.md b/context/test-evidence/improvise-incremental.md new file mode 100644 index 00000000..855fd71e --- /dev/null +++ b/context/test-evidence/improvise-incremental.md @@ -0,0 +1,102 @@ +# Test evidence: `improvise-incremental` + +What each test guards, which rival it was run against, and where that rival failed. The +reasoning is in `context/code/improvise-incremental.md`; the decisions are ADR 009 clause 2's. + +**How the rivals are kept.** The `the_harness_catches_*` tests run `differential` on a +`Rival`, an `Eager` told every edit and wrong in one way, and assert the step at which the +harness reports the divergence. They run on every build, so each rival is watched failing on +every run and not once by hand. + +**Injected in the source.** Six faults were also put into `src/eager.rs` and `src/harness.rs` +one at a time, each run against the whole suite and each reverted and followed by a full +rerun. The failing tests, by name: +- `Eager::value` ignores its `Aggregation` (always `Exact`): + `eager_value_reads_a_formula_exactly_and_folded`, `eager_follows_an_edit_to_the_cell_a_fold_reads`, + `eager_matches_the_evaluator_on_the_shipped_documents`, + `the_harness_catches_a_backend_that_ignores_the_aggregation`; +- `Eager::raw_fold` reads `Exact`: `eager_raw_fold_sums_by_default`, + `eager_raw_fold_follows_the_measures_aggregation`, `eager_raw_fold_of_text_is_unanimous_or_mixed`, + `eager_numbers_among_text_are_mixed`, `eager_follows_an_edit_to_the_cell_a_fold_reads`, + `eager_matches_the_evaluator_on_the_shipped_documents`; +- `Eager::apply` does not recompute formulas: `eager_follows_an_edit_to_the_cell_a_fold_reads`; +- the harness compares only the first edit: `the_harness_catches_a_backend_that_ignores_a_clear`, + `the_harness_catches_a_backend_that_ignores_the_measure_aggregation`, + `the_harness_catches_a_backend_that_goes_stale_after_two_edits`, + `the_harness_names_the_probe_the_two_backends_disagree_on`; +- the harness never reports a divergence: the same four plus + `the_harness_catches_a_backend_that_ignores_the_aggregation`; +- `same_value` says everything agrees: `the_harness_catches_a_backend_that_ignores_the_aggregation`. + +## eager_raw_fold_sums_by_default + +Hand-computed: Revenue under Product A is 10 + 5 = 15. Fails on the `raw_fold`-reads-`Exact` +rival (a partial key names no stored cell, so the answer is `None`). + +## eager_raw_fold_follows_the_measures_aggregation + +After `measure_agg[Revenue] = Max` the same fold is 10, and Cost, unchanged, still sums to 6. +A fold that always sums fails on the first; one that always takes the maximum fails on the second. + +## eager_raw_fold_of_text_is_unanimous_or_mixed + +Note under A is two equal texts and reads as that text; under B it is two different texts and +reads `Error("mixed")`. A fold that drops text, which the evaluator used to do (gotcha 7), +returns `None` for both. + +## eager_numbers_among_text_are_mixed + +A text among numbers is `Error("mixed")`, not the sum of the numbers. + +## eager_value_reads_a_formula_exactly_and_folded + +`Profit = Revenue - Cost` reads 6 at East/A exactly, and 9 at Product A with Region over +hidden: (10 + 5) - (4 + 2), the fold taken before the subtraction. Fails on the +`value`-ignores-`Aggregation` rival. + +## eager_follows_an_edit_to_the_cell_a_fold_reads + +After East/A Revenue becomes 20 the fold is 25 and the folded Profit 19. The Profit half is +what fails when `apply` forgets to recompute formulas: the folded cache is then stale. + +## eager_matches_the_evaluator_on_the_shipped_documents + +Both shipped documents, every view's None categories, and the hand model: every probe of +`Eager` equals a direct `evaluate_aggregated` on a model recomputed under the same None +categories, and the probe set is non-empty. Fails on both aggregation rivals. + +## eager_agrees_with_itself_over_every_corpus_edit_sequence + +`differential` over a generated edit sequence on each corpus model returns a `Report` with +`edits + 1` steps and a non-zero probe count. The count assertion is what a harness that +compared nothing would fail; the step count is what one that stopped early would fail. + +## the_harness_passes_a_backend_that_is_right + +The control for the four `catches` tests: `Eager` as the candidate over the hand-built edits +is a pass, so a harness that rejects everything is seen. + +## the_harness_catches_a_backend_that_ignores_the_aggregation + +A candidate that reads every `value` as `Exact` diverges at step 0. A harness that only +compared after edits would not see it. + +## the_harness_catches_a_backend_that_ignores_the_measure_aggregation + +A candidate that drops `SetMeasureAgg` diverges at step 2, the edit that sets it. Fails on the +compare-first-edit-only rival. + +## the_harness_catches_a_backend_that_goes_stale_after_two_edits + +A candidate that stops applying edits after the second diverges at step 3. Fails on the +compare-first-edit-only rival: a prefix of steps cannot see a backend that goes wrong late. + +## the_harness_catches_a_backend_that_ignores_a_clear + +A candidate that keeps a cleared cell diverges at step 3, and the message names the eager +answer. Fails on the compare-first-edit-only and never-fails rivals. + +## the_harness_names_the_probe_the_two_backends_disagree_on + +The `Divergence` carries a probe and two different answers, not only a message. Fails on the +never-fails rival (no divergence is returned at all). diff --git a/crates/improvise-incremental/Cargo.toml b/crates/improvise-incremental/Cargo.toml new file mode 100644 index 00000000..7b6817bc --- /dev/null +++ b/crates/improvise-incremental/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "improvise-incremental" +version = "0.1.0" +edition = "2024" +license = "Apache-2.0" +description = "The seam between improvise-core and the incremental circuit: the Derived trait, the Eager oracle and the differential harness (ADR 009 clause 2)." + +# ADR 009 clause 2: depends on improvise-core, never the other way round. The +# `zset` edge arrives with the first backend that uses it (step 3), not before. +[dependencies] +improvise-core = { path = "../improvise-core" } + +[dev-dependencies] +improvise-io = { path = "../improvise-io" } diff --git a/crates/improvise-incremental/src/eager.rs b/crates/improvise-incremental/src/eager.rs new file mode 100644 index 00000000..36547f39 --- /dev/null +++ b/crates/improvise-incremental/src/eager.rs @@ -0,0 +1,42 @@ +//! Today's evaluator behind the trait. Temporary (ADR 009 clause 2). + +use crate::{Derived, Edit, Maintained}; +use improvise_core::model::cell::{CellKey, CellValue}; +use improvise_core::model::{Aggregation, Model}; + +/// A model plus the None categories its formulas were last recomputed under. +/// It adds no logic: every answer is a call into `Model`. +#[derive(Debug, Clone)] +pub struct Eager { + model: Model, + none_cats: Vec, +} + +impl Eager { + pub fn new(mut model: Model, none_cats: Vec) -> Self { + model.recompute_formulas(&none_cats); + Eager { model, none_cats } + } + + pub fn model(&self) -> &Model { + &self.model + } +} + +impl Derived for Eager { + fn value(&self, key: &CellKey, agg: Aggregation) -> Option { + self.model.evaluate_aggregated(key, agg) + } + + fn raw_fold(&self, partial: &CellKey) -> Option { + self.model + .evaluate_aggregated(partial, Aggregation::OverHidden) + } +} + +impl Maintained for Eager { + fn apply(&mut self, edit: &Edit) { + edit.apply(&mut self.model); + self.model.recompute_formulas(&self.none_cats); + } +} diff --git a/crates/improvise-incremental/src/edit.rs b/crates/improvise-incremental/src/edit.rs new file mode 100644 index 00000000..c2036ffc --- /dev/null +++ b/crates/improvise-incremental/src/edit.rs @@ -0,0 +1,46 @@ +//! One mutation of a model, as data, so a sequence can be replayed on two backends. + +use improvise_core::formula::ast::{AggFunc, Formula}; +use improvise_core::model::Model; +use improvise_core::model::cell::{CellKey, CellValue}; + +#[derive(Debug, Clone)] +pub enum Edit { + SetCell(CellKey, CellValue), + ClearCell(CellKey), + AddFormula(Formula), + RemoveFormula { + target: String, + target_category: String, + }, + SetMeasureAgg { + measure: String, + func: AggFunc, + }, +} + +impl Edit { + /// The one place an edit becomes a call on the model. + pub fn apply(&self, model: &mut Model) { + match self { + Edit::SetCell(key, value) => model.set_cell(key.clone(), value.clone()), + Edit::ClearCell(key) => model.clear_cell(key), + Edit::AddFormula(formula) => model.add_formula(formula.clone()), + Edit::RemoveFormula { + target, + target_category, + } => model.remove_formula(target, target_category), + Edit::SetMeasureAgg { measure, func } => { + model.measure_agg.insert(measure.clone(), func.clone()); + } + } + } + + /// The key an edit names, if it names one: always probed after it. + pub fn key(&self) -> Option<&CellKey> { + match self { + Edit::SetCell(key, _) | Edit::ClearCell(key) => Some(key), + _ => None, + } + } +} diff --git a/crates/improvise-incremental/src/harness.rs b/crates/improvise-incremental/src/harness.rs new file mode 100644 index 00000000..b3a14440 --- /dev/null +++ b/crates/improvise-incremental/src/harness.rs @@ -0,0 +1,156 @@ +//! The differential harness: one edit sequence, two backends, every probe after every step. + +use crate::{Derived, Eager, Edit}; +use improvise_core::model::cell::{CellKey, CellValue}; +use improvise_core::model::{Aggregation, Model}; +use std::collections::HashSet; +use std::fmt; + +/// A backend that holds state of its own and is told each edit. +pub trait Maintained: Derived { + fn apply(&mut self, edit: &Edit); +} + +/// One question put to both backends. +#[derive(Debug, Clone, PartialEq)] +pub enum Probe { + Value(CellKey, Aggregation), + RawFold(CellKey), +} + +impl Probe { + pub fn ask(&self, backend: &dyn Derived) -> Option { + match self { + Probe::Value(key, agg) => backend.value(key, *agg), + Probe::RawFold(partial) => backend.raw_fold(partial), + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Divergence { + /// 0 is the model as built, `n` the state after edit `n`. + pub step: usize, + pub probe: Probe, + pub eager: Option, + pub candidate: Option, +} + +impl fmt::Display for Divergence { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "divergence at step {}: {:?}: eager {:?} != candidate {:?}", + self.step, self.probe, self.eager, self.candidate + ) + } +} + +/// How many states and how many answers were compared: a run that compared +/// nothing must be visible as such. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Report { + pub steps: usize, + pub probes: usize, +} + +/// Values agree when equal by float rules with every NaN one value, so a NaN +/// answer is not a divergence from itself. +pub fn same_value(a: &Option, b: &Option) -> bool { + match (a, b) { + (Some(CellValue::Number(x)), Some(CellValue::Number(y))) => { + x == y || (x.is_nan() && y.is_nan()) + } + _ => a == b, + } +} + +/// Every question worth asking of `model`: each stored key, each partial of +/// one and each formula cell over them, under both aggregations; and the raw +/// fold of every partial. +pub fn probes(model: &Model) -> Vec { + let stored: Vec = model.data.iter_cells().map(|(k, _)| k).collect(); + let partials: Vec = stored + .iter() + .flat_map(|k| k.0.iter().map(|(c, _)| k.without(c))) + .chain(std::iter::once(CellKey::new(vec![]))) + .collect(); + let formula_cells = stored.iter().flat_map(|k| { + model + .formulas() + .iter() + .map(move |f| k.clone().with(&f.target_category, &f.target)) + }); + let keys = stored + .iter() + .cloned() + .chain(partials.iter().cloned()) + .chain(formula_cells); + let values = keys.flat_map(|k| { + [Aggregation::Exact, Aggregation::OverHidden] + .into_iter() + .map(move |a| Probe::Value(k.clone(), a)) + }); + let folds = partials.iter().cloned().map(Probe::RawFold); + let mut seen: HashSet<(CellKey, u8)> = HashSet::new(); + values + .chain(folds) + .filter(|p| { + let tag = match p { + Probe::Value(k, Aggregation::Exact) => (k.clone(), 0), + Probe::Value(k, Aggregation::OverHidden) => (k.clone(), 1), + Probe::RawFold(k) => (k.clone(), 2), + }; + seen.insert(tag) + }) + .collect() +} + +fn compare( + step: usize, + eager: &Eager, + candidate: &dyn Derived, + edit: Option<&Edit>, +) -> Result { + let mut asked = probes(eager.model()); + let named = edit.and_then(Edit::key).into_iter().flat_map(|k| { + [Aggregation::Exact, Aggregation::OverHidden] + .into_iter() + .map(|a| Probe::Value(k.clone(), a)) + }); + asked.extend(named); + for probe in &asked { + let (want, got) = (probe.ask(eager), probe.ask(candidate)); + if !same_value(&want, &got) { + return Err(Divergence { + step, + probe: probe.clone(), + eager: want, + candidate: got, + }); + } + } + Ok(asked.len()) +} + +/// Applies `edits` to `candidate` and to an `Eager` over `model`, and +/// compares every probe at step 0 and after each edit. `candidate` must have +/// been built from `model`, with the same `none_cats`. +pub fn differential( + model: &Model, + none_cats: &[String], + mut candidate: C, + edits: &[Edit], +) -> Result { + let mut eager = Eager::new(model.clone(), none_cats.to_vec()); + let mut probes_run = compare(0, &eager, &candidate, None)?; + for (n, edit) in edits.iter().enumerate() { + eager.apply(edit); + candidate.apply(edit); + probes_run += compare(n + 1, &eager, &candidate, Some(edit))?; + } + Ok(Report { + steps: edits.len() + 1, + probes: probes_run, + }) +} diff --git a/crates/improvise-incremental/src/lib.rs b/crates/improvise-incremental/src/lib.rs new file mode 100644 index 00000000..5ac6b1c8 --- /dev/null +++ b/crates/improvise-incremental/src/lib.rs @@ -0,0 +1,24 @@ +//! The plug: what the evaluator reads, and the oracle that answers it today. +//! Reasoning: `context/code/improvise-incremental.md`. + +mod eager; +mod edit; +mod harness; + +pub use eager::Eager; +pub use edit::Edit; +pub use harness::{Divergence, Maintained, Probe, Report, differential, probes, same_value}; + +use improvise_core::model::Aggregation; +use improvise_core::model::cell::{CellKey, CellValue}; + +/// The two things the evaluator reads (ADR 009 clause 2). +pub trait Derived { + /// The value at `key`: the formula result when a formula owns it, else the + /// cell as stored or folded over what `agg` hides. `Model::evaluate_aggregated`. + fn value(&self, key: &CellKey, agg: Aggregation) -> Option; + + /// The raw fold of the stored cells that match `partial`, by the measure's + /// aggregation. Never a formula. + fn raw_fold(&self, partial: &CellKey) -> Option; +} diff --git a/crates/improvise-incremental/tests/oracle.rs b/crates/improvise-incremental/tests/oracle.rs new file mode 100644 index 00000000..50df8cdf --- /dev/null +++ b/crates/improvise-incremental/tests/oracle.rs @@ -0,0 +1,338 @@ +//! `Eager` against the evaluator and against hand-computed answers, and the +//! differential harness against backends that are wrong on purpose. +//! Evidence: `context/test-evidence/improvise-incremental.md`. + +use improvise_core::formula::ast::AggFunc; +use improvise_core::formula::parse_formula; +use improvise_core::model::cell::{CellKey, CellValue}; +use improvise_core::model::{Aggregation, Model}; +use improvise_core::view::Axis; +use improvise_incremental::{Derived, Eager, Edit, Maintained, Probe, differential, probes}; +use std::path::Path; + +fn key(region: &str, product: &str, measure: &str) -> CellKey { + CellKey::new(vec![ + ("Region".into(), region.into()), + ("Product".into(), product.into()), + ("_Measure".into(), measure.into()), + ]) +} + +fn partial(product: &str, measure: &str) -> CellKey { + CellKey::new(vec![ + ("Product".into(), product.into()), + ("_Measure".into(), measure.into()), + ]) +} + +fn num(n: f64) -> Option { + Some(CellValue::Number(n)) +} + +fn text(s: &str) -> Option { + Some(CellValue::Text(s.into())) +} + +fn mixed() -> Option { + Some(CellValue::Error("mixed".into())) +} + +/// Region is the None category. Revenue and Cost are numbers; Note is text, +/// unanimous under A and conflicting under B. +fn hand_model() -> Model { + let mut m = Model::new("hand"); + for (cat, items) in [("Region", ["East", "West"]), ("Product", ["A", "B"])] { + m.add_category(cat).unwrap(); + for item in items { + m.category_mut(cat).unwrap().add_item(item); + } + } + for measure in ["Revenue", "Cost", "Note"] { + m.category_mut("_Measure").unwrap().add_item(measure); + } + let rows = [ + ("East", "A", 10.0, 4.0, "n", "n"), + ("West", "A", 5.0, 2.0, "n", "n"), + ("East", "B", 7.0, 3.0, "x", "x"), + ("West", "B", 1.0, 1.0, "y", "y"), + ]; + for (r, p, rev, cost, note, _) in rows { + m.set_cell(key(r, p, "Revenue"), CellValue::Number(rev)); + m.set_cell(key(r, p, "Cost"), CellValue::Number(cost)); + m.set_cell(key(r, p, "Note"), CellValue::Text(note.into())); + } + m.add_formula(parse_formula("Profit = Revenue - Cost", "_Measure").unwrap()); + m +} + +fn hand_eager() -> Eager { + Eager::new(hand_model(), vec!["Region".into()]) +} + +fn hand_edits() -> Vec { + vec![ + Edit::SetCell(key("East", "A", "Revenue"), CellValue::Number(20.0)), + Edit::SetMeasureAgg { + measure: "Revenue".into(), + func: AggFunc::Max, + }, + Edit::ClearCell(key("West", "A", "Revenue")), + Edit::SetCell(key("West", "B", "Revenue"), CellValue::Text("oops".into())), + Edit::AddFormula(parse_formula("Double = Revenue * 2", "_Measure").unwrap()), + Edit::RemoveFormula { + target: "Profit".into(), + target_category: "_Measure".into(), + }, + ] +} + +#[test] +fn eager_raw_fold_sums_by_default() { + assert_eq!(hand_eager().raw_fold(&partial("A", "Revenue")), num(15.0)); +} + +#[test] +fn eager_raw_fold_follows_the_measures_aggregation() { + let mut eager = hand_eager(); + eager.apply(&Edit::SetMeasureAgg { + measure: "Revenue".into(), + func: AggFunc::Max, + }); + assert_eq!(eager.raw_fold(&partial("A", "Revenue")), num(10.0)); + assert_eq!(eager.raw_fold(&partial("A", "Cost")), num(6.0)); +} + +#[test] +fn eager_raw_fold_of_text_is_unanimous_or_mixed() { + let eager = hand_eager(); + assert_eq!(eager.raw_fold(&partial("A", "Note")), text("n")); + assert_eq!(eager.raw_fold(&partial("B", "Note")), mixed()); +} + +#[test] +fn eager_value_reads_a_formula_exactly_and_folded() { + let eager = hand_eager(); + assert_eq!( + eager.value(&key("East", "A", "Profit"), Aggregation::Exact), + num(6.0) + ); + assert_eq!( + eager.value(&partial("A", "Profit"), Aggregation::OverHidden), + num(9.0) + ); +} + +#[test] +fn eager_follows_an_edit_to_the_cell_a_fold_reads() { + let mut eager = hand_eager(); + eager.apply(&Edit::SetCell( + key("East", "A", "Revenue"), + CellValue::Number(20.0), + )); + assert_eq!(eager.raw_fold(&partial("A", "Revenue")), num(25.0)); + assert_eq!( + eager.value(&partial("A", "Profit"), Aggregation::OverHidden), + num(19.0) + ); +} + +#[test] +fn eager_numbers_among_text_are_mixed() { + let mut eager = hand_eager(); + eager.apply(&Edit::SetCell( + key("West", "B", "Revenue"), + CellValue::Text("oops".into()), + )); + assert_eq!(eager.raw_fold(&partial("B", "Revenue")), mixed()); +} + +fn corpus() -> Vec<(String, Model, Vec)> { + let root = Path::new(env!("CARGO_MANIFEST_DIR")).join("../.."); + let mut out = Vec::new(); + for file in ["examples/demo.improv", "web/demo.improv"] { + let wb = improvise_io::persistence::load(&root.join(file)).unwrap(); + for (name, view) in &wb.views { + let none = view + .categories_on(Axis::None) + .into_iter() + .map(String::from) + .collect(); + out.push((format!("{file}:{name}"), wb.model.clone(), none)); + } + } + out.push(("hand".into(), hand_model(), vec!["Region".into()])); + out +} + +/// Edits built from the model's own first cell: overwrite, text, clear, a new +/// record, a new aggregation, and the first formula removed then restored. +fn edits_for(model: &Model) -> Vec { + let Some((first, _)) = model.data.iter_cells().next() else { + return vec![]; + }; + let (last_cat, _) = first.0.last().unwrap().clone(); + let measure = first.get("_Measure").map(String::from); + let fresh = first.clone().with(last_cat, "Zz-new"); + let mut edits = vec![ + Edit::SetCell(first.clone(), CellValue::Number(7.5)), + Edit::SetCell(first.clone(), CellValue::Text("t".into())), + Edit::SetCell(fresh.clone(), CellValue::Number(3.0)), + Edit::ClearCell(first), + ]; + edits.extend(measure.map(|m| Edit::SetMeasureAgg { + measure: m, + func: AggFunc::Max, + })); + if let Some(f) = model.formulas().first() { + edits.push(Edit::RemoveFormula { + target: f.target.clone(), + target_category: f.target_category.clone(), + }); + edits.push(Edit::AddFormula(f.clone())); + } + edits.push(Edit::ClearCell(fresh)); + edits +} + +#[test] +fn eager_matches_the_evaluator_on_the_shipped_documents() { + for (name, model, none) in corpus() { + let eager = Eager::new(model.clone(), none.clone()); + let mut direct = model.clone(); + direct.recompute_formulas(&none); + let asked = probes(eager.model()); + assert!(!asked.is_empty(), "{name}: no probes"); + for probe in asked { + let want = match &probe { + Probe::Value(k, a) => direct.evaluate_aggregated(k, *a), + Probe::RawFold(k) => direct.evaluate_aggregated(k, Aggregation::OverHidden), + }; + assert_eq!(probe.ask(&eager), want, "{name}: {probe:?}"); + } + } +} + +#[test] +fn eager_agrees_with_itself_over_every_corpus_edit_sequence() { + for (name, model, none) in corpus() { + let edits = edits_for(&model); + let report = differential( + &model, + &none, + Eager::new(model.clone(), none.clone()), + &edits, + ) + .unwrap_or_else(|d| panic!("{name}: {d}")); + assert_eq!(report.steps, edits.len() + 1, "{name}"); + assert!(report.probes > 0, "{name}"); + } +} + +/// A wrong backend: an `Eager` told every edit, answering one thing wrongly. +#[derive(Clone, Copy)] +enum Fault { + IgnoresAggregation, + IgnoresMeasureAggregation, + GoesStaleAfterTwoEdits, + IgnoresClear, +} + +struct Rival { + inner: Eager, + fault: Fault, + seen: usize, +} + +impl Rival { + fn of(fault: Fault) -> Self { + Rival { + inner: hand_eager(), + fault, + seen: 0, + } + } +} + +impl Derived for Rival { + fn value(&self, key: &CellKey, agg: Aggregation) -> Option { + match self.fault { + Fault::IgnoresAggregation => self.inner.value(key, Aggregation::Exact), + _ => self.inner.value(key, agg), + } + } + + fn raw_fold(&self, partial: &CellKey) -> Option { + self.inner.raw_fold(partial) + } +} + +impl Maintained for Rival { + fn apply(&mut self, edit: &Edit) { + self.seen += 1; + let skip = match (self.fault, edit) { + (Fault::IgnoresMeasureAggregation, Edit::SetMeasureAgg { .. }) => true, + (Fault::GoesStaleAfterTwoEdits, _) => self.seen > 2, + (Fault::IgnoresClear, Edit::ClearCell(_)) => true, + _ => false, + }; + if !skip { + self.inner.apply(edit); + } + } +} + +fn run_rival( + fault: Fault, +) -> Result { + differential( + &hand_model(), + &["Region".to_string()], + Rival::of(fault), + &hand_edits(), + ) +} + +#[test] +fn the_harness_passes_a_backend_that_is_right() { + let report = differential( + &hand_model(), + &["Region".to_string()], + hand_eager(), + &hand_edits(), + ) + .unwrap(); + assert_eq!(report.steps, hand_edits().len() + 1); +} + +#[test] +fn the_harness_catches_a_backend_that_ignores_the_aggregation() { + let d = run_rival(Fault::IgnoresAggregation).unwrap_err(); + assert_eq!(d.step, 0); + assert!(d.to_string().starts_with("divergence at step 0:"), "{d}"); +} + +#[test] +fn the_harness_catches_a_backend_that_ignores_the_measure_aggregation() { + let d = run_rival(Fault::IgnoresMeasureAggregation).unwrap_err(); + assert_eq!(d.step, 2, "{d}"); +} + +#[test] +fn the_harness_catches_a_backend_that_goes_stale_after_two_edits() { + let d = run_rival(Fault::GoesStaleAfterTwoEdits).unwrap_err(); + assert_eq!(d.step, 3, "{d}"); +} + +#[test] +fn the_harness_catches_a_backend_that_ignores_a_clear() { + let d = run_rival(Fault::IgnoresClear).unwrap_err(); + assert_eq!(d.step, 3, "{d}"); + assert!(d.to_string().contains("eager"), "{d}"); +} + +#[test] +fn the_harness_names_the_probe_the_two_backends_disagree_on() { + let d = run_rival(Fault::IgnoresClear).unwrap_err(); + assert_ne!(d.eager, d.candidate); + assert!(matches!(d.probe, Probe::Value(..) | Probe::RawFold(_))); +} diff --git a/nix/ci.nix b/nix/ci.nix index 3a35eb86..1b0500f3 100644 --- a/nix/ci.nix +++ b/nix/ci.nix @@ -50,6 +50,8 @@ "numtower" # ADR 009 clause 1: std-only; nothing depends on it yet. "zset" + # ADR 009 clause 2: the Derived trait, Eager and the differential harness. + "improvise-incremental" ]; pFlags = crates: lib.concatMapStringsSep " " (c: "-p ${c}") crates; diff --git a/scripts/build-doc-site.mjs b/scripts/build-doc-site.mjs index 0ccf5cc6..2fdb30ca 100644 --- a/scripts/build-doc-site.mjs +++ b/scripts/build-doc-site.mjs @@ -69,6 +69,7 @@ const SECTIONS = [ ["context/code/gp.md", "code/gp", "gp-tree and improvise-gp"], ["context/code/numtower.md", "code/numtower", "numtower, the numeric tower"], ["context/code/zset.md", "code/zset", "zset, the Z-set group"], + ["context/code/improvise-incremental.md", "code/improvise-incremental", "improvise-incremental, the plug"], ["context/code/kb-tool.md", "code/kb-tool", "The kb tool"], ["context/code/tooling.md", "code/tooling", "The repository's own checkers"], ], @@ -89,6 +90,7 @@ const SECTIONS = [ ["context/test-evidence/gp.md", "test-evidence/gp", "gp-tree and improvise-gp"], ["context/test-evidence/numtower.md", "test-evidence/numtower", "numtower"], ["context/test-evidence/zset.md", "test-evidence/zset", "zset"], + ["context/test-evidence/improvise-incremental.md", "test-evidence/improvise-incremental", "improvise-incremental"], ["context/test-evidence/tooling.md", "test-evidence/tooling", "The repository's own gates"], ["context/test-evidence/layout-cost.md", "test-evidence/layout-cost", "Layout and keypress cost"], ["context/test-evidence/scale-bisect.md", "test-evidence/scale-bisect", "Scale bisect"], From 7b8402a060a16ddd132a2de7a797dea4a862352d Mon Sep 17 00:00:00 2001 From: Ed Langley Date: Fri, 9 Oct 2026 23:48:08 -0700 Subject: [PATCH 05/11] Change num-bigint version to 0.4 Downgrade num-bigint dependency from version 0.5 to 0.4. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- crates/numtower/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/numtower/Cargo.toml b/crates/numtower/Cargo.toml index 3d9b93c0..54ca4e27 100644 --- a/crates/numtower/Cargo.toml +++ b/crates/numtower/Cargo.toml @@ -12,7 +12,7 @@ categories = ["mathematics"] [dependencies] rust_decimal = { version = "1.43", default-features = false, features = ["std"] } num-rational = { version = "0.4.2", default-features = false } -num-bigint = { version = "0.5", default-features = false, features = ["std"] } +num-bigint = { version = "0.4", default-features = false, features = ["std"] } num-integer = { version = "0.1", default-features = false } num-traits = { version = "0.2", default-features = false, features = ["std"] } From b89d19a7840bf2fbeb94c9e7af19d7ca4cb9245e Mon Sep 17 00:00:00 2001 From: "Claude (adr009-derived)" Date: Fri, 9 Oct 2026 23:51:16 -0700 Subject: [PATCH 06/11] style(incremental): shorten comment runs to the cap (improvise-t8ow) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- crates/improvise-incremental/src/harness.rs | 10 ++++------ crates/improvise-incremental/tests/oracle.rs | 3 +-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/crates/improvise-incremental/src/harness.rs b/crates/improvise-incremental/src/harness.rs index b3a14440..11c20dc2 100644 --- a/crates/improvise-incremental/src/harness.rs +++ b/crates/improvise-incremental/src/harness.rs @@ -65,9 +65,8 @@ pub fn same_value(a: &Option, b: &Option) -> bool { } } -/// Every question worth asking of `model`: each stored key, each partial of -/// one and each formula cell over them, under both aggregations; and the raw -/// fold of every partial. +/// Every question worth asking of `model` (see the doc): stored keys, +/// their partials and formula cells, both aggregations, and raw folds. pub fn probes(model: &Model) -> Vec { let stored: Vec = model.data.iter_cells().map(|(k, _)| k).collect(); let partials: Vec = stored @@ -133,9 +132,8 @@ fn compare( Ok(asked.len()) } -/// Applies `edits` to `candidate` and to an `Eager` over `model`, and -/// compares every probe at step 0 and after each edit. `candidate` must have -/// been built from `model`, with the same `none_cats`. +/// Runs `edits` on `candidate` and on `Eager`, comparing every probe at each +/// step. `candidate` is built from `model` with the same `none_cats`. pub fn differential( model: &Model, none_cats: &[String], diff --git a/crates/improvise-incremental/tests/oracle.rs b/crates/improvise-incremental/tests/oracle.rs index 50df8cdf..8b44a697 100644 --- a/crates/improvise-incremental/tests/oracle.rs +++ b/crates/improvise-incremental/tests/oracle.rs @@ -1,5 +1,4 @@ -//! `Eager` against the evaluator and against hand-computed answers, and the -//! differential harness against backends that are wrong on purpose. +//! `Eager` against the evaluator, and the harness against wrong backends. //! Evidence: `context/test-evidence/improvise-incremental.md`. use improvise_core::formula::ast::AggFunc; From 7eaeac7263d4777aea5418c50e9945f7acfb87b9 Mon Sep 17 00:00:00 2001 From: "Claude (adr009-derived)" Date: Sat, 10 Oct 2026 00:22:04 -0700 Subject: [PATCH 07/11] fix(incremental): probe folded formulas, sub-partials, groups and removed formulas; raw_fold is never a formula (improvise-t8ow) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- Cargo.lock | 1 + context/code/improvise-incremental.md | 70 ++-- .../test-evidence/improvise-incremental.md | 143 ++++++-- crates/improvise-incremental/Cargo.toml | 1 + crates/improvise-incremental/src/eager.rs | 8 +- crates/improvise-incremental/src/harness.rs | 133 +++++--- crates/improvise-incremental/src/lib.rs | 7 +- crates/improvise-incremental/tests/oracle.rs | 322 ++++++++++++++++-- 8 files changed, 552 insertions(+), 133 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b05c1bdb..afad89ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -958,6 +958,7 @@ version = "0.1.0" dependencies = [ "improvise-core", "improvise-io", + "proptest", ] [[package]] diff --git a/context/code/improvise-incremental.md b/context/code/improvise-incremental.md index 1c150859..85078d94 100644 --- a/context/code/improvise-incremental.md +++ b/context/code/improvise-incremental.md @@ -25,50 +25,56 @@ Clause 2 names the trait and says what it carries ("the formula result at a key, fold of the cells that match a partial key") and nothing else. These are the readings taken. 1. **`Derived` lives in this crate, not in improvise-core.** The ADR says improvise-core - "gains a trait". Putting it there changes an existing crate's source, which this step does - not do. Nothing is lost: the seam crate depends on core and core never on `zset`, which is - the clause's actual constraint. Moving the trait into core, when the evaluator is made to - read through it, is a move of one file. + "gains a trait". Putting it there changes an existing crate's source, which the brief for + this step ruled out, and the brief was ambiguous about it. This departs from the accepted + ADR's text, so it is flagged to the user and not decided here: improvise-bw4p.2 moves it + (one file and a `pub use`, since the trait names only core types). While it sits + downstream, core cannot read through it, which is the clause's point. 2. **Two methods, the minimum.** `value(key, agg)` is the formula result at a key, or the cell as stored or folded; `raw_fold(partial)` is the fold of matching stored cells. `agg` is - `Aggregation`, the evaluator's own type, because exact and over-hidden reads differ and - the harness must be able to ask both. Collapsed-group `covers`, totals and occupancy are - not in the trait: nothing reads them through it yet, and a method with no caller is - designed blind. The ADR's differential test compares "every drawn cell, total and occupancy - count"; those enter with the steps that maintain them. -3. **`Eager::raw_fold` is `evaluate_aggregated(partial, OverHidden)`.** The evaluator's raw - fold (`aggregate_raw`, `aggregate_cell_values`) is private to core, and wrapping without - editing core leaves the public path. The two agree for a partial that names no formula - target and no collapsed group, which is what the harness probes. For a partial that does - name a formula target the cache answers instead, so `raw_fold` is not "never a formula" - there. Step 3 should expose the raw fold from core when it moves the evaluator behind the - trait, and `Eager` should call that. + `Aggregation`, the evaluator's own type. Hidden-item `covers`, totals and occupancy are not + in the trait, so the differential cannot probe them, and a hidden item (view state) cannot + be exercised at all. The ADR's differential compares "every drawn cell, total and occupancy + count"; improvise-bw4p.3 adds them. A group is exercised: a stored key with one coordinate + replaced by its item's group is a probe. +3. **`raw_fold` is never a formula, and `Eager` enforces it.** For a partial naming a formula + target `Eager::raw_fold` is `None`; otherwise it is `evaluate_aggregated(partial, OverHidden)`, + because the evaluator's own raw fold (`aggregate_raw`, `aggregate_cell_values`) is private to + core. Calling it through the public path is exact for any partial that names no formula + target. improvise-bw4p.2 exposes the raw fold from core so `Eager` stops going round. 4. **`Eager` recomputes formulas after every edit.** Production does it in `rebuild_layout` (`Model::recompute_formulas(none_cats)`), and an over-hidden read of a formula cell reads the cache it fills. So `Eager` carries the None categories of the view it stands for and recomputes under them after each edit, as a layout rebuild does. 5. **`Edit` is the vocabulary of the harness, not of the wire.** Five variants, each one public `Model` call. A later step adds variants for what it maintains (an item added, a - category removed); the harness does not care which. + category removed); the harness does not care which. An `Edit` fault reaches both sides of a + differential alike, so `Eager`'s handling of each edit is pinned by direct tests. 6. **Values agree by float rules with every NaN one value** (`same_value`), the rule clause 3 - states for cell deltas. A NaN answer is not a divergence from itself. Signed zero compares - equal, so a later `ExactSum` cannot be told from eager's sum by the sign of a zero here; - clause 8 has its own property test for that. -7. **No `zset` dependency yet.** The brief and the ADR name it, but nothing in this step uses - a Z-set, and an unused dependency is noise. It arrives with the first backend, as the - cell delta of step 3. + states for cell deltas. Signed zero compares equal, so a later `ExactSum` cannot be told + from eager's sum by the sign of a zero here; clause 8 has its own property test for that. +7. **No `zset` dependency yet.** Nothing in this step uses a Z-set. It arrives with the first + backend, as the cell delta of step 3. ## What the harness checks `differential(model, none_cats, candidate, edits)` builds `Eager` over a clone of the model, -applies each edit to both, and after step 0 and after every edit asks both every probe. A -probe set is derived from the post-edit model: each stored key, each partial of one and each -formula cell over them under both aggregations, plus the raw fold of every partial. The key an -edit names is probed too, so a cleared cell is asked about after it is gone. The first -disagreement is returned as a `Divergence` whose message reads -`divergence at step N: : eager != candidate `. A pass returns a `Report` of how -many states and answers were compared, so a run that compared nothing shows as zero. +applies each edit to both, and after step 0 and after every edit asks both every probe. The +probe set **accumulates**: probes from the model at every earlier step stay asked, so a backend +that goes on answering for a removed formula diverges. A pass returns a `Report` of how many +states and answers were compared. + +`probes(model)` takes the base keys (each stored key, and each with one coordinate replaced by +its item's group), every sub-partial of a base key dropping at most `MAX_DROPPED = 3` +coordinates plus the empty key, and each formula's target over each of those. Each key is asked +as an exact value, an over-hidden value and a raw fold. A fold dropping more than three +coordinates from a stored key is not asked about; the cost is the number of subsets. `edit_probes` +adds the key an edit names, so a cleared cell is asked about after it is gone. A divergence +reads `divergence at step N: : eager != candidate `. The corpus the tests use is `examples/demo.improv` and `web/demo.improv`, loaded through -`improvise_io::persistence::load`, every view's None categories in turn, plus a hand-built -model with formulas, text and mixed values. +`improvise_io::persistence::load`, and hand-built models (formulas, text, mixed values, a group). +`eager_matches_the_evaluator_on_the_shipped_documents` takes every view's None categories; the +differential runs take the first per document, and the largest document only its first four +edits, to keep the binary under two seconds in a debug build. A proptest (256 cases) runs random +edit sequences against a candidate that rebuilds an `Eager` from scratch on each edit. diff --git a/context/test-evidence/improvise-incremental.md b/context/test-evidence/improvise-incremental.md index 855fd71e..57e0d639 100644 --- a/context/test-evidence/improvise-incremental.md +++ b/context/test-evidence/improvise-incremental.md @@ -8,25 +8,47 @@ reasoning is in `context/code/improvise-incremental.md`; the decisions are ADR 0 harness reports the divergence. They run on every build, so each rival is watched failing on every run and not once by hand. -**Injected in the source.** Six faults were also put into `src/eager.rs` and `src/harness.rs` -one at a time, each run against the whole suite and each reverted and followed by a full -rerun. The failing tests, by name: -- `Eager::value` ignores its `Aggregation` (always `Exact`): - `eager_value_reads_a_formula_exactly_and_folded`, `eager_follows_an_edit_to_the_cell_a_fold_reads`, - `eager_matches_the_evaluator_on_the_shipped_documents`, - `the_harness_catches_a_backend_that_ignores_the_aggregation`; +**Injected in the source.** Seventeen faults were put into `src/eager.rs`, `src/harness.rs` +and `src/edit.rs` one at a time, each run against the whole suite and each reverted and +followed by a full rerun. The failing tests, by name (a fault no test names survived, and +none did): +- `Eager::value` ignores its `Aggregation`: `eager_follows_an_edit_to_the_cell_a_fold_reads`, + `eager_matches_the_evaluator_on_the_shipped_documents`, `eager_raw_fold_is_never_a_formula`, + `eager_value_reads_a_formula_exactly_and_folded`, + `the_harness_catches_a_backend_that_ignores_the_aggregation`, + `the_harness_catches_a_wrong_folded_formula_value`; - `Eager::raw_fold` reads `Exact`: `eager_raw_fold_sums_by_default`, `eager_raw_fold_follows_the_measures_aggregation`, `eager_raw_fold_of_text_is_unanimous_or_mixed`, `eager_numbers_among_text_are_mixed`, `eager_follows_an_edit_to_the_cell_a_fold_reads`, - `eager_matches_the_evaluator_on_the_shipped_documents`; -- `Eager::apply` does not recompute formulas: `eager_follows_an_edit_to_the_cell_a_fold_reads`; + `eager_matches_the_evaluator_on_the_shipped_documents`, + `the_harness_catches_a_raw_fold_that_returns_a_formula`; +- `Eager::raw_fold` returns a formula's value: `eager_raw_fold_is_never_a_formula`, + `eager_matches_the_evaluator_on_the_shipped_documents`, + `the_harness_catches_a_raw_fold_that_returns_a_formula`; +- `Eager::apply` does not recompute formulas: `eager_follows_an_edit_to_the_cell_a_fold_reads`, + `a_maintained_eager_equals_a_fresh_one_over_random_edit_sequences`; - the harness compares only the first edit: `the_harness_catches_a_backend_that_ignores_a_clear`, - `the_harness_catches_a_backend_that_ignores_the_measure_aggregation`, - `the_harness_catches_a_backend_that_goes_stale_after_two_edits`, - `the_harness_names_the_probe_the_two_backends_disagree_on`; -- the harness never reports a divergence: the same four plus - `the_harness_catches_a_backend_that_ignores_the_aggregation`; -- `same_value` says everything agrees: `the_harness_catches_a_backend_that_ignores_the_aggregation`. + `…_ignores_the_measure_aggregation`, `…_goes_stale_after_two_edits`, + `the_harness_catches_a_backend_that_keeps_answering_for_a_removed_formula`; +- the harness never reports a divergence: all nine `the_harness_catches_*` tests; +- `same_value` always true: `same_value_follows_the_float_rules_and_is_exact_elsewhere` and four + `the_harness_catches_*` tests; +- `same_value` NaN unequal, signed zero by bits, any two text equal: each fails + `same_value_follows_the_float_rules_and_is_exact_elsewhere` and nothing else; +- `probes` omit formula cells: `probes_cover_folds_formulas_measures_and_groups` and four + `the_harness_catches_*` tests; +- `probes` drop at most one coordinate: `probes_cover_folds_formulas_measures_and_groups`, + `the_harness_catches_a_fault_that_only_shows_after_two_coordinates_are_dropped`; +- `probes` omit raw folds: `probes_cover_folds_formulas_measures_and_groups`, + `an_edit_names_its_key_as_two_value_probes_and_a_fold`, + `the_harness_catches_a_raw_fold_that_returns_a_formula`; +- `probes` omit group keys: `probes_cover_folds_formulas_measures_and_groups`, + `the_harness_catches_a_wrong_group_fold`; +- the probe history is forgotten between steps: `…_goes_stale_after_two_edits`, + `…_ignores_a_clear`, `the_harness_catches_a_backend_that_keeps_answering_for_a_removed_formula`; +- `edit_probes` names nothing: `an_edit_names_its_key_as_two_value_probes_and_a_fold`; +- `Edit::ClearCell` applied as `SetCell(0.0)`, which both sides of a differential share and so + only a direct `Eager` test can see: `eager_clear_cell_leaves_the_key_absent`. ## eager_raw_fold_sums_by_default @@ -69,34 +91,95 @@ categories, and the probe set is non-empty. Fails on both aggregation rivals. `differential` over a generated edit sequence on each corpus model returns a `Report` with `edits + 1` steps and a non-zero probe count. The count assertion is what a harness that -compared nothing would fail; the step count is what one that stopped early would fail. - +compared nothing would fail; the step count is what one that stopped early would fail._a ## the_harness_passes_a_backend_that_is_right -The control for the four `catches` tests: `Eager` as the candidate over the hand-built edits -is a pass, so a harness that rejects everything is seen. +The control for the `catches` tests: `Eager` as the candidate over the hand-built edits is a +pass, so a harness that rejects everything is seen. ## the_harness_catches_a_backend_that_ignores_the_aggregation -A candidate that reads every `value` as `Exact` diverges at step 0. A harness that only -compared after edits would not see it. +A candidate that reads every `value` as `Exact` diverges at step 0, first at the full-key +formula cell `{East, A, Profit}` over hidden (eager `None`, candidate `6`). ## the_harness_catches_a_backend_that_ignores_the_measure_aggregation -A candidate that drops `SetMeasureAgg` diverges at step 2, the edit that sets it. Fails on the -compare-first-edit-only rival. +A candidate that drops `SetMeasureAgg` diverges at step 2, the edit that sets it, on a Revenue key. ## the_harness_catches_a_backend_that_goes_stale_after_two_edits -A candidate that stops applying edits after the second diverges at step 3. Fails on the -compare-first-edit-only rival: a prefix of steps cannot see a backend that goes wrong late. +A candidate that stops applying edits after the second diverges at step 3, on a Revenue key. +A prefix of steps cannot see a backend that goes wrong late. ## the_harness_catches_a_backend_that_ignores_a_clear -A candidate that keeps a cleared cell diverges at step 3, and the message names the eager -answer. Fails on the compare-first-edit-only and never-fails rivals. +A candidate that keeps a cleared cell diverges at step 3 and the message names it. -## the_harness_names_the_probe_the_two_backends_disagree_on +## the_harness_catches_a_wrong_folded_formula_value -The `Divergence` carries a probe and two different answers, not only a message. Fails on the -never-fails rival (no divergence is returned at all). +Review of PR 343 (Codex P1): a rival wrong only at `value({Product=A, _Measure=Profit}, OverHidden)`, +the Profit cell a view with Region on None draws, passed 128 probes, because formula cells were +built over full keys only. Now the divergence is at step 0 on exactly that probe, eager `9`, +candidate `-999`. + +## the_harness_catches_a_backend_that_keeps_answering_for_a_removed_formula + +Review of PR 343: probes were rebuilt from the post-edit model, so a candidate that ignores +`RemoveFormula` was never asked about Profit again. Probes now accumulate over every step. The +divergence is at the last step, on a Profit key, eager `None`, candidate `Some`. + +## the_harness_catches_a_fault_that_only_shows_after_two_coordinates_are_dropped + +Review of PR 343 (Copilot): only one-coordinate partials and the empty key were probed. A rival +wrong only at `{_Measure=Revenue}` now diverges at step 0 on `Value({_Measure=Revenue}, Exact)`. +The bound is `MAX_DROPPED = 3` coordinates; a fold dropping more is not asked about. + +## the_harness_catches_a_raw_fold_that_returns_a_formula + +Review of PR 343 (Copilot): `raw_fold` is documented never to be a formula. A rival whose +`raw_fold` is `value(partial, OverHidden)` diverges at step 0 on a `RawFold` of a Profit partial +(eager `None`, candidate `Some`). It could not be seen while `Eager` itself returned the formula. + +## the_harness_catches_a_wrong_group_fold + +A group name stands in for an item in the probe keys. A rival wrong only at +`{Region=Coastal, Product=A, _Measure=Revenue}` diverges at step 0, eager `15`, candidate `-999`. + +## eager_folds_a_group_it_is_asked_about + +The group fold in the grouped model is East + West = 15 exactly, so the rival test above has a +true answer to differ from. + +## eager_raw_fold_is_never_a_formula + +At `{Product=A, _Measure=Profit}` the folded value is `9` and the raw fold is `None`. Fails on the +fault that lets `raw_fold` read the formula cache. + +## eager_clear_cell_leaves_the_key_absent + +After `ClearCell` the key reads `None` and the model holds no cell. A `ClearCell` applied as +`SetCell(0.0)` hits both sides of a differential identically, so only this direct test fails. + +## same_value_follows_the_float_rules_and_is_exact_elsewhere + +NaN equals NaN, `-0.0` equals `0.0`, `1.0` differs from `1.0000000000000002`, texts and errors +compare exactly, and `None` equals only `None`. Each of three one-line faults in `same_value` +(NaN unequal, signed zero by bits, any two texts equal) failed only this test before it existed. + +## probes_cover_folds_formulas_measures_and_groups + +`probes` includes a raw fold, a full key, a folded formula cell under both aggregations, the +two-dropped key `{_Measure=Revenue}`, the empty key and a group key. Review of PR 343 showed +`probes` omitting formula cells, `_Measure` keys or raw folds left every test green. + +## an_edit_names_its_key_as_two_value_probes_and_a_fold + +`edit_probes` of a `ClearCell` names the cleared key three ways, and of an edit naming no key +names nothing. + +## a_maintained_eager_equals_a_fresh_one_over_random_edit_sequences + +Clause 2 asks for a property test over a random edit sequence. A proptest (256 cases, up to four +edits of five kinds over the hand-built model) runs `differential` with a candidate that rebuilds +an `Eager` from scratch on every edit. It fails on the `Eager::apply`-skips-recompute fault, which +is the property: maintaining in place equals building afresh. diff --git a/crates/improvise-incremental/Cargo.toml b/crates/improvise-incremental/Cargo.toml index 7b6817bc..3da249b2 100644 --- a/crates/improvise-incremental/Cargo.toml +++ b/crates/improvise-incremental/Cargo.toml @@ -12,3 +12,4 @@ improvise-core = { path = "../improvise-core" } [dev-dependencies] improvise-io = { path = "../improvise-io" } +proptest = "1" diff --git a/crates/improvise-incremental/src/eager.rs b/crates/improvise-incremental/src/eager.rs index 36547f39..06362b3a 100644 --- a/crates/improvise-incremental/src/eager.rs +++ b/crates/improvise-incremental/src/eager.rs @@ -29,8 +29,12 @@ impl Derived for Eager { } fn raw_fold(&self, partial: &CellKey) -> Option { - self.model - .evaluate_aggregated(partial, Aggregation::OverHidden) + match self.model.formula_for(partial) { + Some(_) => None, + None => self + .model + .evaluate_aggregated(partial, Aggregation::OverHidden), + } } } diff --git a/crates/improvise-incremental/src/harness.rs b/crates/improvise-incremental/src/harness.rs index 11c20dc2..d4e45811 100644 --- a/crates/improvise-incremental/src/harness.rs +++ b/crates/improvise-incremental/src/harness.rs @@ -65,43 +65,87 @@ pub fn same_value(a: &Option, b: &Option) -> bool { } } -/// Every question worth asking of `model` (see the doc): stored keys, -/// their partials and formula cells, both aggregations, and raw folds. -pub fn probes(model: &Model) -> Vec { - let stored: Vec = model.data.iter_cells().map(|(k, _)| k).collect(); - let partials: Vec = stored - .iter() - .flat_map(|k| k.0.iter().map(|(c, _)| k.without(c))) - .chain(std::iter::once(CellKey::new(vec![]))) - .collect(); - let formula_cells = stored.iter().flat_map(|k| { - model - .formulas() - .iter() - .map(move |f| k.clone().with(&f.target_category, &f.target)) - }); - let keys = stored - .iter() - .cloned() - .chain(partials.iter().cloned()) - .chain(formula_cells); - let values = keys.flat_map(|k| { - [Aggregation::Exact, Aggregation::OverHidden] - .into_iter() - .map(move |a| Probe::Value(k.clone(), a)) - }); - let folds = partials.iter().cloned().map(Probe::RawFold); - let mut seen: HashSet<(CellKey, u8)> = HashSet::new(); - values - .chain(folds) - .filter(|p| { - let tag = match p { +/// The most coordinates a probed partial key drops from a stored key; the +/// empty key is probed as well. A fold dropping more is not asked about. +pub const MAX_DROPPED: usize = 3; + +/// The questions asked of a backend, once each, in the order first added. +#[derive(Default)] +struct Asked { + seen: HashSet<(CellKey, u8)>, + order: Vec, +} + +impl Asked { + fn extend(&mut self, probes: impl IntoIterator) { + for p in probes { + let tag = match &p { Probe::Value(k, Aggregation::Exact) => (k.clone(), 0), Probe::Value(k, Aggregation::OverHidden) => (k.clone(), 1), Probe::RawFold(k) => (k.clone(), 2), }; - seen.insert(tag) + if self.seen.insert(tag) { + self.order.push(p); + } + } + } +} + +fn all_three(key: CellKey) -> [Probe; 3] { + [ + Probe::Value(key.clone(), Aggregation::Exact), + Probe::Value(key.clone(), Aggregation::OverHidden), + Probe::RawFold(key), + ] +} + +/// Every key `key` keeps after dropping at most `MAX_DROPPED` coordinates. +fn sub_partials(key: &CellKey) -> impl Iterator + '_ { + let n = key.0.len().min(63); + (0..1u64 << n) + .filter(|mask| mask.count_ones() as usize <= MAX_DROPPED) + .map(move |mask| { + let kept = (0..n) + .filter(|i| mask >> i & 1 == 0) + .map(|i| key.0[i].clone()); + CellKey::new(kept.collect()) }) +} + +/// Every question worth asking of `model`; the bound and the key set are +/// in `context/code/improvise-incremental.md`. +pub fn probes(model: &Model) -> Vec { + let stored: Vec = model.data.iter_cells().map(|(k, _)| k).collect(); + let grouped = stored.iter().flat_map(|k| { + k.0.iter().filter_map(|(cat, item)| { + let group = model.category(cat)?.items.get(item)?.group.clone()?; + Some(k.clone().with(cat, group)) + }) + }); + let base: Vec = stored.iter().cloned().chain(grouped).collect(); + let partials = base + .iter() + .flat_map(sub_partials) + .chain(std::iter::once(CellKey::new(vec![]))); + let mut asked = Asked::default(); + for key in partials { + let formula_cells = model + .formulas() + .iter() + .map(|f| key.clone().with(&f.target_category, &f.target)) + .collect::>(); + asked.extend(all_three(key)); + asked.extend(formula_cells.into_iter().flat_map(all_three)); + } + asked.order +} + +/// What an edit names: its key, asked all three ways, after the edit. +pub fn edit_probes(edit: &Edit) -> Vec { + edit.key() + .cloned() + .into_iter() + .flat_map(all_three) .collect() } @@ -109,16 +153,9 @@ fn compare( step: usize, eager: &Eager, candidate: &dyn Derived, - edit: Option<&Edit>, + asked: &Asked, ) -> Result { - let mut asked = probes(eager.model()); - let named = edit.and_then(Edit::key).into_iter().flat_map(|k| { - [Aggregation::Exact, Aggregation::OverHidden] - .into_iter() - .map(|a| Probe::Value(k.clone(), a)) - }); - asked.extend(named); - for probe in &asked { + for probe in &asked.order { let (want, got) = (probe.ask(eager), probe.ask(candidate)); if !same_value(&want, &got) { return Err(Divergence { @@ -129,11 +166,11 @@ fn compare( }); } } - Ok(asked.len()) + Ok(asked.order.len()) } -/// Runs `edits` on `candidate` and on `Eager`, comparing every probe at each -/// step. `candidate` is built from `model` with the same `none_cats`. +/// Runs `edits` on `candidate` and on `Eager`, comparing every probe ever +/// asked (so a removed formula stays asked about) at each step. `candidate` is built from `model` with the same `none_cats`. pub fn differential( model: &Model, none_cats: &[String], @@ -141,11 +178,15 @@ pub fn differential( edits: &[Edit], ) -> Result { let mut eager = Eager::new(model.clone(), none_cats.to_vec()); - let mut probes_run = compare(0, &eager, &candidate, None)?; + let mut asked = Asked::default(); + asked.extend(probes(eager.model())); + let mut probes_run = compare(0, &eager, &candidate, &asked)?; for (n, edit) in edits.iter().enumerate() { eager.apply(edit); candidate.apply(edit); - probes_run += compare(n + 1, &eager, &candidate, Some(edit))?; + asked.extend(probes(eager.model())); + asked.extend(edit_probes(edit)); + probes_run += compare(n + 1, &eager, &candidate, &asked)?; } Ok(Report { steps: edits.len() + 1, diff --git a/crates/improvise-incremental/src/lib.rs b/crates/improvise-incremental/src/lib.rs index 5ac6b1c8..0f006f9b 100644 --- a/crates/improvise-incremental/src/lib.rs +++ b/crates/improvise-incremental/src/lib.rs @@ -7,7 +7,10 @@ mod harness; pub use eager::Eager; pub use edit::Edit; -pub use harness::{Divergence, Maintained, Probe, Report, differential, probes, same_value}; +pub use harness::{ + Divergence, MAX_DROPPED, Maintained, Probe, Report, differential, edit_probes, probes, + same_value, +}; use improvise_core::model::Aggregation; use improvise_core::model::cell::{CellKey, CellValue}; @@ -19,6 +22,6 @@ pub trait Derived { fn value(&self, key: &CellKey, agg: Aggregation) -> Option; /// The raw fold of the stored cells that match `partial`, by the measure's - /// aggregation. Never a formula. + /// aggregation. Never a formula: `None` for a partial naming a formula target. fn raw_fold(&self, partial: &CellKey) -> Option; } diff --git a/crates/improvise-incremental/tests/oracle.rs b/crates/improvise-incremental/tests/oracle.rs index 8b44a697..0ac13d5c 100644 --- a/crates/improvise-incremental/tests/oracle.rs +++ b/crates/improvise-incremental/tests/oracle.rs @@ -6,7 +6,10 @@ use improvise_core::formula::parse_formula; use improvise_core::model::cell::{CellKey, CellValue}; use improvise_core::model::{Aggregation, Model}; use improvise_core::view::Axis; -use improvise_incremental::{Derived, Eager, Edit, Maintained, Probe, differential, probes}; +use improvise_incremental::{ + Derived, Divergence, Eager, Edit, Maintained, Probe, differential, probes, same_value, +}; +use proptest::prelude::*; use std::path::Path; fn key(region: &str, product: &str, measure: &str) -> CellKey { @@ -150,13 +153,17 @@ fn corpus() -> Vec<(String, Model, Vec)> { let mut out = Vec::new(); for file in ["examples/demo.improv", "web/demo.improv"] { let wb = improvise_io::persistence::load(&root.join(file)).unwrap(); + let mut seen: Vec> = Vec::new(); for (name, view) in &wb.views { - let none = view + let none: Vec = view .categories_on(Axis::None) .into_iter() .map(String::from) .collect(); - out.push((format!("{file}:{name}"), wb.model.clone(), none)); + if !seen.contains(&none) { + seen.push(none.clone()); + out.push((format!("{file}:{name}"), wb.model.clone(), none)); + } } } out.push(("hand".into(), hand_model(), vec!["Region".into()])); @@ -204,6 +211,7 @@ fn eager_matches_the_evaluator_on_the_shipped_documents() { for probe in asked { let want = match &probe { Probe::Value(k, a) => direct.evaluate_aggregated(k, *a), + Probe::RawFold(k) if direct.formula_for(k).is_some() => None, Probe::RawFold(k) => direct.evaluate_aggregated(k, Aggregation::OverHidden), }; assert_eq!(probe.ask(&eager), want, "{name}: {probe:?}"); @@ -213,8 +221,18 @@ fn eager_matches_the_evaluator_on_the_shipped_documents() { #[test] fn eager_agrees_with_itself_over_every_corpus_edit_sequence() { + let mut files_done: Vec = Vec::new(); for (name, model, none) in corpus() { - let edits = edits_for(&model); + let file = name.split(':').next().unwrap().to_string(); + if files_done.contains(&file) { + continue; + } + files_done.push(file); + let mut edits = edits_for(&model); + // Probes grow with the cells squared-ish, and a debug build pays for it. + if model.data.iter_cells().count() > 40 { + edits.truncate(4); + } let report = differential( &model, &none, @@ -227,6 +245,29 @@ fn eager_agrees_with_itself_over_every_corpus_edit_sequence() { } } +fn grouped_model() -> Model { + let mut m = Model::new("grouped"); + m.add_category("Region").unwrap(); + m.add_category("Product").unwrap(); + m.category_mut("Region") + .unwrap() + .add_group(improvise_core::model::category::Group::new("Coastal")); + let region = m.category_mut("Region").unwrap(); + region.add_item_in_group("East", "Coastal"); + region.add_item_in_group("West", "Coastal"); + region.add_item("Inland"); + m.category_mut("Product").unwrap().add_item("A"); + m.category_mut("_Measure").unwrap().add_item("Revenue"); + for (r, v) in [("East", 10.0), ("West", 5.0), ("Inland", 2.0)] { + m.set_cell(key(r, "A", "Revenue"), CellValue::Number(v)); + } + m +} + +fn coastal() -> CellKey { + key("Coastal", "A", "Revenue") +} + /// A wrong backend: an `Eager` told every edit, answering one thing wrongly. #[derive(Clone, Copy)] enum Fault { @@ -234,6 +275,11 @@ enum Fault { IgnoresMeasureAggregation, GoesStaleAfterTwoEdits, IgnoresClear, + WrongFoldedFormula, + IgnoresRemoveFormula, + WrongWhenTwoAreDropped, + RawFoldReturnsFormula, + WrongOnAGroup, } struct Rival { @@ -243,25 +289,42 @@ struct Rival { } impl Rival { - fn of(fault: Fault) -> Self { + fn over(inner: Eager, fault: Fault) -> Self { Rival { - inner: hand_eager(), + inner, fault, seen: 0, } } + + fn of(fault: Fault) -> Self { + Self::over(hand_eager(), fault) + } } impl Derived for Rival { - fn value(&self, key: &CellKey, agg: Aggregation) -> Option { - match self.fault { - Fault::IgnoresAggregation => self.inner.value(key, Aggregation::Exact), - _ => self.inner.value(key, agg), + fn value(&self, k: &CellKey, agg: Aggregation) -> Option { + let wrong = match self.fault { + Fault::WrongFoldedFormula => { + *k == partial("A", "Profit") && agg == Aggregation::OverHidden + } + Fault::WrongWhenTwoAreDropped => *k == only_revenue(), + Fault::WrongOnAGroup => *k == coastal() && agg == Aggregation::Exact, + _ => false, + }; + match (wrong, self.fault) { + (true, _) => num(-999.0), + (_, Fault::IgnoresAggregation) => self.inner.value(k, Aggregation::Exact), + _ => self.inner.value(k, agg), } } - fn raw_fold(&self, partial: &CellKey) -> Option { - self.inner.raw_fold(partial) + fn raw_fold(&self, p: &CellKey) -> Option { + match self.fault { + Fault::WrongWhenTwoAreDropped if *p == only_revenue() => num(-999.0), + Fault::RawFoldReturnsFormula => self.inner.value(p, Aggregation::OverHidden), + _ => self.inner.raw_fold(p), + } } } @@ -272,6 +335,7 @@ impl Maintained for Rival { (Fault::IgnoresMeasureAggregation, Edit::SetMeasureAgg { .. }) => true, (Fault::GoesStaleAfterTwoEdits, _) => self.seen > 2, (Fault::IgnoresClear, Edit::ClearCell(_)) => true, + (Fault::IgnoresRemoveFormula, Edit::RemoveFormula { .. }) => true, _ => false, }; if !skip { @@ -280,9 +344,17 @@ impl Maintained for Rival { } } -fn run_rival( - fault: Fault, -) -> Result { +fn only_revenue() -> CellKey { + CellKey::new(vec![("_Measure".into(), "Revenue".into())]) +} + +fn measure_of(probe: &Probe) -> Option<&str> { + match probe { + Probe::Value(k, _) | Probe::RawFold(k) => k.get("_Measure"), + } +} + +fn run_rival(fault: Fault) -> Result { differential( &hand_model(), &["Region".to_string()], @@ -307,31 +379,239 @@ fn the_harness_passes_a_backend_that_is_right() { fn the_harness_catches_a_backend_that_ignores_the_aggregation() { let d = run_rival(Fault::IgnoresAggregation).unwrap_err(); assert_eq!(d.step, 0); - assert!(d.to_string().starts_with("divergence at step 0:"), "{d}"); + assert_eq!( + d.probe, + Probe::Value(key("East", "A", "Profit"), Aggregation::OverHidden) + ); + assert_eq!((d.eager, d.candidate), (None, num(6.0))); } #[test] fn the_harness_catches_a_backend_that_ignores_the_measure_aggregation() { let d = run_rival(Fault::IgnoresMeasureAggregation).unwrap_err(); assert_eq!(d.step, 2, "{d}"); + assert_eq!(measure_of(&d.probe), Some("Revenue"), "{d}"); } #[test] fn the_harness_catches_a_backend_that_goes_stale_after_two_edits() { let d = run_rival(Fault::GoesStaleAfterTwoEdits).unwrap_err(); assert_eq!(d.step, 3, "{d}"); + assert_eq!(measure_of(&d.probe), Some("Revenue"), "{d}"); } #[test] fn the_harness_catches_a_backend_that_ignores_a_clear() { let d = run_rival(Fault::IgnoresClear).unwrap_err(); assert_eq!(d.step, 3, "{d}"); - assert!(d.to_string().contains("eager"), "{d}"); + assert_eq!(measure_of(&d.probe), Some("Revenue"), "{d}"); + assert!(d.to_string().starts_with("divergence at step 3:"), "{d}"); } #[test] -fn the_harness_names_the_probe_the_two_backends_disagree_on() { - let d = run_rival(Fault::IgnoresClear).unwrap_err(); - assert_ne!(d.eager, d.candidate); - assert!(matches!(d.probe, Probe::Value(..) | Probe::RawFold(_))); +fn the_harness_catches_a_wrong_folded_formula_value() { + let d = run_rival(Fault::WrongFoldedFormula).unwrap_err(); + assert_eq!(d.step, 0); + assert_eq!( + d.probe, + Probe::Value(partial("A", "Profit"), Aggregation::OverHidden) + ); + assert_eq!((d.eager, d.candidate), (num(9.0), num(-999.0))); +} + +#[test] +fn the_harness_catches_a_backend_that_keeps_answering_for_a_removed_formula() { + let d = run_rival(Fault::IgnoresRemoveFormula).unwrap_err(); + assert_eq!(d.step, hand_edits().len(), "{d}"); + assert_eq!(measure_of(&d.probe), Some("Profit"), "{d}"); + assert!(d.eager.is_none() && d.candidate.is_some(), "{d}"); +} + +#[test] +fn the_harness_catches_a_fault_that_only_shows_after_two_coordinates_are_dropped() { + let d = run_rival(Fault::WrongWhenTwoAreDropped).unwrap_err(); + assert_eq!(d.step, 0); + assert_eq!(d.probe, Probe::Value(only_revenue(), Aggregation::Exact)); + assert_eq!(d.candidate, num(-999.0)); +} + +#[test] +fn the_harness_catches_a_raw_fold_that_returns_a_formula() { + let d = run_rival(Fault::RawFoldReturnsFormula).unwrap_err(); + assert_eq!(d.step, 0); + assert!(matches!(d.probe, Probe::RawFold(_)), "{d}"); + assert_eq!(measure_of(&d.probe), Some("Profit"), "{d}"); + assert!(d.eager.is_none() && d.candidate.is_some(), "{d}"); +} + +#[test] +fn the_harness_catches_a_wrong_group_fold() { + let eager = Eager::new(grouped_model(), vec![]); + let d = differential( + &grouped_model(), + &[], + Rival::over(eager, Fault::WrongOnAGroup), + &[], + ) + .unwrap_err(); + assert_eq!(d.probe, Probe::Value(coastal(), Aggregation::Exact)); + assert_eq!((d.eager, d.candidate), (num(15.0), num(-999.0))); +} + +#[test] +fn eager_folds_a_group_it_is_asked_about() { + let eager = Eager::new(grouped_model(), vec![]); + assert_eq!(eager.value(&coastal(), Aggregation::Exact), num(15.0)); +} + +#[test] +fn eager_raw_fold_is_never_a_formula() { + let eager = hand_eager(); + assert_eq!( + eager.value(&partial("A", "Profit"), Aggregation::OverHidden), + num(9.0) + ); + assert_eq!(eager.raw_fold(&partial("A", "Profit")), None); +} + +#[test] +fn eager_clear_cell_leaves_the_key_absent() { + let mut eager = hand_eager(); + let k = key("East", "A", "Revenue"); + eager.apply(&Edit::ClearCell(k.clone())); + assert_eq!(eager.value(&k, Aggregation::Exact), None); + assert_eq!(eager.model().get_cell(&k), None); +} + +#[test] +fn same_value_follows_the_float_rules_and_is_exact_elsewhere() { + let n = |x: f64| num(x); + assert!(same_value(&n(f64::NAN), &n(f64::NAN))); + assert!(same_value(&n(-0.0), &n(0.0))); + assert!(!same_value(&n(1.0), &n(1.000_000_000_000_000_2))); + assert!(!same_value(&n(1.0), &n(f64::NAN))); + assert!(same_value(&text("a"), &text("a"))); + assert!(!same_value(&text("a"), &text("b"))); + let err = |s: &str| Some(CellValue::Error(s.into())); + assert!(same_value(&err("mixed"), &err("mixed"))); + assert!(!same_value(&err("mixed"), &err("circular"))); + assert!(!same_value(&None, &n(0.0))); + assert!(same_value(&None, &None)); +} + +#[test] +fn probes_cover_folds_formulas_measures_and_groups() { + let hand = probes(&hand_model()); + let has = |p: Probe| hand.contains(&p); + assert!(has(Probe::RawFold(partial("A", "Revenue")))); + assert!(has(Probe::Value( + key("East", "A", "Revenue"), + Aggregation::Exact + ))); + assert!(has(Probe::Value( + partial("A", "Profit"), + Aggregation::Exact + ))); + assert!(has(Probe::Value( + partial("A", "Profit"), + Aggregation::OverHidden + ))); + assert!(has(Probe::Value(only_revenue(), Aggregation::OverHidden))); + assert!(has(Probe::RawFold(CellKey::new(vec![])))); + let grouped = probes(&grouped_model()); + assert!(grouped.contains(&Probe::Value(coastal(), Aggregation::Exact))); +} + +#[test] +fn an_edit_names_its_key_as_two_value_probes_and_a_fold() { + let k = key("East", "A", "Revenue"); + let asked = improvise_incremental::edit_probes(&Edit::ClearCell(k.clone())); + assert!(asked.contains(&Probe::Value(k.clone(), Aggregation::Exact))); + assert!(asked.contains(&Probe::Value(k.clone(), Aggregation::OverHidden))); + assert!(asked.contains(&Probe::RawFold(k))); + let none = improvise_incremental::edit_probes(&Edit::SetMeasureAgg { + measure: "Revenue".into(), + func: AggFunc::Max, + }); + assert!(none.is_empty()); +} + +/// An `Eager` rebuilt from scratch on every edit: maintaining one in place +/// must give the same answers as building it afresh. +struct Fresh { + model: Model, + none: Vec, + eager: Eager, +} + +impl Derived for Fresh { + fn value(&self, k: &CellKey, agg: Aggregation) -> Option { + self.eager.value(k, agg) + } + + fn raw_fold(&self, p: &CellKey) -> Option { + self.eager.raw_fold(p) + } +} + +impl Maintained for Fresh { + fn apply(&mut self, edit: &Edit) { + edit.apply(&mut self.model); + self.eager = Eager::new(self.model.clone(), self.none.clone()); + } +} + +fn any_key() -> impl Strategy { + ( + prop::sample::select(vec!["East", "West"]), + prop::sample::select(vec!["A", "B"]), + prop::sample::select(vec!["Revenue", "Cost", "Note"]), + ) + .prop_map(|(r, p, m)| key(r, p, m)) +} + +fn any_value() -> impl Strategy { + prop_oneof![ + (-4i32..5).prop_map(|n| CellValue::Number(f64::from(n))), + Just(CellValue::Number(-0.0)), + prop::sample::select(vec!["n", "x"]).prop_map(|t| CellValue::Text(t.into())), + ] +} + +fn any_edit() -> impl Strategy { + prop_oneof![ + (any_key(), any_value()).prop_map(|(k, v)| Edit::SetCell(k, v)), + any_key().prop_map(Edit::ClearCell), + prop::sample::select(vec!["Profit = Revenue - Cost", "Double = Revenue * 2"]) + .prop_map(|raw| Edit::AddFormula(parse_formula(raw, "_Measure").unwrap())), + prop::sample::select(vec!["Profit", "Double"]).prop_map(|t| Edit::RemoveFormula { + target: t.into(), + target_category: "_Measure".into(), + }), + ( + prop::sample::select(vec!["Revenue", "Cost"]), + prop::sample::select(vec![AggFunc::Sum, AggFunc::Max, AggFunc::Min, AggFunc::Avg]), + ) + .prop_map(|(m, func)| Edit::SetMeasureAgg { + measure: m.into(), + func, + }), + ] +} + +proptest! { + #[test] + fn a_maintained_eager_equals_a_fresh_one_over_random_edit_sequences( + edits in prop::collection::vec(any_edit(), 0..4) + ) { + let model = hand_model(); + let none = vec!["Region".to_string()]; + let fresh = Fresh { + model: model.clone(), + none: none.clone(), + eager: Eager::new(model.clone(), none.clone()), + }; + let run = differential(&model, &none, fresh, &edits); + prop_assert!(run.is_ok(), "{}", run.unwrap_err()); + } } From 148c4f5c296f4d5281696039df56d341c92b19e4 Mon Sep 17 00:00:00 2001 From: "Claude (adr009-derived)" Date: Sat, 10 Oct 2026 00:32:48 -0700 Subject: [PATCH 08/11] fix(incremental): pin AddFormula and RemoveFormula directly; state the probe limit plainly (improvise-bw4p.4) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- context/code/improvise-incremental.md | 15 +++++++++++++-- context/test-evidence/improvise-incremental.md | 15 ++++++++++++--- crates/improvise-incremental/src/harness.rs | 2 +- crates/improvise-incremental/tests/oracle.rs | 16 ++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/context/code/improvise-incremental.md b/context/code/improvise-incremental.md index 85078d94..35e39331 100644 --- a/context/code/improvise-incremental.md +++ b/context/code/improvise-incremental.md @@ -49,7 +49,9 @@ fold of the cells that match a partial key") and nothing else. These are the rea 5. **`Edit` is the vocabulary of the harness, not of the wire.** Five variants, each one public `Model` call. A later step adds variants for what it maintains (an item added, a category removed); the harness does not care which. An `Edit` fault reaches both sides of a - differential alike, so `Eager`'s handling of each edit is pinned by direct tests. + differential alike, so it is pinned only where a direct `Eager` test reads the result: + `ClearCell`, `AddFormula` and `RemoveFormula`, and `SetMeasureAgg` through the fold tests. + `SetCell` is read by nearly every test. 6. **Values agree by float rules with every NaN one value** (`same_value`), the rule clause 3 states for cell deltas. Signed zero compares equal, so a later `ExactSum` cannot be told from eager's sum by the sign of a zero here; clause 8 has its own property test for that. @@ -68,10 +70,19 @@ states and answers were compared. its item's group), every sub-partial of a base key dropping at most `MAX_DROPPED = 3` coordinates plus the empty key, and each formula's target over each of those. Each key is asked as an exact value, an over-hidden value and a raw fold. A fold dropping more than three -coordinates from a stored key is not asked about; the cost is the number of subsets. `edit_probes` +coordinates from a stored key is not asked about. `edit_probes` adds the key an edit names, so a cleared cell is asked about after it is gone. A divergence reads `divergence at step N: : eager != candidate `. +**A limit, stated plainly (improvise-bw4p.4).** The probe set is every stored key's +sub-partials, not the keys a view draws. A view with four or more categories on None draws a cell +that drops four or more coordinates of a stored key, and the harness checks none of those cells: +a rival wrong only at `{C0=a, _Measure=Revenue}` over a five-category model passes. Neither +shipped demo reaches the limit, so the corpus does not show it. Raising `MAX_DROPPED` is not the +answer, because `sub_partials` walks all 2^n subsets of a key whatever the limit is (93ms at 20 +categories and 225ms at 22 in a debug build, per call). The fix is to probe the keys each view +draws, with steps 3 and 4; until then a candidate on such a view is under-checked. + The corpus the tests use is `examples/demo.improv` and `web/demo.improv`, loaded through `improvise_io::persistence::load`, and hand-built models (formulas, text, mixed values, a group). `eager_matches_the_evaluator_on_the_shipped_documents` takes every view's None categories; the diff --git a/context/test-evidence/improvise-incremental.md b/context/test-evidence/improvise-incremental.md index 57e0d639..aac72cbc 100644 --- a/context/test-evidence/improvise-incremental.md +++ b/context/test-evidence/improvise-incremental.md @@ -8,7 +8,7 @@ reasoning is in `context/code/improvise-incremental.md`; the decisions are ADR 0 harness reports the divergence. They run on every build, so each rival is watched failing on every run and not once by hand. -**Injected in the source.** Seventeen faults were put into `src/eager.rs`, `src/harness.rs` +**Injected in the source.** Eighteen faults were put into `src/eager.rs`, `src/harness.rs` and `src/edit.rs` one at a time, each run against the whole suite and each reverted and followed by a full rerun. The failing tests, by name (a fault no test names survived, and none did): @@ -47,6 +47,7 @@ none did): - the probe history is forgotten between steps: `…_goes_stale_after_two_edits`, `…_ignores_a_clear`, `the_harness_catches_a_backend_that_keeps_answering_for_a_removed_formula`; - `edit_probes` names nothing: `an_edit_names_its_key_as_two_value_probes_and_a_fold`; +- `Edit::AddFormula` as a no-op: `eager_add_and_remove_formula_change_what_a_key_reads`; - `Edit::ClearCell` applied as `SetCell(0.0)`, which both sides of a differential share and so only a direct `Eager` test can see: `eager_clear_cell_leaves_the_key_absent`. @@ -91,7 +92,7 @@ categories, and the probe set is non-empty. Fails on both aggregation rivals. `differential` over a generated edit sequence on each corpus model returns a `Report` with `edits + 1` steps and a non-zero probe count. The count assertion is what a harness that -compared nothing would fail; the step count is what one that stopped early would fail._a +compared nothing would fail; the step count is what one that stopped early would fail. ## the_harness_passes_a_backend_that_is_right The control for the `catches` tests: `Eager` as the candidate over the hand-built edits is a @@ -155,6 +156,13 @@ true answer to differ from. At `{Product=A, _Measure=Profit}` the folded value is `9` and the raw fold is `None`. Fails on the fault that lets `raw_fold` read the formula cache. +## eager_add_and_remove_formula_change_what_a_key_reads + +Review of PR 343: `Edit::AddFormula` as a no-op left all 25 tests green, because an `Edit` fault +reaches both sides of a differential alike. `Double = Revenue * 2` reads `None` before the edit +and `20` at East/A after it, and `None` again after `RemoveFormula`. Fails on `AddFormula` as a +no-op. + ## eager_clear_cell_leaves_the_key_absent After `ClearCell` the key reads `None` and the model holds no cell. A `ClearCell` applied as @@ -164,7 +172,8 @@ After `ClearCell` the key reads `None` and the model holds no cell. A `ClearCell NaN equals NaN, `-0.0` equals `0.0`, `1.0` differs from `1.0000000000000002`, texts and errors compare exactly, and `None` equals only `None`. Each of three one-line faults in `same_value` -(NaN unequal, signed zero by bits, any two texts equal) failed only this test before it existed. +(NaN unequal, signed zero by bits, any two texts equal) survived the whole suite until this test +existed. ## probes_cover_folds_formulas_measures_and_groups diff --git a/crates/improvise-incremental/src/harness.rs b/crates/improvise-incremental/src/harness.rs index d4e45811..37281d85 100644 --- a/crates/improvise-incremental/src/harness.rs +++ b/crates/improvise-incremental/src/harness.rs @@ -101,7 +101,7 @@ fn all_three(key: CellKey) -> [Probe; 3] { /// Every key `key` keeps after dropping at most `MAX_DROPPED` coordinates. fn sub_partials(key: &CellKey) -> impl Iterator + '_ { - let n = key.0.len().min(63); + let n = key.0.len(); (0..1u64 << n) .filter(|mask| mask.count_ones() as usize <= MAX_DROPPED) .map(move |mask| { diff --git a/crates/improvise-incremental/tests/oracle.rs b/crates/improvise-incremental/tests/oracle.rs index 0ac13d5c..6b3304be 100644 --- a/crates/improvise-incremental/tests/oracle.rs +++ b/crates/improvise-incremental/tests/oracle.rs @@ -474,6 +474,22 @@ fn eager_raw_fold_is_never_a_formula() { assert_eq!(eager.raw_fold(&partial("A", "Profit")), None); } +#[test] +fn eager_add_and_remove_formula_change_what_a_key_reads() { + let mut eager = hand_eager(); + let k = key("East", "A", "Double"); + assert_eq!(eager.value(&k, Aggregation::Exact), None); + eager.apply(&Edit::AddFormula( + parse_formula("Double = Revenue * 2", "_Measure").unwrap(), + )); + assert_eq!(eager.value(&k, Aggregation::Exact), num(20.0)); + eager.apply(&Edit::RemoveFormula { + target: "Double".into(), + target_category: "_Measure".into(), + }); + assert_eq!(eager.value(&k, Aggregation::Exact), None); +} + #[test] fn eager_clear_cell_leaves_the_key_absent() { let mut eager = hand_eager(); From 56b7770282983abd8ecbd1d5618b114ab8c4632d Mon Sep 17 00:00:00 2001 From: "Claude (adr009-incr-amend)" Date: Sat, 10 Oct 2026 11:14:29 -0700 Subject: [PATCH 09/11] docs(adr): ADR 009 clause 2 puts Derived and Eager in improvise-incremental (improvise-felo.4) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- context/adr/009-incremental-evaluation.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/context/adr/009-incremental-evaluation.md b/context/adr/009-incremental-evaluation.md index 68135713..70d4b155 100644 --- a/context/adr/009-incremental-evaluation.md +++ b/context/adr/009-incremental-evaluation.md @@ -51,10 +51,12 @@ formula, so there is no second query language. ### 2. The plug -improvise-core gains a trait, `Derived`, for the two things the evaluator reads: the -formula result at a key, and the raw fold of the cells that match a partial key. The -incremental backend implements it in a seam crate, `improvise-incremental`, which -depends on `zset` and improvise-core. improvise-core never depends on `zset`. +The seam crate `improvise-incremental` holds a trait, `Derived`, for the two things the +evaluator reads: the formula result at a key, and the raw fold of the cells that match a +partial key. `Eager` lives beside it in that crate. The incremental backend implements +`Derived` there too. `improvise-incremental` depends on improvise-core, and later on +`zset`. improvise-core defines no `Derived` and never depends on `zset` or on +`improvise-incremental`. A live source (ADR 003) that reports its changes feeds cell deltas like `DataStore`. A source that answers aggregate queries but reports no changes implements the derived-value @@ -63,7 +65,7 @@ operator directly, by query pushdown, with no change feed. The circuit decides *which* formula cells to re-evaluate. The one existing evaluator computes each value, so formulas are never compiled into operators. -**`Eager` is temporary.** Today's code moves behind the trait as `Eager`, unchanged. It +**`Eager` is temporary.** Today's code is wrapped behind the trait as `Eager`, unchanged. It exists only to show discrepancies between the new evaluator and the old one: a differential property test applies one random edit sequence to both backends and compares every drawn cell, total and occupancy count. Eventually it is deleted, and From 7564051bf5f0663172ddce32b48e7a9ab623857b Mon Sep 17 00:00:00 2001 From: "Claude (adr009-clean)" Date: Sat, 10 Oct 2026 11:22:06 -0700 Subject: [PATCH 10/11] docs(adr): revert the ADR 009 clause 2 amendment; Derived placement is an implementation detail (improvise-felo.4) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze --- context/adr/009-incremental-evaluation.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/context/adr/009-incremental-evaluation.md b/context/adr/009-incremental-evaluation.md index 70d4b155..68135713 100644 --- a/context/adr/009-incremental-evaluation.md +++ b/context/adr/009-incremental-evaluation.md @@ -51,12 +51,10 @@ formula, so there is no second query language. ### 2. The plug -The seam crate `improvise-incremental` holds a trait, `Derived`, for the two things the -evaluator reads: the formula result at a key, and the raw fold of the cells that match a -partial key. `Eager` lives beside it in that crate. The incremental backend implements -`Derived` there too. `improvise-incremental` depends on improvise-core, and later on -`zset`. improvise-core defines no `Derived` and never depends on `zset` or on -`improvise-incremental`. +improvise-core gains a trait, `Derived`, for the two things the evaluator reads: the +formula result at a key, and the raw fold of the cells that match a partial key. The +incremental backend implements it in a seam crate, `improvise-incremental`, which +depends on `zset` and improvise-core. improvise-core never depends on `zset`. A live source (ADR 003) that reports its changes feeds cell deltas like `DataStore`. A source that answers aggregate queries but reports no changes implements the derived-value @@ -65,7 +63,7 @@ operator directly, by query pushdown, with no change feed. The circuit decides *which* formula cells to re-evaluate. The one existing evaluator computes each value, so formulas are never compiled into operators. -**`Eager` is temporary.** Today's code is wrapped behind the trait as `Eager`, unchanged. It +**`Eager` is temporary.** Today's code moves behind the trait as `Eager`, unchanged. It exists only to show discrepancies between the new evaluator and the old one: a differential property test applies one random edit sequence to both backends and compares every drawn cell, total and occupancy count. Eventually it is deleted, and From 6dbbfdb6cb58f645fb08d680681c054ff7c4a7d4 Mon Sep 17 00:00:00 2001 From: Ed L Date: Sat, 10 Oct 2026 11:52:45 -0700 Subject: [PATCH 11/11] chore: more updates --- Cargo.lock | 14 ++------ Cargo.nix | 40 ++--------------------- harness/opfs-contract/Cargo.lock | 55 +++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef31d5a6..14b56a2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,16 +1279,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" -dependencies = [ - "num-integer", - "num-traits", -] - [[package]] name = "num-conv" version = "0.2.2" @@ -1321,7 +1311,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint 0.4.8", + "num-bigint", "num-integer", "num-traits", ] @@ -1348,7 +1338,7 @@ dependencies = [ name = "numtower" version = "0.1.0" dependencies = [ - "num-bigint 0.5.1", + "num-bigint", "num-integer", "num-rational", "num-traits", diff --git a/Cargo.nix b/Cargo.nix index 3b674182..0f6374d2 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4119,7 +4119,7 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "std" ]; }; - "num-bigint 0.4.8" = rec { + "num-bigint" = rec { crateName = "num-bigint"; version = "0.4.8"; edition = "2021"; @@ -4153,40 +4153,6 @@ rec { }; resolvedDefaultFeatures = [ "std" ]; }; - "num-bigint 0.5.1" = rec { - crateName = "num-bigint"; - version = "0.5.1"; - edition = "2021"; - sha256 = "1h77ycws79m3j1s68jq5pvaiifi9z4b76cjhwqw042m8q05q5rwk"; - libName = "num_bigint"; - license = "MIT OR Apache-2.0"; - dependencies = [ - { - name = "num-integer"; - packageId = "num-integer"; - usesDefaultFeatures = false; - features = [ "i128" ]; - } - { - name = "num-traits"; - packageId = "num-traits"; - usesDefaultFeatures = false; - features = [ "i128" ]; - } - ]; - features = { - "arbitrary" = [ "dep:arbitrary" ]; - "default" = [ "std" ]; - "quickcheck" = [ "dep:quickcheck" ]; - "rand_0_10" = [ "rand_core_0_10" "dep:rand_0_10" ]; - "rand_0_9" = [ "rand_core_0_9" "dep:rand_0_9" ]; - "rand_core_0_10" = [ "dep:rand_core_0_10" ]; - "rand_core_0_9" = [ "dep:rand_core_0_9" ]; - "serde" = [ "dep:serde" ]; - "std" = [ "num-integer/std" "num-traits/std" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; "num-conv" = rec { crateName = "num-conv"; version = "0.2.2"; @@ -4263,7 +4229,7 @@ rec { dependencies = [ { name = "num-bigint"; - packageId = "num-bigint 0.4.8"; + packageId = "num-bigint"; optional = true; usesDefaultFeatures = false; } @@ -4338,7 +4304,7 @@ rec { dependencies = [ { name = "num-bigint"; - packageId = "num-bigint 0.5.1"; + packageId = "num-bigint"; usesDefaultFeatures = false; features = [ "std" ]; } diff --git a/harness/opfs-contract/Cargo.lock b/harness/opfs-contract/Cargo.lock index 67bee125..704469e7 100644 --- a/harness/opfs-contract/Cargo.lock +++ b/harness/opfs-contract/Cargo.lock @@ -307,19 +307,21 @@ dependencies = [ [[package]] name = "pest" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d3aca230fad2e6f6317ca0a72724338c4960cb97168a85cdee66df4a9a21a8" +checksum = "b568374ba38b33a6c627141f891faf16902b08d2db26b8ede1bcb0a15b1919fa" dependencies = [ "memchr", + "psm", + "stacker", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284b60557f2c4a2e72ad3f2d34d42685a2fa4a6a61d0d2a10c0ae2a5e916c2cf" +checksum = "b66e184b924cebaaff20ab2256ca52f12332d528a39aa76553b5d96f92aacf7f" dependencies = [ "pest", "pest_generator", @@ -327,22 +329,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9d1f08a115309ee99268cf85e5228e0e56aa9caf8841ec12866b6be07c3109" +checksum = "a87478d267e4de54a626af9754f2f0f58e927aac6ed0575fe89bc05ad6851694" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] name = "pest_meta" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed93ba1a9ffcca32130a5188701c81c0c49cf00d4b7c5007d5148951d743adcb" +checksum = "4f986f248b4241ac359b831f6139aaa34e03b08a37b6caf7e201a33f95c869e1" dependencies = [ "pest", ] @@ -362,6 +364,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +dependencies = [ + "cc", +] + [[package]] name = "quote" version = "1.0.47" @@ -450,6 +461,19 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +[[package]] +name = "stacker" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys", +] + [[package]] name = "syn" version = "2.0.119" @@ -489,9 +513,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicase" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" [[package]] name = "unicode-ident" @@ -624,6 +648,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "zlib-rs" version = "0.6.8"