@xingular/harness 0.1.7 → 1.0.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 (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +808 -151
  373. package/docs/README.md +22 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,90 @@
1
+ # Arm 06 — Memory
2
+
3
+ Status: **core four audited** (omp, dsh, opencode, harness²) + our Wiki;
4
+ claude-code/openhands pending.
5
+
6
+ ## Design space
7
+
8
+ What counts as memory (instruction files, durable notes, episodic stores,
9
+ learned harnesses), who writes and when (model via tools, background
10
+ consolidation, per-write hooks), what shapes entries and their limits, and how
11
+ recall is gated (never ship rubrics or other answer-leaking data).
12
+
13
+ ## Comparison
14
+
15
+ **this harness.** Wiki notes: `noteChange` fires once the file is in place, in
16
+ the background; a hook's failure never reaches the write; every new write point
17
+ calls it too (repo contract). Injection sections are bounded (`WIKI_BUDGET`,
18
+ `NOTES_LISTED` in `src/prompt/compile.ts:167` etc.), listing notes + revision,
19
+ with more available via `wiki-list`/`wiki-search` tools. The refine experience
20
+ library is a separate, answer-free lane (arm 10) — never ships rubrics
21
+ (`refine/evidence.ts` guard).
22
+
23
+ **omp — the memory machine.** Five `memory.backend` modes: off | local |
24
+ hindsight | mnemopi | sharpshooter (`docs/memory.md:3-11`). A startup
25
+ background job runs two phases (per-session extraction → global consolidation
26
+ with lease+heartbeat, skipped for subagents), producing per-project `MEMORY.md`
27
+ (+ summary) and lessons and **skills/** on disk
28
+ (`.../memories/index.ts:29-67`; `docs/memory.md:22-26,74-89`). Injection =
29
+ Memory Guidance block at session start sharing a 5000-token budget with
30
+ lessons (`docs/memory.md:132`); `learn` lessons capped 100 entries × 2000
31
+ chars, redacted (`docs/memory.md:70`). `mnemopi` = local SQLite
32
+ working/episodic engine with embeddings and a `memory://` read protocol plus
33
+ model-facing tools `recall|retain|reflect|memory_edit`
34
+ (`packages/mnemopi/README.md:5-8`; `docs/memory.md:34-46`). `hindsight` =
35
+ remote vector service; recall on first user turn, auto-retain every N turns
36
+ (`.../hindsight/state.ts:385-388`). Writes happen minutes/days later — nothing
37
+ is "auto right after task".
38
+
39
+ **dsh — durability without a memory package.** No memory package by design:
40
+ the durable session log (immutable JSONL + checkpoint policy,
41
+ `.../packages/session/README.md:38-39`), todos persisting across sessions
42
+ (owned by the session; whole-list replace, `.../packages/todo/README.md:12`),
43
+ `spill` storing oversized text out of context with locator+guidance
44
+ (`.../packages/spill/README.md:12,30-31`), `storage` for app data that is
45
+ **never model-visible** (`.../packages/storage/README.md:12,27-30`),
46
+ `deliverables` recording outputs as client-only events
47
+ (`.../packages/deliverables/README.md:12,27-28`). Cross-session memory:
48
+ deliberately absent.
49
+
50
+ **opencode.** No cross-session memory product: per-session todos (feature-gated
51
+ `experimental.todo`), skills/config as durable files, snapshot revert/restore
52
+ (`.../tool/plugin/todo.ts:50-75`; `.../session/revert.ts:37-42`). Memory is a
53
+ community-plugin story.
54
+
55
+ **harness².** Memory belongs to refinement: the per-domain experience library
56
+ carries full adopted trees + `EXPERIENCE.md` (why + lesson) per task, scoped
57
+ per run and domain, starting empty
58
+ (`external/harness2/harness2/core/library.py:15-23`). At proposal time the
59
+ library is *read* (`INDEX.md` browse, `prompts.py:320-328`), workspace facts
60
+ are re-verified before reuse — memory is a drift-checked `[cue→lesson]`, not a
61
+ freeform store. The editable tree also holds `LongTermMEMORY.md` as c3 durable
62
+ facts, "ALWAYS ON" with the output-budget price tag (`.../prompts.py:104,426`).
63
+
64
+ **claude-code (pending).** CLAUDE.local.md, `#` quick-notes, user memory file
65
+ (publishable specs; citations pending).
66
+
67
+ ## Trade-offs
68
+
69
+ - **Where memory lives.** The file the model reads (`MEMORY.md`, our Wiki) is
70
+ the visible tier; the episodic store (mnemopi) is the cheap tier for
71
+ per-project recall. omp is the only source with both, and it pays for it with
72
+ background jobs and lease/heartbeat machinery.
73
+ - **Learning to write.** harness²'s lessons have a *scope contract*
74
+ (generic/procedural, but never task facts; "too generic changes nothing, task
75
+ facts are wrong anchors") — enforced by prompt discipline and by the `cue`
76
+ shape in ours (`src/refine/prompts.ts:425`). Any Wiki lesson should carry the
77
+ same contract (pattern vs fact).
78
+ - **Caps and redaction.** omp's budget regime (100×2000 lessons, injection caps)
79
+ caps) mirrors our WIKI_BUDGET approach; worth remembering that redaction is
80
+ part of the cap story, not just size.
81
+ - **Nothing is model-visible that shouldn't be** (dsh `storage`): keep the
82
+ separation of run records (ours).validate Never model-visible: run events
83
+ used for the Wiki must already be validated kinds (family rule).
84
+
85
+ ## Adoption candidates
86
+
87
+ | # | Idea | From | Land as | Tier |
88
+ |---|---|---|---|---|
89
+ | M1 | Apply harness²'s lesson-shape contract to any Wiki note that summarizes behavior (cue = shape of situation, lesson = checkable operation, NO_ENTRY when unsupported) | harness² + omp caps | Wiki note template/validation (plugin) | landed: `src/history/lessons.ts` (PROP-0008) |
90
+ | M2 | Evaluate a `memory://`-style read protocol (note retrieval as URI) — compare cost against plain wiki tools before adopting | omp mnemopi | none (note only) | T3 |
@@ -0,0 +1,71 @@
1
+ # Arm 07 — Governance
2
+
3
+ Status: **core three audited** (opencode, omp, dsh) + swe-agent blocklists,
4
+ smolagents executor posture; claude-code/openhands pending.
5
+
6
+ ## Design space
7
+
8
+ Who may call what, expressed how (per-call gate, tier×policy, event pipeline,
9
+ modes), approval UX (`ask` as outcome), fallback behavior (fail-closed or not),
10
+ trust for loaded code, secret/account isolation.
11
+
12
+ ## Comparison
13
+
14
+ **this harness (contracts).** Per-call gate as the final extension; standing
15
+ approvals; single-use operation approvals in the app scope; account pinning
16
+ and redaction; tree plugins load only when their exact code is trusted
17
+ (`src/tree/trust.ts`).
18
+
19
+ **opencode — effect assertions with a wildcard ladder.** Rules: `allow|deny|ask`
20
+ literals, `findLast` wildcard resource match, default ask; agent rules and
21
+ session-level rules merge; a missing agent rule means deny-all
22
+ (`.../core/src/permission.ts:87-97,158-172`); user-saved "always allow"
23
+ (`:148-155`); catalog filtering only for wildcard-deny leaves
24
+ (`.../tool.ts:233,293-296`). Plugins may reject calls via `execute.before`
25
+ (`.../packages/plugin/src/effect/tool.ts:20-52`) — handy, but note the gate
26
+ stays the execution boundary's last authority only if core retains its own
27
+ assert.
28
+
29
+ **omp — declared tiers and modes.** `ToolTier = read|write|exec` per tool
30
+ (exec default when unclaimed), per-tool policy `allow|deny|prompt`, modes
31
+ `always-ask | write | yolo`; **missing context fails closed to always-ask**
32
+ (`.../tools/approval.ts:17-18,53-84,100,1226-1230`). Extension hooks wrap every
33
+ call (`extensibility/hooks/tool-wrapper.ts`).
34
+
35
+ **dsh — pipeline events, not a package.** Gate inside dsh-tools:
36
+ `tools/pre-execute` (allow/deny/ask) → monotonic guard() reasons → execute →
37
+ post-execute → result (observe-only)
38
+ (`.../packages/core/tools/README.md:89,109`; ask at `.../index.ts:608-612`).
39
+ Bundle base ships a default policy confining file writes and asking before
40
+ risky actions (`.../bundle/base/README.md:50`). OS sandbox separately:
41
+ file-effect policy classes with Landlock/Seatbelt/Windows backends and one-time
42
+ approved escalation (`.../packages/sandbox/README.md:12,30`).
43
+
44
+ **swe-agent.** Governance = curation: blocklist files in bundles
45
+ (`external/swe-agent/tools` listing); the environment's own command filter
46
+ (pending detail).
47
+
48
+ **smolagents.** Almost none in-source; the free executor (interception-based
49
+ local or paid remote) carries the risk — the anti-reference for our no-code-actions stance.
50
+
51
+ **claude-code (pending).** Permission modes + allow/deny rules + hooks.
52
+
53
+ ## Trade-offs
54
+
55
+ - **Declarative vs hook-composed.** A user wanting "always allow reads, ask on
56
+ writes" gets legibility from omp's tables; a plugin author gets power from
57
+ opencode's before-hooks. Our per-call gate can host both: tiers inform, hooks
58
+ advise, gate decides.
59
+ - **Fail-closed culture.** omp fails closed on missing policy; opencode defaults
60
+ ask; dsh asks by bundle default. Convergent good posture — record as a
61
+ shared norm, and keep our own default equally closed.
62
+ - **Escalations are one-time, auditable.** dsh's one-time approved sandbox
63
+ escalation and our single-use approvals express the same idea; forcing a
64
+ person to re-re-approve persistent bypasses is the safer curve.
65
+
66
+ ## Adoption candidates
67
+
68
+ | # | Idea | From | Land as | Tier |
69
+ |---|---|---|---|---|
70
+ | G1 | Tier-per-tool declarations inform standing-approval wording (reads bulk-allowed, writes asked) | omp | ToolPolicy documents + default policy | T1 |
71
+ | G2 | Codify "policy missing ⇒ ask" as an invariant test | omp fail-closed | src tests around the gate | T1 |
@@ -0,0 +1,69 @@
1
+ # Arm 08 — Execution
2
+
3
+ Status: **core three audited** (opencode, omp, dsh) + swe-agent environments,
4
+ smolagents executors; hands pending.
5
+
6
+ ## Design space
7
+
8
+ Where a step's process runs (own process, PTY owner, container), sandbox
9
+ mechanics per OS, output shapes (streaming, truncation, side-files), and who
10
+ owns the terminal surface.
11
+
12
+ ## Comparison
13
+
14
+ **this harness (contracts).** Host owns PTY and supervision; the harness owns
15
+ the terminal launch spec; a session runs in its account's own Pi agent folder,
16
+ never `~/.pi` (isolation by account).
17
+
18
+ **opencode.** The `shell` tool runs via the core Shell service returning
19
+ bounded tail output with full output saved to a file
20
+ (`.../tool/plugin/shell.ts:17-23,42-43`). `persistent-pty` is a separate
21
+ per-server daemon for owned PTYs rooted at `<state>/pty` — for interactive
22
+ frontends, distinct from the tool path
23
+ (`.../core/src/persistent-pty/index.ts:6-23,129` — tool-vs-PTY overlap
24
+ unverified).
25
+
26
+ **omp.** The strongest in-process Unix environment: bash runs inside a Rust
27
+ `pi-shell` host **with vendored uutils coretools (pi-builtins)** — real
28
+ utilities, one process (`crates/pi-shell/Cargo.toml:18`,
29
+ `crates/pi-builtins/src/`). Always non-interactive env (pagers off,
30
+ TERM=dumb, credential prompts fail via `false`)
31
+ (`.../exec/non-interactive-env.ts:6-25`). No OS-level sandbox located
32
+ (unverified absence).
33
+
34
+ **dsh.** Layered: OS sandbox classes (read-only / workspace-write /
35
+ danger-full-access on Landlock/Seatbelt/Windows tokens, one-time approved
36
+ escalation), exactly one shell executor per composition exposing `bash`/`pwsh`
37
+ tools, and a single `ctx.subprocess` service with bounded output and scrubbed
38
+ env (`.../sandbox/README.md:12,30`; `.../shell/README.md:12,38`;
39
+ `.../subprocess/README.md:12,27`).
40
+
41
+ **swe-agent.** Containerized bash environments per run with tool bundles
42
+ bound to the interface (`sweagent/environment/`); benchmark single-shot
43
+ workspaces.
44
+
45
+ **smolagents.** Local executor intercepts/denies dangerous calls in-process;
46
+ remote (E2B etc.) otherwise (`local_python_executor.py`, `remote_executors.py`).
47
+
48
+ ## Trade-offs
49
+
50
+ - **In-process Unix vs OS sandbox.** omp buys speed/fidelity with a Rust-hosted
51
+ environment; dsh buys verifiable confinement with OS primitives. This harness
52
+ runs on a host's PTY, so the OS-sandbox direction (dsh) is the compatible
53
+ one; "in-process coretools" is an execution detail of pi, not adoptable
54
+ machinery here without duplicating rust-supported layers.
55
+ - **Two command paths is the norm.** opencode (tool shell vs owned PTY) and dsh
56
+ (shell executor vs subprocess service) both split "model calls" from
57
+ "platform plumbing" — our launch-spec/PTY split matches; the invariant to
58
+ keep: environments are per-account, launched by spec, never shared across
59
+ accounts.
60
+ - **Output hygiene** (bounded tails + side files, scrubbed env, non-interactive
61
+ defaults) is universal; treat as a checklist for any new tool rather than a
62
+ design to adopt.
63
+
64
+ ## Adoption candidates
65
+
66
+ | # | Idea | From | Land as | Tier |
67
+ |---|---|---|---|---|
68
+ | E1 | Sandboxing classes as a ToolPolicy option (read-only/workspace-write) for *host* integrations — offered, never default | dsh | ToolPolicy scope option | T2 (needs app-level sandbox plumbing) |
69
+ | E2 | "One subprocess service" norm: all child spawns montage through one owned helper with bounded output + env scrub | dsh subprocess | App-sidecar ownership unchanged; only normative doc | T1 as ADR text |
@@ -0,0 +1,60 @@
1
+ # Arm 09 — Observability
2
+
3
+ Status: **core three audited** (opencode, omp, dsh) + swe-agent trajectories;
4
+ hands pending.
5
+
6
+ ## Design space
7
+
8
+ What is recorded (events, trajectories, usage), validation of records, who may
9
+ write run records, live relay to interfaces, retention/redaction, and cost
10
+ accounting granularity.
11
+
12
+ ## Comparison
13
+
14
+ **this harness (contracts).** Validated run events saved per run by the only
15
+ writer (`sessions/runStore.ts`); `usage.updated` cumulative per run with the
16
+ uncached-input / cache-read / cache-write split; app relays to UI.
17
+
18
+ **opencode.** "event-logger.ts listens on the event bus and logs only
19
+ allow-listed config-type events (agent/provider/model/command/config updated),
20
+ as a global node" (`.../core/src/event-logger.ts:10-19`). Usage published as
21
+ `SessionEvent.UsageRecorded` from the compaction anchor
22
+ (`.../session/compaction.ts:632-639`); trajectory surface lives in session-ui
23
+ and the TUI (packages listing).
24
+
25
+ **omp.** `omp stats` — local web dashboard with live ingest (port 3847)
26
+ covering AI usage, with per-session ledgers available
27
+ (`packages/stats/README.md:3,9,31-35`); `wire` package supplies transport;
28
+ judgment roles record usage too (`.../judgment/index.ts:6-10`).
29
+
30
+ **dsh.** Telemetry is an OTel transport only — "business consumers own events,
31
+ identities, redaction"; feedback-authorized upload, default `FEEDBACK_ONLY`
32
+ (`.../packages/telemetry/README.md:12,25`; `.../bundle/base/README.md:50`).
33
+ Business events flow through the session event stream.
34
+
35
+ **swe-agent.** trajectory JSON per run + a separate inspector to browse them
36
+ (`external/swe-agent/trajectories`, `sweagent/inspector/`).
37
+
38
+ **smolagents.** `monitoring.py` metrics + `AgentLogger` markdown logs; gradio UI.
39
+
40
+ ## Trade-offs
41
+
42
+ - **Where transport ends.** The dsh rule — a transport package knows nothing
43
+ about business events — is the cleanest boundary. Our runStore already
44
+ *is* the business schema; be careful that nothing in run records assumes an
45
+ application consumer (they don't: read-only records).
46
+ - **Local dashboards vs relay.** omp's stats serves a self-hosted view; ours
47
+ hands validated events to a UI. Same functionality, different home; nothing
48
+ to adopt; the one check if we ever add an export path: no
49
+ duplicate charges on relaunch (event ids dedupe).
50
+ - **Cost accounting alignment.** Everyone anchors usage at the latest provider
51
+ response and estimates lagging items (opencode anchor pattern at
52
+ `compaction.ts:812-842`). Ours does the same via usage.updated — align
53
+ definitions (reasoning inside output) with any upstream comparisons to
54
+ prevent double-cost surface.
55
+
56
+ ## Adoption candidates
57
+
58
+ | # | Idea | From | Land as | Tier |
59
+ |---|---|---|---|---|
60
+ | O1 | A "transport owns nothing about identities" doc commitment when any telemetry-like export exists (apps may add; harness stays identity-blind) | dsh telemetry | a para note in repo README | T1 doc |
@@ -0,0 +1,110 @@
1
+ # Arm 10 — Refinement / self-improvement
2
+
3
+ Status: **audited (self + upstream, in person)** — this arm's headline finding changes
4
+ the shape of the study, see §1.
5
+
6
+ ## Design space
7
+
8
+ Who is improved (prompt files, tools, tree files), how candidates are made
9
+ (dimension-split editors?), how they are probed (isolated, unattended; approvals
10
+ refused), how selection stays answer-free, how experience accumulates across
11
+ tasks, and what no step may do (act in the world with a person's assets).
12
+
13
+ ## 1. Headline finding: this harness already ports harness²
14
+
15
+ Every module of `src/refine/` is an explicit port of harness²'s core, by its own
16
+ header comments:
17
+
18
+ | this harness | upstream |
19
+ |---|---|
20
+ | `src/refine/recursion.ts:5` | `harness2/core/recursion.py` |
21
+ | `src/refine/selection.ts:5` | `harness2/core/selection.py` |
22
+ | `src/refine/prompts.ts:5` | `harness2/core/prompts.py` (the **adapt** pack only — `prompts.ts:1`) |
23
+ | `src/refine/ledger.ts:5` | `harness2/core/ledger.py` |
24
+ | `src/refine/library.ts:9` | `harness2/core/library.py` |
25
+ | `src/refine/evidence.ts:13` | `harness2/core/context.py` |
26
+ | `src/refine/runner.ts:6` | `harness2/core/schedule.py::run_task` (shaped after) |
27
+
28
+ Identities preserved: R = 4k rollouts / P = 3k sessions per mode
29
+ (`src/refine/ledger.ts:7-11`), matching upstream `recursion.py:15-19`; Stage
30
+ shape (`Stage {label, dim, tree, keptBase, fellBack…}` `src/refine/recursion.ts:26-37`)
31
+ with one-retry-then-inherit upstream `recursion.py` docstring; sequential-round
32
+ checkpoint anchoring incl. the "KEEP_BASE means the CURRENT checkpoint" rule
33
+ (`src/refine/prompts.ts:316` vs upstream `prompts.py:852-857`); the answer-free
34
+ selector (`src/refine/prompts.ts:399` mirrors `prompts.py:791-793`); KEEP_BASE
35
+ doctrine (`src/refine/prompts.ts:232` mirrors `prompts.py:333-335`).
36
+
37
+ The merge the study was asked to plan is therefore **already largely executed**.
38
+ What remains is a mature-upstream delta analysis, below.
39
+
40
+ ## 2. Comparison with harness² as it now stands
41
+
42
+ Converged (ported): parallel/sequential recursion, INV/DOM candidate split with
43
+ independent same-evidence samplers, aggregator/composer with MERGE / ADOPT-ONE /
44
+ KEEP_BASE, anonymized answer-free selection, per-domain experience library
45
+ carrying the **full adopted tree plus an EXPERIENCE.ms-style why/lesson** (ours:
46
+ `src/refine/library.ts`; theirs: `external/harness2/harness2/core/library.py:15-23`,
47
+ "the whole tree is carried, never a summary"), reflection writing cue/lesson rows
48
+ (`src/refine/prompts.ts:418-425` mirrors their `_EXP`-driven reflector).
49
+
50
+ Deltas (upstream beyond our port):
51
+
52
+ 1. **Second, hardened prompt pack ("tts").** Upstream ships two packs per stage
53
+ (`_tts_propose` / `_tts_aggregate` / `_tts_select` vs the base pack,
54
+ `external/harness2/harness2/core/prompts.py:838-839,896-897`); ours carries
55
+ only the adapt pack (`src/refine/prompts.ts:1`). The tts pack adds: an
56
+ explicit **`<notes>` decision audit format** (`kept|revised|dropped -> edit ->
57
+ evidence`, `.../prompts.py:765-769`), a `yardstick` slot ("WHAT GOOD PROCESS
58
+ LOOKS LIKE HERE", `.../prompts.py:705-706,757-761`), sharper always-on
59
+ economics and on-demand-first framing, and pool-anonymity emphases
60
+ (`PICKING AN UNMODIFIED HARNESS IS VALID`, `.../prompts.py:66-74`).
61
+ 2. **Screenshot-era surface dialects.** Upstream maintains this c1–c8 tree for
62
+ two substrates (opencode and codex) with per-substrate hook/plugin mechanics
63
+ (`.../prompts.py:617-661`, `tree.py:41-60 SurfaceSpec`) — ours compiles one
64
+ Pi surface (`src/refine/recursion.ts` imports `PI_SURFACE`).
65
+ 3. **A decoupled judge.** `harness2/core/judge.py:15-19`: measurement of the
66
+ chosen run happens *after selection*, **"Nothing in the method imports this
67
+ module"**; a judge failure is None, excluded from denominators
68
+ (`.../judge.py:37-40`). **Not ported** — `src/refine/` has no judge module.
69
+ This is the one structural piece of upstream we do not have.
70
+ 4. **Substrate contract vs our RefineHost.** Their substrate wrap is a
71
+ file-level (`context/harness/` editable tree + workspace dirs); ours isolates
72
+ through `RefineHost` (workspace, probe session, deliverable) with probe runs
73
+ as unattended sessions whose approvals are refused (repo contract). Same
74
+ shape, different isolation vocabulary — ours is the stronger primitive, but
75
+ note upstream's `keep_base` inherits untouched files with no re-read
76
+ (`.../prompts.py:186-189`); ours should verify the same semantic survived the
77
+ port (pending test-level confirmation).
78
+
79
+ ## 3. Trade-offs
80
+
81
+ - **Judge in or out.** Keeping measurement out of the harness (our family rule:
82
+ measurement belongs to Evaluation) preserves layering but forfeits private
83
+ experience labeling — the `<experience>` reflection then rests only on
84
+ trajectory contrast, which ours already guards ("A lesson resting only on
85
+ `confounded` rows is a guess", `src/refine/prompts.ts:425`). Upstream's
86
+ compromise: a judge that labels the *chosen* run only, never feeds forward, and
87
+ is excluded from denominators on failure — it cannot leak into selection
88
+ because selection already happened.
89
+ - **Prompt packs.** Two packs cost maintenance but let upstream evolve hardening
90
+ without destabilizing the published method. Ours froze one pack at port time;
91
+ upstream drift since then is invisible to our selectors.
92
+ - **One surface vs many.** Ours targets Pi only; upstream's SurfaceSpec proves
93
+ the same method bends to codex/opencode cheaply — a bridge test for whether
94
+ our `RefineHost` boundary is truly substrate-agnostic.
95
+
96
+ ## 4. Adoption candidates
97
+
98
+ | # | Idea | From | Tier | Land as |
99
+ |---|---|---|---|---|
100
+ | R1 | Diff the ported prompts against upstream's `adapt` lines and pull changed sentences (e.g. pool-anonymity emphasis, deliverable-shape rule) into `src/refine/prompts.ts` | harness² drift since the port | T1 | in-place prompt text sync (tests measure wording-insensitive behavior) |
101
+ | R2 | Add the `<notes>` audit format to compose/selected stages so adoption decisions carry their evidence | tts pack | T1 | our prompts' notes sections |
102
+ | R3 | Consider the yardstick slot as an optional, app-supplied `BenchPrompts` field — *only if* an app needs a domain yardstick; it must remain prose, never a score | tts pack via `Spec` | T2 | `RefineHost` launch input, thinking hard before adding |
103
+ | R4 | A post-selection judge module, ported with upstream's exact decoupling (not imported by the method; None on failure excluded from denominators) **or** explicitly glued to Evaluation | judge.py | T2 with a layering decision first — see trade-off above | new `src/refine/judge.ts` behind `RefineHost`, or nothing |
104
+ | R5 | Re-run upstream-vs-ours substrate parity test: can our tree/validation accept an upstream-authored candidate tree without edits? (`isAllowed`, caps, autotrigger semantics) | both | T1 verification task, no code change | a test |
105
+
106
+ Anti-candidates, recorded so nobody re-proposes them: do **not** move measurement
107
+ or grading into `src/refine/` (family boundary: Evaluation owns measurement);
108
+ do **not** let any judge label reach improver or selector (answer-free is
109
+ invariant); do **not** carry per-task facts into the durable library without the
110
+ cue/lesson narrowing ours already enforces.
@@ -0,0 +1,37 @@
1
+ # `/btw` side-question comparison
2
+
3
+ Status: source-reviewed comparison of the checked-out workspace snapshots; no live model or UI runs were performed. This is a study note, not a change to the Harness contract.
4
+
5
+ ## Scope and conclusion
6
+
7
+ This compares the terminal implementation in this repository, Xingular Agent's app-owned chat feature, and the external projects with an actual `/btw` implementation in the checked-out `external/` sources. The external set is Oh My Pi (`omp`), Kimi CLI, OpenCode, and OpenHands. OpenHands' SDK is its backend, not a separate UI implementation.
8
+
9
+ The similarly named features are not one shared implementation. **Xingular Harness terminal creates a separate, in-memory Pi session with a bounded transcript excerpt and hard tool suppression. Oh My Pi's native `/btw` uses the main session's ephemeral side-turn pipeline, with much more context and persistent BTW history.** Xingular Agent's `/btw` is instead owned by the App: it starts a tracked, tool-free side run using a deliberately bounded public snapshot.
10
+
11
+ ## Comparison
12
+
13
+ | Implementation | Context supplied | Isolation and persistence | Interaction |
14
+ |---|---|---|---|
15
+ | **Xingular Harness terminal** | Up to six visible user/assistant turns; each is clipped to 1,200 characters and the excerpt to 6,000. Includes tool names and a running flag, not tool inputs/results. | Creates an in-memory Pi session using the active model, with tools, extensions, skills, prompt templates, themes, and context files disabled; thinking is off. The side exchange is not added to the main transcript or a Harness run record. | One dock at a time. A new question replaces the old one; an empty `/btw` or Escape dismisses it and aborts the side session. The displayed answer is limited to eight lines. (`src/terminal/tui/sideQuestion.ts:13-21,39-53,69-85,106-165`; wiring: `src/terminal/opentui/app.ts:376-399`.) |
16
+ | **Xingular Agent (App-owned)** | Up to eight visible conversation messages plus a bounded public-progress snapshot: current request, visible partial answer, status, and up to six public tool-activity summaries. Excludes hidden reasoning, tool arguments/results, and attachments. | Separate tool-free run using the conversation's account/model/effort and an opaque one-use session identity. It does not control or enter the main transcript; it has an ordinary run record/events for Trajectory and Usage. | One temporary dock per one-to-one Agent/Solo conversation. Stop and Dismiss affect only the side run; a new question replaces it. Groups and attachments are unsupported. (`../App/docs/features/FEAT-0014-side-questions.md:25-43`; snapshot and run launch: `../App/src-tauri/src/agents.rs:2748-2881`; dock lifecycle: `../App/src/modes/chat/useSideQuestion.ts:15-110`.) |
17
+ | **Oh My Pi (`external/omp`)** | Uses the main system prompt and session history, and includes the in-progress assistant text. The snapshot preserves thinking blocks too. Its main tool catalog is supplied for the request, but the side turn does not execute tool calls. | Ephemeral side turn does not mutate the main session history. BTW questions and answers are checkpointed in a separate on-disk history sidecar; topics support follow-ups. | TUI history panel, cancellation, copy, optional promotion of a single answer to a branch, and RPC commands/stream events. (`external/omp/packages/coding-agent/src/session/agent-session.ts:11363-11550,11555-11600`; turn/follow-up context: `external/omp/packages/coding-agent/src/session/btw-turn.ts:13-93`; sidecar: `external/omp/packages/coding-agent/src/session/btw-history.ts:80-146`; controller: `external/omp/packages/coding-agent/src/modes/controllers/btw-controller.ts:121-190,356-448`; RPC: `external/omp/packages/coding-agent/src/modes/rpc/rpc-btw.ts:1-18`.) |
18
+ | **Kimi CLI** | Uses the same system prompt, normalized conversation history, and tool definitions as the main agent, explicitly to align the prompt cache. It does not explicitly add the current partial stream to that history. | Tool definitions are visible, but a deny-all toolset rejects calls. If the model tries a tool, it gets one retry (two model steps maximum). The side exchange is not written into main conversation history. | Streams into a scrollable modal; Escape dismisses. Interactive shell and wire events are supported. (`external/kimi-cli/src/kimi_cli/soul/btw.py:33-93,102-190,233-247`; behavior: `external/kimi-cli/docs/en/reference/slash-commands.md:247-256`; modal handling: `external/kimi-cli/src/kimi_cli/ui/shell/visualize/_interactive.py:120-189,281-324`.) |
19
+ | **OpenCode** | Makes a one-shot generation from the selected session's previewed history, system transcript, and tool definitions, followed by the BTW instruction and question. | The generation explicitly does not mutate the session; it returns text rather than entering a tool-execution loop. The question/answer live in a separate per-session extension store until the tab closes. | One side tab per question; supports retry and copy. The command is enabled only with an open session in a desktop-width window. (`external/opencode/packages/core/src/session/generate.ts:25-65`; extension state: `external/opencode/packages/gui-extensions/src/btw/model.ts:7-110`; command/panel: `external/opencode/packages/gui-extensions/src/btw/renderer.tsx:32-101`.) |
20
+ | **OpenHands** | The default SDK path prepares a request from the enforced conversation snapshot plus the side question, using the agent's model and tool definitions. | `ask_agent` is documented as stateless: it does not alter conversation state, persist events, or change execution status. It makes a direct generation rather than running tool actions. The UI entries are held in a client-side store. | The UI shows a pending card and then the answer, which can be expanded or dismissed; it waits for the response rather than rendering token deltas. (`external/openhands-agent-sdk/openhands-sdk/openhands/sdk/conversation/impl/local_conversation.py:2903-2966`; interception: `external/openhands/src/hooks/chat/use-btw-interceptor.ts:13-43`; client state and card: `external/openhands/src/stores/btw-store.ts:1-68`, `external/openhands/src/components/features/chat/btw-messages.tsx:11-55`.) |
21
+
22
+ ## Cross-cutting trade-offs
23
+
24
+ - **Context breadth:** Harness terminal and Agent App construct bounded excerpts. Oh My Pi, Kimi CLI, OpenCode, and OpenHands reuse broader session context. Oh My Pi is the most explicit about carrying live state—and its code includes current thinking blocks—so it is also the least restrictive about what private context the side request can see.
25
+ - **Tool boundary:** Harness terminal and Agent App suppress tools at launch. Kimi advertises the main tool definitions but denies execution and retries after a tool attempt. Oh My Pi, OpenCode, and OpenHands make direct side generations without dispatching the returned answer through the main agent's tool-execution loop; some still send tool definitions for context or cache alignment.
26
+ - **Retention:** Harness terminal is intentionally transient. Agent App retains an ordinary run record for observability. Oh My Pi has durable, followable BTW topics; OpenCode retains one tab's question and answer in its session store. OpenHands' displayed entries are client-side state, not main conversation events.
27
+ - **Cache versus least privilege:** Kimi CLI explicitly aligns system prompt and tool definitions for cache reuse; Oh My Pi reuses the main session's prompt/cache path. This means broader context and tool metadata may be sent than the bounded-snapshot designs require.
28
+
29
+ ## Study implications
30
+
31
+ 1. Keep the Harness terminal's bounded context and hard no-tools setup as the conservative generic default.
32
+ 2. If a side question needs better awareness of an active run, prefer a bounded summary of public progress over forwarding hidden reasoning or raw tool inputs/results. Agent App already demonstrates that application-specific snapshot at the App layer; keep that ownership boundary intact.
33
+ 3. Treat persistent follow-up topics, branching, and RPC support as optional product capabilities, not requirements of a basic side question.
34
+
35
+ ## Coverage note
36
+
37
+ A source scan found no `/btw` implementation in the checked-out `external/deepseek-harness`, `external/harness2`, `external/smolagents`, or `external/swe-agent` trees. Matches in `external/orca` were fixture/test references, not an implementation. These are observations about the local snapshots, not claims about current upstream releases.
@@ -0,0 +1,42 @@
1
+ # Harness feature-gap review
2
+
3
+ **Scope:** What `@xingular/harness` provides compared with the agent systems in the local harness study. This is a feature-gap review, not a parity score. Comparisons refer to the studied snapshots; the deeper OpenHands and Claude Code audits are still marked pending in the [study index](00-index.md).
4
+
5
+ ## Summary
6
+
7
+ The Harness is a generic single-run runtime, not a task manager or long-running workflow engine. Some apparent gaps are deliberate layer boundaries: the architecture assigns product tasks, schedules, teams, worktrees, and UI to the embedding application. The run record has an opaque `goal` string, but no goal lifecycle or progress model. See [00 Overview](../architecture/00-overview.md#layers) and [02 Sessions and runs](../architecture/02-sessions-and-runs.md).
8
+
9
+ | # | Capability missing from the Harness | Current state and comparison | Appropriate owner |
10
+ |---:|---|---|---|
11
+ | 1 | **First-class task lifecycle** — create, assign, track status, dependencies, review, and acceptance | Normal sessions track runs; `RefineTask` is for harness-tree refinement, not product work. OMP has a task-delegation tool. | **Application** |
12
+ | 2 | **Persistent goals and progress** — goal hierarchy, checklist, and durable progress | Plan mode produces a proposed plan, not tracked progress. `goal` on a run is opaque metadata. OpenCode has per-session todos; OMP exposes a goal helper. | **Application**, optionally through a tool provider |
13
+ | 3 | **Long-running job scheduler** — durable queue, cron/event triggers, deadlines, retries, and leases | Sessions can run asynchronously, but the Harness has no durable scheduler. The OpenHands study identifies scheduling in a separate automation project. | **Application** |
14
+ | 4 | **Crash-safe continuation** — resume from a checkpoint after a process or machine restart | Run events and Pi history persist, and terminal history can be resumed manually. However, startup marks active runs interrupted; the Harness does not restart model work. | **Harness + application**: recovery contract plus requeue policy |
15
+ | 5 | **Automatic cross-run memory consolidation** — extract useful task state and lessons from completed runs | The Harness has Wiki notes, history, and a refinement experience library, but no automatic task-state consolidation pipeline. OMP's study describes background memory extraction and consolidation. | **Harness** for generic memory; **application** for task state |
16
+ | 6 | **Team and work-queue orchestration** — persistent workers, assignments, dependencies, and shared coordination | Harness subagents are fresh parent-child runs with result delivery, not a persistent team or shared queue. OMP has task-worker machinery; product-level coordination belongs outside the Harness. | **Application** |
17
+ | 7 | **Managed per-task sandbox/workspace** — containers, worktrees, snapshots, and rollback | The host supplies the working folder and tools; the Harness tool gate is not an OS sandbox. The study contrasts this with OpenHands/SWE-agent containers and OMP worktrees. | **Application/host** |
18
+ | 8 | **Native browser and computer interaction** | Web search/fetch can be provided as tools, but browser or computer control is not built in. Plan-mode text mentioning managed controls is recorded as known drift (D-6). | **Application**, through tool providers and policy |
19
+ | 9 | **Goal-specific verification and acceptance** — tests, graders, and a “done” gate | The refinement matrix records execution and deliverability; it does not grade whether a user's goal was achieved. Frozen task grading belongs in Evaluation. | **Evaluation/application** |
20
+ | 10 | **Aggregate operations dashboard and budgets** — cross-run cost limits, alerts, and health views | The Harness records per-run events and usage. It has no built-in aggregate dashboard; an optional budget-guard plugin partially covers per-run limits. OMP's study describes a local stats dashboard. | **Application UI**, using Harness run data |
21
+
22
+ ## Status (2026-10-22)
23
+
24
+ The Harness-owned parts of three gaps have landed. The application-owned parts and the other
25
+ seven gaps are unchanged.
26
+
27
+ | # | What landed in the Harness | Taken from | Still the application's |
28
+ |---:|---|---|---|
29
+ | 2 | `checklist_write`: the model's whole checklist as a `checklist.updated` run event, read with `runs.checklist` ([PROP-0006](../architecture/proposals/PROP-0006-run-checklist.md)) | dsh `todo_write` (whole-list replace, three statuses, replayed from the log); OpenCode `todowrite` (usage rules in the tool description) | Goal records, goal hierarchy, progress across runs, showing the checklist |
30
+ | 4 | `continueFrom` and `runs.continuation`: a stopped run is continued as a new run with the same account, tree version and capabilities, and the model is told where it stopped; `Recovery.interruptedRunIds` ([PROP-0007](../architecture/proposals/PROP-0007-run-continuation.md)) | Every peer's "never restart silently" rule; dsh's durable log as the checkpoint; OpenHands' requeue outside the agent | The requeue policy: which runs to continue, when, and whether to ask first |
31
+ | 5 | The opt-in `lessons` plugin: a read-only reflection after a completed run may keep one lesson in the Wiki under `library/lessons/` ([PROP-0008](../architecture/proposals/PROP-0008-lessons-from-runs.md), [ADR-0010](../decisions/ADR-0010-lessons-in-the-wiki.md)) | harness²'s reflector (cue → lesson, `NO_ENTRY`, never task facts, answer-free guards); OMP's background extraction and caps | Task state and its consolidation; a switch for the plugin in its UI |
32
+
33
+ ## Recommendation
34
+
35
+ For products that need autonomous long-running work, start with an application-owned task/goal model and scheduler, then define how they request safe continuation of Harness runs. Keep task and schedule concepts out of the Harness itself; its architecture deliberately assigns them to the application. A useful first sequence is: (1) task and goal records with acceptance criteria, (2) durable scheduling and human handoff, (3) explicit restart/recovery policy, then (4) isolated workspaces and an evaluation gate.
36
+
37
+ ## References
38
+
39
+ - Harness ownership and application boundary: [00 Overview](../architecture/00-overview.md#layers), [02 Sessions and runs](../architecture/02-sessions-and-runs.md#invariants).
40
+ - Harness memory and refinement: [08 Memory and history](../architecture/08-memory-and-history.md), [05 Refinement](../architecture/05-refinement.md).
41
+ - Peer comparisons: [Tools](arms/02-tools.md), [Subagents](arms/03-subagents.md), [Memory](arms/06-memory.md), [Execution](arms/08-execution.md), [Observability](arms/09-observability.md), [wide comparison matrix](arms/00-matrix.md).
42
+ - Source inventories: [OpenHands](sources/openhands.md), [OMP](sources/omp.md), [SWE-agent](sources/swe-agent.md), [OpenCode](sources/opencode.md).
@@ -0,0 +1,123 @@
1
+ # Cross-arm comparison insights
2
+
3
+ Standing conclusions from the arm audits (arms 01–10, `docs/study/arms/`).
4
+ Each insight cites the arm that backs it. These are the ideas with the highest
5
+ leverage for designing this harness; per-action items live in `roadmap.md`.
6
+
7
+ ## 1. Everyone rebuilt the same five-layer architecture
8
+
9
+ Prompt assembly, tool registry + gate, subagent machinery, compaction/context,
10
+ and durable records appeared independently in opencode, omp, dsh, harness² and
11
+ ours — with the same *problems*, not the same *solutions* (arms 01–06, 08–09).
12
+ The design space is covered; the interesting work is picking positions per
13
+ layer, not inventing layers. Harness² even distributes the same c1–c8 component
14
+ taxonomy across substrates (`external/harness2/harness2/core/prompts.py:424-431`)
15
+ that this harness independently uses for its trees — and this harness's
16
+ `src/refine/` is a documented port of harness² (arm 10). Convergence is
17
+ evidence both directions were right.
18
+
19
+ ## 2. The stable prefix is an invariant, dynamic content is a protocol
20
+
21
+ Four projects converge hard: keep system prompt byte-stable; put changing state
22
+ into *appended*, dated, superseding messages (omp user-turn reminder
23
+ `date-cwd-reminder.ts:44-48`; dsh "Current runtime context… supersedes earlier"
24
+ snapshot `system-prompt/src/index.ts:314-318`; opencode instruction deltas
25
+ between history and the prompt; ours: `xingular-context`). The subtle
26
+ engineering is where volatile values may NOT live (omp: a tail date line
27
+ invalidated the whole tool array). Never place date/cwd/workspace state in the
28
+ prefix; never rewrite sections in place (arm 01, A1).
29
+
30
+ ## 3. There are only three sincere answers to "who contributed this prompt text"
31
+
32
+ (a) **Declaration with an ordering contract** (dsh: numeric order → name ties,
33
+ duplicate names throw, scoped shadowing, `complete` replacement) — most
34
+ legible for caching and reasoning;
35
+ (b) **Ability/extension slots** (omp capabilities; opencode internal tools +
36
+ tool hooks) — most permissive;
37
+ (c) **A validated tree** (ours c1–c8; harness² tree files with machine
38
+ validation) — most durable, at the cost of pipeline ceremony.
39
+ Any addition to our prompt surface should strengthen (a)'s contract or (c)'s
40
+ machines, never invent a fourth pattern. When a plugin contributes a section,
41
+ deterministic ordering and duplicate rejection belong to the compiler
42
+ (`src/prompt/compile.ts`), not to plugin scheduling (arm 01, A2).
43
+
44
+ ## 4. Tool interfaces are where public instruction lives
45
+
46
+ All sources push "how to use this" into tool descriptions and keep the system
47
+ prompt shorter. Where that text lives differs: inline strings (opencode),
48
+ static md templates (omp: "Prompts never in code"), fully erased behind a
49
+ generated SDK (dsh's PTC), whole prose files (claude-code's TODOWRITE
50
+ descendant in opencode `todowrite.txt`). For this harness, md-template
51
+ descriptions are the highest leverage per line changed: reviewable diffs,
52
+ `{product}` interpolation stays (arm 02, A3).
53
+
54
+ ## 5. Gate taxonomies converge on *tiers × per-call decisions*
55
+
56
+ read/write/exec tier declarations + per-call allow/deny/ask outcomes +
57
+ fail-closed defaults, expressed as tiers (omp), per-leaf asserts (opencode),
58
+ pipeline events (dsh) or a final gate (ours). Two universals worth canonizing
59
+ here: **policy missing ⇒ ask**, and **one-time escalations with audit trails**
60
+ (dsh sandbox escalation ≈ our single-use approvals). Hooks may *advise*;
61
+ neither hooks nor tools *decide* (arm 07, G2).
62
+
63
+ ## 6. Subagent geometry: fresh children, explicit delivery, no forks
64
+
65
+ Inheritance of parent history into children is rare (only dsh's explicit
66
+ `fork`; omp/ours/claude-code/opencode default fresh). Delivery splits between
67
+ block-on-result (simpler, slower), background + never-poll instruction
68
+ (opencode), and receipts with automatic delivery (ours). Depth and capacity
69
+ defaults (8 active / depth 1 dsh) are good calibrations. dsh's `fork` is the
70
+ one mechanism worth studying further but the anti-pattern posture ("no more
71
+ capabilities than you") should stay (arm 03).
72
+
73
+ ## 7. Compaction is a strategy ladder, not a single pass
74
+
75
+ Trigger at a formula of the window; prune oversized tool outputs first;
76
+ summarize to a fixed, named template; keep a verbatim tail checkpoint; retry
77
+ down-scaled on provider rejection; log usage at the anchor + estimates beyond.
78
+ The distinctive frontier is opencode's whole-transcript-to-summarizer-for-
79
+ cache-reuse against omp's deterministic, no-LLM archive rung (snapcompact) —
80
+ an SRE-quality safety net no other source has. For this harness: adopt the
81
+ shape and invariants; do not adopt the machinery (arm 05, C1–C3).
82
+
83
+ ## 8. Memory products are files with contracts, not databases
84
+
85
+ Where memory is model-facing, it is a file (`MEMORY.md`, our Wiki, harness²'s
86
+ `LongTermMEMORY.md`) with caps, a lesson shape (cue/lesson, never task facts)
87
+ and redaction; where memory is engine-facing (mnemopi's `memory://`), it is an
88
+ optional accelerator, never the source of truth. dsh deliberately ships *no*
89
+ memory package — durability only (JSONL session log + todos + spill). The
90
+ difference between them is one offer: "does the next session need to behave
91
+ differently?" (arm 06, M1).
92
+
93
+ ## 9. Measurement has exactly one defensible home inside the harness: after selection, decoupled
94
+
95
+ harness²'s judge reads only the chosen run, never feeds selection, fails to
96
+ None, and is excluded from denominators (`judge.py:15-19,37-40`). omp puts a
97
+ judgment role next to subagents; our family places measurement in Evaluation.
98
+ The adoptable principle is the *decoupling shape*, whatever module ends up
99
+ owning the measurement (arm 10, R4 — decide layering before porting).
100
+
101
+ ## 10. Editorial discipline is a competitive feature
102
+
103
+ harness² turns prompt-writing conventions into machine validation: unnamed
104
+ skills discarded, template braces rejected, unshipped scripts rejected,
105
+ always-on prose priced by output budget ("ALWAYS-ON PROSE IS THE EXPENSIVE
106
+ OPTION", `prompts.py:129-146`). omp similarly: prompts never in code, model
107
+ policy never code (KDL tables), one JSON judge-questions file per feature.
108
+ This harness already validates trees; the opportunity is extending
109
+ validation to prompt-behavior contracts spotted above (trigger lines, delta
110
+ protocols, tier coverage) rather than more prose (arms 01, 02, 04, 10).
111
+
112
+ ## 11. Anti-patterns known across sources
113
+
114
+ - Instruction discovery with no caps (opencode AGENTS.md walk) — unbounded cost
115
+ drift into sessions.
116
+ - Model-conditional code (`id.includes("claude")`-style) — omp bans it; policy
117
+ belongs in tables (omp KDL; opencode's per-model prompt plugins are the
118
+ hook-flavored equivalent).
119
+ - Any module that can rewrite its own pending tool call (claude-code
120
+ PreToolUse mutation, harness² plugin `tool` registration for *capability
121
+ edits* mid-run needs trust gating we already have for c8).
122
+ - Polling loops from the model (opencode had to say "DO NOT sleep, poll" in
123
+ the spawn tool description; ours prevents it structurally with receipts).