@xingular/harness 1.0.0 → 1.2.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 (397) hide show
  1. package/CHANGELOG.md +46 -5
  2. package/README.md +75 -21
  3. package/dist/cli.js +17421 -8711
  4. package/dist/sdk/accounts/accounts.d.ts +27 -3
  5. package/dist/sdk/accounts/accounts.js +78 -24
  6. package/dist/sdk/accounts/secrets.d.ts +12 -0
  7. package/dist/sdk/accounts/secrets.js +114 -7
  8. package/dist/sdk/accounts/store.d.ts +26 -1
  9. package/dist/sdk/accounts/store.js +1 -1
  10. package/dist/sdk/agents/builtin.d.ts +2 -0
  11. package/dist/sdk/agents/builtin.js +48 -0
  12. package/dist/sdk/agents/narrow.d.ts +13 -0
  13. package/dist/sdk/agents/narrow.js +29 -0
  14. package/dist/sdk/agents/planResearch.d.ts +5 -0
  15. package/dist/sdk/agents/planResearch.js +19 -0
  16. package/dist/sdk/agents/profiles.d.ts +81 -0
  17. package/dist/sdk/agents/profiles.js +226 -0
  18. package/dist/sdk/annotations/bridge.d.ts +42 -0
  19. package/dist/sdk/annotations/bridge.js +264 -0
  20. package/dist/sdk/annotations/capture.d.ts +116 -0
  21. package/dist/sdk/annotations/capture.js +308 -0
  22. package/dist/sdk/annotations/delivery.d.ts +72 -0
  23. package/dist/sdk/annotations/delivery.js +130 -0
  24. package/dist/sdk/annotations/inspect.d.ts +10 -0
  25. package/dist/sdk/annotations/inspect.js +33 -0
  26. package/dist/sdk/annotations/isolated.d.ts +6 -0
  27. package/dist/sdk/annotations/isolated.js +51 -0
  28. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  29. package/dist/sdk/annotations/pageScript.js +871 -0
  30. package/dist/sdk/annotations/part.d.ts +10 -0
  31. package/dist/sdk/annotations/part.js +155 -0
  32. package/dist/sdk/annotations/queue.d.ts +4 -0
  33. package/dist/sdk/annotations/queue.js +40 -0
  34. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  35. package/dist/sdk/annotations/serverMethods.js +62 -0
  36. package/dist/sdk/annotations/store.d.ts +167 -0
  37. package/dist/sdk/annotations/store.js +394 -0
  38. package/dist/sdk/browser/backend.d.ts +16 -0
  39. package/dist/sdk/browser/backend.js +17 -0
  40. package/dist/sdk/browser/contracts.d.ts +19 -0
  41. package/dist/sdk/browser/contracts.js +116 -0
  42. package/dist/sdk/browser/index.d.ts +14 -3
  43. package/dist/sdk/browser/index.js +11 -4
  44. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  45. package/dist/sdk/browser/serverMethods.js +7 -0
  46. package/dist/sdk/browser/session.d.ts +1 -0
  47. package/dist/sdk/browser/session.js +45 -9
  48. package/dist/sdk/browser/tools.d.ts +1 -4
  49. package/dist/sdk/browser/tools.js +14 -91
  50. package/dist/sdk/cli.js +24 -15
  51. package/dist/sdk/commands/list.d.ts +3 -0
  52. package/dist/sdk/commands/list.js +75 -0
  53. package/dist/sdk/commands/registry.d.ts +250 -0
  54. package/dist/sdk/commands/registry.js +47 -0
  55. package/dist/sdk/commands/routes.d.ts +16 -0
  56. package/dist/sdk/commands/routes.js +33 -0
  57. package/dist/sdk/core/bus.js +1 -1
  58. package/dist/sdk/core/commandBudget.d.ts +23 -0
  59. package/dist/sdk/core/commandBudget.js +57 -0
  60. package/dist/sdk/core/env.d.ts +1 -1
  61. package/dist/sdk/core/env.js +1 -1
  62. package/dist/sdk/core/index.js +17 -1
  63. package/dist/sdk/core/interactiveProfile.d.ts +46 -0
  64. package/dist/sdk/core/interactiveProfile.js +143 -0
  65. package/dist/sdk/core/workspace.d.ts +13 -0
  66. package/dist/sdk/core/workspace.js +88 -0
  67. package/dist/sdk/core/workspaceBashTool.d.ts +4 -0
  68. package/dist/sdk/core/workspaceBashTool.js +36 -0
  69. package/dist/sdk/core/workspaceSandbox.d.ts +31 -0
  70. package/dist/sdk/core/workspaceSandbox.js +320 -0
  71. package/dist/sdk/core/workspaceWriteOperations.d.ts +22 -0
  72. package/dist/sdk/core/workspaceWriteOperations.js +206 -0
  73. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  74. package/dist/sdk/doctor/serverMethods.js +8 -0
  75. package/dist/sdk/doctor/types.d.ts +2 -2
  76. package/dist/sdk/harness.d.ts +22 -0
  77. package/dist/sdk/harness.js +84 -5
  78. package/dist/sdk/history/recall.js +8 -8
  79. package/dist/sdk/history/serverMethods.d.ts +3 -0
  80. package/dist/sdk/history/serverMethods.js +8 -0
  81. package/dist/sdk/hub/cli.d.ts +1 -1
  82. package/dist/sdk/hub/cli.js +1 -1
  83. package/dist/sdk/hub/schema.d.ts +1 -1
  84. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  85. package/dist/sdk/hub/serverMethods.js +11 -0
  86. package/dist/sdk/index.d.ts +16 -1
  87. package/dist/sdk/index.js +10 -0
  88. package/dist/sdk/mcp/connections.js +14 -7
  89. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  90. package/dist/sdk/mcp/serverMethods.js +22 -0
  91. package/dist/sdk/pi/runtime.d.ts +2 -1
  92. package/dist/sdk/pi/runtime.js +2 -2
  93. package/dist/sdk/plugins/builtin.d.ts +1 -0
  94. package/dist/sdk/plugins/builtin.js +145 -33
  95. package/dist/sdk/plugins/builtinRegistry.d.ts +60 -0
  96. package/dist/sdk/plugins/builtinRegistry.js +71 -0
  97. package/dist/sdk/plugins/catalogue.js +2 -1
  98. package/dist/sdk/plugins/cli.d.ts +1 -1
  99. package/dist/sdk/plugins/cli.js +4 -3
  100. package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
  101. package/dist/sdk/plugins/commandPrefix.js +21 -0
  102. package/dist/sdk/plugins/firstParty.d.ts +1 -1
  103. package/dist/sdk/plugins/firstParty.js +8 -2
  104. package/dist/sdk/plugins/inventory.js +4 -3
  105. package/dist/sdk/plugins/manifest.d.ts +2 -0
  106. package/dist/sdk/plugins/manifest.js +2 -1
  107. package/dist/sdk/plugins/surfaces.d.ts +5 -0
  108. package/dist/sdk/plugins/surfaces.js +11 -0
  109. package/dist/sdk/plugins/types.d.ts +15 -0
  110. package/dist/sdk/prompt/compile.d.ts +19 -2
  111. package/dist/sdk/prompt/compile.js +79 -26
  112. package/dist/sdk/prompt/standard.d.ts +17 -0
  113. package/dist/sdk/prompt/standard.js +21 -0
  114. package/dist/sdk/refine/cli.d.ts +1 -1
  115. package/dist/sdk/refine/cli.js +2 -2
  116. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  117. package/dist/sdk/refine/serverMethods.js +20 -0
  118. package/dist/sdk/server/methods.js +27 -86
  119. package/dist/sdk/server/params.d.ts +4 -0
  120. package/dist/sdk/server/params.js +11 -0
  121. package/dist/sdk/server/remote.js +36 -11
  122. package/dist/sdk/sessions/compactionCheckpoint.d.ts +11 -0
  123. package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
  124. package/dist/sdk/sessions/continuation.d.ts +3 -0
  125. package/dist/sdk/sessions/continuation.js +5 -1
  126. package/dist/sdk/sessions/contracts.d.ts +185 -0
  127. package/dist/sdk/sessions/contracts.js +101 -4
  128. package/dist/sdk/sessions/control.d.ts +72 -0
  129. package/dist/sdk/sessions/control.js +158 -0
  130. package/dist/sdk/sessions/initialBash.d.ts +7 -0
  131. package/dist/sdk/sessions/initialBash.js +7 -0
  132. package/dist/sdk/sessions/planMode.d.ts +18 -4
  133. package/dist/sdk/sessions/planMode.js +82 -16
  134. package/dist/sdk/sessions/reasoningSummaries.d.ts +2 -2
  135. package/dist/sdk/sessions/reasoningSummaries.js +3 -3
  136. package/dist/sdk/sessions/registry.d.ts +2 -1
  137. package/dist/sdk/sessions/registry.js +6 -3
  138. package/dist/sdk/sessions/runIndex.js +7 -7
  139. package/dist/sdk/sessions/runStore.d.ts +14 -0
  140. package/dist/sdk/sessions/runStore.js +38 -1
  141. package/dist/sdk/sessions/runner.d.ts +40 -2
  142. package/dist/sdk/sessions/runner.js +163 -15
  143. package/dist/sdk/sessions/sessions.d.ts +40 -8
  144. package/dist/sdk/sessions/sessions.js +279 -27
  145. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  146. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  147. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  148. package/dist/sdk/sessions/sideQuestions.js +290 -0
  149. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  150. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  151. package/dist/sdk/sessions/subagentService.d.ts +22 -2
  152. package/dist/sdk/sessions/subagentService.js +93 -16
  153. package/dist/sdk/sessions/subagents.d.ts +9 -1
  154. package/dist/sdk/sessions/subagents.js +19 -0
  155. package/dist/sdk/sessions/workSlice.d.ts +103 -0
  156. package/dist/sdk/sessions/workSlice.js +297 -0
  157. package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
  158. package/dist/sdk/sessions/workspaceBoundary.js +46 -0
  159. package/dist/sdk/terminal/browser.d.ts +62 -0
  160. package/dist/sdk/terminal/browser.js +41 -0
  161. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  162. package/dist/sdk/terminal/browserControl.js +187 -0
  163. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  164. package/dist/sdk/terminal/commandHelp.js +20 -0
  165. package/dist/sdk/terminal/controller.d.ts +15 -1
  166. package/dist/sdk/terminal/controller.js +67 -8
  167. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  168. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  169. package/dist/sdk/terminal/opentui/theme.d.ts +43 -0
  170. package/dist/sdk/terminal/opentui/theme.js +87 -0
  171. package/dist/sdk/terminal/piExtension.d.ts +6 -1
  172. package/dist/sdk/terminal/piExtension.js +169 -84
  173. package/dist/sdk/terminal/socket.d.ts +6 -3
  174. package/dist/sdk/terminal/socket.js +40 -9
  175. package/dist/sdk/terminal/standalone.d.ts +9 -0
  176. package/dist/sdk/terminal/standalone.js +118 -19
  177. package/dist/sdk/terminal/subagentMonitor.d.ts +47 -0
  178. package/dist/sdk/terminal/subagentMonitor.js +152 -0
  179. package/dist/sdk/terminal/terminals.d.ts +60 -7
  180. package/dist/sdk/terminal/terminals.js +598 -47
  181. package/dist/sdk/terminal/trajectory.js +2 -2
  182. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  183. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  184. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -1
  185. package/dist/sdk/terminal/tui/commandPages.js +57 -6
  186. package/dist/sdk/terminal/tui/commands.d.ts +10 -4
  187. package/dist/sdk/terminal/tui/commands.js +269 -65
  188. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +2 -2
  189. package/dist/sdk/terminal/tui/dialogGeometry.js +4 -2
  190. package/dist/sdk/terminal/tui/dialogs.d.ts +6 -1
  191. package/dist/sdk/terminal/tui/dialogs.js +9 -2
  192. package/dist/sdk/terminal/tui/list.d.ts +14 -1
  193. package/dist/sdk/terminal/tui/list.js +96 -14
  194. package/dist/sdk/terminal/tui/modelPicker.js +1 -6
  195. package/dist/sdk/terminal/tui/page.d.ts +3 -0
  196. package/dist/sdk/terminal/tui/pageOverlay.js +27 -7
  197. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +26 -4
  198. package/dist/sdk/terminal/tui/pages/accountsPage.js +264 -36
  199. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  200. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  201. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  202. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  203. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  204. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  205. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +2 -0
  206. package/dist/sdk/terminal/tui/pages/doctorPage.js +103 -15
  207. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  208. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  209. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +0 -5
  210. package/dist/sdk/terminal/tui/pages/pluginsPage.js +9 -3
  211. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +8 -0
  212. package/dist/sdk/terminal/tui/pages/settingsPage.js +16 -1
  213. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
  214. package/dist/sdk/terminal/tui/pages/subagentsPage.js +152 -0
  215. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +12 -5
  216. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +156 -83
  217. package/dist/sdk/terminal/tui/pages/usagePage.d.ts +43 -0
  218. package/dist/sdk/terminal/tui/pages/usagePage.js +370 -0
  219. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  220. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  221. package/dist/sdk/terminal/tui/piAdapter.d.ts +1 -2
  222. package/dist/sdk/terminal/tui/piAdapter.js +3 -5
  223. package/dist/sdk/terminal/tui/planMode.d.ts +1 -1
  224. package/dist/sdk/terminal/tui/planMode.js +1 -1
  225. package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
  226. package/dist/sdk/terminal/tui/pluginCommands.js +31 -0
  227. package/dist/sdk/terminal/tui/questions.d.ts +2 -0
  228. package/dist/sdk/terminal/tui/runtime.js +27 -5
  229. package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
  230. package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
  231. package/dist/sdk/terminal/tui/settingsModel.d.ts +2 -0
  232. package/dist/sdk/terminal/tui/settingsModel.js +32 -2
  233. package/dist/sdk/terminal/tui/sideQuestion.d.ts +26 -26
  234. package/dist/sdk/terminal/tui/sideQuestion.js +131 -98
  235. package/dist/sdk/terminal/tui/ui.d.ts +2 -0
  236. package/dist/sdk/terminal/tui/ui.js +1 -0
  237. package/dist/sdk/tools/askUser.js +26 -8
  238. package/dist/sdk/tools/checklist.js +3 -2
  239. package/dist/sdk/tools/checkpoint.d.ts +27 -0
  240. package/dist/sdk/tools/checkpoint.js +154 -0
  241. package/dist/sdk/tools/getCapabilities.d.ts +31 -0
  242. package/dist/sdk/tools/getCapabilities.js +34 -0
  243. package/dist/sdk/tools/harnessTools.d.ts +2 -0
  244. package/dist/sdk/tools/harnessTools.js +1 -1
  245. package/dist/sdk/tools/spawnSubagent.js +14 -4
  246. package/dist/sdk/usage/analytics.d.ts +20 -0
  247. package/dist/sdk/usage/analytics.js +151 -0
  248. package/dist/sdk/usage/ledger.d.ts +38 -0
  249. package/dist/sdk/usage/ledger.js +142 -0
  250. package/dist/sdk/usage/limits/adapters.d.ts +11 -0
  251. package/dist/sdk/usage/limits/adapters.js +349 -0
  252. package/dist/sdk/usage/limits/capture.d.ts +8 -0
  253. package/dist/sdk/usage/limits/capture.js +47 -0
  254. package/dist/sdk/usage/limits/http.d.ts +12 -0
  255. package/dist/sdk/usage/limits/http.js +51 -0
  256. package/dist/sdk/usage/limits/normalize.d.ts +15 -0
  257. package/dist/sdk/usage/limits/normalize.js +211 -0
  258. package/dist/sdk/usage/limits/service.d.ts +30 -0
  259. package/dist/sdk/usage/limits/service.js +176 -0
  260. package/dist/sdk/usage/limits/types.d.ts +65 -0
  261. package/dist/sdk/usage/limits/types.js +1 -0
  262. package/dist/sdk/usage/serverMethods.d.ts +3 -0
  263. package/dist/sdk/usage/serverMethods.js +22 -0
  264. package/dist/sdk/usage/service.d.ts +32 -0
  265. package/dist/sdk/usage/service.js +66 -0
  266. package/dist/sdk/usage/settings.d.ts +7 -0
  267. package/dist/sdk/usage/settings.js +28 -0
  268. package/dist/sdk/usage/types.d.ts +60 -0
  269. package/dist/sdk/usage/types.js +4 -0
  270. package/dist/sdk/web/part.d.ts +10 -0
  271. package/dist/sdk/web/part.js +6 -0
  272. package/dist/sdk/web/serverMethods.d.ts +3 -0
  273. package/dist/sdk/web/serverMethods.js +7 -0
  274. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  275. package/dist/sdk/wiki/serverMethods.js +26 -0
  276. package/dist/sdk/worktrees/cli.d.ts +11 -0
  277. package/dist/sdk/worktrees/cli.js +146 -0
  278. package/dist/sdk/worktrees/copy.d.ts +9 -0
  279. package/dist/sdk/worktrees/copy.js +111 -0
  280. package/dist/sdk/worktrees/git.d.ts +16 -0
  281. package/dist/sdk/worktrees/git.js +81 -0
  282. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  283. package/dist/sdk/worktrees/serverMethods.js +30 -0
  284. package/dist/sdk/worktrees/service.d.ts +73 -0
  285. package/dist/sdk/worktrees/service.js +483 -0
  286. package/dist/sdk/worktrees/setup.d.ts +23 -0
  287. package/dist/sdk/worktrees/setup.js +65 -0
  288. package/dist/sdk/worktrees/types.d.ts +91 -0
  289. package/dist/sdk/worktrees/types.js +1 -0
  290. package/dist/sdk/world/cli.d.ts +2 -2
  291. package/dist/sdk/world/cli.js +6 -6
  292. package/dist/sdk/world/world.d.ts +3 -1
  293. package/dist/sdk/world/world.js +8 -9
  294. package/dist/terminal-opentui.js +16456 -5966
  295. package/dist/terminal-pi.js +1579 -573
  296. package/docs/README.md +22 -2
  297. package/docs/architecture/00-overview.md +28 -16
  298. package/docs/architecture/02-sessions-and-runs.md +184 -25
  299. package/docs/architecture/03-variants.md +10 -2
  300. package/docs/architecture/04-prompt.md +65 -7
  301. package/docs/architecture/06-plugins-and-capabilities.md +57 -4
  302. package/docs/architecture/07-tools-and-gate.md +112 -17
  303. package/docs/architecture/08-memory-and-history.md +4 -2
  304. package/docs/architecture/09-accounts-and-connectors.md +39 -1
  305. package/docs/architecture/10-server-protocol.md +168 -4
  306. package/docs/architecture/11-terminal.md +251 -8
  307. package/docs/architecture/12-storage.md +45 -3
  308. package/docs/architecture/13-world-tools.md +49 -6
  309. package/docs/architecture/14-surfaces-and-parity.md +136 -0
  310. package/docs/architecture/README.md +17 -4
  311. package/docs/architecture/proposals/PROP-0006-run-checklist.md +4 -2
  312. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  313. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  314. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  315. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  316. package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
  317. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  318. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  319. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  320. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  321. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  322. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  323. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  324. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  325. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  326. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  327. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  328. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  329. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  330. package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
  331. package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
  332. package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
  333. package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
  334. package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
  335. package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
  336. package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
  337. package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
  338. package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
  339. package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
  340. package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +247 -0
  341. package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
  342. package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
  343. package/docs/architecture/proposals/README.md +39 -0
  344. package/docs/decisions/ADR-0001-owned-terminal.md +1 -1
  345. package/docs/decisions/ADR-0009-xharness-command.md +6 -5
  346. package/docs/decisions/ADR-0014-public-release-baseline.md +3 -2
  347. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  348. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  349. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  350. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  351. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  352. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  353. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  354. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  355. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  356. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  357. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  358. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  359. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  360. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  361. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  362. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  363. package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
  364. package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +33 -0
  365. package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
  366. package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
  367. package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
  368. package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
  369. package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
  370. package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
  371. package/docs/doctor.md +10 -4
  372. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
  373. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
  374. package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
  375. package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
  376. package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
  377. package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
  378. package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
  379. package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
  380. package/docs/features/README.md +26 -0
  381. package/docs/features/interfaces/README.md +1 -1
  382. package/docs/future-work.md +48 -0
  383. package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
  384. package/docs/parity.md +134 -0
  385. package/docs/releases/1.0.0.md +2 -2
  386. package/docs/releases/1.1.1.md +28 -0
  387. package/docs/releases/1.2.0.md +49 -0
  388. package/docs/releases/4.0.0.md +47 -0
  389. package/docs/releases/README.md +37 -27
  390. package/docs/study/00-index.md +8 -0
  391. package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
  392. package/docs/study/autonomous-engineering-sources.md +277 -0
  393. package/docs/study/autonomy-sources.md +147 -0
  394. package/docs/study/proactive-autonomy.md +408 -0
  395. package/docs/study/tui-resource-browser.md +78 -0
  396. package/docs/terminal-tui.md +386 -113
  397. package/package.json +6 -5
