@with-logic/elwood 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1199) hide show
  1. package/CHANGELOG.md +383 -2
  2. package/CONTRIBUTING.md +29 -18
  3. package/README.md +32 -7
  4. package/dist/bridge/parse.d.ts.map +1 -1
  5. package/dist/bridge/parse.js +2 -1
  6. package/dist/bridge/parse.js.map +1 -1
  7. package/dist/bridge/server.d.ts.map +1 -1
  8. package/dist/bridge/server.js +6 -2
  9. package/dist/bridge/server.js.map +1 -1
  10. package/dist/claude/attach-images.d.ts +3 -1
  11. package/dist/claude/attach-images.d.ts.map +1 -1
  12. package/dist/claude/attach-images.js +11 -10
  13. package/dist/claude/attach-images.js.map +1 -1
  14. package/dist/claude/composer/empty-input.d.ts +4 -0
  15. package/dist/claude/composer/empty-input.d.ts.map +1 -0
  16. package/dist/claude/composer/empty-input.js +28 -0
  17. package/dist/claude/composer/empty-input.js.map +1 -0
  18. package/dist/claude/composer/footer.d.ts +3 -0
  19. package/dist/claude/composer/footer.d.ts.map +1 -0
  20. package/dist/claude/composer/footer.js +3 -0
  21. package/dist/claude/composer/footer.js.map +1 -0
  22. package/dist/claude/composer/staged-input.d.ts +7 -0
  23. package/dist/claude/composer/staged-input.d.ts.map +1 -0
  24. package/dist/claude/composer/staged-input.js +18 -0
  25. package/dist/claude/composer/staged-input.js.map +1 -0
  26. package/dist/claude/hooks/common-result.d.ts +5 -0
  27. package/dist/claude/hooks/common-result.d.ts.map +1 -0
  28. package/dist/claude/hooks/common-result.js +3 -0
  29. package/dist/claude/hooks/common-result.js.map +1 -0
  30. package/dist/claude/hooks/dispatch.d.ts +2 -1
  31. package/dist/claude/hooks/dispatch.d.ts.map +1 -1
  32. package/dist/claude/hooks/dispatch.js +3 -1
  33. package/dist/claude/hooks/dispatch.js.map +1 -1
  34. package/dist/claude/hooks/events-extra.d.ts +5 -4
  35. package/dist/claude/hooks/events-extra.d.ts.map +1 -1
  36. package/dist/claude/hooks/index.d.ts +10 -10
  37. package/dist/claude/hooks/index.d.ts.map +1 -1
  38. package/dist/claude/hooks/index.js +1 -4
  39. package/dist/claude/hooks/index.js.map +1 -1
  40. package/dist/claude/hooks/inputs/control.d.ts +25 -0
  41. package/dist/claude/hooks/inputs/control.d.ts.map +1 -0
  42. package/dist/claude/hooks/inputs/control.js +3 -0
  43. package/dist/claude/hooks/inputs/control.js.map +1 -0
  44. package/dist/claude/hooks/stop-failure.d.ts +10 -0
  45. package/dist/claude/hooks/stop-failure.d.ts.map +1 -0
  46. package/dist/claude/hooks/stop-failure.js +18 -0
  47. package/dist/claude/hooks/stop-failure.js.map +1 -0
  48. package/dist/claude/hooks/tool-types.d.ts +12 -10
  49. package/dist/claude/hooks/tool-types.d.ts.map +1 -1
  50. package/dist/claude/login/notice.d.ts +3 -0
  51. package/dist/claude/login/notice.d.ts.map +1 -0
  52. package/dist/claude/login/notice.js +3 -0
  53. package/dist/claude/login/notice.js.map +1 -0
  54. package/dist/claude/login/renewal.d.ts +13 -0
  55. package/dist/claude/login/renewal.d.ts.map +1 -0
  56. package/dist/claude/login/renewal.js +97 -0
  57. package/dist/claude/login/renewal.js.map +1 -0
  58. package/dist/claude/model-composer.d.ts +2 -0
  59. package/dist/claude/model-composer.d.ts.map +1 -0
  60. package/dist/claude/model-composer.js +12 -0
  61. package/dist/claude/model-composer.js.map +1 -0
  62. package/dist/claude/model-picker.d.ts.map +1 -1
  63. package/dist/claude/model-picker.js +42 -8
  64. package/dist/claude/model-picker.js.map +1 -1
  65. package/dist/claude/model-switch-confirmation.d.ts +6 -0
  66. package/dist/claude/model-switch-confirmation.d.ts.map +1 -1
  67. package/dist/claude/model-switch-confirmation.js +77 -4
  68. package/dist/claude/model-switch-confirmation.js.map +1 -1
  69. package/dist/claude/preflight.d.ts.map +1 -1
  70. package/dist/claude/preflight.js +2 -4
  71. package/dist/claude/preflight.js.map +1 -1
  72. package/dist/claude/questions/answer.d.ts +9 -0
  73. package/dist/claude/questions/answer.d.ts.map +1 -0
  74. package/dist/claude/questions/answer.js +84 -0
  75. package/dist/claude/questions/answer.js.map +1 -0
  76. package/dist/claude/questions/bind-answers.d.ts +14 -0
  77. package/dist/claude/questions/bind-answers.d.ts.map +1 -0
  78. package/dist/claude/questions/bind-answers.js +36 -0
  79. package/dist/claude/questions/bind-answers.js.map +1 -0
  80. package/dist/claude/questions/candidate.d.ts +23 -0
  81. package/dist/claude/questions/candidate.d.ts.map +1 -0
  82. package/dist/claude/questions/candidate.js +47 -0
  83. package/dist/claude/questions/candidate.js.map +1 -0
  84. package/dist/claude/questions/correlation.d.ts +15 -0
  85. package/dist/claude/questions/correlation.d.ts.map +1 -0
  86. package/dist/claude/questions/correlation.js +23 -0
  87. package/dist/claude/questions/correlation.js.map +1 -0
  88. package/dist/claude/questions/hook-decisions.d.ts +19 -0
  89. package/dist/claude/questions/hook-decisions.d.ts.map +1 -0
  90. package/dist/claude/questions/hook-decisions.js +52 -0
  91. package/dist/claude/questions/hook-decisions.js.map +1 -0
  92. package/dist/claude/questions/index.d.ts +27 -0
  93. package/dist/claude/questions/index.d.ts.map +1 -0
  94. package/dist/claude/questions/index.js +161 -0
  95. package/dist/claude/questions/index.js.map +1 -0
  96. package/dist/claude/questions/navigation.d.ts +24 -0
  97. package/dist/claude/questions/navigation.d.ts.map +1 -0
  98. package/dist/claude/questions/navigation.js +37 -0
  99. package/dist/claude/questions/navigation.js.map +1 -0
  100. package/dist/claude/questions/rows.d.ts +19 -0
  101. package/dist/claude/questions/rows.d.ts.map +1 -0
  102. package/dist/claude/questions/rows.js +64 -0
  103. package/dist/claude/questions/rows.js.map +1 -0
  104. package/dist/claude/questions/screen.d.ts +29 -0
  105. package/dist/claude/questions/screen.d.ts.map +1 -0
  106. package/dist/claude/questions/screen.js +103 -0
  107. package/dist/claude/questions/screen.js.map +1 -0
  108. package/dist/claude/screen-table.d.ts +19 -2
  109. package/dist/claude/screen-table.d.ts.map +1 -1
  110. package/dist/claude/screen-table.js +48 -4
  111. package/dist/claude/screen-table.js.map +1 -1
  112. package/dist/claude/serialize.d.ts.map +1 -1
  113. package/dist/claude/serialize.js +22 -6
  114. package/dist/claude/serialize.js.map +1 -1
  115. package/dist/claude/session/build.d.ts +1 -12
  116. package/dist/claude/session/build.d.ts.map +1 -1
  117. package/dist/claude/session/build.js +42 -55
  118. package/dist/claude/session/build.js.map +1 -1
  119. package/dist/claude/session/hook-handler.d.ts +3 -2
  120. package/dist/claude/session/hook-handler.d.ts.map +1 -1
  121. package/dist/claude/session/hook-handler.js +44 -18
  122. package/dist/claude/session/hook-handler.js.map +1 -1
  123. package/dist/claude/session/index.d.ts +2 -1
  124. package/dist/claude/session/index.d.ts.map +1 -1
  125. package/dist/claude/session/index.js +23 -8
  126. package/dist/claude/session/index.js.map +1 -1
  127. package/dist/claude/session/instance.d.ts +17 -5
  128. package/dist/claude/session/instance.d.ts.map +1 -1
  129. package/dist/claude/session/instance.js +25 -12
  130. package/dist/claude/session/instance.js.map +1 -1
  131. package/dist/claude/session/interface.d.ts +2 -1
  132. package/dist/claude/session/interface.d.ts.map +1 -1
  133. package/dist/claude/session/questions.d.ts +9 -0
  134. package/dist/claude/session/questions.d.ts.map +1 -0
  135. package/dist/claude/session/questions.js +19 -0
  136. package/dist/claude/session/questions.js.map +1 -0
  137. package/dist/claude/session/resume.d.ts.map +1 -1
  138. package/dist/claude/session/resume.js +35 -26
  139. package/dist/claude/session/resume.js.map +1 -1
  140. package/dist/claude/session/runtime.d.ts +10 -0
  141. package/dist/claude/session/runtime.d.ts.map +1 -1
  142. package/dist/claude/session/runtime.js +8 -5
  143. package/dist/claude/session/runtime.js.map +1 -1
  144. package/dist/claude/session/startup-warnings.d.ts +5 -0
  145. package/dist/claude/session/startup-warnings.d.ts.map +1 -0
  146. package/dist/claude/session/startup-warnings.js +7 -0
  147. package/dist/claude/session/startup-warnings.js.map +1 -0
  148. package/dist/claude/session/transcript.d.ts +2 -0
  149. package/dist/claude/session/transcript.d.ts.map +1 -1
  150. package/dist/claude/session/transcript.js +21 -3
  151. package/dist/claude/session/transcript.js.map +1 -1
  152. package/dist/claude/startup-prompts.d.ts +35 -3
  153. package/dist/claude/startup-prompts.d.ts.map +1 -1
  154. package/dist/claude/startup-prompts.js +81 -15
  155. package/dist/claude/startup-prompts.js.map +1 -1
  156. package/dist/claude/transcript/index.d.ts.map +1 -1
  157. package/dist/claude/transcript/index.js +3 -2
  158. package/dist/claude/transcript/index.js.map +1 -1
  159. package/dist/claude/validate/event-fields.d.ts +6 -0
  160. package/dist/claude/validate/event-fields.d.ts.map +1 -0
  161. package/dist/claude/validate/event-fields.js +103 -0
  162. package/dist/claude/validate/event-fields.js.map +1 -0
  163. package/dist/claude/validate/input.d.ts.map +1 -1
  164. package/dist/claude/validate/input.js +12 -41
  165. package/dist/claude/validate/input.js.map +1 -1
  166. package/dist/claude/validate/shapes.d.ts +1 -1
  167. package/dist/claude/validate/shapes.d.ts.map +1 -1
  168. package/dist/claude/validate/shapes.js +1 -1
  169. package/dist/claude/validate/shapes.js.map +1 -1
  170. package/dist/claude/validate/tool-shapes.d.ts +102 -0
  171. package/dist/claude/validate/tool-shapes.d.ts.map +1 -0
  172. package/dist/claude/validate/tool-shapes.js +83 -0
  173. package/dist/claude/validate/tool-shapes.js.map +1 -0
  174. package/dist/claude/validate/tool-update.d.ts +2 -11
  175. package/dist/claude/validate/tool-update.d.ts.map +1 -1
  176. package/dist/claude/validate/tool-update.js +11 -112
  177. package/dist/claude/validate/tool-update.js.map +1 -1
  178. package/dist/claude/validate/tool-values.d.ts +7 -0
  179. package/dist/claude/validate/tool-values.d.ts.map +1 -0
  180. package/dist/claude/validate/tool-values.js +30 -0
  181. package/dist/claude/validate/tool-values.js.map +1 -0
  182. package/dist/cli/args/options.d.ts.map +1 -1
  183. package/dist/cli/args/options.js +1 -0
  184. package/dist/cli/args/options.js.map +1 -1
  185. package/dist/cli/args-commands.d.ts.map +1 -1
  186. package/dist/cli/args-commands.js +3 -0
  187. package/dist/cli/args-commands.js.map +1 -1
  188. package/dist/cli/config/store.d.ts.map +1 -1
  189. package/dist/cli/config/store.js +2 -1
  190. package/dist/cli/config/store.js.map +1 -1
  191. package/dist/cli/help.d.ts +1 -1
  192. package/dist/cli/help.d.ts.map +1 -1
  193. package/dist/cli/help.js +2 -1
  194. package/dist/cli/help.js.map +1 -1
  195. package/dist/cli/interactive/effort.d.ts +5 -0
  196. package/dist/cli/interactive/effort.d.ts.map +1 -0
  197. package/dist/cli/interactive/effort.js +13 -0
  198. package/dist/cli/interactive/effort.js.map +1 -0
  199. package/dist/cli/interactive/launch.d.ts.map +1 -1
  200. package/dist/cli/interactive/launch.js +1 -1
  201. package/dist/cli/interactive/launch.js.map +1 -1
  202. package/dist/cli/lifecycle/index.d.ts +3 -6
  203. package/dist/cli/lifecycle/index.d.ts.map +1 -1
  204. package/dist/cli/lifecycle/index.js +6 -13
  205. package/dist/cli/lifecycle/index.js.map +1 -1
  206. package/dist/cli/models/settings.d.ts +2 -0
  207. package/dist/cli/models/settings.d.ts.map +1 -1
  208. package/dist/cli/request/index.d.ts.map +1 -1
  209. package/dist/cli/request/index.js +1 -0
  210. package/dist/cli/request/index.js.map +1 -1
  211. package/dist/cli/run/index.d.ts.map +1 -1
  212. package/dist/cli/run/index.js +3 -1
  213. package/dist/cli/run/index.js.map +1 -1
  214. package/dist/cli/run/output.d.ts.map +1 -1
  215. package/dist/cli/run/output.js +1 -0
  216. package/dist/cli/run/output.js.map +1 -1
  217. package/dist/cli/run/subscribe.js +1 -1
  218. package/dist/cli/run/subscribe.js.map +1 -1
  219. package/dist/cli/session/index.d.ts +2 -0
  220. package/dist/cli/session/index.d.ts.map +1 -1
  221. package/dist/cli/session/index.js +3 -0
  222. package/dist/cli/session/index.js.map +1 -1
  223. package/dist/cli/session/launch.d.ts +0 -3
  224. package/dist/cli/session/launch.d.ts.map +1 -1
  225. package/dist/cli/session/launch.js +0 -11
  226. package/dist/cli/session/launch.js.map +1 -1
  227. package/dist/cli/sessions/list.d.ts.map +1 -1
  228. package/dist/cli/sessions/list.js +5 -4
  229. package/dist/cli/sessions/list.js.map +1 -1
  230. package/dist/cli/types.d.ts +2 -0
  231. package/dist/cli/types.d.ts.map +1 -1
  232. package/dist/cli/update-attention.d.ts +2 -1
  233. package/dist/cli/update-attention.d.ts.map +1 -1
  234. package/dist/cli/update-attention.js +11 -2
  235. package/dist/cli/update-attention.js.map +1 -1
  236. package/dist/codex/accepted-turn.d.ts +4 -0
  237. package/dist/codex/accepted-turn.d.ts.map +1 -0
  238. package/dist/codex/accepted-turn.js +17 -0
  239. package/dist/codex/accepted-turn.js.map +1 -0
  240. package/dist/codex/config/transaction.d.ts +22 -0
  241. package/dist/codex/config/transaction.d.ts.map +1 -1
  242. package/dist/codex/config/transaction.js +61 -31
  243. package/dist/codex/config/transaction.js.map +1 -1
  244. package/dist/codex/hooks/index.d.ts +6 -1
  245. package/dist/codex/hooks/index.d.ts.map +1 -1
  246. package/dist/codex/hooks/validate-result.d.ts.map +1 -1
  247. package/dist/codex/hooks/validate-result.js +2 -1
  248. package/dist/codex/hooks/validate-result.js.map +1 -1
  249. package/dist/codex/hooks/validate.d.ts.map +1 -1
  250. package/dist/codex/hooks/validate.js +1 -3
  251. package/dist/codex/hooks/validate.js.map +1 -1
  252. package/dist/codex/hooks/values.d.ts +3 -0
  253. package/dist/codex/hooks/values.d.ts.map +1 -0
  254. package/dist/codex/hooks/values.js +5 -0
  255. package/dist/codex/hooks/values.js.map +1 -0
  256. package/dist/codex/images/attach.d.ts +3 -1
  257. package/dist/codex/images/attach.d.ts.map +1 -1
  258. package/dist/codex/images/attach.js +10 -11
  259. package/dist/codex/images/attach.js.map +1 -1
  260. package/dist/codex/images/clipboard.d.ts.map +1 -1
  261. package/dist/codex/images/clipboard.js +11 -3
  262. package/dist/codex/images/clipboard.js.map +1 -1
  263. package/dist/codex/model-picker.d.ts.map +1 -1
  264. package/dist/codex/model-picker.js +23 -5
  265. package/dist/codex/model-picker.js.map +1 -1
  266. package/dist/codex/preflight.d.ts.map +1 -1
  267. package/dist/codex/preflight.js +2 -2
  268. package/dist/codex/preflight.js.map +1 -1
  269. package/dist/codex/questions/acceptance.d.ts +18 -0
  270. package/dist/codex/questions/acceptance.d.ts.map +1 -0
  271. package/dist/codex/questions/acceptance.js +70 -0
  272. package/dist/codex/questions/acceptance.js.map +1 -0
  273. package/dist/codex/questions/adapter.d.ts +26 -0
  274. package/dist/codex/questions/adapter.d.ts.map +1 -0
  275. package/dist/codex/questions/adapter.js +163 -0
  276. package/dist/codex/questions/adapter.js.map +1 -0
  277. package/dist/codex/questions/candidate-acceptance.d.ts +5 -0
  278. package/dist/codex/questions/candidate-acceptance.d.ts.map +1 -0
  279. package/dist/codex/questions/candidate-acceptance.js +8 -0
  280. package/dist/codex/questions/candidate-acceptance.js.map +1 -0
  281. package/dist/codex/questions/candidate-authority.d.ts +10 -0
  282. package/dist/codex/questions/candidate-authority.d.ts.map +1 -0
  283. package/dist/codex/questions/candidate-authority.js +25 -0
  284. package/dist/codex/questions/candidate-authority.js.map +1 -0
  285. package/dist/codex/questions/candidate-disable.d.ts +5 -0
  286. package/dist/codex/questions/candidate-disable.d.ts.map +1 -0
  287. package/dist/codex/questions/candidate-disable.js +14 -0
  288. package/dist/codex/questions/candidate-disable.js.map +1 -0
  289. package/dist/codex/questions/candidate-publication.d.ts +7 -0
  290. package/dist/codex/questions/candidate-publication.d.ts.map +1 -0
  291. package/dist/codex/questions/candidate-publication.js +8 -0
  292. package/dist/codex/questions/candidate-publication.js.map +1 -0
  293. package/dist/codex/questions/candidate-reservation.d.ts +6 -0
  294. package/dist/codex/questions/candidate-reservation.d.ts.map +1 -0
  295. package/dist/codex/questions/candidate-reservation.js +7 -0
  296. package/dist/codex/questions/candidate-reservation.js.map +1 -0
  297. package/dist/codex/questions/candidate-store.d.ts +53 -0
  298. package/dist/codex/questions/candidate-store.d.ts.map +1 -0
  299. package/dist/codex/questions/candidate-store.js +188 -0
  300. package/dist/codex/questions/candidate-store.js.map +1 -0
  301. package/dist/codex/questions/candidate.d.ts +40 -0
  302. package/dist/codex/questions/candidate.d.ts.map +1 -0
  303. package/dist/codex/questions/candidate.js +39 -0
  304. package/dist/codex/questions/candidate.js.map +1 -0
  305. package/dist/codex/questions/candidates.d.ts +16 -0
  306. package/dist/codex/questions/candidates.d.ts.map +1 -0
  307. package/dist/codex/questions/candidates.js +113 -0
  308. package/dist/codex/questions/candidates.js.map +1 -0
  309. package/dist/codex/questions/chrome.d.ts +10 -0
  310. package/dist/codex/questions/chrome.d.ts.map +1 -0
  311. package/dist/codex/questions/chrome.js +21 -0
  312. package/dist/codex/questions/chrome.js.map +1 -0
  313. package/dist/codex/questions/definitions.d.ts +19 -0
  314. package/dist/codex/questions/definitions.d.ts.map +1 -0
  315. package/dist/codex/questions/definitions.js +86 -0
  316. package/dist/codex/questions/definitions.js.map +1 -0
  317. package/dist/codex/questions/draft.d.ts +25 -0
  318. package/dist/codex/questions/draft.d.ts.map +1 -0
  319. package/dist/codex/questions/draft.js +76 -0
  320. package/dist/codex/questions/draft.js.map +1 -0
  321. package/dist/codex/questions/driver-support.d.ts +6 -0
  322. package/dist/codex/questions/driver-support.d.ts.map +1 -0
  323. package/dist/codex/questions/driver-support.js +7 -0
  324. package/dist/codex/questions/driver-support.js.map +1 -0
  325. package/dist/codex/questions/driver.d.ts +10 -0
  326. package/dist/codex/questions/driver.d.ts.map +1 -0
  327. package/dist/codex/questions/driver.js +139 -0
  328. package/dist/codex/questions/driver.js.map +1 -0
  329. package/dist/codex/questions/frame.d.ts +36 -0
  330. package/dist/codex/questions/frame.d.ts.map +1 -0
  331. package/dist/codex/questions/frame.js +138 -0
  332. package/dist/codex/questions/frame.js.map +1 -0
  333. package/dist/codex/questions/labels.d.ts +6 -0
  334. package/dist/codex/questions/labels.d.ts.map +1 -0
  335. package/dist/codex/questions/labels.js +6 -0
  336. package/dist/codex/questions/labels.js.map +1 -0
  337. package/dist/codex/questions/limits.d.ts +18 -0
  338. package/dist/codex/questions/limits.d.ts.map +1 -0
  339. package/dist/codex/questions/limits.js +61 -0
  340. package/dist/codex/questions/limits.js.map +1 -0
  341. package/dist/codex/questions/native-pending.d.ts +7 -0
  342. package/dist/codex/questions/native-pending.d.ts.map +1 -0
  343. package/dist/codex/questions/native-pending.js +37 -0
  344. package/dist/codex/questions/native-pending.js.map +1 -0
  345. package/dist/codex/questions/owned-editor.d.ts +12 -0
  346. package/dist/codex/questions/owned-editor.d.ts.map +1 -0
  347. package/dist/codex/questions/owned-editor.js +37 -0
  348. package/dist/codex/questions/owned-editor.js.map +1 -0
  349. package/dist/codex/questions/pending-submissions.d.ts +12 -0
  350. package/dist/codex/questions/pending-submissions.d.ts.map +1 -0
  351. package/dist/codex/questions/pending-submissions.js +42 -0
  352. package/dist/codex/questions/pending-submissions.js.map +1 -0
  353. package/dist/codex/questions/records.d.ts +29 -0
  354. package/dist/codex/questions/records.d.ts.map +1 -0
  355. package/dist/codex/questions/records.js +113 -0
  356. package/dist/codex/questions/records.js.map +1 -0
  357. package/dist/codex/questions/selection.d.ts +3 -0
  358. package/dist/codex/questions/selection.d.ts.map +1 -0
  359. package/dist/codex/questions/selection.js +18 -0
  360. package/dist/codex/questions/selection.js.map +1 -0
  361. package/dist/codex/questions/session.d.ts +6 -0
  362. package/dist/codex/questions/session.d.ts.map +1 -0
  363. package/dist/codex/questions/session.js +21 -0
  364. package/dist/codex/questions/session.js.map +1 -0
  365. package/dist/codex/screen/clearance.d.ts +17 -0
  366. package/dist/codex/screen/clearance.d.ts.map +1 -0
  367. package/dist/codex/screen/clearance.js +170 -0
  368. package/dist/codex/screen/clearance.js.map +1 -0
  369. package/dist/codex/screen/empty-input.d.ts +4 -0
  370. package/dist/codex/screen/empty-input.d.ts.map +1 -0
  371. package/dist/codex/screen/empty-input.js +10 -0
  372. package/dist/codex/screen/empty-input.js.map +1 -0
  373. package/dist/codex/screen/live-clearance.d.ts +6 -0
  374. package/dist/codex/screen/live-clearance.d.ts.map +1 -0
  375. package/dist/codex/screen/live-clearance.js +34 -0
  376. package/dist/codex/screen/live-clearance.js.map +1 -0
  377. package/dist/codex/screen/retained-clearance.d.ts +19 -0
  378. package/dist/codex/screen/retained-clearance.d.ts.map +1 -0
  379. package/dist/codex/screen/retained-clearance.js +67 -0
  380. package/dist/codex/screen/retained-clearance.js.map +1 -0
  381. package/dist/codex/screen/staged-input.d.ts +7 -0
  382. package/dist/codex/screen/staged-input.d.ts.map +1 -0
  383. package/dist/codex/screen/staged-input.js +40 -0
  384. package/dist/codex/screen/staged-input.js.map +1 -0
  385. package/dist/codex/screen/working.d.ts +4 -0
  386. package/dist/codex/screen/working.d.ts.map +1 -0
  387. package/dist/codex/screen/working.js +5 -0
  388. package/dist/codex/screen/working.js.map +1 -0
  389. package/dist/codex/screen-table.d.ts +4 -1
  390. package/dist/codex/screen-table.d.ts.map +1 -1
  391. package/dist/codex/screen-table.js +44 -11
  392. package/dist/codex/screen-table.js.map +1 -1
  393. package/dist/codex/session/build.d.ts +1 -0
  394. package/dist/codex/session/build.d.ts.map +1 -1
  395. package/dist/codex/session/build.js +62 -68
  396. package/dist/codex/session/build.js.map +1 -1
  397. package/dist/codex/session/caller-input.d.ts +18 -0
  398. package/dist/codex/session/caller-input.d.ts.map +1 -0
  399. package/dist/codex/session/caller-input.js +50 -0
  400. package/dist/codex/session/caller-input.js.map +1 -0
  401. package/dist/codex/session/cleanup.d.ts +2 -1
  402. package/dist/codex/session/cleanup.d.ts.map +1 -1
  403. package/dist/codex/session/cleanup.js +3 -2
  404. package/dist/codex/session/cleanup.js.map +1 -1
  405. package/dist/codex/session/cli-exit.d.ts +24 -0
  406. package/dist/codex/session/cli-exit.d.ts.map +1 -0
  407. package/dist/codex/session/cli-exit.js +43 -0
  408. package/dist/codex/session/cli-exit.js.map +1 -0
  409. package/dist/codex/session/hooks.d.ts +3 -0
  410. package/dist/codex/session/hooks.d.ts.map +1 -1
  411. package/dist/codex/session/hooks.js +66 -13
  412. package/dist/codex/session/hooks.js.map +1 -1
  413. package/dist/codex/session/index.d.ts +2 -1
  414. package/dist/codex/session/index.d.ts.map +1 -1
  415. package/dist/codex/session/index.js +23 -8
  416. package/dist/codex/session/index.js.map +1 -1
  417. package/dist/codex/session/initial-ready.d.ts +6 -0
  418. package/dist/codex/session/initial-ready.d.ts.map +1 -0
  419. package/dist/codex/session/initial-ready.js +9 -0
  420. package/dist/codex/session/initial-ready.js.map +1 -0
  421. package/dist/codex/session/instance.d.ts +19 -4
  422. package/dist/codex/session/instance.d.ts.map +1 -1
  423. package/dist/codex/session/instance.js +60 -30
  424. package/dist/codex/session/instance.js.map +1 -1
  425. package/dist/codex/session/resume.d.ts.map +1 -1
  426. package/dist/codex/session/resume.js +35 -26
  427. package/dist/codex/session/resume.js.map +1 -1
  428. package/dist/codex/session/runtime.d.ts.map +1 -1
  429. package/dist/codex/session/runtime.js +1 -2
  430. package/dist/codex/session/runtime.js.map +1 -1
  431. package/dist/codex/session/startup-warnings.d.ts +11 -0
  432. package/dist/codex/session/startup-warnings.d.ts.map +1 -0
  433. package/dist/codex/session/startup-warnings.js +9 -0
  434. package/dist/codex/session/startup-warnings.js.map +1 -0
  435. package/dist/codex/session/transcript.d.ts +3 -1
  436. package/dist/codex/session/transcript.d.ts.map +1 -1
  437. package/dist/codex/session/transcript.js +51 -8
  438. package/dist/codex/session/transcript.js.map +1 -1
  439. package/dist/codex/session/types.d.ts +4 -3
  440. package/dist/codex/session/types.d.ts.map +1 -1
  441. package/dist/codex/session/update-attention.d.ts +4 -0
  442. package/dist/codex/session/update-attention.d.ts.map +1 -0
  443. package/dist/codex/session/update-attention.js +18 -0
  444. package/dist/codex/session/update-attention.js.map +1 -0
  445. package/dist/codex/session/warnings.d.ts +2 -1
  446. package/dist/codex/session/warnings.d.ts.map +1 -1
  447. package/dist/codex/session/warnings.js +2 -1
  448. package/dist/codex/session/warnings.js.map +1 -1
  449. package/dist/codex/simple.d.ts +1 -0
  450. package/dist/codex/simple.d.ts.map +1 -1
  451. package/dist/codex/simple.js +2 -0
  452. package/dist/codex/simple.js.map +1 -1
  453. package/dist/codex/startup-prompts.d.ts +29 -14
  454. package/dist/codex/startup-prompts.d.ts.map +1 -1
  455. package/dist/codex/startup-prompts.js +113 -93
  456. package/dist/codex/startup-prompts.js.map +1 -1
  457. package/dist/codex/startup-warnings.d.ts +10 -0
  458. package/dist/codex/startup-warnings.d.ts.map +1 -0
  459. package/dist/codex/startup-warnings.js +65 -0
  460. package/dist/codex/startup-warnings.js.map +1 -0
  461. package/dist/codex/transcript/summary.d.ts +1 -1
  462. package/dist/codex/transcript/summary.d.ts.map +1 -1
  463. package/dist/codex/transcript/summary.js +18 -7
  464. package/dist/codex/transcript/summary.js.map +1 -1
  465. package/dist/codex/transcript/types.d.ts +23 -12
  466. package/dist/codex/transcript/types.d.ts.map +1 -1
  467. package/dist/codex/transcript/watcher.d.ts.map +1 -1
  468. package/dist/codex/transcript/watcher.js +2 -1
  469. package/dist/codex/transcript/watcher.js.map +1 -1
  470. package/dist/codex/update/classification.d.ts +27 -0
  471. package/dist/codex/update/classification.d.ts.map +1 -0
  472. package/dist/codex/update/classification.js +28 -0
  473. package/dist/codex/update/classification.js.map +1 -0
  474. package/dist/codex/update/evidence.d.ts +22 -0
  475. package/dist/codex/update/evidence.d.ts.map +1 -0
  476. package/dist/codex/update/evidence.js +69 -0
  477. package/dist/codex/update/evidence.js.map +1 -0
  478. package/dist/codex/update/layout.d.ts +7 -0
  479. package/dist/codex/update/layout.d.ts.map +1 -0
  480. package/dist/codex/update/layout.js +65 -0
  481. package/dist/codex/update/layout.js.map +1 -0
  482. package/dist/codex/update/recognition.d.ts +3 -0
  483. package/dist/codex/update/recognition.d.ts.map +1 -0
  484. package/dist/codex/update/recognition.js +7 -0
  485. package/dist/codex/update/recognition.js.map +1 -0
  486. package/dist/codex/update/selection.d.ts +7 -0
  487. package/dist/codex/update/selection.d.ts.map +1 -0
  488. package/dist/codex/update/selection.js +10 -0
  489. package/dist/codex/update/selection.js.map +1 -0
  490. package/dist/codex/update/skip-attempt.d.ts +25 -0
  491. package/dist/codex/update/skip-attempt.d.ts.map +1 -0
  492. package/dist/codex/update/skip-attempt.js +64 -0
  493. package/dist/codex/update/skip-attempt.js.map +1 -0
  494. package/dist/codex/update/tracker.d.ts +37 -0
  495. package/dist/codex/update/tracker.d.ts.map +1 -0
  496. package/dist/codex/update/tracker.js +156 -0
  497. package/dist/codex/update/tracker.js.map +1 -0
  498. package/dist/codex/update-identity.d.ts +23 -0
  499. package/dist/codex/update-identity.d.ts.map +1 -0
  500. package/dist/codex/update-identity.js +46 -0
  501. package/dist/codex/update-identity.js.map +1 -0
  502. package/dist/codex/update-prompt.d.ts +26 -17
  503. package/dist/codex/update-prompt.d.ts.map +1 -1
  504. package/dist/codex/update-prompt.js +65 -62
  505. package/dist/codex/update-prompt.js.map +1 -1
  506. package/dist/core/activity/index.d.ts +24 -3
  507. package/dist/core/activity/index.d.ts.map +1 -1
  508. package/dist/core/activity/index.js.map +1 -1
  509. package/dist/core/activity/meta.d.ts +6 -1
  510. package/dist/core/activity/meta.d.ts.map +1 -1
  511. package/dist/core/activity/meta.js.map +1 -1
  512. package/dist/core/activity/transcript.d.ts +4 -1
  513. package/dist/core/activity/transcript.d.ts.map +1 -1
  514. package/dist/core/activity/transcript.js +28 -18
  515. package/dist/core/activity/transcript.js.map +1 -1
  516. package/dist/core/agent-session.d.ts +2 -1
  517. package/dist/core/agent-session.d.ts.map +1 -1
  518. package/dist/core/async-mutex.d.ts +14 -8
  519. package/dist/core/async-mutex.d.ts.map +1 -1
  520. package/dist/core/async-mutex.js +48 -12
  521. package/dist/core/async-mutex.js.map +1 -1
  522. package/dist/core/attention.d.ts +6 -2
  523. package/dist/core/attention.d.ts.map +1 -1
  524. package/dist/core/attention.js +23 -9
  525. package/dist/core/attention.js.map +1 -1
  526. package/dist/core/control-queue/admission-scan.d.ts +10 -0
  527. package/dist/core/control-queue/admission-scan.d.ts.map +1 -0
  528. package/dist/core/control-queue/admission-scan.js +28 -0
  529. package/dist/core/control-queue/admission-scan.js.map +1 -0
  530. package/dist/core/control-queue/admission.d.ts +15 -0
  531. package/dist/core/control-queue/admission.d.ts.map +1 -0
  532. package/dist/core/control-queue/admission.js +70 -0
  533. package/dist/core/control-queue/admission.js.map +1 -0
  534. package/dist/core/control-queue/budget.d.ts +15 -0
  535. package/dist/core/control-queue/budget.d.ts.map +1 -0
  536. package/dist/core/control-queue/budget.js +33 -0
  537. package/dist/core/control-queue/budget.js.map +1 -0
  538. package/dist/core/control-queue/index.d.ts +6 -3
  539. package/dist/core/control-queue/index.d.ts.map +1 -1
  540. package/dist/core/control-queue/index.js +52 -28
  541. package/dist/core/control-queue/index.js.map +1 -1
  542. package/dist/core/control-queue/scan.d.ts +10 -0
  543. package/dist/core/control-queue/scan.d.ts.map +1 -0
  544. package/dist/core/control-queue/scan.js +24 -0
  545. package/dist/core/control-queue/scan.js.map +1 -0
  546. package/dist/core/control-queue/state.d.ts +19 -3
  547. package/dist/core/control-queue/state.d.ts.map +1 -1
  548. package/dist/core/control-queue/state.js +87 -15
  549. package/dist/core/control-queue/state.js.map +1 -1
  550. package/dist/core/control-queue/submission.d.ts +8 -0
  551. package/dist/core/control-queue/submission.d.ts.map +1 -0
  552. package/dist/core/control-queue/submission.js +41 -0
  553. package/dist/core/control-queue/submission.js.map +1 -0
  554. package/dist/core/control-queue/traits.d.ts +6 -9
  555. package/dist/core/control-queue/traits.d.ts.map +1 -1
  556. package/dist/core/control-queue/traits.js +2 -15
  557. package/dist/core/control-queue/traits.js.map +1 -1
  558. package/dist/core/control-queue/types.d.ts +28 -2
  559. package/dist/core/control-queue/types.d.ts.map +1 -1
  560. package/dist/core/errors.d.ts +7 -2
  561. package/dist/core/errors.d.ts.map +1 -1
  562. package/dist/core/errors.js +7 -0
  563. package/dist/core/errors.js.map +1 -1
  564. package/dist/core/freeze-hook-event.d.ts +6 -0
  565. package/dist/core/freeze-hook-event.d.ts.map +1 -0
  566. package/dist/core/freeze-hook-event.js +16 -0
  567. package/dist/core/freeze-hook-event.js.map +1 -0
  568. package/dist/core/hook-dispatch.d.ts +3 -2
  569. package/dist/core/hook-dispatch.d.ts.map +1 -1
  570. package/dist/core/hook-dispatch.js +14 -6
  571. package/dist/core/hook-dispatch.js.map +1 -1
  572. package/dist/core/hook-observation.d.ts +24 -0
  573. package/dist/core/hook-observation.d.ts.map +1 -0
  574. package/dist/core/hook-observation.js +68 -0
  575. package/dist/core/hook-observation.js.map +1 -0
  576. package/dist/core/hook-result.d.ts +12 -2
  577. package/dist/core/hook-result.d.ts.map +1 -1
  578. package/dist/core/hook-result.js +10 -9
  579. package/dist/core/hook-result.js.map +1 -1
  580. package/dist/core/hook-timeout.d.ts.map +1 -1
  581. package/dist/core/hook-timeout.js +3 -2
  582. package/dist/core/hook-timeout.js.map +1 -1
  583. package/dist/core/images/capture.d.ts +14 -0
  584. package/dist/core/images/capture.d.ts.map +1 -0
  585. package/dist/core/images/capture.js +35 -0
  586. package/dist/core/images/capture.js.map +1 -0
  587. package/dist/core/images/chip-wait.d.ts +14 -16
  588. package/dist/core/images/chip-wait.d.ts.map +1 -1
  589. package/dist/core/images/chip-wait.js +31 -34
  590. package/dist/core/images/chip-wait.js.map +1 -1
  591. package/dist/core/images/queued-budget.d.ts +18 -0
  592. package/dist/core/images/queued-budget.d.ts.map +1 -0
  593. package/dist/core/images/queued-budget.js +41 -0
  594. package/dist/core/images/queued-budget.js.map +1 -0
  595. package/dist/core/inert-record.d.ts +3 -0
  596. package/dist/core/inert-record.d.ts.map +1 -0
  597. package/dist/core/inert-record.js +6 -0
  598. package/dist/core/inert-record.js.map +1 -0
  599. package/dist/core/input/abort.d.ts +33 -2
  600. package/dist/core/input/abort.d.ts.map +1 -1
  601. package/dist/core/input/abort.js +42 -2
  602. package/dist/core/input/abort.js.map +1 -1
  603. package/dist/core/input/clear-ack.d.ts +10 -0
  604. package/dist/core/input/clear-ack.d.ts.map +1 -0
  605. package/dist/core/input/clear-ack.js +26 -0
  606. package/dist/core/input/clear-ack.js.map +1 -0
  607. package/dist/core/input/composer-cleanup.d.ts +33 -0
  608. package/dist/core/input/composer-cleanup.d.ts.map +1 -0
  609. package/dist/core/input/composer-cleanup.js +127 -0
  610. package/dist/core/input/composer-cleanup.js.map +1 -0
  611. package/dist/core/input/constants.d.ts +12 -0
  612. package/dist/core/input/constants.d.ts.map +1 -0
  613. package/dist/core/input/constants.js +12 -0
  614. package/dist/core/input/constants.js.map +1 -0
  615. package/dist/core/input/empty-frame.d.ts +4 -0
  616. package/dist/core/input/empty-frame.d.ts.map +1 -0
  617. package/dist/core/input/empty-frame.js +15 -0
  618. package/dist/core/input/empty-frame.js.map +1 -0
  619. package/dist/core/input/index.d.ts +8 -25
  620. package/dist/core/input/index.d.ts.map +1 -1
  621. package/dist/core/input/index.js +67 -102
  622. package/dist/core/input/index.js.map +1 -1
  623. package/dist/core/input/paste-guard.d.ts +34 -0
  624. package/dist/core/input/paste-guard.d.ts.map +1 -0
  625. package/dist/core/input/paste-guard.js +2 -0
  626. package/dist/core/input/paste-guard.js.map +1 -0
  627. package/dist/core/input/paste-nudge.d.ts +10 -0
  628. package/dist/core/input/paste-nudge.d.ts.map +1 -0
  629. package/dist/core/input/paste-nudge.js +91 -0
  630. package/dist/core/input/paste-nudge.js.map +1 -0
  631. package/dist/core/input/render-observation.d.ts +3 -0
  632. package/dist/core/input/render-observation.d.ts.map +1 -0
  633. package/dist/core/input/render-observation.js +38 -0
  634. package/dist/core/input/render-observation.js.map +1 -0
  635. package/dist/core/input/render-wakeup.d.ts +10 -0
  636. package/dist/core/input/render-wakeup.d.ts.map +1 -0
  637. package/dist/core/input/render-wakeup.js +45 -0
  638. package/dist/core/input/render-wakeup.js.map +1 -0
  639. package/dist/core/input/sanitize.d.ts +11 -0
  640. package/dist/core/input/sanitize.d.ts.map +1 -0
  641. package/dist/core/input/sanitize.js +19 -0
  642. package/dist/core/input/sanitize.js.map +1 -0
  643. package/dist/core/input/staged-composer.d.ts +12 -0
  644. package/dist/core/input/staged-composer.d.ts.map +1 -0
  645. package/dist/core/input/staged-composer.js +56 -0
  646. package/dist/core/input/staged-composer.js.map +1 -0
  647. package/dist/core/input/submission-cancel.d.ts +6 -0
  648. package/dist/core/input/submission-cancel.d.ts.map +1 -0
  649. package/dist/core/input/submission-cancel.js +18 -0
  650. package/dist/core/input/submission-cancel.js.map +1 -0
  651. package/dist/core/json-shape.d.ts +2 -0
  652. package/dist/core/json-shape.d.ts.map +1 -0
  653. package/dist/core/json-shape.js +6 -0
  654. package/dist/core/json-shape.js.map +1 -0
  655. package/dist/core/json-snapshot.d.ts +10 -0
  656. package/dist/core/json-snapshot.d.ts.map +1 -0
  657. package/dist/core/json-snapshot.js +84 -0
  658. package/dist/core/json-snapshot.js.map +1 -0
  659. package/dist/core/loops/scheduler.d.ts +1 -1
  660. package/dist/core/loops/scheduler.d.ts.map +1 -1
  661. package/dist/core/loops/scheduler.js +1 -2
  662. package/dist/core/loops/scheduler.js.map +1 -1
  663. package/dist/core/models/dialog-region.d.ts +16 -0
  664. package/dist/core/models/dialog-region.d.ts.map +1 -0
  665. package/dist/core/models/dialog-region.js +133 -0
  666. package/dist/core/models/dialog-region.js.map +1 -0
  667. package/dist/core/models/input.d.ts +1 -1
  668. package/dist/core/models/input.d.ts.map +1 -1
  669. package/dist/core/models/input.js.map +1 -1
  670. package/dist/core/models/intervention.d.ts +3 -0
  671. package/dist/core/models/intervention.d.ts.map +1 -0
  672. package/dist/core/models/intervention.js +12 -0
  673. package/dist/core/models/intervention.js.map +1 -0
  674. package/dist/core/models/picker.d.ts +14 -1
  675. package/dist/core/models/picker.d.ts.map +1 -1
  676. package/dist/core/models/picker.js +27 -6
  677. package/dist/core/models/picker.js.map +1 -1
  678. package/dist/core/models/rows.d.ts +42 -2
  679. package/dist/core/models/rows.d.ts.map +1 -1
  680. package/dist/core/models/rows.js +30 -3
  681. package/dist/core/models/rows.js.map +1 -1
  682. package/dist/core/models/tui-screen.d.ts +11 -1
  683. package/dist/core/models/tui-screen.d.ts.map +1 -1
  684. package/dist/core/models/tui-screen.js +22 -4
  685. package/dist/core/models/tui-screen.js.map +1 -1
  686. package/dist/core/module-require.d.ts +1 -1
  687. package/dist/core/module-require.js +1 -1
  688. package/dist/core/persona.d.ts +5 -4
  689. package/dist/core/persona.d.ts.map +1 -1
  690. package/dist/core/persona.js +18 -3
  691. package/dist/core/persona.js.map +1 -1
  692. package/dist/core/predicates.d.ts +9 -1
  693. package/dist/core/predicates.d.ts.map +1 -1
  694. package/dist/core/predicates.js +12 -2
  695. package/dist/core/predicates.js.map +1 -1
  696. package/dist/core/questions/abort.d.ts +2 -0
  697. package/dist/core/questions/abort.d.ts.map +1 -0
  698. package/dist/core/questions/abort.js +21 -0
  699. package/dist/core/questions/abort.js.map +1 -0
  700. package/dist/core/questions/activity-fields.d.ts +5 -0
  701. package/dist/core/questions/activity-fields.d.ts.map +1 -0
  702. package/dist/core/questions/activity-fields.js +15 -0
  703. package/dist/core/questions/activity-fields.js.map +1 -0
  704. package/dist/core/questions/activity.d.ts +6 -0
  705. package/dist/core/questions/activity.d.ts.map +1 -0
  706. package/dist/core/questions/activity.js +2 -0
  707. package/dist/core/questions/activity.js.map +1 -0
  708. package/dist/core/questions/adapter.d.ts +15 -0
  709. package/dist/core/questions/adapter.d.ts.map +1 -0
  710. package/dist/core/questions/adapter.js +2 -0
  711. package/dist/core/questions/adapter.js.map +1 -0
  712. package/dist/core/questions/attempt.d.ts +26 -0
  713. package/dist/core/questions/attempt.d.ts.map +1 -0
  714. package/dist/core/questions/attempt.js +85 -0
  715. package/dist/core/questions/attempt.js.map +1 -0
  716. package/dist/core/questions/controller.d.ts +24 -0
  717. package/dist/core/questions/controller.d.ts.map +1 -0
  718. package/dist/core/questions/controller.js +83 -0
  719. package/dist/core/questions/controller.js.map +1 -0
  720. package/dist/core/questions/correlation.d.ts +8 -0
  721. package/dist/core/questions/correlation.d.ts.map +1 -0
  722. package/dist/core/questions/correlation.js +11 -0
  723. package/dist/core/questions/correlation.js.map +1 -0
  724. package/dist/core/questions/cursor-provenance.d.ts +12 -0
  725. package/dist/core/questions/cursor-provenance.d.ts.map +1 -0
  726. package/dist/core/questions/cursor-provenance.js +19 -0
  727. package/dist/core/questions/cursor-provenance.js.map +1 -0
  728. package/dist/core/questions/deadline.d.ts +2 -0
  729. package/dist/core/questions/deadline.d.ts.map +1 -0
  730. package/dist/core/questions/deadline.js +11 -0
  731. package/dist/core/questions/deadline.js.map +1 -0
  732. package/dist/core/questions/dispatch.d.ts +17 -0
  733. package/dist/core/questions/dispatch.d.ts.map +1 -0
  734. package/dist/core/questions/dispatch.js +46 -0
  735. package/dist/core/questions/dispatch.js.map +1 -0
  736. package/dist/core/questions/errors.d.ts +8 -0
  737. package/dist/core/questions/errors.d.ts.map +1 -0
  738. package/dist/core/questions/errors.js +10 -0
  739. package/dist/core/questions/errors.js.map +1 -0
  740. package/dist/core/questions/input.d.ts +13 -0
  741. package/dist/core/questions/input.d.ts.map +1 -0
  742. package/dist/core/questions/input.js +93 -0
  743. package/dist/core/questions/input.js.map +1 -0
  744. package/dist/core/questions/io.d.ts +23 -0
  745. package/dist/core/questions/io.d.ts.map +1 -0
  746. package/dist/core/questions/io.js +2 -0
  747. package/dist/core/questions/io.js.map +1 -0
  748. package/dist/core/questions/notification-errors.d.ts +14 -0
  749. package/dist/core/questions/notification-errors.d.ts.map +1 -0
  750. package/dist/core/questions/notification-errors.js +45 -0
  751. package/dist/core/questions/notification-errors.js.map +1 -0
  752. package/dist/core/questions/observers.d.ts +17 -0
  753. package/dist/core/questions/observers.d.ts.map +1 -0
  754. package/dist/core/questions/observers.js +57 -0
  755. package/dist/core/questions/observers.js.map +1 -0
  756. package/dist/core/questions/registry.d.ts +35 -0
  757. package/dist/core/questions/registry.d.ts.map +1 -0
  758. package/dist/core/questions/registry.js +158 -0
  759. package/dist/core/questions/registry.js.map +1 -0
  760. package/dist/core/questions/transaction.d.ts +23 -0
  761. package/dist/core/questions/transaction.d.ts.map +1 -0
  762. package/dist/core/questions/transaction.js +97 -0
  763. package/dist/core/questions/transaction.js.map +1 -0
  764. package/dist/core/questions/types.d.ts +62 -0
  765. package/dist/core/questions/types.d.ts.map +1 -0
  766. package/dist/core/questions/types.js +2 -0
  767. package/dist/core/questions/types.js.map +1 -0
  768. package/dist/core/questions/validate.d.ts +16 -0
  769. package/dist/core/questions/validate.d.ts.map +1 -0
  770. package/dist/core/questions/validate.js +95 -0
  771. package/dist/core/questions/validate.js.map +1 -0
  772. package/dist/core/rendered-observers.d.ts +7 -2
  773. package/dist/core/rendered-observers.d.ts.map +1 -1
  774. package/dist/core/rendered-observers.js +44 -10
  775. package/dist/core/rendered-observers.js.map +1 -1
  776. package/dist/core/screen-facts.d.ts +8 -3
  777. package/dist/core/screen-facts.d.ts.map +1 -1
  778. package/dist/core/screen-facts.js +6 -3
  779. package/dist/core/screen-facts.js.map +1 -1
  780. package/dist/core/simple/boundary-observer.d.ts +30 -0
  781. package/dist/core/simple/boundary-observer.d.ts.map +1 -0
  782. package/dist/core/simple/boundary-observer.js +111 -0
  783. package/dist/core/simple/boundary-observer.js.map +1 -0
  784. package/dist/core/simple/boundary-signal.d.ts +31 -0
  785. package/dist/core/simple/boundary-signal.d.ts.map +1 -0
  786. package/dist/core/simple/boundary-signal.js +19 -0
  787. package/dist/core/simple/boundary-signal.js.map +1 -0
  788. package/dist/core/simple/captured-input.d.ts +19 -0
  789. package/dist/core/simple/captured-input.d.ts.map +1 -0
  790. package/dist/core/simple/captured-input.js +78 -0
  791. package/dist/core/simple/captured-input.js.map +1 -0
  792. package/dist/core/simple/close.d.ts +6 -0
  793. package/dist/core/simple/close.d.ts.map +1 -0
  794. package/dist/core/simple/close.js +20 -0
  795. package/dist/core/simple/close.js.map +1 -0
  796. package/dist/core/simple/events.d.ts +2 -2
  797. package/dist/core/simple/events.js +2 -2
  798. package/dist/core/simple/loop-boundary.d.ts +12 -0
  799. package/dist/core/simple/loop-boundary.d.ts.map +1 -0
  800. package/dist/core/simple/loop-boundary.js +68 -0
  801. package/dist/core/simple/loop-boundary.js.map +1 -0
  802. package/dist/core/simple/loop-hold.d.ts +7 -0
  803. package/dist/core/simple/loop-hold.d.ts.map +1 -0
  804. package/dist/core/simple/loop-hold.js +9 -0
  805. package/dist/core/simple/loop-hold.js.map +1 -0
  806. package/dist/core/simple/native-boundary.d.ts +15 -0
  807. package/dist/core/simple/native-boundary.d.ts.map +1 -0
  808. package/dist/core/simple/native-boundary.js +18 -0
  809. package/dist/core/simple/native-boundary.js.map +1 -0
  810. package/dist/core/simple/native-idle.d.ts +17 -0
  811. package/dist/core/simple/native-idle.d.ts.map +1 -0
  812. package/dist/core/simple/native-idle.js +25 -0
  813. package/dist/core/simple/native-idle.js.map +1 -0
  814. package/dist/core/simple/observe-boundary.d.ts +28 -0
  815. package/dist/core/simple/observe-boundary.d.ts.map +1 -0
  816. package/dist/core/simple/observe-boundary.js +13 -0
  817. package/dist/core/simple/observe-boundary.js.map +1 -0
  818. package/dist/core/simple/owned-loop.d.ts +8 -0
  819. package/dist/core/simple/owned-loop.d.ts.map +1 -0
  820. package/dist/core/simple/owned-loop.js +42 -0
  821. package/dist/core/simple/owned-loop.js.map +1 -0
  822. package/dist/core/simple/session.d.ts +7 -7
  823. package/dist/core/simple/session.d.ts.map +1 -1
  824. package/dist/core/simple/session.js +20 -33
  825. package/dist/core/simple/session.js.map +1 -1
  826. package/dist/core/simple/submission-context.d.ts +13 -0
  827. package/dist/core/simple/submission-context.d.ts.map +1 -0
  828. package/dist/core/simple/submission-context.js +35 -0
  829. package/dist/core/simple/submission-context.js.map +1 -0
  830. package/dist/core/simple/turn/bounds.d.ts +22 -0
  831. package/dist/core/simple/turn/bounds.d.ts.map +1 -0
  832. package/dist/core/simple/turn/bounds.js +22 -0
  833. package/dist/core/simple/turn/bounds.js.map +1 -0
  834. package/dist/core/simple/turn/defaults.d.ts +24 -0
  835. package/dist/core/simple/turn/defaults.d.ts.map +1 -0
  836. package/dist/core/simple/turn/defaults.js +34 -0
  837. package/dist/core/simple/turn/defaults.js.map +1 -0
  838. package/dist/core/simple/turn-acceptance.d.ts +20 -3
  839. package/dist/core/simple/turn-acceptance.d.ts.map +1 -1
  840. package/dist/core/simple/turn-acceptance.js +55 -5
  841. package/dist/core/simple/turn-acceptance.js.map +1 -1
  842. package/dist/core/simple/turn-boundary.d.ts +7 -2
  843. package/dist/core/simple/turn-boundary.d.ts.map +1 -1
  844. package/dist/core/simple/turn-boundary.js +17 -5
  845. package/dist/core/simple/turn-boundary.js.map +1 -1
  846. package/dist/core/simple/turn-gate.d.ts.map +1 -1
  847. package/dist/core/simple/turn-gate.js +1 -11
  848. package/dist/core/simple/turn-gate.js.map +1 -1
  849. package/dist/core/simple/turn-identity.d.ts +28 -0
  850. package/dist/core/simple/turn-identity.d.ts.map +1 -0
  851. package/dist/core/simple/turn-identity.js +74 -0
  852. package/dist/core/simple/turn-identity.js.map +1 -0
  853. package/dist/core/simple/turn-types.d.ts +11 -4
  854. package/dist/core/simple/turn-types.d.ts.map +1 -1
  855. package/dist/core/simple/turn-types.js +1 -6
  856. package/dist/core/simple/turn-types.js.map +1 -1
  857. package/dist/core/simple/turn.d.ts +7 -30
  858. package/dist/core/simple/turn.d.ts.map +1 -1
  859. package/dist/core/simple/turn.js +75 -75
  860. package/dist/core/simple/turn.js.map +1 -1
  861. package/dist/core/startup/barrier.d.ts +37 -0
  862. package/dist/core/startup/barrier.d.ts.map +1 -0
  863. package/dist/core/startup/barrier.js +59 -0
  864. package/dist/core/startup/barrier.js.map +1 -0
  865. package/dist/core/startup/frame.d.ts +2 -0
  866. package/dist/core/startup/frame.d.ts.map +1 -1
  867. package/dist/core/startup/frame.js +12 -0
  868. package/dist/core/startup/frame.js.map +1 -1
  869. package/dist/core/startup/warnings.d.ts +5 -0
  870. package/dist/core/startup/warnings.d.ts.map +1 -0
  871. package/dist/core/startup/warnings.js +14 -0
  872. package/dist/core/startup/warnings.js.map +1 -0
  873. package/dist/core/startup/write.d.ts +13 -11
  874. package/dist/core/startup/write.d.ts.map +1 -1
  875. package/dist/core/startup/write.js +12 -5
  876. package/dist/core/startup/write.js.map +1 -1
  877. package/dist/core/stop-input.d.ts +19 -0
  878. package/dist/core/stop-input.d.ts.map +1 -0
  879. package/dist/core/stop-input.js +47 -0
  880. package/dist/core/stop-input.js.map +1 -0
  881. package/dist/core/terminal-options.d.ts +13 -3
  882. package/dist/core/terminal-options.d.ts.map +1 -1
  883. package/dist/core/terminal-options.js +17 -7
  884. package/dist/core/terminal-options.js.map +1 -1
  885. package/dist/core/terminal-replay.d.ts +1 -0
  886. package/dist/core/terminal-replay.d.ts.map +1 -1
  887. package/dist/core/terminal-replay.js +6 -0
  888. package/dist/core/terminal-replay.js.map +1 -1
  889. package/dist/core/timers.d.ts +15 -0
  890. package/dist/core/timers.d.ts.map +1 -0
  891. package/dist/core/timers.js +17 -0
  892. package/dist/core/timers.js.map +1 -0
  893. package/dist/core/trust/allowlist.d.ts +24 -1
  894. package/dist/core/trust/allowlist.d.ts.map +1 -1
  895. package/dist/core/trust/allowlist.js +39 -12
  896. package/dist/core/trust/allowlist.js.map +1 -1
  897. package/dist/core/trust/blocking.d.ts +21 -10
  898. package/dist/core/trust/blocking.d.ts.map +1 -1
  899. package/dist/core/trust/blocking.js +64 -18
  900. package/dist/core/trust/blocking.js.map +1 -1
  901. package/dist/core/trust/clearance.d.ts +20 -0
  902. package/dist/core/trust/clearance.d.ts.map +1 -0
  903. package/dist/core/trust/clearance.js +25 -0
  904. package/dist/core/trust/clearance.js.map +1 -0
  905. package/dist/core/trust/copy.d.ts +19 -0
  906. package/dist/core/trust/copy.d.ts.map +1 -0
  907. package/dist/core/trust/copy.js +23 -0
  908. package/dist/core/trust/copy.js.map +1 -0
  909. package/dist/core/trust/dialog.d.ts +28 -0
  910. package/dist/core/trust/dialog.d.ts.map +1 -0
  911. package/dist/core/trust/dialog.js +96 -0
  912. package/dist/core/trust/dialog.js.map +1 -0
  913. package/dist/core/trust/options.d.ts +9 -0
  914. package/dist/core/trust/options.d.ts.map +1 -0
  915. package/dist/core/trust/options.js +9 -0
  916. package/dist/core/trust/options.js.map +1 -0
  917. package/dist/core/trust/prompts.d.ts +16 -37
  918. package/dist/core/trust/prompts.d.ts.map +1 -1
  919. package/dist/core/trust/prompts.js +10 -18
  920. package/dist/core/trust/prompts.js.map +1 -1
  921. package/dist/core/trust/responder.d.ts +27 -45
  922. package/dist/core/trust/responder.d.ts.map +1 -1
  923. package/dist/core/trust/responder.js +178 -108
  924. package/dist/core/trust/responder.js.map +1 -1
  925. package/dist/core/trust/types.d.ts +36 -0
  926. package/dist/core/trust/types.d.ts.map +1 -0
  927. package/dist/core/trust/types.js +17 -0
  928. package/dist/core/trust/types.js.map +1 -0
  929. package/dist/core/trust/view.d.ts +31 -0
  930. package/dist/core/trust/view.d.ts.map +1 -0
  931. package/dist/core/trust/view.js +52 -0
  932. package/dist/core/trust/view.js.map +1 -0
  933. package/dist/core/trust/write.d.ts +31 -0
  934. package/dist/core/trust/write.d.ts.map +1 -0
  935. package/dist/core/trust/write.js +148 -0
  936. package/dist/core/trust/write.js.map +1 -0
  937. package/dist/core/turn-state.d.ts +6 -0
  938. package/dist/core/turn-state.d.ts.map +1 -1
  939. package/dist/core/turn-state.js +31 -1
  940. package/dist/core/turn-state.js.map +1 -1
  941. package/dist/core/types.d.ts +4 -2
  942. package/dist/core/types.d.ts.map +1 -1
  943. package/dist/core/warnings/auth.d.ts +25 -0
  944. package/dist/core/warnings/auth.d.ts.map +1 -0
  945. package/dist/core/warnings/auth.js +2 -0
  946. package/dist/core/warnings/auth.js.map +1 -0
  947. package/dist/core/warnings/index.d.ts +9 -16
  948. package/dist/core/warnings/index.d.ts.map +1 -1
  949. package/dist/core/warnings/index.js +2 -3
  950. package/dist/core/warnings/index.js.map +1 -1
  951. package/dist/core/warnings/lifecycle.d.ts +25 -1
  952. package/dist/core/warnings/lifecycle.d.ts.map +1 -1
  953. package/dist/core/warnings/lifecycle.js +1 -1
  954. package/dist/core/warnings/questions.d.ts +23 -0
  955. package/dist/core/warnings/questions.d.ts.map +1 -0
  956. package/dist/core/warnings/questions.js +2 -0
  957. package/dist/core/warnings/questions.js.map +1 -0
  958. package/dist/core/warnings/session.d.ts +3 -2
  959. package/dist/core/warnings/session.d.ts.map +1 -1
  960. package/dist/core/warnings/session.js +3 -2
  961. package/dist/core/warnings/session.js.map +1 -1
  962. package/dist/core/warnings/transcript.d.ts +12 -0
  963. package/dist/core/warnings/transcript.d.ts.map +1 -0
  964. package/dist/core/warnings/transcript.js +2 -0
  965. package/dist/core/warnings/transcript.js.map +1 -0
  966. package/dist/core/warnings/update.d.ts +11 -2
  967. package/dist/core/warnings/update.d.ts.map +1 -1
  968. package/dist/core/warnings/update.js +27 -4
  969. package/dist/core/warnings/update.js.map +1 -1
  970. package/dist/events/emitter.d.ts +18 -2
  971. package/dist/events/emitter.d.ts.map +1 -1
  972. package/dist/events/emitter.js +61 -14
  973. package/dist/events/emitter.js.map +1 -1
  974. package/dist/events/observer-errors.d.ts +9 -0
  975. package/dist/events/observer-errors.d.ts.map +1 -0
  976. package/dist/events/observer-errors.js +68 -0
  977. package/dist/events/observer-errors.js.map +1 -0
  978. package/dist/index.d.ts +1 -0
  979. package/dist/index.d.ts.map +1 -1
  980. package/dist/pty/node.d.ts.map +1 -1
  981. package/dist/pty/node.js +4 -0
  982. package/dist/pty/node.js.map +1 -1
  983. package/dist/pty/types.d.ts +5 -0
  984. package/dist/pty/types.d.ts.map +1 -1
  985. package/dist/runtime/probe-cleanup.d.ts +34 -0
  986. package/dist/runtime/probe-cleanup.d.ts.map +1 -0
  987. package/dist/runtime/probe-cleanup.js +139 -0
  988. package/dist/runtime/probe-cleanup.js.map +1 -0
  989. package/dist/runtime/probe.d.ts.map +1 -1
  990. package/dist/runtime/probe.js +18 -25
  991. package/dist/runtime/probe.js.map +1 -1
  992. package/dist/runtime/readiness/initial-ready.d.ts +13 -11
  993. package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
  994. package/dist/runtime/readiness/initial-ready.js +23 -18
  995. package/dist/runtime/readiness/initial-ready.js.map +1 -1
  996. package/dist/runtime/seams.d.ts +2 -1
  997. package/dist/runtime/seams.d.ts.map +1 -1
  998. package/dist/runtime/seams.js.map +1 -1
  999. package/dist/runtime/session/attention-clearance.d.ts +5 -0
  1000. package/dist/runtime/session/attention-clearance.d.ts.map +1 -0
  1001. package/dist/runtime/session/attention-clearance.js +20 -0
  1002. package/dist/runtime/session/attention-clearance.js.map +1 -0
  1003. package/dist/runtime/session/base.d.ts +17 -4
  1004. package/dist/runtime/session/base.d.ts.map +1 -1
  1005. package/dist/runtime/session/base.js +68 -14
  1006. package/dist/runtime/session/base.js.map +1 -1
  1007. package/dist/runtime/session/commands.d.ts +17 -3
  1008. package/dist/runtime/session/commands.d.ts.map +1 -1
  1009. package/dist/runtime/session/commands.js +60 -13
  1010. package/dist/runtime/session/commands.js.map +1 -1
  1011. package/dist/runtime/session/foreign-picker.d.ts +8 -0
  1012. package/dist/runtime/session/foreign-picker.d.ts.map +1 -0
  1013. package/dist/runtime/session/foreign-picker.js +18 -0
  1014. package/dist/runtime/session/foreign-picker.js.map +1 -0
  1015. package/dist/runtime/session/frames.d.ts +27 -0
  1016. package/dist/runtime/session/frames.d.ts.map +1 -0
  1017. package/dist/runtime/session/frames.js +80 -0
  1018. package/dist/runtime/session/frames.js.map +1 -0
  1019. package/dist/runtime/session/image-attach.d.ts +3 -15
  1020. package/dist/runtime/session/image-attach.d.ts.map +1 -1
  1021. package/dist/runtime/session/image-attach.js +9 -27
  1022. package/dist/runtime/session/image-attach.js.map +1 -1
  1023. package/dist/runtime/session/lifecycle.d.ts +20 -14
  1024. package/dist/runtime/session/lifecycle.d.ts.map +1 -1
  1025. package/dist/runtime/session/lifecycle.js +49 -47
  1026. package/dist/runtime/session/lifecycle.js.map +1 -1
  1027. package/dist/runtime/session/loops.d.ts +10 -1
  1028. package/dist/runtime/session/loops.d.ts.map +1 -1
  1029. package/dist/runtime/session/loops.js +61 -19
  1030. package/dist/runtime/session/loops.js.map +1 -1
  1031. package/dist/runtime/session/native-submission.d.ts +10 -0
  1032. package/dist/runtime/session/native-submission.d.ts.map +1 -0
  1033. package/dist/runtime/session/native-submission.js +62 -0
  1034. package/dist/runtime/session/native-submission.js.map +1 -0
  1035. package/dist/runtime/session/not-running.d.ts +13 -0
  1036. package/dist/runtime/session/not-running.d.ts.map +1 -0
  1037. package/dist/runtime/session/not-running.js +28 -0
  1038. package/dist/runtime/session/not-running.js.map +1 -0
  1039. package/dist/runtime/session/paste-recovery.d.ts +15 -0
  1040. package/dist/runtime/session/paste-recovery.d.ts.map +1 -0
  1041. package/dist/runtime/session/paste-recovery.js +30 -0
  1042. package/dist/runtime/session/paste-recovery.js.map +1 -0
  1043. package/dist/runtime/session/picker-cleanup.d.ts +56 -0
  1044. package/dist/runtime/session/picker-cleanup.d.ts.map +1 -0
  1045. package/dist/runtime/session/picker-cleanup.js +126 -0
  1046. package/dist/runtime/session/picker-cleanup.js.map +1 -0
  1047. package/dist/runtime/session/picker-input.d.ts +17 -0
  1048. package/dist/runtime/session/picker-input.d.ts.map +1 -0
  1049. package/dist/runtime/session/picker-input.js +74 -0
  1050. package/dist/runtime/session/picker-input.js.map +1 -0
  1051. package/dist/runtime/session/picker.d.ts +56 -0
  1052. package/dist/runtime/session/picker.d.ts.map +1 -0
  1053. package/dist/runtime/session/picker.js +143 -0
  1054. package/dist/runtime/session/picker.js.map +1 -0
  1055. package/dist/runtime/session/questions.d.ts +23 -0
  1056. package/dist/runtime/session/questions.d.ts.map +1 -0
  1057. package/dist/runtime/session/questions.js +25 -0
  1058. package/dist/runtime/session/questions.js.map +1 -0
  1059. package/dist/runtime/session/readiness.d.ts +6 -3
  1060. package/dist/runtime/session/readiness.d.ts.map +1 -1
  1061. package/dist/runtime/session/readiness.js +19 -8
  1062. package/dist/runtime/session/readiness.js.map +1 -1
  1063. package/dist/runtime/session/shutdown-binding.d.ts +9 -0
  1064. package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
  1065. package/dist/runtime/session/shutdown-binding.js +57 -8
  1066. package/dist/runtime/session/shutdown-binding.js.map +1 -1
  1067. package/dist/runtime/session/shutdown.d.ts +2 -5
  1068. package/dist/runtime/session/shutdown.d.ts.map +1 -1
  1069. package/dist/runtime/session/shutdown.js +12 -13
  1070. package/dist/runtime/session/shutdown.js.map +1 -1
  1071. package/dist/runtime/session/status-wiring.d.ts +9 -4
  1072. package/dist/runtime/session/status-wiring.d.ts.map +1 -1
  1073. package/dist/runtime/session/status-wiring.js +8 -5
  1074. package/dist/runtime/session/status-wiring.js.map +1 -1
  1075. package/dist/runtime/session/stop-completion.d.ts +23 -0
  1076. package/dist/runtime/session/stop-completion.d.ts.map +1 -0
  1077. package/dist/runtime/session/stop-completion.js +32 -0
  1078. package/dist/runtime/session/stop-completion.js.map +1 -0
  1079. package/dist/runtime/session/turn-submission.d.ts +9 -0
  1080. package/dist/runtime/session/turn-submission.d.ts.map +1 -0
  1081. package/dist/runtime/session/turn-submission.js +19 -0
  1082. package/dist/runtime/session/turn-submission.js.map +1 -0
  1083. package/dist/runtime/shutdown/terminal.d.ts +10 -0
  1084. package/dist/runtime/shutdown/terminal.d.ts.map +1 -0
  1085. package/dist/runtime/shutdown/terminal.js +38 -0
  1086. package/dist/runtime/shutdown/terminal.js.map +1 -0
  1087. package/dist/runtime/startup/buffer.d.ts +1 -1
  1088. package/dist/runtime/startup/buffer.d.ts.map +1 -1
  1089. package/dist/runtime/startup/buffer.js +14 -8
  1090. package/dist/runtime/startup/buffer.js.map +1 -1
  1091. package/dist/runtime/status-evidence.d.ts +7 -3
  1092. package/dist/runtime/status-evidence.d.ts.map +1 -1
  1093. package/dist/runtime/status-evidence.js +12 -10
  1094. package/dist/runtime/status-evidence.js.map +1 -1
  1095. package/dist/runtime/update/lock.d.ts +7 -0
  1096. package/dist/runtime/update/lock.d.ts.map +1 -1
  1097. package/dist/runtime/update/lock.js +102 -121
  1098. package/dist/runtime/update/lock.js.map +1 -1
  1099. package/dist/runtime/update/owner.d.ts +54 -0
  1100. package/dist/runtime/update/owner.d.ts.map +1 -0
  1101. package/dist/runtime/update/owner.js +131 -0
  1102. package/dist/runtime/update/owner.js.map +1 -0
  1103. package/dist/runtime/update/retained-lease.d.ts +13 -0
  1104. package/dist/runtime/update/retained-lease.d.ts.map +1 -0
  1105. package/dist/runtime/update/retained-lease.js +40 -0
  1106. package/dist/runtime/update/retained-lease.js.map +1 -0
  1107. package/dist/runtime/update/waiting.d.ts +4 -0
  1108. package/dist/runtime/update/waiting.d.ts.map +1 -0
  1109. package/dist/runtime/update/waiting.js +95 -0
  1110. package/dist/runtime/update/waiting.js.map +1 -0
  1111. package/dist/state/canonical-path.d.ts +2 -0
  1112. package/dist/state/canonical-path.d.ts.map +1 -0
  1113. package/dist/state/canonical-path.js +22 -0
  1114. package/dist/state/canonical-path.js.map +1 -0
  1115. package/dist/state/launch-ownership.d.ts +21 -0
  1116. package/dist/state/launch-ownership.d.ts.map +1 -0
  1117. package/dist/state/launch-ownership.js +154 -0
  1118. package/dist/state/launch-ownership.js.map +1 -0
  1119. package/dist/state/launch-publication.d.ts +7 -0
  1120. package/dist/state/launch-publication.d.ts.map +1 -0
  1121. package/dist/state/launch-publication.js +53 -0
  1122. package/dist/state/launch-publication.js.map +1 -0
  1123. package/dist/state/private-read.js +2 -1
  1124. package/dist/state/private-read.js.map +1 -1
  1125. package/dist/state/private-session.d.ts +1 -1
  1126. package/dist/state/private-session.d.ts.map +1 -1
  1127. package/dist/state/private-session.js +4 -1
  1128. package/dist/state/private-session.js.map +1 -1
  1129. package/dist/state/runtime-paths.d.ts +10 -9
  1130. package/dist/state/runtime-paths.d.ts.map +1 -1
  1131. package/dist/state/runtime-paths.js +14 -12
  1132. package/dist/state/runtime-paths.js.map +1 -1
  1133. package/dist/state/socket-home.d.ts +8 -4
  1134. package/dist/state/socket-home.d.ts.map +1 -1
  1135. package/dist/state/socket-home.js +31 -7
  1136. package/dist/state/socket-home.js.map +1 -1
  1137. package/dist/state/startup-ownership.d.ts +4 -0
  1138. package/dist/state/startup-ownership.d.ts.map +1 -0
  1139. package/dist/state/startup-ownership.js +14 -0
  1140. package/dist/state/startup-ownership.js.map +1 -0
  1141. package/dist/state/store.d.ts +1 -1
  1142. package/dist/state/store.d.ts.map +1 -1
  1143. package/dist/state/store.js +2 -2
  1144. package/dist/state/store.js.map +1 -1
  1145. package/dist/terminal/coordinates.d.ts +7 -0
  1146. package/dist/terminal/coordinates.d.ts.map +1 -0
  1147. package/dist/terminal/coordinates.js +6 -0
  1148. package/dist/terminal/coordinates.js.map +1 -0
  1149. package/dist/terminal/cursor.d.ts +40 -0
  1150. package/dist/terminal/cursor.d.ts.map +1 -0
  1151. package/dist/terminal/cursor.js +116 -0
  1152. package/dist/terminal/cursor.js.map +1 -0
  1153. package/dist/terminal/headless.d.ts +7 -5
  1154. package/dist/terminal/headless.d.ts.map +1 -1
  1155. package/dist/terminal/headless.js +47 -35
  1156. package/dist/terminal/headless.js.map +1 -1
  1157. package/dist/terminal/pty-output.d.ts +37 -0
  1158. package/dist/terminal/pty-output.d.ts.map +1 -0
  1159. package/dist/terminal/pty-output.js +109 -0
  1160. package/dist/terminal/pty-output.js.map +1 -0
  1161. package/dist/terminal/render-queue.d.ts +30 -0
  1162. package/dist/terminal/render-queue.d.ts.map +1 -0
  1163. package/dist/terminal/render-queue.js +105 -0
  1164. package/dist/terminal/render-queue.js.map +1 -0
  1165. package/dist/terminal/snapshot.d.ts +5 -0
  1166. package/dist/terminal/snapshot.d.ts.map +1 -0
  1167. package/dist/terminal/snapshot.js +13 -0
  1168. package/dist/terminal/snapshot.js.map +1 -0
  1169. package/docs/api.md +8 -1
  1170. package/docs/cli-behavior.md +930 -43
  1171. package/docs/cli-output.md +4 -0
  1172. package/docs/cli.md +15 -9
  1173. package/docs/codex/cli.md +44 -0
  1174. package/docs/login-recovery.md +24 -0
  1175. package/docs/native-question-proofs.md +57 -0
  1176. package/docs/performance.md +73 -0
  1177. package/docs/questions.md +181 -0
  1178. package/package.json +1 -1
  1179. package/prd/04-architecture.md +15 -0
  1180. package/prd/05-api/5.1-starting-claude.md +11 -1
  1181. package/prd/05-api/5.10-questions.md +117 -0
  1182. package/prd/05-api/5.3-claude-session-api.md +293 -24
  1183. package/prd/05-api/5.4-events.md +159 -32
  1184. package/prd/05-api/5.5-starting-codex.md +85 -18
  1185. package/prd/05-api/5.7-codex-session-api.md +143 -5
  1186. package/prd/05-api/5.8-session-api.md +58 -6
  1187. package/prd/05-api/5.9-loops.md +11 -1
  1188. package/prd/05-api/README.md +2 -0
  1189. package/prd/06-claude-hook-bridge.md +115 -0
  1190. package/prd/07-claude-policy.md +2 -0
  1191. package/prd/07a-codex-hook-bridge.md +90 -0
  1192. package/prd/08-state.md +51 -10
  1193. package/prd/09-lifecycle.md +79 -3
  1194. package/prd/10-errors.md +9 -2
  1195. package/prd/12a-cli.md +13 -7
  1196. package/prd/13-latitude.md +89 -0
  1197. package/prd/14-conformance.md +84 -30
  1198. package/prd/16-maintainer-review.md +75 -0
  1199. package/prd/README.md +1 -0
