@xingular/harness 1.0.0 → 1.1.1

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 (257) hide show
  1. package/CHANGELOG.md +33 -5
  2. package/README.md +70 -19
  3. package/dist/cli.js +10321 -5785
  4. package/dist/sdk/agents/builtin.d.ts +2 -0
  5. package/dist/sdk/agents/builtin.js +34 -0
  6. package/dist/sdk/agents/narrow.d.ts +13 -0
  7. package/dist/sdk/agents/narrow.js +29 -0
  8. package/dist/sdk/agents/profiles.d.ts +80 -0
  9. package/dist/sdk/agents/profiles.js +221 -0
  10. package/dist/sdk/annotations/bridge.d.ts +42 -0
  11. package/dist/sdk/annotations/bridge.js +264 -0
  12. package/dist/sdk/annotations/capture.d.ts +116 -0
  13. package/dist/sdk/annotations/capture.js +308 -0
  14. package/dist/sdk/annotations/delivery.d.ts +72 -0
  15. package/dist/sdk/annotations/delivery.js +130 -0
  16. package/dist/sdk/annotations/inspect.d.ts +10 -0
  17. package/dist/sdk/annotations/inspect.js +33 -0
  18. package/dist/sdk/annotations/isolated.d.ts +6 -0
  19. package/dist/sdk/annotations/isolated.js +51 -0
  20. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  21. package/dist/sdk/annotations/pageScript.js +570 -0
  22. package/dist/sdk/annotations/part.d.ts +10 -0
  23. package/dist/sdk/annotations/part.js +144 -0
  24. package/dist/sdk/annotations/queue.d.ts +4 -0
  25. package/dist/sdk/annotations/queue.js +40 -0
  26. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  27. package/dist/sdk/annotations/serverMethods.js +62 -0
  28. package/dist/sdk/annotations/store.d.ts +160 -0
  29. package/dist/sdk/annotations/store.js +386 -0
  30. package/dist/sdk/browser/index.d.ts +14 -3
  31. package/dist/sdk/browser/index.js +11 -4
  32. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  33. package/dist/sdk/browser/serverMethods.js +7 -0
  34. package/dist/sdk/browser/session.d.ts +1 -0
  35. package/dist/sdk/browser/session.js +45 -9
  36. package/dist/sdk/cli.js +19 -11
  37. package/dist/sdk/core/bus.js +1 -1
  38. package/dist/sdk/core/env.d.ts +1 -1
  39. package/dist/sdk/core/env.js +1 -1
  40. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  41. package/dist/sdk/doctor/serverMethods.js +8 -0
  42. package/dist/sdk/harness.d.ts +15 -0
  43. package/dist/sdk/harness.js +44 -5
  44. package/dist/sdk/history/recall.js +8 -8
  45. package/dist/sdk/history/serverMethods.d.ts +3 -0
  46. package/dist/sdk/history/serverMethods.js +8 -0
  47. package/dist/sdk/hub/cli.d.ts +1 -1
  48. package/dist/sdk/hub/cli.js +1 -1
  49. package/dist/sdk/hub/schema.d.ts +1 -1
  50. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  51. package/dist/sdk/hub/serverMethods.js +11 -0
  52. package/dist/sdk/index.d.ts +10 -0
  53. package/dist/sdk/index.js +7 -0
  54. package/dist/sdk/mcp/connections.js +14 -7
  55. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  56. package/dist/sdk/mcp/serverMethods.js +22 -0
  57. package/dist/sdk/plugins/builtin.d.ts +1 -0
  58. package/dist/sdk/plugins/builtin.js +128 -33
  59. package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
  60. package/dist/sdk/plugins/builtinRegistry.js +49 -0
  61. package/dist/sdk/plugins/cli.d.ts +1 -1
  62. package/dist/sdk/plugins/cli.js +4 -3
  63. package/dist/sdk/prompt/compile.d.ts +5 -2
  64. package/dist/sdk/prompt/compile.js +25 -8
  65. package/dist/sdk/refine/cli.d.ts +1 -1
  66. package/dist/sdk/refine/cli.js +2 -2
  67. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  68. package/dist/sdk/refine/serverMethods.js +20 -0
  69. package/dist/sdk/server/methods.js +9 -86
  70. package/dist/sdk/server/params.d.ts +4 -0
  71. package/dist/sdk/server/params.js +11 -0
  72. package/dist/sdk/sessions/contracts.d.ts +17 -0
  73. package/dist/sdk/sessions/contracts.js +42 -3
  74. package/dist/sdk/sessions/planMode.d.ts +5 -2
  75. package/dist/sdk/sessions/planMode.js +12 -3
  76. package/dist/sdk/sessions/reasoningSummaries.d.ts +2 -2
  77. package/dist/sdk/sessions/reasoningSummaries.js +3 -3
  78. package/dist/sdk/sessions/registry.d.ts +1 -0
  79. package/dist/sdk/sessions/registry.js +4 -1
  80. package/dist/sdk/sessions/runIndex.js +7 -7
  81. package/dist/sdk/sessions/runStore.js +3 -1
  82. package/dist/sdk/sessions/runner.js +2 -2
  83. package/dist/sdk/sessions/sessions.d.ts +17 -5
  84. package/dist/sdk/sessions/sessions.js +79 -12
  85. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  86. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  87. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  88. package/dist/sdk/sessions/sideQuestions.js +290 -0
  89. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  90. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  91. package/dist/sdk/sessions/subagentService.d.ts +13 -2
  92. package/dist/sdk/sessions/subagentService.js +34 -16
  93. package/dist/sdk/sessions/subagents.d.ts +9 -1
  94. package/dist/sdk/sessions/subagents.js +19 -0
  95. package/dist/sdk/terminal/browser.d.ts +62 -0
  96. package/dist/sdk/terminal/browser.js +41 -0
  97. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  98. package/dist/sdk/terminal/browserControl.js +186 -0
  99. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  100. package/dist/sdk/terminal/commandHelp.js +20 -0
  101. package/dist/sdk/terminal/controller.d.ts +7 -1
  102. package/dist/sdk/terminal/controller.js +34 -2
  103. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  104. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  105. package/dist/sdk/terminal/piExtension.js +33 -48
  106. package/dist/sdk/terminal/socket.d.ts +6 -3
  107. package/dist/sdk/terminal/socket.js +40 -9
  108. package/dist/sdk/terminal/standalone.d.ts +2 -0
  109. package/dist/sdk/terminal/standalone.js +50 -10
  110. package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
  111. package/dist/sdk/terminal/subagentMonitor.js +121 -0
  112. package/dist/sdk/terminal/terminals.d.ts +42 -6
  113. package/dist/sdk/terminal/terminals.js +359 -18
  114. package/dist/sdk/terminal/trajectory.js +2 -2
  115. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  116. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  117. package/dist/sdk/terminal/tui/commandPages.d.ts +5 -1
  118. package/dist/sdk/terminal/tui/commandPages.js +54 -6
  119. package/dist/sdk/terminal/tui/commands.d.ts +8 -4
  120. package/dist/sdk/terminal/tui/commands.js +181 -58
  121. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +2 -2
  122. package/dist/sdk/terminal/tui/dialogGeometry.js +4 -2
  123. package/dist/sdk/terminal/tui/dialogs.d.ts +6 -1
  124. package/dist/sdk/terminal/tui/dialogs.js +9 -2
  125. package/dist/sdk/terminal/tui/modelPicker.js +1 -6
  126. package/dist/sdk/terminal/tui/page.d.ts +3 -0
  127. package/dist/sdk/terminal/tui/pageOverlay.js +17 -6
  128. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +26 -4
  129. package/dist/sdk/terminal/tui/pages/accountsPage.js +264 -36
  130. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  131. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  132. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  133. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  134. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  135. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  136. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +2 -0
  137. package/dist/sdk/terminal/tui/pages/doctorPage.js +103 -15
  138. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  139. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  140. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +8 -0
  141. package/dist/sdk/terminal/tui/pages/settingsPage.js +16 -1
  142. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
  143. package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
  144. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +12 -5
  145. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +156 -83
  146. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  147. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  148. package/dist/sdk/terminal/tui/planMode.d.ts +1 -1
  149. package/dist/sdk/terminal/tui/planMode.js +1 -1
  150. package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
  151. package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
  152. package/dist/sdk/terminal/tui/questions.d.ts +2 -0
  153. package/dist/sdk/terminal/tui/runtime.js +4 -2
  154. package/dist/sdk/terminal/tui/settingsModel.d.ts +2 -0
  155. package/dist/sdk/terminal/tui/settingsModel.js +32 -2
  156. package/dist/sdk/terminal/tui/sideQuestion.d.ts +26 -26
  157. package/dist/sdk/terminal/tui/sideQuestion.js +131 -98
  158. package/dist/sdk/terminal/tui/ui.d.ts +2 -0
  159. package/dist/sdk/terminal/tui/ui.js +1 -0
  160. package/dist/sdk/tools/askUser.js +26 -8
  161. package/dist/sdk/tools/checklist.js +2 -2
  162. package/dist/sdk/tools/harnessTools.d.ts +2 -0
  163. package/dist/sdk/tools/harnessTools.js +1 -1
  164. package/dist/sdk/tools/spawnSubagent.js +13 -4
  165. package/dist/sdk/web/part.d.ts +10 -0
  166. package/dist/sdk/web/part.js +6 -0
  167. package/dist/sdk/web/serverMethods.d.ts +3 -0
  168. package/dist/sdk/web/serverMethods.js +7 -0
  169. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  170. package/dist/sdk/wiki/serverMethods.js +26 -0
  171. package/dist/sdk/worktrees/cli.d.ts +11 -0
  172. package/dist/sdk/worktrees/cli.js +146 -0
  173. package/dist/sdk/worktrees/copy.d.ts +9 -0
  174. package/dist/sdk/worktrees/copy.js +111 -0
  175. package/dist/sdk/worktrees/git.d.ts +16 -0
  176. package/dist/sdk/worktrees/git.js +81 -0
  177. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  178. package/dist/sdk/worktrees/serverMethods.js +30 -0
  179. package/dist/sdk/worktrees/service.d.ts +73 -0
  180. package/dist/sdk/worktrees/service.js +483 -0
  181. package/dist/sdk/worktrees/setup.d.ts +23 -0
  182. package/dist/sdk/worktrees/setup.js +65 -0
  183. package/dist/sdk/worktrees/types.d.ts +91 -0
  184. package/dist/sdk/worktrees/types.js +1 -0
  185. package/dist/sdk/world/cli.d.ts +2 -2
  186. package/dist/sdk/world/cli.js +6 -6
  187. package/dist/sdk/world/world.d.ts +3 -1
  188. package/dist/sdk/world/world.js +8 -9
  189. package/dist/terminal-opentui.js +14540 -7374
  190. package/dist/terminal-pi.js +285 -666
  191. package/docs/README.md +22 -2
  192. package/docs/architecture/00-overview.md +28 -16
  193. package/docs/architecture/02-sessions-and-runs.md +72 -15
  194. package/docs/architecture/03-variants.md +10 -2
  195. package/docs/architecture/04-prompt.md +26 -6
  196. package/docs/architecture/06-plugins-and-capabilities.md +39 -3
  197. package/docs/architecture/07-tools-and-gate.md +21 -6
  198. package/docs/architecture/09-accounts-and-connectors.md +8 -0
  199. package/docs/architecture/10-server-protocol.md +111 -2
  200. package/docs/architecture/11-terminal.md +185 -5
  201. package/docs/architecture/12-storage.md +15 -1
  202. package/docs/architecture/13-world-tools.md +28 -6
  203. package/docs/architecture/14-surfaces-and-parity.md +89 -0
  204. package/docs/architecture/README.md +15 -4
  205. package/docs/architecture/proposals/PROP-0006-run-checklist.md +4 -2
  206. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  207. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  208. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  209. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  210. package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
  211. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  212. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  213. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  214. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  215. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  216. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  217. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  218. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  219. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  220. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  221. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  222. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  223. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  224. package/docs/architecture/proposals/README.md +25 -0
  225. package/docs/decisions/ADR-0009-xharness-command.md +6 -5
  226. package/docs/decisions/ADR-0014-public-release-baseline.md +3 -2
  227. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  228. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  229. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  230. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  231. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  232. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  233. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  234. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  235. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  236. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  237. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  238. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  239. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  240. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  241. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  242. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  243. package/docs/doctor.md +10 -4
  244. package/docs/features/README.md +26 -0
  245. package/docs/features/interfaces/README.md +1 -1
  246. package/docs/future-work.md +48 -0
  247. package/docs/parity.md +78 -0
  248. package/docs/releases/1.0.0.md +2 -2
  249. package/docs/releases/4.0.0.md +46 -0
  250. package/docs/releases/README.md +20 -15
  251. package/docs/study/00-index.md +5 -0
  252. package/docs/study/autonomous-engineering-sources.md +277 -0
  253. package/docs/study/autonomy-sources.md +147 -0
  254. package/docs/study/proactive-autonomy.md +408 -0
  255. package/docs/study/tui-resource-browser.md +78 -0
  256. package/docs/terminal-tui.md +325 -93
  257. package/package.json +3 -3
