deadbyte-mcp 0.15.62 → 0.15.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/MANIFEST.SHA256 CHANGED
@@ -30,7 +30,7 @@ c814771dddac8bfb184250b868ddb6ab9f5e0e43613c04c3ed8abe09324ec4db bin/deadbyte-n
30
30
  daf9cfb371bee88cafbf5597eaa507fec504dbe0b0ddd40d0c3c2e02817f49e4 bin/deadbyte-process-host.exe
31
31
  b55d2c4490dfb875d40f29a69df2addc5d579991cb7d094674c04d369dfcfac3 bin/deadbyte-tunnel-host.exe
32
32
  f0ce7acb1e41325cef8b6789f95bd78b6a6107423773eace57a12b49faa55095 bin/WORKER-REGISTRY.txt
33
- 137e7fd20504b1f6e6dd5124203bf7f8a047ffee36a3d1bde2e07571d07821a5 bridge/package.json
33
+ c2391bfe4b845818903ce862ee8080010d0354f3bb40097489f637d2c6c9f58c bridge/package.json
34
34
  f99413d82f84c808f52d5b8696c190a9142dd08f517f5ec3e442f0769402d189 bridge/src/bridge-health-r59.mjs
35
35
  fa0dcc4cde9c03e978c9f9dd24b62afa83f49bdada1f42ead544a9a17edd332f bridge/src/bridge.mjs
36
36
  471f41c84c5b339cd81a708a4f36d4470e614946817ad2f9fca295dde2c83fb6 bridge/src/canonical-json-r60.mjs
@@ -1418,8 +1418,8 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
1418
1418
  f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
1419
1419
  51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
1420
1420
  3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
1421
- 406b27ed8901e7622eb398ef0bb5d82eb64d6a7b4cf7e7a502951b6fa601e118 package.json
1422
- a018a6cfdca30418e72aa44fc29a31b8f4e1919642920290b4fbf249f67cd9c2 PROVENANCE.json
1421
+ f8884d6c9deae08ffc5ddde0ddafd4c17e46a29e3f74917dda240e3e54caf9a0 package.json
1422
+ 05da8b2303386d83427ec71b07e7c2ff5fc7724d6cfe5063a7bce89246e13651 PROVENANCE.json
1423
1423
  27ca0f3c9ee3a1b6374a9c8dd98008decdd0c7659c7a569c70ad7b9734c74655 R34-BASELINE.json
1424
1424
  0b7ec5ee347ddfa6cca59740fc7a8fe3fc5d51406265bb12189e82fa106319d2 R41-PARENT.json
1425
1425
  bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.json
@@ -1428,9 +1428,9 @@ f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.jso
1428
1428
  731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
1429
1429
  d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
1430
1430
  3dc607603fea511e2f428e9546a875ab7e38b6a0bbd5e803e4510de082f30804 R49-PARENT.json
1431
- 339a21e05398046ee4f0370c8d9c6b5799b755e175cdd622a298abbbed9f698a README.txt
1432
- 3c31d1ca6d621c58fafe8917f6554f2b8d0b6e14e774ba509621c11c7a66b544 RELEASE.json
1433
- a7413335efeb0166c20b13fa4b9b7dc45d874086b7a61623442bbba47911302f SBOM.cdx.json
1431
+ c24e89af308ed6dcf97f6cfca14e65e1b2b975038c2d579422e3baa489d0cc11 README.txt
1432
+ 787e4d9733fef6ee035a068cf739d2a698da403505062a46514063b5d1433471 RELEASE.json
1433
+ b632562ee1d3aed41ad1bdbf47fd193e7bbdb3d61aa46ce96537ba49a43b756a SBOM.cdx.json
1434
1434
  7c86062c4f69db3179a129d65945ccfab1b1c1c5bcc29b91383eac097d50f2aa scripts/activate-skill-creator-1.1.1.mjs
1435
1435
  bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
1436
1436
  8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
@@ -1564,8 +1564,9 @@ de6142bd5693cf4edb8725c9c43fc77e9bdc12f5b398a757006d778d3ee3f8ed scripts/inspec
1564
1564
  4870c1dba23d1f05f9302153a309ba5d42d1b08aee34eabd3361792c26b254ae scripts/npm-publication-r65.mjs
1565
1565
  9d12d15f7c83ddf272834072ed37d618a232bd8a3fd36c339761fe08bb9380d8 scripts/npm-publish-r47.ps1
1566
1566
  4f1a6e0f8d23bd24b066b3a2df0cae1d47822c16c754122fde78dc509d0752f8 scripts/npm-release-r47.mjs
1567
- 9cc4502a09fda3b77560fbf5fb492e9f5122815cfe28bd0222dee23dd27a8064 scripts/npm-release-r48.mjs
1567
+ 8113f0ca314ce50e2b166fe60cc7e5113352fcaf4d01eb0cc2a43f77ca1a9667 scripts/npm-release-r48.mjs
1568
1568
  4fb7f874cc04cd98ad677425f0aae4191b92f8b71e96db70d1fb395eb8267b93 scripts/npm-release-readiness-r163.mjs
1569
+ 88ea6b86973c81fb596927a9100865b7464955fd14b60677eb03f9e27f1073fa scripts/npm-release-readiness-r165.mjs
1569
1570
  c166f98c5ec30d66b1769a9a017d8c4bc56230f221d99539f64b2b597187d912 scripts/npm-release-readiness-r67.mjs
1570
1571
  34b0448dbf7ba61ce821e53f4de0ca85aadeb44c96e689b39cf43c4801216857 scripts/npm-release-readiness-r71.mjs
1571
1572
  8fb0e7a6222d5e2ab67f45453844e53a22958a6c3ba34833c76713a246f2e802 scripts/npm-release-readiness-r72.mjs
@@ -1775,7 +1776,7 @@ dcd4c9784e88e253e91ddad3c24b38cb0b36906ed737f6d7bee7712360f66f7a src/containmen
1775
1776
  fe1761b98738e1aea1d25ddf3a0ba56ccad95a43d45104a89b8665197c7c9e18 src/containment-result.mjs
1776
1777
  705a89cb12fedb993d55dfed32a5870d33e10db26422c944d1e52223566c096c src/containment-smoke.mjs
1777
1778
  63a1d4d6a53f9eb7e02197b4e42158b867da8c042c2e61848d8a36cd398b8bd8 src/context-provenance.mjs
1778
- ab0fc440e7796f283c25438103af250e0bad9ac91429c6bc3f3c9bb968beb80d src/deadbyte-cli.mjs
1779
+ ac6931345a4bf7f9ae9bdf0a83dc7ad09bb39767c986419d55a0c56738a33212 src/deadbyte-cli.mjs
1779
1780
  9e9766d64dcc9e2c8d23c2c0a5e9dcb87b7213e8de668f79f593ad48daf15acd src/deadline-cancellation.mjs
1780
1781
  fe7a8f8611c33552b3da466a9b866ce79a737bfd5b9a78a953269b30cce16274 src/desktop-contract.mjs
1781
1782
  f97352e510c659910c2d4a874d15be028e1291d685c6c1a7be53bdf1a335c2d8 src/desktop-input-r40.mjs
@@ -1924,13 +1925,13 @@ aa765e9a28c69ff58a5b5a0d29b49ea181af4db9076633b102dbca25861e708e src/tunnel-std
1924
1925
  34719b7d54336b2abbc152ff0c5fb2f0052d4f77753f9b7538adfdd20c804b5b src/uac-approval-contract-r153.mjs
1925
1926
  642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
1926
1927
  8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
1927
- 7d7886e5201c44ec1092fe30dbdd9af0652b3986f29ca85aa6941dd0d6d4f7a2 src/version.mjs
1928
+ c016124baa401cbcb8b57cc4b73745243be597e1f1b77846371c7f033610fd28 src/version.mjs
1928
1929
  3706206ecaa560b9579f57ed3df104af543331fb09a3ad0d28b217aea2d0256f src/windows-powershell-environment.mjs
1929
1930
  7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
1930
1931
  76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
1931
1932
  4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
1932
1933
  1bd637e7634ca0259791c5108fcf324554f70b1db49e5eac3505287c04bbc3be STABILIZATION-PROGRESS.md
1933
- 09357bbb1a2e49dd1dfbb75389610ab38b6f2690a73235e47237ad9c227abf7a TEST-MATRIX.json
1934
+ 07a89ec563f133192e269f0efb7fffd7e97b9b0f417a8647015d05eb4fd2d2f9 TEST-MATRIX.json
1934
1935
  e4f1fb97545f23772ddff28ad3f9954a4714f9854062fca62e0e12c1cb2ec4ae test/agent-backend-r44.test.mjs
1935
1936
  2a78c818058b25efdc143a3a97c832da231ccd6ff9d90c7796d681a0251b85c4 test/agent-crash-child.mjs