package/prd/12a-cli.md CHANGED
@@ -91,7 +91,10 @@ outcome by default, after stop-or-kill cleanup. `--keep` explicitly selects this
91
91
  default. `--ephemeral` instead requests teardown for either a new or resumed
92
92
  run; it cannot be combined with `--keep`. Teardown does not undo workspace
93
93
  changes or remove history owned by the underlying agent. A preserved run reports
94
- its resumable session ID on stderr in text mode. A resume uses `--resume <id>` to load exactly the
94
+ its resumable session ID on stderr in text mode only when `--show-session-id`
95
+ is supplied. By default, successful text output contains only the agent response;
96
+ `elwood sessions` lists retained IDs. The flag affects only the text footer, not
97
+ the `sessionId` field in JSON/JSONL, and emits nothing for ephemeral sessions. A resume uses `--resume <id>` to load exactly the
95
98
  stored adapter and cwd; it never falls back to a new conversation, and `--cwd`
96
99
  is therefore rejected with `--resume` rather than overriding the stored
97
100
  workspace. Explicit adapter conflicts are usage errors. Before launch, resumed state and its cwd MUST satisfy the private,
@@ -258,8 +261,11 @@ final nonzero result.
258
261
  While attached, Elwood temporarily puts terminal stdin into raw mode and