@@ -0,0 +1,86 @@
1
+ ---
2
+ id: PROP-0030
3
+ title: A parent-set title for each subagent, shown in the roster
4
+ status: Accepted; implemented
5
+ created: 2026-10-24
6
+ updated: 2026-10-24
7
+ affects: [02-sessions-and-runs.md, 07-tools-and-gate.md, 10-server-protocol.md, 11-terminal.md, terminal-tui.md, 14-surfaces-and-parity.md, parity]
8
+ ---
9
+
10
+ # PROP-0030: A parent-set title for each subagent, shown in the roster
11
+
12
+ ## Problem
13
+
14
+ A live subagent row shows the child's `session_name` once the child calls it successfully, and
15
+ otherwise the whole brief (`subagentsWidget.ts`, `safe(item.name) || safe(item.goal)`). The brief
16
+ can run to 4000 characters, so the row shows a paragraph of instructions cut to the terminal width.
17
+ In a live run of two explorers, neither had a name, and both rows showed their briefs.
18
+
19
+ The child is the only one asked to name itself. The "six words at most" rule is in the
20
+ `session_name` tool description and the prompt, and nothing checks it. A child may skip the call,
21
+ or its call may fail, and the row then shows the brief for the whole run. The parent, which wrote
22
+ the brief, knows the purpose in a few words and names nothing.
23
+
24
+ ## Affected rules
25
+
26
+ No invariant changes. The contracts that change are:
27
+
28
+ - `spawn_subagent` (page 07): a `title` parameter. The model must supply it.
29
+ - `subagents.spawn` (page 10): an optional `title`.
30
+ - The run record (page 02): an optional `title`, stored like `profile` (PROP-0029).
31
+ - The live roster and `/subagents` (page 11, `terminal-tui.md`): the row title is the parent's title.
32
+ - Parity (page 14, `parity.md`): the Subagents row names the title, not the child's session name.
33
+
34
+ ## Proposal
35
+
36
+ - `spawn_subagent` takes `title`, a required string: one short imperative of at most six words,
37
+ such as "Map the auth flow". It is checked the way `session_name` is: whitespace collapses, and
38
+ control characters and empty values are refused with a message the model can act on.
39
+ - `subagents.spawn` takes an optional `title` with the same check. A host or script that omits it
40
+ gets `briefTitle(brief)`: the first non-empty line of the brief, collapsed and capped at 60
41
+ characters. The model cannot omit it.
42
+ - The child run record stores `title`, an optional text field (`RunRecord.title`). The spawn sets it
43
+ before the child launches, and a startup failure keeps it. A record written before this change
44
+ has no title and reads as `briefTitle(goal)`.
45
+ - The terminal roster, the `/subagents` label and its search read the title. The row no longer
46
+ reads the child's `session_name`. The child still names its own Pi session with `session_name`,
47
+ and that name stays in the child's session history.
48
+ - The transcript's `spawn_subagent` row shows the title, and the brief only when no title is given.
49
+
50
+ ## Alternatives
51
+
52
+ - **Require the child to name itself.** This is the current design. The child must be prompted,
53
+ and the rule is not checked. The screenshot shows it was skipped.
54
+ - **Make `title` optional in the tool.** A model skips an optional field the same way it skipped the
55
+ child's name. Rejected: the tool requires it, and only programmatic callers may omit it.
56
+ - **Generate the title with an extra model call.** It costs a call and adds latency to every spawn.
57
+ Rejected.
58
+ - **Keep the child's name first, then the parent's title.** A child that names itself would still
59
+ replace the title the parent chose. Rejected: one source keeps the roster stable.
60
+ - **Do nothing.** Rows keep showing briefs whenever the child does not name itself.
61
+
62
+ ## Consequences
63
+
64
+ - Applications built on the harness get a new required argument in `spawn_subagent`, and an
65
+ optional one in `subagents.spawn`. A model that omits `title` gets an error and retries.
66
+ - The run record gains an optional field. Readers that ignore unknown fields are unaffected. The
67
+ App reads run records in Rust and does not render the roster.
68
+ - The terminal monitor drops the child's `name` field. Its tests change with it.
69
+
70
+ ## Migration
71
+
72
+ No data moves. Records without `title` read as `briefTitle(goal)`. The change can be undone by
73
+ removing the parameter; records written with `title` stay readable, because the field is optional.
74
+
75
+ ## Checks
76
+
77
+ - `src/sessions/subagentService.test.ts`: the title is stored on the child run, and defaults from the
78
+ brief's first line when omitted. An over-long title is refused.
79
+ - `src/tools/spawnSubagent.test.ts` (new): the tool refuses a missing or over-long title before it
80
+ starts a child, and cleaning and the brief fallback behave as stated.
81
+ - `src/terminal/subagentMonitor.test.ts`: the row takes the parent's title, and the child's
82
+ `session_name` does not change it.
83
+ - `src/terminal/opentui/subagentsWidget.test.ts` and `model.test.ts`: the row and the transcript row
84
+ show the title.
85
+ - `npm run typecheck`, `npm test`, and `npm run prove` (the spawn path is server code), then the App's
86
+ checks, because a harness change requires them.
@@ -35,6 +35,31 @@ proposal is `Accepted`.
35
35
 
