@llblab/pi-kit 0.38.4 → 0.39.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 (424) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +1 -1
  3. package/node_modules/@llblab/pi-actors/AGENTS.md +108 -20
  4. package/node_modules/@llblab/pi-actors/BACKLOG.md +207 -4
  5. package/node_modules/@llblab/pi-actors/CHANGELOG.md +13 -0
  6. package/node_modules/@llblab/pi-actors/README.md +31 -1
  7. package/node_modules/@llblab/pi-actors/dist/index.js +1 -1
  8. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.d.ts +37 -0
  9. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.js +131 -62
  10. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.d.ts +2 -0
  11. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.js +3 -2
  12. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.d.ts +37 -0
  13. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.js +263 -129
  14. package/node_modules/@llblab/pi-actors/dist/lib/execution-files.d.ts +32 -0
  15. package/node_modules/@llblab/pi-actors/dist/lib/execution-files.js +128 -0
  16. package/node_modules/@llblab/pi-actors/dist/lib/execution-output.js +5 -4
  17. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.d.ts +19 -1
  18. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.js +62 -26
  19. package/node_modules/@llblab/pi-actors/dist/lib/execution.d.ts +4 -1
  20. package/node_modules/@llblab/pi-actors/dist/lib/execution.js +6 -1
  21. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.d.ts +9 -2
  22. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.js +92 -14
  23. package/node_modules/@llblab/pi-actors/dist/lib/file-state.js +21 -2
  24. package/node_modules/@llblab/pi-actors/dist/lib/inspector-command.js +2 -2
  25. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.d.ts +25 -7
  26. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.js +562 -262
  27. package/node_modules/@llblab/pi-actors/dist/lib/inspector.d.ts +20 -10
  28. package/node_modules/@llblab/pi-actors/dist/lib/inspector.js +80 -91
  29. package/node_modules/@llblab/pi-actors/dist/lib/limits.d.ts +1 -0
  30. package/node_modules/@llblab/pi-actors/dist/lib/limits.js +1 -0
  31. package/node_modules/@llblab/pi-actors/dist/lib/observability.d.ts +15 -1
  32. package/node_modules/@llblab/pi-actors/dist/lib/observability.js +216 -99
  33. package/node_modules/@llblab/pi-actors/dist/lib/pi.d.ts +5 -4
  34. package/node_modules/@llblab/pi-actors/dist/lib/pi.js +64 -10
  35. package/node_modules/@llblab/pi-actors/dist/lib/recipe-projection.d.ts +18 -0
  36. package/node_modules/@llblab/pi-actors/dist/lib/recipe-projection.js +220 -0
  37. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.d.ts +2 -0
  38. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.js +30 -6
  39. package/node_modules/@llblab/pi-actors/dist/lib/registry.js +270 -36
  40. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.d.ts +213 -5
  41. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.js +1909 -40
  42. package/node_modules/@llblab/pi-actors/dist/lib/run-supervision.d.ts +107 -0
  43. package/node_modules/@llblab/pi-actors/dist/lib/run-supervision.js +412 -0
  44. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.d.ts +9 -2
  45. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.js +283 -60
  46. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.d.ts +26 -1
  47. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.js +68 -2
  48. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-exports.d.ts +451 -0
  49. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-exports.js +2315 -0
  50. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-index.d.ts +97 -0
  51. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-index.js +368 -0
  52. package/node_modules/@llblab/pi-actors/dist/lib/runs-control-delivery.js +46 -7
  53. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.d.ts +78 -2
  54. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.js +334 -2
  55. package/node_modules/@llblab/pi-actors/dist/lib/runs-controls.js +4 -1
  56. package/node_modules/@llblab/pi-actors/dist/lib/runs-descendant-launches.d.ts +80 -0
  57. package/node_modules/@llblab/pi-actors/dist/lib/runs-descendant-launches.js +287 -0
  58. package/node_modules/@llblab/pi-actors/dist/lib/runs-execution-evidence.d.ts +110 -0
  59. package/node_modules/@llblab/pi-actors/dist/lib/runs-execution-evidence.js +282 -0
  60. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.d.ts +66 -1
  61. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.js +349 -13
  62. package/node_modules/@llblab/pi-actors/dist/lib/runs-native-launches.d.ts +73 -0
  63. package/node_modules/@llblab/pi-actors/dist/lib/runs-native-launches.js +227 -0
  64. package/node_modules/@llblab/pi-actors/dist/lib/runs-outcomes.d.ts +141 -0
  65. package/node_modules/@llblab/pi-actors/dist/lib/runs-outcomes.js +292 -0
  66. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.d.ts +10 -1
  67. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.js +36 -4
  68. package/node_modules/@llblab/pi-actors/dist/lib/runs-process-windows-mi.d.ts +46 -0
  69. package/node_modules/@llblab/pi-actors/dist/lib/runs-process-windows-mi.js +114 -0
  70. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.d.ts +34 -1
  71. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.js +158 -26
  72. package/node_modules/@llblab/pi-actors/dist/lib/runs-results.d.ts +116 -0
  73. package/node_modules/@llblab/pi-actors/dist/lib/runs-results.js +518 -0
  74. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.d.ts +15 -2
  75. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.js +148 -9
  76. package/node_modules/@llblab/pi-actors/dist/lib/runs-session-exports.d.ts +95 -0
  77. package/node_modules/@llblab/pi-actors/dist/lib/runs-session-exports.js +470 -0
  78. package/node_modules/@llblab/pi-actors/dist/lib/runs-snapshot.d.ts +58 -0
  79. package/node_modules/@llblab/pi-actors/dist/lib/runs-snapshot.js +92 -0
  80. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.d.ts +2 -0
  81. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.js +44 -3
  82. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.d.ts +15 -1
  83. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.js +337 -13
  84. package/node_modules/@llblab/pi-actors/dist/lib/runs-supervision.d.ts +105 -0
  85. package/node_modules/@llblab/pi-actors/dist/lib/runs-supervision.js +501 -0
  86. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.d.ts +1 -0
  87. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.js +14 -3
  88. package/node_modules/@llblab/pi-actors/dist/lib/runtime.js +22 -3
  89. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.d.ts +37 -0
  90. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.js +59 -3
  91. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.d.ts +4 -1
  92. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.js +14 -8
  93. package/node_modules/@llblab/pi-actors/dist/lib/temp.d.ts +2 -4
  94. package/node_modules/@llblab/pi-actors/dist/lib/temp.js +4 -56
  95. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.d.ts +3 -0
  96. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.js +13 -0
  97. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.d.ts +1 -0
  98. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.js +110 -43
  99. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.d.ts +3 -0
  100. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.js +18 -6
  101. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.d.ts +4 -1
  102. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.js +126 -31
  103. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.d.ts +31 -3
  104. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.js +311 -47
  105. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.d.ts +3 -0
  106. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.js +29 -7
  107. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.d.ts +20 -0
  108. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.js +192 -43
  109. package/node_modules/@llblab/pi-actors/dist/scripts/async-runner.mjs +272 -194
  110. package/node_modules/@llblab/pi-actors/dist/scripts/conformance.mjs +14 -2
  111. package/node_modules/@llblab/pi-actors/dist/skills/actors/SKILL.md +46 -2
  112. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/diagnostics.md +40 -0
  113. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/runs.md +55 -1
  114. package/node_modules/@llblab/pi-actors/docs/README.md +9 -1
  115. package/node_modules/@llblab/pi-actors/docs/actor-inspector.md +84 -15
  116. package/node_modules/@llblab/pi-actors/docs/agent-experience.md +216 -0
  117. package/node_modules/@llblab/pi-actors/docs/async-runs.md +18 -2
  118. package/node_modules/@llblab/pi-actors/docs/composition-transport.md +103 -0
  119. package/node_modules/@llblab/pi-actors/docs/coordinator-delivery.md +204 -4
  120. package/node_modules/@llblab/pi-actors/docs/inspection.md +38 -2
  121. package/node_modules/@llblab/pi-actors/docs/output-projection-map.md +130 -0
  122. package/node_modules/@llblab/pi-actors/docs/releasing.md +19 -2
  123. package/node_modules/@llblab/pi-actors/docs/run-supervision.md +1622 -0
  124. package/node_modules/@llblab/pi-actors/docs/template-recipes.md +4 -0
  125. package/node_modules/@llblab/pi-actors/docs/windows-process-observation.md +248 -0
  126. package/node_modules/@llblab/pi-actors/index.ts +1 -1
  127. package/node_modules/@llblab/pi-actors/lib/async-runs.ts +164 -73
  128. package/node_modules/@llblab/pi-actors/lib/automatic-review-runtime.ts +4 -2
  129. package/node_modules/@llblab/pi-actors/lib/command-templates.ts +287 -138
  130. package/node_modules/@llblab/pi-actors/lib/execution-files.ts +118 -0
  131. package/node_modules/@llblab/pi-actors/lib/execution-output.ts +4 -4
  132. package/node_modules/@llblab/pi-actors/lib/execution-sessions.ts +57 -27
  133. package/node_modules/@llblab/pi-actors/lib/execution.ts +8 -0
  134. package/node_modules/@llblab/pi-actors/lib/extension-runtime.ts +102 -12
  135. package/node_modules/@llblab/pi-actors/lib/file-state.ts +16 -2
  136. package/node_modules/@llblab/pi-actors/lib/inspector-command.ts +2 -2
  137. package/node_modules/@llblab/pi-actors/lib/inspector-overlay.ts +524 -261
  138. package/node_modules/@llblab/pi-actors/lib/inspector.ts +101 -130
  139. package/node_modules/@llblab/pi-actors/lib/limits.ts +1 -0
  140. package/node_modules/@llblab/pi-actors/lib/observability.ts +235 -116
  141. package/node_modules/@llblab/pi-actors/lib/pi.ts +59 -11
  142. package/node_modules/@llblab/pi-actors/lib/recipe-projection.ts +232 -0
  143. package/node_modules/@llblab/pi-actors/lib/recipes-context.ts +27 -6
  144. package/node_modules/@llblab/pi-actors/lib/registry.ts +266 -36
  145. package/node_modules/@llblab/pi-actors/lib/run-delivery.ts +1737 -49
  146. package/node_modules/@llblab/pi-actors/lib/run-supervision.ts +411 -0
  147. package/node_modules/@llblab/pi-actors/lib/run-ui-runtime.ts +237 -73
  148. package/node_modules/@llblab/pi-actors/lib/runs-artifacts.ts +73 -1
  149. package/node_modules/@llblab/pi-actors/lib/runs-context-exports.ts +1871 -0
  150. package/node_modules/@llblab/pi-actors/lib/runs-context-index.ts +372 -0
  151. package/node_modules/@llblab/pi-actors/lib/runs-control-delivery.ts +36 -18
  152. package/node_modules/@llblab/pi-actors/lib/runs-control.ts +297 -1
  153. package/node_modules/@llblab/pi-actors/lib/runs-controls.ts +3 -1
  154. package/node_modules/@llblab/pi-actors/lib/runs-descendant-launches.ts +338 -0
  155. package/node_modules/@llblab/pi-actors/lib/runs-execution-evidence.ts +302 -0
  156. package/node_modules/@llblab/pi-actors/lib/runs-index.ts +345 -17
  157. package/node_modules/@llblab/pi-actors/lib/runs-native-launches.ts +270 -0
  158. package/node_modules/@llblab/pi-actors/lib/runs-outcomes.ts +377 -0
  159. package/node_modules/@llblab/pi-actors/lib/runs-ownership.ts +37 -4
  160. package/node_modules/@llblab/pi-actors/lib/runs-process-windows-mi.ts +113 -0
  161. package/node_modules/@llblab/pi-actors/lib/runs-process.ts +210 -34
  162. package/node_modules/@llblab/pi-actors/lib/runs-results.ts +601 -0
  163. package/node_modules/@llblab/pi-actors/lib/runs-retention.ts +134 -10
  164. package/node_modules/@llblab/pi-actors/lib/runs-session-exports.ts +406 -0
  165. package/node_modules/@llblab/pi-actors/lib/runs-snapshot.ts +143 -0
  166. package/node_modules/@llblab/pi-actors/lib/runs-start.ts +44 -2
  167. package/node_modules/@llblab/pi-actors/lib/runs-status.ts +252 -10
  168. package/node_modules/@llblab/pi-actors/lib/runs-supervision.ts +394 -0
  169. package/node_modules/@llblab/pi-actors/lib/runs-trace.ts +14 -3
  170. package/node_modules/@llblab/pi-actors/lib/runtime.ts +22 -3
  171. package/node_modules/@llblab/pi-actors/lib/session-evidence.ts +76 -4
  172. package/node_modules/@llblab/pi-actors/lib/state-readers.ts +16 -7
  173. package/node_modules/@llblab/pi-actors/lib/temp.ts +3 -56
  174. package/node_modules/@llblab/pi-actors/lib/tools-access.ts +13 -0
  175. package/node_modules/@llblab/pi-actors/lib/tools-inspect.ts +110 -51
  176. package/node_modules/@llblab/pi-actors/lib/tools-local.ts +37 -24
  177. package/node_modules/@llblab/pi-actors/lib/tools-message.ts +120 -37
  178. package/node_modules/@llblab/pi-actors/lib/tools-response.ts +273 -50
  179. package/node_modules/@llblab/pi-actors/lib/tools-spawn.ts +31 -10
  180. package/node_modules/@llblab/pi-actors/lib/trace-projection.ts +165 -42
  181. package/node_modules/@llblab/pi-actors/package.json +10 -6
  182. package/node_modules/@llblab/pi-actors/scripts/async-runner.mjs +272 -194
  183. package/node_modules/@llblab/pi-actors/scripts/conformance.mjs +14 -2
  184. package/node_modules/@llblab/pi-actors/skills/actors/SKILL.md +46 -2
  185. package/node_modules/@llblab/pi-actors/skills/actors/references/diagnostics.md +40 -0
  186. package/node_modules/@llblab/pi-actors/skills/actors/references/runs.md +55 -1
  187. package/node_modules/yaml/LICENSE +13 -0
  188. package/node_modules/yaml/README.md +172 -0
  189. package/node_modules/yaml/bin.mjs +11 -0
  190. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  191. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  192. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  193. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  194. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  195. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  196. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  197. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  198. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  199. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  200. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  201. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  202. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  203. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  204. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  205. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  206. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  207. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  208. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  209. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  210. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  211. package/node_modules/yaml/browser/dist/errors.js +57 -0
  212. package/node_modules/yaml/browser/dist/index.js +17 -0
  213. package/node_modules/yaml/browser/dist/log.js +11 -0
  214. package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  215. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  216. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  217. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  218. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  219. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  220. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  221. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  222. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  223. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  224. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  225. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  226. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  227. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  228. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  229. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  230. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  231. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  232. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  233. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  234. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  235. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  236. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  237. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  238. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  239. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  240. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  241. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  242. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  243. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  244. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  245. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  246. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  247. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  248. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  249. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  250. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  251. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  252. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  253. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  254. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  255. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  256. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  257. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  258. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  259. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  260. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  261. package/node_modules/yaml/browser/dist/util.js +11 -0
  262. package/node_modules/yaml/browser/dist/visit.js +233 -0
  263. package/node_modules/yaml/browser/index.js +5 -0
  264. package/node_modules/yaml/browser/package.json +3 -0
  265. package/node_modules/yaml/dist/cli.d.ts +8 -0
  266. package/node_modules/yaml/dist/cli.mjs +201 -0
  267. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  268. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  269. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  270. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  271. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  272. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  273. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  274. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  275. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  276. package/node_modules/yaml/dist/compose/composer.js +224 -0
  277. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  278. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  279. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  280. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  281. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  282. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  283. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  284. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  285. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  286. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  287. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  288. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  289. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  290. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  291. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  292. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  293. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  294. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  295. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  296. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  297. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  298. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  299. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  300. package/node_modules/yaml/dist/doc/Document.js +337 -0
  301. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  302. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  303. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  304. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  305. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  306. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  307. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  308. package/node_modules/yaml/dist/doc/directives.js +178 -0
  309. package/node_modules/yaml/dist/errors.d.ts +21 -0
  310. package/node_modules/yaml/dist/errors.js +62 -0
  311. package/node_modules/yaml/dist/index.d.ts +25 -0
  312. package/node_modules/yaml/dist/index.js +50 -0
  313. package/node_modules/yaml/dist/log.d.ts +3 -0
  314. package/node_modules/yaml/dist/log.js +19 -0
  315. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  316. package/node_modules/yaml/dist/nodes/Alias.js +118 -0
  317. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  318. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  319. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  320. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  321. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  322. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  323. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  324. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  325. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  326. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  327. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  328. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  329. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  330. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  331. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  332. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  333. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  334. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  335. package/node_modules/yaml/dist/options.d.ts +350 -0
  336. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  337. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  338. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  339. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  340. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  341. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  342. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  343. package/node_modules/yaml/dist/parse/cst.js +112 -0
  344. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  345. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  346. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  347. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  348. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  349. package/node_modules/yaml/dist/parse/parser.js +980 -0
  350. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  351. package/node_modules/yaml/dist/public-api.js +107 -0
  352. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  353. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  354. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  355. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  356. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  357. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  358. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  359. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  360. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  361. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  362. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  363. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  364. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  365. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  366. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  367. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  368. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  369. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  370. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  371. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  372. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  373. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  374. package/node_modules/yaml/dist/schema/tags.js +99 -0
  375. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  376. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  377. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  378. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  379. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  380. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  381. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  382. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  383. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  384. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  385. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  386. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  387. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  388. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  389. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  390. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  391. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  392. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  393. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  394. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  395. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  396. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  397. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  398. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  399. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  400. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  401. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  402. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  403. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  404. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  405. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  406. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  407. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  408. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  409. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  410. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  411. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  412. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  413. package/node_modules/yaml/dist/test-events.js +134 -0
  414. package/node_modules/yaml/dist/util.d.ts +16 -0
  415. package/node_modules/yaml/dist/util.js +28 -0
  416. package/node_modules/yaml/dist/visit.d.ts +102 -0
  417. package/node_modules/yaml/dist/visit.js +236 -0
  418. package/node_modules/yaml/package.json +97 -0
  419. package/node_modules/yaml/util.js +2 -0
  420. package/package.json +2 -2
  421. package/node_modules/@llblab/pi-actors/banner.jpg +0 -0
  422. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.d.ts +0 -16
  423. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.js +0 -57
  424. package/node_modules/@llblab/pi-actors/lib/inspector-actions.ts +0 -79
