carthagent 1.0.7 → 1.1.0-beta.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 (294) hide show
  1. package/README.md +140 -83
  2. package/bin/ctg.mjs +14 -732
  3. package/docs/beta-rewards-e2e-plan.md +48 -0
  4. package/docs/beta-rewards-e2e-results.md +84 -0
  5. package/docs/glyph-review/host-chrome-glyph-compatibility-v4.md +83 -0
  6. package/docs/glyph-review/test-isolation-v1.md +26 -0
  7. package/docs/glyph-review/typecheck-base.log +1 -0
  8. package/docs/glyph-review/typecheck-v4.log +1 -0
  9. package/docs/glyph-review/unicode-inventory-v4.csv +402 -0
  10. package/docs/help-dispatch-review.md +69 -0
  11. package/docs/launch-readiness-live-results.md +65 -0
  12. package/docs/legacy-cli.md +150 -0
  13. package/docs/live-theme-plugin-api.md +18 -0
  14. package/docs/native-cli.md +102 -0
  15. package/docs/native-compatibility.md +16 -0
  16. package/docs/native-daily-quests.md +132 -0
  17. package/docs/native-glyph-pty.md +59 -0
  18. package/docs/native-manual-testing.md +336 -0
  19. package/docs/native-slash-acceptance-handoff.md +49 -0
  20. package/docs/native-terminal-paired-failure-2026-10-17.md +40 -0
  21. package/docs/native-terminal-performance.md +310 -0
  22. package/docs/native-terminal-semantics-evidence/README.md +25 -0
  23. package/docs/native-terminal-semantics-evidence/controlled-host-model-selftest.json +16 -0
  24. package/docs/native-terminal-semantics-evidence/current-acceptance-status.json +59 -0
  25. package/docs/native-terminal-semantics-evidence/final-binary-focused-85bb44a.json +154 -0
  26. package/docs/native-terminal-semantics-evidence/final-binary-full-incomplete-85bb44a.json +160 -0
  27. package/docs/native-terminal-semantics-evidence/final-binary-layout-85bb44a.json +149 -0
  28. package/docs/native-terminal-semantics-evidence/final-binary-layout-interactive-85bb44a.json +159 -0
  29. package/docs/native-terminal-semantics-evidence/final-binary-model-picker-escape-unchanged-85bb44a.json +44 -0
  30. package/docs/native-terminal-semantics-evidence/final-binary-model-picker-exact-identity-85bb44a.json +47 -0
  31. package/docs/native-terminal-semantics-evidence/final-binary-model-picker-unchanged-model-incomplete-85bb44a.json +58 -0
  32. package/docs/native-terminal-semantics-evidence/final-binary-model-selftest.json +16 -0
  33. package/docs/native-terminal-semantics-evidence/final-binary-picker-cancel-incomplete-85bb44a.json +62 -0
  34. package/docs/native-terminal-semantics-evidence/focused-clipboard-title-stale-binary.json +161 -0
  35. package/docs/native-terminal-semantics-evidence/layout-stale-binary-observation-not-accepted.json +153 -0
  36. package/docs/native-terminal-semantics-evidence/picker-latest-incomplete-attempt.json +62 -0
  37. package/docs/native-terminal-semantics-evidence/picker-previous-probe-pass.json +61 -0
  38. package/docs/native-terminal-semantics.md +89 -0
  39. package/docs/native-upgrade.md +175 -0
  40. package/docs/opencode-composed-source-review.md +89 -0
  41. package/docs/opencode-migration.md +225 -9
  42. package/docs/opencode-owned-runtime.md +241 -0
  43. package/docs/opencode-runtime.md +12 -0
  44. package/docs/opencode-theme-provider-proof/README.md +55 -0
  45. package/docs/opencode-theme-provider-proof/live-theme-api-base.patch +122 -0
  46. package/docs/opencode-theme-provider-proof/plugin-theme-provider.patch +107 -0
  47. package/docs/opencode-theme-provider-proof/session-ui-base.patch +1217 -0
  48. package/docs/owned-host-controls-proof.md +39 -0
  49. package/docs/owned-runtime-release-manifest.md +42 -0
  50. package/docs/owned-visual-clear-proof.md +40 -0
  51. package/docs/patches/opencode-v2.0.32-glyph-spinner-test-isolation-v1.patch +50 -0
  52. package/docs/patches/opencode-v2.0.32-glyphs.patch +3670 -0
  53. package/docs/patches/opencode-v2.0.32-help-dispatch.patch +156 -0
  54. package/docs/patches/opencode-v2.0.32-live-theme-api.patch +122 -0
  55. package/docs/patches/opencode-v2.0.32-session-ui-combined-v1.patch +5272 -0
  56. package/docs/patches/opencode-v2.0.32-session-ui-combined-v2.patch +6052 -0
  57. package/docs/patches/opencode-v2.0.32-session-ui-combined-v3.patch +8657 -0
  58. package/docs/patches/opencode-v2.0.32-session-ui-combined-v4.patch +9928 -0
  59. package/docs/patches/opencode-v2.0.32-session-ui-combined-v5.patch +13965 -0
  60. package/docs/patches/opencode-v2.0.32-session-ui.patch +5137 -0
  61. package/docs/release-notes-beta.1.md +60 -0
  62. package/docs/release-notes-native-draft.md +73 -0
  63. package/docs/release-notes-preview.10.md +121 -0
  64. package/docs/release-notes-preview.11.md +76 -0
  65. package/docs/release-notes-preview.12.md +55 -0
  66. package/docs/release-notes-preview.13.md +68 -0
  67. package/docs/release-notes-preview.9.md +130 -0
  68. package/docs/source-preview.md +120 -0
  69. package/evaluate.mjs +28 -1
  70. package/lib/budget.mjs +1 -1
  71. package/lib/codegraph.mjs +1 -1
  72. package/lib/delivery-review.mjs +19 -6
  73. package/lib/delivery.mjs +3 -2
  74. package/lib/environment.mjs +8 -0
  75. package/lib/guidance.mjs +1 -1
  76. package/lib/opencode/cli-runtime.mjs +1171 -0
  77. package/lib/opencode/cli.mjs +252 -0
  78. package/lib/opencode/credentials.mjs +63 -8
  79. package/lib/opencode/demo.mjs +53 -0
  80. package/lib/opencode/evaluation-budget-plugin/index.ts +3 -0
  81. package/lib/opencode/evaluation.mjs +32 -12
  82. package/lib/opencode/headless.mjs +22 -5
  83. package/lib/opencode/provider-policy.mjs +23 -0
  84. package/lib/opencode/review.mjs +37 -16
  85. package/lib/opencode/runtime-artifact.mjs +335 -0
  86. package/lib/opencode/runtime-github-transport.mjs +121 -0
  87. package/lib/opencode/runtime-release.json +36 -0
  88. package/lib/opencode/runtime.mjs +299 -20
  89. package/lib/opencode/service.mjs +77 -35
  90. package/lib/opencode/session-options.mjs +6 -2
  91. package/lib/opencode/update.mjs +222 -0
  92. package/lib/opencode/workspace.mjs +1 -1
  93. package/lib/planning-advice.mjs +2 -2
  94. package/lib/providers/experiential.mjs +2 -2
  95. package/lib/tui/framing.mjs +1 -80
  96. package/lib/update.mjs +10 -1
  97. package/package.json +33 -7
  98. package/plugins/carthagent/README.md +23 -0
  99. package/plugins/carthagent/src/bootstrap.ts +1 -1
  100. package/plugins/carthagent/src/daily-evidence.mjs +57 -0
  101. package/plugins/carthagent/src/daily-quests-rpc.ts +50 -0
  102. package/plugins/carthagent/src/daily-source-rpc.ts +52 -0
  103. package/plugins/carthagent/src/index.ts +71 -24
  104. package/plugins/carthagent/src/rpc.ts +51 -6
  105. package/plugins/carthagent/src/server/codegraph.ts +12 -5
  106. package/plugins/carthagent/src/server/daily-quests-rpc.ts +277 -0
  107. package/plugins/carthagent/src/server/daily-source-rpc.ts +243 -0
  108. package/plugins/carthagent/src/server/delivery.ts +227 -112
  109. package/plugins/carthagent/src/server/framing.mjs +80 -0
  110. package/plugins/carthagent/src/server/policy.ts +1 -1
  111. package/plugins/carthagent/src/server/providers.ts +59 -31
  112. package/plugins/carthagent/src/server/session-controls.ts +3 -1
  113. package/plugins/carthagent/src/server/ship-agents.ts +77 -0
  114. package/plugins/carthagent/src/server/ship-context.mjs +60 -0
  115. package/plugins/carthagent/src/server/ship-guidance.ts +41 -0
  116. package/plugins/carthagent/src/server/ship-rpc.ts +69 -0
  117. package/plugins/carthagent/src/server/voyages-rpc.ts +280 -0
  118. package/plugins/carthagent/src/testing.ts +5 -0
  119. package/plugins/carthagent/src/tui.tsx +496 -0
  120. package/plugins/carthagent/src/ui/client.ts +127 -0
  121. package/plugins/carthagent/src/ui/commands.ts +70 -0
  122. package/plugins/carthagent/src/ui/daily-editor-focus.mjs +52 -0
  123. package/plugins/carthagent/src/ui/daily-editor.mjs +4 -0
  124. package/plugins/carthagent/src/ui/daily-quests-events.mjs +18 -0
  125. package/plugins/carthagent/src/ui/daily-quests-state.mjs +218 -0
  126. package/plugins/carthagent/src/ui/daily-quests.tsx +235 -0
  127. package/plugins/carthagent/src/ui/host-state.ts +42 -0
  128. package/plugins/carthagent/src/ui/model-command.ts +32 -0
  129. package/plugins/carthagent/src/ui/native-navigation.ts +23 -0
  130. package/plugins/carthagent/src/ui/native-review.d.mts +33 -0
  131. package/plugins/carthagent/src/ui/native-review.mjs +159 -0
  132. package/plugins/carthagent/src/ui/resume-session.mjs +34 -0
  133. package/plugins/carthagent/src/ui/select-mouse.ts +17 -0
  134. package/plugins/carthagent/src/ui/session-preferences.d.mts +7 -0
  135. package/plugins/carthagent/src/ui/session-preferences.mjs +14 -0
  136. package/plugins/carthagent/src/ui/theme-provision.d.mts +3 -0
  137. package/plugins/carthagent/src/ui/theme-provision.mjs +134 -0
  138. package/plugins/carthagent/src/ui/voyages-navigation-state.mjs +56 -0
  139. package/plugins/carthagent/src/ui/voyages-navigation.tsx +131 -0
  140. package/plugins/carthagent/src/ui/voyages-state.mjs +165 -0
  141. package/plugins/carthagent/src/ui/voyages.tsx +131 -0
  142. package/plugins/carthagent/src/ui/workspace-live.ts +61 -0
  143. package/plugins/carthagent/src/ui/workspace.tsx +379 -0
  144. package/plugins/carthagent/src/voyages-rpc.ts +64 -0
  145. package/plugins/carthagent/src/workspace-rpc.ts +36 -0
  146. package/plugins/carthagent/tests/commands.test.ts +107 -0
  147. package/plugins/carthagent/tests/session-preferences.test.mjs +41 -0
  148. package/plugins/carthagent/tests/voyages-navigation.test.tsx +269 -0
  149. package/plugins/carthagent/themes/carthage.json +67 -0
  150. package/plugins/carthagent/tui.ts +26 -1
  151. package/script/ctg/build-owned-runtime.sh +166 -0
  152. package/tests/budget-engine.test.mjs +4 -3
  153. package/tests/cli.test.mjs +52 -96
  154. package/tests/daily-evidence.test.mjs +62 -0
  155. package/tests/delivery-review.test.mjs +57 -2
  156. package/tests/delivery.test.mjs +22 -1
  157. package/tests/fixtures/native-discovery-plugin/server.ts +15 -0
  158. package/tests/generate-owned-runtime-release.test.mjs +354 -0
  159. package/tests/installed-runtime-contract.test.mjs +43 -0
  160. package/tests/native-cli-host-smoke.mjs +457 -0
  161. package/tests/native-daily-editor-focus.test.mjs +213 -0
  162. package/tests/native-daily-editor.test.mjs +43 -0
  163. package/tests/native-daily-quests-layout.test.mjs +55 -0
  164. package/tests/native-daily-quests-rpc.test.mjs +456 -0
  165. package/tests/native-daily-quests-ui.test.mjs +778 -0
  166. package/tests/native-daily-source.test.mjs +525 -0
  167. package/tests/native-demo-ui.test.mjs +48 -0
  168. package/tests/native-evaluation-admission.test.mjs +24 -0
  169. package/tests/native-fixture-browser-cleanup.test.mjs +65 -0
  170. package/tests/native-fixture-runtime.test.mjs +111 -0
  171. package/tests/native-fixture-stop-diagnostics.test.mjs +67 -0
  172. package/tests/native-glyph-pty.test.mjs +107 -0
  173. package/tests/native-manual-projects.test.mjs +170 -0
  174. package/tests/native-model-command.test.mjs +67 -0
  175. package/tests/native-owned-runtime-env.test.mjs +140 -0
  176. package/tests/native-paired-guards.test.mjs +464 -0
  177. package/tests/native-provider-policy.test.mjs +31 -0
  178. package/tests/native-pty-invocation.test.mjs +114 -0
  179. package/tests/native-pty-runtime.test.mjs +45 -0
  180. package/tests/native-resume-session.test.mjs +46 -0
  181. package/tests/native-review-consumer.test.mjs +286 -0
  182. package/tests/native-runtime-identity.test.mjs +214 -0
  183. package/tests/native-select-mouse.test.mjs +23 -0
  184. package/tests/native-ship-guidance.test.mjs +16 -0
  185. package/tests/native-ship-parity.test.mjs +526 -0
  186. package/tests/native-ship-plan.test.mjs +85 -0
  187. package/tests/native-ship-rpc.test.mjs +71 -0
  188. package/tests/native-ui-commands.test.mjs +6 -0
  189. package/tests/native-voyages-layout.test.mjs +28 -0
  190. package/tests/native-voyages-navigation.test.mjs +169 -0
  191. package/tests/native-voyages-rpc.test.mjs +397 -0
  192. package/tests/native-voyages-ui.test.mjs +307 -0
  193. package/tests/opencode-atomic-write.test.mjs +55 -0
  194. package/tests/opencode-cli.test.mjs +1312 -0
  195. package/tests/opencode-codegraph-plugin.test.mjs +47 -0
  196. package/tests/opencode-delivery.test.mjs +16 -0
  197. package/tests/opencode-providers.test.mjs +245 -18
  198. package/tests/opencode-runtime.test.mjs +597 -8
  199. package/tests/opencode-session-controls.test.mjs +15 -0
  200. package/tests/opencode-ship-rpc.test.mjs +71 -0
  201. package/tests/opencode-update.test.mjs +475 -0
  202. package/tests/opencode-workspace.test.mjs +51 -2
  203. package/tests/owned-runtime-publish-workflow.test.mjs +477 -0
  204. package/tests/release-workflow.test.mjs +46 -0
  205. package/tests/runtime-artifact.test.mjs +269 -0
  206. package/tests/runtime-development-trust.test.mjs +231 -0
  207. package/tests/runtime-github-transport.test.mjs +132 -0
  208. package/tests/runtime-token-env.test.mjs +23 -0
  209. package/tests/server.test.mjs +3 -1
  210. package/tests/ship-telemetry.test.mjs +1 -1
  211. package/tests/source-preview.test.mjs +253 -0
  212. package/tests/test_native_terminal_probe.py +76 -0
  213. package/tests/test_native_terminal_semantics.py +232 -0
  214. package/tests/update.test.mjs +42 -5
  215. package/tests/verify-draft-runtime-gate.test.mjs +280 -0
  216. package/tests/verify-owned-runtime-release.test.mjs +371 -0
  217. package/tests/workspace-live.test.mjs +127 -0
  218. package/tools/benchmark/diagnose-request.mjs +59 -36
  219. package/tools/benchmark/eval-common.mjs +3 -3
  220. package/tools/benchmark/evaluators.test.mjs +4 -4
  221. package/tools/benchmark/guard.test.mjs +35 -2
  222. package/tools/benchmark/guard.ts +20 -7
  223. package/tools/benchmark/planning-startup.test.mjs +30 -34
  224. package/tools/benchmark/runner.mjs +12 -7
  225. package/tools/benchmark/runner.test.mjs +23 -7
  226. package/tools/benchmark/upstream-error.test.mjs +16 -2
  227. package/tools/generate-owned-runtime-release.mjs +217 -0
  228. package/tools/installed-runtime-contract.mjs +16 -0
  229. package/tools/manual-runtime-manifest.mjs +39 -0
  230. package/tools/native-fixture-browser-cleanup.mjs +59 -0
  231. package/tools/native-fixture-stop-diagnostics.mjs +43 -0
  232. package/tools/native-fixture.mjs +199 -40
  233. package/tools/native-glyph-helpers.py +127 -0
  234. package/tools/native-glyph-pty.py +144 -0
  235. package/tools/native-manual-projects.mjs +259 -0
  236. package/tools/native-manual.mjs +338 -0
  237. package/tools/native-model-picker-acceptance.py +306 -0
  238. package/tools/native-owned-runtime-env.sh +47 -0
  239. package/tools/native-paired-guards.mjs +282 -0
  240. package/tools/native-paired-manifest.mjs +72 -0
  241. package/tools/native-paired-orchestration.sh +51 -0
  242. package/tools/native-plugin-readiness.mjs +33 -0
  243. package/tools/native-plugin-readiness.test.mjs +53 -0
  244. package/tools/native-pty-invocation.mjs +26 -0
  245. package/tools/native-pty-runtime.mjs +83 -0
  246. package/tools/native-pty-smoke.py +147 -24
  247. package/tools/native-public-repo-shell-result.mjs +13 -0
  248. package/tools/native-public-repo-shell-result.test.mjs +28 -0
  249. package/tools/native-runtime-identity.mjs +201 -0
  250. package/tools/native-slash-acceptance-env.py +38 -0
  251. package/tools/native-terminal-semantics.py +876 -0
  252. package/tools/owned-shell-observer/index.ts +16 -0
  253. package/tools/owned-shell-observer/package.json +1 -0
  254. package/tools/owned-visual-clear-env.py +48 -0
  255. package/tools/owned-visual-clear-model.py +21 -0
  256. package/tools/pinned-owned-runtime-inputs.mjs +46 -0
  257. package/tools/prepare-native-manual.mjs +122 -0
  258. package/tools/run-native-terminal-paired.sh +403 -0
  259. package/tools/runtime-token-env.mjs +8 -0
  260. package/tools/seed-native-switch-fixture.mjs +79 -0
  261. package/tools/test-native-controls.mjs +3 -1
  262. package/tools/test-native-daily-quests.mjs +65 -0
  263. package/tools/test-native-default-cli.mjs +106 -0
  264. package/tools/test-native-delivery-host.mjs +102 -20
  265. package/tools/test-native-evaluation.mjs +7 -3
  266. package/tools/test-native-glyph-pty.mjs +94 -0
  267. package/tools/test-native-host.mjs +87 -63
  268. package/tools/test-native-outcomes.mjs +3 -1
  269. package/tools/test-native-package.mjs +206 -38
  270. package/tools/test-native-performance.mjs +26 -0
  271. package/tools/test-native-product.mjs +90 -0
  272. package/tools/test-native-pty.mjs +34 -9
  273. package/tools/test-native-public-repo.mjs +224 -0
  274. package/tools/test-native-refresh-reentry.mjs +106 -0
  275. package/tools/test-native-report.mjs +27 -20
  276. package/tools/test-native-review.mjs +75 -0
  277. package/tools/test-native-runtime.mjs +120 -0
  278. package/tools/test-native-ship-models.mjs +176 -0
  279. package/tools/test-native-ship-walkthrough.mjs +96 -0
  280. package/tools/test-native-slash-commands.mjs +125 -0
  281. package/tools/test-native-slash-commands.py +242 -0
  282. package/tools/test-native-swe-host.mjs +224 -55
  283. package/tools/test-native-tasks.mjs +77 -0
  284. package/tools/test-native-terminal-performance.py +887 -0
  285. package/tools/test-native-terminal-readiness.sh +85 -0
  286. package/tools/test-native-terminal-semantics-installed.mjs +38 -0
  287. package/tools/test-native-visual-clear-installed.mjs +48 -0
  288. package/tools/test-owned-host-controls.mjs +238 -0
  289. package/tools/test-owned-opencode-runtime.mjs +35 -0
  290. package/tools/test-owned-visual-clear-env.py +120 -0
  291. package/tools/test-owned-visual-clear.py +373 -0
  292. package/tools/verify-draft-runtime-gate.mjs +138 -0
  293. package/tools/verify-owned-runtime-release.mjs +114 -0
  294. package/tools/verify-release-version.mjs +21 -1