259
262
  discards ordinary keyboard, mouse, paste, and terminal-response bytes: v1 head
260
263
  mode is observational, not interactive. Every Ctrl-C byte follows the same
261
- first-interrupt/repeated-force-kill lifecycle as SIGINT. On every normal,
262
- failure, timeout, or interruption outcome, Elwood MUST remove its input and
264
+ first-interrupt/repeated-force-kill lifecycle as SIGINT. The mirror MUST stay
265
+ attached through session cleanup, so PTY output received before the run ended —
266
+ including the tail that runtime cleanup drains (§9.4) — reaches the display
267
+ rather than being discarded with a still-pending render batch. After cleanup, on
268
+ every normal, failure, timeout, or interruption outcome, Elwood MUST remove its input and
263
269
  resize listeners, restore terminal stdin's prior raw/cooked mode, flush pending
264
270
  display writes, reset attributes, disable mouse and bracketed-paste modes, show
265
271
  the cursor, and leave the alternate screen before emitting the final stdout
@@ -302,8 +308,8 @@ nothing to stdout, one concise notice naming the state directory to stderr, and
302
308
  exits 0. JSON output is exactly one version-1 document
303
309
  `{ "schemaVersion": 1, "type": "sessions", "stateDir": "...", "sessions": [...] }`