1936
1937
  d9461ab7c118ee75d37a2d6f5e637d7e43505af6a9ad8c7ddafffc8ace185a5b test/agent-crash-worker.mjs
@@ -2184,9 +2185,9 @@ ce163ee9f288e30a213636e2267b8630016ef8a170f12286e8cdd44219bdab32 test/r124-live
2184
2185
  17475b51e416ae678f959f8975fab8497eb7c57d13e36cac8656c0e1f7424c0c test/r126-restore-policy-envelope.test.mjs
2185
2186
  1721d4bd3bb58c10ad9d86b69ad1d993ec5a1e6315c95b28fa50ab67d4ca302a test/r127-restore-append-policy-boundary.test.mjs
2186
2187
  b3d3dda398c94d18e2e156bde65d1338000233407b435134ba0c16175d96620b test/r129-sdk-security-baseline.test.mjs
2187
- bccc4c1e5c9e7a23e9f3c93d367aa94a75899a3f206d2313e0c5a5ea19f26c50 test/r130-release-security-contract.test.mjs
2188
+ a2e11035e6fd0b1039f3a49f3a59dee692470615a717c6c885b1f31e8a7b9191 test/r130-release-security-contract.test.mjs
2188
2189
  bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
2189
- 1e9774a9fdc61c03289e5a2d3cc3463e90ffd67b8419ed02127d15032deee7eb test/r132-release-identity.test.mjs
2190
+ 09edcdda615c483c821a48396d6a72996023220f4d26df0cf78f7bfea480dc3a test/r132-release-identity.test.mjs
2190
2191
  acd236a4d8ba035007bde4166a521b8d4e6044f58c52c0bae9cb42fa75338533 test/r135-autonomous-scope.test.mjs
2191
2192
  3fcf657aae1f8466abc5ab82bb5a619966ea9b8a33d4a95a5a5246df5bf3afa1 test/r136-scoped-command-rights.test.mjs
2192
2193
  e0c466f25b35eb894166df792b71b23924610d32363756c75ff437dfdaa12a4c test/r136-scoped-observer.test.mjs
@@ -2210,7 +2211,7 @@ b92f914455cac010b1468cd37a31651e7d423571d0edfeb29829d2281073e1e3 test/r146-lega
2210
2211
  32f40b649033172384267bbe8f6009dededcba81afff1e3ca51331407197fe3b test/r146-livelog-backpressure.test.mjs
2211
2212
  77b3bfcd6fa04e21c7a04206181f7b4cbd5321f799a145859d8e84d0b984d174 test/r147-remote-request-hash.test.mjs
2212
2213
  ad184a83ee098eac21d523adbebfd379dcf8b87d4878c2d8dcca95cb22fdc9ee test/r153-clean-activation-recovery.test.mjs
2213
- 48ff1eb3870bb945cff9e4cb06a42d4db694e4cbf585667ab2506ce929849b9a test/r153-prepublish-identity.test.mjs
2214
+ ef2f51a6fe9e40253b8fa9365ffeb7b5985a66b2cab7cd65a7f05f1e452d2c67 test/r153-prepublish-identity.test.mjs
2214
2215
  377b03dbb1d82ed0ddeee261a060b8173d5591dfc20a60d9ea991390a03039b4 test/r153-r60-host-repin-e2e-contract.test.mjs
2215
2216
  e2bc7995f2ca85ce5d4a15e647c209d273d8f3871d25bd353046af66ee71bb34 test/r153-r65-signed-precondition-recovery.test.mjs
2216
2217
  ce37fc59761ceddf43fd3844b34d57f64f1c8d191ca1d6cba13b643a5e2c02ce test/r153-restricted-reused-pid.test.mjs
@@ -2227,14 +2228,17 @@ b832e17bf44c358136bf18522208febcc5a50259c2bde8d2d82ad4e6f5e45c39 test/r155-defa
2227
2228
  e5e37d36ce03a9a757f5cee8c1068099ae654839a73ddb4c8ea0ed83e9d9fd42 test/r157-reference-survey.mjs
2228
2229
  dc589ec4aeac16a4bb60d0366127594e6c7d4c86d188ed428808cf89ecb1808e test/r157-supervisor-singleflight.test.mjs
2229
2230
  efc195b10b5cb706c23f3a35ba8bf07e7ee23daffcb072704e5c14ffd6db26d5 test/r158-epoch-bootstrap.test.mjs
2230
- 081b2bb322012bce0e1952666496f9387277e995e2d07320b37f20dde2399ed3 test/r159-legacy-marker-evidence.test.mjs
2231
+ 41b723dfe74cb0382bde77aa0cbe72f1469e9904faad06fd39da9be0a8cca141 test/r159-legacy-marker-evidence.test.mjs
2231
2232
  ff0fc541ef9b9b1565be647d2861c29afc8827504122c1df88a94d67fd2c20bd test/r159-legacy-marker-evidence.test.mjs.before-assertion-fix-20261025-120246.bak
2232
2233
  d5d0eddc5c33ae9ea2f31d57381bf595bd85adf8048d2886f67554141f086bde test/r160-marker-proof.test.mjs
2233
2234
  7816089ae7668f7a5776a50259638cf31dc480116f3445b70afb0b8c64dbb4d3 test/r160-package-decision-manifest.test.mjs
2234
- f8d524651550ad1d3df3a1eecacfd7d87c7e2e20ca36947e90b41db444f9a697 test/r160-release-contract.test.mjs
2235
+ ea99cf4afbe7c50a974cd86ffa27e2df4730ba00603974d170bef00b86712a75 test/r160-release-contract.test.mjs
2235
2236
  8ddebf4e81e5ccb66533694e7b04775ea9ce063ead75a17c54ce28580a55a0b4 test/r160-stable-launcher.test.mjs
2236
- 8ba512d9fcb3425c8cf55557f07f5b7e95b66d4f8b67141921baedf497729785 test/r163-isolated-slot-rollback-restore.test.mjs
2237
+ 6113cdae02e286f4e443a046293e13e7792e07a59b00a309f098f81a6b4a37ed test/r163-isolated-slot-rollback-restore.test.mjs
2237
2238
  842222cce8d50ba214a4dc97d5965d711e83a29f6660e784ccaf000f50a4213d test/r163-publish-fence.test.mjs
2239
+ 3473a513db884f2ab40a9e3e875ca6ef2c9e5202fc0bf4df56e388b0d55e5e84 test/r164-remote-history-skew.test.mjs
2240
+ dd74a3f6cc4950079a95be0141f141c96b99025d25863adb088c722c58356229 test/r165-live-cli-skew.test.mjs
2241
+ e9c493435956201439479b05d301e81673457abe5c456d8a50153f3d9922daf9 test/r165-publish-fence.test.mjs
2238
2242
  3c5c3724bce89aa1fa59fe97cc346c40a5674bb5cd6dc3e2f31b86f2d62e75e4 test/r33-closeout-regression.test.mjs
2239
2243
  5e3700ee610442dfd7b7ae5e380263f231438be0e32790597142c41362a53c9a test/r33-finalization.test.mjs
2240
2244
  7e419d3c1caf79bfc7407207f50e5645298f9b19d91a7d6f595af185b92cd55e test/r36-finalization.test.mjs
@@ -2300,7 +2304,7 @@ ca8e23abc89f3eadeceb4b6fdad2cb4db5a7933029ece8e8beae2c6a158876b7 test/r58-owner
2300
2304
  8fc5ed1d3088facf45f9578d9ff8514c3a633f7f342d15eec316e129e7a916c0 test/r58-stale-owner.test.mjs
2301
2305
  84be7ee7d167eb06c9f9fc178930daaa81e53a91de40bad6d7df2060bd3dd165 test/r58-windows-gate.test.mjs
2302
2306
  76db2a4009d76b86e1da57b91a96b0d6bfeb4063bec3301ede736e2fd5832f39 test/r59-release-contract.test.mjs
2303
- 18f76ef6d7d888b6263276674f013210c4421d6e735a17ab2c11c769229b1c28 test/r59-tool-surface-compat.test.mjs
2307
+ 1d7c8b74ebb6a8e4581354613b0dff31c8013f7ec1fbd83b077032912f37e284 test/r59-tool-surface-compat.test.mjs
2304
2308
  3befd5d4dc4d8ca9e1f6cbeb9c430671e676c5696d6ee5931c2cbe3244c558a4 test/r60-authority-coherence.test.mjs
2305
2309
  60577e231c7d164f57a3960c574d3e369ca140d9dbc477b2444fa62dbf224e51 test/r60-authority-enforcement.test.mjs
2306
2310
  a1fa0b1e529da05f3659a33be6d36dab02f93808638cf0f458d057e9c6d1e35b test/r60-bridge-dispatch.test.mjs
