deadbyte-mcp 0.8.9 → 0.9.0

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.
Files changed (349) hide show
  1. package/CONTEXT.md +41 -0
  2. package/MANIFEST.SHA256 +348 -83
  3. package/R34-BASELINE.json +9 -0
  4. package/README.txt +135 -9
  5. package/bench/fixtures/corpus.json +17 -0
  6. package/bin/WORKER-REGISTRY.txt +3 -3
  7. package/bin/appcontainer-stage.exe +0 -0
  8. package/bin/appcontainer-stage.obj +0 -0
  9. package/bin/bootstrap-advapi32.exe +0 -0
  10. package/bin/bootstrap-advapi32.obj +0 -0
  11. package/bin/bootstrap-exitcode.exe +0 -0
  12. package/bin/bootstrap-exitcode.obj +0 -0
  13. package/bin/bootstrap-kernel32.exe +0 -0
  14. package/bin/bootstrap-kernel32.obj +0 -0
  15. package/bin/child-control-probe.exe +0 -0
  16. package/bin/child-control-probe.obj +0 -0
  17. package/bin/child-control-stage.exe +0 -0
  18. package/bin/child-control-stage.obj +0 -0
  19. package/bin/contained-reverse-worker.exe +0 -0
  20. package/bin/contained-reverse-worker.obj +0 -0
  21. package/bin/contained-transform-worker.exe +0 -0
  22. package/bin/contained-transform-worker.obj +0 -0
  23. package/bin/containment-probe.exe +0 -0
  24. package/bin/containment-probe.obj +0 -0
  25. package/bin/deadbyte-contain.exe +0 -0
  26. package/bin/deadbyte-contain.obj +0 -0
  27. package/bin/deadbyte-exec.exe +0 -0
  28. package/bin/deadbyte-exec.obj +0 -0
  29. package/bin/deadbyte-process-host.exe +0 -0
  30. package/bin/deadbyte-process-host.obj +0 -0
  31. package/bin/deadbyte-tunnel-host.exe +0 -0
  32. package/bin/deadbyte-tunnel-host.obj +0 -0
  33. package/controller/README.TXT +10 -4
  34. package/controller/deadbyte-controller.config.psd1.example +14 -0
  35. package/controller/deadbyte-controller.ps1 +144 -19
  36. package/controller/deadbyte-process-policy.json +5 -5
  37. package/controller/deadbyte-semantic-lsp-config.json +95 -0
  38. package/deadbyte-mcp-0.8.9.tgz +0 -0
  39. package/docs/ADR-0001-PRODUCTION-BASELINE-SEAMS.md +29 -0
  40. package/docs/ARCHITECTURE.md +6 -5
  41. package/docs/superpowers/plans/2026-09-16-deadbyte-loop-engine.md +846 -0
  42. package/docs/superpowers/plans/2026-09-17-r35-production-successor.md +408 -0
  43. package/docs/superpowers/specs/2026-09-16-deadbyte-loop-engine-design.md +435 -0
  44. package/docs/superpowers/specs/2026-09-17-r35-production-successor-design.md +220 -0
  45. package/node_modules/typescript/LICENSE.txt +55 -0
  46. package/node_modules/typescript/README.md +50 -0
  47. package/node_modules/typescript/SECURITY.md +41 -0
  48. package/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
  49. package/node_modules/typescript/bin/tsc +2 -0
  50. package/node_modules/typescript/bin/tsserver +2 -0
  51. package/node_modules/typescript/lib/_tsc.js +133818 -0
  52. package/node_modules/typescript/lib/_tsserver.js +659 -0
  53. package/node_modules/typescript/lib/_typingsInstaller.js +222 -0
  54. package/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
  55. package/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
  56. package/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
  57. package/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
  58. package/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
  59. package/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
  60. package/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
  61. package/node_modules/typescript/lib/lib.d.ts +22 -0
  62. package/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
  63. package/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
  64. package/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
  65. package/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
  66. package/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
  67. package/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
  68. package/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
  69. package/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
  70. package/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
  71. package/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
  72. package/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
  73. package/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
  74. package/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
  75. package/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
  76. package/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
  77. package/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
  78. package/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
  79. package/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
  80. package/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
  81. package/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
  82. package/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
  83. package/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
  84. package/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
  85. package/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
  86. package/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
  87. package/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
  88. package/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
  89. package/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
  90. package/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
  91. package/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
  92. package/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
  93. package/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
  94. package/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
  95. package/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
  96. package/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
  97. package/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
  98. package/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
  99. package/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
  100. package/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
  101. package/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
  102. package/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
  103. package/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
  104. package/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
  105. package/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
  106. package/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
  107. package/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
  108. package/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
  109. package/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
  110. package/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
  111. package/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
  112. package/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
  113. package/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
  114. package/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
  115. package/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
  116. package/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
  117. package/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
  118. package/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
  119. package/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
  120. package/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
  121. package/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
  122. package/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
  123. package/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
  124. package/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
  125. package/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
  126. package/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
  127. package/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
  128. package/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
  129. package/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
  130. package/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
  131. package/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
  132. package/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
  133. package/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
  134. package/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
  135. package/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
  136. package/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
  137. package/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
  138. package/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
  139. package/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
  140. package/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
  141. package/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
  142. package/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
  143. package/node_modules/typescript/lib/lib.es6.d.ts +23 -0
  144. package/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
  145. package/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
  146. package/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
  147. package/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
  148. package/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
  149. package/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
  150. package/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
  151. package/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
  152. package/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
  153. package/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
  154. package/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
  155. package/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
  156. package/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
  157. package/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
  158. package/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
  159. package/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
  160. package/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
  161. package/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
  162. package/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
  163. package/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
  164. package/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
  165. package/node_modules/typescript/lib/tsc.js +8 -0
  166. package/node_modules/typescript/lib/tsserver.js +8 -0
  167. package/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
  168. package/node_modules/typescript/lib/tsserverlibrary.js +21 -0
  169. package/node_modules/typescript/lib/typesMap.json +497 -0
  170. package/node_modules/typescript/lib/typescript.d.ts +11437 -0
  171. package/node_modules/typescript/lib/typescript.js +200276 -0
  172. package/node_modules/typescript/lib/typingsInstaller.js +8 -0
  173. package/node_modules/typescript/lib/watchGuard.js +53 -0
  174. package/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
  175. package/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
  176. package/node_modules/typescript/package.json +120 -0
  177. package/package.json +5 -3
  178. package/proof/CONTAINMENT-BUILD.txt +6 -6
  179. package/proof/R34-TASK8-SUPERVISOR-CHECKPOINT.json +29 -0
  180. package/proof/R34-TASK9-MCP-SURFACE-CHECKPOINT.json +28 -0
  181. package/scripts/capability-benchmark.mjs +27 -0
  182. package/scripts/deferred-slot-operation.mjs +4 -2
  183. package/scripts/final-closure-verify.mjs +10 -10
  184. package/scripts/final-closure.mjs +11 -11
  185. package/scripts/gate-windows.ps1 +3 -3
  186. package/scripts/release-parity.mjs +14 -14
  187. package/scripts/semantic-preflight.ps1 +73 -0
  188. package/scripts/tool-surface-snapshot.mjs +73 -0
  189. package/scripts/windows-gate-evidence.mjs +5 -5
  190. package/src/audit-verify.mjs +6 -2
  191. package/src/autonomous-action-reconcile.mjs +142 -0
  192. package/src/autonomous-context-engine.mjs +255 -0
  193. package/src/autonomous-live-state.mjs +17 -0
  194. package/src/autonomous-local-supervisor.mjs +249 -0
  195. package/src/autonomous-loop-state.mjs +304 -0
  196. package/src/autonomous-output-contracts.mjs +22 -3
  197. package/src/autonomous-plan.mjs +181 -0
  198. package/src/autonomous-planner-contracts.mjs +44 -0
  199. package/src/autonomous-planner.mjs +91 -6
  200. package/src/autonomous-policy.mjs +15 -2
  201. package/src/autonomous-progress.mjs +127 -0
  202. package/src/autonomous-runtime.mjs +601 -48
  203. package/src/autonomous-supervisor-host.mjs +70 -0
  204. package/src/autonomous-supervisor.mjs +31 -8
  205. package/src/capability-benchmark-runner.mjs +108 -0
  206. package/src/capability-benchmark.mjs +50 -0
  207. package/src/coding-mcp-tools.mjs +46 -3
  208. package/src/coding-output-contracts.mjs +45 -0
  209. package/src/context-provenance.mjs +86 -0
  210. package/src/deadbyte-cli.mjs +136 -30
  211. package/src/document-adapter.mjs +43 -0
  212. package/src/lsp-stdio-client.mjs +112 -0
  213. package/src/machine-fs-smoke-client.mjs +2 -1
  214. package/src/mcp-server.mjs +17 -3
  215. package/src/observation-smoke-client.mjs +3 -2
  216. package/src/operator-surface.mjs +37 -0
  217. package/src/provider-circuit.mjs +125 -0
  218. package/src/release-generation.mjs +44 -5
  219. package/src/remote-mcp-autonomous-smoke-client.mjs +53 -14
  220. package/src/remote-mcp-coding-smoke-client.mjs +5 -4
  221. package/src/remote-mcp-r24-disarmed-smoke-client.mjs +4 -2
  222. package/src/remote-mcp-r33-parity-client.mjs +1 -1
  223. package/src/remote-mcp-r34-parity-client.mjs +177 -0
  224. package/src/remote-mcp-smoke-client.mjs +2 -1
  225. package/src/remote-result-journal.mjs +114 -0
  226. package/src/runtime-update.mjs +58 -8
  227. package/src/semantic-backend-registry.mjs +39 -0
  228. package/src/semantic-code.mjs +179 -0
  229. package/src/semantic-lsp-backend.mjs +183 -0
  230. package/src/semantic-lsp-config.mjs +112 -0
  231. package/src/tool-surface-ledger.mjs +92 -0
  232. package/src/version.mjs +1 -1
  233. package/test/audit-verify.test.mjs +1 -1
  234. package/test/autonomous-action-reconcile.test.mjs +106 -0
  235. package/test/autonomous-adversarial.test.mjs +149 -6
  236. package/test/autonomous-context-engine.test.mjs +181 -0
  237. package/test/autonomous-live-state.test.mjs +27 -0
  238. package/test/autonomous-local-supervisor.test.mjs +403 -0
  239. package/test/autonomous-loop-state.test.mjs +126 -0
  240. package/test/autonomous-loop-v2.test.mjs +105 -0
  241. package/test/autonomous-loop.test.mjs +79 -1
  242. package/test/autonomous-output-contract.test.mjs +54 -0
  243. package/test/autonomous-plan.test.mjs +101 -0
  244. package/test/autonomous-progress.test.mjs +106 -0
  245. package/test/autonomous-r34-e2e.test.mjs +338 -0
  246. package/test/autonomous-runtime.test.mjs +3 -3
  247. package/test/autonomous-supervisor-integration.test.mjs +48 -3
  248. package/test/capability-benchmark-runner.test.mjs +49 -0
  249. package/test/capability-benchmark.test.mjs +47 -0
  250. package/test/cli-entrypoint.test.mjs +12 -0
  251. package/test/coding-catalog-consistency.test.mjs +24 -0
  252. package/test/coding-plane.test.mjs +3 -3
  253. package/test/context-provenance.test.mjs +61 -0
  254. package/test/controller-r27.test.mjs +4 -3
  255. package/test/controller.test.mjs +52 -0
  256. package/test/core.test.mjs +1 -1
  257. package/test/deferred-slot-operation-behavior.test.mjs +5 -1
  258. package/test/deferred-slot-operation.test.mjs +2 -1
  259. package/test/document-adapter.test.mjs +23 -0
  260. package/test/fixtures/lsp-framed-server.mjs +33 -0
  261. package/test/fixtures/semantic/cpp/compile_commands.json +4 -0
  262. package/test/fixtures/semantic/cpp/lib.cpp +2 -0
  263. package/test/fixtures/semantic/cpp/lib.hpp +2 -0
  264. package/test/fixtures/semantic/cpp/main.cpp +2 -0
  265. package/test/fixtures/semantic/python/lib.py +2 -0
  266. package/test/fixtures/semantic/python/main.py +2 -0
  267. package/test/fixtures/semantic/rust/Cargo.lock +7 -0
  268. package/test/fixtures/semantic/rust/Cargo.toml +8 -0
  269. package/test/fixtures/semantic/rust/src/lib.rs +3 -0
  270. package/test/fixtures/semantic/rust/src/main.rs +5 -0
  271. package/test/fixtures/semantic/rust/src/math.rs +3 -0
  272. package/test/fixtures/semantic/rust/target/.rustc_info.json +1 -0
  273. package/test/fixtures/semantic/rust/target/CACHEDIR.TAG +3 -0
  274. package/test/fixtures/semantic/rust/target/debug/.cargo-lock +0 -0
  275. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/dep-test-lib-semantic_rust +0 -0
  276. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/invoked.timestamp +1 -0
  277. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/test-lib-semantic_rust +1 -0
  278. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-4c168fa33c79d09c/test-lib-semantic_rust.json +1 -0
  279. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/dep-test-bin-semantic_rust_bin +0 -0
  280. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/invoked.timestamp +1 -0
  281. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/test-bin-semantic_rust_bin +1 -0
  282. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-5dcd474439c54a26/test-bin-semantic_rust_bin.json +1 -0
  283. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/dep-lib-semantic_rust +0 -0
  284. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/invoked.timestamp +1 -0
  285. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/lib-semantic_rust +1 -0
  286. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-6212ccd976aa3808/lib-semantic_rust.json +1 -0
  287. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/bin-semantic_rust_bin +1 -0
  288. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/bin-semantic_rust_bin.json +1 -0
  289. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/dep-bin-semantic_rust_bin +0 -0
  290. package/test/fixtures/semantic/rust/target/debug/.fingerprint/semantic_rust-d741378dccdef61c/invoked.timestamp +1 -0
  291. package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust-4c168fa33c79d09c.rmeta +0 -0
  292. package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust-6212ccd976aa3808.rmeta +0 -0
  293. package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust_bin-5dcd474439c54a26.rmeta +0 -0
  294. package/test/fixtures/semantic/rust/target/debug/deps/libsemantic_rust_bin-d741378dccdef61c.rmeta +0 -0
  295. package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust-4c168fa33c79d09c.d +5 -0
  296. package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust-6212ccd976aa3808.d +5 -0
  297. package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust_bin-5dcd474439c54a26.d +6 -0
  298. package/test/fixtures/semantic/rust/target/debug/deps/semantic_rust_bin-d741378dccdef61c.d +6 -0
  299. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/dep-graph.bin +0 -0
  300. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/query-cache.bin +0 -0
  301. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc-1qb77z00k06rqw4jdkj92spax/work-products.bin +0 -0
  302. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-1nzlugxi6lq16/s-hmdgo8b6hg-1n6glhc.lock +0 -0
  303. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/dep-graph.bin +0 -0
  304. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/metadata.rmeta +0 -0
  305. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/query-cache.bin +0 -0
  306. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq-9twkpivsqnjon278x20bddozq/work-products.bin +0 -0
  307. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust-3s436v7g6f5xm/s-hmdgo8b58k-1ekj4lq.lock +0 -0
  308. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/dep-graph.bin +0 -0
  309. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/query-cache.bin +0 -0
  310. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3-cmu3jai030no72y8u9eurrnjj/work-products.bin +0 -0
  311. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-1jxcbdeehal7q/s-hmdgo8bxlf-1qr24o3.lock +0 -0
  312. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/dep-graph.bin +0 -0
  313. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/query-cache.bin +0 -0
  314. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt-diy9mqvc2eoiblmhjs3stcgi3/work-products.bin +0 -0
  315. package/test/fixtures/semantic/rust/target/debug/incremental/semantic_rust_bin-2ocx55p60ni6b/s-hmdgo8bxj8-0ir41qt.lock +0 -0
  316. package/test/fixtures/semantic/rust/target/flycheck0/stderr +1 -0
  317. package/test/fixtures/semantic/rust/target/flycheck0/stdout +5 -0
  318. package/test/fixtures/semantic/typescript/lib.ts +3 -0
  319. package/test/fixtures/semantic/typescript/main.ts +2 -0
  320. package/test/fixtures/tool-surface-stdio-server.mjs +14 -0
  321. package/test/helpers/autonomous-r34-fixture.mjs +120 -0
  322. package/test/lsp-stdio-client.test.mjs +72 -0
  323. package/test/multi-file-read.test.mjs +41 -0
  324. package/test/observation-integration.test.mjs +3 -3
  325. package/test/production-docs.test.mjs +48 -0
  326. package/test/prompts-resources.test.mjs +35 -0
  327. package/test/provider-circuit.test.mjs +93 -0
  328. package/test/public-autonomous-ingress-budget.test.mjs +28 -0
  329. package/test/r33-closeout-regression.test.mjs +3 -3
  330. package/test/r33-finalization.test.mjs +19 -16
  331. package/test/release-generation.test.mjs +23 -2
  332. package/test/release-version.test.mjs +24 -17
  333. package/test/remote-r24-catalog.test.mjs +5 -4
  334. package/test/remote-result-journal.test.mjs +58 -0
  335. package/test/remote-session-cli.test.mjs +150 -15
  336. package/test/runtime-self-update.test.mjs +63 -0
  337. package/test/semantic-backend-registry.test.mjs +29 -0
  338. package/test/semantic-code.test.mjs +66 -0
  339. package/test/semantic-lsp-backend.test.mjs +99 -0
  340. package/test/semantic-lsp-config.test.mjs +81 -0
  341. package/test/semantic-lsp-readiness.test.mjs +34 -0
  342. package/test/semantic-lsp-transient-empty.test.mjs +32 -0
  343. package/test/semantic-lsp-transient-null.test.mjs +31 -0
  344. package/test/semantic-multilang.test.mjs +72 -0
  345. package/test/semantic-runtime-routing.test.mjs +32 -0
  346. package/test/semantic-server-config-integration.test.mjs +66 -0
  347. package/test/tool-surface-ledger.test.mjs +59 -0
  348. package/test/tool-surface-snapshot.test.mjs +17 -0
  349. package/test/tracer-bullet.test.mjs +77 -0
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "typescript",
3
+ "author": "Microsoft Corp.",
4
+ "homepage": "https://www.typescriptlang.org/",
5
+ "version": "5.9.3",
6
+ "license": "Apache-2.0",
7
+ "description": "TypeScript is a language for application scale JavaScript development",
8
+ "keywords": [
9
+ "TypeScript",
10
+ "Microsoft",
11
+ "compiler",
12
+ "language",
13
+ "javascript"
14
+ ],
15
+ "bugs": {
16
+ "url": "https://github.com/microsoft/TypeScript/issues"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/microsoft/TypeScript.git"
21
+ },
22
+ "main": "./lib/typescript.js",
23
+ "typings": "./lib/typescript.d.ts",
24
+ "bin": {
25
+ "tsc": "./bin/tsc",
26
+ "tsserver": "./bin/tsserver"
27
+ },
28
+ "engines": {
29
+ "node": ">=14.17"
30
+ },
31
+ "files": [
32
+ "bin",
33
+ "lib",
34
+ "!lib/enu",
35
+ "LICENSE.txt",
36
+ "README.md",
37
+ "SECURITY.md",
38
+ "ThirdPartyNoticeText.txt",
39
+ "!**/.gitattributes"
40
+ ],
41
+ "devDependencies": {
42
+ "@dprint/formatter": "^0.4.1",
43
+ "@dprint/typescript": "0.93.4",
44
+ "@esfx/canceltoken": "^1.0.0",
45
+ "@eslint/js": "^9.20.0",
46
+ "@octokit/rest": "^21.1.1",
47
+ "@types/chai": "^4.3.20",
48
+ "@types/diff": "^7.0.1",
49
+ "@types/minimist": "^1.2.5",
50
+ "@types/mocha": "^10.0.10",
51
+ "@types/ms": "^0.7.34",
52
+ "@types/node": "latest",
53
+ "@types/source-map-support": "^0.5.10",
54
+ "@types/which": "^3.0.4",
55
+ "@typescript-eslint/rule-tester": "^8.24.1",
56
+ "@typescript-eslint/type-utils": "^8.24.1",
57
+ "@typescript-eslint/utils": "^8.24.1",
58
+ "azure-devops-node-api": "^14.1.0",
59
+ "c8": "^10.1.3",
60
+ "chai": "^4.5.0",
61
+ "chokidar": "^4.0.3",
62
+ "diff": "^7.0.0",
63
+ "dprint": "^0.49.0",
64
+ "esbuild": "^0.25.0",
65
+ "eslint": "^9.20.1",
66
+ "eslint-formatter-autolinkable-stylish": "^1.4.0",
67
+ "eslint-plugin-regexp": "^2.7.0",
68
+ "fast-xml-parser": "^4.5.2",
69
+ "glob": "^10.4.5",
70
+ "globals": "^15.15.0",
71
+ "hereby": "^1.10.0",
72
+ "jsonc-parser": "^3.3.1",
73
+ "knip": "^5.44.4",
74
+ "minimist": "^1.2.8",
75
+ "mocha": "^10.8.2",
76
+ "mocha-fivemat-progress-reporter": "^0.1.0",
77
+ "monocart-coverage-reports": "^2.12.1",
78
+ "ms": "^2.1.3",
79
+ "picocolors": "^1.1.1",
80
+ "playwright": "^1.50.1",
81
+ "source-map-support": "^0.5.21",
82
+ "tslib": "^2.8.1",
83
+ "typescript": "^5.7.3",
84
+ "typescript-eslint": "^8.24.1",
85
+ "which": "^3.0.1"
86
+ },
87
+ "overrides": {
88
+ "typescript@*": "$typescript"
89
+ },
90
+ "scripts": {
91
+ "test": "hereby runtests-parallel --light=false",
92
+ "test:eslint-rules": "hereby run-eslint-rules-tests",
93
+ "build": "npm run build:compiler && npm run build:tests",
94
+ "build:compiler": "hereby local",
95
+ "build:tests": "hereby tests",
96
+ "build:tests:notypecheck": "hereby tests --no-typecheck",
97
+ "clean": "hereby clean",
98
+ "gulp": "hereby",
99
+ "lint": "hereby lint",
100
+ "knip": "hereby knip",
101
+ "format": "dprint fmt",
102
+ "setup-hooks": "node scripts/link-hooks.mjs"
103
+ },
104
+ "browser": {
105
+ "fs": false,
106
+ "os": false,
107
+ "path": false,
108
+ "crypto": false,
109
+ "buffer": false,
110
+ "source-map-support": false,
111
+ "inspector": false,
112
+ "perf_hooks": false
113
+ },
114
+ "packageManager": "npm@8.19.4",
115
+ "volta": {
116
+ "node": "20.1.0",
117
+ "npm": "8.19.4"
118
+ },
119
+ "gitHead": "c63de15a992d37f0d6cec03ac7631872838602cb"
120
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-mcp",
3
- "version": "0.8.9",
3
+ "version": "0.9.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Authenticated MCP machine-truth runtime with signed audit chain, immutable release slots, contained execution, coding/autonomous production authority, and npx-first remote control.",
@@ -52,12 +52,14 @@
52
52
  "bundleDependencies": [
53
53
  "@modelcontextprotocol/server",
54
54
  "@modelcontextprotocol/client",
55
+ "typescript",
55
56
  "zod"
56
57
  ],
