deadbyte-mcp 0.15.11 → 0.15.12

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
@@ -606,6 +606,7 @@ a7d00bfd54525bc694b6e32f64c7ebcf5e6b7ae3657be5cc12767bce74654a47 node_modules/t
606
606
  7b6976eec43edfa68b79a459dd089c56b7a395916dbf1a01bd11e6d86e12128f node_modules/typescript/SECURITY.md
607
607
  1af3c68039c57e539422da82a4faada506ce6d0ea6f90e0b699d02dbcdb7a90c node_modules/typescript/ThirdPartyNoticeText.txt
608
608
  055f0ac4eed1a1591d033d59462972968bf3483b4cc07e163589569c0fb999f0 node_modules/which/bin/node-which
609
+ 89bc599ca0b3a119d711c62855b2e3619b734bf371ef55dcc049454313f9904e node_modules/which/CHANGELOG.md
609
610
  4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b node_modules/which/LICENSE
610
611
  43010039ed5e89f7186960be682b3cb5cda5ab6cdfb06cbfd4f081cf0e7b4260 node_modules/which/package.json
611
612
  0c91f714f46006bc9a543e629a3ce3b63700fa8cfbe7c6310a0bcff2738356dd node_modules/which/README.md
@@ -1328,7 +1329,7 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
1328
1329
  f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
1329
1330
  51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
1330
1331
  3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
1331
- 34e5345b9f07fad9e3f7f54c496f3cf0cc4ff07c34c938c35244a9e1f209eeeb package.json
1332
+ 76ae33a2af233622bf1145ede51bf43ee2bba99566a2c7b69da072c3eec0c80c package.json
1332
1333
  8177e3a354721a73df889f386a97e7744a2e017d150aecf4bf309f5177d18690 proof/CONTAINMENT-BUILD.txt
1333
1334
  a8efa13e44ff50902aee64cfca542d19605a1ae23db95280ad2d44b324f3eae7 proof/MCP-SMOKE-STATUS.txt
1334
1335
  7c115069cc4a343ca21b0ebdee74bd8f544b02d4aa906ffa13308725825d891a proof/NODE-SYNTAX.txt
@@ -1396,8 +1397,8 @@ bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.jso
1396
1397
  f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.json
1397
1398
  731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
1398
1399
  d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
1399
- 4d8bc9d61d7558a484269cc13263b42bb39417700bb3858069d64a2d1ae190e8 README.txt
1400
- be4640a1d9e47f904e758e0b88b6e2ef7ee8b1921c90a95e404d28d1eb01a69b RELEASE.json
1400
+ 5d81b599350d12f019586380d0983054c48fd89a7b948b335a4cec8fb9077ad7 README.txt
1401
+ 6e49e03fa679ca211372919f6ef250424bcdcc700d3be12e2552e9a07cbc950d RELEASE.json
1401
1402
  507a42441c8fbb0b1bef63a13fad9e1680262cd6d34cc176b7ed0c5423ddbcc7 SBOM.cdx.json
1402
1403
  bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
1403
1404
  8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
@@ -1428,7 +1429,7 @@ a64b6779eff80d68d90d238dee7f2feda5ada3c5c59bcaeae2ab7812bd28404e scripts/deferr
1428
1429
  751632aeb2e56b093f9589897bbe7e874db61e9238a13bd1506bde2df0b706e9 scripts/deferred-slot-operation-r45.mjs
1429
1430
  d4710039ceff7380f3b6a0040ad118a81eabdda2706c459f9b81f8e08978fba4 scripts/deferred-slot-operation-r46.mjs
1430
1431
  34116370895aeff9a424475558f4aca3b05460146455d9bb0bafcacd1a270910 scripts/deferred-slot-operation.mjs
1431
- cabea0b3dbfccc2b24f276f8ccba9bffa9b006497eaedc83c7dd04875aa82e4d scripts/deploy-r47.mjs
1432
+ 4a8a257bfe61aa97a6607bf1e8d3233a2c7dbdf526b7fc404eb321e372db1312 scripts/deploy-r47.mjs
1432
1433
  2cc7a37231f8836a48c3bf4024887f38c10bfc89296ac483e4b98b3f18281933 scripts/derive-r45-parent.mjs
1433
1434
  67221c5619019a9d19611432d4361c99c365f14e89483e4c8f78451839960176 scripts/derive-r45-release.mjs