304
310
  whose array may be empty. JSONL is not a listing protocol; selecting it from any
305
- source is a usage error that names the source. Any other run option or a
306
- positional word is a usage error.
311
+ source is a usage error that names the source. Any other run option (including
312
+ `--show-session-id`) or a positional word is a usage error.
307
313
 
308
314
  ### 12A.9 Interactive mode
309
315
 
@@ -341,7 +347,7 @@ the agent owns the resumed conversation, later `elwood resume <id>` runs see
341
347
  whatever the user said interactively.
342
348
 
343
349
  `--output json`, `--output jsonl`, `--stream`, `--verbose`, `--debug`, `--head`,
344
- `--timeout`, `--persona`, `--image`, `--keep`, `--ephemeral`, and `--resume`
350
+ `--timeout`, `--persona`, `--image`, `--keep`, `--show-session-id`, `--ephemeral`, and `--resume`
345
351
  are usage errors with `interactive`, and more than one positional word is a usage
346
352
  error. A launch that cannot spawn fails with the adapter's not-found error code
347
353
  and status 1.
@@ -389,7 +395,7 @@ whose rows are the `AgentModelOption` objects. Every string is sanitized under
389
395
  §12A.3. Failures — timeout (124), interruption (130), blocked prompts, agent
390
396
  exit, and picker automation failures — use the existing stderr, error-document,
391
397
  and status conventions, and cleanup still runs exactly once. `--stream`,
392
- `--head`, `--persona`, `--image`, `--keep`, `--resume`, `--ephemeral`,
398
+ `--head`, `--persona`, `--image`, `--keep`, `--show-session-id`, `--resume`, `--ephemeral`,
393
399
  positional words, and JSONL output are usage errors.
394
400
 
395
401
  Listing sessions resolves only state-directory and output settings. Adapter,
@@ -10,3 +10,92 @@ above:
10
10
  - Whether the package runs on Node.js or another compatible JavaScript runtime, as long as the TypeScript API
11
11
  contract is met by supported hosts.
12
12
  - Internal storage filenames under `.elwood/`.
13
+
14
+ The documentation site's sprite-load errors identify the failing relative asset
15
+ path, bounded to 200 characters, and retain the underlying error as their cause.
16
+
17
+ Sprite requests for the same metadata or atlas key share one fetch/decode operation.
18
+ An explicit consumer may cancel without cancelling remaining consumers or silencing
19
+ their automatic failure report. Only the final consumer cancels the underlying
20
+ operation; an abandoned completion cannot publish into a successor request.
21
+ Explicitly retained pages stay alive through delivery and cache eviction until their
22
+ owner releases them, while current/outgoing pose owners remain protected.
23
+ After successful complete animation preparation, the shared idle clip's two shipped
24
+ pages remain leased for that sprite bank's lifetime, so later actions reuse them
25
+ without repeated fetching or decoding. Failed or cancelled preparations do not
26
+ establish this lease. The shared lease is capped at two pages: an idle manifest
27
+ with more pages falls back to ordinary animation/cache ownership.
28
+ The ordinary cache remains capped at four pages; rotation and action pages receive
29
+ no bank-lifetime lease. Disposal releases the shared idle lease together with all
30
+ other resource owners.
31
+
32
+ Sprite decoder requests may carry an abort signal. Cancellation rejects the
33
+ request promptly, skips requests that have not started decoding, and
34
+ never falls back to another decoder. The internal worker protocol pairs decode
35
+ request IDs with cancellation messages and completion acknowledgements. The page
36
+ owns the waiting queue and sends one request at a time; aborting the active
37
+ request does not release that physical slot until the worker replies. In-flight
38
+ browser bitmap decoding cannot be interrupted; its eventual image is released,
39
+ without terminating the worker or cancelling other requests. Settled requests remove their abort listeners.
40
+
41
+ Automatic gesture and facing tasks may wait at most eight seconds before delivery.
42
+ Once elapsed time exceeds eight seconds, the next simulation update cancels the
43
+ task before checking asset readiness or silhouette fit. Assets becoming ready
44
+ between updates cannot revive that expired task; delivery at exactly eight seconds
45
+ remains eligible. This limit does not shorten an action already delivered.
46
+
47
+ ### 13.1 Landing-page explicit animation controls
48
+
49
+ Landing gesture and front/back requests wait for every page of the requested clip,
50
+ idle and rotation before delivering input. Pending explicit loading suppresses
51
+ automatic actions. Requests are ineligible while dragging, holding movement,
52
+ airborne, hanging, climbing, landing, settling, or committed to a pending jump or
53
+ jump wind-up. Eligibility is checked before loading and again before delivery.
54
+
55
+ A request accepted into an existing gesture's recovery queue retains its delivered
56
+ pages until playback activation or replacement. Activation owns the requested clip
57
+ before the opening turn paints. Held movement that clears the recovery queue also
58
+ releases its delivered request. Reset, responsive reflow and supersession cancel
59
+ pending/delivered work while preserving active/outgoing poses; reflow preserves
60
+ held movement. Superseding a gesture/facing request preserves unrelated pending
61
+ input such as a jump press. Workshop paths retain on-demand loading; automatic moments and facing follow
62
+ §13.3, and suspended pickup follows §13.4.
63
+
64
+ ### 13.2 Landing-page initial animation readiness
65
+
66
+ The landing page keeps its static fallback until every initial idle page is decoded
67
+ and retained for playback. Initial preparation fetches idle only; rotation and other
68
+ clips remain on demand. The live readiness callback and first painted handoff occur
69
+ only after complete idle preparation. Input and visibility changes before readiness
70
+ do not cancel initial preparation. Teardown cancels it and prevents a late handoff.
71
+ An asset failure reports the existing contextual error and preserves the fallback;
72
+ a later explicit boot attempt may retry. Idle pages remain available through cache
73
+ eviction and later playback changes through the shared idle lease, with
74
+ current/outgoing pose ownership preserved.
75
+
76
+ ### 13.3 Automatic gesture and facing readiness
77
+
78
+ Automatic moments and facing actions wait for all requested, idle and rotation
79
+ pages before delivering input. Their post-delivery clock starts only when complete
80
+ preparation succeeds. The existing eight-second pre-delivery wait bounds loading;
81
+ expiry cancels that task without reporting an asset failure. Geometry probes remain
82
+ metadata-only and share existing loads. Publication requires the exact prepared
83
+ candidate, or the same complete active owner with no newer candidate/delivery.
84
+ Task replacement, manual takeover, reset/reflow and teardown release obsolete
85
+ metadata/preparation consumers. Cancellation removes a matching queued delivery,
86
+ but cannot release a newer manual request or active/current/outgoing playback.
87
+ An automatic asset failure reports once. Failed requested or shared idle/rotation
88
+ assets suppress later automatic attempts that need them, including other actions,
89
+ until explicit preparation clears the relevant failure state. Unchanged paint ticks
90
+ cannot retry or republish a failed or superseded task. Walking remains on demand.
91
+
92
+ ### 13.4 Landing-page pickup readiness
93
+
94
+ Pickup takes pointer/keyboard control immediately while the current drawable clip
95
+ continues playing. Suspended wriggle (or zero-gravity fallback) starts at time zero
96
+ only after all its sheets and idle/rotation dependencies are ready and owned by
97
+ that drag. Pointer movement preserves preparation. Drop, pause, reset, reflow and
98
+ teardown cancel pending pickup; a late completion cannot start obsolete playback.
99
+ Current/outgoing poses remain retained. Failure reports once for the current drag;
100
+ movement and painting do not retry, but a new drag may retry. Falling and landing
101
+ transitions retain their existing on-demand behavior.
@@ -36,10 +36,11 @@ Each criterion has:
36
36
  | C-API-16 | §5.1 | Omitted `initialSize` defaults to a 189 column by 48 row terminal. |
37
37
  | C-API-17 | §5.4 | Hook dispatch emits adapter-neutral hook-result activity, and hook failures also appear in the activity stream. |
38
38
  | C-API-18 | §5.1 | Claude and Codex start/resume options expose `autotrust` for opt-in workspace trust prompt automation. |
