deadbyte-mcp 0.15.69 → 0.15.70
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 +25 -21
- package/PROVENANCE.json +25 -9
- package/README.txt +23 -23
- package/RELEASE.json +26 -9
- package/SBOM.cdx.json +2 -2
- package/TEST-MATRIX.json +21 -2
- package/bridge/package.json +1 -1
- package/controller/deadbyte-process-policy.json +4 -4
- package/docs/R184-package-lock.json +2 -2
- package/package.json +1 -1
- package/src/deadbyte-cli.mjs +61 -0
- package/src/foreground-owner-recovery-r190.mjs +117 -0
- package/src/version.mjs +1 -1
- package/test/r130-release-security-contract.test.mjs +8 -8
- package/test/r132-release-identity.test.mjs +8 -8
- package/test/r153-prepublish-identity.test.mjs +1 -1
- package/test/r163-isolated-slot-rollback-restore.test.mjs +4 -4
- package/test/r165-live-cli-skew.test.mjs +1 -1
- package/test/r167-release-contract.test.mjs +8 -8
- package/test/r172-release-contract.test.mjs +6 -6
- package/test/r173-release-contract.test.mjs +15 -15
- package/test/r179-release-contract.test.mjs +11 -11
- package/test/r190-foreground-cli.test.mjs +41 -0
- package/test/r190-foreground-owner-recovery.test.mjs +61 -0
- package/test/r190-release-contract.test.mjs +33 -0
- package/test/r59-tool-surface-compat.test.mjs +1 -1
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
|
+
9a75f4199178074f3fbe59bb60a8810b5706cf72fd83861c3e897d8f2aae0482 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
|
|
@@ -46,7 +46,7 @@ b963f3256f407b4216343815d310f9dce06ac61633c3b45071be6712ebb357d2 bridge/src/rem
|
|
|
46
46
|
331d168750a18d2b8e351796ddbf8f9619374c707c3cea18b8b166934f8af0d3 controller/deadbyte-desktop-policy.json
|
|
47
47
|
5e8ef223b0dbc52173aaf044a075837eef8964ff0e7e16f83a595e0d17695625 controller/deadbyte-host-policy.json.example
|
|
48
48
|
6f0cc469f51444dd18211fa3346c826abeea4d2ec7a8945f0200dc5c622031ef controller/DEADBYTE-MCP.cmd
|
|
49
|
-
|
|
49
|
+
724b9c1ba26b47ef3707cc225f9dec3d998becca42f23e52f073143207c53e7e controller/deadbyte-process-policy.json
|
|
50
50
|
d274b099a298c1033fea8f1e8849751693bbc0448778d619400acb82d4f53a3b controller/deadbyte-semantic-lsp-config.json
|
|
51
51
|
3023d2985f5b6e5cc7c0d08cb8b342b362c93dce7ebd4224635362194be40cf2 controller/README.TXT
|
|
52
52
|
101e613518c73c6aa31c725fe1b5f9a24c995dc9876b7b28e1f3e97ac9f8d362 DEADBYTE-MCP-R27-FINAL/R27-ADMIN-CLOSURE.json
|
|
@@ -108,7 +108,7 @@ d6e3b755b0483eb9468c7dca55b005e5a7f8b041f2dc7f9de800c13692151e82 docs/R168-NATI
|
|
|
108
108
|
89105d5a90ee91fbb032004648c2b5661f95a48b62b1a4190d4c7361ef3bcd14 docs/R168-READONLY-AUDIT-AND-RESUME-20261026.md
|
|
109
109
|
640a232aa5210014a372d625e2d63c3c26f55a386411d68f6ce2ad79bd5d0104 docs/R168-SIGNED-RECONCILIATION-PRECOMMIT-20261026.md
|
|
110
110
|
eb985acaa740a6f4189d202f7c1f153c4586b6b1c5c17f825c61f57d583c143c docs/R169-NPX-ACTIVE-CONTROLLER-DELEGATION-20261026.md
|
|
111
|
-
|
|
111
|
+
5594109a1239ecce370c53e9310472bb4d821c88c4b1368555364126b1b04ecf docs/R184-package-lock.json
|
|
112
112
|
720abe9ae4a132b4b8e9d6f1456b6bc1c5b19c7a61990d53fdbabb131b75c196 docs/R186-OWNER-CONSENT-HANDOFF.txt
|
|
113
113
|
68b7e636d8e3091d4f571d7a0c79f81738f7bf1b89cd497a8681e0dd1f362f58 docs/R221-STRICT-OUTPUT-CONTRACT.md
|
|
114
114
|
d9b68959fa7382e2a6c3dae703ac62767bba72ba21680d304048723f1671b5a0 docs/R36-CAPABILITY-EVIDENCE.md
|
|
@@ -1428,8 +1428,8 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
|
|
|
1428
1428
|
f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
|
|
1429
1429
|
51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
|
|
1430
1430
|
3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
|
|
1431
|
-
|
|
1432
|
-
|
|
1431
|
+
418c4617217847526ba6cc5f5e27c07a155806dc7282e56191842fe9da3466e5 package.json
|
|
1432
|
+
ea48d71e1dad1cc07e0588481ea2a88652fcd6ee07af781c251a4f13f70b0c9d PROVENANCE.json
|
|
1433
1433
|
27ca0f3c9ee3a1b6374a9c8dd98008decdd0c7659c7a569c70ad7b9734c74655 R34-BASELINE.json
|
|
1434
1434
|
0b7ec5ee347ddfa6cca59740fc7a8fe3fc5d51406265bb12189e82fa106319d2 R41-PARENT.json
|
|
1435
1435
|
bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.json
|
|
@@ -1438,9 +1438,9 @@ f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.jso
|
|
|
1438
1438
|
731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
|
|
1439
1439
|
d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
|
|
1440
1440
|
3dc607603fea511e2f428e9546a875ab7e38b6a0bbd5e803e4510de082f30804 R49-PARENT.json
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1441
|
+
dbafd5dbe7783489afc988e51b45a594f79d33f27f1ba28b573c20a152e12f69 README.txt
|
|
1442
|
+
e50aabcb151e625dd8d0d9adb5ef3734b3edd3eefa53a0f165e5bf186bfe2b9d RELEASE.json
|
|
1443
|
+
2e8d6abe5e5875e8f6f6e42b23740e81462d8d59bea20338f98948ad83cff3e0 SBOM.cdx.json
|
|
1444
1444
|
7c86062c4f69db3179a129d65945ccfab1b1c1c5bcc29b91383eac097d50f2aa scripts/activate-skill-creator-1.1.1.mjs
|
|
1445
1445
|
bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
|
|
1446
1446
|
8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
|
|
@@ -1826,7 +1826,7 @@ dcd4c9784e88e253e91ddad3c24b38cb0b36906ed737f6d7bee7712360f66f7a src/containmen
|
|
|
1826
1826
|
fe1761b98738e1aea1d25ddf3a0ba56ccad95a43d45104a89b8665197c7c9e18 src/containment-result.mjs
|
|
1827
1827
|
705a89cb12fedb993d55dfed32a5870d33e10db26422c944d1e52223566c096c src/containment-smoke.mjs
|
|
1828
1828
|
63a1d4d6a53f9eb7e02197b4e42158b867da8c042c2e61848d8a36cd398b8bd8 src/context-provenance.mjs
|
|
1829
|
-
|
|
1829
|
+
f1a0dabc2838ee1806eb854d97a734c544b2c77e90ffac784c2bd82c54531aeb src/deadbyte-cli.mjs
|
|
1830
1830
|
9e9766d64dcc9e2c8d23c2c0a5e9dcb87b7213e8de668f79f593ad48daf15acd src/deadline-cancellation.mjs
|
|
1831
1831
|
fe7a8f8611c33552b3da466a9b866ce79a737bfd5b9a78a953269b30cce16274 src/desktop-contract.mjs
|
|
1832
1832
|
f97352e510c659910c2d4a874d15be028e1291d685c6c1a7be53bdf1a335c2d8 src/desktop-input-r40.mjs
|
|
@@ -1849,6 +1849,7 @@ ea03db2bb706033f32045ed1dad67925d0d2e89cc97bc1aff805736dcab3b153 src/evidence-p
|
|
|
1849
1849
|
f5fafd46052b09f71a528594eb230edc5766ee0d006432d744590ec97c9c580d src/executor.mjs
|
|
1850
1850
|
bd5b4496676d5399cfd73a684af4aff06b44af9ab51f0d5901ead00c4c540e74 src/external-job-provider-r44.mjs
|
|
1851
1851
|
453bf57cda5314de8c77395d702bb9ceecd392089bf7780a0229787b6dbcb24c src/foreground-marker-cas-win32.mjs
|
|
1852
|
+
9a0c3ae6d3bd5750a72f4706420f5371fa10ed112329ce215c77d3922a16febf src/foreground-owner-recovery-r190.mjs
|
|
1852
1853
|
2232058493ef5435b4e0110a9ff219359f9d341a2df2e1dc3e8356c2f392e489 src/foreground-process-identity.mjs
|
|
1853
1854
|
991440682f74e726aea99a240dd46f743de0252b2309c399c4eca2777aebeb26 src/foreground-session-lock.mjs
|
|
1854
1855
|
6a1f7c076e1cd823e4bae8c1552f35f9b0aa6e72ec98e6e57d9c372a21d3f22f src/foreground-session-lock.ps1
|
|
@@ -1985,13 +1986,13 @@ aa765e9a28c69ff58a5b5a0d29b49ea181af4db9076633b102dbca25861e708e src/tunnel-std
|
|
|
1985
1986
|
34719b7d54336b2abbc152ff0c5fb2f0052d4f77753f9b7538adfdd20c804b5b src/uac-approval-contract-r153.mjs
|
|
1986
1987
|
642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
|
|
1987
1988
|
8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
|
|
1988
|
-
|
|
1989
|
+
d69e3b40fca1c5ebb66bac45a7970be9e14e1d402408446639cfdf361c8eb2da src/version.mjs
|
|
1989
1990
|
3706206ecaa560b9579f57ed3df104af543331fb09a3ad0d28b217aea2d0256f src/windows-powershell-environment.mjs
|
|
1990
1991
|
7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
|
|
1991
1992
|
76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
|
|
1992
1993
|
4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
|
|
1993
1994
|
1bd637e7634ca0259791c5108fcf324554f70b1db49e5eac3505287c04bbc3be STABILIZATION-PROGRESS.md
|
|
1994
|
-
|
|
1995
|
+
e1034303735661621ec733036fc6007eeefc2a62caa842441b99b1075fbee62d TEST-MATRIX.json
|
|
1995
1996
|
e4f1fb97545f23772ddff28ad3f9954a4714f9854062fca62e0e12c1cb2ec4ae test/agent-backend-r44.test.mjs
|
|
1996
1997
|
2a78c818058b25efdc143a3a97c832da231ccd6ff9d90c7796d681a0251b85c4 test/agent-crash-child.mjs
|
|
1997
1998
|
d9461ab7c118ee75d37a2d6f5e637d7e43505af6a9ad8c7ddafffc8ace185a5b test/agent-crash-worker.mjs
|
|
@@ -2247,9 +2248,9 @@ ce163ee9f288e30a213636e2267b8630016ef8a170f12286e8cdd44219bdab32 test/r124-live
|
|
|
2247
2248
|
17475b51e416ae678f959f8975fab8497eb7c57d13e36cac8656c0e1f7424c0c test/r126-restore-policy-envelope.test.mjs
|
|
2248
2249
|
1721d4bd3bb58c10ad9d86b69ad1d993ec5a1e6315c95b28fa50ab67d4ca302a test/r127-restore-append-policy-boundary.test.mjs
|
|
2249
2250
|
07a4f6955058d0975e53ba3e4d0ec202a43dac2717cd5aa8e09cde9f3b859544 test/r129-sdk-security-baseline.test.mjs
|
|
2250
|
-
|
|
2251
|
+
21d8e28b8617de56f38a3e693dd7a3c110f30090e64a94f35fa985e11d7b2780 test/r130-release-security-contract.test.mjs
|
|
2251
2252
|
bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
|
|
2252
|
-
|
|
2253
|
+
573d60a548711b846ea643af1c861914a5f3bccd21d447fadbd4ab822a7515f8 test/r132-release-identity.test.mjs
|
|
2253
2254
|
acd236a4d8ba035007bde4166a521b8d4e6044f58c52c0bae9cb42fa75338533 test/r135-autonomous-scope.test.mjs
|
|
2254
2255
|
3fcf657aae1f8466abc5ab82bb5a619966ea9b8a33d4a95a5a5246df5bf3afa1 test/r136-scoped-command-rights.test.mjs
|
|
2255
2256
|
e0c466f25b35eb894166df792b71b23924610d32363756c75ff437dfdaa12a4c test/r136-scoped-observer.test.mjs
|
|
@@ -2273,7 +2274,7 @@ b92f914455cac010b1468cd37a31651e7d423571d0edfeb29829d2281073e1e3 test/r146-lega
|
|
|
2273
2274
|
32f40b649033172384267bbe8f6009dededcba81afff1e3ca51331407197fe3b test/r146-livelog-backpressure.test.mjs
|
|
2274
2275
|
77b3bfcd6fa04e21c7a04206181f7b4cbd5321f799a145859d8e84d0b984d174 test/r147-remote-request-hash.test.mjs
|
|
2275
2276
|
ad184a83ee098eac21d523adbebfd379dcf8b87d4878c2d8dcca95cb22fdc9ee test/r153-clean-activation-recovery.test.mjs
|
|
2276
|
-
|
|
2277
|
+
97298b21b8d87257a012db4f22665685ab668832c72b981176583b533b9be150 test/r153-prepublish-identity.test.mjs
|
|
2277
2278
|
377b03dbb1d82ed0ddeee261a060b8173d5591dfc20a60d9ea991390a03039b4 test/r153-r60-host-repin-e2e-contract.test.mjs
|
|
2278
2279
|
e2bc7995f2ca85ce5d4a15e647c209d273d8f3871d25bd353046af66ee71bb34 test/r153-r65-signed-precondition-recovery.test.mjs
|
|
2279
2280
|
ce37fc59761ceddf43fd3844b34d57f64f1c8d191ca1d6cba13b643a5e2c02ce test/r153-restricted-reused-pid.test.mjs
|
|
@@ -2296,15 +2297,15 @@ d5d0eddc5c33ae9ea2f31d57381bf595bd85adf8048d2886f67554141f086bde test/r160-mark
|
|
|
2296
2297
|
3f7ebe55c45c6c5e28145700179f6ad75e01fcaa9fd5e49be143098c314f1a9a test/r160-package-decision-manifest.test.mjs
|
|
2297
2298
|
139082e59214999076b6d385619bcbe152bca7286e7d9cb4ab626dc3613f31de test/r160-release-contract.test.mjs
|
|
2298
2299
|
8ddebf4e81e5ccb66533694e7b04775ea9ce063ead75a17c54ce28580a55a0b4 test/r160-stable-launcher.test.mjs
|
|
2299
|
-
|
|
2300
|
+
c0635205da565e3643059abe65365740ba46bebe4591b8a9199cfba4ce525e3f test/r163-isolated-slot-rollback-restore.test.mjs
|
|
2300
2301
|
842222cce8d50ba214a4dc97d5965d711e83a29f6660e784ccaf000f50a4213d test/r163-publish-fence.test.mjs
|
|
2301
2302
|
3473a513db884f2ab40a9e3e875ca6ef2c9e5202fc0bf4df56e388b0d55e5e84 test/r164-remote-history-skew.test.mjs
|
|
2302
|
-
|
|
2303
|
+
a290194f6fda822c9e2506e8b24459d90845cf780a7de60e532f6c1c77b85388 test/r165-live-cli-skew.test.mjs
|
|
2303
2304
|
e9c493435956201439479b05d301e81673457abe5c456d8a50153f3d9922daf9 test/r165-publish-fence.test.mjs
|
|
2304
2305
|
425e6756afe323d358287a4d00ab6460e8398a8ee39c4a64e4be7ae191c4676f test/r166-hotfix-contract.test.mjs
|
|
2305
2306
|
13c4c7792152466b6967627b44eb4aaf815e9c20b4bd67a50323420c937d532c test/r166-release-readiness.test.mjs
|
|
2306
2307
|
52e6f015329fecf570ac6211ca9904b929119b66dbf72c6776be5cefcc63b282 test/r167-activation-path.test.mjs
|
|
2307
|
-
|
|
2308
|
+
f17b6cf87b7be9c7d483889877f64622523628fbee86c1a91b4735bf1f179cb9 test/r167-release-contract.test.mjs
|
|
2308
2309
|
471102e7b4e1655423efa80688c786306df62d6b76e23d41c8ebe596b8f63749 test/r167-release-readiness.test.mjs
|
|
2309
2310
|
eb5a5e73fd0284297959f4e6ca1631ebf0f23749c56ec1b4cc75cad5f8f1ca6b test/r168-combined-targeted-runner.mjs
|
|
2310
2311
|
44818657894db72a0ead65e96e734f30c11f10f5914e2c4e2961ee3a3e5b2c70 test/r168-crash-journal.test.mjs
|
|
@@ -2324,8 +2325,8 @@ ccd8b5b287808f5165f5e7fd7ade8278ae84c33463e4f9753059806da503fd3c test/r169-dele
|
|
|
2324
2325
|
2866649338191383446edb60d11d558736a4e6d58cb0cdebd94cd8e162fae6bc test/r169-delegate-cli-integration.test.mjs
|
|
2325
2326
|
5d2725223b48c2d44dab2eade455f9008a36f91522dcdcc3c0594d762c282b2b test/r169-targeted-runner.mjs
|
|
2326
2327
|
bf015b6b85a40f9f81a7627d71217b2994c2161943368bde46be94852ec7eb77 test/r172-activation-recovery.test.mjs
|
|
2327
|
-
|
|
2328
|
-
|
|
2328
|
+
cbf31999fae970988b6448cd99f2132cc4747b873a24b6a3724cd3ef0655fb35 test/r172-release-contract.test.mjs
|
|
2329
|
+
f0dfe3ab4b6638c1ced4b6a910108c52a24bed7b4bde275204250ad9eeeba546 test/r173-release-contract.test.mjs
|
|
2329
2330
|
41c7ae176274fb263b49a376a0f9d6ea92fe6c34015417584614a208146c33fb test/r174-owner-webauthn.test.mjs
|
|
2330
2331
|
1f39c010f8afa08d974f7741cbff09a3b75e38d2ee347a434bed0dfbdfd00c90 test/r175-cli-flags.test.mjs
|
|
2331
2332
|
d592c975ab4c53c5a88c9cc62eb07efef5c129ed27fdb9a55f97682bdd3ec56f test/r175-foreground-boundary.test.mjs
|
|
@@ -2333,7 +2334,7 @@ d592c975ab4c53c5a88c9cc62eb07efef5c129ed27fdb9a55f97682bdd3ec56f test/r175-fore
|
|
|
2333
2334
|
04a9f980a77496b66b33855afea30c020529261deefcee3e842bd16a787fbeac test/r176-pretty-live-log.test.mjs
|
|
2334
2335
|
f3e4319f862fe945690119eecbb7def921bbe81dc9b0b3e8e1964f4b693738f9 test/r177-windows-absolute-live-path.test.mjs
|
|
2335
2336
|
e8eaf25f5d0dd591c8dd486a53d2bf9c3d70d8d7a120cf4d820a02dba9b8d30e test/r179-absolute-path-live-log.test.mjs
|
|
2336
|
-
|
|
2337
|
+
bb0a79d9b476e064adf374505d53dfccbc0e21c02d5b65311492aa443b0d1082 test/r179-release-contract.test.mjs
|
|
2337
2338
|
eff6de983ea907a6720d176d96065548163f0ec4070a8ff0a3ec8310b174136b test/r186-controller-owner-grant.test.mjs
|
|
2338
2339
|
9aac064b28b30bcdb99554561b43193fcf4e5bfed18e659e55aa69a30e010560 test/r186-owner-consent-preflight.test.mjs
|
|
2339
2340
|
6afcbea206aecfdd9e960b7a6f4bcfd2a073e1e9043d936177ab5c38d7d2f90c test/r186-owner-enrollment.test.mjs
|
|
@@ -2341,6 +2342,9 @@ c13ecbef48a524e13180e275e1d59db840d3c687457c1ecb39bd76383b6f2852 test/r186-owne
|
|
|
2341
2342
|
9f2d63498d8e116153a0d3b18cdf4141538c06a90f97a6b2d232c5c2c70c7dea test/r186-owner-local-signing.test.mjs
|
|
2342
2343
|
3735edd1fc56f3bf6cc09c9487771d32f4397d666e49b7bfe826dd79ee1ce75a test/r186-owner-request.test.mjs
|
|
2343
2344
|
0ea5b5374234d74bfa82f2e32a3638cd2afcc6c604397b9dd2f88ec84f695467 test/r186-owner-review-export.test.mjs
|
|
2345
|
+
ec1924ab5da734414c616149528ba57e0a15b4cbc292b3da468f90168a642da3 test/r190-foreground-cli.test.mjs
|
|
2346
|
+
1dea1341cd9cb4a97adb8c55fdaa0abd57e46e6cef5a6454c5b13e5ab4fa2937 test/r190-foreground-owner-recovery.test.mjs
|
|
2347
|
+
ec2eccdb4bb735cf9c46144f2eaccab055690fc0395054bc20f2c2764827e947 test/r190-release-contract.test.mjs
|
|
2344
2348
|
3c5c3724bce89aa1fa59fe97cc346c40a5674bb5cd6dc3e2f31b86f2d62e75e4 test/r33-closeout-regression.test.mjs
|
|
2345
2349
|
5e3700ee610442dfd7b7ae5e380263f231438be0e32790597142c41362a53c9a test/r33-finalization.test.mjs
|
|
2346
2350
|
7e419d3c1caf79bfc7407207f50e5645298f9b19d91a7d6f595af185b92cd55e test/r36-finalization.test.mjs
|
|
@@ -2406,7 +2410,7 @@ ca8e23abc89f3eadeceb4b6fdad2cb4db5a7933029ece8e8beae2c6a158876b7 test/r58-owner
|
|
|
2406
2410
|
9a42827782a3c476e545e954fe38b99c96e925462ad9d4f7ea159493f7736bcc test/r58-stale-owner.test.mjs
|
|
2407
2411
|
84be7ee7d167eb06c9f9fc178930daaa81e53a91de40bad6d7df2060bd3dd165 test/r58-windows-gate.test.mjs
|
|
2408
2412
|
76db2a4009d76b86e1da57b91a96b0d6bfeb4063bec3301ede736e2fd5832f39 test/r59-release-contract.test.mjs
|
|
2409
|
-
|
|
2413
|
+
c11329fc074470a128af55dd1cfcb26eea02cf6459a2eda34a9659386af2a541 test/r59-tool-surface-compat.test.mjs
|
|
2410
2414
|
3befd5d4dc4d8ca9e1f6cbeb9c430671e676c5696d6ee5931c2cbe3244c558a4 test/r60-authority-coherence.test.mjs
|
|
2411
2415
|
60577e231c7d164f57a3960c574d3e369ca140d9dbc477b2444fa62dbf224e51 test/r60-authority-enforcement.test.mjs
|
|
2412
2416
|
a1fa0b1e529da05f3659a33be6d36dab02f93808638cf0f458d057e9c6d1e35b test/r60-bridge-dispatch.test.mjs
|
package/PROVENANCE.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.provenance.v1",
|
|
3
|
-
"version": "0.15.
|
|
4
|
-
"source_model": "npm deadbyte-mcp@0.15.
|
|
3
|
+
"version": "0.15.70",
|
|
4
|
+
"source_model": "npm deadbyte-mcp@0.15.69 registry-verified preview -> R190 isolated 0.15.70 marker-recovery candidate; active production 0.15.68 unchanged",
|
|
5
5
|
"signing": "ed25519",
|
|
6
|
-
"parent_tarball_sha256": "
|
|
7
|
-
"parent_activation_status": "
|
|
6
|
+
"parent_tarball_sha256": "578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3",
|
|
7
|
+
"parent_activation_status": "PUBLISHED_PREVIEW_NOT_ACTIVE",
|
|
8
8
|
"parent_rollback_receipt_sha256": null,
|
|
9
9
|
"runtime_predecessor": {
|
|
10
10
|
"release_id": "v0.15.68-ff29dbb2fbb89862",
|
|
11
11
|
"manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
|
|
12
12
|
"generation_manifest_sha256": "2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2"
|
|
13
13
|
},
|
|
14
|
-
"source_predecessor_manifest_file_sha256": "
|
|
15
|
-
"source_predecessor_tarball_sha256": "
|
|
16
|
-
"reproducibility": "
|
|
14
|
+
"source_predecessor_manifest_file_sha256": "cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0",
|
|
15
|
+
"source_predecessor_tarball_sha256": "578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3",
|
|
16
|
+
"reproducibility": "R190 source extracted from registry-verified npm 0.15.69 SHA256 578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3; protected full gate pending",
|
|
17
17
|
"public_surface_evidence": {
|
|
18
18
|
"status": "PASS",
|
|
19
19
|
"baseline_release": "v0.15.35-1b5715b276facbc0",
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"stdio_aggregate_p95_delta_pct": 1.984392678457768,
|
|
78
78
|
"limitations_preserved": true
|
|
79
79
|
},
|
|
80
|
-
"builder": "deadbyte-
|
|
80
|
+
"builder": "deadbyte-r190-foreground-recovery-isolated",
|
|
81
81
|
"parent_release_id": "v0.15.68-ff29dbb2fbb89862",
|
|
82
82
|
"parent_manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
|
|
83
83
|
"parent_generation_manifest_sha256": "2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2",
|
|
84
|
-
"source_predecessor_version": "0.15.
|
|
84
|
+
"source_predecessor_version": "0.15.69",
|
|
85
85
|
"operator_override": {
|
|
86
86
|
"four_hour_soak": "WAIVED_BY_OPERATOR",
|
|
87
87
|
"clean_machine": "WAIVED_BY_OPERATOR",
|
|
@@ -381,5 +381,21 @@
|
|
|
381
381
|
"npm_publish": "NOT_RUN",
|
|
382
382
|
"production_activation": "NOT_RUN",
|
|
383
383
|
"stable_final_claim": false
|
|
384
|
+
},
|
|
385
|
+
"r190": {
|
|
386
|
+
"status": "PREPUBLISH_VERIFIED_BEFORE_FINAL_METADATA_SEAL",
|
|
387
|
+
"source_predecessor_version": "0.15.69",
|
|
388
|
+
"source_predecessor_manifest_sha256": "cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0",
|
|
389
|
+
"source_predecessor_tarball_sha256": "578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3",
|
|
390
|
+
"runtime_predecessor_release_id": "v0.15.68-ff29dbb2fbb89862",
|
|
391
|
+
"protected_fixture_root": "C:\\Program Files\\DEADBYTE-R190-Protected-01570-2939a55d-Test-C",
|
|
392
|
+
"protected_full_regression": "PASS_2090_OF_2141_51_CLASSIFIED_SKIP_0_FAIL",
|
|
393
|
+
"npm_verify_only": "PASS_PRE_FINAL_METADATA_SEAL",
|
|
394
|
+
"live_foreground_recovery": "PASS_NATIVE_CAS_NO_AUTHORITY_OR_RUNTIME_MUTATION",
|
|
395
|
+
"live_foreground_session": "PASS_READY_SIGNED_PING_AND_MCP_CALLS",
|
|
396
|
+
"publication": "NOT_RUN",
|
|
397
|
+
"production_activation": "NOT_RUN",
|
|
398
|
+
"source_bytes_copied_from_references": false,
|
|
399
|
+
"stable_final_claim": false
|
|
384
400
|
}
|
|
385
401
|
}
|
package/README.txt
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
DEADBYTE MCP V0.15.
|
|
1
|
+
DEADBYTE MCP V0.15.70 / R190 EXPLICIT FOREGROUND RECOVERY
|
|
2
2
|
=========================
|
|
3
3
|
|
|
4
4
|
AUTHENTICATED MACHINE TRUTH + DURABLE AGENT + CODING + AUTONOMOUS PRODUCTION ENGINE
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
R190 RELEASE STATE
|
|
7
7
|
------------------
|
|
8
|
-
0.15.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
below describe the intended version
|
|
8
|
+
0.15.70 is a development candidate sourced from the registry-verified 0.15.69
|
|
9
|
+
preview artifact. It adds explicit protected recovery for a stale legacy foreground
|
|
10
|
+
marker and does not publish, activate, arm, disarm, start or stop production by itself.
|
|
11
|
+
The npm CLI examples below describe the intended version only after release gates pass.
|
|
12
12
|
|
|
13
13
|
NPX PRIMARY OPERATOR UX
|
|
14
14
|
------------------------
|
|
@@ -23,12 +23,12 @@ check `--version` before issuing a stateful command. The compatibility CMD
|
|
|
23
23
|
fails with an explanation when npm is detected rather than forwarding the
|
|
24
24
|
wrong command to the controller.
|
|
25
25
|
|
|
26
|
-
npx -y deadbyte-mcp@0.15.
|
|
27
|
-
npx -y deadbyte-mcp@0.15.
|
|
28
|
-
npx -y deadbyte-mcp@0.15.
|
|
29
|
-
npx -y deadbyte-mcp@0.15.
|
|
30
|
-
npx -y deadbyte-mcp@0.15.
|
|
31
|
-
npx -y deadbyte-mcp@0.15.
|
|
26
|
+
npx -y deadbyte-mcp@0.15.70 mcp
|
|
27
|
+
npx -y deadbyte-mcp@0.15.70 remote
|
|
28
|
+
npx -y deadbyte-mcp@0.15.70 remote status
|
|
29
|
+
npx -y deadbyte-mcp@0.15.70 remote restart
|
|
30
|
+
npx -y deadbyte-mcp@0.15.70 audit status
|
|
31
|
+
npx -y deadbyte-mcp@0.15.70 audit verify
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
R173 EPOCH-REVOKED AUTHORITY PROOF HOTFIX
|
|
@@ -52,7 +52,7 @@ CLAUDE DESKTOP
|
|
|
52
52
|
"mcpServers": {
|
|
53
53
|
"deadbyte": {
|
|
54
54
|
"command": "npx",
|
|
55
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
55
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -64,7 +64,7 @@ Save as .cursor/mcp.json:
|
|
|
64
64
|
"mcpServers": {
|
|
65
65
|
"deadbyte": {
|
|
66
66
|
"command": "npx",
|
|
67
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
67
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -77,7 +77,7 @@ Save as .vscode/mcp.json:
|
|
|
77
77
|
"deadbyte": {
|
|
78
78
|
"type": "stdio",
|
|
79
79
|
"command": "npx",
|
|
80
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
80
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -87,7 +87,7 @@ Add to the Codex MCP configuration:
|
|
|
87
87
|
|
|
88
88
|
[mcp_servers.deadbyte]
|
|
89
89
|
command = "npx"
|
|
90
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
90
|
+
args = ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
91
91
|
|
|
92
92
|
The `mcp` command is the quiet stdio server entry for local MCP clients; stdout is reserved for MCP.
|
|
93
93
|
The remote CLI invokes the stable active-release PowerShell launcher directly with shell=false.
|
|
@@ -382,7 +382,7 @@ CONTROLLER
|
|
|
382
382
|
----------
|
|
383
383
|
Primary operator entry point:
|
|
384
384
|
|
|
385
|
-
npx -y deadbyte-mcp@0.15.
|
|
385
|
+
npx -y deadbyte-mcp@0.15.70 remote
|
|
386
386
|
|
|
387
387
|
The legacy CMD entry remains compatibility-only for R33 rollback safety.
|
|
388
388
|
|
|
@@ -443,7 +443,7 @@ MCP CLIENT CONFIGURATION
|
|
|
443
443
|
------------------------
|
|
444
444
|
The local stdio entry point is quiet and suitable for MCP hosts:
|
|
445
445
|
|
|
446
|
-
npx -y deadbyte-mcp@0.15.
|
|
446
|
+
npx -y deadbyte-mcp@0.15.70 mcp
|
|
447
447
|
|
|
448
448
|
CLAUDE DESKTOP
|
|
449
449
|
Use the standard local-server entry in claude_desktop_config.json:
|
|
@@ -452,7 +452,7 @@ Use the standard local-server entry in claude_desktop_config.json:
|
|
|
452
452
|
"mcpServers": {
|
|
453
453
|
"deadbyte": {
|
|
454
454
|
"command": "npx",
|
|
455
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
455
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
458
|
}
|
|
@@ -465,7 +465,7 @@ Create .cursor/mcp.json:
|
|
|
465
465
|
"deadbyte": {
|
|
466
466
|
"type": "stdio",
|
|
467
467
|
"command": "npx",
|
|
468
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
468
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
469
469
|
}
|
|
470
470
|
}
|
|
471
471
|
}
|
|
@@ -478,7 +478,7 @@ Create .vscode/mcp.json:
|
|
|
478
478
|
"deadbyte": {
|
|
479
479
|
"type": "stdio",
|
|
480
480
|
"command": "npx",
|
|
481
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
481
|
+
"args": ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
482
482
|
}
|
|
483
483
|
}
|
|
484
484
|
}
|
|
@@ -488,9 +488,9 @@ Add this to ~/.codex/config.toml:
|
|
|
488
488
|
|
|
489
489
|
[mcp_servers.deadbyte]
|
|
490
490
|
command = "npx"
|
|
491
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
491
|
+
args = ["-y", "deadbyte-mcp@0.15.70", "mcp"]
|
|
492
492
|
|
|
493
|
-
The remote device path
|
|
493
|
+
The remote device path after promotion is `npx -y deadbyte-mcp@0.15.70 remote`. Remote public MCP uses the
|
|
494
494
|
verified HTTPS named-tunnel URL selected by the active generation; do not commit a private device
|
|
495
495
|
URL or tunnel token into a repository.
|
|
496
496
|
|
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.70",
|
|
5
|
+
"train": "R190",
|
|
6
|
+
"label": "R190 explicit protected foreground ownership recovery candidate",
|
|
7
7
|
"protocol_revision": "2026-07-28",
|
|
8
8
|
"parent": {
|
|
9
9
|
"version": "0.15.68",
|
|
@@ -18,14 +18,31 @@
|
|
|
18
18
|
"manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
|
|
19
19
|
"generation_manifest_sha256": "2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2"
|
|
20
20
|
},
|
|
21
|
+
"r190_foreground_recovery": {
|
|
22
|
+
"status": "PREPUBLISH_VERIFIED",
|
|
23
|
+
"npm_published": false,
|
|
24
|
+
"production_activated": false,
|
|
25
|
+
"live_marker_reconciled": true,
|
|
26
|
+
"authority_mutation_allowed": false,
|
|
27
|
+
"runtime_mutation_allowed": false,
|
|
28
|
+
"confirmed_live_defect": "R179 requires an explicit owner command for legacy foreground recovery but 0.15.69 exposes no such command",
|
|
29
|
+
"command": "remote reconcileforeground --confirm-marker-sha256 <sha256>",
|
|
30
|
+
"protected_full_regression": "PASS_2090_OF_2141_51_CLASSIFIED_SKIP_0_FAIL",
|
|
31
|
+
"protected_full_transcript_sha256": "85bbd8088ee25fabd37bd062cf1ec0ad83c43e04abeee81881fc009755a9dd32",
|
|
32
|
+
"npm_verify_only": "PASS_EXACT_TREE_PRE_METADATA_SEAL",
|
|
33
|
+
"live_foreground": "PASS_ACTIVE_0.15.68_READY_SIGNED_PING_AND_MCP_CALLS",
|
|
34
|
+
"legacy_guardian_cleanup": "ACTIVE_0.15.68_RETAINED_MARKER_RECONCILED_BY_PROTECTED_R190_CAS",
|
|
35
|
+
"public_tool_delta": 0,
|
|
36
|
+
"authority_scope_delta": 0
|
|
37
|
+
},
|
|
21
38
|
"source_predecessor": {
|
|
22
|
-
"version": "0.15.
|
|
23
|
-
"train": "
|
|
24
|
-
"source_path": "https://registry.npmjs.org/deadbyte-mcp/-/deadbyte-mcp-0.15.
|
|
39
|
+
"version": "0.15.69",
|
|
40
|
+
"train": "R179",
|
|
41
|
+
"source_path": "https://registry.npmjs.org/deadbyte-mcp/-/deadbyte-mcp-0.15.69.tgz",
|
|
25
42
|
"release_status": "PUBLISHED_REGISTRY_VERIFIED",
|
|
26
|
-
"manifest_status": "
|
|
27
|
-
"manifest_sha256": "
|
|
28
|
-
"tarball_sha256": "
|
|
43
|
+
"manifest_status": "PUBLISHED_PREVIEW_MANIFEST_VERIFIED_NOT_ACTIVE",
|
|
44
|
+
"manifest_sha256": "cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0",
|
|
45
|
+
"tarball_sha256": "578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3"
|
|
29
46
|
},
|
|
30
47
|
"consolidation": {
|
|
31
48
|
"frontend_status_vocabulary": true,
|
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:r190:0.15.70",
|
|
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.70"
|
|
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.70",
|
|
4
|
+
"train": "R190",
|
|
5
5
|
"primary_platform": "win32-x64",
|
|
6
6
|
"reference": {
|
|
7
7
|
"package": "@wonderwhy-er/desktop-commander",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"schemas_sha256": "f342345e34e48769dabaefe1b932f09d41e2e207b422f7794a15ee50ffa8f140"
|
|
11
11
|
},
|
|
12
12
|
"required": [
|
|
13
|
+
{
|
|
14
|
+
"id": "r190-explicit-foreground-recovery",
|
|
15
|
+
"command": "node --test --test-concurrency=1 test/r190-foreground-owner-recovery.test.mjs test/r190-foreground-cli.test.mjs",
|
|
16
|
+
"expected": "Exact legacy marker hash, PID-reuse proof, pointer and authority vector are bound; native CAS deletion is marker-only and crash-resumable"
|
|
17
|
+
},
|
|
13
18
|
{
|
|
14
19
|
"id": "r160-receipt-startup-identity",
|
|
15
20
|
"command": "node --test test/r153-marker-reconcile-receipt.test.mjs test/r159-legacy-marker-evidence.test.mjs test/r160-marker-proof.test.mjs test/r160-package-decision-manifest.test.mjs",
|
|
@@ -668,5 +673,19 @@
|
|
|
668
673
|
"package_verify_only": "PASS_2552_MANIFEST_ENTRIES",
|
|
669
674
|
"registry_publish": "NOT_RUN",
|
|
670
675
|
"production_activation": "NOT_RUN"
|
|
676
|
+
},
|
|
677
|
+
"r190": {
|
|
678
|
+
"status": "PREPUBLISH_VERIFIED_BEFORE_FINAL_METADATA_SEAL",
|
|
679
|
+
"targeted_source": "PASS_14_OF_14",
|
|
680
|
+
"targeted_protected": "PASS_14_OF_14",
|
|
681
|
+
"full_protected": "PASS_2090_OF_2141_51_CLASSIFIED_SKIP_0_FAIL",
|
|
682
|
+
"full_protected_transcript_sha256": "85bbd8088ee25fabd37bd062cf1ec0ad83c43e04abeee81881fc009755a9dd32",
|
|
683
|
+
"npm_verify_only": "PASS_PRE_FINAL_METADATA_SEAL",
|
|
684
|
+
"live_marker_reconciliations": 2,
|
|
685
|
+
"live_foreground_mcp": "PASS_23_CALLS_22_OK_1_EXPECTED_DENIED_0_UNKNOWN_0_MUTATIONS",
|
|
686
|
+
"active_runtime_after_test": "v0.15.68-ff29dbb2fbb89862_ONLINE",
|
|
687
|
+
"authority_after_test": "ALL_FIVE_PLANES_DISARMED",
|
|
688
|
+
"publication": "NOT_RUN",
|
|
689
|
+
"production_activation": "NOT_RUN"
|
|
671
690
|
}
|
|
672
691
|
}
|
package/bridge/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.process-policy.v1",
|
|
3
3
|
"enabled": true,
|
|
4
|
-
"grant_file": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
5
|
-
"state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
4
|
+
"grant_file": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.70-r190-foreground-recovery\\controller\\runtime\\process-grant.json",
|
|
5
|
+
"state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.70-r190-foreground-recovery\\controller\\runtime\\process-state",
|
|
6
6
|
"native_host": {
|
|
7
|
-
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
7
|
+
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.70-r190-foreground-recovery\\bin\\deadbyte-process-host.exe",
|
|
8
8
|
"sha256": "daf9cfb371bee88cafbf5597eaa507fec504dbe0b0ddd40d0c3c2e02817f49e4"
|
|
9
9
|
},
|
|
10
10
|
"roots": {
|
|
11
11
|
"core": {
|
|
12
|
-
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
12
|
+
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.70-r190-foreground-recovery",
|
|
13
13
|
"deny_paths": [
|
|
14
14
|
"node_modules",
|
|
15
15
|
"controller/runtime",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.70",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "deadbyte-mcp",
|
|
9
|
-
"version": "0.15.
|
|
9
|
+
"version": "0.15.70",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"@modelcontextprotocol/server",
|
|
12
12
|
"@modelcontextprotocol/client",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.70",
|
|
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.",
|
package/src/deadbyte-cli.mjs
CHANGED
|
@@ -33,6 +33,8 @@ import {reconcileStaleMarker,resumeMarkerReconciliation,recoverPublishedMarkerTe
|
|
|
33
33
|
import {selectLegacyMarkerEvidence,verifyLocatedLegacyMarkerReceipt} from './legacy-marker-evidence-r159.mjs';
|
|
34
34
|
import {normalizeHostCommandPins,encodeHostCommandPins} from './host-command-pins-r154.mjs';
|
|
35
35
|
import {verifyPackageDecisionManifest} from './package-identity-r160.mjs';
|
|
36
|
+
import {inspectTrustedInstallation} from './privileged-install-trust-r89.mjs';
|
|
37
|
+
import {recoverLegacyForegroundOwnership} from './foreground-owner-recovery-r190.mjs';
|
|
36
38
|
|
|
37
39
|
const REMOTE_COMMANDS=new Set([
|
|
38
40
|
'menu','start','resume','park','stop','restart','status','url','test','fulltest','toggle','clean','machinetest',
|
|
@@ -70,6 +72,7 @@ function printHelp(){
|
|
|
70
72
|
` npx -y ${exact} remote --trace # show trace/span identity without payload detail`,
|
|
71
73
|
|
|
72
74
|
` npx -y ${exact} remote --filter <expr> # presentation filter: tool/category/status/trace`,
|
|
75
|
+
` npx -y ${exact} remote reconcileforeground --confirm-marker-sha256 <sha256> # protected marker-only recovery`,
|
|
73
76
|
` npx -y ${exact} remote status`,
|
|
74
77
|
` npx -y ${exact} remote restart`,
|
|
75
78
|
` npx -y ${exact} supervisor status`,
|
|
@@ -934,8 +937,55 @@ async function runRemoteSession({resumeCursor=null,verbose=false,trace=false,fil
|
|
|
934
937
|
}
|
|
935
938
|
}
|
|
936
939
|
}
|
|
940
|
+
async function readR190Evidence(file){
|
|
941
|
+
try{
|
|
942
|
+
const info=await lstat(file);
|
|
943
|
+
if(!info.isFile()||info.isSymbolicLink()||info.size<1||info.size>64*1024)
|
|
944
|
+
throw new Error(`R190 recovery evidence is unsafe: ${path.basename(file)}`);
|
|
945
|
+
return JSON.parse((await readFile(file,'utf8')).replace(/^\uFEFF/,''));
|
|
946
|
+
}catch(error){if(error?.code==='ENOENT')return null;throw error;}
|
|
947
|
+
}
|
|
948
|
+
async function runRemoteForegroundRecovery(expectedMarkerSha256){
|
|
949
|
+
const ctx=await remoteContext();
|
|
950
|
+
const thisFile=fileURLToPath(import.meta.url);
|
|
951
|
+
const protectedFiles=[process.execPath,thisFile,path.join(CURRENT_PACKAGE_ROOT,'MANIFEST.SHA256'),
|
|
952
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','foreground-owner-recovery-r190.mjs'),
|
|
953
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','foreground-marker-cas-win32.mjs'),
|
|
954
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','foreground-process-identity.mjs'),
|
|
955
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','foreground-session-lock.mjs'),
|
|
956
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','privileged-install-trust-r89.mjs'),
|
|
957
|
+
path.join(CURRENT_PACKAGE_ROOT,'src','canonical-json.mjs'),
|
|
958
|
+
path.join(CURRENT_PACKAGE_ROOT,'bin','deadbyte-epoch-lock-r85.node')];
|
|
959
|
+
let installation;
|
|
960
|
+
try{installation=await inspectTrustedInstallation(protectedFiles);}
|
|
961
|
+
catch(error){throw new Error(`R190_PROTECTED_RECOVERY_REQUIRED: ${boundedSingleLine(error?.message||error,512)}`);}
|
|
962
|
+
if(!installation.trusted)throw new Error('R190_PROTECTED_RECOVERY_REQUIRED: package ACL is not R89-trusted');
|
|
963
|
+
await verifyPackageDecisionManifest({root:CURRENT_PACKAGE_ROOT,expectedVersion:DEADBYTE_VERSION});
|
|
964
|
+
const evidenceDir=path.join(ctx.root,'evidence','foreground-recovery-r190');
|
|
965
|
+
const intentPath=path.join(evidenceDir,`${expectedMarkerSha256}.intent.json`);
|
|
966
|
+
const terminalPath=path.join(evidenceDir,`${expectedMarkerSha256}.terminal.json`);
|
|
967
|
+
const startupLock=await acquireForegroundSessionLock({root:ctx.root,powershell:ctx.powershell});
|
|
968
|
+
try{
|
|
969
|
+
startupLock.assertHeld();
|
|
970
|
+
const result=await recoverLegacyForegroundOwnership({
|
|
971
|
+
expectedMarkerSha256,
|
|
972
|
+
readMarkerSnapshot:()=>readRemoteMarkerSnapshot(remoteSessionMarker(ctx.root)),
|
|
973
|
+
deleteMarkerIfHash:expected=>deletePinnedRemoteMarker(remoteSessionMarker(ctx.root),expected),
|
|
974
|
+
readActivePointer:()=>readActiveRuntimeBinding(ctx.root),
|
|
975
|
+
readAuthority:()=>observedAuthority(ctx),
|
|
976
|
+
queryIdentity:identity=>queryForegroundIdentity(identity.pid),
|
|
977
|
+
loadIntent:()=>readR190Evidence(intentPath),loadTerminal:()=>readR190Evidence(terminalPath),
|
|
978
|
+
publishIntent:value=>publishExclusiveJson(intentPath,value),
|
|
979
|
+
publishTerminal:value=>publishExclusiveJson(terminalPath,value)
|
|
980
|
+
});
|
|
981
|
+
startupLock.assertHeld();
|
|
982
|
+
process.stdout.write(`${JSON.stringify({...result,intent_path:intentPath,terminal_path:terminalPath,
|
|
983
|
+
authority_mutated:false,runtime_mutated:false})}\n`);
|
|
984
|
+
}finally{await startupLock.release();}
|
|
985
|
+
}
|
|
937
986
|
async function runRemote(args){
|
|
938
987
|
let verbose=false,trace=false,filterExpression='',resumeCursor=null,mode='default';
|
|
988
|
+
let recoveryMarkerSha256=null;
|
|
939
989
|
const hostCommandPinValues=[];
|
|
940
990
|
const positional=[];
|
|
941
991
|
for(let index=0;index<args.length;index++){
|
|
@@ -960,12 +1010,23 @@ async function runRemote(args){
|
|
|
960
1010
|
if(index+1>=args.length) throw new Error('remote --resume requires a cursor');
|
|
961
1011
|
resumeCursor=args[++index];continue;
|
|
962
1012
|
}
|
|
1013
|
+
if(arg==='--confirm-marker-sha256'){
|
|
1014
|
+
if(recoveryMarkerSha256!==null) throw new Error('remote --confirm-marker-sha256 may be specified once');
|
|
1015
|
+
recoveryMarkerSha256=String(args[++index]??'');continue;
|
|
1016
|
+
}
|
|
963
1017
|
positional.push(arg);
|
|
964
1018
|
}
|
|
965
1019
|
let hostCommandPins;
|
|
966
1020
|
try{hostCommandPins=normalizeHostCommandPins(hostCommandPinValues);}
|
|
967
1021
|
catch(error){throw new Error(`remote --host-command-pin ${error.message}`);}
|
|
968
1022
|
const presentation=verbose||trace||Boolean(filterExpression)||resumeCursor!==null||mode!=='default'||hostCommandPins.length>0;
|
|
1023
|
+
if(positional.length===1&&positional[0]==='reconcileforeground'){
|
|
1024
|
+
if(presentation)throw new Error('remote reconcileforeground does not accept presentation or authority flags');
|
|
1025
|
+
if(!/^[0-9a-f]{64}$/.test(String(recoveryMarkerSha256??'')))
|
|
1026
|
+
throw new Error('remote reconcileforeground requires --confirm-marker-sha256 with the exact current marker hash');
|
|
1027
|
+
await runRemoteForegroundRecovery(recoveryMarkerSha256);return;
|
|
1028
|
+
}
|
|
1029
|
+
if(recoveryMarkerSha256!==null)throw new Error('remote --confirm-marker-sha256 is valid only with reconcileforeground');
|
|
969
1030
|
if(positional.length===0){await runRemoteSession({resumeCursor,verbose,trace,filterExpression,mode,hostCommandPins});return;}
|
|
970
1031
|
if(presentation) throw new Error('remote presentation flags are valid only for foreground session');
|
|
971
1032
|
if(positional.length>1) throw new Error('remote accepts one controller command');
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Explicit, marker-only recovery for pre-R175 foreground ownership records.
|
|
2
|
+
// It never starts/stops runtime processes and never creates, revokes or restores
|
|
3
|
+
// authority. The caller must provide native CAS deletion and no-clobber evidence.
|
|
4
|
+
import {createHash} from 'node:crypto';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import {canonicalJson} from './canonical-json.mjs';
|
|
7
|
+
import {foregroundIdentityMatches,validForegroundIdentity} from './foreground-process-identity.mjs';
|
|
8
|
+
|
|
9
|
+
const SHA=/^[0-9a-f]{64}$/;
|
|
10
|
+
const PLANES=['process','coding','autonomous','desktop','host'];
|
|
11
|
+
const hash=value=>createHash('sha256').update(Buffer.from(canonicalJson(value))).digest('hex');
|
|
12
|
+
function insist(condition,message){if(!condition)throw new Error(`R190 foreground recovery blocked: ${message}`);}
|
|
13
|
+
function pointerSubject(pointer){
|
|
14
|
+
const fields=['release_id','version','manifest_sha256','generation_manifest_sha256','generation_root'];
|
|
15
|
+
insist(pointer&&typeof pointer==='object','active pointer missing');
|
|
16
|
+
for(const field of fields)insist(typeof pointer[field]==='string'&&pointer[field].length>0,`active pointer ${field} invalid`);
|
|
17
|
+
insist(SHA.test(pointer.manifest_sha256)&&SHA.test(pointer.generation_manifest_sha256),'active pointer digest invalid');
|
|
18
|
+
insist(path.isAbsolute(pointer.generation_root),'active generation root invalid');
|
|
19
|
+
return Object.freeze(Object.fromEntries(fields.map(field=>[field,pointer[field]])));
|
|
20
|
+
}
|
|
21
|
+
function authoritySubject(observation){
|
|
22
|
+
insist(observation?.state==='ONLINE'&&observation.local_ready===true,'runtime is not verified ONLINE');
|
|
23
|
+
insist(observation?.supervisor?.running===true,'supervisor is not verified running');
|
|
24
|
+
const subject={state:'ONLINE',local_ready:true,supervisor_running:true};
|
|
25
|
+
for(const plane of PLANES){
|
|
26
|
+
const value=observation.authority?.[plane];
|
|
27
|
+
insist(value?.configured===true&&typeof value.armed==='boolean'&&typeof value.reason==='string',`${plane} authority unverified`);
|
|
28
|
+
subject[plane]=Object.freeze({configured:true,armed:value.armed,reason:value.reason});
|
|
29
|
+
}
|
|
30
|
+
return Object.freeze(subject);
|
|
31
|
+
}
|
|
32
|
+
function staleIdentity(identity,queryIdentity,label){
|
|
33
|
+
insist(validForegroundIdentity(identity),`${label} identity invalid`);
|
|
34
|
+
let actual;
|
|
35
|
+
try{actual=queryIdentity(identity);}catch{throw new Error(`R190 foreground recovery blocked: ${label} identity observation unavailable`);}
|
|
36
|
+
if(actual===null)return Object.freeze({pid:identity.pid,state:'absent'});
|
|
37
|
+
insist(validForegroundIdentity(actual),`${label} current identity invalid`);
|
|
38
|
+
insist(!foregroundIdentityMatches(identity,actual),`${label} process is still active`);
|
|
39
|
+
return Object.freeze({pid:identity.pid,state:'pid_reused',actual_creation_utc:actual.creation_utc,
|
|
40
|
+
actual_executable_path:actual.executable_path});
|
|
41
|
+
}
|
|
42
|
+
function terminalFor(intent,status,completedAt){
|
|
43
|
+
const body={schema:'deadbyte.r190-foreground-recovery-terminal.v1',status,
|
|
44
|
+
intent_sha256:intent.intent_sha256,marker_sha256:intent.marker_sha256,
|
|
45
|
+
pointer:intent.pointer,authority:intent.authority,completed_at_utc:completedAt};
|
|
46
|
+
return Object.freeze({...body,receipt_sha256:hash(body)});
|
|
47
|
+
}
|
|
48
|
+
function validateIntent(intent,expected,pointer,authority){
|
|
49
|
+
insist(intent?.schema==='deadbyte.r190-foreground-recovery-intent.v1','recovery intent schema invalid');
|
|
50
|
+
insist(intent.marker_sha256===expected,'recovery intent marker mismatch');
|
|
51
|
+
const body={...intent};delete body.intent_sha256;
|
|
52
|
+
insist(SHA.test(String(intent.intent_sha256))&&hash(body)===intent.intent_sha256,'recovery intent digest invalid');
|
|
53
|
+
insist(canonicalJson(intent.pointer)===canonicalJson(pointer),'active pointer drift after marker delete');
|
|
54
|
+
insist(canonicalJson(intent.authority)===canonicalJson(authority),'authority drift after marker delete');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function recoverLegacyForegroundOwnership({
|
|
58
|
+
expectedMarkerSha256,readMarkerSnapshot,deleteMarkerIfHash,readActivePointer,readAuthority,
|
|
59
|
+
queryIdentity,loadIntent,loadTerminal,publishIntent,publishTerminal,now=()=>new Date()
|
|
60
|
+
}={}){
|
|
61
|
+
insist(typeof expectedMarkerSha256==='string'&&SHA.test(expectedMarkerSha256),'confirmation SHA-256 invalid');
|
|
62
|
+
for(const [name,fn] of Object.entries({readMarkerSnapshot,deleteMarkerIfHash,readActivePointer,
|
|
63
|
+
readAuthority,queryIdentity,loadIntent,loadTerminal,publishIntent,publishTerminal}))
|
|
64
|
+
insist(typeof fn==='function',`${name} callback missing`);
|
|
65
|
+
const pointer=pointerSubject(await readActivePointer());
|
|
66
|
+
const authority=authoritySubject(await readAuthority());
|
|
67
|
+
const snapshot=await readMarkerSnapshot();
|
|
68
|
+
const priorIntent=await loadIntent();
|
|
69
|
+
const priorTerminal=await loadTerminal();
|
|
70
|
+
if(snapshot===null){
|
|
71
|
+
insist(priorIntent,'marker absent without a durable R190 intent');
|
|
72
|
+
validateIntent(priorIntent,expectedMarkerSha256,pointer,authority);
|
|
73
|
+
if(priorTerminal){
|
|
74
|
+
insist(priorTerminal.intent_sha256===priorIntent.intent_sha256&&priorTerminal.marker_sha256===expectedMarkerSha256,
|
|
75
|
+
'terminal identity mismatch');
|
|
76
|
+
return Object.freeze({status:'MARKER_ALREADY_RECONCILED',marker_sha256:expectedMarkerSha256,
|
|
77
|
+
intent_sha256:priorIntent.intent_sha256,receipt_sha256:priorTerminal.receipt_sha256});
|
|
78
|
+
}
|
|
79
|
+
const terminal=terminalFor(priorIntent,'MARKER_RECONCILED_AFTER_DELETE',now().toISOString());
|
|
80
|
+
await publishTerminal(terminal);
|
|
81
|
+
return Object.freeze({status:terminal.status,marker_sha256:expectedMarkerSha256,
|
|
82
|
+
intent_sha256:priorIntent.intent_sha256,receipt_sha256:terminal.receipt_sha256});
|
|
83
|
+
}
|
|
84
|
+
insist(snapshot?.sha256===expectedMarkerSha256,'marker hash differs from explicit confirmation');
|
|
85
|
+
const marker=snapshot.marker;
|
|
86
|
+
insist(marker?.schema==='deadbyte.remote-session.v2','marker schema is not recoverable');
|
|
87
|
+
insist(marker.authority_scope===undefined||marker.authority_scope===null,'scoped marker must use its normal lifecycle');
|
|
88
|
+
insist(Number.isInteger(marker.owner_pid)&&marker.owner_pid>0&&marker.owner_identity,'owner marker identity invalid');
|
|
89
|
+
insist(Number.isInteger(marker.guardian_pid)&&marker.guardian_pid>0&&marker.guardian_identity,'guardian marker identity invalid');
|
|
90
|
+
const owner=staleIdentity(marker.owner_identity,queryIdentity,'owner');
|
|
91
|
+
const guardian=staleIdentity(marker.guardian_identity,queryIdentity,'guardian');
|
|
92
|
+
const intentBody={schema:'deadbyte.r190-foreground-recovery-intent.v1',action:'reconcile_legacy_foreground_marker_only',
|
|
93
|
+
marker_sha256:expectedMarkerSha256,pointer,authority,owner,guardian,requested_at_utc:now().toISOString(),
|
|
94
|
+
authority_mutation_allowed:false,runtime_mutation_allowed:false};
|
|
95
|
+
const intent=Object.freeze({...intentBody,intent_sha256:hash(intentBody)});
|
|
96
|
+
if(priorIntent)validateIntent(priorIntent,expectedMarkerSha256,pointer,authority);
|
|
97
|
+
else await publishIntent(intent);
|
|
98
|
+
const pinnedIntent=priorIntent??intent;
|
|
99
|
+
const pointerBeforeDelete=pointerSubject(await readActivePointer());
|
|
100
|
+
const authorityBeforeDelete=authoritySubject(await readAuthority());
|
|
101
|
+
insist(canonicalJson(pointerBeforeDelete)===canonicalJson(pointer),'active pointer drift before CAS delete');
|
|
102
|
+
insist(canonicalJson(authorityBeforeDelete)===canonicalJson(authority),'authority drift before CAS delete');
|
|
103
|
+
const current=await readMarkerSnapshot();
|
|
104
|
+
insist(current?.sha256===expectedMarkerSha256,'marker changed before CAS delete');
|
|
105
|
+
staleIdentity(marker.owner_identity,queryIdentity,'owner');
|
|
106
|
+
staleIdentity(marker.guardian_identity,queryIdentity,'guardian');
|
|
107
|
+
insist(await deleteMarkerIfHash(expectedMarkerSha256)==='REMOVED','native marker CAS did not remove exact identity');
|
|
108
|
+
insist(await readMarkerSnapshot()===null,'marker remained or reappeared after CAS delete');
|
|
109
|
+
const finalPointer=pointerSubject(await readActivePointer());
|
|
110
|
+
const finalAuthority=authoritySubject(await readAuthority());
|
|
111
|
+
insist(canonicalJson(finalPointer)===canonicalJson(pointer),'active pointer drift after CAS delete');
|
|
112
|
+
insist(canonicalJson(finalAuthority)===canonicalJson(authority),'authority drift after CAS delete');
|
|
113
|
+
const terminal=terminalFor(pinnedIntent,'MARKER_RECONCILED',now().toISOString());
|
|
114
|
+
await publishTerminal(terminal);
|
|
115
|
+
return Object.freeze({status:terminal.status,marker_sha256:expectedMarkerSha256,
|
|
116
|
+
intent_sha256:pinnedIntent.intent_sha256,receipt_sha256:terminal.receipt_sha256});
|
|
117
|
+
}
|
package/src/version.mjs
CHANGED
|
@@ -8,19 +8,19 @@ import {readReleaseLock} from './helpers/release-lock.mjs';
|
|
|
8
8
|
|
|
9
9
|
const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
10
10
|
const read=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
|
|
11
|
-
test('current successor retains the R130 security baseline with truthful
|
|
11
|
+
test('current successor retains the R130 security baseline with truthful R190 identity',async()=>{
|
|
12
12
|
const [pkg,release,provenance,bom,lock,matrix]=await Promise.all([
|
|
13
13
|
read('package.json'),read('RELEASE.json'),read('PROVENANCE.json'),
|
|
14
14
|
read('SBOM.cdx.json'),readReleaseLock(root),read('TEST-MATRIX.json')]);
|
|
15
15
|
assert.equal(pkg.name,'deadbyte-mcp');
|
|
16
16
|
for(const actual of [pkg.version,release.version,provenance.version,matrix.version,bom.metadata.component.version,lock.version,lock.packages[''].version,DEADBYTE_VERSION])
|
|
17
|
-
assert.equal(actual,'0.15.
|
|
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,/deadbyte-mcp-0\.15\.
|
|
23
|
-
assert.equal(release.source_predecessor.manifest_status,'
|
|
17
|
+
assert.equal(actual,'0.15.70');
|
|
18
|
+
assert.equal(release.train,'R190');
|
|
19
|
+
assert.equal(matrix.train,'R190');
|
|
20
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
21
|
+
assert.equal(release.source_predecessor.train,'R179');
|
|
22
|
+
assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.69\.tgz/i);
|
|
23
|
+
assert.equal(release.source_predecessor.manifest_status,'PUBLISHED_PREVIEW_MANIFEST_VERIFIED_NOT_ACTIVE');
|
|
24
24
|
assert.equal(release.runtime_predecessor.version,'0.15.68');
|
|
25
25
|
assert.equal(provenance.r160.source_predecessor_manifest_status,'STALE_REJECTED');
|
|
26
26
|
assert.equal(pkg.dependencies['@modelcontextprotocol/client'],'2.3.1');
|
|
@@ -9,23 +9,23 @@ import {readReleaseLock} from './helpers/release-lock.mjs';
|
|
|
9
9
|
const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
10
10
|
const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
|
|
11
11
|
|
|
12
|
-
test('
|
|
12
|
+
test('R190 package identity preserves R132 evidence and published R179 source predecessor',async()=>{
|
|
13
13
|
const [pkg,lock,release,prov,bom,matrix]=await Promise.all([
|
|
14
14
|
read('package.json'),readReleaseLock(root),read('RELEASE.json'),
|
|
15
15
|
read('PROVENANCE.json'),read('SBOM.cdx.json'),read('TEST-MATRIX.json')]);
|
|
16
16
|
for(const value of [pkg.version,lock.version,lock.packages[''].version,release.version,prov.version,bom.metadata.component.version,matrix.version,DEADBYTE_VERSION]){
|
|
17
17
|
assert.equal(value,pkg.version);
|
|
18
18
|
}
|
|
19
|
-
assert.equal(release.train,'
|
|
20
|
-
assert.equal(matrix.train,'
|
|
21
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
22
|
-
assert.equal(release.source_predecessor.train,'
|
|
23
|
-
assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.
|
|
19
|
+
assert.equal(release.train,'R190');
|
|
20
|
+
assert.equal(matrix.train,'R190');
|
|
21
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
22
|
+
assert.equal(release.source_predecessor.train,'R179');
|
|
23
|
+
assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.69\.tgz/i);
|
|
24
24
|
assert.equal(prov.r160.source_predecessor_manifest_status,'STALE_REJECTED');
|
|
25
25
|
assert.equal(release.r165.published_source_manifest_sha256,'4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805');
|
|
26
26
|
assert.equal(release.r165.published_source_tarball_sha256,'812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641');
|
|
27
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
28
|
-
assert.
|
|
27
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
28
|
+
assert.notEqual(release.r179.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
29
29
|
assert.equal(release.runtime_predecessor.version,'0.15.68');
|
|
30
30
|
assert.equal(prov.runtime_predecessor.release_id,release.runtime_predecessor.release_id);
|
|
31
31
|
assert.equal(prov.runtime_predecessor.manifest_sha256,release.runtime_predecessor.manifest_sha256);
|
|
@@ -26,7 +26,7 @@ test('R153 historical verifier refuses current successor 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.70');
|
|
30
30
|
assert.throws(()=>verifyR153Lineage(state),/package version/);
|
|
31
31
|
await assert.rejects(verifyR153IdentityTree(root),/package version/);
|
|
32
32
|
});
|
|
@@ -8,7 +8,8 @@ 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
|
|
11
|
+
const packageIdentity=JSON.parse(await readFile(path.join(candidate,'package.json'),'utf8'));
|
|
12
|
+
const version=packageIdentity.version;
|
|
12
13
|
const parent=path.join(os.homedir(),'.deadbyte-mcp','releases','v0.15.68-ff29dbb2fbb89862');
|
|
13
14
|
const parentDigest='ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885';
|
|
14
15
|
const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
@@ -21,12 +22,11 @@ async function generation(state,label){
|
|
|
21
22
|
await writeFile(path.join(root,'GENERATION.SHA256'),manifest,{flag:'wx'});
|
|
22
23
|
return {root,manifest_sha256:sha(manifest),config_path:path.join(root,'controller-config.psd1')};
|
|
23
24
|
}
|
|
24
|
-
test('R179 isolated immutable slot activates, rolls back, and restores
|
|
25
|
+
test('R179 isolated immutable slot activates, rolls back, and restores the current successor without authority or production mutation',async()=>{
|
|
25
26
|
const stateBase=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r163-isolated-'));
|
|
26
27
|
const state=path.join(stateBase,'state');
|
|
27
28
|
try{
|
|
28
|
-
|
|
29
|
-
assert.equal(pkg.version,version);
|
|
29
|
+
assert.match(version,/^0\.15\.\d+$/);
|
|
30
30
|
const parentManifest=await readFile(path.join(parent,'MANIFEST.SHA256'));
|
|
31
31
|
const nextManifest=await readFile(path.join(candidate,'MANIFEST.SHA256'));
|
|
32
32
|
assert.equal(sha(parentManifest),parentDigest);
|
|
@@ -17,7 +17,7 @@ const hashMarker=c=>c.repeat(64);
|
|
|
17
17
|
async function fixture(t,kind){
|
|
18
18
|
assert.equal(typeof envRoot,'string'); assert.ok(path.isAbsolute(envRoot));
|
|
19
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.
|
|
20
|
+
assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.70');
|
|
21
21
|
const dir=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r164-skew-e2e-'));
|
|
22
22
|
t.after(async()=>{await rm(dir,{recursive:true,force:true,maxRetries:10,retryDelay:150});});
|
|
23
23
|
const state=path.join(dir,'state'),bin=path.join(state,'bin');
|
|
@@ -8,7 +8,7 @@ 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
|
const readOptional=async rel=>{try{return await read(rel);}catch(error){if(error?.code==='ENOENT')return null;throw error;}};
|
|
11
|
-
const VERSION='0.15.
|
|
11
|
+
const VERSION='0.15.70';
|
|
12
12
|
const R166_MANIFEST='ad3c091fbbe2bac6d234548724008b67305fd483ad6542f92d5aeb1aa84f5849';
|
|
13
13
|
const R166_TARBALL='3d22412c3cebabd66bfa92ca4dbaaf3ef49acba7f92436a16485d7e4cb18c653';
|
|
14
14
|
|
|
@@ -20,20 +20,20 @@ test('current package identity retains the immutable R167/R173 activation lineag
|
|
|
20
20
|
provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION];
|
|
21
21
|
if(lock)versions.push(lock.version,lock.packages[''].version);
|
|
22
22
|
for(const version of versions)assert.equal(version,VERSION);
|
|
23
|
-
assert.equal(release.train,'
|
|
24
|
-
assert.equal(matrix.train,'
|
|
25
|
-
assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:
|
|
23
|
+
assert.equal(release.train,'R190');
|
|
24
|
+
assert.equal(matrix.train,'R190');
|
|
25
|
+
assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r190:0.15.70');
|
|
26
26
|
assert.deepEqual(release.runtime_predecessor,{
|
|
27
27
|
version:'0.15.68',release_id:'v0.15.68-ff29dbb2fbb89862',
|
|
28
28
|
manifest_sha256:'ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885',
|
|
29
29
|
generation_manifest_sha256:'2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2'
|
|
30
30
|
});
|
|
31
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
32
|
-
assert.equal(release.source_predecessor.train,'
|
|
33
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
31
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
32
|
+
assert.equal(release.source_predecessor.train,'R179');
|
|
33
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
34
34
|
assert.equal(release.r173.source_predecessor_version,'0.15.67');
|
|
35
35
|
assert.equal(release.r167.source_predecessor_manifest_sha256,R166_MANIFEST);
|
|
36
|
-
assert.equal(provenance.source_predecessor_manifest_file_sha256,'
|
|
36
|
+
assert.equal(provenance.source_predecessor_manifest_file_sha256,'cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0');
|
|
37
37
|
assert.equal(provenance.r173.source_predecessor_manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
|
|
38
38
|
assert.equal(release.r172.source_predecessor_manifest_sha256,'962e227dace247d59aa860211388fbde461c5f9c8a7e8a878e34a14a27d355f8');
|
|
39
39
|
assert.equal(release.r172.source_predecessor_tarball_sha256,'31b194a4fbff7dbdb9f4f275b4ea49c5115f7b0bb2241c0c72d72ef690311a5d');
|
|
@@ -9,18 +9,18 @@ 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
|
const readOptional=async rel=>{try{return await read(rel);}catch(error){if(error?.code==='ENOENT')return null;throw error;}};
|
|
11
11
|
|
|
12
|
-
test('
|
|
12
|
+
test('R190 binds the published source predecessor separately from the active runtime predecessor',async()=>{
|
|
13
13
|
const [pkg,lock,bridge,release,provenance,matrix,bom]=await Promise.all([
|
|
14
14
|
read('package.json'),readOptional('package-lock.json'),read('bridge/package.json'),read('RELEASE.json'),
|
|
15
15
|
read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
|
|
16
16
|
const versions=[pkg.version,bridge.version,release.version,provenance.version,matrix.version,
|
|
17
17
|
bom.metadata.component.version,DEADBYTE_VERSION];
|
|
18
18
|
if(lock)versions.push(lock.version,lock.packages[''].version);
|
|
19
|
-
for(const value of versions)assert.equal(value,'0.15.
|
|
20
|
-
assert.equal(release.train,'
|
|
21
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
22
|
-
assert.equal(release.source_predecessor.manifest_sha256,'
|
|
23
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
19
|
+
for(const value of versions)assert.equal(value,'0.15.70');
|
|
20
|
+
assert.equal(release.train,'R190'); assert.equal(matrix.train,'R190');
|
|
21
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
22
|
+
assert.equal(release.source_predecessor.manifest_sha256,'cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0');
|
|
23
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
24
24
|
assert.equal(release.runtime_predecessor.release_id,'v0.15.68-ff29dbb2fbb89862');
|
|
25
25
|
assert.equal(release.r173.public_tool_delta,0); assert.equal(release.r173.authority_scope_delta,0);
|
|
26
26
|
});
|
|
@@ -8,26 +8,26 @@ import {readReleaseLock} from './helpers/release-lock.mjs';
|
|
|
8
8
|
const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..');
|
|
9
9
|
const json=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
|
|
10
10
|
|
|
11
|
-
test('
|
|
11
|
+
test('R190 package identity binds the exact published R179 source and live runtime predecessor',async()=>{
|
|
12
12
|
const [pkg,lock,bridge,release,provenance,matrix,sbom]=await Promise.all([
|
|
13
13
|
json('package.json'),readReleaseLock(root),json('bridge/package.json'),json('RELEASE.json'),
|
|
14
14
|
json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json')
|
|
15
15
|
]);
|
|
16
|
-
assert.equal(pkg.version,'0.15.
|
|
17
|
-
assert.equal(lock.version,'0.15.
|
|
18
|
-
assert.equal(lock.packages[''].version,'0.15.
|
|
19
|
-
assert.equal(bridge.version,'0.15.
|
|
20
|
-
assert.equal(release.version,'0.15.
|
|
21
|
-
assert.equal(release.train,'
|
|
22
|
-
assert.equal(matrix.version,'0.15.
|
|
23
|
-
assert.equal(matrix.train,'
|
|
24
|
-
assert.equal(sbom.metadata.component.version,'0.15.
|
|
25
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
26
|
-
assert.equal(release.source_predecessor.train,'
|
|
27
|
-
assert.equal(release.source_predecessor.manifest_sha256,'
|
|
28
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
16
|
+
assert.equal(pkg.version,'0.15.70');
|
|
17
|
+
assert.equal(lock.version,'0.15.70');
|
|
18
|
+
assert.equal(lock.packages[''].version,'0.15.70');
|
|
19
|
+
assert.equal(bridge.version,'0.15.70');
|
|
20
|
+
assert.equal(release.version,'0.15.70');
|
|
21
|
+
assert.equal(release.train,'R190');
|
|
22
|
+
assert.equal(matrix.version,'0.15.70');
|
|
23
|
+
assert.equal(matrix.train,'R190');
|
|
24
|
+
assert.equal(sbom.metadata.component.version,'0.15.70');
|
|
25
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
26
|
+
assert.equal(release.source_predecessor.train,'R179');
|
|
27
|
+
assert.equal(release.source_predecessor.manifest_sha256,'cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0');
|
|
28
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
29
29
|
assert.equal(release.runtime_predecessor.version,'0.15.68');
|
|
30
|
-
assert.equal(provenance.version,'0.15.
|
|
30
|
+
assert.equal(provenance.version,'0.15.70');
|
|
31
31
|
assert.equal(provenance.parent_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
32
32
|
assert.equal(provenance.source_predecessor_manifest_file_sha256,release.source_predecessor.manifest_sha256);
|
|
33
33
|
});
|
|
@@ -11,23 +11,23 @@ const parent='v0.15.68-ff29dbb2fbb89862';
|
|
|
11
11
|
const manifest='ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885';
|
|
12
12
|
const generation='2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2';
|
|
13
13
|
const tarball='1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf';
|
|
14
|
-
test('
|
|
14
|
+
test('R190 version, lock snapshot, bridge, matrix, SBOM and provenance identify exact 0.15.70 successor',async()=>{
|
|
15
15
|
const [pkg,lock,bridge,release,provenance,matrix,sbom]=await Promise.all([
|
|
16
16
|
read('package.json'),readReleaseLock(root),read('bridge/package.json'),read('RELEASE.json'),
|
|
17
17
|
read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
|
|
18
18
|
for(const version of [pkg.version,lock.version,lock.packages[''].version,bridge.version,release.version,provenance.version,
|
|
19
|
-
matrix.version,sbom.metadata.component.version,DEADBYTE_VERSION])assert.equal(version,'0.15.
|
|
20
|
-
assert.equal(release.train,'
|
|
21
|
-
assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:
|
|
19
|
+
matrix.version,sbom.metadata.component.version,DEADBYTE_VERSION])assert.equal(version,'0.15.70');
|
|
20
|
+
assert.equal(release.train,'R190');assert.equal(matrix.train,'R190');
|
|
21
|
+
assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r190:0.15.70');
|
|
22
22
|
assert.equal(release.parent.release_id,parent);assert.equal(release.parent.manifest_sha256,manifest);
|
|
23
23
|
assert.equal(release.parent.generation_manifest_sha256,generation);
|
|
24
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
25
|
-
assert.equal(release.source_predecessor.manifest_sha256,
|
|
26
|
-
assert.equal(release.source_predecessor.tarball_sha256,
|
|
24
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
25
|
+
assert.equal(release.source_predecessor.manifest_sha256,'cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0');
|
|
26
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
27
27
|
assert.equal(release.runtime_predecessor.release_id,parent);
|
|
28
28
|
assert.equal(provenance.runtime_predecessor.release_id,parent);
|
|
29
|
-
assert.equal(provenance.parent_tarball_sha256,
|
|
30
|
-
assert.equal(provenance.source_predecessor_tarball_sha256,
|
|
29
|
+
assert.equal(provenance.parent_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
30
|
+
assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
31
31
|
});
|
|
32
32
|
test('R179 does not misrepresent owner Autonomous enrollment, protected regression or publication as finished',async()=>{
|
|
33
33
|
const [release,prov,matrix]=await Promise.all(['RELEASE.json','PROVENANCE.json','TEST-MATRIX.json'].map(read));
|
|
@@ -43,12 +43,12 @@ test('R179 does not misrepresent owner Autonomous enrollment, protected regressi
|
|
|
43
43
|
assert.ok(matrix.required.some(r=>r.id==='r179-owner-authorized-autonomous'));
|
|
44
44
|
assert.ok(matrix.required.some(r=>r.id==='r179-protected-full'));
|
|
45
45
|
});
|
|
46
|
-
test('
|
|
46
|
+
test('R190 retains historical R179 and R173 source evidence without promoting it to current parent',async()=>{
|
|
47
47
|
const [release,prov]=await Promise.all(['RELEASE.json','PROVENANCE.json'].map(read));
|
|
48
48
|
assert.equal(release.r173.source_predecessor_version,'0.15.67');
|
|
49
49
|
assert.equal(release.r173.source_predecessor_manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
|
|
50
50
|
assert.equal(prov.r173.source_predecessor_version,'0.15.67');
|
|
51
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
51
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
52
52
|
assert.notEqual(release.source_predecessor.tarball_sha256,release.r173.source_predecessor_tarball_sha256);
|
|
53
53
|
});
|
|
54
54
|
test('R184 ships a semantic lock snapshot matching installed package identity and dependencies',async()=>{
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {spawnSync} from 'node:child_process';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {fileURLToPath} from 'node:url';
|
|
6
|
+
import {inspectTrustedInstallation} from '../src/privileged-install-trust-r89.mjs';
|
|
7
|
+
|
|
8
|
+
const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
9
|
+
|
|
10
|
+
test('R190 CLI exposes explicit marker recovery and applies the R89 trust boundary before mutation',async()=>{
|
|
11
|
+
const installation=await inspectTrustedInstallation([
|
|
12
|
+
process.execPath,
|
|
13
|
+
path.join(root,'src','deadbyte-cli.mjs'),
|
|
14
|
+
path.join(root,'MANIFEST.SHA256'),
|
|
15
|
+
path.join(root,'src','foreground-owner-recovery-r190.mjs'),
|
|
16
|
+
path.join(root,'src','foreground-marker-cas-win32.mjs'),
|
|
17
|
+
path.join(root,'src','foreground-process-identity.mjs'),
|
|
18
|
+
path.join(root,'src','foreground-session-lock.mjs'),
|
|
19
|
+
path.join(root,'src','privileged-install-trust-r89.mjs'),
|
|
20
|
+
path.join(root,'src','canonical-json.mjs'),
|
|
21
|
+
path.join(root,'bin','deadbyte-epoch-lock-r85.node')
|
|
22
|
+
]).catch(()=>({trusted:false}));
|
|
23
|
+
const result=spawnSync(process.execPath,['src/deadbyte-cli.mjs','remote','reconcileforeground',
|
|
24
|
+
'--confirm-marker-sha256','f'.repeat(64)],{encoding:'utf8',windowsHide:true,shell:false});
|
|
25
|
+
const output=String(result.stdout||'')+String(result.stderr||'');
|
|
26
|
+
assert.notEqual(result.status,0,output);
|
|
27
|
+
if(installation.trusted) assert.match(output,/marker (?:hash differs from explicit confirmation|absent without a durable R190 intent)/);
|
|
28
|
+
else assert.match(output,/R190_PROTECTED_RECOVERY_REQUIRED/);
|
|
29
|
+
assert.doesNotMatch(output,/unsupported remote command|EXACT_ACTIVE_RELEASE_REQUIRED/);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('R190 CLI requires exact marker hash and never accepts recovery confirmation on another command',()=>{
|
|
33
|
+
const missing=spawnSync(process.execPath,['src/deadbyte-cli.mjs','remote','reconcileforeground'],
|
|
34
|
+
{encoding:'utf8',windowsHide:true,shell:false});
|
|
35
|
+
assert.notEqual(missing.status,0);
|
|
36
|
+
assert.match(String(missing.stderr),/requires --confirm-marker-sha256/);
|
|
37
|
+
const confused=spawnSync(process.execPath,['src/deadbyte-cli.mjs','remote','status',
|
|
38
|
+
'--confirm-marker-sha256','f'.repeat(64)],{encoding:'utf8',windowsHide:true,shell:false});
|
|
39
|
+
assert.notEqual(confused.status,0);
|
|
40
|
+
assert.match(String(confused.stderr),/valid only with reconcileforeground/);
|
|
41
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {recoverLegacyForegroundOwnership} from '../src/foreground-owner-recovery-r190.mjs';
|
|
4
|
+
|
|
5
|
+
const H=char=>char.repeat(64);
|
|
6
|
+
const owner={schema:'deadbyte.foreground-process.v1',pid:9496,parent_pid:5272,
|
|
7
|
+
creation_utc:'2026-10-27T12:25:38.764342Z',executable_path:'C:\\Program Files\\nodejs\\node.exe',command_line_sha256:H('a')};
|
|
8
|
+
const guardian={...owner,pid:10456,parent_pid:9496,creation_utc:'2026-10-27T12:25:39.244355Z',command_line_sha256:H('b')};
|
|
9
|
+
const marker={schema:'deadbyte.remote-session.v2',owner_pid:9496,guardian_pid:10456,
|
|
10
|
+
session_nonce:H('c'),result_session_id:'b0015a97167ff20bf4e15588',started_at_utc:'2026-10-27T12:25:38.994Z',owner_identity:owner,guardian_identity:guardian};
|
|
11
|
+
const pointer={release_id:'v0.15.68-'+H('d').slice(0,16),version:'0.15.68',manifest_sha256:H('d'),
|
|
12
|
+
generation_manifest_sha256:H('e'),generation_root:'C:\\Users\\DEADBYTE\\.deadbyte-mcp\\generations\\fixture'};
|
|
13
|
+
const authority={state:'ONLINE',local_ready:true,supervisor:{running:true},authority:Object.fromEntries(
|
|
14
|
+
['process','coding','autonomous','desktop','host'].map((plane,index)=>[plane,{configured:true,armed:[true,true,false,false,true][index],reason:[true,true,false,false,true][index]?'standing-grant':'disarmed'}]))};
|
|
15
|
+
|
|
16
|
+
function harness({ownerActual={...owner,pid:9496,creation_utc:'2026-10-28T03:22:41.668663Z',executable_path:'C:\\Windows\\WidgetBoard.exe'},
|
|
17
|
+
guardianActual=null,driftPointer=false,terminalFailure=false}={}){
|
|
18
|
+
let snapshot={marker,sha256:H('f')},intent=null,terminal=null,deletes=0,pointerReads=0;
|
|
19
|
+
return {state:()=>({snapshot,intent,terminal,deletes}),run:()=>recoverLegacyForegroundOwnership({
|
|
20
|
+
expectedMarkerSha256:H('f'),readMarkerSnapshot:async()=>snapshot,
|
|
21
|
+
deleteMarkerIfHash:async expected=>{assert.equal(expected,H('f'));snapshot=null;deletes++;return 'REMOVED';},
|
|
22
|
+
readActivePointer:async()=>{pointerReads++;return driftPointer&&pointerReads>1?{...pointer,release_id:'changed'}:pointer;},
|
|
23
|
+
readAuthority:async()=>authority,
|
|
24
|
+
queryIdentity:identity=>identity.pid===owner.pid?ownerActual:guardianActual,
|
|
25
|
+
loadIntent:async()=>intent,loadTerminal:async()=>terminal,
|
|
26
|
+
publishIntent:async value=>{intent=value;return {sha256:value.intent_sha256};},
|
|
27
|
+
publishTerminal:async value=>{if(terminalFailure){terminalFailure=false;throw new Error('terminal write failed');}terminal=value;return {sha256:value.receipt_sha256};},
|
|
28
|
+
now:()=>new Date('2026-10-28T07:00:00.000Z')
|
|
29
|
+
})};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
test('R190 explicit owner recovery CAS-removes only a PID-reused legacy marker and preserves authority vector',async()=>{
|
|
33
|
+
const h=harness(),result=await h.run(),state=h.state();
|
|
34
|
+
assert.equal(result.status,'MARKER_RECONCILED');
|
|
35
|
+
assert.equal(state.deletes,1);
|
|
36
|
+
assert.equal(state.snapshot,null);
|
|
37
|
+
assert.equal(state.intent.authority.process.armed,true);
|
|
38
|
+
assert.equal(state.intent.authority.coding.armed,true);
|
|
39
|
+
assert.equal(state.intent.authority.autonomous.armed,false);
|
|
40
|
+
assert.equal(state.intent.authority.host.armed,true);
|
|
41
|
+
assert.equal(state.terminal.marker_sha256,H('f'));
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('R190 refuses live matching owner and pointer drift without deleting marker',async()=>{
|
|
45
|
+
const live=harness({ownerActual:owner});
|
|
46
|
+
await assert.rejects(()=>live.run(),/owner.*active/i);
|
|
47
|
+
assert.equal(live.state().deletes,0);
|
|
48
|
+
const drift=harness({driftPointer:true});
|
|
49
|
+
await assert.rejects(()=>drift.run(),/pointer.*drift/i);
|
|
50
|
+
assert.equal(drift.state().deletes,0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('R190 resumes terminal publication after crash following native CAS delete without repeating mutation',async()=>{
|
|
54
|
+
const h=harness({terminalFailure:true});
|
|
55
|
+
await assert.rejects(()=>h.run(),/terminal write failed/);
|
|
56
|
+
assert.equal(h.state().deletes,1);
|
|
57
|
+
const result=await h.run();
|
|
58
|
+
assert.equal(result.status,'MARKER_RECONCILED_AFTER_DELETE');
|
|
59
|
+
assert.equal(h.state().deletes,1);
|
|
60
|
+
assert.ok(h.state().terminal);
|
|
61
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {readFile} from 'node:fs/promises';
|
|
4
|
+
|
|
5
|
+
const json=async file=>JSON.parse(await readFile(new URL('../'+file,import.meta.url),'utf8'));
|
|
6
|
+
test('R190 candidate identity separates published source 0.15.69 from active runtime 0.15.68',async()=>{
|
|
7
|
+
const [pkg,bridge,release,provenance,matrix,sbom,versionSource]=await Promise.all([
|
|
8
|
+
json('package.json'),json('bridge/package.json'),json('RELEASE.json'),json('PROVENANCE.json'),
|
|
9
|
+
json('TEST-MATRIX.json'),json('SBOM.cdx.json'),readFile(new URL('../src/version.mjs',import.meta.url),'utf8')]);
|
|
10
|
+
for(const value of [pkg.version,bridge.version,release.version,provenance.version,matrix.version,
|
|
11
|
+
sbom.metadata.component.version])assert.equal(value,'0.15.70');
|
|
12
|
+
assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.70'/);
|
|
13
|
+
assert.equal(release.train,'R190');assert.equal(matrix.train,'R190');
|
|
14
|
+
assert.equal(release.source_predecessor.version,'0.15.69');
|
|
15
|
+
assert.equal(release.source_predecessor.tarball_sha256,'578c1630608f9df816524c78abc9e1a55357fdc3cd25e142122f1a823e1d69e3');
|
|
16
|
+
assert.equal(release.source_predecessor.manifest_sha256,'cfede112761da00e73b626cfbce23d17e1d4b6e3a325bb675415196d31142ba0');
|
|
17
|
+
assert.equal(release.runtime_predecessor.version,'0.15.68');
|
|
18
|
+
assert.equal(release.runtime_predecessor.release_id,'v0.15.68-ff29dbb2fbb89862');
|
|
19
|
+
assert.equal(provenance.source_predecessor_version,'0.15.69');
|
|
20
|
+
assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
21
|
+
assert.match(sbom.serialNumber,/r190:0\.15\.70$/);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('R190 release metadata records verified recovery without claiming publication or activation',async()=>{
|
|
25
|
+
const release=await json('RELEASE.json');
|
|
26
|
+
assert.equal(release.r190_foreground_recovery.status,'PREPUBLISH_VERIFIED');
|
|
27
|
+
assert.equal(release.r190_foreground_recovery.npm_published,false);
|
|
28
|
+
assert.equal(release.r190_foreground_recovery.production_activated,false);
|
|
29
|
+
assert.equal(release.r190_foreground_recovery.live_marker_reconciled,true);
|
|
30
|
+
assert.equal(release.r190_foreground_recovery.authority_mutation_allowed,false);
|
|
31
|
+
assert.equal(release.r190_foreground_recovery.runtime_mutation_allowed,false);
|
|
32
|
+
assert.match(release.r190_foreground_recovery.protected_full_regression,/0_FAIL$/);
|
|
33
|
+
});
|
|
@@ -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','0.15.63','0.15.64','0.15.65','0.15.66','0.15.67','0.15.68','0.15.69'].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','0.15.64','0.15.65','0.15.66','0.15.67','0.15.68','0.15.69','0.15.70'].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');
|