36
36
  | [PROP-0012](PROP-0012-release-baseline.md) | Public 1.0.0 distribution and generic browser ownership | Accepted; candidate implementation | INV-BND-2, 00, 07, 11, 13 | 2026-10-22 |
37
37
 
38
+ | [PROP-0013](PROP-0013-resource-browser.md) | Unified terminal resource browser | Implemented; working tree verified | 03, 06, 09, 11 | 2026-10-22 |
39
+
40
+ | [PROP-0014](PROP-0014-fullscreen-browser-tabs.md) | Full-screen browser with persistent section tabs | Implemented; working tree verified | 11, terminal-tui.md | 2026-10-23 |
41
+
42
+ | [PROP-0015](PROP-0015-one-capability-surface.md) | One capability surface: the terminal and every host offer the same capabilities | Accepted | INV-BND-2, new INV-PAR, 00, 11, 14, AGENTS.md | 2026-10-23 |
43
+
44
+ | [PROP-0016](PROP-0016-managed-worktrees.md) | Managed git worktrees in the terminal and every host | Harness/terminal in 4.0.0 candidate; App create integration, remaining actions PAR-012 | INV-BND-2, D-5, INV-STO-3, INV-SRV-1, 00, 02, 10, 11, 12, 14 | 2026-10-23 |
45
+
46
+ | [PROP-0017](PROP-0017-page-annotations.md) | Page annotations captured in the headed browser or a host's web view | Harness/terminal in 4.0.0 candidate; App source pending native-gesture acceptance | INV-STO-3, INV-SRV-1, 07, 10, 11, 12, 13, 14 | 2026-10-23 |
47
+
48
+ | [PROP-0018](PROP-0018-annotation-queue-and-app-targets.md) | Inspector-style page notes, a fix queue to the agent, and app windows as capture targets | Harness/terminal in 4.0.0 candidate; App source present, native WKWebView acceptance pending | INV-STO-3, INV-SRV-1, 07, 10, 11, 12, 13, 14 | 2026-10-23 |
49
+ | [PROP-0019](PROP-0019-contextual-side-questions.md) | Harness-owned contextual side questions across surfaces | Implemented; working tree verified | INV-RUN-1/3/5, INV-GATE-1, INV-PLG-1/5, INV-CAP-1, INV-SRV-1/2, INV-PAR-1/2, 02, 04, 06, 07, 10, 11, 12, 14, ADR-0023 | 2026-10-24 |
50
+ | [PROP-0020](PROP-0020-builtin-feature-plugins.md) | Built-in feature modules and namespaced plugin commands | Implemented; included in 4.0.0 candidate | INV-PLG-5/6, INV-TUI-2/7, INV-SRV-1, 06, 11, 13, 14 | 2026-10-24 |
51
+ | [PROP-0021](PROP-0021-command-namespaces-and-duplicates.md) | Required built-in commands and duplicate command suppression | Implemented | INV-TUI-7, INV-PAR-1, 11, 14, ADR-0021 | 2026-10-24 |
52
+ | [PROP-0022](PROP-0022-plan-only-questions.md) | Keep question tools available only in interactive plan mode | Implemented | INV-RUN-8, 02, 04, 06, 07, 11, 14, parity, ADR-0022 | 2026-10-24 |
53
+ | [PROP-0023](PROP-0023-xagent-cli-name.md) | Rename the published CLI command to xagent | Implemented | 11-terminal.md, package.json#bin, CLI documentation, ADR-0024 | 2026-10-24 |
54
+ | [PROP-0024](PROP-0024-question-sketch-previews.md) | Add bounded ASCII sketch previews to question choices | Implemented; working tree verified | INV-RUN-3, INV-PAR-1/2, 02, 10, 11, 14, parity, App question contract and plan-mode docs, ADR-0025 | 2026-10-24 |
55
+ | [PROP-0025](PROP-0025-contextual-question-wireframes.md) | Strict question columns and contextual ASCII wireframes | Implemented; working tree and isolated fixtures verified | INV-RUN-3, INV-PAR-1/2, 02, 11, 14, terminal-tui.md, parity, ADR-0026 | 2026-10-24 |
56
+
57
+ | [PROP-0026](PROP-0026-connected-sketch-display.md) | Connect structural sketch lines in the terminal display | Implemented; working tree and isolated fixtures verified | 11, 14, terminal-tui.md, parity, ADR-0027 | 2026-10-24 |
58
+ | [PROP-0027](PROP-0027-xingular-agent-product-identity.md) | Use Xingular Agent as the default Harness product identity | Accepted; implemented and verified | INV-BND-2, 00-overview.md, 04-prompt.md, 11-terminal.md, terminal-tui.md, ADR-0028 | 2026-10-24 |
59
+ | [PROP-0028](PROP-0028-normalize-question-wireframes.md) | Normalize high-confidence question wireframe borders in the terminal preview | Implemented; production PTY verification passed | INV-PAR-1/2, 11-terminal.md, 14-surfaces-and-parity.md, terminal-tui.md, parity, ADR-0029 | 2026-10-24 |
60
+ | [PROP-0029](PROP-0029-agent-profiles.md) | Agent profiles that subagents start from | Accepted; implemented | INV-RUN-2, INV-VAR-4, INV-STO-3, INV-SRV-1, 02, 03, 04, 06, 10, 11, 12, 14, parity, ADR-0030 | 2026-10-24 |
61
+ | [PROP-0030](PROP-0030-subagent-title.md) | A parent-set title for each subagent, shown in the roster | Accepted; implemented | 02, 07, 10, 11, terminal-tui.md, 14, parity | 2026-10-24 |
62
+
38
63
  Numbers are four digits, start at `0001`, and are never reused.