39
+ | C-API-58 | §5.3 | The session control queue bounds outstanding work, including in-flight input, to 1,024 operations and 8 MiB UTF-8 text. Excess admissions reject with `input_queue_full` without attachment or input; cancellation and physical settlement release capacity, while closed sessions retain `session_not_running` precedence. Loop rejection keeps the existing failed-submission retry policy; physical loop completion frees capacity before `fired` observers. Oversized startup personas reject before preflight or spawn. |
39
40
  | C-API-19 | §5.3 | Calling `sendMessage` while the session is alive but not ready queues the message until the next ready transition and rejects only if the session terminates first. |
40
- | C-API-20 | §5.7 | Codex transcript activity is flushed before terminal exit and terminal lifecycle status are emitted. |
41
+ | C-API-20 | §5.3 §5.7 §8.1 §9.4 | Claude and Codex transcript activity is flushed before terminal exit and terminal lifecycle status are emitted; reentrant shutdown joins observed natural-exit finalization. Within the same process, a validated successor resume revokes the old launch's shared-state mutation authority, including deferred and repeated teardown. |
41
42
  | C-API-21 | §5.1 §5.5 | A caller-provided `persona` is submitted as the session's first user message on the first ready transition, ahead of caller-queued messages; it is not persisted and not re-sent on resume. |
42
- | C-API-22 | §5.3 §5.7 | `compact()` submits the adapter's `/compact` command through the readiness queue, resolves on the adapter's `PostCompact` hook, rejects with `compact_failed` on timeout, and rejects with `session_not_running` if the session terminates first. |
43
+ | C-API-22 | §5.3 §5.7 | `compact()` submits the adapter's `/compact` command through the readiness queue, resolves on the adapter's `PostCompact` hook, rejects with `compact_failed` on timeout, and rejects with `session_not_running` if the session terminates first. The one recovery Enter for a swallowed submission is a queued write: it waits behind a model operation that owns the input queue, is dropped once compaction settles, and is withheld from blocking dialogs and from any visible model dialog. |
43
44
  | C-API-23 | §5.3 §5.7 | `listModels()` parses the adapter's rendered model picker into typed options with current/default markers, cancels with Escape, and leaves the session model unchanged. |
44
45
  | C-API-24 | §5.3 §5.7 | `setModel(id)` switches the session model through cursor navigation; Elwood itself never persists a new default into user-owned configuration (Claude uses the session-only key; the Codex CLI persists its own picker selection, documented as a §4.5 deviation) and unknown ids reject with `model_automation_failed` listing available ids. When Claude interposes its built-in model- or effort-cache warning, Elwood selects the affirmative row from one bottom-most contiguous live dialog across numbered/unnumbered layouts, revalidates it before confirmation, and resolves only after the idle composer returns; transcript text cannot participate and a `PreModelSwitch` hook confirmation remains human-controlled. |
45
46
  | C-API-35 | §5.3 §5.7 | `listModels()`/`setModel()` dispatch the picker command even while a turn is in flight (they do not wait for `ready`), so picker automation is not stalled by an in-flight turn such as an MCP-server boot spinner; `compact` and messages still wait for the active turn. Ordering is FIFO except for the documented overtaking of a readiness-waiting head by an immediate operation (a picker command, a `sendPrompt`, or already-ready running-turn guidance); same-class and post-ready ordering stays FIFO, and no two submissions interleave. |
@@ -47,34 +48,36 @@ Each criterion has:
47
48
  | C-API-37 | §5.3 §5.7 | Claude and Codex expose `sendGuidance(message)`: before first readiness and while blocked it queues safely like `sendMessage`; during a post-ready running turn it overtakes readiness-waiting operations and enters the TUI immediately. Guidance serializes with queue-backed prompt/message/command submissions and resolves only after the submitting Enter is dispatched; raw `sendKeys` intentionally bypasses that queue. |
48
49
  | C-API-38 | §5.3 §5.7 | `interrupt()` bypasses the control queue and writes a single Escape immediately while the session is `running` or `blocked` AND has reached initial readiness at least once, resolving when the session next reaches `ready`; with no turn in flight — an idle `ready` session or the pre-readiness startup `running` window — it resolves without writing anything; concurrent calls coalesce into one Escape; it rejects with `interrupt_failed` after `timeoutMs` (default 10000 ms) and with `session_not_running` when the session terminates first or is already terminal. |
49
50
  | C-API-39 | §5.3 §5.7 | When restoring the latest requested size at Claude's initial-ready transition fails with a real (non-closed) native PTY resize error, Elwood keeps the safe bootstrap width, does not report the resize as applied, and surfaces a typed `resize_restore_failed` warning (content-free: only the requested size and an allowlisted error code), while still releasing the queued persona/caller message so input is never starved; a closed-fd resize at that transition stays a silent no-op. |
50
- | C-API-25 | §5.3 | Promise-returning session methods called after a terminal status reject with `session_not_running` instead of throwing synchronously. |
51
+ | C-API-25 | §5.3 | Promise-returning session methods called after a terminal status reject with `session_not_running` instead of throwing synchronously; expired Stop input retains the earlier `wait_timeout` admission rejection (C-HOOK-04). |
51
52
  | C-API-26 | §5.2 §5.6 | `startOrResumeClaude`/`startOrResumeCodex` resume when possible, fall back to a fresh start only on `state_not_found`, `resume_unavailable`, or `adapter_mismatch`, rethrow all other errors, and report `resumed` in the result. |
52
53
  | C-API-27 | §5.7 | `ElwoodAgentSession` is exported and both `ClaudeSessionApi` and `CodexSessionApi` (the raw live sessions the `ClaudeSession`/`CodexSession` classes wrap) are assignable to it, covering common events, io, commands, and lifecycle. |
53
- | C-API-28 | §5.3 | Initial readiness fires from the adapter's pre-input readiness hook — Codex's `SessionStart`, Claude's `InstructionsLoaded`. On a COLD start the rendered composer is never a readiness signal — the boot-time composer placeholder alone never releases the first queued message (it is painted before the input loop is live and would be swallowed). On a RESUME the CLI reattaches to an existing conversation without re-firing its pre-input hook and its input loop is live when the composer paints, so a resumed session fires initial readiness on the FIRST rendered composer marker (or on the readiness hook if it re-fires, whichever is first), reaching readiness in ~1s instead of the full deadline. A blocking dialog's option caret is byte-identical to the composer marker, so the resume-composer path does NOT fire while a blocking dialog is on screen — readiness waits for the dialog to clear, so a draining queued message can never approve it. This dialog gate applies to EVERY readiness source, not just the resume-composer path: a blocking dialog on screen — including one that first rendered while the session was still `starting`, before it could latch the `blocked` status — defers a hook OR deadline readiness mark too, so no readiness source ever drains the queue into a dialog. The deferred mark is reconciled the moment a rendered frame shows the dialog cleared (readiness is neither drained into the dialog nor permanently starved by it). A bounded deadline after the first rendered frame is the ultimate fallback on BOTH adapters and BOTH start/resume, so a missing/failed readiness hook (and, on cold start, an absent composer signal) cannot starve queued persona/messages forever. Readiness fires exactly once (idempotent): whichever of hook, resume-composer signal, or deadline comes first releases the first queued message, and the others are no-ops. |
54
+ | C-API-28 | §5.3 | Initial readiness fires from the adapter's pre-input readiness hook — Codex's `SessionStart`, Claude's `InstructionsLoaded`. On a COLD start the rendered composer is never a readiness signal — the boot-time composer placeholder alone never releases the first queued message (it is painted before the input loop is live and would be swallowed). On a RESUME the CLI reattaches to an existing conversation without re-firing its pre-input hook and its input loop is live when the composer paints, so a resumed session fires initial readiness on the FIRST rendered composer marker (or on the readiness hook if it re-fires, whichever is first), reaching readiness in ~1s instead of the full deadline. A blocking dialog's option caret is byte-identical to the composer marker, so the resume-composer path does NOT fire while a blocking dialog is on screen — readiness waits for the dialog to clear, so a draining queued message can never approve it. This dialog gate applies to EVERY readiness source, not just the resume-composer path: a blocking dialog on screen — including one that first rendered while the session was still `starting`, before it could latch the `blocked` status — defers a hook OR deadline readiness mark too, so no readiness source ever drains the queue into a dialog. The deferred mark is reconciled only when a rendered frame shows a nonblocking idle composer; ongoing work and blank or partial repaints retain the hold. A bounded deadline after the first rendered frame is the ultimate fallback on BOTH adapters and BOTH start/resume, so a missing/failed readiness hook (and, on cold start, an absent composer signal) cannot starve queued persona/messages forever. Readiness fires exactly once (idempotent): whichever of hook, resume-composer signal, or deadline comes first releases the first queued message, and the others are no-ops. |
54
55
  | C-TURN-01 | §5.3 | While a turn runs the session is `running`; when the turn ends by any means — completion, Escape interrupt, or otherwise — the session transitions to `ready` and emits the corresponding `status` activity, on both adapters. |
55
56
  | C-TURN-02 | §5.3 | An Escape interrupt of a running turn produces the `ready` transition from rendered TUI state alone, with no dependency on a `Stop` hook. |
56
57
  | C-TURN-03 | §5.3 | Turn-state detection uses documented per-adapter indicator constants over `snapshot().text`; redundant edges are idempotent, and screens showing neither indicator hold state. Watching activates only after initial readiness. On resume, rendered edges remain suppressed through transcript replay until the first quiet, non-blocking composer; explicit running evidence releases that suppression immediately and synchronizes the watcher, and the CURRENT frame is still evaluated so the real turn's rendered end is retained even when it is the first frame after release (the turn ended exactly as the evidence arrived). |
57
- | C-TURN-04 | §5.3 | The interrupt `ready` transition fires at any terminal width: via the working-token edge where the footer fits, and via the adapter's interrupt end banner (which Claude's footer elision below ~66 columns makes necessary) on narrow screens. |
58
- | C-TURN-05 | §5.3 | Turn-state detection also consumes the OSC window title as a width-independent working signal: both adapters render a braille-spinner glyph (U+2800–U+28FF) in the title while a turn runs, so a turn `started` edge can fire from the title alone when the on-screen footer token is elided. The title is exposed on the terminal handle and is not persisted. |
58
+ | C-TURN-04 | §5.3 | The interrupt `ready` transition fires at any terminal width: via the working-token edge where the footer fits, and via the adapter's interrupt end banner (which Claude's footer elision below ~66 columns makes necessary) on narrow screens. Retained pre-submission frames cannot complete newer physical input; a fresh interrupt banner absent at submission still works without a working footer. |
59
+ | C-TURN-05 | §5.3 | Turn-state detection also consumes the OSC window title as a width-independent working signal: both adapters render a braille-spinner glyph (U+2800–U+28FF), and Claude also renders the observed `◐ ` prefix while a turn runs, so a turn `started` edge can fire from the title alone when the on-screen footer token is elided. The title is exposed on the terminal handle and is not persisted. |
59
60
  | C-ATTN-01 | §5.3 | A tool permission dialog rendered mid-turn transitions the session to `blocked` and emits an `attention` activity whose label names the matched screen-fact rule ids, on both adapters. |
60
- | C-ATTN-02 | §5.3 | A session enters `blocked` from either `running` or `ready` when a blocking dialog appears, and settles to `ready` when the dialog resolves; blocking evidence never moves a session out of a terminal status. |
61
- | C-ATTN-03 | §5.3 | Startup prompts Elwood answers automatically never produce `blocked`; a workspace trust prompt left unanswered because `autotrust` is false does. |
61
+ | C-ATTN-02 | §5.3 | A session enters `blocked` from either `running` or `ready` when a blocking dialog appears, and clears directly to `running` when the current frame shows work, or to `ready` when idle; working clearance emits no intermediate readiness and leaves queued input suspended, including deferred initial readiness. A held caller prompt restores running at physical submission before a follow-up can dispatch, without repeating caller intent bookkeeping. Blocking evidence never moves a session out of a terminal status. |
62
+ | C-ATTN-03 | §5.3 | Startup prompts successfully answered within the automation bound never produce `blocked`; unauthorized trust candidates block immediately. An off-allowlist gate inside the §5.4 grammar (recognized native header prefix, non-empty header, selectable options, frame-ending native footer, no conversation row above) is hold-only under every `autotrust` value: it holds readiness and queued input, never receives automated input, and blocks with attention rule id `<agent>-unknown_gate-prompt`; a dialog another blocking rule names keeps that label alone. Gates outside that grammar, conversation-quoted copies, footer-less or header-less shapes, and the native composer are not held. An authorized trust candidate that remains unsupported or uncleared after five seconds produces recoverable `blocked` and existing human attention, without requiring another frame; raw input and a later valid layout can recover it (C-TRUST-01). A blocking prompt painted while `starting` blocks once the session is live AND emits its attention activity then. While still blocked, a changed set of blocking rule ids emits updated attention without another blocking status decision; identical sets do not re-emit. |
62
63
  | C-ATTN-04 | §5.3 | Claude's model/effort switch confirmation dialogs are blocking prompts even though their selection caret resembles the composer marker. The built-in cache warning is automatically confirmed only as part of `setModel`; hook-requested confirmations remain blocked for a human decision. |
64
+ | C-ATTN-05 | §5.3 | Native Claude questionnaires remain blocking when question copy contains composer-like carets, header-like rows, fences, or navigation-footer text. A completed questionnaire quoted above a later native composer does not supply questionnaire-blocking evidence. |
63
65
  | C-API-33 | §5.3 | `statusDecisions()` returns a live-only log of at most the 50 most recent status decisions, oldest first, each recording the evidence, the from/to statuses (`to` undefined when ignored), and a human-readable reason; it is never persisted and carries no prompt, terminal, or hook payload content. |
64
66
  | C-API-34 | §5.3 | `waitForStatus`/`waitForActivity` resolve from current state or the next matching event, reject with `wait_timeout` after the timeout (default 60000 ms), and reject with `session_not_running` when the session reaches an unwaited terminal status first; both unsubscribe on settle. |
65
67
  | C-API-29 | §5.2 §5.6 | Resume accepts the same launch-policy options as start and forwards them into the relaunched command: `resumeClaude` forwards `permissionMode`, `allowedTools`, `disallowedTools`, `tools`, and `reasoningEffort`; `resumeCodex` forwards `sandbox`, `approvalPolicy`, and `reasoningEffort`. A resumed agent stays exactly as privileged and as tool-restricted as it started, and applies a re-supplied reasoning effort (which Elwood does not persist across resume). |
66
68
  | C-API-32 | §5.2 §5.6 | Resume defaults launch-policy options from the record's persisted posture; explicit resume options override field by field, and the effective posture is re-persisted. |
67
69
  | C-API-30 | §5.4 | `tool_call` activity carries the tool's input as a serialized `toolInput` and `tool_result` activity carries the tool's output as a serialized `toolOutput`, sourced from the committed transcript for Claude (`tool_use.input`/`tool_result.content`, per C-CLAUDE-15) and from the transcript for Codex (`arguments`/`output`); absent sources leave the field absent. |
68
- | C-API-31 | §5.3 | The submitting Enter is a separate PTY write after a settle delay, and bounded re-Enters fire while the rendered composer still shows the staged paste, so a first long prompt cannot be left staged-but-unsubmitted. |
70
+ | C-API-31 | §5.3 | Submitting Enter is a separate settled PTY write. Ordinary recovery permits at most two re-Enters over four one-second observations; initial/replay ergonomic recovery instead wakes on completed renders and retains cancellable ownership, with two paced retries and no ambiguous-frame polling budget. Retry requires live idle staged input; empty retirement requires positive empty input. Both need completed native output after the latest Enter, excluding cached/resize/scroll changes. Working/unknown frames consume no Enter budget. Native user-message activity, including during first Enter, revokes retry; optimistic status does not. |
71
+ | C-API-56 | §5.3 | Queued paste, command text, Enter, recovery and non-trust startup writes observe all received PTY output (including arrivals during observation), recheck holds, then write before further output. Ordinary observation timeout (1s) or permanent render failure withholds/retries cancellably. Cancelled drafts retain safe cleanup before successor input/images: clear keys need fresh positive empty input within 1s; failure rejects the successor with `wait_timeout`; raw `sendKeys`/`terminal.sendInput`/`xterm.input` revokes authority and rejects awaited initial/replay ergonomic input with a submission-specific `wait_timeout`; close drops deferred cleanup. Initial/replay ergonomic input retains its slot/draft until fresh completed post-latest-Enter output proves empty input; geometry, missing draft text, activity and write fulfillment cannot acknowledge it. It shares staged/freshness guards, observes the final bounded retry before acceptance or `wait_timeout`, and retains pending physical writes through cancellation/close. Compact recovery/cleanup uses the same guard; successor dispatch cancels compact recovery. `sendKeys` never waits. Codex update skip/retries and Claude browser-tools decline stay silent/retryable when held; Claude disposal permanently cancels write/retry/success/warning (C-CLAUDE-22). Trust responders are exempt. |
69
72
  | C-API-40 | §5.3 | `sendPrompt`/`sendMessage`/`sendGuidance` text is sanitized before it is framed as a bracketed paste: the `ESC [ 200~`/`ESC [ 201~` sentinels and all other C0/C1 control characters except tab, newline, and carriage return are removed, so caller/model text cannot escape paste mode and inject live keystrokes (e.g. an Enter that confirms a permission dialog). `sendKeys` is the raw escape hatch and is never sanitized. |
70
73
  | C-API-41 | §5.3 | `listClaudeModels(options)`/`listCodexModels(options)` return the available models WITHOUT a caller-held session: each starts a throwaway session with `autotrust: true` (a documented §5.1 exception — the probe only opens/cancels the picker and never runs a turn), waits for first readiness, calls `listModels`, and ALWAYS removes ALL probe state afterward — on success, on a readiness/picker failure, AND on an adapter start failure that has already allocated a state directory or runtime files — so no probe session, process tree, socket, or state directory is leaked. A readiness/picker error is the error surfaced to the caller; teardown still runs, and when teardown ITSELF fails (which can leave a probe process tree alive) a bounded diagnostic naming the teardown failure — an allowlisted errno or the error's name, never a raw message — is attached to the surfaced error's `cause`, so a leaked probe is never silently invisible. The rows are exactly `listModels`' output and the probe leaves the user's saved MODEL default untouched (the picker is opened and cancelled, never applied), just as `listModels` does on a live session. |
71
- | C-API-42 | §5.3 §5.7 | When recording a session's one-shot initial-ready transition throws (a lifecycle-event listener) — on EITHER adapter — Elwood still releases the control queue directly FIRST so queued persona/caller input is never starved, then surfaces a typed, content-free `initial_ready_fallback` warning (`agent: "claude" \| "codex"`) whose delivery is itself isolated so a rogue warning sink cannot re-starve the queue. |
74
+ | C-API-42 | §5.3 §5.7 | When recording a session's one-shot initial-ready transition throws — on EITHER adapter — Elwood still releases the control queue directly FIRST so queued persona/caller input is never starved, then surfaces a typed, content-free `initial_ready_fallback` warning (`agent: "claude" \| "codex"`) whose delivery is itself isolated so a rogue warning sink cannot re-starve the queue. Codex's returned status/activity Promise rejections from standalone readiness report `initial_ready_observer_failed` without delaying that transition; hook-triggered readiness shares the enclosing C-HOOK-22 warning boundary. |
72
75
  | C-API-43 | §5.3 | `ClaudeSession.login(options)` drives the interactive `/login` re-authentication flow to recover a session whose login lapsed (per C-CLAUDE-18) without a caller-held restart. It submits `/login` as a picker command, selects the requested login `method` (default `claudeai`) from the "Select login method" list if that list renders, and scrapes the authorization URL off screen and reports it via the optional `onAuthUrl` callback. Because the default account flow completes with a human-entered authorization code, Elwood awaits the CLI's "paste code" prompt and, when it renders, calls the required `provideCode` callback and submits the returned code as raw input; a flow that self-completes without prompting for a code never calls `provideCode`. `login` resolves once the CLI reports login success AND the session is usable again, and rejects with `login_failed` on an explicit failure/invalid-code banner or with `login_timeout` after `timeoutMs` (default 300000 ms); like every other command method it rejects with `session_not_running` when the session is terminal. It serializes with other queued commands and never sends raw keystrokes into a blocking dialog. |