@@ -37,6 +37,8 @@ JSON is the most direct form for structured composition:
37
37
  }
38
38
  ```
39
39
 
40
+ For shell-free Windows child Pi execution, use the Node executable followed immediately by the current Pi SDK's resolved `dist/bundle/cli.js` (or unbundled `dist/cli.js`) as its first argument. This exact SDK CLI form retains managed session placement, prompt materialization, Recipe context and text-print response selection; JSON/RPC/interactive streams remain withheld. An arbitrary script named `cli.js` is not recognized, and `.cmd` wrappers are not implicitly executed through a shell.
41
+
40
42
  ### Markdown
41
43
 
42
44
  Markdown uses YAML frontmatter for the Recipe contract and one executable fence for `template`:
@@ -77,6 +79,8 @@ A Recipe file must not declare top-level `name`. Within a command-template graph
77
79
 
78
80
  The following fields belong to the file-level Recipe contract. Unless noted otherwise, each field is optional.
79
81
 
82
+ Planned, not implemented: additional root Run policy fields are specified in [Run supervision and self-contained outcomes](./run-supervision.md#exact-launch-api). They are not supported fields in the current table below.
83
+
80
84
  | Field | Type | Default | Contract |
81
85
  | --- | --- | --- | --- |
82
86
  | `description` | string | none | Human-facing purpose used by discovery and tool surfaces. Describe the outcome, not implementation history. |
@@ -0,0 +1,248 @@
1
+ # Windows Process Observation Recovery
2
+
3
+ Status: User-approved architectural preparation; default native adoption remains gated. The corrected UTF-8 transport passed the actual Windows two-child/long-Unicode differential, including all five live/post-close cases and final fresh ESRCH. Earlier source-bound diagnostics localized a refusal to live scalar long (`S=N!=B`); its exact historical codec/content transformation remains unknown. The private raw-wire codec is now implemented and independently reviewed, with mirrored properties and normal build/invariant/process-owner integration; it is not imported by production readers. The subordinate-adapter preparation contract below has independent identity/fallback and artifact-handoff review, with an explicit raw-null exclusion closing the identified profile-admission gap. This is not an adopted binary-distribution or default-activation decision. Broader profiles and full-load convergence remain unproved. PowerShell remains the production backend. Its scalar/shared stdout codec and the independent full-instance reference now have a UTF-8 alignment correction accepted by the actual two-child Windows differential; packaged native assets, full-SDK fixture interception and default native selection remain unchanged. The existing [invocation-local identity contract](coordinator-delivery.md#invocation-local-windows-identity-observation) remains the production contract until a separately reviewed change supersedes a specific clause.
4
+
5
+ ## Problem and non-goals
6
+
7
+ The current Windows reader starts PowerShell for each independently fresh scalar acquisition and each bounded shared acquisition. Both commands now project only consumed properties, but native convergence remains unproved. CI [41915780299](https://github.com/llblab/pi-actors/actions/runs/41915780299) finished with eight successful checks, Windows installed failure and macOS installed cancellation for hosted-runner capacity. Windows installed failed both packed genuine research and source public-spawn acceptance; public packed execution was not reached.
8
+
9
+ The original failed public settlement bracket contains one synchronous shared call of 4511.520 ms in a roughly 8294.288 ms driver-local bracket. This establishes substantial blocking cost, not the cause of the entire policy gap or the original runner's state. Numeric PID presence, a later final-precommit snapshot and cross-process duration sums cannot establish original-runner survival or exit. The separate research reader retains its existing 20000 ms parent timeout; the captured SIGTERM does not identify its last operation.
10
+
11
+ The later unchanged-production candidate `16a3417` completed [normal validation 42018306856](https://github.com/llblab/pi-actors/actions/runs/42018306856) with nine successful checks and Windows installed failure. Source-and-packed private research passed this time; source public-spawn failed in the first `overflow` cohort, and public packed execution was not reached. The original slightly wider 9773.292 ms driver bracket recorded one shared call of 5651.349 ms; original-runner exit remained unproven. This is still a PowerShell-path failure, not a native-adapter result or evidence that query cost explains the entire gap. The isolated MI pass does not relabel it.
12
+
13
+ The goal is cheaper fresh observation with unchanged evidence strength, not a cache, longer deadline, new supervision system or a diagnostic subsystem for its own sake. Product correctness, observation quality and speed are separate gates.
14
+
15
+ ### Bounded original-runner diagnostic
16
+
17
+ The public SDK fixture now has a temporary observer, with failure-only output, for the first `overflow` Run in each layout driver. It reserves one constructor candidate through public `node:diagnostics_channel`, matches executable/full public arguments/state directory/PID at successful `spawn`, and retains that original object's `close` callback facts. Private receipt binding follows the unchanged durable capture and requires the exact frame object and immutable signature. An unrelated first candidate makes the diagnostic unavailable; there is no replacement search, spawn interception, product hook, extra query, timer or wait.
18
+
19
+ Optional `failure_evidence.original_runner` freezes original callback facts at settlement catch entry, captures available public runtime fields before callback revocation, attempts owned teardown, then projects frozen observations with post-attempt teardown uncertainty. The catch-only `runtime_terminal_fields` category reads `exitCode` and `signalCode` at most once each from the same retained original object: safe-integer/null yields `exit_code_set`, null/recognized builtin OS signal yields `signal_code_set`, and null/null yields `null_pair`. Invalid, read-faulted, unbound, uncovered, released or changed-capture observations yield `unavailable`; no raw code, signal or private cause is projected. Getter/catch-clock reentrancy can invalidate this new category but cannot replace frozen entry callback facts.
20
+
21
+ A terminal runtime-field category establishes only that Node reflected original-runner termination by the read sequence; it does not date the exit or prove OS absence, identity or scope closure. `null_pair` cannot distinguish continued runner activity from delayed exit dispatch. `close_not_observed` means callback not observed, never “alive”; unavailable binding or listener coverage admits no close timestamp. A valid `sampled_ms` is only the same-driver catch sample, not admitted close evidence. Positive close-before-catch does not establish settlement-deadline compliance, exact kernel-exit timing, descendant closure, absence or cleanup authority. Failed removal may leave an inert callback and remains unconfirmed.
22
+
23
+ Source, pure-property and independent implementation review cover this diagnostic; actual source/packed SDK and Windows convergence remain separate gates. It changes neither the shipping PowerShell reader nor the ESRCH, original-close, workload, watchdog or fresh-absence cleanup requirements. Retain uncertain roots; do not add manual probes or cleanup to improve diagnostic yield.
24
+
25
+ ### Direct SDK-settlement remediation priority
26
+
27
+ The earlier CI-remediation track addressed the existing Windows runner lifecycle, independently of the proposed native adapter. Candidate `1486176` finished [Validate 42397743169](https://github.com/llblab/pi-actors/actions/runs/42397743169) with eight of nine product shards and audit passing; Windows installed failed at SOURCE first-overflow settlement for captured PID 1656/generation `bea51279-f4bc-431f-b70d-e1e25b00d5d3`. The matched original object's close callback was absent, saved natural0/execution-done0 did not establish exit, and the unchanged eight-second absence policy ended unproven. The wider driver bracket's one 5025.8459 ms shared acquisition is advisory cost, not proof of the cause or complete critical path. Native `S=N!=B` evidence does not repair this lifecycle refusal.
28
+
29
+ Candidate `59b9d29` again finished [Validate 42413622977](https://github.com/llblab/pi-actors/actions/runs/42413622977) with eight of nine product shards and audit passing; Windows installed failed in SOURCE before the public SDK group's PACKED phase. The matched original object yielded `runtime_terminal_fields: null_pair`, no observed close and no observation faults. This leaves runner activity versus delayed exit dispatch unresolved; saved natural0/execution-done0 does not prove exit or readiness before settlement. The fixture releases the workload gate and immediately calls settlement, reading the ordinary outcome only after success; its failure outcome is collected after catch. Complete logs and checkout/tree provenance remain retained investigation evidence, not a causal repair.
30
+
31
+ Control-flow inspection establishes that the exact original runner uses file-backed stdout/stderr, not parent-owned pipes; a generic parent-pipe drain correction is unsupported. `scripts/async-runner.mjs` prefers existing `dist/lib` runtime owners even in the SOURCE-layout journey, so any later production correction must bind both authoritative TypeScript and the selected compiled owner. Post-result Trace/lifecycle-release work and delayed driver dispatch remain hypotheses, not demonstrated causes.
32
+
33
+ On the selected source/dist path, execution and final native revalidation precede the sole canonical result commit; terminal Trace append and lifecycle release can follow it. There is no early canonical-result writer on that path. Possible postcommit waiting is not an incident-proven cause.
34
+
35
+ An actual-caller/settlement-helper controlled-port counterexample demonstrates that work still pending at the old eight-second limit can fail settlement and produce a later natural0 diagnostic. It proves source ordering, not the historical Windows cause or actual latency.
36
+
37
+ The source-reviewed, operator-admitted fixture correction now releases the gate, awaits strictly correlated canonical work readiness for the original captured owner/Run/generation and physical metadata/result frame, then starts a five-second fresh-ESRCH policy. Readiness uses only the remainder of the existing whole-layout SDK watchdog (900 s Windows/300 s elsewhere), never a new per-Run allowance or watchdog reset. This explicitly moves the physical deadline and reduces the former eight-second duration; it is not an unchanged deadline. Missing result is pending, not absence; malformed, unsupported, changed or wrong-generation sources cannot establish readiness. Result/readiness is never exit or deletion authority. Keep outcome validation and failure-mode mutations after settlement, independent ten-second original-close acceptance, final-crossing fresh probes, exact failure ordering, body-failure cleanup and uncertain-root retention. Nineteen focused actual-owner properties and independent review cover the corrected source flow, including the real 1800-artifact declaration shape. Canonical metadata uses the existing 1 MiB input allowance independently of the unchanged 64 KiB result bound; complete reads and physical/generation fences remain required. The focused properties alone are controlled source proof. Candidate `a8cf20b` subsequently passed the complete public SOURCE/PACKED SDK boundary test on actual Windows in [Validate 42423556508](https://github.com/llblab/pi-actors/actions/runs/42423556508): both layouts, 87 genuine Runs each, all nine modes and both 40-member cohorts, with unchanged outcome/fresh-cleanup assertions (572731.9673 ms). Its own checkout log binds merge `96852adbdfe0a7ba12026eb5e57b6fb4a6ab4047` to the reviewed tree. This accepts the prospective fixture correction under the admitted policy, not a reconstruction of the old Windows cause. The installed shard still failed a separate private coordinator/research final fresh-PID gate; the complete matrix and native compatibility remain unaccepted. The bounded ownership inquiry found the producer/reader work awaited and no demonstrated omission to repair. The final positive probe correctly retained state; the surfaced PID has no proven role, original generation or reuse explanation. A generation-aware replacement for the strict final bare-PID rule requires explicit admission and reviewed positive termination/resource proof, not a close flag or an assumed mismatch. No luck rerun.
38
+
39
+ Direct diagnosis must separate continued runner execution, pending stdio/handle closure and delayed driver callback dispatch where original-object/control-flow evidence permits; missing facts must remain unavailable. No distinction alone replaces original identity, fresh ESRCH, original-close acceptance or scope/resource cleanup proof. Preserve the exact command, workload/cohorts and timing policies except the explicitly admitted completion-boundary phase/duration correction; prefer a causally supported local correction over new instrumentation, and require a concrete decision-relevant falsifier before adding observation. T instrumentation and native backend adoption remain deferred under their separate gates. CI green must be observed on the actual reviewed candidate; no failing required PR check may be hidden or relabeled.
40
+
41
+ ### Current native Unicode transport correction
42
+
43
+ Candidate `a431515` passed all nine product shards plus audit in [Validate 42431142343](https://github.com/llblab/pi-actors/actions/runs/42431142343). The unchanged private cleanup passed on this attempt; that is non-reproduction, not a causal explanation of the earlier positive-PID refusal or admission of generation-aware cleanup. The strict final fresh-ESRCH rule remains unchanged. The only remaining red check was [native experiment 42431142320](https://github.com/llblab/pi-actors/actions/runs/42431142320), whose own checkout `be241f1edf66db058ea5aec83844f520ecf8aa44` again reported `S=N!=B` for live scalar long.
44
+
45
+ Source inspection found a concrete producer/consumer mismatch: both shipping PowerShell queries and the independent full-instance reference left stdout encoding implicit while Node consumed UTF-8. The correction sets `[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false, $true);` before the unchanged JSON output pipeline. This explicitly selects BOM-free UTF-8 with encoder exceptions instead of replacement; it does not change JSON escaping, query selection, optional-field normalization, `.trim()`, comparison or digest algorithms. The full-instance query stays independent of the MI representation adapter. Its corrected transport intentionally differs from old B; neither historical byte identity nor optional T-observer noninterference is claimed.
46
+
47
+ Saved identities are not migrated, rehashed or accepted as lossy aliases. A newly accurate Unicode observation may differ from an older corrupted record: the existing live comparison must still return `owner_mismatch`, and unavailable acquisition remains `unsupported_proof`, never absence or deletion authority. ASCII values and the consumed identity schema remain unchanged.
48
+
49
+ Actual-owner pre-fix regressions failed and the corrected portable source/property and rebuilt-JavaScript checks pass. Candidate `5839065` passed [Windows native 42435117771](https://github.com/llblab/pi-actors/actions/runs/42435117771), own checkout `724c263bfaa624ff64280c9ed1d72f6fffe853f8`/tree `ff73bfeaa646575c0e02e0cbf8a0217b52945d95`: 13 properties including nine finite PowerShell encoder roundtrips, both ready original children and all five live/post-close observations. Every date/command/digest/verifier flag passed; two child closes, five native-helper closes, two full-instance closes and two synchronous current-reference terminations preceded final fresh ESRCH. This is positive acceptance for that tested profile, not arbitrary provider/UTC/architecture admission, full SDK convergence or default backend activation.
50
+
51
+ The same candidate's Windows installed job in [Validate 42435117795](https://github.com/llblab/pi-actors/actions/runs/42435117795) passed public SOURCE/PACKED174 again but failed the unchanged private post-research final fresh-PID guard (`3172` present). Its own checkout confirms the same committed tree. The role, original generation and reuse explanation remain unavailable; the prior ownership inquiry still applies and the final refusal correctly retains state. This is not evidence that UTF-8 caused the refusal or permission to weaken cleanup.
52
+
53
+ That job's two public SDK timing summaries also recorded zero calls because the existing observer recognized only the pre-correction PowerShell grammar. The source repair admits the exact optional strict BOM-free UTF-8 statement in those same anchored scalar/shared/full-instance commands, preserving the old grammar and all original-call/clock/privacy/cap behavior. Actual-builder RED-to-GREEN properties cover the blind spot and reject duplicate, non-strict/BOM or suffixed variants. Zero records were not proof of zero native IO; restoring observation neither establishes private-PID liveness nor fixes that separate gate. Independent review approved the narrow repair. Candidate `4461d0f` then passed all nine product shards plus audit in [Validate 42438289689](https://github.com/llblab/pi-actors/actions/runs/42438289689), as well as [native 42438289688](https://github.com/llblab/pi-actors/actions/runs/42438289688). The installed job's own checkout `43c7d56803f3c2914cd133ad3710aa380aeb582e` binds tree `7deafe2c2f7c5fb096df4620817475f7c0359474`; complete public SOURCE/PACKED174 passed in 578294.3167 ms. Its usable timing summaries recorded 1088/1084 calls, with no saturation or omitted records. This accepts restored command recognition on actual Windows; summed native duration still is not wall-critical-path time. The unchanged private cleanup also passed this attempt, which is non-reproduction, not a causal repair or permission to replace fresh ESRCH.
54
+
55
+ ## Selected architecture
56
+
57
+ Recommend a one-shot user-mode Windows helper using the documented native Management Infrastructure client API against local `root/cimv2`, `Win32_Process`, WMIDCOM. Each invocation owns one application/session/query operation, consumes complete results, releases native resources and exits naturally. It receives numeric PIDs and a fixed query profile only, never expected identities, Run metadata, paths, control instructions or cleanup authority.
58
+
59
+ ```text
60
+ Existing scalar/shared admission and original frame
61
+ -> internal fresh acquisition
62
+ -> one-shot native MI application/session/query
63
+ -> compatibility decoding
64
+ -> existing identity comparison and frame/callback fences
65
+ ```
66
+
67
+ This removes PowerShell initialization, not synchronous provider cost. MI result retrieval can still block. Neither speed nor deadline recovery follows from the API choice.
68
+
69
+ - `runs-process.ts` continues to own acquisition/decoding/native identity. The helper is a platform adapter, not another lifecycle facade.
70
+ - `runs-status.ts` retains original metadata/ownership/physical-frame admission and independent assembly/fallback/revalidation.
71
+ - `async-runs.ts`, `runs-results.ts` and Control retain their current authority boundaries and checks. No production hook, public backend selector or observation bridge is introduced in the first slice.
72
+ - Native observations never survive an invocation or cross a callback. No broker, daemon, retained PID map or asynchronous stale snapshot substitutes for a fresh read.
73
+ - A helper session/operation is query-resource ownership, not an original-child lifecycle capability.
74
+
75
+ ### Representation and failure contract
76
+
77
+ The existing consumed identity remains exactly:
78
+
79
+ ```text
80
+ start_time = decoded CreationDate string
81
+ command = `${string ExecutablePath or ""}\n${string CommandLine or ""}`.trim()
82
+ cwd = absent
83
+ ```
84
+
85
+ Do not reconstruct command lines, strengthen optional path visibility, canonicalize paths or silently rewrite historical fingerprints. Native FILETIME, DMTF, MI timestamps and the PowerShell JSON date are not interchangeable strings. The prototype must retain typed MI timestamp components privately and validate its candidate formatter against real reference values, including offset and precision. Unknown profiles are unsupported, not guessed. Unicode and optional/null/type handling must preserve the consumed JavaScript strings without normalizing or dropping UTF-16 code units.
86
+
87
+ Scalar and shared profiles remain distinct: only the shared result needs a returned native ProcessId for correlation. Query inputs remain unique positive safe integers, at most 64 for shared, with no DWORD truncation. Numeric-only textual query construction remains bounded at 4096 ASCII characters; complete output remains bounded at 1 MiB. Complete retrieval, duplicate/foreign-row rejection and borrowed-instance copying precede consumption. A missing row, denied access, malformed output or query failure is not native absence.
88
+
89
+ The prototype must distinguish transport, retrieval and operation outcomes, copy borrowed values before the next retrieval, drain to `moreResults=false`, close operation before session before application and release owned error data. A cleanup hang or leaked helper is a falsifier, not permission to force exit.
90
+
91
+ The next candidate's fallback contract is specified below, separately from current production behavior: no retry through an identity mismatch or replacement, no rebinding to later metadata and no fabricated absence. Existing PowerShell remains the baseline for unsupported optimized profiles; neither the inert experiment nor this design changes reader selection.
92
+
93
+ ## First implementation checkpoint: inert differential prototype
94
+
95
+ Implement only excluded test/prototype sources under `tests/fixtures/`, with no production imports, package assets or native default selection. The checkpoint owns a native MI source, one standalone harness and focused protocol/adapter properties in the existing installed-script owner where appropriate. It does not add skips or alter the fixed SDK journey.
96
+
97
+ 1. Launch one controlled child owned directly by the harness. Capture the original ChildProcess and its actual spawn/close receipts, require a genuine ready message, and retain its workload gate until observations finish. This uses ordinary owned-child fixture lifecycle, not a global spawn interception or cross-process clock carrier.
98
+ 2. Obtain a reference identity through the existing PowerShell reader and retain that reference in a fixture-owned on-disk frame. Exercise the historically consumed representation, not a native-formatted replacement presented as old data. The harness must verify any additional full-instance reference command against the actual old grammar rather than accidentally comparing the candidate to itself.
99
+ 3. Query the same original child through native MI. Compare decoded date and combined-command strings, native identity digest and existing verifier decisions against the retained reference. A wrong expected identity must reject without repair. A child replacement, unexpected close, unsupported date profile or incomplete query is not a successful comparison.
100
+ 4. Record acquisition durations separately in the harness's one local clock. Close receipt times describe callback dispatch, not exact kernel-exit times; no clock alignment or inference that query cost explains the whole policy gap is allowed. Do not log raw command lines, identity strings, paths, stacks or private digests; report bounded compatibility flags, status categories and durations.
101
+ 5. Release the child normally, await actual close and require fresh ESRCH immediately before any deletion. Keep uncertain state on all failures. No kill, unref override or forced process exit.
102
+
103
+ Start with one ready child and scalar plus one-row shared comparison. Broader PID/type/Unicode/date partitions use deterministic properties; broader live differential coverage follows only after the basic native experiment succeeds. One comparison cannot establish all-provider equivalence or full-load performance.
104
+
105
+ ### Native execution and CI
106
+
107
+ The current Linux/offline TypeScript build cannot manufacture a Windows helper. The initial native build is a test-only Windows x64 experiment using the hosted runner's installed SDK/MSVC, with exact toolchain/source/artifact provenance recorded. No operator compiler, download-at-install, privileged setup or release asset is added. If those tools are unavailable, report an unexecuted experiment rather than success or a product skip.
108
+
109
+ Use a separately bounded Windows prototype CI job/workflow if needed to obtain the native experiment. Keep its CPU workload on a separate runner from the unchanged product benchmark, use existing pinned action conventions and read-only permissions, and add no publication/OIDC behavior. Existing normal validation is not weakened, bypassed or relabeled by a successful prototype. Prototype wiring and trusted build-command quoting are part of implementation review before any guarded same-PR update.
110
+
111
+ A CI watchdog is an administrative execution bound, not observed helper/child absence. Canceled or hung experiments retain uncertainty and never authorize cleanup. Do not increase existing product, SDK or fixture deadlines to obtain a pass.
112
+
113
+ ## First native result
114
+
115
+ On candidate `16a3417`, [isolated experiment 42018307139](https://github.com/llblab/pi-actors/actions/runs/42018307139), job `127214304702`, passed on Windows x64. Toolset `14.51.36231` and SDK `10.0.26100.0` compiled source SHA-256 `3c0a68950d86d5b00de4fe0ee475ec9b1b50ccb728085716cee312a515f3abe5` into artifact SHA-256 `28f136e00048a7c025a67fd21fcd257d7c30af299af70e89bd327847c6d47716`; the inspected direct dependency list was `kernel32.dll`, `mi.dll`. This is recorded build provenance, not a reproducible-build or general runtime-dependency guarantee.
116
+
117
+ All four focused properties passed without skips. Scalar and one-row shared results matched the reference's consumed date, combined command, digest and verifier decisions, including wrong-expected rejection and unavailable-proof distinction. Both native helpers closed naturally; the original child was spawned, ready, released and closed, and every captured PID qualified by fresh ESRCH before cleanup.
118
+
119
+ Measured acquisitions were 66.703 ms scalar and 56.641 ms shared; sequential current/historical PowerShell references measured 1450.226 ms and 342.047 ms. These are one child's sequential observations with different warm-up conditions, not an equivalent full SDK benchmark, statistical speedup or recovered eight-second settlement. The production reader was unchanged. Accept only this tested child/profile; do not infer 64-row/large-Unicode/non-UTC/provider-error/architecture parity or default activation.
120
+
121
+ ### Two-child differential source checkpoint
122
+
123
+ The excluded harness now owns two simultaneously ready original child objects, with distinct short and real long Unicode/quoting arguments. Its private three-key readiness acknowledgement binds the JSON length and SHA-256 of actual child `process.argv.slice(4)` to the parent's expected arguments; it does not reconstruct an OS command identity. Each child retains both genuine current projected scalar and historical full-instance scalar PowerShell references plus a digest in an exclusive physical/byte-fenced frame. This does not exercise the production shared PowerShell reader.
124
+
125
+ Five fresh native observations cover live scalar short, live scalar long, shared `[long, short]`, naturally closed-short scalar missing, and closed-short/live-long shared. Every present row must match both retained references through all six existing comparison flags. Post-close observations retain both physical frames while fencing only the original live long child. Missing short must remain `unsupported_proof` under injected true liveness; a returned short row falsifies the case. Reversed request order is not provider-reordering evidence; pure properties separately reverse row arrays.
126
+
127
+ The actual experiment and failure cleanup share one release routine: attempt every eligible original child before any settlement wait, preserve exact falsy faults and callback encounter order, continue after a failed close, and never resend or reappend already surfaced faults. Callback success and backpressure are distinct from natural close. The closed `native-mi-experiment-v1` success projection uses `compatible-tested-two-children-only`, fixed query/role facts, source/artifact hashes and separate lifecycle counts: two child closes, five native-helper closes, two historical-reference closes and two current-reference synchronous native terminations. Raw identities, argv, private argv hashes, paths, receipts and cause chains stay private. Final fresh ESRCH for every captured PID immediately precedes the sole deletion; uncertain roots remain retained.
128
+
129
+ Candidate `77c7942` failed the [broader isolated Windows experiment 42380613595](https://github.com/llblab/pi-actors/actions/runs/42380613595), job `128427244017`, on actual checkout `0abfc057f8720452407be9c599df0b50c74ff33b` and tree `20e033a2342b3d75ec4912c346271a14c5b26b76`. Both native units built, all seven producer-property groups/256 assertions and the five then-current Node properties passed, but the differential refused an initial scalar comparison: date matched; command, digest and acceptance did not. The closed failure report does not identify short versus long or the differing raw component. This does not establish an encoding/provider cause, complete lifecycle counts, cleanup acceptance or broader compatibility.
130
+
131
+ The reviewed diagnostic source adds at most one separate `native-mi-command-diagnostic-v1` JSON line before the unchanged experiment failure line and exit 1. Its six fixed fields are `schema`, `stage`, `case`, `reference`, `executable_relation` and `command_line_relation`; the two cases are initial live scalar short/long, with historical-full-instance reference. Component relations distinguish equal/different strings, reference-only/native-only strings and both nonstrings, without claiming that nonstring means null. The record is bounded to 512 UTF-8 bytes including LF and uses only already acquired, validated responses. It exposes no raw identity, argv, PID, paths, hashes, lengths, offsets or errors, and performs no new query. First matching facts freeze before cleanup; added raw-component references are released after use or unwind. Unavailable diagnostics are omitted. Optional write faults cannot suppress the baseline failure path; baseline write faults retain their existing semantics.
132
+
133
+ Candidate `54667a3` reproduced the refusal in [Windows experiment 42385378853](https://github.com/llblab/pi-actors/actions/runs/42385378853), job `128441527002`, on actual checkout `22b32f52db7a2fdf7624c6c45a44972fab34565d` and tree `17666e4c51a91ee62f67417736327f37834d7d2c`. Both native units built; seven producer groups/256 assertions and all six Node properties passed. One valid six-field diagnostic (213 UTF-8 bytes including LF) immediately preceded the unchanged refusal: `live-scalar-long`, `executable_relation: equal-strings`, `command_line_relation: different-strings`. Both differing CommandLine components were strings, not an optional string/nonstring partition. Date still matched; command, digest and acceptance did not. This supplies that attempt's case/component witness only: raw content, encoding, provider semantics and cause remain unobserved, and it cannot retrospectively attribute `77c7942`. Later cases, full lifecycle counts and final fresh ESRCH acceptance were not reached.
134
+
135
+ Six focused properties, syntax, TypeScript, diff checks and independent implementation/F1 review cover the diagnostic boundaries, including an actual controlled-port RED-to-GREEN correction. The captured Windows record proves this delivery, not general stdout atomicity/delivery, asynchronous stream-error handling, provider-fault coverage or cleanup. A passing later attempt without reproduction is not a causal repair. Source/artifact hashes alone neither authenticate executable origin nor bind immutable execution bytes. The later UTF-8 correction and restored timing recognition have actual Windows acceptance as recorded above. N1.2p environment/UTC/precision admission, asset approval, activation and unchanged full SDK/native convergence remain separate gates. No mandatory check, native bound or deadline changed.
136
+
137
+ ### Pre-stdout boundary witness — source preparation
138
+
139
+ The reviewed excluded harness prepares one optional LONG-only witness S from the same already acquired PowerShell CommandLine, before stdout serialization. It adds no provider query or helper process. One direct UTF-16-unit transcriber handles both S and a computed control containing NUL, isolated surrogates and a non-BMP pair; the private ASCII capsule is bounded to 131200 bytes and S to 32767 units. All optional PowerShell work precedes the unchanged last serialization pipeline. The exclusive reservation retains the original parent FileHandle; seed/nonce, same-writer-stream EOF, physical correspondence, bounded explicit-position reads through actual EOF and stable frames gate admission. S is withheld until parent close succeeds, and is read only after the original capture/decode, current-reference equality, source-hash and frame gates. That equality is conditional consumed-identity evidence, not equivalence to an unmodified historical process at the same instant.
140
+
141
+ At most one `native-mi-prestdout-diagnostic-v1` record can accompany the first initial LONG scalar command mismatch with valid string S, historical decoded B and native decoded N, where B differs from N. Its exactly five string fields are `schema`, `stage`, `case`, `reference` and `relation`; `native-only-match`, `baseline-only-match` and `neither-match` classify strict S/B/N equality without exposing their contents. The record fits 512 UTF-8 bytes including LF and precedes the existing six-field diagnostic, which remains adjacent to the unchanged baseline failure line. Unavailable control/data omits this record without retry or identity substitution; independent optional-write faults cannot preempt the baseline. Raw added references clear after use or unwind. Unknown ownership or observed parent-close failure retains the root and prevents full success; confirmed private closure still cannot replace fresh ESRCH for every captured PID before deletion. Valid file bytes do not prove writer flush/disposal, durability or resource closure.
142
+
143
+ Twelve focused properties pass without skips, together with syntax-first, TypeScript, diff and protected-source/inverse checks; independent whole implementation review found no blocking source issue. These are source, controlled-port and extracted-main VM proofs, not complete physical end-to-end composition or general Windows protocol coverage. PowerShell noninterference/profile admission, all five real native cases and full lifecycle/fresh-ESRCH acceptance remain unproved. S matching N but not B would localize a historical serialization/transport/decoding boundary, not identify a codec, authorize a fingerprint change or establish a causal repair. B-only or neither-match reject different simple explanations; unavailable S supports no inference. The shipping reader, native bounds and mandatory SDK checks are unchanged.
144
+
145
+ Candidate `1486176` produced `native-only-match` in [Windows experiment 42397743112](https://github.com/llblab/pi-actors/actions/runs/42397743112), job `128478664886`, on actual checkout `649c1c1bd7be22b131fbc6ccb902997fc0d05c3b` and API-bound tree `0786eb47704ee88a072ddcc39f12139273eec0fd` (parents `1486176` and unchanged main `b30ff24`). Both native units built; seven producer groups/256 assertions and all twelve Node properties passed without skips (Node properties: 404.5797 ms). A valid 164-byte five-field record immediately preceded the 213-byte legacy diagnostic and unchanged scalar command-mismatch failure/exit 1. Under the bound reviewed source, the admitted pre-stdout string S strictly matched native-decoded N and differed from historical-decoded B; executable strings still matched. This is an actual single witness-path admission through its control, descriptor and parent-close gates, not a general sharing/metadata/noninterference guarantee or independent writer-closure proof. It localizes this attempt's difference to historical serialization/transport/decoding, not a specific layer, codec, correct side or causal correction, and cannot retrospectively attribute older attempts. Later cases, full lifecycle counts and final fresh ESRCH acceptance were not reached.
146
+
147
+ Independent next-act diagnosis found no causally justified compatibility correction. The historical path's fatal UTF-8 decoding and JSON parsing succeeded in the witnessed attempt; valid UTF-8 does not establish fidelity to the original string. The proposed missing boundary is T: CommandLine represented by the single actual in-memory JSON result destined for historical stdout, before output encoding. T matching S would exclude selection/serialization as the first divergence; T matching B would exclude an output-decoder-only explanation; neither or unavailable permits no correction. This is an unadopted inquiry, not another observer or baseline. Capturing T must not silently replace the current unchanged-last-pipeline/status contract, serialize twice, reconstruct expected identity or assume writer closure. Bounded feasibility evaluation did not establish a concrete mechanism preserving exact stdout/stderr/status/error ordering: materialize-then-emit or inline observation changes the terminal flow, while post-pipeline work reopens F1. T remains deferred; changing the last-pipeline clause alone would not supply the missing noninterference argument. This is a bounded design stop, not a theorem that every PowerShell observation is impossible. Reopening requires a concrete independently reviewed mechanism before explicit source adoption; the current S contract does not grant it.
148
+
149
+ ## Next integration contract — reviewed preparation
150
+
151
+ This is a concrete preparation boundary, reviewed independently for identity/fallback and artifact handoff, not approval to ship or activate a native executable. Open work and approval gates remain solely in `BACKLOG.md` (N1); this section owns the proposed design. The selected approach is one private subordinate adapter plus reviewed committed assets, not a general backend framework or second release assembly.
152
+
153
+ ### Ownership and supported representation
154
+
155
+ The native producer now has one unrouted source owner at `native/windows-mi/windows-mi.cpp`; the standalone differential remains a test consumer. Invocation/asset verification and raw-MI compatibility decoding belong to `lib/runs-process-windows-mi.ts`, with mirrored adapter properties. Keep one producer implementation rather than independent prototype/shipping copies. Source placement does not approve executable distribution, package inclusion or production routing. `runs-process.ts` retains legacy identity construction, digest/comparison and its public contract; the subordinate adapter must not import that owner. At eventual activation, change only the acquisition seam in `readWindowsIdentity` and `readWindowsProcessIdentities`. Do not move original-frame admission, liveness/status precedence, scalar fallback or callback/publication/Control/teardown fences from their current owners.
156
+
157
+ The complete private adapter will return validated legacy-shaped property rows and a closed acquisition outcome, never expected identities, verifier decisions, Run metadata or lifecycle capabilities. Its implemented observation stage retains typed timestamp components and raw optional-field facts explicitly as `decoded_unadmitted`, with no date-to-legacy promotion, process invocation, asset loading or profile-admission port. Initial raw-null refusal belongs before normalization; native producer properties and the asset/invocation seam are separate slices. This stage alone cannot supply a process identity or establish freshness. Scalar and shared profiles stay distinct; shared rows require unique exact selected-PID correlation regardless of result order. Preserve the consumed string/optional normalization above, including `.trim()` and UTF-16 code units, lone surrogates and non-BMP pairs. Unexpected MI types, missing required properties and unsupported representations make the entire optimized observation unusable; no stronger path lookup, argv reconstruction or identity-format migration is permitted.
158
+
159
+ The same private owner separately implements `decodeProvenanceBinding` for an already parsed, flat JSON-value fragment with exactly `source_sha256`, `executable_sha256`, `executable_bytes`, `originating_source_commit` and `originating_build_job`. Complete lowercase ASCII hash/commit lexemes, positive safe-integer byte counts and exact positive decimal-string job identifiers decode into fresh primitive claims labeled `decoded_binding_unadmitted`; malformed fragments return only `unusable/invalid_binding`. Source and installed compiled properties cover those boundaries, including final line terminators and copy independence. This is not a complete manifest, trusted descriptor, byte reader or asset verifier: it checks no file/hash, authentic origin, compiler, dependency or profile and grants no execution permission. Full-manifest format/resource bounds, trusted exact-byte selection, fixed asset lookup and invocation remain separate preparation work; arbitrary executable JavaScript objects are outside this JSON-value contract.
160
+
161
+ Do not promote the prototype's broad `candidateDate` range wholesale. The initial candidate is UTC-only; production eligibility requires a positively recognized environment/representation profile and real PowerShell serialization witnesses, including precision boundaries. An MI timestamp's zero offset alone, a runner label, a local JavaScript timezone or equality with an expected identity is not that predicate. The first experiment did not record a complete environment-admission witness. Establish the exact native environment/version facts and executable predicate in the broader differential before claiming a supported optimized profile; until that predicate is evidenced, keep profile admission unsupported. Non-UTC/historical profiles remain baseline-only unless separately admitted.
162
+
163
+ Optional `MI_STRING` null normalization defines codec compatibility only, not admission of an unproved provider-visibility partition. Until that partition has real differential evidence, the initial optimized profile admits only rows whose raw `ExecutablePath` and `CommandLine` are non-null `MI_STRING` values. Preserve and check those raw facts before normalization; a null optional field in any returned row makes the entire optimized acquisition unsupported and selects baseline once. Broader null admission requires separate evidence and a predicate based on observable raw fields/environment facts, never expected-identity equality. Do not strengthen path reads. Non-null fields alone do not establish all-provider equivalence, and they do not bypass the UTC-profile gate.
164
+
165
+ The six-byte ASCII escape for every UTF-16 unit is deliberately retained for the minimal candidate. Sixty-four 32,767-unit command strings alone require about 12.6 MB before other fields, exceeding the 1 MiB output limit. This is a real unsupported partition, not 64-long-command parity. The native serializer must bound the whole response, continue draining, close resources and reject the entire optimized observation on overflow. Never truncate rows, accept a prefix or widen the budget. Test the actual native producer at the limit; parser-only properties do not prove bounded serialization.
166
+
167
+ `tests/fixtures/windows-native-mi-producer-properties.cpp` includes that exact owner with test-only compile-time MI/stdio call targets. It exercises actual input, UTF-16 escaping, row copying, aggregate bounds, finite draining, cleanup-attempt ordering and output-failure control flow without another serializer or live process query. Malformed-row witnesses leave subsequent rows otherwise admissible, so duplicate/cardinality refusal cannot mask the intended validation. The isolated Windows workflow now compiles both translation units and executes these producer properties; acceptance requires results bound to the actual sources, compiled artifact and toolchain rather than a Node-only pass. Synthetic MI faults, controlled copy `bad_alloc` and close/delete counters prove only their exercised control-flow/attempt partitions, not real OOM, provider permission or physical resource closure. The real one-child differential remains separate.
168
+
169
+ ### Native producer property checkpoint
170
+
171
+ Candidate `62a0dcb` passed [isolated Windows validation 42308530762](https://github.com/llblab/pi-actors/actions/runs/42308530762), job `128203935655`, on checked merge `ea114af6b82ab540d7a2f33a83093799e3c377d3` and tree `bb1afbe85e90e2fd4e417eb1afe4c5128bf424f3`. MSVC `14.51.36231` and SDK `10.0.26100.0` compiled the unchanged single producer and corrected property fixture; all seven native property groups and 256 assertions passed. The prior actual Windows run's one failure was a test comparing the 12,582,528-byte escaped command payload to 12 MiB instead of the normative 1 MiB limit. The one-line correction preserves whole-response refusal, all 64 retrievals and the unchanged producer.
172
+
173
+ The job also passed all four Node properties without skips and the existing one-child scalar/shared differential against current and historical PowerShell. The tested producer artifact was `7a50b77cb3fa6f767896d4f78ddc52f160ea362bad59f8b565d71d211f506fec`; the property artifact was `4e772cb8226d281a2a84600c951057f11c60e507898935f2cb2061fdc3406a63`. Both helper closes, the original child's ready/release/close and fresh ESRCH cleanup were observed. These results close the bounded producer-property/source-promotion checkpoint, not synthetic-fault physical cleanup, broader provider/UTC admission, executable distribution, exact shipping-asset review, default routing or full-load SDK convergence. The shipping reader remains PowerShell.
174
+
175
+ ### Acquisition and fallback
176
+
177
+ Distinguish complete native observation, unusable/unsupported optimized acquisition, and no admitted identity from a completed observation. These are private acquisition outcomes, not new public status values.
178
+
179
+ - Unsupported architecture/profile, absent/corrupt/wrong-version assets, unavailable dependency, policy-denied execution, spawn failure, nonzero exit, malformed/incomplete response or representation overflow may select the existing PowerShell acquisition once for that acquisition. Preserve its exact grammar, options and existing scalar/shared error behavior; do not convert a native failure into absence or leak new raw errors into public surfaces.
180
+ - Do not bypass execution policy, relocate/copy an executable to evade blocking, download a replacement, elevate or add a retry loop. Runtime damage selects the baseline; required release-asset damage is a build/package failure instead.
181
+ - A completed native response with a missing PID has no admitted identity for that PID. It does not itself trigger baseline repair and never establishes absence. Preserve the existing independently fresh higher-level shared/scalar fallback against the original fenced row; do not rebind to replacement metadata.
182
+ - Once a supported native identity reaches comparison, mismatch is final for that observation. Neither baseline acquisition nor a more privileged path may repair it. Changed original metadata/ownership/physical frames discard the observation instead of retrying through replacement.
183
+ - Only an independently qualifying fresh liveness observation can produce `dead_pid`. Helpers, empty responses, missing rows, errors, earlier liveness samples and Kill receipts cannot do so.
184
+
185
+ The first adapter implementation is unrouted: no production import/selection, public backend knob, environment enable switch or dormant default-enable flag. Test the adapter directly. Invocation resources are fresh each time; no result/profile shortcut may smuggle cached native identities across callbacks.
186
+
187
+ ### Artifact and release handoff
188
+
189
+ Recommendation, pending explicit owner approval: distribute a reviewed unsigned Windows x64 executable as versioned committed repository/npm assets. This adds executable bytes, not a new operator compiler/runtime/privilege requirement. Unsupported architectures remain on the baseline. Approval of this distribution model is distinct from production activation.
190
+
191
+ ```text
192
+ native/windows-mi/windows-mi.cpp
193
+ native/windows-mi/win32-x64/<helper-version>/windows-mi.exe
194
+ native/windows-mi/win32-x64/<helper-version>/manifest.json
195
+ dist/native/windows-mi/…
196
+ ```
197
+
198
+ The versioned manifest binds protocol/profile version, architecture, native source SHA-256, executable size/SHA-256, actual compiler/SDK/build arguments, inspected dependencies and originating exact source commit/build job. The originating commit is the checked-out commit whose source was compiled, not the later asset-import/release commit; retain it unchanged while checking the current source digest. No manifest-containing-own-commit requirement is introduced. Helper versions are independent of the npm version. Digest/manifest verification is integrity and provenance, not executable authenticity, a signature, reproducibility or comprehensive dependency availability. The manifest is not allowed to self-authorize an unreviewed binary/profile.
199
+
200
+ The isolated Windows workflow may prepare the exact candidate executable plus manifest as a retained CI artifact after its own differential, with existing read-only permissions, no OIDC, no publication and no automatic repository writes. An authorized maintainer imports those exact reviewed bytes in a normal asset-review change; a separately rebuilt executable cannot borrow that artifact's evidence. Retain only executable/provenance/closed test results in the distributable handoff, never private process identities, command lines, fixture state or raw diagnostic logs. Candidate artifact retention does not authorize committing or publishing the executable.
201
+
202
+ After asset approval, `scripts/build-dist.mjs` verifies the manifest/source/artifact binding and copies the approved bytes into its temporary candidate before atomic replacement. Existing `build:check` compares the binary inventory/bytes too. Add root `native` to the npm allowlist only at that admitted packaging change. Resolve fixed versioned assets relative to `import.meta.url`: source `lib/` → root `native/`, compiled `dist/lib/` → `dist/native/`; never search cwd, PATH or caller-supplied locations.
203
+
204
+ Offline Linux build/prepack must only verify and copy existing bytes: no Windows execution, MSVC, download or compiler prerequisite. Required asset corruption/missing data must fail packaging rather than silently publish an incomplete optimized package. The existing reusable validation and Ubuntu immutable-tag publish job each check out the repository independently; no native artifact handoff currently connects them. Committed reviewed assets preserve `release.yml` as the sole assembly/publication owner and avoid release-time downloads or a second publication service.
205
+
206
+ ### Minimum broader differential
207
+
208
+ Actual Windows x64 evidence must use the exact proposed candidate bytes, not merely another compilation from the same source:
209
+
210
+ - Two simultaneously ready directly owned children, distinct commands and a real long Unicode/quoting payload with non-BMP characters, spaces, quotes and backslashes. Compare each scalar and the two-row shared observation against current projected PowerShell and the historical full-instance reference, correlating by PID rather than returned order.
211
+ - Retain genuine PowerShell identities in owned on-disk frames. Check exact date/combined command/digest, legacy-metadata acceptance and wrong-expected rejection without mismatch fallback. After a captured child's natural close, missing native rows remain unsupported observation; fresh ESRCH independently supplies absence.
212
+ - Record the real environment/profile facts needed for UTC admission and verify the exact predicate independently of expected identity. Controlled date/precision boundaries must also use actual Windows PowerShell serialization; disclose formatter fixtures separately from actual `Win32_Process` rows. Unsupported profiles must select baseline without guessed date repair.
213
+ - Exercise denied launch and MI initialization/query failure through narrowly scoped controlled ports without changing machine policy or privileges. Injected denial proves error routing, not actual provider-permission parity; an unproved provider partition remains unsupported/baseline-only. Do not claim access to arbitrary protected processes.
214
+ - Every captured helper/child closes naturally, and every deletion requires fresh ESRCH. A watchdog, timeout, aggregate timing or callback close receipt is not exact kernel-exit timing or authority to remove uncertain state.
215
+
216
+ Deterministic ports and native producer properties separately cover PID boundaries 1/64/65, duplicates/invalid safe integers/no DWORD truncation; reordered/duplicate/foreign/missing shared rows and scalar multiple rows; optional null/type codec partitions plus whole-query initial-profile refusal before null normalization; UTF-16/lone-surrogate round-trip; profile/date refusal; complete-wire bounds including actual six-byte expansion; malformed UTF-8/JSON, incomplete retrieval, nonzero/signal/spawn denial, absent/corrupt/wrong-version assets and cleanup faults. Unknown liveness stays unknown. Synthetic 64-row frames cover cardinality/size without spawning 64 workloads or scanning arbitrary PIDs. Existing original metadata/ownership/source-byte/physical-frame and callback-freshness families stay with their owners.
217
+
218
+ ### Preparation, shipping and activation boundaries
219
+
220
+ The dependency-ready preparation is the unrouted private adapter/codec, mirrored properties, promoted native source and reviewed candidate artifact build/retention path. Keep the package's binary inventory unchanged until asset ownership is approved. No global SDK spawn interceptor or research-marker layer is justified by this integration question.
221
+
222
+ Before shipping assets, independently review codec/fallback, native resource closure and provenance/distribution, then verify source/dist lookup, offline normal build/prepack, package inventory and exact shipping-byte differential. Before default activation, separately admit the routing change and pass unchanged source-and-packed genuine SDK/native validation through the actual shipping path. The fixed Run layout, workloads, watchdogs, settlement/close/research boundaries, privacy/history/budgets and independently fresh checks remain those of the existing contract; standalone helper latency does not prove recovered SDK settlement.
223
+
224
+ ## Deferred observation and activation work
225
+
226
+ Do not implement the full 87-Run spawn interceptor or research marker stream merely because a design exists. The inert prototype's directly owned child already supplies its necessary lifecycle evidence. Add further observation only for a specific unanswered question after reviewing its cost and provenance.
227
+
228
+ If original SDK lifecycle discrimination remains necessary, a later fixture-only interceptor may observe the exact returned ChildProcess in a single launch slot, bind once to the first captured Run/owner/generation/physical frame and retain closed dispatch facts. No error listener may suppress product errors, no original spawn/return/throw/ref/unref/kill behavior changes, and failed/ambiguous binding stays unavailable. Public DTOs are not physical-frame capabilities; any additional file-only capture must be explicit, bounded and reviewed. Close receipt before numeric presence does not by itself prove PID reuse; absent receipt under a blocked event loop does not prove a live original child. ESRCH remains the deletion gate.
229
+
230
+ For research timeout diagnosis, a later closed enter/ok marker stream can identify last observed entered/completed operations, not assert the phase active at timeout. It must preserve exact provider/workload rejection and ordered cleanup causes, reject arbitrary stderr noise, retain existing raw capture bounds and use the smallest justified record budget. The proposed 512-marker/48-KiB allowance is not adopted. No timestamps, signal handler or extra native probe is necessary for stage ordering.
231
+
232
+ Default native activation is a later checkpoint requiring consumed-string/status compatibility across supported profiles, naturally closing resources, source/packed parity and unchanged full native acceptance. Approved optimized architectures need auditable source/build/artifact provenance and install-time-independent prebuilt assets; unsupported profiles keep the baseline. Do not promise arm64 support, reproducible binaries, blocked-executable fallback or no-runtime-prerequisite support without verifying them. No package/backend activation follows from a successful scalar experiment.
233
+
234
+ ## Rejected paths and acceptance gates
235
+
236
+ Reject further query-flag experiments without new evidence, PID-only lifecycle joins, timeout inflation, stale async caches, native-check elision, direct-image-path substitution, undocumented Nt/PEB command-line reads as a presumed drop-in, or a persistent PowerShell broker without demonstrated need.
237
+
238
+ The first checkpoint is accepted only after independent identity/clock/lifetime, native cleanup, temporal/error/privacy and packaging review; deterministic protocol/adapter checks; and an actual native differential result. Production activation separately requires 87 planned genuine Runs/layout, nine modes, both 40-spawn cohorts, the unchanged 300 s/10 ms workload and 900 s Windows/300 s other SDK watchdog, the operator-admitted five-second completion-boundary ESRCH settlement after strictly correlated canonical work readiness, and separate ten-second original-close acceptance. Other existing eight-second settlement policies remain unchanged. Preserve all source/privacy/generation fences, framing/history contracts and fresh ESRCH before each deletion. Loaded-host UI acceptance and release automation remain separate gates.
239
+
240
+ ## Evidence references
241
+
242
+ - [Get-CimInstance, PowerShell 5.1](https://learn.microsoft.com/en-us/powershell/module/cimcmdlets/get-ciminstance?view=powershell-5.1)
243
+ - [MI_Application_NewSession](https://learn.microsoft.com/en-us/windows/win32/api/mi/nf-mi-mi_application_newsession)
244
+ - [MI_Session_QueryInstances](https://learn.microsoft.com/en-us/windows/win32/api/mi/nf-mi-mi_session_queryinstances)
245
+ - [MI_Operation_GetInstance](https://learn.microsoft.com/en-us/windows/win32/api/mi/nf-mi-mi_operation_getinstance)
246
+ - [MI_Timestamp](https://learn.microsoft.com/en-us/windows/win32/api/mi/ns-mi-mi_timestamp)
247
+ - [Win32_Process](https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-process)
248
+ - [Node 24 ChildProcess events](https://nodejs.org/docs/latest-v24.x/api/child_process.html)
@@ -16,7 +16,7 @@ export default function toolRegistryExtension(pi: Pi.ExtensionAPI) {
16
16
  runtime.discoverResources(import.meta.url),
17
17
  );
18
18
  }
19
- pi.on("session_start", async (_event, ctx) => runtime.onSessionStart(ctx));
19
+ pi.on("session_start", async (event, ctx) => runtime.onSessionStart(ctx, event));
20
20
  pi.on("turn_end", (event, ctx) => runtime.onTurnEnd(event, ctx));
21
21
  pi.on("agent_settled", async (_event, ctx) => runtime.onAgentSettled(ctx));
22
22
  pi.on("context", async (event, ctx) => ({