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 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
- 1533e887e404d3a98f2d9147bb2694e42fc8b1d3d71ac3eaba01aa24b3a07974 bridge/package.json
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
- ea5cf6169b705e0c1156ffffbf8e2b20fae65cd3934a70bacc6b0c7909ffbc85 controller/deadbyte-process-policy.json
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
- 96d73c06e9377ada551977ad5fd45bcc3d5cfb6279f9927eab64ce8f1437d4d2 docs/R184-package-lock.json
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
- a730ae35f9d15d4149ae17e53758eaeef21b375f4e112dd37d1cedaae39ebcfb package.json
1432
- 3e74614e46fb724f0106e56f1ae1e7217316be0146c793be994f43db8a60469d PROVENANCE.json
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
- 3546e2a249d99114236995aacadb146ec3028be98162bb588dc598c59d050a43 README.txt
1442
- e084b6808933e79a9259d9915e106d3d4c7fe08d112227bfa36d39571dc7743f RELEASE.json
1443
- dab2e969f93e8f2eb774f2fb3e9c51d850376d474ce44c765aa0865ee28dd5cc SBOM.cdx.json
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
- cbc9fc18c293249ff19d74a9ef4a4c60325bf76cea438e1c748dbee172d51f70 src/deadbyte-cli.mjs
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
- c05759cb48a7cc170086e8ca1ce365e21d41a08ccdf10eea80024aacacdf046f src/version.mjs
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
- 25f1cdaad9b2065d4006b1ecd67af406905c6dc9f34db06d054bfe4eb7ea4ea2 TEST-MATRIX.json
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
- 98a02453de23189c3b8537b340bbfe654155a4ac0688905833f94599504972e8 test/r130-release-security-contract.test.mjs
2251
+ 21d8e28b8617de56f38a3e693dd7a3c110f30090e64a94f35fa985e11d7b2780 test/r130-release-security-contract.test.mjs
2251
2252
  bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
2252
- 98ae428505f29078d9a22a7cb26121029621d20ee1e34a204bbb29ae4c18cced test/r132-release-identity.test.mjs
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
- 70bd238fe70bbc4772ef2fc06a5b30aa0ea4e35c020f4292466f478eb0d4f82a test/r153-prepublish-identity.test.mjs
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
- 46aeaa8340f930201e994ce5858d66a9c7900c7bdfc7d3d3b1b4de0430be4c0e test/r163-isolated-slot-rollback-restore.test.mjs
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
- 090c7cd038d48572840a49d11b627ac190ba2ea6a5f914929c4a4c5dc0131f35 test/r165-live-cli-skew.test.mjs
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
- a41eb4b28b21ff3f37e9570d046e89ac39ab9189496ab5d6713d905f4f99c3f9 test/r167-release-contract.test.mjs
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
- 415b54ad5d2ebf0579e127c27181dd9d4db858023b6c02e430f9aea55735f299 test/r172-release-contract.test.mjs
2328
- cbb54d6561cd30e16f37b017e1cb96de872706eeec3e9de9864b827c6712adfa test/r173-release-contract.test.mjs
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
- 0d169eaf781894ce9d623ec62c0a726faf13d0c5826416150a3733c37392565a test/r179-release-contract.test.mjs
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
- 139d384529220b813ff6899a26dc59520edb4a31c41e68e399132e44a93f6e01 test/r59-tool-surface-compat.test.mjs
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.69",
4
- "source_model": "npm deadbyte-mcp@0.15.68 verified parent -> R179 isolated 0.15.69 candidate; active production 0.15.68 unchanged",
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": "1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf",
7
- "parent_activation_status": "PRODUCTION_ACTIVE",
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": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
15
- "source_predecessor_tarball_sha256": "1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf",
16
- "reproducibility": "R179 source package candidate only; parent published npm SHA256 1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf; protected full gate pending",
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-r173-epoch-proof-hotfix-isolated",
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.68",
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.69 / R179 FOREGROUND OBSERVER + READABLE LIVE LOGS
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
- R179 RELEASE STATE
6
+ R190 RELEASE STATE
7
7
  ------------------
8
- 0.15.69 is a release candidate until exact npm publication and registry readback.
9
- The protected Windows regression and independent owner-authorized Autonomous
10
- grant must pass before calling this a clean stable release. The npm CLI examples
11
- below describe the intended version once it has been published.
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.69 mcp
27
- npx -y deadbyte-mcp@0.15.69 remote
28
- npx -y deadbyte-mcp@0.15.69 remote status
29
- npx -y deadbyte-mcp@0.15.69 remote restart
30
- npx -y deadbyte-mcp@0.15.69 audit status
31
- npx -y deadbyte-mcp@0.15.69 audit verify
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.69", "mcp"]
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.69", "mcp"]
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.69", "mcp"]
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.69", "mcp"]
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.69 remote
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.69 mcp
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.69", "mcp"]
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.69", "mcp"]
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.69", "mcp"]
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.69", "mcp"]
491
+ args = ["-y", "deadbyte-mcp@0.15.70", "mcp"]
492
492
 
