taphound 0.2.0-dev.1 → 0.2.0-dev.11

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 (447) hide show
  1. package/README.md +49 -149
  2. package/README.zh-CN.md +47 -147
  3. package/assets/skills/taphound-case-suite/SKILL.md +363 -0
  4. package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
  5. package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
  6. package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
  7. package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
  8. package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
  9. package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
  10. package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
  11. package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
  12. package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
  13. package/assets/skills/taphound-flash/SKILL.md +115 -0
  14. package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
  15. package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
  16. package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
  17. package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
  18. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
  19. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
  20. package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
  21. package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
  22. package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
  23. package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
  24. package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
  25. package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
  26. package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
  27. package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
  28. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
  29. package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
  30. package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
  31. package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
  32. package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
  33. package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
  34. package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
  35. package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
  36. package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
  37. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
  38. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
  39. package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
  40. package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
  41. package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
  42. package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
  43. package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
  44. package/assets/skills/taphound-verify-change/SKILL.md +91 -0
  45. package/assets/skills/taphound-verify-change/references/accept.md +38 -0
  46. package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
  47. package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
  48. package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
  49. package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
  50. package/dist/adapters/adb/adb-adapter.d.ts +16 -2
  51. package/dist/adapters/adb/adb-adapter.js +199 -0
  52. package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
  53. package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
  54. package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
  55. package/dist/adapters/adb/ui-automator-parser.js +160 -0
  56. package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
  57. package/dist/adapters/adb/window-topology-parser.js +101 -0
  58. package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
  59. package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
  60. package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
  61. package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
  62. package/dist/adapters/android-cli/layout-parser.js +12 -8
  63. package/dist/adapters/appium/appium-doctor.d.ts +7 -0
  64. package/dist/adapters/appium/appium-doctor.js +128 -0
  65. package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
  67. package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
  68. package/dist/adapters/camera/camera-probe-adapter.js +286 -0
  69. package/dist/adapters/filesystem/artifact-store.js +40 -1
  70. package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
  71. package/dist/adapters/filesystem/context-document-writer.js +112 -0
  72. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  73. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  74. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  75. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  76. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  77. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  78. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  79. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  80. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  81. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  82. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  83. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  84. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  85. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  86. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  87. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  88. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  89. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  90. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  91. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  92. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  93. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  94. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  95. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  96. package/dist/adapters/filesystem/skill-installer.js +40 -11
  97. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  98. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  99. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  100. package/dist/adapters/git/node-git-diff.js +114 -0
  101. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  102. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  103. package/dist/adapters/process/node-process-runner.js +11 -2
  104. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  105. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  106. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  107. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  108. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  109. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  110. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  111. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  112. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  113. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  114. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  115. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  116. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  122. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  123. package/dist/adapters/runtime/session-adb-view.js +193 -0
  124. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  125. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  126. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  127. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  128. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  129. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  130. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  131. package/dist/adapters/ui/device-layout-temp.js +18 -0
  132. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  133. package/dist/adapters/ui/device-ui-environment.js +81 -0
  134. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  135. package/dist/adapters/ui/layout-normalization.js +44 -0
  136. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  137. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  138. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  139. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  140. package/dist/application/align/align-service.d.ts +42 -0
  141. package/dist/application/align/align-service.js +106 -0
  142. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  143. package/dist/application/assertion/expectation-evaluator.js +156 -18
  144. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  145. package/dist/application/assertion/guarded-expectation.js +74 -0
  146. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  147. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  148. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  149. package/dist/application/checkpoint/baseline-error.js +8 -0
  150. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  151. package/dist/application/checkpoint/baseline-service.js +147 -0
  152. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  153. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  154. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  155. package/dist/application/checkpoint/regression-comparator.js +192 -0
  156. package/dist/application/collector/logcat-collector.d.ts +22 -1
  157. package/dist/application/collector/logcat-collector.js +103 -15
  158. package/dist/application/collector/logcat-event.d.ts +8 -0
  159. package/dist/application/collector/logcat-event.js +79 -0
  160. package/dist/application/collector/logcat-stop.d.ts +2 -0
  161. package/dist/application/collector/logcat-stop.js +11 -0
  162. package/dist/application/context/context-generator.d.ts +45 -0
  163. package/dist/application/context/context-generator.js +228 -0
  164. package/dist/application/context/context-loader.d.ts +40 -0
  165. package/dist/application/context/context-loader.js +223 -0
  166. package/dist/application/context/context-refresher.d.ts +59 -0
  167. package/dist/application/context/context-refresher.js +349 -0
  168. package/dist/application/context/context-rehasher.d.ts +36 -0
  169. package/dist/application/context/context-rehasher.js +110 -0
  170. package/dist/application/context/context-validator.d.ts +23 -1
  171. package/dist/application/context/context-validator.js +116 -9
  172. package/dist/application/context/evidence-hash.d.ts +1 -0
  173. package/dist/application/context/evidence-hash.js +125 -0
  174. package/dist/application/context/evidence-match.d.ts +9 -0
  175. package/dist/application/context/evidence-match.js +8 -0
  176. package/dist/application/context/shard-identity.d.ts +2 -0
  177. package/dist/application/context/shard-identity.js +7 -0
  178. package/dist/application/contract/contract-loader.d.ts +25 -0
  179. package/dist/application/contract/contract-loader.js +68 -0
  180. package/dist/application/contract/contract-review.d.ts +25 -0
  181. package/dist/application/contract/contract-review.js +51 -0
  182. package/dist/application/contract/contract-verifier.d.ts +53 -0
  183. package/dist/application/contract/contract-verifier.js +645 -0
  184. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  185. package/dist/application/devices/resolve-device-assignments.js +60 -0
  186. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  187. package/dist/application/diagnosis/failure-classifier.js +179 -0
  188. package/dist/application/doctor/doctor-service.d.ts +36 -3
  189. package/dist/application/doctor/doctor-service.js +255 -25
  190. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  191. package/dist/application/generation/generation-app-preparer.js +28 -0
  192. package/dist/application/generation/generation-config-service.d.ts +21 -0
  193. package/dist/application/generation/generation-config-service.js +53 -0
  194. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  195. package/dist/application/generation/generation-confirmation-service.js +109 -24
  196. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  197. package/dist/application/generation/generation-context-snapshot.js +29 -0
  198. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  199. package/dist/application/generation/generation-finalizer.js +167 -70
  200. package/dist/application/generation/generation-publisher.js +12 -8
  201. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  202. package/dist/application/generation/generation-recovery-service.js +144 -0
  203. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  204. package/dist/application/generation/generation-reopen-service.js +37 -0
  205. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  206. package/dist/application/generation/generation-replace-service.js +116 -0
  207. package/dist/application/generation/generation-starter.d.ts +44 -4
  208. package/dist/application/generation/generation-starter.js +175 -8
  209. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  210. package/dist/application/generation/generation-step-executor.js +471 -108
  211. package/dist/application/generation/proposed-step-validator.js +96 -30
  212. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  213. package/dist/application/generation/replay-policy-loader.js +29 -0
  214. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  215. package/dist/application/generation/risk-evaluator.js +118 -3
  216. package/dist/application/generation/runtime-observer.d.ts +39 -7
  217. package/dist/application/generation/runtime-observer.js +193 -24
  218. package/dist/application/impact/impact-resolver.d.ts +32 -0
  219. package/dist/application/impact/impact-resolver.js +160 -0
  220. package/dist/application/init/init-service.js +26 -13
  221. package/dist/application/interaction/action-executor.d.ts +3 -2
  222. package/dist/application/interaction/action-executor.js +11 -1
  223. package/dist/application/interaction/action-target.d.ts +17 -0
  224. package/dist/application/interaction/action-target.js +40 -0
  225. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  226. package/dist/application/interaction/external-step-runner.js +332 -0
  227. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  228. package/dist/application/interaction/fallback-resolver.js +7 -5
  229. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  230. package/dist/application/interaction/scroll-to-executor.js +118 -36
  231. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  232. package/dist/application/journey/external-flow-resolver.js +22 -0
  233. package/dist/application/journey/journey-check-service.d.ts +54 -0
  234. package/dist/application/journey/journey-check-service.js +207 -0
  235. package/dist/application/journey/journey-promoter.d.ts +26 -0
  236. package/dist/application/journey/journey-promoter.js +123 -0
  237. package/dist/application/journey/journey-resolver.d.ts +42 -0
  238. package/dist/application/journey/journey-resolver.js +239 -0
  239. package/dist/application/journey/journey-retirer.d.ts +25 -0
  240. package/dist/application/journey/journey-retirer.js +87 -0
  241. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  242. package/dist/application/knowledge/anchor-resolver.js +110 -0
  243. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  244. package/dist/application/knowledge/knowledge-loader.js +36 -0
  245. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  246. package/dist/application/locator/layout-failure-summary.js +67 -0
  247. package/dist/application/locator/layout-traversal.d.ts +11 -0
  248. package/dist/application/locator/layout-traversal.js +18 -0
  249. package/dist/application/locator/locator-resolver.d.ts +13 -1
  250. package/dist/application/locator/locator-resolver.js +182 -18
  251. package/dist/application/observe/observe-service.d.ts +20 -0
  252. package/dist/application/observe/observe-service.js +91 -0
  253. package/dist/application/project/project-describer.d.ts +14 -6
  254. package/dist/application/project/project-describer.js +38 -5
  255. package/dist/application/recognition/screen-detector.d.ts +28 -0
  256. package/dist/application/recognition/screen-detector.js +111 -0
  257. package/dist/application/recorder/locator-selector.js +151 -17
  258. package/dist/application/recorder/recorder-service.d.ts +16 -4
  259. package/dist/application/recorder/recorder-service.js +420 -128
  260. package/dist/application/report/report-writer.js +1 -1
  261. package/dist/application/runtime/cold-launch.d.ts +28 -0
  262. package/dist/application/runtime/cold-launch.js +59 -0
  263. package/dist/application/runtime/step-runner.d.ts +49 -4
  264. package/dist/application/runtime/step-runner.js +721 -130
  265. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  266. package/dist/application/runtime/verify-runtime.js +554 -174
  267. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  268. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  269. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  270. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  271. package/dist/application/ui/ui-stability-probe.d.ts +3 -0
  272. package/dist/application/ui/ui-stability-probe.js +8 -0
  273. package/dist/application/wait/idle-advice.d.ts +6 -0
  274. package/dist/application/wait/idle-advice.js +27 -0
  275. package/dist/application/wait/idle-profiles.d.ts +15 -0
  276. package/dist/application/wait/idle-profiles.js +75 -0
  277. package/dist/application/wait/idle-waiter.d.ts +28 -4
  278. package/dist/application/wait/idle-waiter.js +186 -15
  279. package/dist/cli/commands/align.d.ts +3 -0
  280. package/dist/cli/commands/align.js +124 -0
  281. package/dist/cli/commands/baseline.d.ts +3 -0
  282. package/dist/cli/commands/baseline.js +130 -0
  283. package/dist/cli/commands/context.js +300 -27
  284. package/dist/cli/commands/contract.d.ts +3 -0
  285. package/dist/cli/commands/contract.js +120 -0
  286. package/dist/cli/commands/doctor.js +16 -9
  287. package/dist/cli/commands/failure.d.ts +3 -0
  288. package/dist/cli/commands/failure.js +63 -0
  289. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  290. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  291. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  292. package/dist/cli/commands/generation/session-commands.js +472 -0
  293. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  294. package/dist/cli/commands/generation/shared.js +291 -0
  295. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  296. package/dist/cli/commands/generation/step-commands.js +315 -0
  297. package/dist/cli/commands/generation.js +10 -507
  298. package/dist/cli/commands/impact.d.ts +3 -0
  299. package/dist/cli/commands/impact.js +87 -0
  300. package/dist/cli/commands/init.js +13 -6
  301. package/dist/cli/commands/journey.d.ts +3 -0
  302. package/dist/cli/commands/journey.js +382 -0
  303. package/dist/cli/commands/knowledge.d.ts +3 -0
  304. package/dist/cli/commands/knowledge.js +93 -0
  305. package/dist/cli/commands/observe.d.ts +3 -0
  306. package/dist/cli/commands/observe.js +127 -0
  307. package/dist/cli/commands/project.js +2 -1
  308. package/dist/cli/commands/record.js +18 -5
  309. package/dist/cli/commands/verify.js +273 -63
  310. package/dist/cli/dependencies.d.ts +125 -1
  311. package/dist/cli/dependencies.js +450 -51
  312. package/dist/cli/diff-verification.d.ts +41 -0
  313. package/dist/cli/diff-verification.js +192 -0
  314. package/dist/cli/main.js +49 -1
  315. package/dist/cli/output.d.ts +5 -3
  316. package/dist/cli/output.js +12 -0
  317. package/dist/cli/program.js +19 -1
  318. package/dist/cli/project-root.d.ts +1 -0
  319. package/dist/cli/project-root.js +6 -0
  320. package/dist/cli/runtime-selection.d.ts +22 -0
  321. package/dist/cli/runtime-selection.js +92 -0
  322. package/dist/cli/version.d.ts +1 -0
  323. package/dist/cli/version.js +14 -0
  324. package/dist/cli/workspace-guard.d.ts +2 -0
  325. package/dist/cli/workspace-guard.js +3 -0
  326. package/dist/domain/binding-reference.d.ts +4 -0
  327. package/dist/domain/binding-reference.js +23 -0
  328. package/dist/domain/checkpoint.d.ts +404 -0
  329. package/dist/domain/checkpoint.js +297 -0
  330. package/dist/domain/config.d.ts +107 -1
  331. package/dist/domain/config.js +52 -6
  332. package/dist/domain/contract.d.ts +413 -0
  333. package/dist/domain/contract.js +196 -0
  334. package/dist/domain/external-flow.d.ts +493 -0
  335. package/dist/domain/external-flow.js +15 -0
  336. package/dist/domain/failure-classification.d.ts +176 -0
  337. package/dist/domain/failure-classification.js +169 -0
  338. package/dist/domain/failure.d.ts +2 -1
  339. package/dist/domain/failure.js +123 -0
  340. package/dist/domain/generation.d.ts +1671 -132
  341. package/dist/domain/generation.js +202 -13
  342. package/dist/domain/geometry.d.ts +13 -0
  343. package/dist/domain/geometry.js +16 -0
  344. package/dist/domain/impact.d.ts +71 -0
  345. package/dist/domain/impact.js +76 -0
  346. package/dist/domain/init.d.ts +12 -4
  347. package/dist/domain/init.js +24 -18
  348. package/dist/domain/journey-composition.d.ts +2285 -0
  349. package/dist/domain/journey-composition.js +85 -0
  350. package/dist/domain/journey-lifecycle.d.ts +10 -0
  351. package/dist/domain/journey-lifecycle.js +9 -0
  352. package/dist/domain/journey.d.ts +2419 -212
  353. package/dist/domain/journey.js +384 -14
  354. package/dist/domain/knowledge.d.ts +165 -0
  355. package/dist/domain/knowledge.js +188 -0
  356. package/dist/domain/layout.d.ts +34 -5
  357. package/dist/domain/layout.js +64 -6
  358. package/dist/domain/locator-evidence.d.ts +3 -0
  359. package/dist/domain/locator-evidence.js +36 -0
  360. package/dist/domain/logcat-event.d.ts +54 -0
  361. package/dist/domain/logcat-event.js +40 -0
  362. package/dist/domain/observation.d.ts +33 -0
  363. package/dist/domain/observation.js +18 -0
  364. package/dist/domain/project-context.d.ts +219 -1
  365. package/dist/domain/project-context.js +209 -6
  366. package/dist/domain/proposed-step.d.ts +340 -60
  367. package/dist/domain/proposed-step.js +23 -3
  368. package/dist/domain/report.d.ts +1455 -28
  369. package/dist/domain/report.js +211 -14
  370. package/dist/domain/runtime-snapshot.d.ts +58 -1
  371. package/dist/domain/runtime-snapshot.js +14 -3
  372. package/dist/domain/runtime.d.ts +50 -0
  373. package/dist/domain/runtime.js +36 -0
  374. package/dist/domain/system-app-profiles.d.ts +6 -0
  375. package/dist/domain/system-app-profiles.js +43 -0
  376. package/dist/domain/ui-backend.d.ts +28 -0
  377. package/dist/domain/ui-backend.js +33 -0
  378. package/dist/domain/ui-cache.d.ts +11 -0
  379. package/dist/domain/ui-cache.js +10 -0
  380. package/dist/domain/window-hierarchy.d.ts +84 -0
  381. package/dist/domain/window-hierarchy.js +172 -0
  382. package/dist/domain/workflow-manifest.d.ts +77 -0
  383. package/dist/domain/workflow-manifest.js +136 -0
  384. package/dist/domain/workspace.d.ts +28 -0
  385. package/dist/domain/workspace.js +72 -0
  386. package/dist/ports/adb.d.ts +34 -1
  387. package/dist/ports/align-prompt.d.ts +11 -0
  388. package/dist/ports/align-prompt.js +6 -0
  389. package/dist/ports/anchor-resolver.d.ts +30 -0
  390. package/dist/ports/anchor-resolver.js +1 -0
  391. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  392. package/dist/ports/annotated-screen-resolver.js +1 -0
  393. package/dist/ports/camera-probe.d.ts +23 -0
  394. package/dist/ports/camera-probe.js +8 -0
  395. package/dist/ports/context-document-writer.d.ts +24 -0
  396. package/dist/ports/context-document-writer.js +1 -0
  397. package/dist/ports/detached-process-launcher.d.ts +12 -0
  398. package/dist/ports/detached-process-launcher.js +1 -0
  399. package/dist/ports/external-flow-registry.d.ts +37 -0
  400. package/dist/ports/external-flow-registry.js +1 -0
  401. package/dist/ports/generation-prompt.d.ts +2 -1
  402. package/dist/ports/generation-session-store.d.ts +12 -2
  403. package/dist/ports/git-diff.d.ts +9 -0
  404. package/dist/ports/git-diff.js +1 -0
  405. package/dist/ports/journey-composition-store.d.ts +17 -0
  406. package/dist/ports/journey-composition-store.js +1 -0
  407. package/dist/ports/knowledge-registry.d.ts +20 -0
  408. package/dist/ports/knowledge-registry.js +1 -0
  409. package/dist/ports/process-runner.d.ts +7 -0
  410. package/dist/ports/project-file-inspector.d.ts +1 -0
  411. package/dist/ports/project-identity-inspector.d.ts +24 -0
  412. package/dist/ports/project-identity-inspector.js +1 -0
  413. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  414. package/dist/ports/project-inventory-inspector.js +1 -0
  415. package/dist/ports/project-module-discoverer.d.ts +26 -0
  416. package/dist/ports/project-module-discoverer.js +1 -0
  417. package/dist/ports/recorder-prompt.d.ts +10 -1
  418. package/dist/ports/runtime-backend.d.ts +89 -0
  419. package/dist/ports/runtime-backend.js +13 -0
  420. package/dist/ports/runtime-capability.d.ts +12 -0
  421. package/dist/ports/runtime-capability.js +20 -0
  422. package/dist/ports/runtime-session-ports.d.ts +25 -0
  423. package/dist/ports/runtime-session-ports.js +1 -0
  424. package/dist/ports/screenshot.d.ts +11 -0
  425. package/dist/ports/screenshot.js +1 -0
  426. package/dist/ports/skill-installer.d.ts +2 -2
  427. package/dist/ports/ui-snapshot.d.ts +35 -0
  428. package/dist/ports/ui-snapshot.js +1 -0
  429. package/dist/ports/ui-stability.d.ts +19 -0
  430. package/dist/ports/ui-stability.js +1 -0
  431. package/dist/ports/workspace-layout.d.ts +4 -0
  432. package/dist/ports/workspace-layout.js +1 -0
  433. package/dist/shared/errors.d.ts +2 -0
  434. package/dist/shared/errors.js +22 -0
  435. package/dist/shared/paths.d.ts +2 -0
  436. package/dist/shared/paths.js +24 -0
  437. package/dist/shared/strings.d.ts +2 -0
  438. package/dist/shared/strings.js +16 -0
  439. package/package.json +6 -1
  440. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  441. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  442. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  443. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  444. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  445. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  446. package/dist/ports/android-cli.d.ts +0 -21
  447. /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