@@ -2342,7 +2346,7 @@ b728b547713bb01aa0f7796602af734361c38ff774afd30776b1c626c83fd172 test/r65-autho
2342
2346
  87e640bb6ac048dacfb21dc36063d11fa7c99199dc161e1520010e9ae4f2d20b test/r65-authority-runtime-epoch.test.mjs
2343
2347
  590bc406131856f699aa55e1e9d99c111040fae091967a8ab0bcfaa162b7c014 test/r65-authority-runtime-policy-binding.test.mjs
2344
2348
  791aa43ec3dc62f036ad8c3641c9e14e65548013318c1a821734658a8542b690 test/r65-authority-test-trust.mjs
2345
- 22952933c91997960f3ac18b9214bfb4db08bedbcd4fc3c0765a31364412da3a test/r65-cli-invocation.test.mjs
2349
+ 8fe96695f2bcb219b6cbe67a1e659a83f3d46333e2918152175b9626d3d16973 test/r65-cli-invocation.test.mjs
2346
2350
  f722e1438c731aac39fa16a0177cbd1e994c7dd7a256e71b70a466c60d46f397 test/r65-controller-authority-epoch-live.test.mjs
2347
2351
  afd2fca850b7245fc5d729142673fb6e033de9475a81fff7d880918a4d560c35 test/r65-controller-authority-epoch.test.mjs
2348
2352
  acee2832e10d443d5a90c35632c1b395a3ccca7798567327bf38309d647bacfc test/r65-deploy-preflight.test.mjs
package/PROVENANCE.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": "deadbyte.provenance.v1",
3
- "version": "0.15.62",
3
+ "version": "0.15.63",
4
4
  "source_model": "R159 unsealed development predecessor -> isolated R160 trusted recovery successor; active runtime 0.15.61 remains immutable",
5
5
  "signing": "ed25519",
6
6
  "parent_tarball_sha256": "b85f735f4c8be56f97ea5c78f0cc48583e8d5708a704c903596f5720e36ace83",
@@ -11,7 +11,7 @@
11
11
  "manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
12
12
  "generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4"
13
13
  },
14
- "source_predecessor_manifest_file_sha256": "2a19c9da7f11eb831dfb24ba6c6d9789e25a373cea2f3a25ff21d460e07fba36",
14
+ "source_predecessor_manifest_file_sha256": "4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805",
15
15
  "reproducibility": "R154 isolated successor of published 0.15.60 tarball SHA-256 b85f735f4c8be56f97ea5c78f0cc48583e8d5708a704c903596f5720e36ace83; production runtime 0.15.45 remains immutable until exact candidate gates pass; multi-command executable repins are one-time Windows UAC, receipt-bound, and retain all authority disarmed",
16
16
  "public_surface_evidence": {
17
17
  "status": "PASS",
@@ -80,8 +80,8 @@
80
80
  "parent_release_id": "v0.15.61-055d1ff0aa99e60b",
81
81
  "parent_manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
82
82
  "parent_generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4",
83
- "source_predecessor_version": "0.15.60",
84
- "source_predecessor_tarball_sha256": "b85f735f4c8be56f97ea5c78f0cc48583e8d5708a704c903596f5720e36ace83",
83
+ "source_predecessor_version": "0.15.62",
84
+ "source_predecessor_tarball_sha256": "812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641",
85
85
  "operator_override": {
86
86
  "four_hour_soak": "WAIVED_BY_OPERATOR",
87
87
  "clean_machine": "WAIVED_BY_OPERATOR",
@@ -312,5 +312,13 @@
312
312
  "runtime_predecessor": "v0.15.61-055d1ff0aa99e60b",
313
313
  "production_activation": "NOT_RUN",
314
314
  "npm_publish": "NOT_RUN"
315
+ },
316
+ "r165": {
317
+ "runtime_predecessor_release_id": "v0.15.61-055d1ff0aa99e60b",
318
+ "source_predecessor_version": "0.15.62",
319
+ "real_cli_proof_receipt_sha256": "0547d1da28a65031109c13571688c95845a0ca42f0895030e820634e416d6355",
320
+ "final_manifest_evidence": "PENDING_PROTECTED",
321
+ "production_activation": "NOT_RUN",
322
+ "npm_publish": "NOT_RUN"
315
323
  }
316
324
  }
package/README.txt CHANGED
@@ -1,4 +1,4 @@
1
- DEADBYTE MCP V0.15.62 / R160 TRUSTED RECOVERY AND BOUNDED ENGINEERING LOOP
1
+ DEADBYTE MCP V0.15.63 / R165 TRUSTED RECOVERY AND BOUNDED ENGINEERING LOOP
2
2
  =========================
3
3
 
4
4
  AUTHENTICATED MACHINE TRUTH + DURABLE AGENT + CODING + AUTONOMOUS PRODUCTION ENGINE
@@ -16,12 +16,12 @@ check `--version` before issuing a stateful command. The compatibility CMD
16
16
  fails with an explanation when npm is detected rather than forwarding the
17
17
  wrong command to the controller.
18
18
 
19
- npx -y deadbyte-mcp@0.15.62 mcp
20
- npx -y deadbyte-mcp@0.15.62 remote
21
- npx -y deadbyte-mcp@0.15.62 remote status
22
- npx -y deadbyte-mcp@0.15.62 remote restart
23
- npx -y deadbyte-mcp@0.15.62 audit status
24
- npx -y deadbyte-mcp@0.15.62 audit verify
19
+ npx -y deadbyte-mcp@0.15.63 mcp
20
+ npx -y deadbyte-mcp@0.15.63 remote
21
+ npx -y deadbyte-mcp@0.15.63 remote status
22
+ npx -y deadbyte-mcp@0.15.63 remote restart
23
+ npx -y deadbyte-mcp@0.15.63 audit status
24
+ npx -y deadbyte-mcp@0.15.63 audit verify
25
25
 
26
26
  MAJOR MCP CLIENT STDIO CONFIGS
27
27
  -------------------------------
@@ -32,7 +32,7 @@ CLAUDE DESKTOP
32
32
  "mcpServers": {
33
33
  "deadbyte": {
34
34
  "command": "npx",
35
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
35
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
36
36
  }
37
37
  }
38
38
  }
@@ -44,7 +44,7 @@ Save as .cursor/mcp.json:
44
44
  "mcpServers": {
45
45
  "deadbyte": {
46
46
  "command": "npx",
47
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
47
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
48
48
  }
49
49
  }
50
50
  }
@@ -57,7 +57,7 @@ Save as .vscode/mcp.json:
57
57
  "deadbyte": {
58
58
  "type": "stdio",
59
59
  "command": "npx",
60
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
60
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
61
61
  }
62
62
  }
63
63
  }
@@ -67,7 +67,7 @@ Add to the Codex MCP configuration:
67
67
 
68
68
  [mcp_servers.deadbyte]
69
69
  command = "npx"
70
- args = ["-y", "deadbyte-mcp@0.15.62", "mcp"]
70
+ args = ["-y", "deadbyte-mcp@0.15.63", "mcp"]
71
71
 
72
72
  The `mcp` command is the quiet stdio server entry for local MCP clients; stdout is reserved for MCP.
73
73
  The remote CLI invokes the stable active-release PowerShell launcher directly with shell=false.
@@ -356,7 +356,7 @@ CONTROLLER
356
356
  ----------
357
357
  Primary operator entry point:
358
358
 
359
- npx -y deadbyte-mcp@0.15.62 remote
359
+ npx -y deadbyte-mcp@0.15.63 remote
360
360
 
361
361
  The legacy CMD entry remains compatibility-only for R33 rollback safety.
362
362
 
@@ -417,7 +417,7 @@ MCP CLIENT CONFIGURATION
417
417
  ------------------------
418
418
  The local stdio entry point is quiet and suitable for MCP hosts:
419
419
 
420
- npx -y deadbyte-mcp@0.15.62 mcp
420
+ npx -y deadbyte-mcp@0.15.63 mcp
421
421
 
422
422
  CLAUDE DESKTOP
423
423
  Use the standard local-server entry in claude_desktop_config.json:
@@ -426,7 +426,7 @@ Use the standard local-server entry in claude_desktop_config.json:
426
426
  "mcpServers": {
427
427
  "deadbyte": {
428
428
  "command": "npx",
429
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
429
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
430
430
  }
431
431
  }
432
432
  }
@@ -439,7 +439,7 @@ Create .cursor/mcp.json:
439
439
  "deadbyte": {
440
440
  "type": "stdio",
441
441
  "command": "npx",
442
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
442
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
443
443
  }
444
444
  }
445
445
  }