@@ -0,0 +1,62 @@
1
+ {
2
+ "startedAtUtc": "2026-10-17T18:52:04.371097+00:00",
3
+ "case": "picker-regression",
4
+ "binary": "/tmp/opencode/ctg-final-runtime-build/resume-build/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
5
+ "binaryResolvedPath": "/tmp/opencode/ctg-final-runtime-build/resume-build/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
6
+ "binarySha256": "85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794",
7
+ "buildHash": "85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794",
8
+ "binaryVersion": "opencode v0.0.0-ctg.2.0.32",
9
+ "probeSha256": "f35acbcd8e506a32c0ee5240b3cd53be34fe551c7166e3327017c69ab2a57809",
10
+ "pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
11
+ "sourceCommit": "1a79b489ba9f287efc03cf2c580ade546d0c9140",
12
+ "workingTreeDirty": true,
13
+ "sourceStatus": "M tools/native-terminal-semantics.py",
14
+ "sourceTreeSha256": "117be09476e05d5b2714a2d2cdbe299074b95c272d76b045246ee1bde67259ee",
15
+ "sourceDiffDirty": true,
16
+ "provider": "loopback offline fixture",
17
+ "terminal": {
18
+ "initialRows": 32,
19
+ "initialColumns": 100,
20
+ "resizeRows": null,
21
+ "resizeColumns": null,
22
+ "TERM": "xterm-256color"
23
+ },
24
+ "controlledHostClipboardModel": true,
25
+ "physicalOSClipboardVerified": false,
26
+ "checks": {
27
+ "pickerEscapeCancel": {
28
+ "status": "UNVERIFIED",
29
+ "reason": "picker case did not complete observable Escape dismissal"
30
+ },
31
+ "promptSubmission": {
32
+ "status": "FAIL",
33
+ "providerRequests": 0,
34
+ "noPromptSentDuringPickerAcceptance": true
35
+ },
36
+ "narrowLayout": {
37
+ "status": "NOT_RUN",
38
+ "reason": "picker-only case does not resize terminal"
39
+ },
40
+ "focusedPromptTransport": {
41
+ "status": "NOT_RUN",
42
+ "reason": "picker-only case intentionally submits no prompt"
43
+ },
44
+ "terminalTitleRestoration": {
45
+ "status": "NOT_RUN",
46
+ "reason": "picker-only case exits without title acceptance"
47
+ },
48
+ "selectionClipboard": {
49
+ "status": "NOT_RUN",
50
+ "reason": "picker-only case does not exercise selection"
51
+ },
52
+ "clipboardOSC52": {
53
+ "status": "NOT_RUN",
54
+ "reason": "picker-only case does not exercise /copy"
55
+ }
56
+ },
57
+ "status": "INCOMPLETE",
58
+ "incompleteChecks": [
59
+ "pickerEscapeCancel",
60
+ "promptSubmission"
61
+ ]
62
+ }
@@ -0,0 +1,161 @@
1
+ {
2
+ "startedAtUtc": "2026-10-17T14:40:43.661545+00:00",
3
+ "case": "focused-host-roundtrip",
4
+ "binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
5
+ "binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
6
+ "binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
7
+ "buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
8
+ "binaryVersion": "opencode v0.0.0-ctg.2.0.32",
9
+ "probeSha256": "32d68e5996fc84c8874afda4beeacf88a4b6f57f2d219b9cf81be3011cd87246",
10
+ "pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
11
+ "sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
12
+ "workingTreeDirty": true,
13
+ "sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
14
+ "sourceTreeSha256": "37826cbf469a5de797050c8bb63256018622f20de82009c9b3737d134bf50dc8",
15
+ "sourceDiffDirty": true,
16
+ "provider": "loopback offline fixture",
17
+ "terminal": {
18
+ "initialRows": 32,
19
+ "initialColumns": 100,
20
+ "resizeRows": null,
21
+ "resizeColumns": null,
22
+ "TERM": "xterm-256color"
23
+ },
24
+ "controlledHostClipboardModel": true,
25
+ "physicalOSClipboardVerified": false,
26
+ "checks": {
27
+ "focusedPromptTransport": {
28
+ "status": "PASS",
29
+ "exactProviderUserMessage": true,
30
+ "providerRequests": 2
31
+ },
32
+ "pickerEscapeCancel": {
33
+ "status": "NOT_RUN",
34
+ "reason": "focused terminal-host case intentionally skips picker scenario"
35
+ },
36
+ "narrowLayout": {
37
+ "status": "NOT_RUN",
38
+ "reason": "focused terminal-host case intentionally skips resize scenario"
39
+ },
40
+ "terminalTitleRestoration": {
41
+ "status": "UNVERIFIED",
42
+ "reason": "Controlled terminal host restored the seeded original title after normal TUI exit",
43
+ "controlledHostModel": true,
44
+ "normalExitCode": 0,
45
+ "exitActions": [
46
+ "ctrl-u+quit+enter",
47
+ "enter",
48
+ "ctrl-c"
49
+ ],
50
+ "forcedTerminationAfterExitRequestTimeout": false,
51
+ "ptyDrainedToEof": true,
52
+ "titleSaveControls": 1,
53
+ "titleRestoreControls": 1,
54
+ "titleControlOrder": [
55
+ "save",
56
+ "restore"
57
+ ],
58
+ "modeledTitleStackDepth": 0,
59
+ "titleControlsObserved": [
60
+ "save",
61
+ "restore"
62
+ ],
63
+ "titleControlSequences": [
64
+ "22;0",
65
+ "23;0"
66
+ ],
67
+ "initialTitle": "CTG-ORIGINAL-TITLE",
68
+ "finalTitle": "CTG-ORIGINAL-TITLE",
69
+ "titleSequenceObserved": [
70
+ "OpenCode",
71
+ "OpenCode",
72
+ "OpenCode",
73
+ "OC | FINAL[SNIP]END",
74
+ "OC | FINAL[SNIP]END",
75
+ "",
76
+ "",
77
+ "CTG-ORIGINAL-TITLE"
78
+ ],
79
+ "oscTitleUpdates": [
80
+ {
81
+ "kind": "0",
82
+ "title": "OpenCode"
83
+ },
84
+ {
85
+ "kind": "0",
86
+ "title": "OpenCode"
87
+ },
88
+ {
89
+ "kind": "0",
90
+ "title": "OpenCode"
91
+ },
92
+ {
93
+ "kind": "0",
94
+ "title": "OC | FINAL[SNIP]END"
95
+ },
96
+ {
97
+ "kind": "0",
98
+ "title": "OC | FINAL[SNIP]END"
99
+ },
100
+ {
101
+ "kind": "0",
102
+ "title": ""
103
+ },
104
+ {
105
+ "kind": "0",
106
+ "title": ""
107
+ }
108
+ ],
109
+ "recordedRunStatus": "PASS",
110
+ "acceptanceReason": "The captured PASS is from binary 30a3bb65…, which predates the final title patch; not acceptance evidence."
111
+ },
112
+ "selectionClipboard": {
113
+ "status": "UNVERIFIED",
114
+ "reason": "Controlled host model accepted and queried OSC 52 containing only the exact selected substring; this is not physical OS clipboard proof",
115
+ "mouseReporting": true,
116
+ "mouseDragSent": true,
117
+ "fixtureResponseInCapturedPty": true,
118
+ "fixtureResponseInScreenModel": true,
119
+ "screenExcerpt": "┃ ┃\n ┃\n\n FINALSNIPEND\n\n Build · Offline fixture · 153ms\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ┃\n ┃ ▄\n █▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀█\n █ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀▀ure\n ▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n /tmp/ctg-terminal-semantics-0aht3pya/project shift+tab agents ctrl+p commands\n Continue opencode -s ses_eb5b11600ffe2KAMma5YXgti4i",
120
+ "selectedSubstring": "SNIP",
121
+ "mouseCoordinates": {
122
+ "startColumn": 11,
123
+ "endColumn": 14,
124
+ "row": 7,
125
+ "screenLine": " FINALSNIPEND",
126
+ "coordinateBasis": "1-based displayed terminal cells"
127
+ },
128
+ "controlledHostClipboardUpdates": [
129
+ "SNIP"
130
+ ],
131
+ "clipboardUpdateDeltaBeforeCopy": [
132
+ "SNIP"
133
+ ],
134
+ "controlledHostClipboardReadback": "SNIP",
135
+ "physicalOSClipboardVerified": false,
136
+ "recordedRunStatus": "PASS",
137
+ "acceptanceReason": "Recorded controlled-model readback used a stale binary and is not accepted for the pending final-binary native-selection lane."
138
+ },
139
+ "clipboardOSC52": {
140
+ "status": "UNVERIFIED",
141
+ "reason": "Controlled host model accepted and queried OSC 52 with the exact distinct latest fixture response; this is not physical OS clipboard proof",
142
+ "copyActionSent": true,
143
+ "controlledHostClipboardUpdates": [
144
+ "FINAL[SNIP]END"
145
+ ],
146
+ "clipboardUpdateDeltaAfterSelection": [
147
+ "FINAL[SNIP]END"
148
+ ],
149
+ "controlledHostClipboardReadback": "FINAL[SNIP]END",
150
+ "physicalOSClipboardVerified": false,
151
+ "recordedRunStatus": "PASS",
152
+ "acceptanceReason": "Recorded controlled-model readback used a stale binary and is not accepted for the pending final-binary /copy lane."
153
+ }
154
+ },
155
+ "status": "INCOMPLETE",
156
+ "incompleteChecks": [
157
+ "terminalTitleRestoration",
158
+ "selectionClipboard",
159
+ "clipboardOSC52"
160
+ ]
161
+ }
@@ -0,0 +1,153 @@
1
+ {
2
+ "startedAtUtc": "2026-10-17T14:42:46.883521+00:00",
3
+ "case": "layout-regression",
4
+ "binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
5
+ "binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
6
+ "binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
7
+ "buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
8
+ "binaryVersion": "opencode v0.0.0-ctg.2.0.32",
9
+ "probeSha256": "4b9ec52b5a0962fc129daff5fd3f249bae104efee34632f53526fa8a6ab472b1",
10
+ "pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
11
+ "sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
12
+ "workingTreeDirty": true,
13
+ "sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
14
+ "sourceTreeSha256": "809c23db2d339947e325b2b53854397a3597995a03f387ad270e55df1eb44258",
15
+ "sourceDiffDirty": true,
16
+ "provider": "loopback offline fixture",
17
+ "terminal": {
18
+ "initialRows": 32,
19
+ "initialColumns": 100,
20
+ "resizeRows": 12,
21
+ "resizeColumns": 40,
22
+ "TERM": "xterm-256color"
23
+ },
24
+ "controlledHostClipboardModel": true,
25
+ "physicalOSClipboardVerified": false,
26
+ "checks": {
27
+ "focusedPromptTransport": {
28
+ "status": "PASS",
29
+ "exactProviderUserMessage": true,
30
+ "providerRequests": 2
31
+ },
32
+ "pickerEscapeCancel": {
33
+ "status": "NOT_RUN",
34
+ "reason": "focused layout regression case does not open picker"
35
+ },
36
+ "narrowLayout": {
37
+ "status": "UNVERIFIED",
38
+ "rows": 12,
39
+ "columns": 40,
40
+ "resizeRequested": true,
41
+ "hostAlive": true,
42
+ "fixtureResponseVisible": true,
43
+ "composerVisible": true,
44
+ "pickerAbsent": true,
45
+ "visibleRowsWithinWidth": true,
46
+ "visibleScreenExcerpt": " • FINAL[SNIP]END +\n FINALSNIPEND\n\n Build · Offline fixture · 233ms\n\n ┃\n ┃\n ┃\n ┃ Offline fixture\n ╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n /…/ctg-terminal-semantics-hdz…/project\n",
47
+ "recordedRunStatus": "PASS",
48
+ "acceptanceReason": "Recorded 40x12 observation is from the superseded binary and is not current narrow-layout acceptance evidence."
49
+ },
50
+ "terminalTitleRestoration": {
51
+ "status": "UNVERIFIED",
52
+ "reason": "Controlled terminal host restored the seeded original title after normal TUI exit",
53
+ "controlledHostModel": true,
54
+ "normalExitCode": 0,
55
+ "exitActions": [
56
+ "ctrl-u+quit+enter",
57
+ "enter",
58
+ "ctrl-c"
59
+ ],
60
+ "forcedTerminationAfterExitRequestTimeout": false,
61
+ "ptyDrainedToEof": true,
62
+ "titleSaveControls": 1,
63
+ "titleRestoreControls": 1,
64
+ "titleControlOrder": [
65
+ "save",
66
+ "restore"
67
+ ],
68
+ "modeledTitleStackDepth": 0,
69
+ "titleControlsObserved": [
70
+ "save",
71
+ "restore"
72
+ ],
73
+ "titleControlSequences": [
74
+ "22;0",
75
+ "23;0"
76
+ ],
77
+ "initialTitle": "CTG-ORIGINAL-TITLE",
78
+ "finalTitle": "CTG-ORIGINAL-TITLE",
79
+ "titleSequenceObserved": [
80
+ "OpenCode",
81
+ "OpenCode",
82
+ "OpenCode",
83
+ "OC | FINAL[SNIP]END",
84
+ "",
85
+ "",
86
+ "CTG-ORIGINAL-TITLE"
87
+ ],
88
+ "oscTitleUpdates": [
89
+ {
90
+ "kind": "0",
91
+ "title": "OpenCode"
92
+ },
93
+ {
94
+ "kind": "0",
95
+ "title": "OpenCode"
96
+ },
97
+ {
98
+ "kind": "0",
99
+ "title": "OpenCode"
100
+ },
101
+ {
102
+ "kind": "0",
103
+ "title": "OC | FINAL[SNIP]END"
104
+ },
105
+ {
106
+ "kind": "0",
107
+ "title": ""
108
+ },
109
+ {
110
+ "kind": "0",
111
+ "title": ""
112
+ }
113
+ ],
114
+ "recordedRunStatus": "PASS",
115
+ "acceptanceReason": "The captured PASS is from binary 30a3bb65…, which predates the final title patch; not acceptance evidence."
116
+ },
117
+ "selectionClipboard": {
118
+ "status": "UNVERIFIED",
119
+ "reason": "Native selection gesture did not yield an exact selection OSC 52 update and modeled readback",
120
+ "mouseReporting": true,
121
+ "mouseDragSent": false,
122
+ "fixtureResponseInCapturedPty": true,
123
+ "fixtureResponseInScreenModel": true,
124
+ "screenExcerpt": " • FINAL[SNIP]END +\n FINALSNIPEND\n\n Build · Offline fixture · 233ms\n ┃ /quit Exit the app ┃\n ┃\n ┃ /quit^C\n ▄\n █▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀\n█╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n █ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀\nj7QX6uUwoFTWAhencode -s ses_eb5af33c0ffe",
125
+ "selectedSubstring": null,
126
+ "mouseCoordinates": null,
127
+ "controlledHostClipboardUpdates": [],
128
+ "clipboardUpdateDeltaBeforeCopy": [],
129
+ "controlledHostClipboardReadback": null,
130
+ "physicalOSClipboardVerified": false,
131
+ "recordedRunStatus": "UNVERIFIED",
132
+ "acceptanceReason": "No accepted exact native-selection result on the final binary."
133
+ },
134
+ "clipboardOSC52": {
135
+ "status": "UNVERIFIED",
136
+ "reason": "No exact new OSC 52 clipboard value and readback observed after /copy",
137
+ "copyActionSent": false,
138
+ "controlledHostClipboardUpdates": [],
139
+ "clipboardUpdateDeltaAfterSelection": [],
140
+ "controlledHostClipboardReadback": null,
141
+ "physicalOSClipboardVerified": false,
142
+ "recordedRunStatus": "UNVERIFIED",
143
+ "acceptanceReason": "No accepted /copy result on the final binary."
144
+ }
145
+ },
146
+ "status": "INCOMPLETE",
147
+ "incompleteChecks": [
148
+ "narrowLayout",
149
+ "terminalTitleRestoration",
150
+ "selectionClipboard",
151
+ "clipboardOSC52"
152
+ ]
153
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "startedAtUtc": "2026-10-17T14:43:53.197554+00:00",
3
+ "case": "picker-regression",
4
+ "binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
5
+ "binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
6
+ "binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
7
+ "buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
8
+ "binaryVersion": "opencode v0.0.0-ctg.2.0.32",
9
+ "probeSha256": "4b9ec52b5a0962fc129daff5fd3f249bae104efee34632f53526fa8a6ab472b1",
10
+ "pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
11
+ "sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
12
+ "workingTreeDirty": true,
13
+ "sourceStatus": "M docs/native-terminal-semantics.md\n M tools/native-terminal-semantics.py",
14
+ "sourceTreeSha256": "809c23db2d339947e325b2b53854397a3597995a03f387ad270e55df1eb44258",
15
+ "sourceDiffDirty": true,
16
+ "provider": "loopback offline fixture",
17
+ "terminal": {
18
+ "initialRows": 32,
19
+ "initialColumns": 100,
20
+ "resizeRows": null,
21
+ "resizeColumns": null,
22
+ "TERM": "xterm-256color"
23
+ },
24
+ "controlledHostClipboardModel": true,
25
+ "physicalOSClipboardVerified": false,
26
+ "checks": {
27
+ "pickerEscapeCancel": {
28
+ "status": "UNVERIFIED",
29
+ "reason": "picker case did not complete observable Escape dismissal"
30
+ },
31
+ "promptSubmission": {
32
+ "status": "FAIL",
33
+ "providerRequests": 0,
34
+ "noPromptSentDuringPickerAcceptance": true
35
+ },
36
+ "narrowLayout": {
37
+ "status": "NOT_RUN",
38
+ "reason": "picker-only case does not resize terminal"
39
+ },
40
+ "focusedPromptTransport": {
41
+ "status": "NOT_RUN",
42
+ "reason": "picker-only case intentionally submits no prompt"
43
+ },
44
+ "terminalTitleRestoration": {
45
+ "status": "NOT_RUN",
46
+ "reason": "picker-only case exits without title acceptance"
47
+ },
48
+ "selectionClipboard": {
49
+ "status": "NOT_RUN",
50
+ "reason": "picker-only case does not exercise selection"
51
+ },
52
+ "clipboardOSC52": {
53
+ "status": "NOT_RUN",
54
+ "reason": "picker-only case does not exercise /copy"
55
+ }
56
+ },
57
+ "status": "INCOMPLETE",
58
+ "incompleteChecks": [
59
+ "pickerEscapeCancel",
60
+ "promptSubmission"
61
+ ]
62
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "startedAtUtc": "2026-10-17T14:34:42.707210+00:00",
3
+ "binary": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
4
+ "binaryResolvedPath": "/tmp/opencode/ctg-parity-prototype/opencode-src/packages/cli/dist-ctg/cli-linux-x64/bin/opencode",
5
+ "binarySha256": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
6
+ "buildHash": "30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484",
7
+ "binaryVersion": "opencode v0.0.0-ctg.2.0.32",
8
+ "probeSha256": "61bf1116d951b41a94b5d1fbf97ee89c45cde225aa07f45153ebcb350a75bfcf",
9
+ "pluginSha256": "f162e6184bcb7980c7ec61e3c5c675563351aa814127cbb0a7fa1b6f79f116e6",
10
+ "sourceCommit": "608ea09855edafbe97bad47a799b9f4bc3cdf51d",
11
+ "workingTreeDirty": true,
12
+ "sourceDiffDirty": true,
13
+ "provider": "loopback offline fixture",
14
+ "terminal": {
15
+ "initialRows": 32,
16
+ "initialColumns": 100,
17
+ "resizeRows": 12,
18
+ "resizeColumns": 40,
19
+ "TERM": "xterm-256color"
20
+ },
21
+ "controlledHostClipboardModel": true,
22
+ "physicalOSClipboardVerified": false,
23
+ "checks": {
24
+ "pickerEscapeCancel": {
25
+ "status": "PASS",
26
+ "pickerObserved": true,
27
+ "cancelKey": "Escape",
28
+ "dismissed": true,
29
+ "composerRestored": true,
30
+ "providerRequestsBeforePrompt": 0,
31
+ "noPromptProviderRequestBeforeAcceptance": true
32
+ },
33
+ "promptSubmission": {
34
+ "status": "PASS",
35
+ "providerRequests": 0,
36
+ "noPromptSentDuringPickerAcceptance": true
37
+ },
38
+ "narrowLayout": {
39
+ "status": "NOT_RUN",
40
+ "reason": "picker-only case does not resize terminal"
41
+ },
42
+ "focusedPromptTransport": {
43
+ "status": "NOT_RUN",
44
+ "reason": "picker-only case intentionally submits no prompt"
45
+ },
46
+ "terminalTitleRestoration": {
47
+ "status": "NOT_RUN",
48
+ "reason": "picker-only case exits without title acceptance"
49
+ },
50
+ "selectionClipboard": {
51
+ "status": "NOT_RUN",
52
+ "reason": "picker-only case does not exercise selection"
53
+ },
54
+ "clipboardOSC52": {
55
+ "status": "NOT_RUN",
56
+ "reason": "picker-only case does not exercise /copy"
57
+ }
58
+ },
59
+ "status": "PASS",
60
+ "incompleteChecks": []
61
+ }
@@ -0,0 +1,89 @@
1
+ # Native terminal semantics probe
2
+
3
+ `npm run test:native-terminal-semantics` is a real-PTY probe for the native
4
+ OpenCode TUI. It requires an explicitly owned 2.0.32 executable:
5
+
6
+ ```sh
7
+ CTG_OPENCODE_BIN=/absolute/path/to/opencode.exe npm run test:native-terminal-semantics
8
+ ```
9
+
10
+ The executable runs with a fresh temporary project, config, database, and XDG
11
+ profile. Its only model endpoint is a loopback offline HTTP fixture; no paid
12
+ provider is contacted. The full probe checks an exact Unicode/large bracketed
13
+ paste, picker cancellation, and the rendered state after resizing the PTY to
14
+ 40x12. Focused switches are available for corrected semantics:
15
+
16
+ ```sh
17
+ CTG_OPENCODE_BIN=/absolute/path/to/opencode \
18
+ python3 tools/native-terminal-semantics.py --focused-host-roundtrip \
19
+ --artifact /tmp/focused.json
20
+ CTG_OPENCODE_BIN=/absolute/path/to/opencode \
21
+ python3 tools/native-terminal-semantics.py --assertion-regression-only \
22
+ --artifact /tmp/layout.json
23
+ CTG_OPENCODE_BIN=/absolute/path/to/opencode \
24
+ python3 tools/native-terminal-semantics.py --picker-regression-only \
25
+ --artifact /tmp/picker.json
26
+ ```
27
+
28
+ The picker-only case opens the picker, sends Escape, and requires dismissal,
29
+ restoration of the home composer, and zero provider requests before acceptance.
30
+ The layout check requires the actual 40x12 PTY geometry, a visible fixture
31
+ response and composer, no visible picker, a live host, and rendered rows that
32
+ fit the viewport.
33
+
34
+ The focused clipboard case seeds modeled clipboard state, drags across exactly
35
+ `SNIP` in the displayed `FINAL[SNIP]END` response, queries the modeled host,
36
+ then invokes `/copy` and checks the new clipboard-update delta and exact
37
+ readback against the distinct full response. Selection and `/copy` statuses
38
+ are labeled as controlled-host-model acceptance. They are not physical OS
39
+ clipboard verification. The `--host-model-only` mode is a parser/state-model
40
+ self-test only; it does not launch OpenCode and is not native acceptance.
41
+
42
+ Title acceptance requires the title-stack save and restore controls in order,
43
+ the seeded title as final modeled host state, a drained PTY, and normal exit
44
+ code zero. Results identify the exact executable path, `--version`, binary
45
+ SHA-256/build hash, probe and plugin hashes, source commit/dirty state, and
46
+ terminal geometry. A non-passing or unrun lane keeps the overall artifact
47
+ incomplete; captured OSC bytes alone never prove physical clipboard behavior.
48
+
49
+ ## Evidence status (PR #162)
50
+
51
+ The evidence directory contains the previous picker/model passes and the latest
52
+ attempted focused/layout artifacts with their original metadata. Treat these as
53
+ provenance, not one all-green suite. The focused and layout PTY runs used binary
54
+ SHA-256 `30a3bb65d4d005c7a12e82d3b97579dc97e451c23b0dac660123f91534c9f484`.
55
+ That build predates the author's final title-restoration patch and is therefore
56
+ not acceptance evidence for title restoration; its recorded title `PASS` is
57
+ explicitly superseded. Its controlled-host OSC 52 observations do not prove
58
+ physical OS clipboard behavior. The latest picker attempt is incomplete and
59
+ does not supersede the earlier recorded picker pass.
60
+
61
+ The supplied binary was identified as `opencode v0.0.0-ctg.2.0.32`, package
62
+ manifest `@opencode/cli-linux-x64` `0.0.0-ctg.2.0.32`, SHA-256
63
+ `85bb44a65e8c185f4f33d41507d29acc77f2db0cdcb0103a14476021c8e43794`. A
64
+ corrected full run passed picker Escape, actual 40x12 layout, exact Unicode
65
+ large-paste transport (18,047 UTF-8 bytes), `/copy`, and ordered title
66
+ restoration. Its selection gesture was incomplete; a focused rerun on the same
67
+ binary passed exact `SNIP` selection/readback, exact distinct `FINAL[SNIP]END`
68
+ copy/readback, and title restoration. These clipboard results are controlled
69
+ OSC 52 host-model results, not physical OS clipboard verification. Results are
70
+ bounded across runs and the full suite remains incomplete as one invocation;
71
+ see `docs/native-terminal-semantics-evidence/` for exact harness hashes and
72
+ per-run caveats. An additional 40x12 interactive run typed unique input,
73
+ backspaced one character, opened and navigated the recent-sessions menu, then
74
+ cancelled with Escape and verified the edited composer returned. This does not
75
+ replace the separate model-picker check. Model-picker behavior has since been
76
+ tested separately using two offline models:
77
+ the native picker showed current A and alternate B, ArrowDown changed rendered
78
+ selection styling to B, Escape cleared the search filter and a second Escape
79
+ dismissed the picker, no provider request occurred during cancellation, active
80
+ the rendered active-session model label remained A, and a unique post-cancel
81
+ prompt reached the fixture with model A. A later probe rerun also required exact
82
+ expected version and independently supplied binary SHA-256 checks before
83
+ execution, and verified that ArrowDown moved the captured selected styling from
84
+ A to B. The prior failed attempt remains retained as superseded evidence.
85
+ Recent-sessions cancellation and model-picker cancellation are separate checks.
86
+ No physical clipboard claim is made.
87
+
88
+ The existing `tests/tui-copy-paste.test.mjs` covers parser logic and selection
89
+ string calculation only; it is not a substitute for this native probe.