493
- The remote device path remains `npx -y deadbyte-mcp@0.15.69 remote`. Remote public MCP uses the
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.69",
5
- "train": "R179",
6
- "label": "R179 foreground observer and native crash guardian release candidate",
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.68",
23
- "train": "R173",
24
- "source_path": "https://registry.npmjs.org/deadbyte-mcp/-/deadbyte-mcp-0.15.68.tgz",
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": "ACTIVE_PRODUCTION_MANIFEST_VERIFIED",
27
- "manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
28
- "tarball_sha256": "1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf"
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:r179:0.15.69",
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.69"
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.69",
4
- "train": "R179",
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
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-chatgpt-bridge",
3
- "version": "0.15.69",
3
+ "version": "0.15.70",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
@@ -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.69-r186-owner-consent\\controller\\runtime\\process-grant.json",
5
- "state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.69-r186-owner-consent\\controller\\runtime\\process-state",
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.69-r186-owner-consent\\bin\\deadbyte-process-host.exe",
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.69-r186-owner-consent",
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.69",
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.69",
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.69",
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.",
@@ -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
@@ -1,4 +1,4 @@
1
- export const DEADBYTE_VERSION = '0.15.69';
1
+ export const DEADBYTE_VERSION = '0.15.70';
2
2
  export const MCP_PROTOCOL_VERSION = '2026-07-28';
3
3
  export const RECEIPT_SCHEMA_V1 = 'deadbyte.receipt.v1';
4
4
  export const RECEIPT_SCHEMA_V2 = 'deadbyte.receipt.v2';
@@ -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 R179 identity',async()=>{
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.69');
18
- assert.equal(release.train,'R179');
19
- assert.equal(matrix.train,'R179');
20
- assert.equal(release.source_predecessor.version,'0.15.68');
21
- assert.equal(release.source_predecessor.train,'R173');
22
- assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.68\.tgz/i);
23
- assert.equal(release.source_predecessor.manifest_status,'ACTIVE_PRODUCTION_MANIFEST_VERIFIED');
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('R179 package identity preserves R132 evidence and published R173 source predecessor',async()=>{
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,'R179');
20
- assert.equal(matrix.train,'R179');
21
- assert.equal(release.source_predecessor.version,'0.15.68');
22
- assert.equal(release.source_predecessor.train,'R173');
23
- assert.match(release.source_predecessor.source_path,/deadbyte-mcp-0\.15\.68\.tgz/i);
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,'1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf');
28
- assert.equal(release.r179.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
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.69');
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 version='0.15.69';
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 0.15.69 without authority or production mutation',async()=>{
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
- const pkg=JSON.parse(await readFile(path.join(candidate,'package.json'),'utf8'));
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.69');
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.69';
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,'R179');
24
- assert.equal(matrix.train,'R179');
25
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r179:0.15.69');
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.68');
32
- assert.equal(release.source_predecessor.train,'R173');
33
- assert.equal(release.source_predecessor.tarball_sha256,'1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf');
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,'ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885');
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('R179 binds the published source predecessor separately from the active runtime predecessor',async()=>{
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.69');
20
- assert.equal(release.train,'R179'); assert.equal(matrix.train,'R179');
21
- assert.equal(release.source_predecessor.version,'0.15.68');
22
- assert.equal(release.source_predecessor.manifest_sha256,'ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885');
23
- assert.equal(release.source_predecessor.tarball_sha256,'1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf');
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('R179 package identity binds the exact published R173 source and live runtime predecessor',async()=>{
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.69');
17
- assert.equal(lock.version,'0.15.69');
18
- assert.equal(lock.packages[''].version,'0.15.69');
19
- assert.equal(bridge.version,'0.15.69');
20
- assert.equal(release.version,'0.15.69');
21
- assert.equal(release.train,'R179');
22
- assert.equal(matrix.version,'0.15.69');
23
- assert.equal(matrix.train,'R179');
24
- assert.equal(sbom.metadata.component.version,'0.15.69');
25
- assert.equal(release.source_predecessor.version,'0.15.68');
26
- assert.equal(release.source_predecessor.train,'R173');
27
- assert.equal(release.source_predecessor.manifest_sha256,'ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885');
28
- assert.equal(release.source_predecessor.tarball_sha256,'1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf');
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.69');
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('R179 version, lockfile, bridge, matrix, SBOM and provenance identify exact 0.15.69 successor',async()=>{
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.69');
20
- assert.equal(release.train,'R179');assert.equal(matrix.train,'R179');
21
- assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r179:0.15.69');
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.68');
25
- assert.equal(release.source_predecessor.manifest_sha256,manifest);
26
- assert.equal(release.source_predecessor.tarball_sha256,tarball);
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,tarball);
30
- assert.equal(provenance.source_predecessor_tarball_sha256,tarball);
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('R179 retains historical R173 source ancestor evidence without promoting it to current parent',async()=>{
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.68');
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');