@@ -452,7 +452,7 @@ Create .vscode/mcp.json:
452
452
  "deadbyte": {
453
453
  "type": "stdio",
454
454
  "command": "npx",
455
- "args": ["-y", "deadbyte-mcp@0.15.62", "mcp"]
455
+ "args": ["-y", "deadbyte-mcp@0.15.63", "mcp"]
456
456
  }
457
457
  }
458
458
  }
@@ -462,9 +462,9 @@ Add this to ~/.codex/config.toml:
462
462
 
463
463
  [mcp_servers.deadbyte]
464
464
  command = "npx"
465
- args = ["-y", "deadbyte-mcp@0.15.62", "mcp"]
465
+ args = ["-y", "deadbyte-mcp@0.15.63", "mcp"]
466
466
 
467
- The remote device path remains `npx -y deadbyte-mcp@0.15.62 remote`. Remote public MCP uses the
467
+ The remote device path remains `npx -y deadbyte-mcp@0.15.63 remote`. Remote public MCP uses the
468
468
  verified HTTPS named-tunnel URL selected by the active generation; do not commit a private device
469
469
  URL or tunnel token into a repository.
470
470
 
package/RELEASE.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema": "deadbyte.release.v1",
3
3
  "name": "deadbyte-mcp",
4
- "version": "0.15.62",
5
- "train": "R160",
6
- "label": "R160 TRUSTED RECOVERY AND BOUNDED ENGINEERING LOOP",
4
+ "version": "0.15.63",
5
+ "train": "R165",
6
+ "label": "R165 remote startup hotfix",
7
7
  "protocol_revision": "2026-07-28",
8
8
  "parent": {
9
9
  "version": "0.15.61",
@@ -19,11 +19,12 @@
19
19
  "generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4"
20
20
  },
21
21
  "source_predecessor": {
22
- "version": "0.15.61",
23
- "train": "R159",
24
- "source_path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.62-r159-marker-reconcile",
25
- "release_status": "DEVELOPMENT_UNSEALED",
26
- "manifest_status": "STALE_REJECTED"
22
+ "version": "0.15.62",
23
+ "train": "R163",
24
+ "source_path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.62-r163-release-closure",
25
+ "release_status": "PUBLISHED_REGISTRY_VERIFIED",
26
+ "manifest_status": "VERIFIED_FINAL_BYTES",
27
+ "tarball_sha256": "812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641"
27
28
  },
28
29
  "consolidation": {
29
30
  "frontend_status_vocabulary": true,
@@ -460,5 +461,19 @@
460
461
  "production_activation": "NOT_RUN",
461
462
  "npm_publish": "NOT_RUN",
462
463
  "stable_final_claim": false
464
+ },
465
+ "r165": {
466
+ "published_source_predecessor_version": "0.15.62",
467
+ "published_source_manifest_sha256": "4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805",
468
+ "published_source_tarball_sha256": "812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641",
469
+ "engineering_r164_manifest_sha256": "da499a1fcdfd7fd9b31b3755cd7ef6cdbd361571acdf7082374543ff4ec508ad",
470
+ "runtime_predecessor_release_id": "v0.15.61-055d1ff0aa99e60b",
471
+ "real_cli_startup_receipt_sha256": "0547d1da28a65031109c13571688c95845a0ca42f0895030e820634e416d6355",
472
+ "publication_mode": "PUBLISH_ONLY",
473
+ "windows_final": "PENDING_PROTECTED",
474
+ "npm_verify_only": "PENDING_FINAL_BYTES",
475
+ "production_activation": "NOT_RUN",
476
+ "npm_publish": "NOT_RUN",
477
+ "stable_final_claim": false
463
478
  }
464
479
  }
package/SBOM.cdx.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:cdx:deadbyte-mcp:r160:0.15.62",
4
+ "serialNumber": "urn:cdx:deadbyte-mcp:r165:0.15.63",
5
5
  "version": 1,
6
6
  "metadata": {
7
7
  "component": {
8
8
  "type": "application",
9
9
  "name": "deadbyte-mcp",
10
- "version": "0.15.62"
10
+ "version": "0.15.63"
11
11
  }
12
12
  },
