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 +22 -18
- package/PROVENANCE.json +12 -4
- package/README.txt +18 -18
- package/RELEASE.json +23 -8
- package/SBOM.cdx.json +2 -2
- package/TEST-MATRIX.json +9 -2
- package/bridge/package.json +1 -1
- package/package.json +1 -1
- package/scripts/npm-release-r48.mjs +5 -0
- package/scripts/npm-release-readiness-r165.mjs +68 -0
- package/src/deadbyte-cli.mjs +24 -4
- package/src/version.mjs +1 -1
- package/test/r130-release-security-contract.test.mjs +7 -7
- package/test/r132-release-identity.test.mjs +10 -6
- package/test/r153-prepublish-identity.test.mjs +1 -1
- package/test/r159-legacy-marker-evidence.test.mjs +4 -1
- package/test/r160-release-contract.test.mjs +5 -5
- package/test/r163-isolated-slot-rollback-restore.test.mjs +4 -4
- package/test/r164-remote-history-skew.test.mjs +13 -0
- package/test/r165-live-cli-skew.test.mjs +90 -0
- package/test/r165-publish-fence.test.mjs +13 -0
- package/test/r59-tool-surface-compat.test.mjs +1 -1
- package/test/r65-cli-invocation.test.mjs +27 -7
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
|
-
|
|
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
|
-
|
|
1422
|
-
|
|
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
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2188
|
+
a2e11035e6fd0b1039f3a49f3a59dee692470615a717c6c885b1f31e8a7b9191 test/r130-release-security-contract.test.mjs
|
|
2188
2189
|
bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
|
|
2189
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2235
|
+
ea99cf4afbe7c50a974cd86ffa27e2df4730ba00603974d170bef00b86712a75 test/r160-release-contract.test.mjs
|
|
2235
2236
|
8ddebf4e81e5ccb66533694e7b04775ea9ce063ead75a17c54ce28580a55a0b4 test/r160-stable-launcher.test.mjs
|
|
2236
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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": "
|
|
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.
|
|
84
|
-
"source_predecessor_tarball_sha256": "
|
|
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.
|
|
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.
|
|
20
|
-
npx -y deadbyte-mcp@0.15.
|
|
21
|
-
npx -y deadbyte-mcp@0.15.
|
|
22
|
-
npx -y deadbyte-mcp@0.15.
|
|
23
|
-
npx -y deadbyte-mcp@0.15.
|
|
24
|
-
npx -y deadbyte-mcp@0.15.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
465
|
+
args = ["-y", "deadbyte-mcp@0.15.63", "mcp"]
|
|
466
466
|
|
|
467
|
-
The remote device path remains `npx -y deadbyte-mcp@0.15.
|
|
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.
|
|
5
|
-
"train": "
|
|
6
|
-
"label": "
|
|
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.
|
|
23
|
-
"train": "
|
|
24
|
-
"source_path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.62-
|
|
25
|
-
"release_status": "
|
|
26
|
-
"manifest_status": "
|
|
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:
|
|
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.
|
|
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.
|
|
4
|
-
"train": "
|
|
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
|
}
|
package/bridge/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
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
|
+
}
|
package/src/deadbyte-cli.mjs
CHANGED
|
@@ -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)
|
|
555
|
-
|
|
556
|
-
|
|
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
|
@@ -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.
|
|
17
|
-
assert.equal(release.train,'
|
|
18
|
-
assert.equal(matrix.train,'
|
|
19
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
20
|
-
assert.equal(release.source_predecessor.train,'
|
|
21
|
-
assert.match(release.source_predecessor.source_path,/
|
|
22
|
-
assert.equal(release.source_predecessor.manifest_status,'
|
|
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('
|
|
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,'
|
|
19
|
-
assert.equal(matrix.train,'
|
|
20
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
21
|
-
assert.equal(release.source_predecessor.train,'
|
|
22
|
-
assert.match(release.source_predecessor.source_path,/
|
|
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.
|
|
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.
|
|
17
|
-
assert.equal(release.train,'
|
|
18
|
-
assert.equal(matrix.train,'
|
|
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,'
|
|
24
|
-
assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.62-
|
|
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.
|
|
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('
|
|
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,'
|
|
37
|
-
const nGen=await generation(state,'
|
|
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
|
|
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
|
|
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',
|
|
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(
|
|
33
|
-
const
|
|
34
|
-
cwd:
|
|
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});}
|