@@ -1,377 +0,0 @@
1
- ---
2
- name: taphound-ai-journey
3
- description: >-
4
- Drive TapHound's deterministic Android journey generation protocol
5
- end-to-end. Analyze Android project source to produce a Project Context,
6
- then iteratively observe device state, propose and execute UI steps via
7
- the TapHound CLI, and finalize a verified Journey. Use when the user
8
- wants to create or verify Android test journeys using AI-driven
9
- generation, record UI interactions for testing, automate Android UI
10
- test scenarios, or generate TapHound Journey files from a natural-language
11
- test goal.
12
- compatibility: >-
13
- Requires Node.js 22+, Android SDK with ADB and uiautomator, one online
14
- Android device (emulator or USB), and TapHound built and linked via
15
- npm link.
16
- metadata:
17
- author: TapHound
18
- version: "1.0"
19
- ---
20
-
21
- # TapHound AI Journey Skill
22
-
23
- Platform-neutral instructions for any AI agent (Droid, Claude Code, Cursor,
24
- etc.) to drive TapHound's deterministic generation protocol end-to-end.
25
-
26
- ## Skill Directory
27
-
28
- All file references in this document are relative to the Skill directory:
29
-
30
- ```
31
- assets/skills/taphound-ai-journey/
32
- ├── SKILL.md # This file (entry point)
33
- ├── GUIDE.md # Detailed step-by-step usage guide
34
- ├── prompts/
35
- │ ├── analyze-project.md # Phase 1: source analysis guidance
36
- │ ├── generate-step.md # Phase 2: next-step generation guidance
37
- │ └── check-completion.md # Phase 2: Goal completion check
38
- ├── schemas/
39
- │ ├── project-context.json # ProjectContext JSON Schema
40
- │ ├── proposed-step-envelope.json # {version, proposal, snapshot} envelope
41
- │ └── observe-output.json # generation observe --json output shape
42
- └── templates/
43
- └── project-context.example.json # Full Context example
44
- ```
45
-
46
- When this document says "Read `prompts/analyze-project.md`", the full path is
47
- `assets/skills/taphound-ai-journey/prompts/analyze-project.md` (relative
48
- to the repository root that contains the `assets/` directory).
49
-
50
- ## How to Use This Skill
51
-
52
- This Skill ships with the TapHound npm package at `assets/skills/taphound-ai-journey/`.
53
- Run `taphound init` to copy it into each agent's expected skill directory:
54
-
55
- ```bash
56
- taphound init --agent droid,claude,codex,cursor
57
- ```
58
-
59
- For global (user-level) installation:
60
-
61
- ```bash
62
- taphound init --agent droid --global
63
- ```
64
-
65
- In the TapHound source repository, `.factory/skills/taphound-ai-journey` is a
66
- symlink to `assets/skills/taphound-ai-journey` so Droid auto-discovers it.
67
-
68
- - **Droid**: Auto-discovered from `.factory/skills/` (or run `taphound init --agent droid`).
69
- Invoke with the Skill tool when the user wants to generate or verify an Android journey.
70
- - **Claude Code**: Run `taphound init --agent claude` to install to `.claude/skills/`,
71
- then invoke with the Skill tool.
72
- - **Codex**: Run `taphound init --agent codex` to install to `.agents/skills/`.
73
- - **Cursor**: Run `taphound init --agent cursor` to install to `.cursor/skills/`.
74
- - **Other agents**: Run `taphound init --agent other` to install to `.agents/skills/`.
75
-
76
- The agent does NOT need to understand TapHound's internal TypeScript code.
77
- It only needs to read these instructions, the schema files, and the prompt
78
- templates, then call the TapHound CLI.
79
-
80
- ## Prerequisites
81
-
82
- - Node.js 22+ (avoid Node 23)
83
- - Android SDK with ADB and `uiautomator` (Android CLI)
84
- - One online Android device (emulator or USB)
85
- - TapHound built and linked: `npm run build && npm link` (registers the
86
- `taphound` command)
87
-
88
- ## Inputs
89
-
90
- | Parameter | Required | Default | Description |
91
- |------------|----------|--------------------------------|--------------------------------------|
92
- | project | yes | — | Android project root path |
93
- | goal | yes | — | Natural-language test scenario |
94
- | config | no | `taphound.config.json` | TapHound config path (relative to project) |
95
- | device | no | doctor selects | Device serial |
96
- | output | no | `journeys/generated.json` | Output journey path (relative to project) |
97
- | maxSteps | no | 30 | Maximum generation steps |
98
- | retryCount | no | 3 | Retries per rejected step |
99
-
100
- ## Phase 0: Preflight
101
-
102
- 1. Verify `taphound` command is available. If not, run `npm run build &&
103
- npm link` in the TapHound repo.
104
- 2. Run `adb devices -l`. Confirm at least one device is online.
105
- 3. Run (append `--device <serial>` when the `device` input was supplied):
106
- ```bash
107
- taphound doctor --project <project> --json
108
- ```
109
- Confirm `"status": "passed"`. Capture `deviceSerial` from the result.
110
- If `device` was supplied, use it; otherwise use the doctor's selection.
111
- If doctor fails, stop and report the failure.
112
-
113
- 4. **Context currency check**: If a Project Context already exists at
114
- `<project>/.taphound/context/project-context.json`, verify it is
115
- still valid before reusing it:
116
- ```bash
117
- taphound context status \
118
- --project <project> \
119
- --context .taphound/context/project-context.json \
120
- --json
121
- ```
122
- - `"valid"`: Hashes match. Do a quick structural check (Step 5) to
123
- detect new files not in the manifest.
124
- - `"stale"`: Tracked files changed. Needs incremental update or full
125
- regeneration (see GUIDE.md Section 5).
126
- - `"invalid"`: Needs full regeneration.
127
- - If the file does not exist, proceed to Phase 1 (full generation).
128
-
129
- 5. **Structural completeness check** (when status is `"valid"`):
130
- `context status` only checks hashes of files already listed — it
131
- cannot detect NEW files. Run a quick count comparison:
132
- ```bash
133
- # Count Activity source files on disk
134
- find <project> \( -name "*.kt" -o -name "*.java" \) \
135
- -not -path "*/build/*" \
136
- -exec grep -l "extends.*Activity\|:.*Activity(" {} + | wc -l
137
- ```
138
- Compare with the number of Activity source files in the Context's
139
- `manifest.files`. If the on-disk count is higher, new Activities were
140
- added — proceed to Phase 1 for full regeneration.
141
-
142
- If both status and structural check pass, skip Phase 1 and go directly
143
- to Phase 2.
144
-
145
- ## Phase 1: Project Context Generation
146
-
147
- > Read `prompts/analyze-project.md` before starting — it contains detailed
148
- > guidance on multi-module discovery, packageName resolution, and complex
149
- > layout structures. Read `schemas/project-context.json` to understand the
150
- > required JSON structure. Use `templates/project-context.example.json`
151
- > as a reference template.
152
-
153
- 1. Analyze the Android project source per `prompts/analyze-project.md`:
154
- - Discover modules via `./gradlew projects` (fallback: parse
155
- `settings.gradle`).
156
- - Determine `applicationId` from the app module's build file.
157
- - Identify the launch Activity from the app module's manifest.
158
- - Scan all modules for Activities, click handlers, Logcat tags, layout
159
- XML (resolving `<include>`, `<merge>`, `<layout>`, `<ViewStub>`).
160
- 2. Compute SHA-256 for each file you include in the manifest:
161
- ```bash
162
- node -e "const c=require('node:crypto');const f=require('node:fs');process.stdout.write(c.createHash('sha256').update(f.readFileSync('<project>/<relative-path>')).digest('hex'))"
163
- ```
164
- NEVER guess a hash. Always compute it.
165
- 3. Generate the Project Context JSON matching `schemas/project-context.json`.
166
- 4. Write it to `<project>/.taphound/context/project-context.json`.
167
- 5. Validate:
168
- ```bash
169
- taphound context validate \
170
- --project <project> \
171
- --context .taphound/context/project-context.json \
172
- --json
173
- ```
174
- 6. If validation fails, read the error message, fix the JSON, and retry.
175
- Common failures:
176
- - Package name mismatch between `taphound.config.json` and Context.
177
- - Stale or incorrect SHA-256 hash.
178
- - Path containing `..` or starting with `/`.
179
- - File listed in manifest but not found on disk.
180
-
181
- ## Phase 2: Journey Generation
182
-
183
- > Read `schemas/proposed-step-envelope.json` to understand the envelope
184
- > structure before building step proposals. Read `prompts/generate-step.md`
185
- > for element-matching and step-generation guidance. Read
186
- > `prompts/check-completion.md` for Goal-completion criteria.
187
-
188
- 1. Start a generation session:
189
- ```bash
190
- taphound generation start \
191
- --project <project> \
192
- --config <config> \
193
- --context .taphound/context/project-context.json \
194
- --device <serial> \
195
- --json
196
- ```
197
- Capture `generationId` from the result. The `config` path is relative to
198
- the project root. The selected device is bound to this session; subsequent
199
- `observe`, `step`, `confirm`, and `manual` commands use the session binding
200
- and do not accept `--device`.
201
-
202
- 2. Initialize a `completedSteps` list (empty at start).
203
-
204
- 3. **Loop** for up to `maxSteps` iterations:
205
-
206
- a. **Observe** the current device state:
207
- ```bash
208
- taphound generation observe \
209
- --project <project> \
210
- --session <generationId> \
211
- --json
212
- ```
213
- Parse the result. Capture:
214
- - `generationId`, `baseRevision`, `snapshotHash` (the binding).
215
- - `snapshot` (the full RuntimeSnapshot object, including `layout`).
216
-
217
- b. **Check completion**: Read `prompts/check-completion.md`. Using the
218
- Goal and `completedSteps`, determine if the Goal is accomplished.
219
- If `{"complete": true}`, break out of the loop and go to Phase 3.
220
-
221
- c. **Generate proposed step**: Read `prompts/generate-step.md`. Using the
222
- Goal, Project Context, `snapshot.layout`, and `snapshot.activity`,
223
- generate the next proposed step JSON (without `binding`).
224
-
225
- d. **Build the envelope**: Combine the proposed step with the binding and
226
- snapshot:
227
- ```json
228
- {
229
- "version": 1,
230
- "proposal": { ...proposedStep, "binding": {
231
- "generationId": "<from observe>",
232
- "baseRevision": <from observe>,
233
- "snapshotHash": "<from observe>"
234
- }},
235
- "snapshot": { ...full snapshot from observe... }
236
- }
237
- ```
238
- Write this to a temporary file (e.g., `/tmp/taphound-step-<timestamp>.json`).
239
-
240
- e. **Execute the step**:
241
- ```bash
242
- taphound generation step \
243
- --project <project> \
244
- --session <generationId> \
245
- --input <envelope-path> \
246
- --json
247
- ```
248
-
249
- f. **Handle the result**:
250
- - **`status: "succeeded"`**: Add the step to `completedSteps`. Clean
251
- up the temp file. Continue to the next iteration.
252
- - **`status: "confirmationRequired"`**: Present the challenge details
253
- (action summary, challenge ID) to the user. Wait for explicit
254
- human approval. If approved, run:
255
- ```bash
256
- taphound generation confirm \
257
- --project <project> \
258
- --session <generationId> \
259
- --challenge <challengeId> \
260
- --json
261
- ```
262
- Do NOT auto-approve. If the user declines, stop and report.
263
- - **`status: "error"` (any failure code)**: Read the failure code and
264
- message. Decrement the retry budget for this step.
265
- - If retries remain: re-observe (go back to step a) and re-generate
266
- the step, this time accounting for the failure feedback (e.g., if
267
- the locator was not found, try a different locator; if the
268
- activity was wrong, adjust the prediction).
269
- - If retries are exhausted: stop and report the failure with the
270
- session ID, last error, and step index.
271
- - **`status: "recoveryRequired"`**: The session is in a crash-
272
- consistent recovery state. Stop and report. The user must decide
273
- whether to recover or abandon. Do not attempt further steps.
274
-
275
- g. Clean up the temp envelope file after each iteration (success or
276
- failure).
277
-
278
- ## Phase 3: Finalize
279
-
280
- 1. Run finalize:
281
- ```bash
282
- taphound generation finalize \
283
- --project <project> \
284
- --session <generationId> \
285
- --context .taphound/context/project-context.json \
286
- --output <output> \
287
- --device <serial> \
288
- --json
289
- ```
290
-
291
- 2. Check the result `status`:
292
- - **`"verified"`**: Success. Report to the user:
293
- - `bundlePath` (authoritative generation bundle)
294
- - `journeyPath` (exported Journey v1)
295
- - `metaPath` (sidecar meta with verification evidence)
296
- - `replayed` (should be `true`)
297
- - **Any other status**: Failure. Report the failure detail and session
298
- ID. Do NOT claim success. The session may still be recoverable.
299
-
300
- 3. Clean up any remaining temp files.
301
-
302
- ## Error Handling Summary
303
-
304
- | Situation | Action |
305
- |------------------------|---------------------------------------------|
306
- | Doctor fails | Stop, report environment issue |
307
- | Context validation fails | Fix JSON, retry validation |
308
- | Step rejected | Re-observe + re-generate (up to retryCount) |
309
- | Confirmation required | Present to user, wait for approval |
310
- | Recovery required | Stop, report session ID |
311
- | Max steps exceeded | Stop, report incomplete Goal |
312
- | Finalize not verified | Report failure detail, do not claim success |
313
-
314
- ## Key Rules
315
-
316
- - The agent NEVER auto-approves a confirmation challenge.
317
- - The agent NEVER bypasses Core safety (package guard, risk policy, locator
318
- uniqueness).
319
- - SHA-256 hashes are ALWAYS computed via shell, never guessed.
320
- - The agent does NOT modify TapHound Core source code.
321
- - The agent does NOT use coordinates, visual guessing, or fallback.
322
- - Locator priority is fixed: `resourceId` > `text` > `contentDescription`.
323
- - A proposed step only includes `activity.before`, never `activity.after`.
324
- The Core determines `after` from live device observation.
325
- - Temp files are cleaned up after each step and at the end of the session.
326
-
327
- ## Gotchas
328
-
329
- - `packageName` comes from `applicationId` in `build.gradle(.kts)`, NOT
330
- from the `package` attribute in `AndroidManifest.xml` (deprecated in
331
- AGP 7+). `namespace` is for R class generation and may differ from
332
- `applicationId`. If `applicationId` is a variable reference (e.g.,
333
- `gradle.ext.buildApplicationId`), trace it through `gradle.properties`
334
- and any `.gradle` config files to find the actual string value. Include
335
- all files in the resolution chain in `manifest.files`.
336
- - The `resourceId` in locators is the bare name without the `id/` prefix
337
- (e.g., `open_search`, not `id/open_search`).
338
- - The same `@+id/submit` can appear in multiple layout XML files — this is
339
- normal, not a conflict. Only one layout is active at runtime; always
340
- match against the `observe` snapshot, not static XML.
341
- - `activity.after` is NOT included in proposed steps. The Core determines
342
- it from live observation. Including it will cause validation failure.
343
- - `inputText` steps do not include a `locator` — the Core uses the
344
- currently focused element.
345
- - `confirmationRequired` steps must be approved by a human in a TTY
346
- terminal. The agent must NOT auto-approve.
347
- - `confirmationRequiredActions` in the interaction policy is
348
- per-action-TYPE, not per-element. Listing `click` means EVERY click in
349
- the app requires human approval during generation. Leave empty unless
350
- ALL instances of that action are genuinely dangerous. The Core risk
351
- evaluator handles per-step risk assessment at runtime.
352
- - If `context status` returns `"stale"`, the Context must be regenerated
353
- before starting a new generation session. A stale Context will cause
354
- `generation start` to fail with `CONTEXT_STALE`.
355
- - `finalize` performs a full replay from scratch (forceStop, relaunch).
356
- TapHound does not build or install the APK; ensure the app is installed
357
- before calling `finalize`. It is not incremental. Do not call it until
358
- all steps are complete.
359
- - **Context completeness is critical**: the Context must include ALL
360
- Activity source files and their layouts across ALL modules. If the AI
361
- only scans a few files, the Context is useless for staleness detection
362
- and the AI will not know about screens it missed. Use shell commands
363
- (`find . -name AndroidManifest.xml -not -path "*/build/*"`) to
364
- systematically discover all modules and Activities.
365
- - `settings.gradle` may use custom functions like `includeModule()` that
366
- dynamically include modules. Parsing `include` statements alone will
367
- miss these. Use `./gradlew projects` or `find . -name "build.gradle"
368
- -not -path "*/build/*"` as a filesystem fallback.
369
- - `context status` only detects content changes to files already listed
370
- in the Context. It does NOT detect new files added to the project (new
371
- Activities, new layouts, new modules). Always run a structural count
372
- comparison before reusing a Context.
373
- - During generation, if `observe` returns unexpected elements or
374
- Activities not known from the Context, the Context may be stale. Note
375
- the discrepancy, adapt to the live state, and recommend a Context
376
- update after the session. Do NOT abort unless the error is
377
- unrecoverable.