73
- | C-API-44 | §5.3 | `sendPrompt`/`sendMessage`/`sendGuidance` accept an optional `images` list (file paths or `{data,format}` bytes) attached to the submission. Images have no position within the text, but the list is ORDERED (array order = attachment/chip order). Elwood attaches every image through the CLI's own native ingestion path, as part of the SAME serialized queue operation that submits the text and BEFORE that text's submitting Enter, so one call yields one agent turn carrying text and all images. Inputs are validated and bounded before any temp file is written or any input reaches the composer: at most 16 images, ≤25 MiB per image and ≤50 MiB total; an unsupported/empty `format`, a `path` that is not a readable regular file (its readability checked, not merely its existence), or any count/size past the limits rejects with `invalid_image`. A non-array `images`, an entry that is not exactly one of `{path}`/`{data,format}`, a non-string `path`, or non-`Uint8Array` `data` also rejects with `invalid_image` (never a raw type error). Every input is defensively SNAPSHOTTED — byte buffers cloned, paths absolutized — SYNCHRONOUSLY at the public send boundary, BEFORE the op is enqueued, so a caller that mutates its buffer (or changes `cwd`) after the call cannot change what is attached; the shape, format, count, and byte-size limits are enforced in that same synchronous pass, so a malformed or over-limit input rejects with `invalid_image` before it ever occupies a queue slot. The remaining filesystem checks that need I/O — a path's readability, regular-file-ness, and size against the per-image and shared aggregate ceilings — run inside the queued op at dispatch (so a path made unreadable after the call still rejects, and no temp file is written for a still-queued submission). The synchronous snapshot completes before the queue insertion, so an image submission is still enqueued in call order and a later plain submission cannot overtake it. Beyond the per-submission 50 MiB ceiling, a PER-SESSION aggregate ceiling (200 MiB) bounds the cloned image bytes held across ALL not-yet-attached queued submissions at once: a submission whose clone would push the session past that ceiling rejects with `invalid_image`, and each submission's reserved bytes are released when it settles (attach done, reject, or the session closing), so a slow paste/confirmation cannot let a caller retain unbounded queued-clone memory. Because a send on a TERMINAL session is guarded first, a malformed/over-limit `images` on a stopped/killed/torn-down session rejects with `session_not_running` (the terminal contract), not `invalid_image`. The lifecycle turn transition is deferred until AFTER a successful attach, so an attach rejection leaves readiness untouched and never wedges the queue; a raw materialization failure (e.g. disk-full) is surfaced as the typed `image_attach_failed`, not a raw platform error. Each image's attach is CONFIRMED by its `[Image #N]` chip on the composer prompt-glyph line (so unrelated screen text cannot spoof it); an unconfirmed image (chip not seen within 10 s) or a clipboard read/write failure rejects with `image_attach_failed`, submits no text, and best-effort clears the composer draft so staged images do not leak into a later turn (a session that terminates mid-attach rejects with `session_not_running`). Bytes are written to a short-lived temp file Elwood attempts to remove after the submission is attached (best-effort; a persistently failing removal falls to OS temp reaping). |
76
+ | C-API-44 | §5.3 | `sendPrompt`/`sendMessage`/`sendGuidance` accept an optional `images` list (file paths or `{data,format}` bytes) attached to the submission. Images have no position within the text, but the list is ORDERED (array order = attachment/chip order). Elwood attaches every image through the CLI's own native ingestion path, as part of the SAME serialized queue operation that submits the text and BEFORE that text's submitting Enter, so one call yields one agent turn carrying text and all images. Inputs are validated and bounded before any temp file is written or any input reaches the composer: at most 16 images, ≤25 MiB per image and ≤50 MiB total; an unsupported/empty `format`, a `path` that is not a readable regular file (its readability checked, not merely its existence), or any count/size past the limits rejects with `invalid_image`. A non-array `images`, an entry that is not exactly one of `{path}`/`{data,format}`, a non-string `path`, or non-`Uint8Array` `data` also rejects with `invalid_image` (never a raw type error). Every input is defensively SNAPSHOTTED — byte buffers cloned, paths absolutized — SYNCHRONOUSLY at the public send boundary, BEFORE the op is enqueued, so a caller that mutates its buffer (or changes `cwd`) after the call cannot change what is attached; the shape, format, count, and byte-size limits are enforced in that same synchronous pass, so a malformed or over-limit input rejects with `invalid_image` before it ever occupies a queue slot. The remaining filesystem checks that need I/O — a path's readability, regular-file-ness, and size against the per-image and shared aggregate ceilings — run inside the queued op at dispatch (so a path made unreadable after the call still rejects, and no temp file is written for a still-queued submission). The synchronous snapshot completes before the queue insertion, so an image submission is still enqueued in call order and a later plain submission cannot overtake it. Beyond the per-submission 50 MiB ceiling, a PER-SESSION aggregate ceiling (200 MiB) bounds the cloned image bytes held across ALL not-yet-attached queued submissions at once: a submission whose clone would push the session past that ceiling rejects with `invalid_image`, and each submission's reserved bytes are released when it settles (attach done, reject, or the session closing), so a slow paste/confirmation cannot let a caller retain unbounded queued-clone memory. The ceiling is ONE budget per session, shared by the §5.8 facade and the raw session it exposes through `session`, so a caller mixing both surfaces is still bounded by 200 MiB in total. Ergonomic `send`/`stream` facade turns retain their reservation through the real turn boundary to cover acceptance replay (§5.8); raw facade submissions release it when submission settles. Because a send on a TERMINAL session is guarded first, a malformed/over-limit `images` on a stopped/killed/torn-down session rejects with `session_not_running` (the terminal contract), not `invalid_image`. The lifecycle turn transition is deferred until AFTER a successful attach, so an attach rejection leaves readiness untouched and never wedges the queue; a raw materialization failure (e.g. disk-full) is surfaced as the typed `image_attach_failed`, not a raw platform error. Each image's attach is CONFIRMED by its `[Image #N]` chip on the composer prompt-glyph line (so unrelated screen text cannot spoof it); an unconfirmed image (chip not seen within 10 s) or a clipboard read/write failure rejects with `image_attach_failed`, submits no text, and best-effort clears the composer draft so staged images do not leak into a later turn (a session that terminates mid-attach rejects with `session_not_running`). Bytes are written to a short-lived temp file Elwood attempts to remove after the submission is attached (best-effort; a persistently failing removal falls to OS temp reaping). |
74
77
  | C-API-45 | §5.3 | Claude attaches an image by bracketed-pasting its ABSOLUTE path into the composer (the delivery a terminal produces on drag-and-drop); Claude reads and encodes the file itself and shows an `[Image #N]` chip. This is pure PTY text and works on every platform. |
75
78
  | C-API-46 | §5.3 | Codex attaches an image from the OS clipboard: Elwood snapshots the user's clipboard ONCE (rejecting with `image_attach_failed` if the snapshot fails, before mutating anything), then for each image in order writes it onto the macOS `NSPasteboard` as a native image (`public.tiff`), sends Ctrl+V, and waits for the `[Image #N]` chip; after all images it restores the single snapshotted clipboard (best-effort, text contents). The whole snapshot/set/paste/confirm/restore sequence holds a process-wide clipboard lock so concurrent Codex sessions cannot cross-attach. A pasted path is NOT an image on Codex. Codex image attachment is macOS-only: `images` on a non-macOS Codex session rejects with `unsupported_platform` and submits nothing. |
76
79
  | C-API-47 | §5.8 | The ergonomic `ClaudeSession`/`CodexSession` construct synchronously with the same options as `startClaude`/`startCodex` (with `cwd` defaulting to `process.cwd()`), do NOT start the underlying session at construction, and start it lazily on the first `send`/`stream` or on an explicit `start()`. `start()` is idempotent and concurrent-safe (a second `start()`, or a `send`/`stream` during startup, awaits the same in-flight start), and a startup failure rejects the triggering call with the same typed `ElwoodError` the factory would throw. The started underlying session is exposed via a read-only `session` accessor (undefined until started). |
77
- | C-API-48 | §5.8 | `stream(prompt, options?)` returns an async iterable that yields the SIMPLIFIED typed events of exactly one turn in arrival order — `{type:"text"}` for `assistant_message`, `{type:"thinking"}` for `reasoning`, `{type:"tool_call",name,input?,toolCallId?}` for `tool_call`, `{type:"tool_result",name?,output?,toolCallId?}` for `tool_result` — and no other activity kind. A tool event carries the adapter's normalized `toolUseId` as `toolCallId` when available so calls and results can be correlated. The facade subscribes to `activity` BEFORE submitting the prompt (no early event of the turn is missed); turn isolation rests on SERIALIZATION — the serialized slot is held until the agent reaches its real boundary (not until the consumer stops reading) so a prior turn's activity never bleeds into the next — with `turnId` binding as an additional refinement where the adapter tags it (Codex; Claude transcript activity has none). An idle `ready` may complete the turn only after positive acceptance from `UserPromptSubmit`, turn content, or `Stop`; an unaccepted idle transition waits the no-oracle quiet window, replays the same submission at most twice, and then fails with `wait_timeout` instead of reporting an empty success. The iterator ends via the completeness oracle: once an accepted `ready` is observed, it ends the instant the collected assistant text contains the `Stop` hook's `last_assistant_message` (used as a completeness signal only, never displayed); with no such signal it ends after a bounded quiet window; a terminal status ends it IMMEDIATELY. There is NO whole-turn timeout by default (a live turn may run for hours); a caller may pass an opt-in `timeoutMs` ceiling, ARMED ONLY AFTER submission (a turn begins on submission, so the ceiling never rejects a prompt still queued behind readiness that then submits), and a `catchUpMs` cap (default 10000 ms) armed once an accepted `ready` fires throws `wait_timeout` if the transcript never catches up — including when a NON-EMPTY expected text never appears (a promised completion that never arrives is a failure, not a quiet settle). |
80
+ | C-API-48 | §5.8 | `stream` yields one turn's ordered text/thinking/tool-call/tool-result events with the §5.8 fields and `toolUseId` correlation. It subscribes before submission and serializes through native completion/drain, beyond consumer settlement. Codex binds only authenticated post-owned-Enter UserPromptSubmit with adapter-normalized payload correlation; pre-acceptance content and prior Stop cannot bind/finish. Tagged content and confirmed Stop match that generation; untagged content relies on serialization. Hookless completion requires its classified native end, fresh post-Enter output and no block; interrupt return is insufficient. Selected loops reserve before staging; persona/loop boundaries drain before caller collection. Claude is untagged. Passive idle completion requires positive UPS/content/Stop acceptance; unaccepted idle waits the quiet window, replays at most twice, then fails `wait_timeout`. Initial/replay input awaits fresh empty evidence; consumer settlement cancels recovery, while slot/images survive until native boundary/drain and physical cleanup. Blocked cleanup precedes successor writes; pre-replay ready cannot release a later running replay after consumer failure. Accepted ready completes when collected text contains its Stop oracle (never displayed), or after bounded quiet without an oracle; terminal status ends immediately. Whole-turn timeout defaults off; optional `timeoutMs` arms once at first physical Enter, before empty confirmation and never while queued. `catchUpMs` (default 10000ms) starts at accepted ready and fails `wait_timeout` if promised text, including nonempty text, never arrives. |
78
81
  | C-API-49 | §5.8 | `send(prompt, options?)` resolves with the turn's assistant text: the `text` of every `type:"text"` stream event, in order, joined by `\n\n` between distinct assistant messages, and NOTHING else (no thinking or tool text). A turn with no assistant text resolves to the empty string. `send` and `stream` share one turn boundary, so a `send` resolves exactly when the equivalent `stream` iterator ends. |
79
82
  | C-API-50 | §5.8 | Ergonomic turns are SERIALIZED: overlapping `send`/`stream` calls queue and run one at a time in call order, so one turn's yielded/collected activity never interleaves with another's. |
80
83
  | C-API-51 | §5.8 | `close()` stops the underlying session (falling back to `kill` on a stop failure) and is a no-op when the session never started, so it is safe to call in a `finally`. When a lazy start is IN FLIGHT, `close()` awaits that same start and stops the resulting session (never orphaning a session whose launch resolves after `close()` returned); a launch that REJECTS leaves nothing to close. When BOTH stop and kill fail, `close()` throws `termination_failed` carrying BOTH the stop `cause` and the kill `killCause` (neither diagnostic is lost). |
@@ -93,7 +96,7 @@ Each criterion has:
93
96
  | C-LOOP-05 | §5.9 | A fixed loop first becomes due after its full interval plus delay-only jitter and submits only through the ordinary readiness-safe path. |
94
97
  | C-LOOP-06 | §5.9 | Idle loops use five continuous non-loop-activity-free minutes plus jitter; non-loop activity resets all, while a completed loop turn rearms only its origin and leaves peers eligible. |
95
98
  | C-LOOP-07 | §5.9 | Stable jitter is derived from ID at creation, falls in `0..min(10% cadence, 30s)`, never advances a due time, and is persisted as restore authority. |
96
- | C-LOOP-08 | §5.9 | A due loop blocked by liveness/readiness submits at most once at the next ready transition; missed occurrences do not accumulate and stop/exit discards transient due state. |
99
+ | C-LOOP-08 | §5.9 | A due loop blocked by liveness/readiness submits at most once at the next eligible ready transition; ergonomic turns hold loop delivery from before initial submission through their real boundary without blocking caller recovery. Nested holds release independently; missed occurrences do not accumulate and stop/exit discards transient due state. |
97
100
  | C-LOOP-09 | §5.9 | Due loops commit serially, one per ready transition, ordered by due time then ID; fixed clocks restart from submission and idle origin clocks from completing readiness. |
98
101
  | C-LOOP-10 | §5.9 | Live scheduling/submission failure emits redacted failure evidence and rearms fresh unless the session is non-live, when the persisted definition waits for resume. |
99
102
  | C-LOOP-11 | §8.2 | The loop sidecar stores stable identity, cadence, exact prompt, jitter, creation, and expiry but no live timer or transient scheduling state. |
@@ -127,8 +130,9 @@ Each criterion has:
127
130
  |---|---|---|
128
131
  | C-PERF-01 | §9.2 | Version/capability probes run asynchronously and never block the host process's event loop, so a roster of concurrent spawns does not serialize on a single thread. |
129
132
  | C-PERF-02 | §9.2 | Each adapter's `--version` is read at most once per parent process; concurrent first reads share a single subprocess, later reads reuse the cached result, and the cache is invalidated after every coordinated `autoupdate` attempt, including a failed or peer-owned attempt. |
130
- | C-PERF-03 | §9.2 | Any non-PTY probe (`--version`, `--help`, `update`) that exceeds the default runtime timeout (15s) or per-stream byte cap (1,000,000 bytes) is killed. A killed/failed `--version`/`--help` probe surfaces through `*_start_failed` with `cause`/`errno` (`ETIMEDOUT`/`E2BIG`) preserved in `details`; a killed/failed `update` probe is best-effort and instead surfaces the live `agent_update_failed` warning (same bounded diagnostics) without blocking startup. Probes that exit or fail to spawn on their own are not signaled. |
131
- | C-PERF-04 | §9.2 | With `autoupdate`, concurrent callers in one parent process share one update, and separate Elwood parent processes for the same macOS user and adapter serialize through an atomic lease in a stable account cache independent of `TMPDIR`. A contender waits asynchronously for the active updater, skips its duplicate attempt, invalidates its local caches, and validates the installed version; none races a second global update. The lease records owner identity and a unique generation: a live owner is never evicted solely because the stale bound elapsed, dead-owner recovery is serialized, and cleanup cannot remove a successor generation. |
133
+ | C-PERF-03 | §9.2 | Any non-PTY probe (`--version`, `--help`, `update`) that exceeds the default runtime timeout (15s) or per-stream byte cap (1,000,000 bytes) is killed. A killed/failed `--version`/`--help` probe surfaces through `*_start_failed` with `cause`/`errno` (`ETIMEDOUT`/`E2BIG`) preserved in `details`; a killed/failed `update` probe is best-effort and instead surfaces the live `agent_update_failed` warning (same bounded diagnostics) without blocking startup. Abort cleanup retries process-group termination, falls back to the direct child after repeated group-signal failure, and awaits exit within an additional one-second bound. A group id is signaled only while its leader (the direct child) is unreaped; once the leader is reaped the possibly-reissued number is observed, never signaled. Unresolved aborted groups retain an asynchronous in-process reaper without prolonging host shutdown or retaining captured output. Cleanup confirmed within the bound reports no cleanup error; unconfirmed cleanup adds a content-free `cleanupErrorCode` and a diagnostic-only `cleanupProcessGroupId` to the probe's typed error details. Probes that exit or fail to spawn on their own are not signaled. |
134
+ | C-PERF-04 | §9.2 | With `autoupdate`, concurrent callers in one parent process share one update, and separate Elwood parent processes for the same macOS user and adapter serialize through an atomic lease in a stable account cache independent of `TMPDIR`. A contender waits asynchronously for the active updater, skips its duplicate attempt, invalidates its local caches, and validates the installed version; none races a second global update. The lease records owner identity and a unique generation: a live owner is never evicted solely because the stale bound elapsed, dead-owner recovery is serialized, and cleanup cannot remove a successor generation. The lease is published atomically by renaming a staged directory that already holds the complete owner record, so a claimant killed mid-claim cannot leave an ownerless or partially written lease that suppresses later updates; the lease is retired atomically on release — renamed away before deletion — so a contender polling during release sees a whole lease or none, never an ownerless one it would recover as stale and follow with a duplicate update. A release that cannot rename removes the lease in place instead of leaving a live owner's lease standing. Each lease holder removes a bounded number of that adapter's leftovers of both kinds, claim staging and retired lease directories, under one shared budget. Contenders stop waiting after 60 seconds with an `update_active` warning and never evict a still-live lease. An aborted update probe's process group that cannot be confirmed gone is observed for one further second without being signaled, and if still live is recorded as the lease's only holder: contenders skip immediately with `update_active`, and recovery removes the lease only once every recorded group has exited, whatever its age. A group record that cannot be written is retried and the lease released once the groups exit, so it never holds exclusion for the owner's lifetime. |
135
+ | C-PERF-06 | §4.1 | PTY rendering preserves byte order without a per-chunk timer delay; adjacent chunks may be coalesced into batches of at most 64 KiB with a 4 ms flush window and one completed-frame observation per batch. Real PTYs pause at 1 MiB unrendered UTF-8 data and resume below 512 KiB, without dropping bytes; one delivered chunk may exceed the threshold, and a paused PTY resumes at child exit and is not paused again. Dispose settles pending render promises and suppresses subsequent render notifications. |
132
136
 
133
137
  #### C-CLAUDE: Claude Startup And Settings (§4, §7, §9)
134
138
 
@@ -147,14 +151,16 @@ Each criterion has:
147
151
  | C-CLAUDE-11 | §5.1 | Claude's browser tools onboarding prompt is declined through PTY input regardless of `autotrust`, with `startup_prompt` activity emitted under the `browser_tools` label. |
148
152
  | C-CLAUDE-12 | §5.1 | `startClaude` forwards `model` to Claude's `--model` launch flag. |
149
153
  | C-CLAUDE-13 | §4.3 | `tools` emits Claude's `--tools` allowlist flag as one comma-separated value, with an empty array encoding `--tools ""` (all tools disabled); it is forwarded across resume like the other tool options. |
150
- | C-CLAUDE-14 | §5.1 | Under `autotrust`, Claude's allowlisted skill/plugin/MCP trust prompts are each answered once and emit `startup_prompt` activity under their `skill_trust`/`plugin_trust`/`mcp_trust` labels. Recognition is the only guard: a prompt is recognized solely by its HEADER wording outside the numbered or cursor-selectable option region (so an option-only trust phrase cannot spoof one), and once recognized Elwood sends or navigates to the first affirmative option in the current frame — the agent is never left waiting. When a recognized prompt's affirmative option has not rendered in the current frame yet, Elwood emits a fire-once transient `attention` activity and keeps watching so a later frame carrying the option is still answered; this render-delay state is TRANSIENT and no warning is emitted for it. An off-allowlist first-run prompt is never auto-answered. Per the say-yes policy there is deliberately no per-dialog region binding, so a second stacked dialog's affirmative in the same frame is an accepted consequence, not a defended boundary. |
154
+ | C-CLAUDE-14 | §5.1 | Under `autotrust`, Claude's allowlisted skill/plugin/MCP trust gates receive bounded safe automation, with `startup_prompt` emitted only after confirmed clearance. Header, native rows, and affirmative bind to one active dialog; transcript/option-only phrases and unrelated options never authorize writes. Partial rendering remains retryable, with at most one transient attention per generation. Unsupported or expired gates remain input-blocking and use the recoverable fallback in C-TRUST-01; off-allowlist prompts are never answered. |
151
155
  | C-CLAUDE-15 | §5.4 | Claude `assistant_message`, `tool_call`, and `tool_result` activities are sourced from the committed transcript the CLI writes at `transcript_path`, never from the `Stop` hook's `last_assistant_message`; an un-sent ghost-text / composer draft therefore never becomes an `assistant_message`. |
152
- | C-CLAUDE-16 | §5.1 §5.4 §5.7 | A Claude startup prompt Elwood auto-answers is marked settled and emits its `startup_prompt` activity only after its PTY `sendInput` write fulfills. A rejected write emits NO `startup_prompt` activity, leaves the prompt un-settled so a later frame re-attempts it, and surfaces a bounded, content-free `startup_prompt_write_failed` warning carrying only the prompt label. |
156
+ | C-CLAUDE-16 | §5.1 §5.4 §5.7 | A Claude startup prompt Elwood auto-answers is marked settled and emits its `startup_prompt` activity only after its PTY `sendInput` write fulfills; trust automation with live frames also confirms the native dialog cleared. A write rejected while the session remains live emits NO `startup_prompt` activity, leaves the prompt un-settled so a later frame re-attempts it, and surfaces a bounded, content-free `startup_prompt_write_failed` warning carrying only the prompt label. Browser-tools disposal cancels undelivered diagnostics under C-CLAUDE-22. |
153
157
  | C-CLAUDE-17 | §5.1 | A Claude startup banner showing a lapsed, revoked, or absent login that only directs the user to re-run `/login` (`Login expired`, `Session expired`, `OAuth token revoked`, or `Not logged in`, each paired with a `run /login` recovery hint) is treated as an authentication failure and rejects `startClaude` with `claude_not_authenticated`, exactly like the explicit `not authenticated` banners — the session is torn down rather than reported as usable. Matching is anchored on the `/login` recovery directive so an unrelated mention of "login" does not trip it. |
154
158
  | C-CLAUDE-18 | §5.3 §5.7 | When a lapsed/revoked-login banner (per C-CLAUDE-17) appears on a Claude session that has ALREADY reached readiness — i.e. login expires mid-session — Elwood surfaces a typed, content-free `login_expired` warning (and its `warning` activity) carrying only a bounded `recoveryCommand` of `/login`. Detection is edge-based so a banner persisting across many frames does not re-emit, so a session warns at most once for its login expiring; the session is left ALIVE (no forced terminal transition) so the caller can recover in place via `session.login()`, tear down, or re-authenticate out of band. |
155
159
  | C-CLAUDE-19 | §5.4 §7A.4 | A committed Claude assistant `thinking` content block surfaces its plaintext extended-thinking as a `reasoning` activity carrying that text, sourced from the committed transcript exactly like `assistant_message` (C-CLAUDE-15) — no hook exposes it. Only ASSISTANT thinking is surfaced and empty thinking is dropped; a `redacted_thinking` block (opaque encrypted `data`, no readable text) produces no activity. |
156
160
  | C-CLAUDE-20 | §5.1 §5.2 | `reasoningEffort`, when supplied to `startClaude`/`resumeClaude`, is validated against the `ClaudeReasoningEffort` enum (`low`, `medium`, `high`, `xhigh`, `max`) before spawn — an out-of-enum value rejects with `claude_invalid_reasoning_effort` (message listing the valid values) and no process is spawned — and a valid value is forwarded to Claude's `--effort` launch flag. It is independent of `model`, applies to the launched session only, and is not persisted across resume (a resume must re-supply it). |