@@ -1,6 +1,6 @@
1
1
  # Harness architecture specification
2
2
 
3
- **Status:** binding. **As of:** 2026-10-21, checked against `src/` on branch `harness2`.
3
+ **Status:** binding. **As of:** 2026-10-26, checked against `src/` on branch `release/1.0.0`.
4
4
 
5
5
  This folder is the core specification of `@xingular/harness`. Code must conform to it. A change
6
6
  that would alter what it says needs a proposal the user approves first (see
@@ -41,6 +41,7 @@ not one class (a set of functions in one module, say), it says so.
41
41
  | [11 Terminal](11-terminal.md) | The Harness-owned terminal frontend and its process boundary | `INV-TUI` |
42
42
  | [12 Storage](12-storage.md) | The data root and state directory, and who writes what | `INV-STO` |
43
43
  | [13 World tools](13-world-tools.md) | Generic web and isolated browser backends, host boundary and diagnostics | — |
44
+ | [14 Surfaces and parity](14-surfaces-and-parity.md) | Every capability is a Harness capability with a terminal surface; host-backed capabilities; host-only surfaces | `INV-PAR` |
44
45
  | [Proposals](proposals/README.md) | Architecture change proposals and their status | — |
45
46
 
46
47
  Related records, not binding by themselves:
@@ -57,11 +58,14 @@ Related records, not binding by themselves:
57
58
 
58
59
  ## Glossary
59
60
 
60
- These words are used the same way on every page, in code and in the data layout.
61
+ These words are used the same way across architecture pages and, for implemented concepts, in code
62
+ and the data layout. Terms marked as planned are future vocabulary only; they do not describe
63
+ current behavior.
61
64
 
62
65
  | Word | Meaning |
63
66
  |---|---|
64
67
  | **Foundation** | The fixed half of the harness: code and invariants that no edit, improver or adoption can change. Changes by release, and by proposal when a contract moves. |
68
+ | **Agent Mode** | A planned foundation-level work style, with at most one mode active at a time. Plugins remain independently stackable contributions. This is distinct from plan mode and existing `mode` fields; it is not a runtime contract ([FW-0001](../future-work.md#fw-0001-agent-modes-starting-with-router-agent-mode)). |
65
69
  | **Variant** | The mutating half: one tree of eight components (c1–c8) for one scope. Formerly "harness tree". |
66
70
  | **Component** | One of c1–c8 inside a variant (system prompt, guardrails, memory, tool guidance, subagents, skills, scripts, plugins). |
67
71
  | **Surface** | The foundation's definition of what a variant may contain (`PI_SURFACE`): paths, patterns, the always-on cap. |
@@ -106,9 +110,18 @@ proposal, or a correction to the other document).
106
110
  | D-1 | `AGENTS.md` (before this spec), `INV-RUN-6` | The old rule said only `sessions/runStore.ts` writes `runs/<id>/`. In code, four other harness modules also write side files there: `prompt/compile.ts` (`context.json`), `sessions/sessions.ts` (`caller.json`), `capabilities/runSnapshot.ts` (`capabilities.json`), `mcp/service.ts` (`mcp-context.json`). The spec states the rule the code keeps (see `INV-RUN-6`); whether to route all of them through `runStore.ts` is open. |
107
111
  | D-2 | `README.md` "Plugins" | Describes a `plugin_propose` tool and an Inbox for proposed plugins. No such tool exists in `src/`. |
108
112
  | D-3 | `README.md` "External curation" | Describes `externalMaintenance`, `vaultAccess`, `MAINTENANCE_PLUGIN`, `maintenance.*` methods and tools. None exist in `src/`. |
109
- | D-4 | `INV-BND-2` | Several names carry an application's name: the context message type `xingular-context`, the approval extension `xagent-approvals`, the MCP client name `xagent`, and the terminal commands `xagent-wiki` / `xagent-mcp`. The default product name `Xingular Harness` is allowed; these are not. |
110
- | D-5 | `INV-BND-2` | `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts. They are stored and returned, never read, and are documented as the application's fields. |
113
+ | D-4 | `INV-BND-2` | Several names carry an application's name: the context message type `xingular-context`, the approval extension `xagent-approvals`, the MCP client name `xagent`, and the terminal commands `xagent-wiki` / `xagent-mcp`. The default product name `Xingular Agent` is allowed; these are not. |
114
+ | D-5 | `INV-BND-2` | `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts. They are stored and returned, never read, and are documented as the application's fields. Since PROP-0016 (2026-10-23) `worktreeId` has Harness meaning when it names a registered worktree; only `handoffId` remains an application field. |
111
115
  | D-6 | `INV-BND-2` | Plan-mode instructions (`sessions/planMode.ts`) name a managed browser and computer controls, which the harness does not provide. |
112
116
  | D-7 | `INV-MEM-3` | `wiki/notes.ts::remove` keeps a version but does not call `noteChange`, so hooks hear saves but not removals. |
113
117
  | D-8 | old `AGENTS.md` | Listed `work` among the sections delivered as updates. The compiler's built-in dynamic sections are only `references` and `wiki`; `work` is dynamic only when the application marks it so. `INV-PRM-3` states the code's rule. |
114
118
  | D-9 | World/browser implementation | Resolved for the 1.0.0 candidate by PROP-0012/ADR-0014 and page 13: the Harness owns a generic isolated browser; App browser UI, tab sharing and computer integration remain with the host. |
119
+ | D-10 | OpenTUI skill completion | At the start of PROP-0013, documentation claimed skill completion, but OpenTUI only rendered slash-command completions. The skill helper had no frontend caller. PROP-0013 explicitly resolves this drift. |
120
+ | D-11 | `INV-RUN-5`, unattended approval and question paths | Source inspection on 2026-10-23 found that `SessionRunInput.automatic` disables resource discovery and extension dialogs (`sessions/runner.ts:574`), but the general gate does not receive that flag. `Sessions.gate` explicitly refuses approvals for `probe`, `improver` and `reflection` triggers, then otherwise calls `requestApproval` (`sessions/sessions.ts:198`). `ask_user` was also constructed independently of `automatic` when harness tools were enabled (`sessions/sessions.ts:397`, `tools/askUser.ts:69`). That question-tool gap is resolved for newly resolved runs by PROP-0022/ADR-0022 (2026-10-24); an unattended continuation of a run pinned with that tool is rejected. Thus the flag alone does not establish the invariant that every unattended run refuses human interaction; host policy and capability selection can narrow these paths. This is a static source finding, not a live reproduction. See [proactive autonomy research](../study/proactive-autonomy.md#current-foundation-and-the-missing-loop). |
121
+ | D-12 | 12-storage layout | The isolated browser keeps device-local profiles and settings under `<state dir>/browser/` (`browser/config.ts`, `browser/session.ts`); page 12's layout did not list it. Resolved 2026-10-23: page 12 lists it. |
122
+ | D-13 | `docs/study/feature-gap-review.md` row 8 | Says browser and computer interaction are not built in. Page 13 (PROP-0012) records a generic isolated browser in the foundation; computer interaction needs a host surface. |
123
+ | D-14 | 12-storage layout | Page 12 lists browser settings under `<state dir>/browser/`, while `browser/config.ts` stores configuration in `<state dir>/browser.json`; browser profiles and downloads use the `browser/` directory. The layout needs an owner decision before either side is changed. |
124
+ | D-15 | Terminal sketch verification status — resolved 2026-10-24 by PROP-0028 | Pages 11 and 14 and `terminal-tui.md` said connected-sketch implementation verification was pending, while retained PTY evidence and PAR-014 recorded it as verified. Updated the docs to distinguish deterministic fixture verification from owner visual acceptance, every-emulator rendering and live-model sketch quality. |
125
+ | D-16 | Terminal slash-command highlighting — resolved 2026-10-24 | `terminal-tui.md` specified accent coloring for recognized leading commands while typing, but the OpenTUI composer only styled attachment labels. User-message bubbles also lacked command-token styling. The renderer now uses the active command registry for both surfaces. |
126
+ | D-17 | `PROP-0039`, `ADR-0036`, `INV-GATE-3/8` | Implementation is in progress in the 1.2.0 worktree: native writes revalidate canonical targets and atomically replace files under an OS write scope; default Bash fails closed on external hard-link aliases and runs in a sandbox that prevents new cross-boundary links; outside-scope Bash requires approval before one execution and command output never triggers approval or replay. The filesystem root is rejected as a workspace, and approval details expose the complete command. Launcher selection uses fixed system paths. Same-user peer processes remain outside this boundary. Focused macOS tests, full Harness CI, App compatibility checks, and PTY verification at 40x20, 80x24, and 100x30 pass. Linux sandbox integration remains unverified locally because this Darwin host has no `bwrap` and Colima is stopped; both CI workflows now install bubblewrap and `scripts/ci.sh` fails if it is absent, but an Ubuntu run is still required. No candidate, tag, or publication exists. |
127
+ | D-18 | `core/index.ts` migration 5 | The `run_stats` table has no writer in the Harness. PROP-0042's `usage_requests` ledger is the analytics source; whether to drop the older table is open. |
@@ -3,7 +3,7 @@ id: PROP-0006
3
3
  title: A run checklist the model writes, recorded as a run event
4
4
  status: Implemented
5
5
  created: 2026-10-22
6
- updated: 2026-10-22
6
+ updated: 2026-10-24
7
7
  affects: [02-sessions-and-runs.md, 06-plugins-and-capabilities.md, 07-tools-and-gate.md, 10-server-protocol.md]
8
8
  ---
9
9
 
@@ -41,7 +41,9 @@ Gap #2 of `docs/study/feature-gap-review.md`.
41
41
  where public instruction lives" (study insight 4).
42
42
  - New built-in plugin `checklist` declares the tool.
43
43
  - `checklistOf(events)` projects the latest list; the server exposes it as `runs.checklist`.
44
- - Terminal sessions do not get the tool yet.
44
+ - Terminal sessions do not get the tool yet. (Update 2026-10-24: they do now; the terminal
45
+ extension registers the same tool, records it through `checklist` telemetry and renders each
46
+ write as a checklist block. See `docs/parity.md` PAR-001.)
45
47
 
46
48
  ## Alternatives
47
49
 
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: PROP-0013
3
+ title: Unified terminal resource browser
4
+ status: Implemented
5
+ created: 2026-10-22
6
+ updated: 2026-10-22
7
+ affects: [INV-TUI-4, 03-variants.md, 06-plugins-and-capabilities.md, 09-accounts-and-connectors.md, 11-terminal.md]
8
+ ---
9
+
10
+ # PROP-0013: Unified terminal resource browser
11
+
12
+ ## Problem
13
+
14
+ Skills, local resources, variant additions and community discovery are split across commands.
15
+ See [source study](../../study/tui-resource-browser.md). The user approved the proposed UX plan
16
+ and requested implementation in this session.
17
+
18
+ ## Affected rules
19
+
20
+ INV-TUI-4 requires a private control key for terminal configuration mutations. Extend that
21
+ protected route to browser reads, local imports, package install/remove and connection management.
22
+ INV-FND-2 (validated variant commits), INV-PLG-1 (single loader), INV-PLG-3 (installation grants
23
+ no trust/attachment) and INV-MCP-4 remain enforced. No extension point is added.
24
+
25
+ ## Proposal
26
+
27
+ One browser exposes Overview, Foundation, Variant, Skills, Plugins, Connections, Tools and Library.
28
+ Resource sections share Installed/Discover. Existing commands become shortcuts. Saved and live
29
+ availability remain separate: session loader/tool registry proves current availability; configuration
30
+ and variant head describe future sessions. Inspecting never loads extensions or connects MCP.
31
+ The private socket adds terminal.browser.* adapters to the existing services. File reads accept
32
+ resource IDs and use enumerated owner paths, regular-file checks and bounded previews.
33
+
34
+ ## Alternatives
35
+
36
+ Do nothing retains fragmented discovery. Separate improved pages still require users to learn
37
+ where a resource lives. A combined local/remote list obscures the action and availability differences.
38
+
39
+ ## Consequences
40
+
41
+ No second loader, enablement store or secret store. The public host RPC framing is unchanged.
42
+ Optional install/remove callbacks extend the terminal adapter. Credential inputs are masked.
43
+ Hub documents remain inert until a separate explicit connector-setup action validates their shape.
44
+
45
+ ## Migration
46
+
47
+ No data migration. Existing commands remain valid shortcuts. Existing sessions keep their resource
48
+ selection and variant pins. New resources require the same trust/attachment and restart as before.
49
+
50
+ ## Checks
51
+
52
+ Focused model/page/socket tests, OpenTUI completion tests, isolated PTY journeys at 40x20, 80x24,
53
+ 120x40, Harness typecheck/tests/build/proof and required sibling App checks. No real model requests.
54
+
55
+ ## Implementation evidence
56
+
57
+ [Terminal acceptance and limits](../../evidence/terminal-resource-browser/README.md).
58
+ Implementation remains in the working tree; no release or publication is claimed.
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: PROP-0014
3
+ title: Full-screen resource browser with persistent section tabs
4
+ status: Implemented
5
+ created: 2026-10-23
6
+ updated: 2026-10-23
7
+ affects: [11-terminal.md, terminal-tui.md]
8
+ ---
9
+
10
+ # PROP-0014: Full-screen resource browser with persistent section tabs
11
+
12
+ Accepted by the user's request to implement the agreed plan on 2026-10-23.
13
+
14
+ ## Problem
15
+
16
+ The browser's centered panel, section dropdown and wide sidebar consume space and hide
17
+ navigation when inspecting a resource. The user requested a full-page screen with component tabs.
18
+
19
+ ## Affected rules
20
+
21
+ The terminal guide states: “The browser keeps the centered dialog size policy.”
22
+ This proposal replaces that browser layout contract. INV-TUI-1 through INV-TUI-6 remain intact.
23
+
24
+ ## Proposal
25
+
26
+ Every resource-browser command opens the full terminal. Overview, Foundation, Variant, Skills,
27
+ Plugins, Connections, Tools and Library occupy a persistent top tab strip. Narrow terminals
28
+ show the active tab and previous/next navigation. Tab moves focus; arrows change the focused tab;
29
+ mouse selection selects a tab directly. Each section retains search and resource selection.
30
+
31
+ At 88 content columns, inventory and inspector share the screen; details, actions and content
32
+ stay beside the list. Narrow screens show details and content within the active tab. Escape
33
+ returns through content, inspection and search before closing. Other command pages retain
34
+ centered presentation. Browser actions retain existing confirmations and protected services.
35
+
36
+ ## Alternatives
37
+
38
+ Keeping the centered browser leaves insufficient working space. Full-width lists with replacement
39
+ detail views hide useful context on wide terminals. A c1–c8 primary tab strip was considered;
40
+ the user selected resource sections instead.
41
+
42
+ ## Consequences
43
+
44
+ This is foundation UI behavior. TerminalPage gains optional presentation and direct tab selection.
45
+ There is no server protocol, stored data, account, loader or gate change.
46
+
47
+ ## Migration
48
+
49
+ Existing command destinations and resource state are preserved. No migration is needed.
50
+ The UI change is reversible without touching stored data.
51
+
52
+ ## Checks
53
+
54
+ Cover page geometry, keyboard and mouse tab selection, inspection, scrolling, responsive resize,
55
+ shortcut destinations, and draft preservation. Run typecheck, tests, build, the isolated browser
56
+ PTY suite and the consuming application's required checks. No real model requests are needed.
57
+
58
+ Related decision: [ADR-0016](../../decisions/ADR-0016-fullscreen-browser-tabs.md).
@@ -0,0 +1,88 @@
1
+ ---
2
+ id: PROP-0015
3
+ title: One capability surface — the Harness terminal and every host offer the same capabilities
4
+ status: Accepted
5
+ created: 2026-10-23
6
+ updated: 2026-10-23
7
+ affects: [INV-BND-2, new INV-PAR-1..4, 00-overview.md, 11-terminal.md, new 14-surfaces-and-parity.md, AGENTS.md]
8
+ ---
9
+
10
+ # PROP-0015: One capability surface
11
+
12
+ Accepted by the user's approval of the parity plan on 2026-10-23. Related decision:
13
+ [ADR-0017](../../decisions/ADR-0017-one-capability-surface.md).
14
+
15
+ ## Problem
16
+
17
+ Two front ends sit on the same harness: the Harness-owned terminal (`xharness`) and the App.
18
+ Capabilities a person uses grew in the App alone (web annotations, managed worktrees, agent
19
+ organizations, delegated work), so the terminal cannot do what the App does, and a reader cannot
20
+ tell which repository owns a feature. The App also carried an orchestration layer (agents as
21
+ product objects, routed chats, group chats, a reporting tree, delegated work queues) that no other
22
+ host could reuse and that was never verified in a running app.
23
+
24
+ The owner decided on 2026-10-23 that the App is a richer presentation of the Harness and that the
25
+ terminal and the App offer the same capabilities, with room reserved for future host-only
26
+ surfaces such as interactive agent output ("OpenUI").
27
+
28
+ ## Affected rules
29
+
30
+ - 00-overview "Stays in the application: agents, groups, conversations, tasks and coordination,
31
+ projects and worktrees, App browser UI and tab sharing, computer use, windows, the PTY, the
32
+ keychain, and application UI."
33
+ - `INV-BND-2` lists "worktree" among application concepts.
34
+ - 11-terminal describes the terminal as one frontend, with no parity obligation.
35
+
36
+ ## Proposal
37
+
38
+ A new page, [14 Surfaces and parity](../14-surfaces-and-parity.md), states four invariants:
39
+
40
+ - **INV-PAR-1** Every capability a person can use in a host is a Harness capability: a foundation
41
+ service, a `WorldPart`, or a first-party plugin, reachable through server methods. The standalone
42
+ terminal surfaces it. A host is a presentation of it.
43
+ - **INV-PAR-2** A capability is complete only when its terminal surface and its host surface both
44
+ pass acceptance. It lands in the Harness first, together with its terminal surface.
45
+ - **INV-PAR-3** A host-backed capability needs an operating-system object only a host has (a
46
+ WebKit tab, a native computer bridge, a keychain). The Harness defines its generic contract and a
47
+ terminal fallback. Without a fallback, the terminal shows the capability as unavailable with the
48
+ reason, in `/doctor` and `/tools`.
49
+ - **INV-PAR-4** A host-only surface is presentation that cannot exist in a terminal. It owns no
50
+ capability: its actions are Harness methods or tools, its data lives in Harness records, the
51
+ terminal shows a text fallback, and each one is listed in the host's register by an owner
52
+ decision. A generic rich-output event for such surfaces needs its own proposal; the name is
53
+ reserved, nothing is designed.
54
+
55
+ 00-overview changes:
56
+
57
+ - "Belongs in the harness" gains managed worktrees (PROP-0016) and page annotations (PROP-0017).
58
+ - "Stays in the application" becomes: windows, the PTY, the keychain, native operating-system
59
+ bridges (WebKit tabs, computer control), presentation, and registered host-only surfaces.
60
+ - `INV-BND-2` no longer lists "worktree" as an application concept once PROP-0016 lands.
61
+
62
+ A non-binding register, [`docs/parity.md`](../../parity.md), lists every capability with its
63
+ Harness owner, its terminal surface, its host surface and its status.
64
+
65
+ ## Alternatives
66
+
67
+ - **Keep the App as the full product and the terminal as a developer tool.** Rejected by the owner:
68
+ it keeps two products and the ownership confusion.
69
+ - **Strict identity of the two front ends.** Rejected: some presentation (rich panes, interactive
70
+ output) cannot exist in a terminal. INV-PAR-4 bounds that category instead.
71
+ - **Do nothing.** The gap grows with every App feature.
72
+
73
+ ## Consequences
74
+
75
+ - New user capabilities are Harness work first, with their terminal surface.
76
+ - Hosts may still add tools through `ToolProvider`, but a tool a person relies on is either a
77
+ Harness capability or a declared host-backed capability (INV-PAR-3).
78
+ - The server protocol gains method groups only through the proposals that add each capability.
79
+
80
+ ## Migration
81
+
82
+ No stored data changes. Existing gaps are recorded in `docs/parity.md` with IDs (`PAR-NNN`) and
83
+ closed one at a time.
84
+
85
+ ## Checks
86
+
87
+ Documentation change. Link check of the edited pages; each later capability brings its own tests
88
+ on both surfaces.
@@ -0,0 +1,156 @@
1
+ ---
2
+ id: PROP-0016
3
+ title: Managed git worktrees as a Harness capability, in the terminal and every host
4
+ status: Implemented
5
+ created: 2026-10-23
6
+ updated: 2026-10-23
7
+ affects: [INV-BND-2, D-5, INV-STO-3, INV-SRV-1, 00-overview.md, 02-sessions-and-runs.md, 10-server-protocol.md, 11-terminal.md, 12-storage.md, 14-surfaces-and-parity.md]
8
+ ---
9
+
10
+ # PROP-0016: Managed git worktrees
11
+
12
+ Accepted by the user's approval of the parity plan on 2026-10-23 (PROP-0015, ADR-0017).
13
+ Implemented in the working tree on 2026-10-23: `src/worktrees/`, `Sessions.run`, `Terminals`,
14
+ `xharness --worktree`, `xharness worktree`, `/worktree`; spec pages 00, 02, 10, 11, 12 updated.
15
+ The App source has create integration; remaining App actions are tracked as PAR-012. Harness and
16
+ terminal implementation is included in the 4.0.0 candidate. The owner chose the Codex model:
17
+ managed, disposable worktrees with automatic pruning and a handoff back to the main checkout.
18
+
19
+ ## Problem
20
+
21
+ Worktrees exist only in the App (`App/src-tauri/src/projects.rs`: `create_worktree`,
22
+ `list_worktrees`), with no removal, so thread, task and Solo worktrees accumulate. The terminal
23
+ runs in its launch folder only (`terminal/standalone.ts`), with no way to isolate a session's
24
+ edits. `RunRecord.worktreeId` is an opaque App field (drift D-5). Under INV-PAR-1 a capability a
25
+ person uses must be a Harness capability with a terminal surface.
26
+
27
+ ## Affected rules
28
+
29
+ - 00-overview "Stays in the application: … projects and worktrees …".
30
+ - `INV-BND-2` lists "worktree" as an application concept.
31
+ - Drift D-5: `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts.
32
+ - `INV-STO-3`: a new top-level folder is an architecture change.
33
+ - `INV-SRV-1`: a new method group.
34
+
35
+ ## Proposal
36
+
37
+ ### Model
38
+
39
+ A **worktree** is a linked git worktree of a repository (the *source checkout*) that the Harness
40
+ created or adopted. It has an id, a repository root, a path, a name, a branch or a detached HEAD,
41
+ the ref and commit it started from, a kind and an origin.
42
+
43
+ - **Managed** worktrees (the default) are disposable, usually one per session, on a detached HEAD.
44
+ They are pruned automatically.
45
+ - **Permanent** worktrees are named, may host several sessions, and are never pruned.
46
+ - **Create branch** gives a worktree a branch under a configurable prefix (default `wt/`).
47
+
48
+ ### Creation
49
+
50
+ `create({ repo, name?, baseRef?, kind?, carryChanges? })`:
51
+
52
+ 1. Resolve the source checkout's top level; refuse a folder that is not a git repository with at
53
+ least one commit.
54
+ 2. `git worktree add --detach <path> <baseRef>` (default `HEAD`), with repository filter drivers
55
+ switched off (`GIT_LFS_SKIP_SMUDGE=1`, `-c filter.lfs.*` cleared), never through a shell.
56
+ 3. When `carryChanges` (default true for `baseRef: HEAD`), apply the source checkout's
57
+ uncommitted tracked changes (`git diff HEAD --binary` piped to `git apply`) and copy its
58
+ untracked, non-ignored files, as Codex does.
59
+ 4. Copy ignored files matched by `.worktreeinclude` (gitignore syntax, matched by git itself). A
60
+ file is copied only when it does not exist in the worktree; symlinks are skipped; a per-file
61
+ (5 MB) and total (100 MB) cap applies; the result lists what was copied and skipped.
62
+ 5. Run the repository's setup script `.xharness/worktree-setup` when it exists and its exact text
63
+ is trusted by hash (`worktrees.setup.trust`). It runs with `HARNESS_WORKTREE_PATH`,
64
+ `HARNESS_WORKTREE_SOURCE`, `HARNESS_WORKTREE_NAME`, a 10-minute timeout, and its output in a log
65
+ file. An untrusted script is reported, never run.
66
+
67
+ ### Lifecycle
68
+
69
+ - **Lease and lock.** A session that runs in a worktree holds a lease (session id, process id) and
70
+ `git worktree lock --reason`. The lease is released on dispose; a lease whose process is gone is
71
+ released on `open` (recovery).
72
+ - **Prune.** `prune({ keep })` keeps the `keep` (default 15) most recently used managed worktrees
73
+ per repository and removes older ones that hold no lease. Permanent, leased and locked-by-others
74
+ worktrees are never pruned.
75
+ - **Snapshot before removal.** Every removal of a worktree with uncommitted changes or commits not
76
+ on any other branch first records them: `git stash create` (with untracked files committed into a
77
+ temporary index) and `git update-ref refs/xharness/snapshots/<id> <commit>`. `restore({ id })`
78
+ recreates the worktree from its snapshot.
79
+ - **Remove.** `remove({ id, force? })` refuses a leased worktree, and refuses dirty work unless
80
+ `force`, in which case it snapshots first.
81
+ - **Handoff.** `handoff({ id, direction: 'toSource' | 'toWorktree' })` moves uncommitted changes
82
+ between the worktree and the source checkout through git (`diff --binary` and `apply --3way`,
83
+ plus untracked files). It refuses when the target has uncommitted changes, when a branch would be
84
+ checked out twice, or when the patch does not apply cleanly; nothing is changed on refusal.
85
+ - **Adopt.** `adopt({ path })` registers an existing linked worktree (for example ones a host
86
+ created earlier) with origin `adopted`. It moves nothing.
87
+
88
+ ### Sessions and runs
89
+
90
+ `SessionRunInput` and `TerminalPrepareInput` accept `worktreeId`. The Harness resolves the working
91
+ folder from the registry, takes the lease, and records `RunRecord.worktreeId`, which now has
92
+ Harness meaning. A caller that passes a folder without `worktreeId` behaves as before. D-5 narrows
93
+ to `handoffId`.
94
+
95
+ ### Storage
96
+
97
+ ```text
98
+ <state dir>/worktrees.json registry, owner: worktrees/registry.ts
99
+ <state dir>/worktrees/<repoKey>/<name>/ checkouts (device-local)
100
+ <state dir>/worktrees/logs/<id>.setup.log setup output
101
+ <state dir>/worktree-setup-trust.json trusted setup-script hashes, owner-only
102
+ ```
103
+
104
+ `repoKey` is a slug of the source folder's name and a short hash of its real path. Checkouts are
105
+ device-local and may be large, so they live in the state directory (`INV-STO-1`). A host may set
106
+ `HarnessOptions.worktrees = { root?, branchPrefix?, keep? }`.
107
+
108
+ ### Server methods
109
+
110
+ New group `worktrees`: `list { repo? }`, `status { id }`, `create`, `branch { id, name }`,
111
+ `handoff { id, direction }`, `remove { id, force? }`, `restore { id }`, `prune { repo?, keep? }`,
112
+ `adopt { path }`, `setup.trust { repo, hash }`. Terminal equivalents use the control key
113
+ (INV-TUI-4).
114
+
115
+ ### Terminal
116
+
117
+ - `xharness --worktree [name]` (`-w`) starts the terminal in a new managed worktree of the current
118
+ repository (or reuses the named one).
119
+ - `xharness worktree list|new|rm|prune|adopt|restore`.
120
+ - `/worktree` opens a page: list with branch, changes and last use; actions new, switch, create
121
+ branch, hand off, remove, restore, prune, trust setup script. Switching uses the terminal
122
+ relaunch loop with the new folder.
123
+
124
+ ### INV-BND-2
125
+
126
+ "worktree" leaves the list of application concepts; a worktree is now a Harness object.
127
+
128
+ ## Alternatives
129
+
130
+ - **Keep worktrees in the App.** Breaks INV-PAR-1; the terminal could not isolate a session.
131
+ - **Claude Code's opt-in named worktrees only.** The owner chose Codex's managed model; named
132
+ permanent worktrees are kept as the second kind.
133
+ - **Inside the repository** (`.claude/worktrees`, `.agents/worktrees`). Puts large device-local
134
+ folders where editors and tools index them; the state directory avoids that.
135
+ - **Copy-on-write clones** (omp). Faster for large ignored folders but platform-specific; left for
136
+ a later option.
137
+
138
+ ## Consequences
139
+
140
+ - Hosts call `worktrees.*` instead of running git themselves. The App's `projects.rs` worktree
141
+ code is replaced; its existing worktrees can be adopted on the person's command.
142
+ - New folders in the state directory; no data-root change.
143
+ - The terminal gains a command-line flag, a command and a page.
144
+
145
+ ## Migration
146
+
147
+ Nothing moves automatically. `adopt` registers existing worktrees when a person asks. The change
148
+ can be undone by removing the registry; checkouts stay valid git worktrees.
149
+
150
+ ## Checks
151
+
152
+ Unit tests on temporary repositories: create (detached, branch, carry changes), include copy (no
153
+ overwrite, symlink skip, caps), setup trust gate, lease and lock, recovery of a stale lease, prune
154
+ order and protection, snapshot and restore, remove refusal, handoff both ways and its refusals,
155
+ adopt. Terminal page model tests. `npm run typecheck`, `npm test`, `npm run prove`, and the App's
156
+ checks.
@@ -0,0 +1,131 @@
1
+ ---
2
+ id: PROP-0017
3
+ title: Page annotations as a Harness capability, captured in the headed browser or a host's web view
4
+ status: Implemented
5
+ created: 2026-10-23
6
+ updated: 2026-10-25
7
+ affects: [INV-STO-3, INV-SRV-1, 07-tools-and-gate.md, 10-server-protocol.md, 11-terminal.md, 12-storage.md, 13-world-tools.md, 14-surfaces-and-parity.md]
8
+ ---
9
+
10
+ # PROP-0017: Page annotations
11
+
12
+ Accepted by the user's approval of the parity plan on 2026-10-23 (PROP-0015, ADR-0017). The owner
13
+ chose capture through a visible (headed) Harness browser window when only the terminal runs.
14
+ Implemented in the working tree on 2026-10-23: `src/annotations/`, the `annotations` world part,
15
+ `annotations.*` methods, `/notes` and `/annotate`; spec pages 07, 10, 11, 12, 13 updated. The App
16
+ source changes migrate the prior store into Harness and provide the Annotate panel; acceptance of
17
+ native WKWebView gestures remains outstanding. The Harness implementation is included in the 4.0.0
18
+ candidate.
19
+
20
+ ## Problem
21
+
22
+ Web annotations exist only in the App (`App/src-tauri/src/browser_annotations/`, FEAT-0016): a
23
+ person marks a page, a text range or an element in an App WebKit tab, writes a note, and shares it
24
+ with an agent, which reads it with `browser_annotations_list` / `browser_annotations_read`. The
25
+ store, the page script and the tools are App code, so the terminal has no annotations (INV-PAR-1).
26
+
27
+ ## Affected rules
28
+
29
+ - 13-world-tools: "The App owns its shared WebKit browser UI, private/shared tab policy, …" — the
30
+ WebKit capture surface stays with the host; the store, tools and page script move here.
31
+ - `INV-STO-3`: new data-root folder `annotations/`.
32
+ - `INV-SRV-1`: new method group `annotations`.
33
+
34
+ ## Proposal
35
+
36
+ ### Records
37
+
38
+ A **note** is `{ id, version, source, target, body, tags, status, author, createdAt, updatedAt,
39
+ grants, history }`, the format of the App store, so existing notes import unchanged:
40
+
41
+ - `source`: `{ url, title, capturedAt }` plus an optional opaque `surface` string from the capturing
42
+ front end.
43
+ - `target`: `page`, `text { exact, prefix, suffix, start, end }` (Unicode code points over
44
+ normalised page text), or `element { tag, role, name, text, context, selector }`. Element capture
45
+ prefers role/name/text; when an otherwise empty visual element has no semantic label, it may use
46
+ a specific CSS selector (ID, test ID, classes, and a structural path when needed), never a bare
47
+ tag. Resolution uses that selector only when it identifies one allowed element and the captured
48
+ semantics/context still agree; stale or duplicate targets remain unresolved or ambiguous.
49
+ - `status`: `open` or `resolved`. `version` increases on every change; update and delete name the
50
+ version they expect (compare-and-swap). The last 100 change receipts are kept, without earlier
51
+ bodies. At most 10,000 notes.
52
+ - `grants`: `{ principal: { sessionId? , agentId? }, binding?: string, grantedAt }[]`. `binding` is
53
+ an opaque host string (the App uses its tab and sharing epoch); the Harness compares it, never
54
+ interprets it. Sharing and revoking are a person's action through the methods below, never a
55
+ model's.
56
+
57
+ Notes are one JSON file each under `<data root>/annotations/`, written atomically, owned by
58
+ `annotations/store.ts`. The store is synchronous, like the Wiki.
59
+
60
+ ### Page script
61
+
62
+ `annotations/pageScript.js` is the App's page script, moved: plain DOM code with a pull model
63
+ (`identity`, `begin`, `capture`, `cancel`, `resolve`, `reveal`). The page never calls out; the
64
+ front end polls it. It runs in the page's own script world, as in the App, so a page can tamper
65
+ with it: every result is untrusted and validated by the store before it is saved. A host reads the
66
+ same source with `annotations.pageScript`.
67
+
68
+ ### Tools
69
+
70
+ A world part `annotations` (plugin id `annotations`, switchable, on by default) offers two
71
+ read-only tools to SDK and terminal sessions:
72
+
73
+ - `page_notes_list { url?, status?, offset? }` — up to 20 summaries, 12,000 characters total.
74
+ - `page_notes_read { id }` — the full note, marked untrusted.
75
+
76
+ A tool returns only notes granted to the calling session or agent. A binding is the host's handle
77
+ for revocation: when what it stands for ends (a tab closes or is shared again), the host calls
78
+ `annotations.revokeBinding` and every grant made with it ends. The Harness never interprets a
79
+ binding. The part is separate from the browser part, so a host that replaces the browser
80
+ (`browser: false`) still has annotations.
81
+
82
+ ### Server methods
83
+
84
+ Group `annotations`: `list { url?, query?, status?, offset? }`, `read { id }`,
85
+ `create { source, target, body, tags }`, `update { id, expectedVersion, patch }`,
86
+ `delete { id, expectedVersion }`, `share { id, principal, binding? }`,
87
+ `unshare { id, principal }`, `revokeBinding { binding }`, `import { notes }` (keeps ids; used once
88
+ by a host migrating its own store), `pageScript` (the page helper's source for a host's web view).
89
+
90
+ ### Terminal capture
91
+
92
+ - `/annotate [url]` opens a visible capture browser for the terminal session (its own window and
93
+ its own profile, `<state dir>/browser/profiles/person`, separate from the agent's browser),
94
+ navigates when a URL is given, and runs the page script there. The person selects
95
+ text or an element in the Chromium window and presses Capture in the terminal; the terminal pulls
96
+ the selection, asks for a body and tags, and saves the note. `/annotate --page <url>` saves a
97
+ page note without opening a window.
98
+ - `/notes` lists notes for the current page or all notes, with search and status filter, and offers
99
+ edit, resolve or reopen, share with this session, unshare, delete and reveal (highlight in the
100
+ headed window; result `matched`, `ambiguous` or `unresolved`).
101
+
102
+ ### Host capture
103
+
104
+ A host with its own web view (the App's WebKit tabs) runs the same page script there and calls the
105
+ same methods. The host keeps its tab and sharing policy and passes it as the grant's binding.
106
+
107
+ ## Alternatives
108
+
109
+ - **Keep annotations in the App.** Breaks INV-PAR-1.
110
+ - **Terminal-only capture from page text and the accessibility snapshot.** The owner chose the
111
+ headed window, which captures exactly what the person selects. Snapshot picking can be added
112
+ later as a fallback.
113
+ - **Put the tools in the browser part.** A host that replaces the browser would lose them.
114
+
115
+ ## Consequences
116
+
117
+ - New data-root folder `annotations/`, new method group, two new model tools.
118
+ - The App's store and tools are replaced by Harness calls; its WebKit capture stays.
119
+
120
+ ## Migration
121
+
122
+ The App imports its existing `<data root>/browser-annotations/*.json` once with
123
+ `annotations.import`, keeping ids, then renames the old folder `browser-annotations.migrated`. If
124
+ the import fails, nothing is renamed and the App reports it.
125
+
126
+ ## Checks
127
+
128
+ Store tests ported from the App's `store.rs` tests (compare-and-swap, cap, history, target
129
+ validation, code-point offsets); grant tests (an unshared note is invisible, a binding mismatch is
130
+ refused); page-script tests; capture and reveal with a fake browser launcher; terminal page model
131
+ tests. `npm run typecheck`, `npm test`, `npm run prove`, and the App's checks.