1434
1435
  87c6acc0df96a6e8bb6692bc7b12e8b386196a80cba554d9b214ff8bb12147fe scripts/derive-r45-tests.mjs
@@ -1578,7 +1579,7 @@ e5f944a310ed957e3b8f7b1cab54c082acf1b35f8fdd7d9b672ebe1a80dc37ac src/canonical-
1578
1579
  da5181cec30034ddf089baa5358becb5651da238a2e7cf0888007a4c60b4ea6b src/capability-benchmark-runner.mjs
1579
1580
  2b62295591f142ca4b3bc5b03e6434f7fc3c51d9502f9a40ef8a03d1f72a8899 src/capability-benchmark.mjs
1580
1581
  160199b25f45bd0490f6b21a9fa8194313e9673c4b2699afce68249d3d249a7b src/capability-ledger.mjs
1581
- 1b0ba08c5d5a75d95953a84a00b551af8ba1ee21cf1995255daa198368017760 src/capability-resolver.mjs
1582
+ ecccd8645297f2edd131b2e1a30016fb58ea9d18d8536aa784a21734c81cf209 src/capability-resolver.mjs
1582
1583
  94e5aeff2453cdc0239aee4d547dbbefee183c71933cb84e5e8a418fa99bc1e8 src/codex-app-server-r44.mjs
1583
1584
  6d0a80daaa2711e67e2597bff3db5bd2802682f559107a492f3cd89b9c6785ed src/coding-mcp-tools.mjs
1584
1585
  d6fc395575f49abbbf60bf6f6ef5ee9ad51034a7e770a381e6ec34f869788306 src/coding-output-contracts.mjs
@@ -1688,7 +1689,7 @@ c8fd6fd3e49e866f2c3be326ab07222b36a44528ee0fc3f7b371c34a60e3c45b src/remote-ses
1688
1689
  827b156eac01cc9ec6f5ca9a49219612f0da511fde770a9eb1235aa913b5e514 src/request-identity.mjs
1689
1690
  39251ab165bb0a0b8ea9b4c533aa0cd674934c0fa2c7f63145eac680d1d67be9 src/resource-identity.mjs
1690
1691
  ce2223bf6075e96cc02505c1439acce18bb1f204c5e86cf9152bb7194daf3cd2 src/runtime-identity.mjs
1691
- 88fe013cc2474e7e015235df39e54c3c6cd8afb8ac50a97b15a9dee590fed541 src/runtime-update.mjs
1692
+ 3c3bd5c7479af109bd3770afe2e29200e91d5cf3533fb3225a063db659eac080 src/runtime-update.mjs
1692
1693
  c61335adb38bfc415fe1cdabfe2c0a87e61579dfd1e52cce91c44d6993479457 src/search-cursor.mjs
1693
1694
  fc5407ef8338ebeeede16225b3249166dc4d45e903d873eb46c15c3df07dc9ad src/semantic-backend-registry.mjs
1694
1695
  686e9b55b9f4352b941579f186a9b9d348d86af53d052cbd5da953e7d15470ff src/semantic-code.mjs
@@ -1706,7 +1707,7 @@ bac271c6f5218752ac5ff4decf5249e3893ddb35c63c092ce17238c27fc4d35b src/trust-init
1706
1707
  16df134040e3ff1e73df722b568d3e8ac0a6923b097696cead7580da75aa8d2a src/tunnel-stdio-compat.mjs
1707
1708
  642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
1708
1709
  8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
1709
- 87f3f4370c3e0e8db4ce0816a205836bb7736000b95d6fd24348944bb739bf6a src/version.mjs
1710
+ b58265712b06c108331f51d2f42a1fe28ab5d9a06d5ee781f1c931559c104e79 src/version.mjs
1710
1711
  7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
1711
1712
  76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
1712
1713
  4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
package/RELEASE.json CHANGED
@@ -1,7 +1,7 @@
1
- {
1
+ {
2
2
  "schema": "deadbyte.release.v1",
3
3
  "name": "deadbyte-mcp",
4
- "version": "0.15.11",
4
+ "version": "0.15.12",
5
5
  "train": "R46",
6
6
  "label": "FILELESS POWERSHELL PRODUCT BASELINE",
7
7
  "protocol_revision": "2026-07-28",
@@ -51,3 +51,4 @@
51
51
  "observation_search_session_cap": 128
52
52
  }
53
53
  }