39
64
 
40
65
  ## Template
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  id: ADR-0009
3
3
  title: Publish the Harness CLI as xharness
4
- status: accepted
4
+ status: superseded
5
5
  created: 2026-10-22
6
- updated: 2026-10-22
6
+ updated: 2026-10-24
7
7
  related: [PROP-0005]
8
8
  supersedes: null
9
- superseded_by: null
9
+ superseded_by: ADR-0024
10
10
  ---
11
11
 
12
- # ADR-0009 — Publish the Harness CLI as xharness
12
+ # ADR-0009 — Publish the Harness CLI as xharness (superseded)
13
13
 
14
14
  ## Context and decision drivers
15
15
 
@@ -35,4 +35,5 @@ subcommands, data/state directory names, and `XINGULAR_HARNESS_*` environment va
35
35
 
36
36
  - The `bin` mapping and CLI help are tested by [`src/cli.test.ts`](../../src/cli.test.ts).
37
37
  - CI, the packed-tarball smoke test and the npm publication blocker are recorded in
38
- [PROP-0005](../architecture/proposals/PROP-0005-xharness-cli-name.md).
38
+ [PROP-0005](../architecture/proposals/PROP-0005-xharness-cli-name.md). The executable-name decision
39
+ is superseded by [ADR-0024](ADR-0024-xagent-command.md).
@@ -9,8 +9,9 @@ updated: 2026-10-22
9
9
  # ADR-0014 — A compiled public SDK and explicit 1.0.0 baseline
10
10
 
11
11
  The user approved [PROP-0012](../architecture/proposals/PROP-0012-release-baseline.md) through the