157
161
  | C-CLAUDE-21 | §5.1 §5.4 | Claude's one-time bypass-permissions acceptance dialog (header wording `Claude Code running in Bypass Permissions mode`, affirmative `Yes, I accept`, decline `No, exit`) is an allowlisted trust prompt: under `autotrust` it is recognized by its header wording outside the option region, answered once by selecting the affirmative in numbered or cursor layouts, and reported as `startup_prompt` activity with label `bypass_permissions`; with `autotrust` off it is a blocking prompt. The persistent `bypass permissions on` footer of a running session never matches, and a CLI refusal of bypass mode surfaces as the ordinary start failure. |
162
+ | C-CLAUDE-22 | §5.1 §5.4 §9 | Non-trust Claude startup automation (the browser-tools `Esc` decline) is bound to session disposal, exactly as trust automation already is. After the session begins closing (`stop()`, `kill()`, or PTY exit) no decline is attempted, and a decline already in flight settles as a cancellation. The PHYSICAL write is bound too, not just its reported outcome: the non-trust automation barrier parks on render settlement, so it re-checks disposal after that await and abandons `sendInput` rather than delivering a stale key to a closed PTY. For the browser-tools decline, neither `startup_prompt` nor an undelivered `startup_prompt_write_failed` is emitted after close; each warning is checked at delivery even if an earlier warning listener starts shutdown. |
163
+ | C-CLAUDE-23 | §5.7 | Native Claude login-renewal notices emit `login_expiring` warning and activity with `expiresInDays` and `/login`, including startup and resume. Welcome banners and empty-composer footers support wrapped rows; conversation/draft text is excluded. Each countdown value emits once per live session. Early warnings reach immediate post-start subscribers. Status and input remain usable; no automatic login or persistence occurs. |
158
164
 
159
165
  #### C-CODEX: Codex Startup And Config (§4, §7A, §9)
160
166
 
@@ -165,22 +171,23 @@ Each criterion has:
165
171
  | C-CODEX-03 | §5.5 | `model`, `profile`, `sandbox`, `approvalPolicy`, and `configOverrides` options are reflected in Codex launch policy. |
166
172
  | C-CODEX-04 | §9.2 | Startup checks Codex CLI version and fails with `codex_version_unsupported` when below the configured minimum. |
167
173
  | C-CODEX-05 | §10 | Missing `codex` fails with `codex_not_found` and a useful message. |