57
58
  "dependencies": {
59
+ "@modelcontextprotocol/client": "2.0.0",
58
60
  "@modelcontextprotocol/server": "2.0.0",
59
- "zod": "4.4.3",
60
- "@modelcontextprotocol/client": "2.0.0"
61
+ "typescript": "5.9.3",
62
+ "zod": "4.4.3"
61
63
  },
62
64
  "bin": {
63
65
  "deadbyte-mcp": "src/deadbyte-cli.mjs"
@@ -39,7 +39,7 @@ deadbyte-process-host.cpp
39
39
  exit_code=0
40
40
  ==== probe-dependencies ====
41
41
 
42
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\containment-probe.exe
42
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\containment-probe.exe
43
43
 
44
44
  File Type: EXECUTABLE IMAGE
45
45
 
@@ -59,7 +59,7 @@ File Type: EXECUTABLE IMAGE
59
59
  exit_code=0
60
60
  ==== contained-launcher-dependencies ====
61
61
 
62
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\deadbyte-exec.exe
62
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\deadbyte-exec.exe
63
63
 
64
64
  File Type: EXECUTABLE IMAGE
65
65
 
@@ -83,7 +83,7 @@ File Type: EXECUTABLE IMAGE
83
83
  exit_code=0
84
84
  ==== contained-worker-dependencies ====
85
85
 
86
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\contained-transform-worker.exe
86
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\contained-transform-worker.exe
87
87
 
88
88
  File Type: EXECUTABLE IMAGE
89
89
 
@@ -104,7 +104,7 @@ File Type: EXECUTABLE IMAGE
104
104
  exit_code=0
105
105
  ==== contained-reverse-worker-dependencies ====
106
106
 
107
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\contained-reverse-worker.exe
107
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\contained-reverse-worker.exe
108
108
 
109
109
  File Type: EXECUTABLE IMAGE
110
110
 
@@ -125,7 +125,7 @@ File Type: EXECUTABLE IMAGE
125
125
  exit_code=0
126
126
  ==== named-tunnel-host-dependencies ====
127
127
 
128
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\deadbyte-tunnel-host.exe
128
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\deadbyte-tunnel-host.exe
129
129
 
130
130
  File Type: EXECUTABLE IMAGE
131
131
 
@@ -144,7 +144,7 @@ File Type: EXECUTABLE IMAGE
144
144
  exit_code=0
145
145
  ==== process-host-dependencies ====
146
146
 
147
- Dump of file C:\Users\DEADBYTE\Downloads\deadbyte-mcp-r33-final-candidate-v2\bin\deadbyte-process-host.exe
147
+ Dump of file D:\Projects\deadbyte-mcp-r35-release-v0.9.0-r2\bin\deadbyte-process-host.exe
148
148
 
149
149
  File Type: EXECUTABLE IMAGE
150
150
 
@@ -0,0 +1,29 @@
1
+ {
2
+ "schema": "deadbyte.r34.task8-checkpoint.v1",
3
+ "task": 8,
4
+ "status": "passed",
5
+ "workspace": "D:\\Projects\\deadbyte-mcp-r34-loop-engine",
6
+ "node_executable_sha256": "9a4eb5f1c29c6a2e93852ead46b999e284a6a5ca8bab4d4e241d587d025a52de",
7
+ "sources": {
8
+ "src/autonomous-local-supervisor.mjs": "ab0158c3f6e270ee367ae96455dd2b75a902c808b2a10ac2c5b75fdda00be6c3",
9
+ "src/autonomous-supervisor.mjs": "8ea06b5941de9b346ab4e97ff6ed236964b864fbe725602baee3a54dd74527c0",
10
+ "src/autonomous-supervisor-host.mjs": "335022086ef41e6cc9853468d928acc864deab8009383dc22518a6ec7e749fa1",
11
+ "src/deadbyte-cli.mjs": "0b0d41a51559502a6ff377a4f74e6f80ea77d37002a700e04bd7c4dd3f226b42",
12
+ "controller/deadbyte-controller.ps1": "279dfe20345193ca229cc442b25796f12d4c8ec9f9d3e2d26a607a7342b96a5a",
13
+ "controller/deadbyte-controller.config.psd1.example": "f20a5bf0df576dbdd32af657640b26c5c50c39dce0b465b7488c218917c729f7"
14
+ },
15
+ "regression": {
16
+ "tests": 40,
17
+ "passed": 40,
18
+ "failed": 0,
19
+ "receipt_id": "473fb1f0f7e6a2dec1ea9d80",
20
+ "receipt_sha256": "255e3679051eff46ae745b16f07d6a3c40f87e42259ac651ef286c9d876ceae2",
21
+ "receipt_signature_valid": true,
22
+ "marker": "TASK8_REGRESSION=PASS"
23
+ },
24
+ "authority_contract": {
25
+ "self_arm": false,
26
+ "recovery_operations": ["resume","disarmautonomous","disarmcoding","disarmprocess","disarmhost","status"],
27
+ "final_required": "ONLINE + process/coding/autonomous/host DISARMED"
28
+ }
29
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "schema": "deadbyte.r34-task9-checkpoint.v1",
3
+ "status": "passed",
4
+ "workspace": "D:\\Projects\\deadbyte-mcp-r34-loop-engine",
5
+ "public_tool_count": 68,
6
+ "public_tool_unique_count": 68,
7
+ "public_tool_catalog_sha256": "bb7c08e116178e3da4b577b591f7058eb6caf7632358e765d28ccb20b2e36f45",
8
+ "mcp_server_sha256": "5a6cd82c332e4cef30c4ccfeb12f8cb3634cb6c92104931768b42ba6a84b62b3",
9
+ "controller_sha256": "cf8ab26a7481801da07c5c0a842df4ce1279854ed67781f967e5412da5c2aa3d",
10
+ "supervisor_integration_test_sha256": "127e170995460daabab88860f20f1b4c2416839e018df0e1cda23b58d032beab",
11
+ "exact_surface_gate": {
12
+ "tests": 19,
13
+ "pass": 19,
14
+ "fail": 0,
15
+ "receipt_id": "dc0b7e9c6c9e340c037bc54a",
16
+ "receipt_sha256": "f6b8ac9b6d499d51f60c7f8053a2e591e09654cdfe5bf69c449b15d133e48506"
17
+ },
18
+ "catalog_observation": {
19
+ "receipt_id": "7dd6df7d9b575e786101d1d0",
20
+ "receipt_sha256": "226e0861c01cb485ef94b91c1562a3cb70123698b9a52bb62ba883940be940cf"
21
+ },
22
+ "supervision": {
23
+ "in_process_compatibility": true,
24
+ "external_owner_mode": true,
25
+ "bridge_external_mode_does_not_execute_goal": true,
26
+ "standalone_host_advances_durable_goal": true
27
+ }
28
+ }
@@ -0,0 +1,27 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { runCapabilityBenchmark } from '../src/capability-benchmark-runner.mjs';
4
+
5
+ function argValue(name){
6
+ const prefix=`${name}=`;
7
+ const hit=process.argv.slice(2).find(value=>value.startsWith(prefix));
8
+ return hit?hit.slice(prefix.length):null;
9
+ }
10
+
11
+ const out=argValue('--out');
12
+ const timeoutRaw=argValue('--timeout-ms');
13
+ const timeoutMs=timeoutRaw===null?180000:Number(timeoutRaw);
14
+ if(!Number.isInteger(timeoutMs)||timeoutMs<1000||timeoutMs>600000) throw new Error('capability benchmark timeout invalid');
15
+ const env={
16
+ DEADBYTE_R35_SEMANTIC_CONFIG:process.env.DEADBYTE_R35_SEMANTIC_CONFIG??'',
17
+ DEADBYTE_R35_SEMANTIC_CONFIG_SHA256:process.env.DEADBYTE_R35_SEMANTIC_CONFIG_SHA256??''
18
+ };
19
+ const result=await runCapabilityBenchmark({rootUrl:new URL('../',import.meta.url),env,timeoutMs});
20
+ const text=`${JSON.stringify(result,null,2)}\n`;
21
+ if(out){
22
+ const target=path.resolve(out);
23
+ await mkdir(path.dirname(target),{recursive:true});
24
+ await writeFile(target,text,{encoding:'utf8'});
25
+ }
26
+ process.stdout.write(text);
27
+ if(!result.overall_correct) process.exitCode=1;
@@ -22,9 +22,10 @@ const atomicJson=async(file,value)=>{
22
22
  };
23
23
  function activationArgs(manifestSha){
24
24
  if(!HEX64.test(manifestSha??'')) throw new Error('activate requires one lowercase manifest SHA-256');
25
- return ['--stage',packageRoot,'--development-root',packageRoot,'--expected-version','0.8.9',
25
+ return ['--stage',packageRoot,'--development-root',packageRoot,'--expected-version','0.9.0',
26
26
  '--expected-manifest',manifestSha,'--process-policy',path.join(packageRoot,'controller','deadbyte-process-policy.json'),
27
- '--process-policy-sha256',null,'--enable-machine-fs','--enable-observation'];
27
+ '--process-policy-sha256',null,'--semantic-lsp-config',path.join(packageRoot,'controller','deadbyte-semantic-lsp-config.json'),
28
+ '--semantic-lsp-config-sha256',null,'--enable-machine-fs','--enable-observation','--enable-autonomous-supervisor'];
28
29
  }
29
30
  async function rollbackArgs(receiptPath){
30
31
  const resolved=await realpath(path.resolve(receiptPath));
@@ -45,6 +46,7 @@ async function normalizedArgs(mode,value){
45
46
  if(mode==='activate'){
46
47
  const args=activationArgs(value);
47
48
  args[args.indexOf('--process-policy-sha256')+1]=sha256(await readFile(path.join(packageRoot,'controller','deadbyte-process-policy.json')));
49
+ args[args.indexOf('--semantic-lsp-config-sha256')+1]=sha256(await readFile(path.join(packageRoot,'controller','deadbyte-semantic-lsp-config.json')));
48
50
  return args;
49
51
  }
50
52
  if(mode==='rollback') return rollbackArgs(value);
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url';
6
6
 
7
7
  const HEX64=/^[0-9a-f]{64}$/;
8
8
  const UPDATE_DOMAIN=Buffer.from('DEADBYTE-R27-SLOT-UPDATE-V1\0','utf8');
9
- const CLOSURE_DOMAIN=Buffer.from('DEADBYTE-R33-FINAL-CLOSURE-V1\0','utf8');
9
+ const CLOSURE_DOMAIN=Buffer.from('DEADBYTE-R35-FINAL-CLOSURE-V1\0','utf8');
10
10
  const PING_DOMAIN=Buffer.from('DEADBYTE-MACHINE-PING-V1\0','utf8');
11
11
  const sha256=bytes=>createHash('sha256').update(bytes).digest('hex');
12
12
  const canonical=value=>Array.isArray(value)?value.map(canonical):value&&typeof value==='object'
@@ -83,21 +83,21 @@ function verifyPing(ping,status,pointer){
83
83
  }
84
84
 
85
85
  export async function verifyFinalClosureObject(envelope,{stateRoot=path.join(os.homedir(),'.deadbyte-mcp')}={}){
86
- insist(envelope?.body?.schema==='deadbyte.r33-final-closure.v1','closure schema mismatch');
87
- insist(envelope.body.version==='0.8.9','closure version mismatch');
88
- insist(envelope.body.release_label==='R33 FINAL MACHINE BASELINE','closure release label mismatch');
86
+ insist(envelope?.body?.schema==='deadbyte.r35-final-closure.v1','closure schema mismatch');
87
+ insist(envelope.body.version==='0.9.0','closure version mismatch');
88
+ insist(envelope.body.release_label==='R35 FINAL MACHINE BASELINE','closure release label mismatch');
89
89
  const keyInfo=publicKeyInfo(await readFile(path.join(stateRoot,'trust','ed25519-public.pem')));
90
90
  const bodyBytes=Buffer.from(canonicalJson(envelope.body),'utf8');
91
91
  insist(sha256(bodyBytes)===envelope.body_sha256,'closure body hash mismatch');
92
92
  const {closure_sha256,...unsigned}=envelope;
93
93
  insist(sha256(Buffer.from(canonicalJson(unsigned),'utf8'))===closure_sha256,'closure envelope hash mismatch');
94
- insist(envelope.attestation?.algorithm==='ed25519'&&envelope.attestation?.domain==='DEADBYTE-R33-FINAL-CLOSURE-V1','closure attestation contract mismatch');
94
+ insist(envelope.attestation?.algorithm==='ed25519'&&envelope.attestation?.domain==='DEADBYTE-R35-FINAL-CLOSURE-V1','closure attestation contract mismatch');
95
95
  insist(envelope.attestation.key_id===keyInfo.key_id,'closure signer mismatch');
96
96
  insist(cryptoVerify(null,Buffer.concat([CLOSURE_DOMAIN,bodyBytes]),keyInfo.key,Buffer.from(envelope.attestation.signature_base64,'base64')),'closure signature invalid');
97
97
 
98
98
  const pointer=JSON.parse(await readFile(path.join(stateRoot,'active-release.json'),'utf8'));
99
99
  insist(same(pointer,envelope.body.active_pointer),'active pointer drift');
100
- insist(pointer.version==='0.8.9','active pointer version mismatch');
100
+ insist(pointer.version==='0.9.0','active pointer version mismatch');
101
101
  insist(pointer.release_id===`v${pointer.version}-${pointer.manifest_sha256.slice(0,16)}`,'release id/content address mismatch');
102
102
  const releaseFiles=await verifyTree(pointer.release_root,'MANIFEST.SHA256',pointer.manifest_sha256);
103
103
  const generationFiles=await verifyTree(pointer.generation_root,'GENERATION.SHA256',pointer.generation_manifest_sha256);
@@ -109,10 +109,10 @@ export async function verifyFinalClosureObject(envelope,{stateRoot=path.join(os.
109
109
  insist(sha256(await readFile(item.path))===item.sha256,`${name} evidence hash mismatch`);
110
110
  }
111
111
  const parity=JSON.parse(await readFile(evidence.parity.path,'utf8'));
112
- insist(parity.schema==='deadbyte.r33-parity.v1'&&parity.status==='passed','parity evidence invalid');
112
+ insist(parity.schema==='deadbyte.r35-parity.v1'&&parity.status==='passed','parity evidence invalid');
113
113
  insist(parity.release_id===pointer.release_id&&parity.manifest_sha256===pointer.manifest_sha256,'parity release binding mismatch');
114
114
  insist(parity.rdc_operation_count===0&&parity.execution_provider==='deadbyte_mcp','parity execution provider mismatch');
115
- insist(parity.successor_disarmed?.tool_count===68&&parity.successor_disarmed?.coding_armed===false&&parity.successor_disarmed?.autonomous_armed===false,'final public disarmed gate invalid');
115
+ insist(parity.successor_disarmed?.tool_count===73&&parity.successor_disarmed?.coding_armed===false&&parity.successor_disarmed?.autonomous_armed===false,'final public disarmed gate invalid');
116
116
  for(const key of ['tree_read','precondition_mutation','search','owned_process','observation','coding_loop','autonomy','interrupted_recovery','evidence_verification']) insist(parity.requirements?.[key]===true,`parity requirement missing ${key}`);
117
117
 
118
118
  const activation=JSON.parse(await readFile(evidence.activation.path,'utf8'));
@@ -127,9 +127,9 @@ export async function verifyFinalClosureObject(envelope,{stateRoot=path.join(os.
127
127
  insist(restore.body.active_pointer?.manifest_sha256===pointer.manifest_sha256&&same(restore.body.active_pointer,pointer),'restore/current pointer mismatch');
128
128
  insist(rollback.body.activation_receipt_sha256===activation.receipt_sha256,'rollback not bound to activation');
129
129
  const windowsGate=JSON.parse(await readFile(evidence.windows_gate.path,'utf8'));
130
- insist(windowsGate.schema==='deadbyte.r33-windows-gate.v1'&&windowsGate.status==='passed'&&windowsGate.exit_code===0,'Windows gate evidence invalid');
130
+ insist(windowsGate.schema==='deadbyte.r35-windows-gate.v1'&&windowsGate.status==='passed'&&windowsGate.exit_code===0,'Windows gate evidence invalid');
131
131
  insist(windowsGate.manifest_sha256===pointer.manifest_sha256,'Windows gate manifest binding mismatch');
132
- insist(windowsGate.marker==='DEADBYTE V0.8.9 / R33 WINDOWS BATCH GATE: PASS','Windows gate PASS marker mismatch');
132
+ insist(windowsGate.marker==='DEADBYTE V0.9.0 / R35 WINDOWS BATCH GATE: PASS','Windows gate PASS marker mismatch');
133
133
 
134
134
  const machine=envelope.body.machine;
135
135
  insist(machine?.status?.release_id===pointer.release_id&&machine.status.generation_manifest_sha256===pointer.generation_manifest_sha256,'machine status binding mismatch');
@@ -4,9 +4,9 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
7
- import { R33_EXPECTED_TOOLS } from '../src/remote-mcp-r33-parity-client.mjs';
7
+ import { R34_EXPECTED_TOOLS } from '../src/remote-mcp-r34-parity-client.mjs';
8
8
 
9
- const DOMAIN=Buffer.from('DEADBYTE-R33-FINAL-CLOSURE-V1\0','utf8');
9
+ const DOMAIN=Buffer.from('DEADBYTE-R35-FINAL-CLOSURE-V1\0','utf8');
10
10
  const stateRoot=path.resolve(process.env.DEADBYTE_STATE_ROOT||path.join(os.homedir(),'.deadbyte-mcp'));
11
11
  const sha256=bytes=>createHash('sha256').update(bytes).digest('hex');
12
12
  const canonical=value=>Array.isArray(value)?value.map(canonical):value&&typeof value==='object'
@@ -22,17 +22,17 @@ function structured(result,label){
22
22
  async function publicMachineEvidence(){
23
23
  const endpoint=new URL((await readFile(path.join(stateRoot,'bridge','mcp-url.txt'),'utf8')).trim());
24
24
  insist(endpoint.protocol==='https:','final closure requires HTTPS public endpoint');
25
- const client=new Client({name:'deadbyte-r33-final-closure',version:'0.8.9'},
25
+ const client=new Client({name:'deadbyte-r35-final-closure',version:'0.9.0'},
26
26
  {versionNegotiation:{mode:{pin:'2026-07-28'}}});
27
27
  const transport=new StreamableHTTPClientTransport(endpoint);
28
28
  try{
29
29
  await client.connect(transport);
30
30
  const listed=await client.listTools();
31
31
  const names=listed.tools.map(tool=>tool.name).sort();
32
- insist(JSON.stringify(names)===JSON.stringify(R33_EXPECTED_TOOLS),'final public catalog is not exact 68');
32
+ insist(JSON.stringify(names)===JSON.stringify(R34_EXPECTED_TOOLS),'final public catalog is not exact 73');
33
33
  for(const tool of listed.tools) insist(tool.outputSchema?.type==='object'&&tool.outputSchema?.additionalProperties===false,`tool ${tool.name} output schema drift`);
34
34
  const status=structured(await client.callTool({name:'machine_status',arguments:{}}),'machine_status');
35
- const nonce=`r33-final-${randomBytes(16).toString('hex')}`;
35
+ const nonce=`r35-final-${randomBytes(16).toString('hex')}`;
36
36
  const ping=structured(await client.callTool({name:'machine_ping',arguments:{nonce}}),'machine_ping');
37
37
  const coding=structured(await client.callTool({name:'coding_session_status',arguments:{}}),'coding_session_status');
38
38
  const autonomous=structured(await client.callTool({name:'autonomous_session_status',arguments:{}}),'autonomous_session_status');
@@ -61,13 +61,13 @@ async function atomicCreate(file,bytes){
61
61
 
62
62
  export async function writeFinalClosure({parityPath,activationPath,windowsGatePath}){
63
63
  const pointer=JSON.parse(await readFile(path.join(stateRoot,'active-release.json'),'utf8'));
64
- insist(pointer.version==='0.8.9','final closure requires V0.8.9 active release');
64
+ insist(pointer.version==='0.9.0','final closure requires V0.8.11 active release');
65
65
  const parity=JSON.parse(await readFile(path.resolve(parityPath),'utf8'));
66
- insist(parity.schema==='deadbyte.r33-parity.v1'&&parity.status==='passed','parity evidence is not passed');
66
+ insist(parity.schema==='deadbyte.r35-parity.v1'&&parity.status==='passed','parity evidence is not passed');
67
67
  insist(parity.release_id===pointer.release_id&&parity.manifest_sha256===pointer.manifest_sha256,'parity/current release mismatch');
68
68
  insist(parity.rollback?.receipt_path&&parity.restore?.receipt_path,'parity rollback/restore receipt paths missing');
69
69
  const windowsGate=JSON.parse(await readFile(path.resolve(windowsGatePath),'utf8'));
70
- insist(windowsGate.schema==='deadbyte.r33-windows-gate.v1'&&windowsGate.status==='passed'&&windowsGate.exit_code===0,'Windows gate evidence invalid');
70
+ insist(windowsGate.schema==='deadbyte.r35-windows-gate.v1'&&windowsGate.status==='passed'&&windowsGate.exit_code===0,'Windows gate evidence invalid');
71
71
  insist(windowsGate.manifest_sha256===pointer.manifest_sha256,'Windows gate/current release mismatch');
72
72
  const machine=await publicMachineEvidence();
73
73
  insist(machine.status.release_id===pointer.release_id&&machine.status.release_manifest_sha256===pointer.manifest_sha256,'machine status/current release mismatch');
@@ -76,7 +76,7 @@ export async function writeFinalClosure({parityPath,activationPath,windowsGatePa
76
76
  rollback:await fileEvidence(parity.rollback.receipt_path), restore:await fileEvidence(parity.restore.receipt_path),
77
77
  windows_gate:await fileEvidence(windowsGatePath)
78
78
  };
79
- const body={schema:'deadbyte.r33-final-closure.v1',version:'0.8.9',release_label:'R33 FINAL MACHINE BASELINE',
79
+ const body={schema:'deadbyte.r35-final-closure.v1',version:'0.9.0',release_label:'R35 FINAL MACHINE BASELINE',
80
80
  completed_at_utc:new Date().toISOString(),active_pointer:pointer,evidence,
81
81
  public_catalog:{tool_count:machine.tool_count,strict_output_schemas:machine.strict_output_schemas},
82
82
  machine:{status:machine.status,ping:machine.ping,nonce:machine.nonce},
@@ -87,10 +87,10 @@ export async function writeFinalClosure({parityPath,activationPath,windowsGatePa
87
87
  const keyId=sha256(Buffer.from(publicKey.export({type:'spki',format:'der'})));
88
88
  const bodyBytes=Buffer.from(canonicalJson(body),'utf8');
89
89
  const signature=cryptoSign(null,Buffer.concat([DOMAIN,bodyBytes]),privateKey);
90
- const envelope={body,body_sha256:sha256(bodyBytes),attestation:{algorithm:'ed25519',domain:'DEADBYTE-R33-FINAL-CLOSURE-V1',key_id:keyId,signature_base64:signature.toString('base64')}};
90
+ const envelope={body,body_sha256:sha256(bodyBytes),attestation:{algorithm:'ed25519',domain:'DEADBYTE-R35-FINAL-CLOSURE-V1',key_id:keyId,signature_base64:signature.toString('base64')}};
91
91
  envelope.closure_sha256=sha256(Buffer.from(canonicalJson(envelope),'utf8'));
92
92
  const dir=path.join(stateRoot,'evidence','release');
93
- const file=path.join(dir,`r33-final-${pointer.manifest_sha256.slice(0,16)}.json`);
93
+ const file=path.join(dir,`r35-final-${pointer.manifest_sha256.slice(0,16)}.json`);
94
94
  const bytes=Buffer.from(`${JSON.stringify(envelope,null,2)}\n`,'utf8');
95
95
  await atomicCreate(file,bytes);
96
96
  return {status:'written',path:file,sha256:sha256(bytes),closure_sha256:envelope.closure_sha256,release_id:pointer.release_id};
@@ -9,7 +9,7 @@ function Invoke-GateStep {
9
9
  Write-Host "==== $Name ===="
10
10
  & npm.cmd @NpmArgs
11
11
  if ($LASTEXITCODE -ne 0) {
12
- throw "DEADBYTE V0.8.9 / R33 gate failed at $Name with exit code $LASTEXITCODE"
12
+ throw "DEADBYTE V0.9.0 / R35 gate failed at $Name with exit code $LASTEXITCODE"
13
13
  }
14
14
  }
15
15
 
@@ -36,7 +36,7 @@ Invoke-GateStep -Name 'release-manifest-final' -NpmArgs @('run', 'manifest:verif
36
36
  Write-Host '==== windows-gate-evidence ===='
37
37
  & node.exe (Join-Path $PSScriptRoot 'windows-gate-evidence.mjs')
38
38
  if ($LASTEXITCODE -ne 0) {
39
- throw "DEADBYTE V0.8.9 / R33 gate failed at windows-gate-evidence with exit code $LASTEXITCODE"
39
+ throw "DEADBYTE V0.9.0 / R35 gate failed at windows-gate-evidence with exit code $LASTEXITCODE"
40
40
  }
41
41
 
42
- Write-Host '==== DEADBYTE V0.8.9 / R33 WINDOWS BATCH GATE: PASS ===='
42
+ Write-Host '==== DEADBYTE V0.9.0 / R35 WINDOWS BATCH GATE: PASS ===='
@@ -99,18 +99,18 @@ async function scheduleDeferred(mode, value) {
99
99
  async function publicDisarmed(url) {
100
100
  const script = path.join(root, 'src', 'remote-mcp-r24-disarmed-smoke-client.mjs');
101
101
  const result = parseJsonOutput((await run(process.execPath, [script, url], { timeoutMs:90000 })).stdout, 'public disarmed gate');
102
- assert(result.status === 'passed' && result.tool_count === 68, 'public disarmed gate failed exact catalog');
102
+ assert(result.status === 'passed' && result.tool_count === 73, 'public disarmed gate failed exact catalog');
103
103
  assert(result.coding_armed === false && result.autonomous_armed === false, 'public authority remained armed');
104
104
  return result;
105
105
  }export function validateParityEvidence(value) {
106
- assert(value?.schema === 'deadbyte.r33-parity.v1', 'parity schema mismatch');
106
+ assert(value?.schema === 'deadbyte.r35-parity.v1', 'parity schema mismatch');
107
107
  assert(value.status === 'passed', 'parity status is not passed');
108
108
  assert(value.rdc_operation_count === 0 && value.execution_provider === 'deadbyte_mcp', 'parity used non-DEADBYTE execution');
109
- assert(value.public_full?.status === 'passed' && value.public_full?.tools?.length === 68, 'public full gate missing exact 68');
110
- assert(value.machine_control?.status === 'passed' && value.machine_control?.tool_count === 68, 'machine control parity missing');
111
- assert(value.autonomous?.status === 'passed' && value.autonomous?.tool_count === 68, 'autonomous parity missing');
109
+ assert(value.public_full?.status === 'passed' && value.public_full?.tools?.length === 73, 'public full gate missing exact 73');
110
+ assert(value.machine_control?.status === 'passed' && value.machine_control?.tool_count === 73, 'machine control parity missing');
111
+ assert(value.autonomous?.status === 'passed' && value.autonomous?.tool_count === 73, 'autonomous parity missing');
112
112
  assert(value.rollback?.state === 'completed' && value.restore?.state === 'completed', 'rollback/restore not completed');
113
- assert(value.predecessor_disarmed?.tool_count === 68 && value.successor_disarmed?.tool_count === 68, 'disarmed public gate missing');
113
+ assert(value.predecessor_disarmed?.tool_count === 73 && value.successor_disarmed?.tool_count === 73, 'disarmed public gate missing');
114
114
  for (const key of ['tree_read','precondition_mutation','search','owned_process','observation','coding_loop','autonomy','interrupted_recovery','evidence_verification']) {
115
115
  assert(value.requirements?.[key] === true, `parity requirement not proven: ${key}`);
116
116
  }
@@ -123,15 +123,15 @@ export async function runReleaseParity(activationReceiptPath) {
123
123
  assert(pointer.manifest_sha256 === candidateManifest, 'active release is not the canonical candidate');
124
124
  const url = await publicUrl();
125
125
  const publicFullScript = path.join(root, 'src', 'remote-mcp-smoke-client.mjs');
126
- const machineScript = path.join(root, 'src', 'remote-mcp-r33-parity-client.mjs');
126
+ const machineScript = path.join(root, 'src', 'remote-mcp-r34-parity-client.mjs');
127
127
  const autonomousScript = path.join(root, 'src', 'remote-mcp-autonomous-smoke-client.mjs'); let publicFull,machineControl,autonomous,publicGatesPassed=false;
128
128
  try {
129
129
  publicFull = parseJsonOutput((await run(process.execPath, [publicFullScript, url, 'full'], { timeoutMs:180000 })).stdout, 'public full gate');
130
- machineControl = parseJsonOutput((await run(process.execPath, [machineScript, url], { timeoutMs:600000 })).stdout, 'R33 machine parity');
131
- autonomous = parseJsonOutput((await run(process.execPath, [autonomousScript, url], { timeoutMs:900000 })).stdout, 'R33 autonomous parity');
132
- assert(publicFull.status === 'passed' && publicFull.tools?.length === 68, 'public full gate did not expose exact 68');
133
- assert(machineControl.status === 'passed' && machineControl.tool_count === 68, 'machine-control parity failed');
134
- assert(autonomous.status === 'passed' && autonomous.tool_count === 68, 'autonomous parity failed');
130
+ machineControl = parseJsonOutput((await run(process.execPath, [machineScript, url], { timeoutMs:600000 })).stdout, 'R34 machine parity');
131
+ autonomous = parseJsonOutput((await run(process.execPath, [autonomousScript, url], { timeoutMs:900000 })).stdout, 'R34 autonomous parity');
132
+ assert(publicFull.status === 'passed' && publicFull.tools?.length === 73, 'public full gate did not expose exact 73');
133
+ assert(machineControl.status === 'passed' && machineControl.tool_count === 73, 'machine-control parity failed');
134
+ assert(autonomous.status === 'passed' && autonomous.tool_count === 73, 'autonomous parity failed');
135
135
  publicGatesPassed=true;
136
136
  } finally {
137
137
  let restoreError=null;
@@ -152,7 +152,7 @@ export async function runReleaseParity(activationReceiptPath) {
152
152
  assert(finalPointer.manifest_sha256 === candidateManifest, 'restore did not return canonical candidate');
153
153
 
154
154
  const evidence = {
155
- schema:'deadbyte.r33-parity.v1', status:'passed', completed_at_utc:new Date().toISOString(),
155
+ schema:'deadbyte.r35-parity.v1', status:'passed', completed_at_utc:new Date().toISOString(),
156
156
  release_id:finalPointer.release_id, manifest_sha256:candidateManifest,
157
157
  execution_provider:'deadbyte_mcp', rdc_operation_count:0,
158
158
  public_full:publicFull, machine_control:machineControl, autonomous,
@@ -175,7 +175,7 @@ export async function runReleaseParity(activationReceiptPath) {
175
175
  validateParityEvidence(evidence);
176
176
  const evidenceDir = path.join(stateRoot, 'evidence', 'release');
177
177
  await mkdir(evidenceDir, { recursive:true });
178
- const evidencePath = path.join(evidenceDir, `r33-parity-${candidateManifest.slice(0,16)}.json`);
178
+ const evidencePath = path.join(evidenceDir, `r35-parity-${candidateManifest.slice(0,16)}.json`);
179
179
  const bytes = Buffer.from(`${JSON.stringify(evidence, null, 2)}\n`, 'utf8');
180
180
  await writeFile(evidencePath, bytes);
181
181
  return { evidence, evidence_path:evidencePath, evidence_sha256:sha256(bytes) };
@@ -0,0 +1,73 @@
1
+ param(
2
+ [Parameter(Mandatory=$true)][string]$ConfigPath,
3
+ [Parameter(Mandatory=$true)][ValidatePattern('^[0-9a-fA-F]{64}$')][string]$ConfigSha256,
4
+ [string[]]$RequiredIds=@('pyright','rust-analyzer','clangd'),
5
+ [string]$OutputPath=''
6
+ )
7
+ $ErrorActionPreference='Stop'
8
+ function Hash-Lower([string]$Path){
9
+ if(-not (Test-Path -LiteralPath $Path -PathType Leaf)){ throw "missing file: $Path" }
10
+ return (Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()
11
+ }
12
+ $configFull=[IO.Path]::GetFullPath($ConfigPath)
13
+ $expected=$ConfigSha256.ToLowerInvariant()
14
+ $observed=Hash-Lower $configFull
15
+ if($observed -ne $expected){ throw "semantic config SHA-256 mismatch: expected $expected found $observed" }
16
+ $config=Get-Content -LiteralPath $configFull -Raw -Encoding UTF8 | ConvertFrom-Json
17
+ if([string]$config.schema -ne 'deadbyte.semantic-lsp-config.v1'){ throw 'semantic config schema mismatch' }
18
+ $servers=@($config.servers)
19
+ $seen=@{}
20
+ $records=@()
21
+ foreach($server in $servers){
22
+ $id=[string]$server.id
23
+ if([string]::IsNullOrWhiteSpace($id)){ throw 'semantic server id missing' }
24
+ if($seen.ContainsKey($id)){ throw "duplicate semantic server id: $id" }
25
+ $seen[$id]=$true
26
+ $exe=[string]$server.executable_path
27
+ $exeExpected=([string]$server.executable_sha256).ToLowerInvariant()
28
+ if($exeExpected -notmatch '^[0-9a-f]{64}$'){ throw "semantic executable SHA invalid for $id" }
29
+ $exeObserved=Hash-Lower $exe
30
+ if($exeObserved -ne $exeExpected){ throw "semantic executable SHA-256 mismatch for ${id}: expected $exeExpected found $exeObserved" }
31
+ $deps=@()
32
+ foreach($dep in @($server.dependencies)){
33
+ $depPath=[string]$dep.path
34
+ $depExpected=([string]$dep.expected_sha256).ToLowerInvariant()
35
+ if($depExpected -notmatch '^[0-9a-f]{64}$'){ throw "semantic dependency SHA invalid for $id" }
36
+ $depObserved=Hash-Lower $depPath
37
+ if($depObserved -ne $depExpected){ throw "semantic dependency SHA-256 mismatch for ${id}: expected $depExpected found $depObserved" }
38
+ $deps += [ordered]@{path=$depPath;sha256=$depObserved}
39
+ }
40
+ $settle=0
41
+ if($null -ne $server.startup_settle_ms){ $settle=[int]$server.startup_settle_ms }
42
+ $records += [ordered]@{
43
+ id=$id
44
+ language_id=[string]$server.language_id
45
+ required=[bool]$server.required
46
+ executable_path=$exe
47
+ executable_sha256=$exeObserved
48
+ dependencies=$deps
49
+ startup_settle_ms=$settle
50
+ status='pinned'
51
+ }
52
+ }
53
+ foreach($required in $RequiredIds){
54
+ if(-not $seen.ContainsKey($required)){ throw "missing required semantic server: $required" }
55
+ }
56
+ $payload=[ordered]@{
57
+ schema='deadbyte.r35-semantic-preflight.v1'
58
+ status='passed'
59
+ config_path=$configFull
60
+ config_sha256=$observed
61
+ builtin=@([ordered]@{id='typescript';language_id='typescript';status='builtin';required=$true})
62
+ required_ids=@('typescript') + @($RequiredIds)
63
+ servers=$records
64
+ }
65
+ $json=$payload | ConvertTo-Json -Depth 12
66
+ if($OutputPath){
67
+ $out=[IO.Path]::GetFullPath($OutputPath)
68
+ $dir=Split-Path -Parent $out
69
+ if($dir -and -not(Test-Path -LiteralPath $dir)){ New-Item -ItemType Directory -Force -Path $dir | Out-Null }
70
+ [IO.File]::WriteAllText($out,$json,[Text.UTF8Encoding]::new($false))
71
+ }
72
+ Write-Output $json
73
+ Write-Host ("R35_SEMANTIC_PREFLIGHT_PASS config={0} required={1}" -f $observed,(@('typescript')+@($RequiredIds) -join ','))