12
- release implementation plan. Keep @xingular/harness and xharness, use Apache-2.0 for original
13
- code, publish compiled ESM/declarations, and preserve upstream notices and historical releases.
12
+ release implementation plan. Keep @xingular/harness and the then-current `xharness` executable, use
13
+ Apache-2.0 for original code, publish compiled ESM/declarations, and preserve upstream notices and
14
+ historical releases. The executable-name portion was superseded by [ADR-0024](ADR-0024-xagent-command.md); the other release-baseline decisions remain.
14
15
 
15
16
  Generic isolated browser execution belongs in the foundation; App browser presentation, tab
16
17
  sharing and OS/computer integration remain with the host. No application concept or object is
@@ -0,0 +1,28 @@
1
+ # ADR-0015 — One terminal browser for resources and discovery
2
+
3
+ Status: Accepted (user requested implementation of the agreed plan, 2026-10-22).
4
+ Related: [PROP-0013](../architecture/proposals/PROP-0013-resource-browser.md),
5
+ [source study](../study/tui-resource-browser.md).
6
+
7
+ ## Context
8
+
9
+ Skills, plugins, Hub items and variant additions have different entry points and misleading
10
+ availability labels. Users need to identify what exists, what this session can use, and what changes later.
11
+
12
+ ## Decision
13
+
14
+ Use a shared responsive browser with section shortcuts, Installed/Discover views, provenance and
15
+ inspection before management. Join saved configuration with actual runtime resources; never infer
16
+ loaded state from attachment settings or the latest variant head. Keep the loader, gate and service
17
+ ownership intact. Show foundation and variant as different ownership layers.
18
+
19
+ ## Alternatives
20
+
21
+ Separate pages retain navigation fragmentation. A single combined remote/local list confuses
22
+ installation with availability. A full editor expands the task beyond browse/manage.
23
+
24
+ ## Consequences
25
+
26
+ The browser adds a protected service adapter and focused navigation state. Resource reads are bounded,
27
+ credentials stay masked, and installing does not activate resources. Existing commands remain shortcuts.
28
+ Implementation and verification evidence belong in the terminal guide, not in this decision record.
@@ -0,0 +1,31 @@
1
+ # ADR-0016 — Full-screen browser with persistent resource tabs
2
+
3
+ Status: Accepted (user requested implementation of the agreed plan, 2026-10-23).
4
+ Related: [PROP-0014](../architecture/proposals/PROP-0014-fullscreen-browser-tabs.md),
5
+ [ADR-0015](ADR-0015-resource-browser.md).
6
+
7
+ ## Context
8
+
9
+ The unified browser's centered layout and nested section/detail navigation leave little space
10
+ for inventory and inspection. The user wants one full-page workspace with resource-section tabs.
11
+
12
+ ## Decision
13
+
14
+ Resource-browser commands use a full-screen surface with persistent section tabs. Wide terminals
15
+ show inventory beside an inspector containing metadata, actions and content. Compact terminals
16
+ show inline detail views under the same tab strip. Tab moves focus, arrows change a focused tab,
17
+ and mouse tab selection targets the section directly.
18
+
19
+ TerminalPage declares its presentation and optionally supports direct tab selection. Centered
20
+ presentation remains the default for other pages. Resource services keep their existing ownership.
21
+
22
+ ## Alternatives
23
+
24
+ Keeping the centered panel restricts working space. Replacing the list with details at all widths
25
+ loses inventory context. Variant c1–c8 tabs do not match the selected resource-navigation intent.
26
+
27
+ ## Consequences
28
+
29
+ The browser owns responsive inventory/inspector focus and preserves section search and selection.
30
+ Small terminals use compact tab navigation. There are no storage or protocol changes.
31
+ Verification belongs in the terminal guide and its automated page and PTY checks.
@@ -0,0 +1,34 @@
1
+ # ADR-0017 — One capability surface for the terminal and every host
2
+
3
+ Status: Accepted (owner approved the parity plan, 2026-10-23).
4
+ Related: [PROP-0015](../architecture/proposals/PROP-0015-one-capability-surface.md),
5
+ [PROP-0016](../architecture/proposals/PROP-0016-managed-worktrees.md),
6
+ [PROP-0017](../architecture/proposals/PROP-0017-page-annotations.md),
7
+ [14 Surfaces and parity](../architecture/14-surfaces-and-parity.md).
8
+
9
+ ## Context
10
+
11
+ Capabilities grew in the App alone, so the Harness terminal could not do what the App did, and
12
+ ownership between the repositories was unclear. The owner wants the App to be a richer
13
+ presentation of the Harness, with the same capabilities as the terminal, and room for future
14
+ host-only surfaces such as interactive agent output.
15
+
16
+ ## Decision
17
+
18
+ Every user capability is a Harness capability with a terminal surface (INV-PAR-1, INV-PAR-2).
19
+ Capabilities that need an operating-system object only a host has define a generic contract and a
20
+ terminal fallback (INV-PAR-3). Host-only surfaces own no capability and are registered by the host
21
+ with an owner decision (INV-PAR-4). Managed worktrees and page annotations move into the Harness
22
+ under PROP-0016 and PROP-0017. Orchestration across agents (organizations, routed chats, group
23
+ chats, delegated work queues) is not a Harness capability; the App removes it and keeps it only in
24
+ an archived version.
25
+
26
+ ## Alternatives
27
+
28
+ Keeping the App as the full product leaves two products. Identical front ends cannot accommodate
29
+ presentation a terminal cannot show. Doing nothing lets the gap grow.
30
+
31
+ ## Consequences
32
+
33
+ New user features start in the Harness with a terminal surface. The register `docs/parity.md`
34
+ tracks gaps until both surfaces pass. Hosts keep native bridges, windows and presentation.
@@ -0,0 +1,35 @@
1
+ # ADR-0018 — Built-in feature modules and namespaced commands
2
+
3
+ Status: Accepted (owner requested implementation of the plan, 2026-10-24).
4
+ Related: [PROP-0020](../architecture/proposals/PROP-0020-builtin-feature-plugins.md),
5
+ [06 Plugins and capabilities](../architecture/06-plugins-and-capabilities.md),
6
+ [11 Terminal](../architecture/11-terminal.md).
7
+
8
+ ## Context
9
+
10
+ First-party plugin descriptors existed, but runtime assembly, server handlers and TUI command
11
+ dispatch were centralized in separate files. Plugin commands shared the same unprefixed namespace
12
+ as core commands. Duplicate Pi extension commands were silently assigned suffixes by the SDK.
13
+
14
+ ## Decision
15
+
16
+ Use a typed internal registry for built-in plugin modules. Modules own their existing plugin
17
+ descriptor and may supply world parts, public method handlers, terminal command metadata and
18
+ lifecycle. Foundation keeps plugin loading and trust, capability attachment and gating, the TUI
19
+ framework, and the generic isolated browser engine. Plugin commands use `/plugin:<command>`;
20
+ duplicate names are rejected with owner diagnostics. The ownership taxonomy is documentation only.
21
+
22
+ Retire old unprefixed forms for doctor, worktree, trajectory, subagents, notes and annotate at the
23
+ cutover. Public server methods and stored data keep their current names and shapes.
24
+
25
+ ## Alternatives
26
+
27
+ Keeping direct central dispatch preserves the current drift between plugin descriptions and
28
+ runtime ownership. Exposing categories in public metadata adds a schema without a runtime need.
29
+ Letting the SDK suffix duplicate commands makes their identity depend on extension load order.
30
+
31
+ ## Consequences
32
+
33
+ New Harness-managed features register through the built-in plugin registry. The terminal owns the
34
+ page adapter and UI; feature plugins contribute namespaced command metadata. Embedding hosts see
35
+ the existing method table and capability contracts.
@@ -0,0 +1,31 @@
1
+ # ADR-0019 — Managed Git worktrees are a Harness capability
2
+
3
+ Status: Accepted (owner approved the parity plan, 2026-10-23).
4
+ Related: [PROP-0016](../architecture/proposals/PROP-0016-managed-worktrees.md),
5
+ [02 Sessions and runs](../architecture/02-sessions-and-runs.md),
6
+ [14 Surfaces and parity](../architecture/14-surfaces-and-parity.md).
7
+
8
+ ## Context
9
+
10
+ Worktrees isolate source changes, but an App-only implementation leaves terminal users without
11
+ that capability and lets each host invent its own lifecycle and safety rules.
12
+
13
+ ## Decision
14
+
15
+ The Harness owns the worktree registry, lifecycle, session leases, and server methods. Managed
16
+ worktrees are disposable detached checkouts in device-local state; permanent worktrees are retained.
17
+ Creating a worktree disables repository filters, carries source changes only under the defined
18
+ copy/apply rules, and runs setup scripts only after exact-text trust. Leases prevent concurrent
19
+ removal; removal snapshots recoverable work before deleting a checkout. Hosts call `worktrees.*`
20
+ rather than managing these records independently, and the terminal provides the reference surface.
21
+
22
+ ## Alternatives
23
+
24
+ Keeping the feature in the App breaks terminal/host parity. Putting large worktree checkouts inside
25
+ source repositories pollutes them and makes the data visible to tools and editors. Platform-specific
26
+ copy-on-write clones were deferred in favor of Git's portable linked-worktree behavior.
27
+
28
+ ## Consequences
29
+
30
+ `worktreeId` identifies a Harness-managed worktree in a run. Worktree state is device-local under
31
+ the Harness state directory. Hosts can present richer controls but do not own lifecycle or safety.
@@ -0,0 +1,37 @@
1
+ # ADR-0020 — Page annotations and delivery are Harness-owned
2
+
3
+ Status: Accepted (owner approved the parity plan and capture workflow, 2026-10-23).
4
+ Related: [PROP-0017](../architecture/proposals/PROP-0017-page-annotations.md),
5
+ [PROP-0018](../architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md),
6
+ [07 Tools and the gate](../architecture/07-tools-and-the-gate.md),
7
+ [13 World tools](../architecture/13-world-tools.md),
8
+ [14 Surfaces and parity](../architecture/14-surfaces-and-parity.md).
9
+
10
+ ## Context
11
+
12
+ Page annotations and the agent's ability to read or act on them must work in both the standalone
13
+ terminal and embedding hosts. Keeping the note store and tools inside one host would split state and
14
+ behavior; trusting arbitrary page-script output could let a page initiate unintended work.
15
+
16
+ ## Decision
17
+
18
+ The Harness owns the canonical note store, sharing grants, page-note tools, queue and delivery
19
+ lifecycle, and generic capture contract. The terminal captures in its visible isolated browser; a
20
+ host supplies its own web-view or application-window adapter through the same contract. Capture
21
+ results are trusted only when they come from an isolated script world or the host's own UI; otherwise
22
+ sending requires person confirmation. Page-derived content remains untrusted in the delivered
23
+ instruction. A person controls sharing, queueing, confirmation, and resolution; the agent may mark a
24
+ shared note fixed but cannot resolve it or change grants.
25
+
26
+ ## Alternatives
27
+
28
+ A terminal-only capture path would not support host web views. Host-owned stores and tools would
29
+ create different behavior and duplicated data. Trusting page content or automatically sending
30
+ unisolated results would grant a page authority it must not have.
31
+
32
+ ## Consequences
33
+
34
+ Notes and grants have one Harness-owned representation and work through the terminal or a host.
35
+ Hosts retain ownership of native windows and browser UI while using Harness methods for notes,
36
+ sharing, and delivery. The server contract can represent capture targets without naming an
37
+ application.
@@ -0,0 +1,40 @@
1
+ # ADR-0021 — Required built-in commands use the bare namespace
2
+
3
+ Status: Accepted (owner requested implementation of PROP-0021, 2026-10-24).
4
+ Supersedes: The command-namespace portion of [ADR-0018](ADR-0018-builtin-feature-plugins.md).
5
+ Related: [PROP-0021](../architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md),
6
+ [11 Terminal](../architecture/11-terminal.md),
7
+ [14 Surfaces and parity](../architecture/14-surfaces-and-parity.md).
8
+
9
+ ## Context
10
+
11
+ The terminal has a set of required built-in features whose pages are part of normal Harness use.
12
+ Putting their commands behind `/plugin:` made them less direct to use. Separately, built-in and
13
+ loaded extension commands could both appear when their names matched a core command, alias or
14
+ prompt. Duplicate bridge registrations also exposed `/plugin:accounts`, `/plugin:hub`, and
15
+ `/plugin:plugins` beside their existing core commands.
16
+
17
+ ## Decision
18
+
19
+ Commands owned by a required built-in plugin use the bare terminal namespace: `/subagents`,
20
+ `/trajectory`, `/doctor`, and `/worktree`. Optional built-in plugin commands, currently
21
+ `/plugin:notes` and `/plugin:annotate`, and Pi extension commands remain under `/plugin:<command>`.
22
+ Core commands `/accounts`, `/hub`, `/plugins`, and `/mcp` remain unprefixed.
23
+
24
+ An existing bare core command, alias, required built-in command, or loaded prompt reserves its
25
+ name. A colliding `/plugin:<name>` is absent from completion/help and direct invocation explains
26
+ which bare command to use. Duplicate extension registrations retain owner-path diagnostics. Remove
27
+ the bridge registrations that duplicate `/accounts`, `/hub`, and `/plugins`.
28
+
29
+ ## Alternatives
30
+
31
+ Keeping all built-in commands namespaced preserves duplicate entries and makes required features
32
+ less direct to invoke. Unprefixing every built-in plugin command would also change the optional,
33
+ switchable Annotations commands. Suppressing only a fixed list of observed duplicate names would
34
+ allow the same problem to recur as plugins or prompts are added.
35
+
36
+ ## Consequences
37
+
38
+ Required built-in command metadata determines the namespace used by terminal completion, help and
39
+ dispatch. A third-party extension whose command collides with a bare command or prompt must use a
40
+ different command name to expose both. There is no protocol or storage change.
@@ -0,0 +1,34 @@
1
+ # ADR-0022 — Question tools are available only in attended plan runs
2
+
3
+ Status: Accepted (owner requested implementation of PROP-0022, 2026-10-24).
4
+ Related: [PROP-0022](../architecture/proposals/PROP-0022-plan-only-questions.md),
5
+ [02 Sessions and runs](../architecture/02-sessions-and-runs.md),
6
+ [11 Terminal](../architecture/11-terminal.md),
7
+ [14 Surfaces and parity](../architecture/14-surfaces-and-parity.md).
8
+
9
+ ## Context
10
+
11
+ Ordinary chat exposed the Harness-owned `ask_user` tool, while the terminal also activated its
12
+ single-question `ask_user_question` tool in normal mode. Hiding the required `ask-user` plugin would
13
+ also remove it from plan mode and contradict its required-plugin contract. The callable tool set
14
+ must instead be resolved by run mode.
15
+
16
+ ## Decision
17
+
18
+ Newly resolved normal runs omit `ask_user` before their capability set is frozen, regardless of a
19
+ wider requested tool list. An attended plan run may receive it, subject to the caller's narrower
20
+ capabilities. Automatic, probe, improver and reflection runs do not receive it. In the terminal,
21
+ normal mode deactivates both question tools; a plan request temporarily enables the registered
22
+ question tools and restores the previous active set on success, error or interruption.
23
+
24
+ The required `ask-user` built-in remains attached and has no user-facing switch. Approval prompts
25
+ and ordinary assistant text are unaffected. A continuation preserves the earlier frozen capability
26
+ set; if that snapshot includes `ask_user`, an automatic or refinement-triggered continuation is
27
+ rejected with `continuation_mismatch` rather than silently narrowing the snapshot or allowing an
28
+ unattended question.
29
+
30
+ ## Consequences
31
+
32
+ Normal and plan requests can have different provider tool schemas, so no cache-preservation claim is
33
+ made; measure any provider-cache effect only under `INV-PRM-8`. Existing records and attachments need
34
+ no migration. The App relies on the Harness-resolved tool set and adds no separate preference.
@@ -0,0 +1,35 @@
1
+ # ADR-0023: Contextual side questions are Harness runs
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2026-10-24
5
+ **Proposal:** [PROP-0019](../architecture/proposals/PROP-0019-contextual-side-questions.md)
6
+
7
+ ## Context
8
+
9
+ The terminal and App had separate `/btw` implementations. The terminal used a short, in-memory
10
+ Pi session; the App used a bounded, tracked run. Their answers could not consistently use the main
11
+ run's instructions or public tool evidence, and they had different lifecycle and observability.
12
+
13
+ ## Decision
14
+
15
+ The Harness owns one side-question service. It creates an independent run with no variant and an
16
+ empty frozen capability set. The service uses a redacted projection of the main run's effective
17
+ prompt, visible transcript, and persisted public events, including tool inputs and results. It
18
+ excludes hidden reasoning and attachment bytes. Context is bounded, credential-like material is
19
+ redacted, and transcript/tool content cannot add permissions. Terminal and host surfaces use the
20
+ same service and ordinary run-event contract.
21
+
22
+ ## Consequences
23
+
24
+ Side answers are separately recorded and can be inspected with ordinary run history and usage.
25
+ They never enter or steer the parent conversation. No persistent side-thread store or migration is
26
+ needed. The terminal presents a temporary scrollable dock; a host keeps its own presentation. The
27
+ App's read-only native file tools use the operating system's read boundary across absolute and home
28
+ paths; the App's host gate continues to protect edits, writes and shell commands.
29
+
30
+ ## Rejected options
31
+
32
+ - Keeping a separate in-memory terminal session would preserve different answers and observability.
33
+ - Sending hidden reasoning, images or the main run's tools would expose more than a side answer
34
+ needs and could let it act independently.
35
+ - Persisting side threads would require retention, deletion and synchronization rules.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: ADR-0024
3
+ title: Publish the Harness CLI as xagent
4
+ status: accepted
5
+ created: 2026-10-24
6
+ updated: 2026-10-24
7
+ related: [PROP-0023]
8
+ supersedes: ADR-0009
9
+ ---
10
+
11
+ # ADR-0024 — Publish the Harness CLI as xagent
12
+
13
+ ## Context and decision drivers
14
+
15
+ The Harness CLI's no-subcommand path starts the standalone OpenTUI terminal. The current executable
16
+ name, `xharness`, is being replaced by the requested shorter product command, `xagent`. The
17
+ published command is part of the package's public interface.
18
+
19
+ ## Decision
20
+
21
+ Publish `@xingular/harness` with one executable, `xagent`, mapped to `dist/cli.js`. Invoking
22
+ `xagent` without arguments starts the existing OpenTUI terminal. Do not retain `xharness` as a
23
+ compatibility alias. Keep the package name, `terminal` alias, host subcommands, data/state directory
24
+ names, and `XINGULAR_HARNESS_*` environment variables unchanged.
25
+
26
+ This supersedes ADR-0009's executable-name decision and the `xharness` command-name portion of
27
+ ADR-0014. Other release-baseline decisions remain unchanged.
28
+
29
+ ## Consequences
30
+
31
+ - Users and scripts that invoke `xharness` must migrate to `xagent`.
32
+ - No account, data, or state migration is required.
33
+ - If `xharness` has already been released, replacing it requires a new major version; this change is
34
+ intended for the unpublished 4.0.0 candidate.
35
+
36
+ ## Implementation and verification
37
+
38
+ - The `bin` mapping and CLI help are tested by [`src/cli.test.ts`](../../src/cli.test.ts).
39
+ - The implementation and migration notes are tracked in
40
+ [PROP-0023](../architecture/proposals/PROP-0023-xagent-cli-name.md).
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: ADR-0025
3
+ title: Store bounded ASCII sketches with question requests
4
+ status: accepted
5
+ created: 2026-10-24
6
+ updated: 2026-10-24
7
+ related: [PROP-0024, INV-RUN-3, INV-PAR-1, INV-PAR-2]
8
+ supersedes: null
9
+ superseded_by: null
10
+ ---
11
+
12
+ # ADR-0025 — Store bounded ASCII sketches with question requests
13
+
14
+ **Accepted by the product owner on 2026-10-24.**
15
+
16
+ ## Context
17
+
18
+ Choice labels and descriptions do not always communicate a layout or other compact visual
19
+ comparison. Both question surfaces need the same safely bounded representation, and the validated
20
+ `question.requested` event is the existing shared contract through which they receive choice data.
21
+
22
+ ## Decision
23
+
24
+ - A question may set `uiSketch: true` to enable sketch previews. Each offered choice must then
25
+ provide its own `sketch`; without the flag, a choice must not provide a sketch.
26
+ - Sketches are literal text of 1–8 LF-separated lines, at most 32 printable ASCII characters per
27
+ line, with at least one visible character. The complete value is at most 263 bytes. Tabs, CR,
28
+ control characters, escape sequences and non-ASCII text are invalid. Valid text, including
29
+ interior blank lines and trailing spaces, is preserved exactly.
30
+ - Harness validates the flag/choice relationship and text bounds before emitting a request. The
31
+ persisted `question.requested` event may carry the metadata; `question.answered` and
32
+ `QuestionAnswer` remain unchanged. Older request events remain valid.
33
+ - The terminal and hosts render one shared monospace preview below the choices, following the
34
+ hovered or focused choice. They render the sketch as text, not Markdown, ANSI or executable rich
35
+ output.
36
+
37
+ ## Consequences
38
+
39
+ - The existing event schema and persistence path carry the preview; no event kind, image type,
40
+ storage file or protocol version is added. No data migration is needed.
41
+ - Hosts mirror the optional schema fields. Surface parity requires the terminal and each host to
42
+ present the same choice sketches without changing answer semantics.
43
+ - The strict ASCII and dimension limits keep the diagram readable in a 40-column terminal and
44
+ prevent markup, terminal controls and unbounded content from entering the question surface.
45
+
46
+ ## Implementation and verification
47
+
48
+ Implemented under [PROP-0024](../architecture/proposals/PROP-0024-question-sketch-previews.md).
49
+ Verification evidence is recorded with that proposal and in the App's implementation-stage log.
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: ADR-0026
3
+ title: Align question columns and preserve contextual ASCII wireframes
4
+ status: accepted
5
+ created: 2026-10-24
6
+ updated: 2026-10-24
7
+ related: [PROP-0025, ADR-0025, INV-RUN-3, INV-PAR-1, INV-PAR-2]
8
+ supersedes: null
9
+ superseded_by: null
10
+ ---
11
+
12
+ # ADR-0026 — Align question columns and preserve contextual ASCII wireframes
13
+
14
+ **Accepted by the product owner on 2026-10-24** through the plan “Fix TUI question columns and sketch previews”. This is foundation work.
15
+
16
+ ## Context
17
+
18
+ Content-dependent choice rows do not align label and description boundaries. The original 32×8
19
+ sketch limit cannot express contextual UI panels, and a caption plus left rule adds redundant
20
+ preview chrome. ADR-0025 records the original sketch contract and its historical evidence; this
21
+ decision amends its bounds and presentation without replacing the optional sketch/answer model.
22
+
23
+ ## Decision
24
+
25
+ - Use one measured layout across every choice: marker gutter, one-third label cell, two-cell gap,
26
+ remaining description cell. Wrap within cells, retain empty description cells, and never stack
27
+ columns at compact widths. Use `(Rec.)` when the label column is fewer than 14 cells and a compact
28
+ dock hint below 60 terminal columns.
29
+ - Accept 1–24 LF-separated lines of at most 80 printable ASCII characters each (1,943 bytes
30
+ maximum), with at least one visible character. Reject tabs, CR, controls, escapes and Unicode;
31
+ preserve whitespace literally. Both question tools and validated request events use these bounds.
32
+ - Ask models for contextual UI wireframes containing actual panel/table structure and neighboring
33
+ elements, consistent across alternatives. This is generation guidance, not schema enforcement.
34
+ - Render one shared border-only literal preview without a visible caption or extra left rule.
35
+ Preserve content without wrapping, reflow or truncation; bounded two-axis scrolling exposes
36
+ overflow. Hover/focus chooses the preview without changing the staged answer.
37
+ - Bound and vertically scroll the dock body, keeping tabs and answer/action controls outside it.
38
+ PageUp/PageDown and Ctrl+Home/End scroll that body while the dock is active. Shift+arrows pan the
39
+ sketch; ordinary arrows keep question/choice navigation. Bring focused choices and notes into view.
40
+ - Terminal and hosts accept the same metadata and preserve literal content. Host presentation may
41
+ differ, but the expanded contract requires acceptance on both surfaces under INV-PAR-1/2.
42
+
43
+ ## Consequences
44
+
45
+ Existing sketches and events remain valid without a data rewrite. Readers enforcing the old limits
46
+ must update before accepting larger events; rolling readers back requires avoiding sketches above
47
+ those limits. `uiSketch` still requires a sketch on every choice and forbids sketches when disabled.
48
+ `question.answered`, `QuestionAnswer`, the gate, prompt compilation and storage ownership do not
49
+ change. No image format, event kind or executable rich-output contract is introduced.
50
+
51
+ ## Implementation and verification
52
+
53
+ The accepted design is [PROP-0025](../architecture/proposals/PROP-0025-contextual-question-wireframes.md).
54
+ Implementation and isolated terminal/host acceptance are recorded in the
55
+ [retained verification](../evidence/terminal-question-wireframes/README.md), including four terminal
56
+ sizes, live resizing, sketch panning, literal persistence and the host's expanded-boundary fixture.
57
+ Earlier PROP-0024/ADR-0025 evidence remains historical; the new evidence does not claim live-model
58
+ diagram quality, every emulator's behavior or native Tauri presentation.