@xingular/harness 0.1.6 → 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 (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  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 +1170 -62
  373. package/docs/README.md +34 -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-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,90 @@
1
+ # Arm 05 — Context management
2
+
3
+ Status: **core three audited** (opencode, omp, dsh); smolagents skeleton;
4
+ ours=pending inventory beyond contracts; claude-code/openhands pending.
5
+
6
+ ## Design space
7
+
8
+ What is sent per turn vs fetched on demand; compaction triggers and strategies;
9
+ where summarization sits relative to the cache; truncation of tool outputs;
10
+ token accounting granularity (uncached input / cache read+write separation).
11
+
12
+ ## Comparison
13
+
14
+ **this harness (contracts).** Stable system prefix + hidden `xingular-context`
15
+ native-history message for changing state; usage accounting: `inputTokens` is
16
+ uncached input, cache reads/writes separate, reasoning inside output,
17
+ `usage.updated` cumulative per run (repo contracts). Compaction story pending
18
+ inventory (whether sessions rely on Pi native history management + context
19
+ updates).
20
+
21
+ **opencode — summarizer as a resident agent.** Triggers: `auto` when estimated
22
+ context ≥ ceiling (window − max(15%, 16k) reserve), `overflow` after provider
23
+ rejection, `manual` (`.../session/compaction.ts:53-57,93-101,849-856`); auto
24
+ skips until a fresh provider measurement exists (`:245-253`).
25
+ Strategy: a dedicated compaction agent/model summarizes every dialog into a
26
+ **fixed template** (Objective / Requirements / Decision / Work State / Next
27
+ Move / Relevant Files) while keeping the newest `keep` tokens verbatim as a
28
+ `<conversation-checkpoint>`; **the whole conversation is sent to the
29
+ summarizer to reuse the prefix cache** (`:107-138,256-332`). Rejection retries
30
+ at 70/50/35% of the rejected size (`:455-461`). Generic ToolOutput truncation to
31
+ maxLines/maxBytes with `metadata.truncated`
32
+ (`.../core/src/tool-output.ts:28-88`); shell saves full output to a file and
33
+ returns a bounded tail (`.../tool/plugin/shell.ts:42-43`).
34
+ Accounting: latest assistant response is the anchor
35
+ (`input+cacheRead+cacheWrite+output+reasoning` measured) plus an estimate of
36
+ unmeasured since (`:812-842`); 4 chars/token estimate ±15%
37
+ (`.../session/model-request.ts:53-54`).
38
+
39
+ **omp — the strategy ladder + deterministic frontier.** Trigger points: post-turn
40
+ over `resolveThresholdTokens`, mid-turn, idle, overflow-recovery
41
+ (`.../session/session-maintenance.ts:626,2147,2246,2412`).
42
+ `compaction.methodOrder` ladder: LLM summarize (regular/handoff), `shake`
43
+ (local mechanical elision to `artifact://` refs), `snapcompact`
44
+ (`docs/compaction.md:202-215`). **Snapcompact is local/deterministic, no LLM**:
45
+ discarded history serialized with per-result caps into provider-aware PNG
46
+ bitmap frames (typography per provider family), persisted and re-attached each
47
+ rebuild (`packages/snapcompact/README.md:3-29,44-68`). Budgets: kept context
48
+ ≤60% of threshold, target ≤80% (`docs/compaction.md:217,221`). Cache care:
49
+ pruning blanks outputs only within the model's `prompt-cache-lookback`
50
+ (`docs/compaction.md:248`); summaries drop whole call/result pairs (`:250`).
51
+ Byte-stable system prompt between turns is an invariant
52
+ (`.../session/agent-session.ts:2607`).
53
+
54
+ **dsh — formulas + query-ability.** `compaction-basic` trigger:
55
+ `floor(min(W×0.8, W−O−headroom))`, headroom 65_536, keeps newest 16% of the
56
+ usable window, one extra model request, summary-only retention
57
+ (`.../packages/compaction/compaction-basic/README.md:12,32,62-68`).
58
+ Oversized tool results pruned first; images offloaded to placeholders
59
+ (`.../packages/compaction/README.md:31-32`). `session-query` = SQLite FTS5
60
+ full-text search over the durable log, independent of compaction
61
+ (`.../packages/session-query/README.md:12,30`).
62
+
63
+ **smolagents.** `AgentMemory` is a step log (ToolCall/ActionStep/PlanningStep/
64
+ FinalAnswer) rebuilt to messages with `summary_mode` each step — replay-style,
65
+ no incremental fades (`external/smolagents/src/smolagents/memory.py:25,46,92,206-229`).
66
+
67
+ ## Trade-offs
68
+
69
+ - **Summarizer economics.** opencode sends the *whole transcript* to the
70
+ summarizer to reuse the prefix cache — larger paid input per compression, but
71
+ cache-discounted and higher-fidelity. dsh keeps only the summary (cheapest
72
+ retention). The choice hinges on whether compaction runs once or repeatedly.
73
+ - **A deterministic rung is the safety net.** omp's ladder means a compaction
74
+ never fully depends on a slow/failing LLM pass (shake/snapcompact). That
75
+ resilience has no counterpart in opencode/dsh (dsh retries on overflow).
76
+ - **Searching beats re-shipping.** dsh's session-query (and omp's shard
77
+ omp's shard-style retrieval in `shake`) treat old context as a database, not a
78
+ transcript; "retrieve details through tools when needed" matches our
79
+ CONTEXT_GUIDANCE wording (`src/prompt/compile.ts:333`).
80
+ - **Accounting honesty.** opencode's anchor-measured + estimated-elsewhere and
81
+ our uncached/cached split are compatible; the 4-chars/token estimate is the
82
+ common fixed-density fallback (dsh token-meter identical semantics).
83
+
84
+ ## Adoption candidates
85
+
86
+ | # | Idea | From | Land as | Tier |
87
+ |---|---|---|---|---|
88
+ | C1 | A fixed-template summary shape (named sections) for any summarization run, so restored context is predictable and diffable | opencode compaction template | refine/trajectory or session docs; needs Pi-native compaction knowledge first | T2 verify-first |
89
+ | C2 | Prune-first ordering (oversized tool outputs) before any summarization | dsh + omp | facet of the context update path | T2 verify-first (what already trims?) |
90
+ | C3 | Keep a verbatim tail checkpoint marker in any summary | opencode | same home as C1 | T2 |
@@ -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).