168
- | C-CODEX-06 | §4.4 | Codex hooks are trusted by `hookTrust="trust-all"`, the bypass flag when supported, or by answering the allowlisted `Hooks need review` TUI prompt once regardless of `autotrust` (hook trust is Elwood's own integration; see C-CODEX-15). |
174
+ | C-CODEX-06 | §4.4 | Codex hooks are trusted by `hookTrust="trust-all"`, the bypass flag when supported, or by answering the allowlisted `Hooks need review` TUI prompt once regardless of `autotrust` (the bypass trusts all configured hooks, including third-party hooks; see C-CODEX-15). |
169
175
  | C-CODEX-07 | §5.6 | `resumeCodex` fails explicitly when Elwood has not persisted a Codex resume id. |
170
176
  | C-CODEX-08 | §5.5 | `autoupdate: true` runs `codex update` before spawning Codex. |
171
177
  | C-CODEX-09 | §5.7 | Codex MCP startup warnings are parsed from terminal output into typed warning events with server names and recovery commands. |
172
178
  | C-CODEX-10 | §9.2 | `autoupdate: true` rechecks the Codex version after running `codex update`. |
173
179
  | C-CODEX-11 | §5.5 | `autotrust: true` answers Codex's directory trust prompt through PTY input and emits `startup_prompt` activity. |
174
- | C-CODEX-12 | §5.5 | If Codex still shows an interactive update prompt inside the TUI, Elwood selects the skip/continue-without-updating option by label. The skip is EDGE-triggered: a persistent update screen starts one bounded response operation (not one per rendered frame), but that operation re-reads the current rendered frame before every retry and writes only when the original first-party prompt generation remains active and the frame exposes its safe numbered choice. It stops without writing when the generation clears or changes and fails boundedly if that prompt loses its safe choice or exhausts retries; the CLI converts an unanswerable blocked update into `blocked_prompt` even without a whole-run timeout. The skip RE-ARMS once the update screen leaves the frame, so an update prompt that REAPPEARS after Codex restarts (e.g. the update did not take and the same screen returns) is skipped again rather than leaving the session stuck on it. Every recognized update screen is input-blocking until its rendered frame clears: a captured first-party banner blocks before its options render, and a following safe-option-only continuation frame stays latched as the same prompt. Generic agent prose containing "update available" and Codex's passive installation notice do not activate the blocker. Readiness and queued persona/caller input therefore cannot select the default "Update now" action. |
180
+ | C-CODEX-12 | §5.5 | If Codex still shows an interactive update prompt inside the TUI, Elwood selects the skip/continue-without-updating option by label only when a validated first-party banner remains in the current frame before every automated write. Bannerless frames never authorize selection, including previously observed option bindings; retained input blocking remains until positive native composer clearance. Current bounded first-party option snapshots replace old bindings rather than accumulate them. Removal or renumbering of a safe binding invalidates the old retry before frame observation; a valid bannered replacement starts a fresh generation. When the update action is visible, the selected safe option must follow it and must not itself perform the update; without that action, no ordering constraint applies. Choices belong to one current native numbered block; numbered pre-banner prefixes, duplicate or restarted numbering, unknown option labels, and unrelated surrounding rows withhold automation while a recognized banner remains blocking. Such recognized ambiguity permanently revokes its active attempt; bannerless choices cannot restore it, and fresh unambiguous first-party banner evidence with a valid current safe choice starts a new attempt. After revocation, banner-only or action-only repaints cannot reauthorize later bannerless choices or renew grace. An unknown or blank replacement permanently revokes its attempt; bannerless choices cannot reauthorize it, and fresh first-party banner with a current safe choice is required. Authoritative positive native composer clearance preserves the completed attempt’s settlement; live sessions decide after the current retained input hold is classified, never from composer text alone. One unambiguous changed first-party version banner supersedes the prior appearance without needing an intervening clear; old retries reject it before writing, while the new appearance may start its own bounded attempt. Generation-tagged `codex-update-prompt` attention renews CLI grace once for an unambiguous changed banner or a fresh unambiguous banner with a current safe choice after revocation, including the same version pair; redraws and duplicate or stale generations never extend it. The skip is EDGE-triggered: a persistent update screen starts one bounded response operation (not one per rendered frame), but that operation re-reads the current rendered frame before every retry and writes only when the original first-party prompt generation remains active and the frame exposes its safe numbered choice. It stops without writing when the generation clears or changes and fails boundedly if that prompt loses its safe choice or exhausts retries; an exhausted operation stays latched until the update screen clears, and a completion from an earlier generation never re-arms the current one — once superseded by a later appearance, its late success or rejected write settles as a quiet cancellation (no `startup_prompt`, no `startup_prompt_write_failed`), as does a write rejected after its own screen has already cleared; the CLI converts an unanswerable blocked update into `blocked_prompt` even without a whole-run timeout. The skip RE-ARMS after authoritative positive native composer clearance or a fresh first-party banner with a current safe choice, so an update prompt that REAPPEARS after Codex restarts (e.g. the update did not take and the same screen returns) is skipped again rather than leaving the session stuck on it. Every recognized update screen is input-blocking until its rendered frame clears: a captured first-party banner blocks before its options render, and bannerless continuation choices remain withheld even if they match previously observed bindings. Bannerless frames cannot introduce bindings or authorize input. Evidence is bounded to 32 options and 200 characters per label; overflow withholds automation for that appearance, while a later validated first-party banner with a safe option block within both limits may supersede it once; redraws cannot restart that fresh attempt. Changed bindings invalidate captured retries; a valid bannered replacement with a safe choice owns a fresh generation and grace. Generic agent prose containing "update available" and Codex's passive installation notice do not activate the blocker. Readiness and queued persona/caller input therefore cannot select the default "Update now" action. After a recognized update is replaced, input remains held through unknown or partial frames until completed live native-composer clearance. A continuously visible pre-update composer cannot clear replacement text above it; after it disappears, a newly appearing native composer may clear with resumed history. The retained hold does not start without a prior recognized update and reports `codex-unidentified-dialog` only when no specific blocking rule matches. Closing cancels retry timers and pending automated keys; disposal prevents new attempts and late success or write-failure telemetry. A fulfilled skip write reports answered only after positive native composer clearance; missing readers and unknown replacements cancel quietly. |
175
181
  | C-CODEX-13 | §10 | An immediately failing or unusable Codex process fails with `codex_start_failed` or a more specific typed error. |
176
- | C-CODEX-14 | §5.3 | `setModel` on Codex restores the user's prior `config.toml` default via compare-and-swap after the CLI persists its picker selection, skipping with the `codex_default_model_persisted` warning instead of clobbering concurrent edits. The restore is written atomically (sibling temp file + rename, mode preserved, a symlinked config written through to its target) so a crash mid-restore can never leave the user's config truncated. When no `config.toml` existed before the switch and the CLI created one, there is no snapshot to restore: the new file is left in place and the same warning code carries a message saying so (not a false "changed in other ways"). |
177
- | C-CODEX-15 | §5.5 | Codex's directory-trust prompt is answered only under `autotrust` (blocking on the human when off); Codex hook trust — Elwood's own integration — is answered regardless of `autotrust` and is NOT classified as blocking. Each is recognized only by its HEADER wording on a non-option line (so an option-only phrase cannot spoof it) and, once recognized, answered from the frame's affirmative option — the agent is never left waiting. When a recognized prompt's affirmative option has not rendered yet, a fire-once transient `attention` activity is emitted and Elwood keeps watching so a later frame answers it; this render-delay state is TRANSIENT and no warning is emitted for it. Each is answered once, from the shared allowlist. |
182
+ | C-CODEX-14 | §5.3 | `setModel` on Codex restores the user's prior `config.toml` default via compare-and-swap after the CLI persists its picker selection, skipping with the `codex_default_model_persisted` warning instead of clobbering concurrent edits. The restore is written atomically (sibling temp file + rename, mode preserved, a symlinked config written through to its target) so a crash mid-restore can never leave the user's config truncated. When no `config.toml` existed before the switch and the CLI created one, there is no snapshot to restore: the new file is left in place and the same warning code carries a message saying so (not a false "changed in other ways"). Raw input taking over the picker revokes restore authority; a changed config stays intact with the same warning explaining the takeover. When the session terminates during the switch, the call rejects at once while the restore and the configuration lock wait for the CLI process to exit (bounded at five seconds) so a dying CLI cannot persist its selection after the restore. |
183
+ | C-CODEX-15 | §5.5 | Codex directory trust is automated only under `autotrust`; hook trust remains enabled for all configured hooks regardless of `autotrust`. Successful bounded automation does not produce a human block. Each native header and affirmative belong to the same current dialog; partial rendering stays retryable. Unsupported or expired gates use C-TRUST-01's recoverable blocked fallback; no generic affirmative or stale input may answer another gate. |
178
184
  | C-CODEX-16 | §5.1 | Codex `assistant_message`, `tool_call`, and `tool_result` activities are sourced only from the committed transcript, never re-projected from the `Stop`/`PreToolUse`/`PostToolUse` hook payloads; those hooks emit plain `hook` activity, so a single reply or tool step is surfaced exactly once (mirrors C-CLAUDE-15). |
179
- | C-CODEX-17 | §5.4 §5.5 §5.7 | A Codex startup prompt Elwood auto-answers (directory/hook trust, `update` skip) is marked settled and emits its `startup_prompt` activity only after its PTY `sendInput` write fulfills. A rejected write emits NO `startup_prompt` activity, leaves the prompt un-settled so a later frame re-attempts it, and surfaces a bounded, content-free `startup_prompt_write_failed` warning carrying only the prompt label (mirrors C-CLAUDE-16). |
185
+ | C-CODEX-17 | §5.4 §5.5 §5.7 | A Codex startup prompt Elwood auto-answers (directory/hook trust, `update` skip) is marked settled and emits its `startup_prompt` activity only after its PTY `sendInput` write fulfills; trust automation with live frames also confirms the native dialog cleared. A rejected write emits NO `startup_prompt` activity, leaves the prompt un-settled so a later frame re-attempts it, and surfaces a bounded, content-free `startup_prompt_write_failed` warning carrying only the prompt label (mirrors C-CLAUDE-16). For the Codex `update` skip this applies only while that update screen is still the current generation (C-CODEX-12). |
180
186
  | C-CODEX-18 | §5.4 §7A.4 | A committed Codex `reasoning` transcript item surfaces its human-readable text on the `reasoning` activity's `text` field: the `text` of every `summary[]` entry of type `summary_text`, or — when the reasoning is un-summarized — every `content[]` entry of type `reasoning_text`, joined by newlines. The always-present `encrypted_content` blob is never readable and is never surfaced. When neither carries prose (the common case with reasoning summaries disabled), the activity carries no `text`, exactly as a bare reasoning marker. |
181
187
  | C-CODEX-19 | §5.4 §7A.4 | A committed Codex shell/exec transcript item surfaces the ACTUAL command it ran as `tool_call` activity with its `toolInput`, and its output as `tool_result` activity with its `toolOutput`, across every representation the CLI emits — and the command is UNWRAPPED from the CLI's invocation machinery so consumers see the bare command, not the harness. The modern `exec` tool is a `custom_tool_call` whose `input` is a JavaScript snippet wrapping the call (e.g. `const r = await tools.exec_command({"cmd":"echo hi","workdir":…,"yield_time_ms":…}); text(r.output);`): Elwood extracts the inner `cmd`/`command` string (a `command` array is joined with spaces) and surfaces THAT as `toolInput`, discarding the JS wrapper and the non-command fields (`workdir`, `yield_time_ms`, `max_output_tokens`). A `function_call` (`shell`/`exec_command`) whose command is a JSON string in `arguments` is likewise unwrapped to its `command`/`cmd`. When the wrapper cannot be parsed, the raw `input`/`arguments` is surfaced unchanged rather than dropped. A `custom_tool_call_output` is classified as `tool_result` (not `other`), and a result's `output` — a plain string OR an array of `{ type: "input_text", text }` entries — is surfaced as `toolOutput` with the array entries' text joined; the `tool_result` `label` carries the `call_id` correlating it to its `tool_call`. So the real command and its output are surfaced as a clean paired call/result, never the JS harness and never a content-free `other` row. |
182
188
  | C-CODEX-21 | §5.5 §5.6 | `reasoningEffort`, when supplied to `startCodex`/`resumeCodex`, is validated against the `CodexReasoningEffort` enum (`none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`) before spawn — an out-of-enum value rejects with `codex_invalid_reasoning_effort` (message listing the valid values) and no process is spawned — and a valid value is forwarded as the reserved `-c model_reasoning_effort=<value>` override, applied AFTER caller `configOverrides` so it wins over a hand-rolled duplicate. It is independent of `model`, applies to the launched session only, and is not persisted across resume (a resume must re-supply it). |
183
- | C-CODEX-20 | §5.4 | The Codex transcript reader is BOUNDED like Claude's: it reads in fixed-size chunks, discards any un-terminated record past a max-pending ceiling as an `"oversized"` drop, streams a large backlog across poll ticks under a per-scan chunk budget, and at PTY-exit drains only within a bounded chunk budget and wall-clock slice — accounting leftover bytes as an `"unread_backlog"` drop — so a hundreds-of-MiB transcript never OOMs or blocks the event loop. An unblocked `Stop` reads the committed turn with the per-pass scan budget, never the PTY-exit drain budget, so an arbitrarily long session (hundreds of turns) never exhausts that budget into false `unread_backlog` drops. Lost data is surfaced as the content-free, count-free `transcript_records_dropped` warning (a live event, cause-tagged, not persisted or counted) and a scan that throws is contained as `transcript_poll_stopped` (both `agent: "codex" | "claude"`). `finish()` is idempotent and terminal — a late `observe()` never restarts polling past `terminal:exit`. |
189
+ | C-CODEX-20 | §5.4 | The Codex transcript reader is BOUNDED like Claude's: it reads in fixed-size chunks, discards any un-terminated record past a max-pending ceiling as an `"oversized"` drop, streams a large backlog across poll ticks under a per-scan chunk budget, and at PTY-exit drains only within a bounded chunk budget and wall-clock slice — accounting leftover bytes as an `"unread_backlog"` drop — so a hundreds-of-MiB transcript never OOMs or blocks the event loop. An unblocked `Stop` reads the committed turn with the per-pass scan budget, never the PTY-exit drain budget, so an arbitrarily long session (hundreds of turns) never exhausts that budget into false `unread_backlog` drops. Lost data is surfaced as the content-free, count-free `transcript_records_dropped` warning (a live event, cause-tagged, not persisted or counted) and a scan that throws is contained as `transcript_poll_stopped` (both `agent: "codex" | "claude"`). `finish()` is idempotent and terminal — a late `observe()` never restarts polling past `terminal:exit`. Codex transcript listener exceptions are isolated per delivery channel: raw and projected activity delivery are both attempted, later records and polls continue, and only the first failure per channel per watcher emits a content-free `transcript_listener_error` with `channel: "codex:transcript" | "activity"` (at most two). Diagnostics run in a microtask after synchronous transcript delivery, and final-flush diagnostics may follow `terminal:exit`. A warning listener failure cannot stop delivery. |
190
+ | C-CODEX-22 | §5.4 §7A.4 | Committed Codex commentary response messages expose normalized `assistant_progress` with readable text, including ordered `output_text` arrays. Explicit non-final legacy agent-message mirrors remain `other` without text, preventing duplicate progress or false final replies. Final-answer behavior is preserved; analysis/unknown phases and encrypted reasoning do not become progress. Multiple progress updates precede the final reply without ending working state or entering ergonomic response text. |
184
191
 
185
192
  #### C-HOOK: Hook Bridge Coverage And Semantics (§6)
186
193
 
@@ -189,20 +196,26 @@ Each criterion has:
189
196
  | C-HOOK-01 | §6.1 | Generated Claude settings include bridge handlers for every supported Claude hook event. |
190
197
  | C-HOOK-02 | §6.2 | Hook bridge invocations route to the correct Elwood session using session-scoped identity. |
191
198
  | C-HOOK-03 | §6.3 | A hook event with no registered parent handler returns no decision to Claude. |
192
- | C-HOOK-04 | §6.3 | A timed-out hook handler returns no decision to Claude and emits `hookError`. |
199
+ | C-HOOK-04 | §6.3 §7A.4 | A timed-out hook handler returns no decision and emits `hookError`. Finalizing Stop expires same-runtime-instance queue-backed input admission from context-preserving async continuations of its registered handler and hook-scoped observers of `hook`, `activity`, `hookError`/`hook_error`, and `hook_observer_failed`; late raw-session or lazy-facade queue-backed calls reject asynchronously with `wait_timeout` before image capture and terminal-state rejection. Prior admissions, unrelated callers/sessions (even with a reused Elwood ID), independently dispatched callbacks on pre-existing event sources, non-Stop hooks, raw keys, internal queue/loop work, and persistent transcript polling remain unaffected. |
193
200
  | C-HOOK-05 | §6.3 | A throwing/rejecting hook handler returns no decision to Claude and emits `hookError`. |
194
201
  | C-HOOK-06 | §6.3 | An invalid handler result returns no decision to Claude and emits `hookError`. |
195
202
  | C-HOOK-07 | §6.4 | Hook IPC input is runtime-validated before dispatch to parent handlers. |
196
203
  | C-HOOK-08 | §6.4 | `hook_event_name` narrows valid handler response types at compile time. |
197
204
  | C-HOOK-09 | §6.4 | Known Claude built-in tool names narrow `tool_input` types at compile time. |
198
205
  | C-HOOK-10 | §6.4 | Unknown or MCP tool names are represented through a safe extensibility path. |
199
- | C-HOOK-11 | §6.5 | `Stop` marks the session ready only when the Stop event is not blocked. |
206
+ | C-HOOK-11 | §6.5 | `Stop` marks the session ready only when the Stop event is not blocked and no newer queue-backed caller prompt was physically submitted while its callbacks ran. Immediate callback input, including awaited `sendPrompt()`, must progress without waiting for Stop completion. |
200
207
  | C-HOOK-12 | §7A.1 | Generated Codex config includes bridge handlers for every supported Codex hook event. |
201
208
  | C-HOOK-13 | §7A.2 | Codex hook IPC input is runtime-validated before dispatch to parent handlers. |
202
209
  | C-HOOK-14 | §7A.2 | Codex `hook_event_name` narrows valid handler response types at compile time. |
203
- | C-HOOK-15 | §7A.3 | Codex `Stop` marks the session ready only when the Stop event is not blocked. |
210
+ | C-HOOK-15 | §7A.3 | Codex `Stop` marks the session ready only when the Stop event is not blocked and no newer queue-backed caller prompt was physically submitted while its callbacks ran. Immediate callback input, including awaited `sendPrompt()`, must progress without waiting for Stop completion. |
204
211
  | C-HOOK-16 | §6.2 | Hook IPC waits for a complete framed request before dispatching and fails open on malformed complete requests. A single request is capped at exactly 8 MiB (8,388,608 bytes) measured on the ENCODED wire envelope (`{token, elwoodSessionId, input}` JSON plus its framing newline) — the identical byte count in the child bridge script (before it connects) and the parent server (as bytes arrive), so an escape-heavy input whose JSON encoding expands past the cap is rejected by both, never accepted by one and dropped by the other. An over-cap request fails open before auth/parse (child exits with no decision; server responds no-decision and closes) and does not emit a `hookError`. |
205
212
  | C-HOOK-17 | §6.4 | Claude hook IPC input validates event-specific payload fields and known tool input schemas before dispatch. |
213
+ | C-HOOK-18 | §6.4 | Numeric hook fields must be FINITE. `NaN` and `±Infinity` are rejected at ingress and in `updatedInput` rewrites — for concrete tool schemas by their field checks, and for SCHEMA-LESS tools (MCP, generic, future) structurally over the whole value including nested records and arrays — so the bridge answers with no decision rather than serializing the `null` that `JSON.stringify` would emit for them. Structural validation rejects cycles without throwing and permits at most 128 edges from the root and 100,000 value visits counting primitives and each repeated child occurrence. Shared non-cyclic children remain valid within these limits. Structural values reject bigints, functions, symbols, boxed primitives, custom prototypes/callable serializers, proxies, and enumerable accessors without invoking them; child descriptors are not read beyond the visit budget. Invalid rewrites emit `invalid_response` and return no decision. |
214
+ | C-HOOK-19 | §7A.2 | Codex tool-keyed hook routing resolves both the exact tool name and the `unknown` fallback from OWN properties only, so an inherited member is never dispatched as a handler. |
215
+ | C-HOOK-20 | §6.1 | StopFailure ingress validates the common envelope while admitting absent or drifted diagnostic fields as optional unknown values; other hooks remain strict. Diagnostics use bounded nonblank details, the named error, or a generic rejection, never assistant text. |
216
+ | C-HOOK-21 | §6.4 | Claude result validation and serialization use one detached snapshot of own enumerable data, rejecting accessors, custom serializers, proxies, boxed primitives, non-JSON values, cycles, and shapes exceeding 128 edges or 100,000 visits from the response root. Invalid responses fail open with `invalid_response`; later handler or activity-listener mutation cannot alter validated wire output or blocking decisions. |
217
+ | C-HOOK-22 | §6.4 §5.7 §7A.2 | Claude hook inputs are deeply frozen before observation. Throwing Claude or Codex hook observers cannot truncate later hook-scoped notifications, replace validated wire or blocking decisions or skip readiness/Stop bookkeeping; Codex's initial-ready transition retains its separate synchronous C-API-42 fallback while returned listener Promise rejections use the bounded lifecycle warning sink. Each hook invocation or bridge-error delivery emits at most one bounded, content-free `hook_observer_failed` warning for the first failed phase; warning delivery failures do not recurse. Native observer Promises with normal reaction-attachment metadata have pending diagnostic retention capped at the newest 1,024 registrations per emitter; evicted rejections remain contained. Attachment throws are reported and do not cache an unattached Promise. |
218
+ | C-HOOK-23 | §7A.2 | Codex hook inputs, including nested tool input, are frozen before parent observation or handler routing. Handler-owned responses are detached before validation; invalid data fails open. Native wire output and Stop blocking decisions are fixed before result activity observers, so later mutation cannot rewrite the decision or readiness. |
206
219
 
207
220
  #### C-HRESP: Hook Response Mapping (§6, §7)
208
221
 
@@ -251,6 +264,7 @@ Each criterion has:
251
264
  | C-LIFE-05 | §5.3 | A live `ClaudeSessionApi` (the started session) owns exactly one main Claude process; the lazy `ClaudeSession` wrapper (§5.8) owns none before start and that one after. |
252
265
  | C-LIFE-10 | §5.3 | `stop()`, `kill()`, and `teardown()` reap the full PTY process tree by SIGKILLing the leader's process group, so a descendant reparented to PID 1 after the leader exits (e.g. the CLI-spawned `hook-bridge.mjs`) is still killed and no process tree leaks across launch/quit cycles. |
253
266
  | C-LIFE-11 | §5.3 | A `teardown()` that rejects in-flight control-queue operations still completes: the rejected `sendMessage`/`compact`/model operation does not skip the process-group reap or remaining teardown steps. |
267
+ | C-LIFE-12 | §9.4 | Runtime cleanup on stop, kill, teardown, and unsolicited exit drains received terminal output before disposing the renderer, so the final `terminal:data` tail is delivered (possibly after `terminal:exit`) instead of dropped. The drain ends only when a settle pass completes with no new PTY output received, shares one one-second budget after which a stalled renderer or never-quiet PTY is disposed anyway, never delays process-exit notification, terminal status, or the process-group reap, always disposes even when draining fails, and readiness cancelled at exit cannot be re-armed or submitted by a drained frame. |
254
268
 
255
269
  #### C-ERR: Error Model (§10)
256
270
 
@@ -301,15 +315,16 @@ Each criterion has:
301
315
  | C-CLI-15 | §12A.4 §12A.5 | Config and state reads and writes enforce private ownership, regular-file, symlink-safety, and atomicity constraints. |
302
316
  | C-CLI-16 | §12A.5 | CLI state defaults to the absolute XDG state base or `~/.local/state/elwood`, never the workspace, and one session identity has at most one live owner. |
303
317
  | C-CLI-17 | §12A.5 | Success, agent/cleanup failure, usage/config failure, timeout, and interruption map to statuses 0, 1, 2, 124, and 130 without cleanup masking a primary status. |
304
- | C-CLI-18 | §12A.6 | `--head` fails before launch without terminal stdin/stderr and rejects stream/verbose/debug/JSONL; otherwise it mirrors ordered raw PTY bytes (including full-screen VT/ANSI control sequences) only to terminal stderr, uses and follows its size, keeps final text/JSON stdout clean, treats raw Ctrl-C like SIGINT, and restores terminal input/display modes before final output on every handled outcome. Outstanding mirror work is capped at 4 MiB or 1,024 frames; overflow fails the run after draining accepted bytes and restoring the terminal instead of growing memory without bound. A terminal-gone error from an input handle already closed by its host is contained because only that host can then restore the terminal, and it does not replace a completed result. |
318
+ | C-CLI-18 | §12A.6 | `--head` fails before launch without terminal stdin/stderr and rejects stream/verbose/debug/JSONL; otherwise it mirrors ordered raw PTY bytes (including full-screen VT/ANSI control sequences) only to terminal stderr, uses and follows its size, keeps final text/JSON stdout clean, treats raw Ctrl-C like SIGINT, stays attached through session cleanup so output received before the run ended (including the §9.4 drained tail) is mirrored, and then restores terminal input/display modes before final output on every handled outcome. Outstanding mirror work is capped at 4 MiB or 1,024 frames; overflow fails the run after draining accepted bytes and restoring the terminal instead of growing memory without bound. A terminal-gone error from an input handle already closed by its host is contained because only that host can then restore the terminal, and it does not replace a completed result. |
305
319
  | C-CLI-19 | §12A.4 | `config effective` prints validated effective launch/output values (including `head` and the full Claude tool posture) with config location/load state and per-setting provenance (including `auto-detected` for a probed agent), supports exact stored resume inspection using the same posture merge as launch, reads no prompt input, and starts no agent. |
306
320
  | C-CLI-20 | §12A.5 | Text validation errors use user-facing language, identify relevant paths and inherited-setting sources, suggest an unambiguous nearby long option, and retain the stable structured error code. |
307
321
  | C-CLI-21 | §12A.1 §12A.4 | When no flag, environment variable, or config key selects an agent, a new session (and `config effective`) probes the user's login shell for `claude` and `codex` concurrently and uses the first in that order whose command resolves, reporting source `auto-detected`; the probe never runs an agent, resume never probes, and when neither resolves the invocation fails before launch with code `no_agent_found` and status 2, naming both agents, an install hint, and the `--agent`/`ELWOOD_AGENT`/config selection paths. A probe that cannot run (missing or broken login shell, probe timeout) fails with the same code and status but names the shell and underlying error rather than claiming no agent is installed; adapter-option conflicts with an auto-detected agent say so and offer `--agent` for the other adapter. |
308
322
  | C-CLI-22 | §12A.2 §12A.4 | `--high-trust` / `--no-high-trust`, `ELWOOD_HIGH_TRUST` (strict boolean), and the `highTrust` config key layer with normal precedence and expand, for the effective adapter, to Claude `bypassPermissions` or Codex `danger-full-access` + `never`; an effective flag/environment `true` combined with an explicit per-agent posture flag or variable is a usage error naming both sources on new and resumed runs; saved per-agent posture keys are overridden by high trust while a saved `highTrust` yields field by field to explicit per-agent flags/variables; and `config effective` reports `highTrust` plus posture values whose source is the deciding high-trust source. |
309
323
  | C-CLI-23 | §12A.7 | `elwood resume <id> [options] [prompt...]` is a parse-time rewrite of `elwood run --resume <id>` sharing one resolution/execution path: stored adapter and workspace loading, `--cwd`/explicit-adapter/`--keep`/persona/`--ephemeral` rules, and positional-plus-piped prompt composition are identical; a missing id or an additional `--resume` is a usage error. |
310
- | C-CLI-24 | §12A.8 | `elwood sessions` lists private, owner-matched session records under the effective state directory without launching an agent, reporting id, adapter, workspace, ISO-8601 `createdAt`/`lastUsedAt`, `resumable`, and socket-presence `live`, ordered by most recent use; unreadable records are skipped with a stderr warning, an empty or absent state directory is a status-0 empty listing (stderr notice in text, empty array in JSON), text is an aligned header table, JSON is one version-1 `sessions` document, and JSONL, prompt words, or other run options are usage errors. |
311
- | C-CLI-25 | §12A.9 | `elwood interactive [id]` spawns the selected agent's own CLI in the foreground with inherited stdio, no PTY/bridge/automation/state, `SIGINT` passed through, and the agent's exit status; it fails with status 2 before spawning without terminal stdin and stdout or with `--output json|jsonl`, `--stream`, `--verbose`, `--debug`, `--head`, `--timeout`, `--persona`, `--image`, `--keep`, `--ephemeral`, `--resume`, or extra positionals; explicitly selected agent, model, effort, workspace, and posture map through the adapters' shared launch-argument builders while built-in posture defaults are omitted; and `[id]` loads the stored record with `--resume` semantics, merges stored posture field by field, and passes the agent's own conversation id or fails as `resume_unavailable`. |
312
- | C-CLI-26 | §12A.10 | `elwood models` without explicit `--agent` probes Claude then Codex sequentially despite environment/config agent defaults, associates each catalog with its adapter, applies each adapter’s settings and one shared timeout budget, retains partial successes alongside per-agent errors in one aggregate JSON document or an AGENT-column table, exits nonzero on incomplete results, and stops before launching another adapter after SIGINT. Explicit `--agent` preserves the single-agent contract: it starts a fresh headless session with normal setting precedence, lists models through the public picker operation without changing the model, always tears the session and its state down, prints an aligned table (`*` current, `(default)`) or one version-1 `models` document of `AgentModelOption` rows, maps timeout/interruption/blocked-prompt/agent-exit/picker failures to the existing error conventions and statuses, and rejects stream, head, persona, image, keep, resume, ephemeral, positional, and JSONL inputs as usage errors. |
324
+ | C-CLI-24 | §12A.8 | `elwood sessions` lists private, owner-matched session records under the effective state directory without launching an agent, reporting id, adapter, workspace, ISO-8601 `createdAt`/`lastUsedAt`, `resumable`, and socket-presence `live`, ordered by most recent use; unreadable records are skipped with a stderr warning, an empty or absent state directory is a status-0 empty listing (stderr notice in text, empty array in JSON), text is an aligned header table, JSON is one version-1 `sessions` document, and JSONL, prompt words, or other run options (including `--show-session-id`) are usage errors. |
325
+ | C-CLI-25 | §12A.9 | `elwood interactive [id]` spawns the selected agent's own CLI in the foreground with inherited stdio, no PTY/bridge/automation/state, `SIGINT` passed through, and the agent's exit status; it fails with status 2 before spawning without terminal stdin and stdout or with `--output json|jsonl`, `--stream`, `--verbose`, `--debug`, `--head`, `--timeout`, `--persona`, `--image`, `--keep`, `--show-session-id`, `--ephemeral`, `--resume`, or extra positionals; explicitly selected agent, model, effort, workspace, and posture map through the adapters' shared launch-argument builders while built-in posture defaults are omitted; and `[id]` loads the stored record with `--resume` semantics, merges stored posture field by field, and passes the agent's own conversation id or fails as `resume_unavailable`. |
326
+ | C-CLI-26 | §12A.10 | `elwood models` without explicit `--agent` probes Claude then Codex sequentially despite environment/config agent defaults, associates each catalog with its adapter, applies each adapter’s settings and one shared timeout budget, retains partial successes alongside per-agent errors in one aggregate JSON document or an AGENT-column table, exits nonzero on incomplete results, and stops before launching another adapter after SIGINT. Explicit `--agent` preserves the single-agent contract: it starts a fresh headless session with normal setting precedence, lists models through the public picker operation without changing the model, always tears the session and its state down, prints an aligned table (`*` current, `(default)`) or one version-1 `models` document of `AgentModelOption` rows, maps timeout/interruption/blocked-prompt/agent-exit/picker failures to the existing error conventions and statuses, and rejects stream, head, persona, image, keep, show-session-id, resume, ephemeral, positional, and JSONL inputs as usage errors. |
327
+ | C-CLI-27 | §12A.1 §12A.3 | Successful text runs print only the agent response by default, while retaining sessions. `--show-session-id` opts into the retained ID footer on stderr after successful cleanup; ephemeral runs emit none. JSON/JSONL retain their existing sessionId field. The flag is accepted by run/resume and rejected by interactive/models/sessions. |
313
328
 
314
329
  #### C-E2E: Real Adapter Flows (§12)
315
330
 
@@ -331,3 +346,42 @@ Each criterion has:
331
346
  | C-E2E-14 | §5.8 | Against a REAL Claude (or Codex) CLI, a lazily-started `ClaudeSession`/`CodexSession` answers two sequential `send` calls: the first returns non-empty assistant text, and the second — referring back to the first — returns text consistent with retained conversation context, proving `send` collects a turn's assistant text and the ergonomic layer preserves multi-turn context (C-API-47, C-API-49). |
332
347
  | C-E2E-15 | §5.8 | Against a REAL CLI, `stream(prompt)` for a task that DETERMINISTICALLY uses a workspace tool (reading a planted file) yields the turn's simplified typed events in arrival order — a `tool_call` FOLLOWED by its `tool_result`, and at least one `text` — and ends when the turn settles, verified against the installed CLI (C-API-48). |
333
348
  | C-E2E-16 | §5.1 §5.5 | Against the REAL CLIs, a session started with `highTrust: true` reaches `ready` on both adapters: Claude's rendered composer shows its bypass-permissions footer with no acceptance dialog left visible (answered when the installed CLI renders one), and Codex's persisted launch posture is `danger-full-access` / `never` (C-API-54, C-CLAUDE-21). |
349
+ | C-E2E-17 | §5.4 §7A.4 | An isolated real Codex turn emits readable `assistant_progress` before its final `assistant_message`, retains running/ready lifecycle, and returns only final text through ergonomic `send()`, without tools or changes to parent configuration. |
350
+ | C-E2E-18 | §5.10 §7 | Two isolated native Claude public-API turns accept grouped single/multiple choices and multiline alternative text, confirm complete native answers and answered closures, return only final replies, exclude submitted answer markers from question telemetry and Elwood-owned state, remove private artifacts and homes, and preserve parent configuration/authentication/environment. |
351
+ | C-E2E-19 | §5.10 §7A.5 | In two isolated native Codex public-API turns, one asynchronous call raises three independently answerable queued questions and one Plan-mode call raises a three-question modal. `answerQuestions()` submits the queued long note, literal `Type your answer`, then color choice while the original turn remains running; the modal accepts None of the above, a named choice with long notes, and literal `Add notes`. Full committed native free-text answers and notes must match newline-normalized, outer-whitespace-trimmed values while preserving interior tabs, trailing spaces, multiline indentation, and more than 700 characters; queued selected labels are trimmed and modal selected labels remain exact, as specified in §5.10. Question events and normalized activities exclude submitted answers; Elwood-owned state stays answer-free, and private artifacts, native homes, and parent configuration are cleaned up or preserved as appropriate. |
352
+
353
+ #### C-REVIEW: Maintainer automation (§16)
354
+
355
+ | ID | Section | Criterion |
356
+ |---|---:|---|
357
+ | C-REVIEW-01 | §16 | Opening a same-repository PR produces one automatic review; pushes, edits, reopenings, and ready transitions do not start another review. |
358
+ | C-REVIEW-02 | §16 | An already-approved head is skipped; minors and nits may be fixed without another review. |
359
+ | C-REVIEW-03 | §16 | Only exact newly-created `/review` PR comments from current human writers qualify; authorization checks both author and requester before secrets, checkout, or review cancellation. |
360
+ | C-REVIEW-04 | §16 | A complete validated twelve-dimension report with zero blockers and majors can approve. Publication preserves existing approvals, includes the run link and `/review`, and does not suppress a report or verdict when the head or base changes. |
361
+ | C-REVIEW-05 | §16 | Both head and base must belong to this repository, with no base-branch trigger filter; current human writers and the official Dependabot author qualify, while forks and outside contributors do not. |
362
+
363
+ ### Launch hardening
364
+
365
+ | ID | Spec | Criterion |
366
+ | --- | --- | --- |
367
+ | C-API-55 | §5.3 | Model-picker operations own the input queue until they settle. Overlapping model calls and messages cannot interleave; the queue wait and the operation share `timeoutMs`, so a timed-out operation still queued never opens a picker; the deadline and termination prevent later writes. A failed operation's own dialog is cancelled within one additional second before the slot is released: one Escape per stage (a cancelled follow-up returns to the picker), never repeated, none after termination. A dialog that survives keeps queued input, commands, and `/login` held while visible. Only a bottom-most dialog region counts; dialog text above a conversation or composer row is never cancelled or held on. A partially painted Claude switch dialog holds input and is never written to, and `setModel` does not settle while one is visible. When a submitted picker command has not rendered its dialog by the failure, or an accepted stage can still paint its follow-up, the slot is held for that same second and a dialog appearing in it is cancelled; a dialog repainting after a clear frame gets its own Escape. Model picker text already visible when the operation begins rejects it with `model_automation_failed` and no writes or hold. Initial command dispatch revalidates foreign-picker absence; public raw input revokes the active operation and its cleanup authority. Foreign-picker holds survive partial repaints and require five consecutive positive native-composer observations to release ordinary input. |
368
+ | C-TRUST-01 | §5.4 | Automatic trust writes require one current native dialog with allowlisted header, native explanatory/path/option rows, and exact affirmative; where the native dialog has explanatory copy, a header without it never authorizes a write. Candidate trust headers hold readiness and queued input even when unsupported; transcript provenance is retained. Human-owned candidates retain their hold through partial or unknown replacements until positive composer/successor clearance. Live Codex clearance requires the visible native input cursor, text, and title from one completed render; newly received output invalidates that proof until rendered, and native approval headers override a stale visible composer cursor. One session-owned coordinator gives generations separate reservations and a five-second deadline from first candidate. Every numbered/cursor write revalidates generation, header, and choice; partial native painting and cursor movement remain supported. A fulfilled confirmation settles answered only on verified native composer/successor clearance. Replacements and stale completions cannot settle or release a newer generation. Expiry produces existing recoverable blocked/attention without waiting for a frame, keeps input held, and does not warn as a PTY failure. New validity/generation re-arms bounded automation; unchanged redraws cannot reset expiry; raw human input can clear the gate. Stop/kill/teardown/startup cleanup/PTY exit cancel attempts and timers quietly. Only a live matching rejected write emits startup_prompt_write_failed. |
369
+
370
+ #### C-SITE: Documentation Site Controls (§13)
371
+
372
+ | ID | Section | Criterion |
373
+ |---|---:|---|
374
+ | C-SITE-01 | §13.1 | Landing gesture/front-back controls deliver only after complete requested/idle/rotation readiness and current eligibility, including absence of pending jump/wind-up. Pending loading suppresses autonomy. Recovery queues retain delivered ownership until activation or replacement; activation owns opening-turn resources before paint. Held movement, reset, reflow and supersession release obsolete delivery without closing active/outgoing poses, losing held movement on reflow, or dropping unrelated pending jump input. |
375
+ | C-SITE-02 | §13.2 | Initial landing handoff waits for all retained idle pages without fetching rotation. Pre-ready input/visibility changes preserve preparation; teardown prevents late readiness/paint. Failure retains the fallback and reports the asset error; explicit boot retry can recover. After successful complete animation preparation, up to two idle pages remain renderable and reusable through playback switches and cache eviction until bank disposal. Failed or cancelled preparation establishes no shared lease; larger idle manifests use ordinary ownership. |
376
+ | C-SITE-03 | §13.3 | Automatic moments/facing wait for complete requested/idle/rotation pages and start their delivery clock on success, within the eight-second pre-delivery wait. Publication revalidates exact prepared ownership without superseding a newer candidate/delivery. Obsolete task probes/preparation and matching queued delivery cancel without releasing newer manual or active pose owners. Requested and shared dependency failures report once and suppress automatic retries across actions until explicit preparation clears their failure state; geometry probes stay metadata-only. |
377
+ | C-SITE-04 | §13.4 | Pickup control is immediate, but suspended playback waits for all owned sheets; movement preserves preparation, lifecycle cancellation prevents late delivery, and failures retry only on a new drag. |
378
+
379
+ ## Native questions
380
+
381
+ | ID | Contract | Criterion |
382
+ | --- | --- | --- |
383
+ | C-QUESTION-01 | §5.10 | Immutable live snapshots and typed question/activity events share opaque IDs, deduplicate redraws, close from native evidence and never persist. |
384
+ | C-QUESTION-02 | §5.10 | Complete answer validation rejects invalid/stale batches before writes; native controls bypass blocked ordinary writers, verify every physical write, revoke on human input/close, and resolve only on native acceptance. Unconfirmed physical writes retire the API request as unavailable while reserving native ownership, rejecting stale retries without replay until native closure. |
385
+ | C-QUESTION-03 | §5.10 §7 | Claude grouped choices, checkboxes, alternative text and final review use matching native frames; direct hook answers retain precedence, unsupported layouts hold ordinary input without speculative writes. Completion requires matching AskUserQuestion identity, using matching ordered question definitions only when the completion omits a native ID. |
386
+ | C-QUESTION-04 | §5.10 §7A.5 | Codex modal groups and independently accepted queued questions retain native identities across mirrors, require confirmed current editors, retire from native evidence without invented expiry, remain distinct from final replies, and do not reopen historical requests on resume. Every question must omit `isSecret` or use boolean `false`; unsupported or malformed flags prevent publication of the complete request. |
387
+ | C-QUESTION-05 | §7A.5 | Codex question metadata and retired identities obey bounded count/UTF-8 budgets; overflow closes requests as unavailable and disables automation for the session without guessing input; opaque identities hold ordinary automation until explicit native turn end. Unchanged high-volume redraws do not republish candidates or repeatedly scan/copy the registry. |