54
+
@@ -0,0 +1,166 @@
1
+ # Changes
2
+
3
+
4
+ ## 2.0.2
5
+
6
+ * Rename bin to `node-which`
7
+
8
+ ## 2.0.1
9
+
10
+ * generate changelog and publish on version bump
11
+ * enforce 100% test coverage
12
+ * Promise interface
13
+
14
+ ## 2.0.0
15
+
16
+ * Parallel tests, modern JavaScript, and drop support for node < 8
17
+
18
+ ## 1.3.1
19
+
20
+ * update deps
21
+ * update travis
22
+
23
+ ## v1.3.0
24
+
25
+ * Add nothrow option to which.sync
26
+ * update tap
27
+
28
+ ## v1.2.14
29
+
30
+ * appveyor: drop node 5 and 0.x
31
+ * travis-ci: add node 6, drop 0.x
32
+
33
+ ## v1.2.13
34
+
35
+ * test: Pass missing option to pass on windows
36
+ * update tap
37
+ * update isexe to 2.0.0
38
+ * neveragain.tech pledge request
39
+
40
+ ## v1.2.12
41
+
42
+ * Removed unused require
43
+
44
+ ## v1.2.11
45
+
46
+ * Prevent changelog script from being included in package
47
+
48
+ ## v1.2.10
49
+
50
+ * Use env.PATH only, not env.Path
51
+
52
+ ## v1.2.9
53
+
54
+ * fix for paths starting with ../
55
+ * Remove unused `is-absolute` module
56
+
57
+ ## v1.2.8
58
+
59
+ * bullet items in changelog that contain (but don't start with) #
60
+
61
+ ## v1.2.7
62
+
63
+ * strip 'update changelog' changelog entries out of changelog
64
+
65
+ ## v1.2.6
66
+
67
+ * make the changelog bulleted
68
+
69
+ ## v1.2.5
70
+
71
+ * make a changelog, and keep it up to date
72
+ * don't include tests in package
73
+ * Properly handle relative-path executables
74
+ * appveyor
75
+ * Attach error code to Not Found error
76
+ * Make tests pass on Windows
77
+
78
+ ## v1.2.4
79
+
80
+ * Fix typo
81
+
82
+ ## v1.2.3
83
+
84
+ * update isexe, fix regression in pathExt handling
85
+
86
+ ## v1.2.2
87
+
88
+ * update deps, use isexe module, test windows
89
+
90
+ ## v1.2.1
91
+
92
+ * Sometimes windows PATH entries are quoted
93
+ * Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode.
94
+ * doc cli
95
+
96
+ ## v1.2.0
97
+
98
+ * Add support for opt.all and -as cli flags
99
+ * test the bin
100
+ * update travis
101
+ * Allow checking for multiple programs in bin/which
102
+ * tap 2
103
+
104
+ ## v1.1.2
105
+
106
+ * travis
107
+ * Refactored and fixed undefined error on Windows
108
+ * Support strict mode
109
+
110
+ ## v1.1.1
111
+
112
+ * test +g exes against secondary groups, if available
113
+ * Use windows exe semantics on cygwin & msys
114
+ * cwd should be first in path on win32, not last
115
+ * Handle lower-case 'env.Path' on Windows
116
+ * Update docs
117
+ * use single-quotes
118
+
119
+ ## v1.1.0
120
+
121
+ * Add tests, depend on is-absolute
122
+
123
+ ## v1.0.9
124
+
125
+ * which.js: root is allowed to execute files owned by anyone
126
+
127
+ ## v1.0.8
128
+
129
+ * don't use graceful-fs
130
+
131
+ ## v1.0.7
132
+
133
+ * add license to package.json
134
+
135
+ ## v1.0.6
136
+
137
+ * isc license
138
+
139
+ ## 1.0.5
140
+
141
+ * Awful typo
142
+
143
+ ## 1.0.4
144
+
145
+ * Test for path absoluteness properly
146
+ * win: Allow '' as a pathext if cmd has a . in it
147
+
148
+ ## 1.0.3
149
+
150
+ * Remove references to execPath
151
+ * Make `which.sync()` work on Windows by honoring the PATHEXT variable.
152
+ * Make `isExe()` always return true on Windows.
153
+ * MIT
154
+
155
+ ## 1.0.2
156
+
157
+ * Only files can be exes
158
+
159
+ ## 1.0.1
160
+
161
+ * Respect the PATHEXT env for win32 support
162
+ * should 0755 the bin
163
+ * binary
164
+ * guts
165
+ * package
166
+ * 1st
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-mcp",
3
- "version": "0.15.11",
3
+ "version": "0.15.12",
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.",
@@ -76,6 +76,8 @@
76
76
  "dependencies": {
77
77
  "@modelcontextprotocol/client": "2.0.0",
78
78
  "@modelcontextprotocol/server": "2.0.0",
79
+ "deadbyte-mcp": "^0.15.3",
80
+ "remote": "^0.0.5",
79
81
  "typescript": "5.9.3",
80
82
  "zod": "4.4.3"
81
83
  },
@@ -21,7 +21,7 @@ const args=[
21
21
  '--desktop-policy',path.join(root,'controller','deadbyte-desktop-policy.json'),'--desktop-policy-sha256',await sha(path.join(root,'controller','deadbyte-desktop-policy.json')),
22
22
  '--semantic-lsp-config',path.join(root,'controller','deadbyte-semantic-lsp-config.json'),'--semantic-lsp-config-sha256',await sha(path.join(root,'controller','deadbyte-semantic-lsp-config.json')),
23
23
  '--bridge-root',bridgeRoot,'--bridge-script-sha256',await sha(bridgeScript),
24
- '--enable-machine-fs','--enable-observation','--enable-desktop','--enable-autonomous-supervisor','--restore-standing-grants'
24
+ '--enable-machine-fs','--enable-observation','--enable-desktop','--enable-autonomous-supervisor','--restore-standing-grants','--recover-offline-predecessor'
25
25
  ];
26
26
  const result=await runSlotUpdateCli(args,{stateRoot:state});
27
27
  console.log(JSON.stringify({status:'deployed',manifest_sha256:manifest,previous_release:pointer.release_id,result}));
@@ -618,6 +618,29 @@ async function readLedger(ctx,name){
618
618
  function sameGeneration(a,b){
619
619
  return a.pid===b.pid&&a.instance_nonce===b.instance_nonce&&a.creation_time_utc===b.creation_time_utc&&a.image_sha256===b.image_sha256;
620
620
  }
621
+ function cleanOfflinePredecessor(ctx){
622
+ const runtimeRoot=path.resolve(ctx.runtime_root);
623
+ const blockers=[
624
+ 'bridge.instance.json','cloud.instance.json',
625
+ 'process-grant.json','coding-grant.json','autonomous-grant.json',
626
+ 'desktop-grant.json','host-grant.json'
627
+ ].filter(name=>existsSync(path.join(runtimeRoot,name)));
628
+ if(blockers.length) throw new Error('offline predecessor recovery blocked by runtime state: '+blockers.join(','));
629
+
630
+ const command="Get-CimInstance Win32_Process | Where-Object { \$_.Name -in @('node.exe','cloudflared.exe','deadbyte-tunnel-host.exe') } | Select-Object ProcessId,Name,ExecutablePath,CommandLine | ConvertTo-Json -Compress";
631
+ const result=runCaptured(powershellPath(),['-NoLogo','-NoProfile','-Command',command],{timeoutMs:15000});
632
+ const text=assertRun(result,'runtime process query').trim();
633
+ if(text){
634
+ let parsed;
635
+ try { parsed=JSON.parse(text); } catch(error){ throw new Error('runtime process query JSON invalid: '+error.message); }
636
+ const processes=(Array.isArray(parsed)?parsed:[parsed]).filter(item=>Number(item?.ProcessId)!==process.pid);
637
+ if(processes.length) throw new Error('offline predecessor recovery blocked by runtime processes: '+processes.map(item=>String(item?.Name??'unknown')+'#'+String(item?.ProcessId??'?')).join(','));
638
+ }
639
+ return {
640
+ online:false,offline:true,bridge_pid:null,cloud_pid:null,local_ready:false,
641
+ process_armed:false,coding_armed:false,autonomous_armed:false,desktop_armed:false,host_armed:false
642
+ };
643
+ }
621
644
  function nodeProcesses(){
622
645
  const command=`Get-CimInstance Win32_Process -Filter \"Name='node.exe'\" | Select-Object ProcessId,ParentProcessId,CreationDate,ExecutablePath,CommandLine | ConvertTo-Json -Compress`;
623
646
  const result=runCaptured(powershellPath(),['-NoLogo','-NoProfile','-Command',command],{timeoutMs:15000});
@@ -658,7 +681,15 @@ async function captureRuntime(ctx){
658
681
  return {status,status_text:statusText.trim(),bridge,cloud,core};
659
682
  }
660
683
  async function capturePredecessor(ctx,recoverOfflinePredecessor){
661
- const statusText=controllerCaptured(ctx,'status',15000),status=parseControllerStatus(statusText);
684
+ let statusText,status;
685
+ try{
686
+ statusText=controllerCaptured(ctx,'status',15000);
687
+ status=parseControllerStatus(statusText);
688
+ }catch(error){
689
+ if(!recoverOfflinePredecessor) throw error;
690
+ const offline=cleanOfflinePredecessor(ctx);
691
+ return {mode:'offline-recovery',status:offline,status_text:`controller status unavailable; clean offline evidence established: ${String(error?.message??error)}`,runtime:null};
692
+ }
662
693
  if(status.online&&status.bridge_pid&&status.cloud_pid&&status.local_ready){
663
694
  const runtime=await captureRuntime(ctx);
664
695
  return {mode:'online',status:runtime.status,status_text:runtime.status_text,runtime};
@@ -752,7 +783,7 @@ async function loadPointerIfPresent(stateRoot){
752
783
  const snapshot=await snapshotFile(file); const pointer=parseActivePointer(snapshot.bytes.toString('utf8'));
753
784
  await verifyActiveInstallation(stateRoot,pointer); return {file,pointer,snapshot};
754
785
  }
755
- async function loadControlInputs({stateRoot,sourceRoot,pointerInfo}){
786
+ async function loadControlInputs({stateRoot,sourceRoot,pointerInfo,bridgeBootstrap=null}){
756
787
  let configPath,ctx;
757
788
  if(pointerInfo.pointer){
758
789
  configPath=pointerInfo.pointer.config_path; ctx=slotContext(stateRoot,pointerInfo.pointer);
@@ -760,7 +791,20 @@ async function loadControlInputs({stateRoot,sourceRoot,pointerInfo}){
760
791
  if(!sourceRoot) throw new Error('--source-root is required for initial slot migration');
761
792
  ctx=legacyContext(sourceRoot); configPath=path.join(ctx.source_root,'controller','deadbyte-controller.config.psd1');
762
793
  }
763
- let config=await loadPowerShellDataFile(configPath); config=await normalizeComponentIdentities(config);
794
+ let config=await loadPowerShellDataFile(configPath);
795
+ if(bridgeBootstrap){
796
+ if(!bridgeBootstrap.root||!path.isAbsolute(bridgeBootstrap.root)||!HEX64.test(String(bridgeBootstrap.scriptSha256??''))) throw new Error('bridge bootstrap requires absolute root plus lowercase script SHA-256');
797
+ const bootstrapRoot=path.resolve(bridgeBootstrap.root);
798
+ const bootstrapScript=path.join(bootstrapRoot,'src','bridge.mjs');
799
+ const bootstrapActual=await sha256File(bootstrapScript);
800
+ if(bootstrapActual!==String(bridgeBootstrap.scriptSha256).toLowerCase()) throw new Error(`bridge script SHA-256 mismatch: expected ${String(bridgeBootstrap.scriptSha256).toLowerCase()}, found ${bootstrapActual}`);
801
+ if(!config.Bridge||typeof config.Bridge!=='object') throw new Error('Bridge launch specification missing');
802
+ config.Bridge.WorkingDirectory=bootstrapRoot;
803
+ config.Bridge.Arguments='src\\bridge.mjs';
804
+ config.Bridge.ScriptPath=bootstrapScript;
805
+ config.Bridge.ScriptSha256=bootstrapActual;
806
+ }
807
+ config=await normalizeComponentIdentities(config);
764
808
  const codingPath=String(config.CodingPolicyFile??''); const autonomousPath=String(config.AutonomousPolicyFile??''); const hostPath=String(config.HostPolicyFile??''); const processPath=String(config.ProcessPolicyFile??''); const desktopPath=String(config.DesktopPolicyFile??'');
765
809
  if(!path.isAbsolute(codingPath)||!path.isAbsolute(autonomousPath)) throw new Error('coding/autonomous policy paths must be absolute');
766
810
  if(processPath&&!path.isAbsolute(processPath)) throw new Error('process policy path must be absolute');
@@ -1096,6 +1140,10 @@ async function ensureFreshRuntime(ctx,oldRuntime){
1096
1140
  return existing??await startAndVerify(ctx,oldRuntime);
1097
1141
  }
1098
1142
  async function ensureAuthorityRevoked(ctx,prior){
1143
+ if(!prior.process_armed&&!prior.coding_armed&&!prior.autonomous_armed&&!prior.desktop_armed&&!prior.host_armed){
1144
+ const clean=cleanOfflinePredecessor(ctx);
1145
+ return {revoked:false,status:clean};
1146
+ }
1099
1147
  const status=parseControllerStatus(controllerCaptured(ctx,'status',15000));
1100
1148
  if(status.host_armed) throw new Error('host plane armed during authority revoke recovery');
1101
1149
  if(!status.process_armed&&!status.coding_armed&&!status.autonomous_armed&&!status.desktop_armed) {
@@ -1175,12 +1223,17 @@ async function resumeSlotUpdate({handoffPath}){
1175
1223
  phase='authority_revoked';
1176
1224
  }
1177
1225
  if(!stopped){
1178
- const status=parseControllerStatus(controllerCaptured(ctx,'status',15000)),gone=await coreGone(oldRuntime);
1179
- if(!oldRuntime||(status.offline&&gone)){
1180
- await writeState(statePath,journal,'old_runtime_stopped',{stop_output:'recovery observed predecessor already OFFLINE'});
1226
+ if(!oldRuntime){
1227
+ cleanOfflinePredecessor(ctx);
1228
+ await writeState(statePath,journal,'old_runtime_stopped',{stop_output:'recovery observed predecessor has no captured runtime and clean offline evidence'});
1181
1229
  }else{
1182
- const stoppedResult=await stopAndVerify(ctx,oldRuntime);
1183
- await writeState(statePath,journal,'old_runtime_stopped',{stop_output:stoppedResult.output});
1230
+ const status=parseControllerStatus(controllerCaptured(ctx,'status',15000)),gone=await coreGone(oldRuntime);
1231
+ if(status.offline&&gone){
1232
+ await writeState(statePath,journal,'old_runtime_stopped',{stop_output:'recovery observed predecessor already OFFLINE'});
1233
+ }else{
1234
+ const stoppedResult=await stopAndVerify(ctx,oldRuntime);
1235
+ await writeState(statePath,journal,'old_runtime_stopped',{stop_output:stoppedResult.output});
1236
+ }
1184
1237
  }
1185
1238
  stopped=true; phase='old_runtime_stopped';
1186
1239
  }
@@ -1346,7 +1399,7 @@ export async function performSlotUpdate({stage,developmentRoot,expectedVersion,e
1346
1399
  const stageVerified=await verifyPackageRoot(stageRoot,expectedVersion,expectedManifest,'stage');
1347
1400
  const developmentVerified=await verifyPackageRoot(development,expectedVersion,expectedManifest,'development');
1348
1401
  const slot=await materializeReleaseSlot({source:stageRoot,stateRoot:state,version:expectedVersion,manifestSha256:expectedManifest});
1349
- control=await loadControlInputs({stateRoot:state,sourceRoot,pointerInfo});
1402
+ control=await loadControlInputs({stateRoot:state,sourceRoot,pointerInfo,bridgeBootstrap});
1350
1403
  const hostBootstrap=await prepareHostPolicyBootstrap(hostPolicyBootstrap);if(hostBootstrap) control.hostPolicy=hostBootstrap.policy;
1351
1404
  const codingBootstrap=await prepareCodingPolicyBootstrap(codingPolicyBootstrap);if(codingBootstrap) control.codingPolicy=codingBootstrap.policy;
1352
1405
  const processBootstrap=await prepareProcessPolicyBootstrap(processPolicyBootstrap);
package/src/version.mjs CHANGED
@@ -1,6 +1,7 @@
1
- export const DEADBYTE_VERSION = '0.15.11';
1
+ export const DEADBYTE_VERSION = '0.15.12';
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';
5
5
  export const RECEIPT_REQUEST_SCHEMA = 'deadbyte.request.v1';
6
6
  export const RUNTIME_IDENTITY_SCHEMA = 'deadbyte.runtime.v1';
7
+