13
13
  "components": [
package/TEST-MATRIX.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "deadbyte.test-matrix.v1",
3
- "version": "0.15.62",
4
- "train": "R160",
3
+ "version": "0.15.63",
4
+ "train": "R165",
5
5
  "primary_platform": "win32-x64",
6
6
  "reference": {
7
7
  "package": "@wonderwhy-er/desktop-commander",
@@ -579,5 +579,12 @@
579
579
  "npm_verify_only": "PENDING_FINAL_BYTES",
580
580
  "classified_skips": "R162_43_HISTORICAL_3_POSIX_3_R35_OPTIONAL",
581
581
  "publish_guard": "REQUIRES_EXTERNAL_EVIDENCE"
582
+ },
583
+ "r165": {
584
+ "real_cli_version_skew": "4_PASS_0_FAIL_WITH_CONTROLLED_PREDEPLOY_STOP",
585
+ "full_protected_regression": "PENDING",
586
+ "isolated_activation_rollback_restore": "PENDING",
587
+ "npm_artifact_verify_only": "PENDING",
588
+ "publish_readiness": "PENDING"
582
589
  }
583
590
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-chatgpt-bridge",
3
- "version": "0.15.62",
3
+ "version": "0.15.63",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-mcp",
3
- "version": "0.15.62",
3
+ "version": "0.15.63",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Authenticated MCP agentic runtime with signed skills, persistent model backends, identity-bound remote devices, durable job supervision, immutable release slots, and separately revocable machine authority.",
@@ -8,6 +8,7 @@ import {assertR71NpmPublishReady} from './npm-release-readiness-r71.mjs';
8
8
  import {assertR72NpmPublishReady} from './npm-release-readiness-r72.mjs';
9
9
  import {assertR74NpmPublishReady} from './npm-release-readiness-r74.mjs';
10
10
  import {assertR163NpmPublishReady} from './npm-release-readiness-r163.mjs';
11
+ import {assertR165NpmPublishReady} from './npm-release-readiness-r165.mjs';
11
12
  import { existsSync } from 'node:fs';
12
13
  import { resolveStateRoot } from '../src/state-root.mjs';
13
14
  import path from 'node:path';
@@ -100,6 +101,10 @@ async function main() {
100
101
  if (!publishOnly) throw new Error('PUBLISH_BLOCKED R163 0.15.62 requires --publish-only; production activation is a separate authority boundary');
101
102
  await assertR163NpmPublishReady(release,{root});
102
103
  }
104
+ if (!isVerifyOnly && version==='0.15.63') {
105
+ if (!publishOnly) throw new Error('PUBLISH_BLOCKED R165 0.15.63 requires --publish-only; production activation is a separate authority boundary');
106
+ await assertR165NpmPublishReady(release,{root});
107
+ }
103
108
  if (release.parent?.release_id !== provenance.parent_release_id ||
104
109
  release.parent?.manifest_sha256 !== provenance.parent_manifest_sha256 ||
105
110
  release.parent?.generation_manifest_sha256 !== provenance.parent_generation_manifest_sha256) {
@@ -0,0 +1,68 @@
1
+ /** R165 0.15.63 publication fence. No evidence generation or authority mutation. */
2
+ import {createHash} from 'node:crypto';
3
+ import {readFile,lstat} from 'node:fs/promises';
4
+ import path from 'node:path';
5
+
6
+ const sha=b=>createHash('sha256').update(b).digest('hex');
7
+ const parent='v0.15.61-055d1ff0aa99e60b';
8
+ const parentManifest='055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf';
9
+ const parentGen='f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4';
10
+ const reject=(m)=>{throw new Error('PUBLISH_BLOCKED R165 '+m);};
11
+ const hex=x=>typeof x==='string'&&/^[0-9a-f]{64}$/.test(x);
12
+ const readJson=async f=>JSON.parse(await readFile(f,'utf8'));
13
+ async function checkedEvidenceFile(file,digest,{allowEmpty=false}={}){
14
+ if(!hex(digest))reject('missing exact evidence digest');
15
+ const info=await lstat(file).catch(()=>reject('evidence file missing '+file));
16
+ if(!info.isFile()||info.isSymbolicLink()||(!allowEmpty&&info.size<1)||info.size>16*1024*1024)reject('invalid evidence file');
17
+ const bytes=await readFile(file);
18
+ if(sha(bytes)!==digest)reject('evidence SHA-256 mismatch '+file);
19
+ return bytes;
20
+ }
21
+ function boundedEvidence(root,relative){
22
+ if(typeof relative!=='string'||!relative||relative.includes('\\'))reject('invalid evidence relative path');
23
+ const p=path.resolve(root,relative),r=path.relative(root,p);
24
+ if(!r||r.startsWith('..')||path.isAbsolute(r))reject('evidence path escape');
25
+ return p;
26
+ }
27
+ export async function assertR165NpmPublishReady(release,{root,evidenceRoot=process.env.DEADBYTE_R165_CLOSURE_ROOT}={}){
28
+ if(release?.name!=='deadbyte-mcp'||release?.version!=='0.15.63'||release?.train!=='R165'||release?.r165?.publication_mode!=='PUBLISH_ONLY')reject('release metadata not R165-closed');
29
+ if(release?.parent?.release_id!==parent||release?.parent?.manifest_sha256!==parentManifest||release?.parent?.generation_manifest_sha256!==parentGen||release?.runtime_predecessor?.release_id!==parent)reject('active predecessor lineage mismatch');
30
+ if(!root||!path.isAbsolute(root))reject('candidate root missing');
31
+ if(!evidenceRoot||!path.isAbsolute(evidenceRoot))reject('closure evidence path missing');
32
+ const testRoot=path.resolve(root,'..','..','testing','r165-release-closure');
33
+ const evidence=path.resolve(evidenceRoot);
34
+ const relative=path.relative(testRoot,evidence);
35
+ if(!relative||relative.startsWith('..')||path.isAbsolute(relative))reject('evidence outside bounded R165 testing root');
36
+ for(const p of [testRoot,evidence]){const st=await lstat(p).catch(()=>reject('evidence directory absent'));if(!st.isDirectory()||st.isSymbolicLink())reject('evidence directory is reparse/symlink');}
37
+ const closurePath=path.join(evidence,'closure.json');
38
+ const closureInfo=await lstat(closurePath).catch(()=>reject('closure missing'));
39
+ if(!closureInfo.isFile()||closureInfo.isSymbolicLink()||closureInfo.size<1||closureInfo.size>1024*1024)reject('closure file not regular/bounded');
40
+ const closure=await readJson(closurePath).catch(()=>reject('closure missing/invalid'));
41
+ if(closure?.schema!=='deadbyte.r165-release-closure.v1'||closure?.version!=='0.15.63'||closure?.status!=='PASS'||closure?.production_release_id!==parent)reject('closure subject/status mismatch');
42
+ const manifestSha=sha(await readFile(path.join(root,'MANIFEST.SHA256')));
43
+ if(closure.source_manifest_sha256!==manifestSha)reject('final manifest differs from closure');
44
+ const files=closure?.files;
45
+ if(!files||!['protected_receipt','protected_stdout','protected_stderr','verify_receipt','verify_stdout','verify_stderr'].every(k=>files[k]&&typeof files[k].path==='string'&&hex(files[k].sha256)))reject('required receipts missing');
46
+ const data={};
47
+ for(const [key,info] of Object.entries(files)) data[key]=await checkedEvidenceFile(boundedEvidence(testRoot,info.path),info.sha256,{allowEmpty:key.endsWith('_stderr')});
48
+ let protectedReceipt,verifyReceipt;
49
+ try{protectedReceipt=JSON.parse(data.protected_receipt);verifyReceipt=JSON.parse(data.verify_receipt);}
50
+ catch{reject('gate receipts invalid JSON');}
51
+ if(protectedReceipt?.schema!=='deadbyte.r165-protected-windows-gate.v1'||protectedReceipt?.stage!=='full'||protectedReceipt?.exit_code!==0||protectedReceipt?.source_manifest_sha256!==manifestSha||protectedReceipt?.active_release_id!==parent)reject('protected gate missing or unbound');
52
+ if(protectedReceipt.stdout_sha256!==sha(data.protected_stdout)||protectedReceipt.stderr_sha256!==sha(data.protected_stderr))reject('protected log mismatch');
53
+ const stdout=data.protected_stdout.toString('utf8');
54
+ const counts=Object.fromEntries(['tests','pass','fail','skipped'].map(k=>[k,Number(new RegExp('^# '+k+' (\\d+)\\s*$','m').exec(stdout)?.[1]??NaN)]));
55
+ if(counts.tests<1955||counts.pass<1906||counts.fail!==0||counts.skipped!==49||counts.pass+counts.skipped!==counts.tests||/^not ok\s+\d+/m.test(stdout))reject('full regression totals mismatch');
56
+ if(!/^ok\s+\d+\s+-\s+R165 isolated immutable slot activates, rolls back, and restores 0\.15\.63/m.test(stdout))reject('R165 live rollback proof missing');
57
+ if(!/^ok\s+\d+\s+-\s+R165 executable CLI passes completed R159 history/m.test(stdout))reject('R165 executable startup proof missing');
58
+ const skips=stdout.split(/\r?\n/).filter(x=>/^ok\s+\d+\s+-.*# SKIP/.test(x));
59
+ if(skips.length!==49||skips.some(x=>!/historical|R35 external semantic backend|POSIX|R100 POSIX/i.test(x)))reject('unexpected unclassified skipped test');
60
+ if(verifyReceipt?.schema!=='deadbyte.r165-release-verify.v1'||verifyReceipt?.status!=='PASS'||verifyReceipt?.version!=='0.15.63'||verifyReceipt?.source_manifest_sha256!==manifestSha||verifyReceipt?.production_release_id!==parent||verifyReceipt?.exit_code!==0)reject('verify-only receipt subject/status mismatch');
61
+ if(verifyReceipt.stdout_sha256!==sha(data.verify_stdout)||verifyReceipt.stderr_sha256!==sha(data.verify_stderr))reject('verify-only transcript hash mismatch');
62
+ const vout=data.verify_stdout.toString('utf8');
63
+ if(!vout.includes('VERIFY-ONLY PIPELINE PASS')||!vout.includes('Artifact isolation gate PASS')||!vout.includes('VERIFIED_TARBALL '))reject('npm verify-only output missing');
64
+ const tarLine=vout.split(/\r?\n/).find(x=>x.startsWith('VERIFIED_TARBALL '));
65
+ try{const p=JSON.parse(tarLine.slice('VERIFIED_TARBALL '.length));if(p.filename!=='deadbyte-mcp-0.15.63.tgz'||!hex(p.sha256)||p.bytes<1)reject('npm tarball identity invalid');}
66
+ catch{reject('npm tarball evidence invalid');}
67
+ return Object.freeze({status:'R165_RELEASE_READY_EVIDENCE_BOUND',version:'0.15.63',manifest_sha256:manifestSha,checks:6});
68
+ }
@@ -547,13 +547,33 @@ async function recoverRemoteSession(ctx,{displayMode='unicode'}={}){
547
547
  const historyAllowed=activePointer?.version===DEADBYTE_VERSION&&
548
548
  activePointer?.manifest_sha256===currentManifestSha256&&
549
549
  activePointer?.release_id===('v'+DEADBYTE_VERSION+'-'+currentManifestSha256.slice(0,16));
550
+ // R164: a different CLI version is not sufficient reason to replay a
551
+ // completed receipt. Only a verified ONLINE active predecessor may ignore
552
+ // completed history; pending, locator conflicts, and tampering still fail.
553
+ let onlinePredecessorReady=false;
554
+ if(!historyAllowed&&activePointer){
555
+ try{
556
+ const runtime=observedAuthority(ctx);
557
+ if(runtime.state==='ONLINE'){
558
+ assertRuntimeReadyObservation(runtime,{coreRoot:activePointer.release_root});
559
+ onlinePredecessorReady=true;
560
+ }
561
+ }catch{onlinePredecessorReady=false;}
562
+ }
550
563
  const selected=await selectLegacyMarkerEvidence({evidenceDir,activePointer,
551
- allowCompletedHistory:historyAllowed});
564
+ allowCompletedHistory:historyAllowed||onlinePredecessorReady});
552
565
  if(selected.kind==='none')return null;
553
566
  if(selected.kind==='completed_history_ambiguous'){
554
- if(!historyAllowed)throw new Error('R159 completed history cannot be reused across a release change');
555
- // Nothing is pending: do not select an arbitrary completed receipt.
556
- // A future upgrade still requires its own exact signed migration proof.
567
+ if(!historyAllowed){
568
+ if(!onlinePredecessorReady)throw new Error('R164 completed history requires a verified ONLINE predecessor');
569
+ const readback=await readActiveRuntimeBinding(ctx.root);
570
+ for(const key of ['release_id','version','manifest_sha256','generation_manifest_sha256'])
571
+ if(readback?.[key]!==activePointer?.[key])
572
+ throw new Error('R164 predecessor changed during completed-history classification');
573
+ assertRuntimeReadyObservation(observedAuthority(ctx),{coreRoot:readback.release_root});
574
+ }
575
+ // Every completed receipt was validated by R159 and no pending intent
576
+ // exists. Do not adopt any receipt as an upgrade/migration authority.
557
577
  return null;
558
578
  }
559
579
  if(selected.kind==='located'){
package/src/version.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export const DEADBYTE_VERSION = '0.15.62';
1
+ export const DEADBYTE_VERSION = '0.15.63';
2
2
  export const MCP_PROTOCOL_VERSION = '2026-07-28';
3
3
  export const RECEIPT_SCHEMA_V1 = 'deadbyte.receipt.v1';
4
4
  export const RECEIPT_SCHEMA_V2 = 'deadbyte.receipt.v2';
@@ -13,13 +13,13 @@ test('R130 security patch has a new immutable package identity and truthful sour
13
13
  read('SBOM.cdx.json'),read('package-lock.json'),read('TEST-MATRIX.json')]);
14
14
  assert.equal(pkg.name,'deadbyte-mcp');
15
15
  for(const actual of [pkg.version,release.version,provenance.version,matrix.version,bom.metadata.component.version,lock.version,lock.packages[''].version,DEADBYTE_VERSION])
16
- assert.equal(actual,'0.15.62');
17
- assert.equal(release.train,'R160');
18
- assert.equal(matrix.train,'R160');
19
- assert.equal(release.source_predecessor.version,'0.15.61');
20
- assert.equal(release.source_predecessor.train,'R159');
21
- assert.match(release.source_predecessor.source_path,/r159-marker-reconcile/i);
22
- assert.equal(release.source_predecessor.manifest_status,'STALE_REJECTED');
16
+ assert.equal(actual,'0.15.63');
17
+ assert.equal(release.train,'R165');
18
+ assert.equal(matrix.train,'R165');
19
+ assert.equal(release.source_predecessor.version,'0.15.62');
20
+ assert.equal(release.source_predecessor.train,'R163');
21
+ assert.match(release.source_predecessor.source_path,/0\.15\.62-r163-release-closure/i);
22
+ assert.equal(release.source_predecessor.manifest_status,'VERIFIED_FINAL_BYTES');
23
23
  assert.equal(release.runtime_predecessor.version,'0.15.61');
24
24
  assert.equal(provenance.r160.source_predecessor_manifest_status,'STALE_REJECTED');
25
25
  assert.equal(pkg.dependencies['@modelcontextprotocol/client'],'2.3.1');
@@ -8,19 +8,23 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
8
8
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
9
9
  const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
10
10
 
11
- test('R160 package identities retain R132 historic evidence and separate the development predecessor',async()=>{
11
+ test('R165 package identity preserves R132 evidence and published source predecessor',async()=>{
12
12
  const [pkg,lock,release,prov,bom,matrix]=await Promise.all([
13
13
  read('package.json'),read('package-lock.json'),read('RELEASE.json'),
14
14
  read('PROVENANCE.json'),read('SBOM.cdx.json'),read('TEST-MATRIX.json')]);
15
15
  for(const value of [pkg.version,lock.version,lock.packages[''].version,release.version,prov.version,bom.metadata.component.version,matrix.version,DEADBYTE_VERSION]){
16
16
  assert.equal(value,pkg.version);
17
17
  }
18
- assert.equal(release.train,'R160');
19
- assert.equal(matrix.train,'R160');
20
- assert.equal(release.source_predecessor.version,'0.15.61');
21
- assert.equal(release.source_predecessor.train,'R159');
22
- assert.match(release.source_predecessor.source_path,/r159-marker-reconcile/i);
18
+ assert.equal(release.train,'R165');
19
+ assert.equal(matrix.train,'R165');
20
+ assert.equal(release.source_predecessor.version,'0.15.62');
21
+ assert.equal(release.source_predecessor.train,'R163');
22
+ assert.match(release.source_predecessor.source_path,/0\.15\.62-r163-release-closure/i);
23
23
  assert.equal(prov.r160.source_predecessor_manifest_status,'STALE_REJECTED');
24
+ assert.equal(release.r165.published_source_manifest_sha256,'4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805');
25
+ assert.equal(release.r165.published_source_tarball_sha256,'812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641');
26
+ assert.equal(release.source_predecessor.tarball_sha256,release.r165.published_source_tarball_sha256);
27
+ assert.equal(prov.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
24
28
  assert.equal(release.runtime_predecessor.version,'0.15.61');
25
29
  assert.equal(prov.runtime_predecessor.release_id,release.runtime_predecessor.release_id);
26
30
  assert.equal(prov.runtime_predecessor.manifest_sha256,release.runtime_predecessor.manifest_sha256);
@@ -26,7 +26,7 @@ test('R153 historical verifier refuses current R160 package identity',async()=>{
26
26
  const state={pkg:JSON.parse(await readFile(path.join(root,'package.json'),'utf8')),
27
27
  release:JSON.parse(await readFile(path.join(root,'RELEASE.json'),'utf8')),
28
28
  bridge:JSON.parse(await readFile(path.join(root,'bridge/package.json'),'utf8'))};
29
- assert.equal(state.pkg.version,'0.15.62');
29
+ assert.equal(state.pkg.version,'0.15.63');
30
30
  assert.throws(()=>verifyR153Lineage(state),/package version/);
31
31
  await assert.rejects(verifyR153IdentityTree(root),/package version/);
32
32
  });
@@ -72,7 +72,10 @@ test('R159 two unlocated completed current receipts remain ambiguous',async t=>{
72
72
  });
73
73
  test('R159 remote foreground code routes historical locators through subject selection',async()=>{
74
74
  const cli=await readFile(new URL('../src/deadbyte-cli.mjs',import.meta.url),'utf8');
75
- assert.match(cli,/selectLegacyMarkerEvidence\(\{evidenceDir,activePointer,\s*allowCompletedHistory:historyAllowed\}\)/);
75
+ assert.match(cli,/selectLegacyMarkerEvidence\(\{evidenceDir,activePointer,\s*allowCompletedHistory:historyAllowed\|\|onlinePredecessorReady\}\)/);
76
+ assert.match(cli,/assertRuntimeReadyObservation\(runtime,\{coreRoot:activePointer\.release_root\}\)/);
77
+ assert.match(cli,/R164 predecessor changed during completed-history classification/);
78
+ assert.match(cli,/assertRuntimeReadyObservation\(observedAuthority\(ctx\),\{coreRoot:readback\.release_root\}\)/);
76
79
  assert.match(cli,/R159 active release changed during marker recovery/);
77
80
  assert.match(cli,/marker-'\+reconciled\.marker_sha256\+'\.locator\.json'/);
78
81
  assert.doesNotMatch(cli,/publishExclusiveJson\(locatorPath,locator\)/);
@@ -13,15 +13,15 @@ test('R160 package identity separates source and live runtime predecessors',asyn
13
13
  read('package.json'),read('package-lock.json'),read('bridge/package.json'),read('RELEASE.json'),
14
14
  read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
15
15
  for(const version of [pkg.version,lock.version,lock.packages[''].version,bridge.version,release.version,
16
- provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION]) assert.equal(version,'0.15.62');
17
- assert.equal(release.train,'R160');
18
- assert.equal(matrix.train,'R160');
16
+ provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION]) assert.equal(version,'0.15.63');
17
+ assert.equal(release.train,'R165');
18
+ assert.equal(matrix.train,'R165');
19
19
  assert.equal(release.runtime_predecessor.version,'0.15.61');
20
20
  assert.equal(release.runtime_predecessor.release_id,'v0.15.61-055d1ff0aa99e60b');
21
21
  assert.equal(release.runtime_predecessor.manifest_sha256,'055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf');
22
22
  assert.equal(release.runtime_predecessor.generation_manifest_sha256,'f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4');
23
- assert.equal(release.source_predecessor.train,'R159');
24
- assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.62-r159-marker-reconcile/i);
23
+ assert.equal(release.source_predecessor.train,'R163');
24
+ assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.62-r163-release-closure/i);
25
25
  assert.equal(release.r160.public_tool_delta,0);
26
26
  assert.equal(release.r160.authority_scope_delta,0);
27
27
  assert.equal(release.r160.production_activation,'NOT_RUN');
@@ -8,7 +8,7 @@ import {fileURLToPath} from 'node:url';
8
8
  import {atomicWriteActivePointer,materializeReleaseSlot,parseActivePointer,parseManifest,renderStableLauncherPs1,verifyManifestTreeExact} from '../src/release-slot.mjs';
9
9
 
10
10
  const candidate=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
11
- const version='0.15.62';
11
+ const version='0.15.63';
12
12
  const parent=path.join(os.homedir(),'.deadbyte-mcp','releases','v0.15.61-055d1ff0aa99e60b');
13
13
  const parentDigest='055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf';
14
14
  const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
@@ -21,7 +21,7 @@ async function generation(state,label){
21
21
  await writeFile(path.join(root,'GENERATION.SHA256'),manifest,{flag:'wx'});
22
22
  return {root,manifest_sha256:sha(manifest),config_path:path.join(root,'controller-config.psd1')};
23
23
  }
24
- test('R163 isolated immutable slot activates, rolls back, and restores 0.15.62 without authority or production mutation',async()=>{
24
+ test('R165 isolated immutable slot activates, rolls back, and restores 0.15.63 without authority or production mutation',async()=>{
25
25
  const stateBase=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r163-isolated-'));
26
26
  const state=path.join(stateBase,'state');
27
27
  try{
@@ -33,8 +33,8 @@ test('R163 isolated immutable slot activates, rolls back, and restores 0.15.62 w
33
33
  const nextDigest=sha(nextManifest);
34
34
  const parentSlot=await materializeReleaseSlot({source:parent,stateRoot:state,version:'0.15.61',manifestSha256:parentDigest});
35
35
  const nextSlot=await materializeReleaseSlot({source:candidate,stateRoot:state,version,manifestSha256:nextDigest});
36
- const pGen=await generation(state,'r163-parent');
37
- const nGen=await generation(state,'r163-next');
36
+ const pGen=await generation(state,'r165-parent');
37
+ const nGen=await generation(state,'r165-next');
38
38
  const launcherSha=sha(Buffer.from(renderStableLauncherPs1(),'utf8'));
39
39
  const pointerPath=path.join(state,'active-release.json');
40
40
  const ptr=(slot,ver,g)=>({schema:'deadbyte.active-release.v1',release_id:slot.release_id,version:ver,
@@ -0,0 +1,13 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import {readFile} from 'node:fs/promises';
4
+
5
+ test('R164 current ONLINE predecessor permits completed-history classification, not receipt adoption',async()=>{
6
+ const cli=await readFile(new URL('../src/deadbyte-cli.mjs',import.meta.url),'utf8');
7
+ assert.match(cli,/assertRuntimeReadyObservation\(runtime,\{coreRoot:activePointer\.release_root\}\)/);
8
+ assert.match(cli,/allowCompletedHistory:historyAllowed\|\|onlinePredecessorReady/);
9
+ assert.match(cli,/R164 predecessor changed during completed-history classification/);
10
+ assert.match(cli,/assertRuntimeReadyObservation\(observedAuthority\(ctx\),\{coreRoot:readback\.release_root\}\)/);
11
+ assert.match(cli,/if\(!onlinePredecessorReady\)throw new Error/);
12
+ assert.match(cli,/do not adopt any receipt as an upgrade\/migration authority/i);
13
+ });
@@ -0,0 +1,90 @@
1
+ // Executable foreground CLI proof. All runtime state is created under a fresh OS temp dir.
2
+ // The fake controller intentionally rejects disarmhost, BEFORE any production deployment.
3
+ import test from 'node:test';
4
+ import assert from 'node:assert/strict';
5
+ import {createHash} from 'node:crypto';
6
+ import {mkdtemp,mkdir,readFile,writeFile,readdir,rm} from 'node:fs/promises';
7
+ import {spawnSync} from 'node:child_process';
8
+ import path from 'node:path';
9
+ import {fileURLToPath} from 'node:url';
10
+ import os from 'node:os';
11
+ const sha=b=>createHash('sha256').update(b).digest('hex');
12
+ const envRoot=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
13
+ const expectedManifest=null;
14
+ const predecessor={version:'0.15.61',release_id:'v0.15.61-055d1ff0aa99e60b',manifest_sha256:'055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf',generation_manifest_sha256:'f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4'};
15
+ const gate=process.platform==='win32'?test:test.skip;
16
+ const hashMarker=c=>c.repeat(64);
17
+ async function fixture(t,kind){
18
+ assert.equal(typeof envRoot,'string'); assert.ok(path.isAbsolute(envRoot));
19
+ assert.match(sha(await readFile(path.join(envRoot,'MANIFEST.SHA256'))),/^[0-9a-f]{64}$/);
20
+ assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.63');
21
+ const dir=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r164-skew-e2e-'));
22
+ t.after(async()=>{await rm(dir,{recursive:true,force:true,maxRetries:10,retryDelay:150});});
23
+ const state=path.join(dir,'state'),bin=path.join(state,'bin');
24
+ const legacy=path.join(state,'evidence','legacy-migration');
25
+ const trace=path.join(dir,'controller.trace');
26
+ const releaseRoot=path.join(state,'releases','predecessor');
27
+ const generationRoot=path.join(state,'generations','predecessor');
28
+ await mkdir(bin,{recursive:true});await mkdir(legacy,{recursive:true});
29
+ const pointer={schema:'deadbyte.active-release.v1',...predecessor,release_root:releaseRoot,generation_root:generationRoot,launcher_sha256:hashMarker('9'),config_path:path.join(generationRoot,'controller-config.psd1')};
30
+ await writeFile(path.join(state,'active-release.json'),JSON.stringify(pointer)+'\n','utf8');
31
+ // The true CLI calls this local PowerShell stub; a hard stop precedes deploy.
32
+ const ps=`param([string]$Command,[switch]$Json)\n$ErrorActionPreference='Stop'\n[IO.File]::AppendAllText($env:DEADBYTE_SKEW_E2E_TRACE,($Command+[Environment]::NewLine),[Text.Encoding]::UTF8)\nif($Command -eq 'status' -and $Json){\n $auth=@{};foreach($id in @('process','coding','autonomous','desktop','host')){$auth[$id]=@{configured=$true;armed=$false;reason='disarmed'}}\n @{schema='deadbyte.controller-observation.v1';state=$env:DEADBYTE_SKEW_E2E_RUNTIME_STATE;local_ready=$true;core_root=$env:DEADBYTE_SKEW_E2E_CORE_ROOT;bridge=@{alive=$true;reason='verified'};core=@{alive=$true;reason='verified'};cloud=@{alive=$true;reason='verified'};supervisor=@{running=$true};authority=$auth}|ConvertTo-Json -Depth 6 -Compress;exit 0\n}\nif($Command -eq 'disarmhost'){[Console]::Error.WriteLine('R164_INTENTIONAL_PREDEPLOY_STOP');exit 93}\nWrite-Error ('R164_UNEXPECTED_CONTROLLER_OPERATION '+$Command);exit 99\n`;
33
+ await writeFile(path.join(bin,'DEADBYTE-MCP.ps1'),ps,'utf8');
34
+ const currentIds=['a','b'];
35
+ for(const id of currentIds){
36
+ const marker=hashMarker(id),intent={schema:'deadbyte.r153-marker-reconciliation-intent.v1',state:'RECONCILIATION_CLAIMED',marker_sha256:marker,predecessor,subject_sha256:hashMarker('7')};
37
+ const intentBytes=Buffer.from(JSON.stringify(intent)+'\n');
38
+ const terminal={schema:'deadbyte.r153-marker-reconciliation.v1',state:'MARKER_RECONCILED',marker_sha256:marker,predecessor,intent_sha256:sha(intentBytes),subject_sha256:hashMarker('8')};
39
+ await writeFile(path.join(legacy,`marker-${marker}.intent.json`),intentBytes,{flag:'wx'});
40
+ await writeFile(path.join(legacy,`marker-${marker}.terminal.json`),JSON.stringify(terminal)+'\n',{flag:'wx'});
41
+ }
42
+ if(kind==='pending'){
43
+ const marker=hashMarker('c'),intent={schema:'deadbyte.r153-marker-reconciliation-intent.v1',state:'RECONCILIATION_CLAIMED',marker_sha256:marker,predecessor,subject_sha256:hashMarker('7')};
44
+ await writeFile(path.join(legacy,`marker-${marker}.intent.json`),JSON.stringify(intent)+'\n',{flag:'wx'});
45
+ }
46
+ if(kind==='tampered'){
47
+ const p=path.join(legacy,`marker-${hashMarker('b')}.terminal.json`);
48
+ const terminal=JSON.parse(await readFile(p,'utf8'));
49
+ terminal.intent_sha256=hashMarker('0');
50
+ await writeFile(p,JSON.stringify(terminal)+'\n');
51
+ }
52
+ const before=await Promise.all((await readdir(legacy)).sort().map(async name=>[name,sha(await readFile(path.join(legacy,name)))]));
53
+ const env={...process.env,DEADBYTE_STATE_ROOT:state,DEADBYTE_SKEW_E2E_TRACE:trace,DEADBYTE_SKEW_E2E_CORE_ROOT:releaseRoot,DEADBYTE_SKEW_E2E_RUNTIME_STATE:kind==='offline'?'OFFLINE':'ONLINE'};
54
+ return {dir,state,legacy,trace,env,before};
55
+ }
56
+ async function run(fx){
57
+ const cli=path.join(envRoot,'src','deadbyte-cli.mjs');
58
+ const result=spawnSync(process.execPath,[cli,'remote'],{env:fx.env,cwd:fx.dir,windowsHide:true,shell:false,encoding:'utf8',timeout:45000,maxBuffer:2*1024*1024});
59
+ if(result.error)throw result.error;
60
+ assert.equal(result.status,1,'expected hard stop BEFORE deploy');
61
+ const after=await Promise.all((await readdir(fx.legacy)).sort().map(async name=>[name,sha(await readFile(path.join(fx.legacy,name)))]));
62
+ assert.deepEqual(after,fx.before,'reconciliation evidence mutated');
63
+ await assert.rejects(readFile(path.join(fx.state,'runtime','remote-session.json')),{code:'ENOENT'});
64
+ let trace='';try{trace=await readFile(fx.trace,'utf8');}catch(e){if(e.code!=='ENOENT')throw e;}
65
+ assert.doesNotMatch(trace,/\b(?:start|restart|armprocess|armcoding|armautonomous|deploy)\b/i,'unexpected runtime operation');
66
+ return {output:(result.stderr||'')+'\n'+(result.stdout||''),trace};
67
+ }
68
+ gate('R165 executable CLI passes completed R159 history, reaches 0.15.61 -> 0.15.63 synchronization safely',async t=>{
69
+ const fx=await fixture(t,'completed');
70
+ const r=await run(fx);
71
+ assert.match(r.output,/runtime coherence 'disarmhost' failed exit=93/i,r.output);
72
+ assert.doesNotMatch(r.output,/R159 ambiguous multiple completed/i);
73
+ assert.match(r.trace,/disarmhost/);
74
+ assert.doesNotMatch(r.trace,/disarmdesktop/);
75
+ });
76
+ gate('R165 executable CLI rejects pending current reconciliation before upgrade',async t=>{
77
+ const fx=await fixture(t,'pending'),r=await run(fx);
78
+ assert.match(r.output,/pending marker reconciliation requires an offline runtime/i,r.output);
79
+ assert.doesNotMatch(r.trace,/disarmhost/);
80
+ });
81
+ gate('R165 executable CLI rejects tampered terminal before upgrade',async t=>{
82
+ const fx=await fixture(t,'tampered'),r=await run(fx);
83
+ assert.match(r.output,/terminal intent\/subject mismatch|terminal.*mismatch/i,r.output);
84
+ assert.doesNotMatch(r.trace,/disarmhost/);
85
+ });
86
+ gate('R165 executable CLI keeps ambiguous history fail-closed when predecessor is not ONLINE',async t=>{
87
+ const fx=await fixture(t,'offline'),r=await run(fx);
88
+ assert.match(r.output,/R159 ambiguous multiple completed reconciliation receipts/i,r.output);
89
+ assert.doesNotMatch(r.trace,/disarmhost/);
90
+ });
@@ -0,0 +1,13 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import path from 'node:path';
4
+ import {fileURLToPath} from 'node:url';
5
+ import {assertR165NpmPublishReady} from '../scripts/npm-release-readiness-r165.mjs';
6
+ const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
7
+ const release={name:'deadbyte-mcp',version:'0.15.63',train:'R165',r165:{publication_mode:'PUBLISH_ONLY'},parent:{release_id:'v0.15.61-055d1ff0aa99e60b',manifest_sha256:'055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf',generation_manifest_sha256:'f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4'},runtime_predecessor:{release_id:'v0.15.61-055d1ff0aa99e60b'}};
8
+ test('R165 publish gate fails closed with missing evidence',async()=>{
9
+ await assert.rejects(()=>assertR165NpmPublishReady(release,{root,evidenceRoot:null}),/PUBLISH_BLOCKED R165/);
10
+ });
11
+ test('R165 publish gate rejects changed parent identity before evidence read',async()=>{
12
+ await assert.rejects(()=>assertR165NpmPublishReady({...release,parent:{...release.parent,release_id:'v0.15.60-wrong'}},{root}),/predecessor lineage mismatch/);
13
+ });
@@ -83,7 +83,7 @@ test('R72 compact baseline permits only R64 read offset and authorized coding-on
83
83
  assert.deepEqual(diff.added,[]);
84
84
  assert.deepEqual(diff.removed,[]);
85
85
  const packageVersion=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8')).version;
86
- if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62'].includes(packageVersion)){
86
+ if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62','0.15.63'].includes(packageVersion)){
87
87
  assert.deepEqual([...diff.schema_changed].sort(),['machine_fs','native_diff_preview']);
88
88
  assert.equal(diff.unchanged.length,41);
89
89
  const prior=baseline.tools.find(tool=>tool.name==='machine_fs');
@@ -1,7 +1,7 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
3
  import {spawnSync} from 'node:child_process';
4
- import {mkdtemp,rm,readFile} from 'node:fs/promises';
4
+ import {mkdtemp,mkdir,rm,readFile,writeFile} from 'node:fs/promises';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
7
  import {fileURLToPath} from 'node:url';
@@ -22,16 +22,36 @@ test('repository compatibility CMD refuses to masquerade as an exact npm package
22
22
  assert.doesNotMatch(run.stderr,/deadbyte-controller\.ps1/);
23
23
  });
24
24
 
25
- test('isolated exact local tarball invocation reaches its package bin outside the source tree', {skip:process.platform!=='win32',timeout:120000},async()=>{
25
+ test('isolated exact local tarball install reaches its package bin outside the source tree', {skip:process.platform!=='win32',timeout:120000},async()=>{
26
26
  const fixture=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r65-cli-package-'));
27
27
  try{
28
- const npmCli=process.env.npm_execpath||path.join(path.dirname(process.execPath),'node_modules','npm','bin','npm-cli.js');
28
+ const packDir=path.join(fixture,'pack');
29
+ const installDir=path.join(fixture,'install');
30
+ const tempDir=path.join(fixture,'temp');
31
+ await mkdir(packDir);
32
+ await mkdir(installDir);
33
+ await mkdir(tempDir);
34
+ await writeFile(path.join(installDir,'package.json'),'{"private":true}\n',{encoding:'utf8',flag:'wx'});
35
+ const npmCli=path.join(path.dirname(process.execPath),'node_modules','npm','bin','npm-cli.js');
36
+ const nodePath=path.dirname(process.execPath);
37
+ const systemRoot=process.env.SystemRoot??process.env.WINDIR??'C:\\Windows';
38
+ const npmEnv={
39
+ SystemRoot:systemRoot,WINDIR:systemRoot,TEMP:tempDir,TMP:tempDir,
40
+ USERPROFILE:process.env.USERPROFILE??os.homedir(),
41
+ ComSpec:process.env.ComSpec??path.join(systemRoot,'System32','cmd.exe'),
42
+ PATH:[nodePath,path.join(systemRoot,'System32')].join(path.delimiter),
43
+ PATHEXT:'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
44
+ npm_config_cache:path.join(fixture,'npm-cache')};
29
45
  const pkg=JSON.parse(await readFile(path.join(root,'package.json'),'utf8'));
30
- const pack=spawnSync(process.execPath,[npmCli,'pack','--json','--pack-destination',fixture],{cwd:root,encoding:'utf8',timeout:45000,windowsHide:true});
46
+ const pack=spawnSync(process.execPath,[npmCli,'pack','--json','--pack-destination',packDir],{cwd:root,env:npmEnv,encoding:'utf8',timeout:45000,windowsHide:true});
31
47
  assert.equal(pack.status,0,(pack.stderr||'').slice(-1000));
32
- const packed=JSON.parse(pack.stdout);const tarball=path.join(fixture,packed[0]?.filename??packed['deadbyte-mcp']?.filename);
33
- const run=spawnSync(process.execPath,[npmCli,'exec','--offline','--yes',`--package=file:${tarball}`,'--','deadbyte-mcp','--version'],{
34
- cwd:fixture,encoding:'utf8',timeout:60000,windowsHide:true});
48
+ const packed=JSON.parse(pack.stdout);const tarball=path.join(packDir,packed[0]?.filename??packed['deadbyte-mcp']?.filename);
49
+ const install=spawnSync(process.execPath,[npmCli,'install','--offline','--ignore-scripts','--no-audit','--no-fund',tarball],{
50
+ cwd:installDir,env:npmEnv,encoding:'utf8',timeout:60000,windowsHide:true});
51
+ assert.equal(install.status,0,(install.stderr||'').slice(-1000));
52
+ const packageBin=path.join(installDir,'node_modules','.bin','deadbyte-mcp.cmd');
53
+ const run=spawnSync(process.env.ComSpec||'C:\\Windows\\System32\\cmd.exe',['/d','/c',packageBin,'--version'],{
54
+ cwd:installDir,env:npmEnv,encoding:'utf8',timeout:30000,windowsHide:true});
35
55
  assert.equal(run.status,0,(run.stderr||'').slice(-1000));
36
56
  assert.equal(run.stdout.trim(),pkg.version);
37
57
  }finally{await rm(fixture,{recursive:true,force:true});}