taphound 0.2.0-dev.1 → 0.2.0-dev.12

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 (467) 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 +507 -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 +578 -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 +357 -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 +42 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +309 -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/diagnostics-journal.d.ts +17 -0
  73. package/dist/adapters/filesystem/diagnostics-journal.js +130 -0
  74. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  75. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  76. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  77. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  78. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  79. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  80. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  81. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  82. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  83. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  84. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  85. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  86. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  87. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  88. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  89. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  90. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  91. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  92. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  93. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  94. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  95. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  96. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  97. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  98. package/dist/adapters/filesystem/skill-installer.js +40 -11
  99. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  100. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  101. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  102. package/dist/adapters/git/node-git-diff.js +114 -0
  103. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  104. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  105. package/dist/adapters/process/node-process-runner.js +11 -2
  106. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  107. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  108. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  109. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  110. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  111. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  112. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  113. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  114. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  115. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  116. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  122. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  123. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  124. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  125. package/dist/adapters/runtime/session-adb-view.js +193 -0
  126. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  127. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  128. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  129. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  130. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  131. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  132. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  133. package/dist/adapters/ui/device-layout-temp.js +18 -0
  134. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  135. package/dist/adapters/ui/device-ui-environment.js +81 -0
  136. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  137. package/dist/adapters/ui/layout-normalization.js +44 -0
  138. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  139. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  140. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  141. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  142. package/dist/application/align/align-service.d.ts +42 -0
  143. package/dist/application/align/align-service.js +106 -0
  144. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  145. package/dist/application/assertion/expectation-evaluator.js +156 -18
  146. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  147. package/dist/application/assertion/guarded-expectation.js +74 -0
  148. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  149. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  150. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  151. package/dist/application/checkpoint/baseline-error.js +8 -0
  152. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  153. package/dist/application/checkpoint/baseline-service.js +147 -0
  154. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  155. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  156. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  157. package/dist/application/checkpoint/regression-comparator.js +192 -0
  158. package/dist/application/collector/logcat-collector.d.ts +22 -1
  159. package/dist/application/collector/logcat-collector.js +103 -15
  160. package/dist/application/collector/logcat-event.d.ts +8 -0
  161. package/dist/application/collector/logcat-event.js +79 -0
  162. package/dist/application/collector/logcat-stop.d.ts +2 -0
  163. package/dist/application/collector/logcat-stop.js +11 -0
  164. package/dist/application/context/context-generator.d.ts +45 -0
  165. package/dist/application/context/context-generator.js +228 -0
  166. package/dist/application/context/context-loader.d.ts +40 -0
  167. package/dist/application/context/context-loader.js +223 -0
  168. package/dist/application/context/context-refresher.d.ts +59 -0
  169. package/dist/application/context/context-refresher.js +349 -0
  170. package/dist/application/context/context-rehasher.d.ts +36 -0
  171. package/dist/application/context/context-rehasher.js +110 -0
  172. package/dist/application/context/context-validator.d.ts +23 -1
  173. package/dist/application/context/context-validator.js +116 -9
  174. package/dist/application/context/evidence-hash.d.ts +1 -0
  175. package/dist/application/context/evidence-hash.js +125 -0
  176. package/dist/application/context/evidence-match.d.ts +9 -0
  177. package/dist/application/context/evidence-match.js +8 -0
  178. package/dist/application/context/shard-identity.d.ts +2 -0
  179. package/dist/application/context/shard-identity.js +7 -0
  180. package/dist/application/contract/contract-loader.d.ts +25 -0
  181. package/dist/application/contract/contract-loader.js +68 -0
  182. package/dist/application/contract/contract-review.d.ts +25 -0
  183. package/dist/application/contract/contract-review.js +51 -0
  184. package/dist/application/contract/contract-verifier.d.ts +53 -0
  185. package/dist/application/contract/contract-verifier.js +645 -0
  186. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  187. package/dist/application/devices/resolve-device-assignments.js +60 -0
  188. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  189. package/dist/application/diagnosis/failure-classifier.js +179 -0
  190. package/dist/application/diagnostics/diagnostics-exporter.d.ts +29 -0
  191. package/dist/application/diagnostics/diagnostics-exporter.js +283 -0
  192. package/dist/application/diagnostics/ui-capture-telemetry.d.ts +16 -0
  193. package/dist/application/diagnostics/ui-capture-telemetry.js +81 -0
  194. package/dist/application/doctor/doctor-service.d.ts +36 -3
  195. package/dist/application/doctor/doctor-service.js +255 -25
  196. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  197. package/dist/application/generation/generation-app-preparer.js +28 -0
  198. package/dist/application/generation/generation-config-service.d.ts +21 -0
  199. package/dist/application/generation/generation-config-service.js +53 -0
  200. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  201. package/dist/application/generation/generation-confirmation-service.js +109 -24
  202. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  203. package/dist/application/generation/generation-context-snapshot.js +29 -0
  204. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  205. package/dist/application/generation/generation-finalizer.js +167 -70
  206. package/dist/application/generation/generation-publisher.js +12 -8
  207. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  208. package/dist/application/generation/generation-recovery-service.js +144 -0
  209. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  210. package/dist/application/generation/generation-reopen-service.js +37 -0
  211. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  212. package/dist/application/generation/generation-replace-service.js +116 -0
  213. package/dist/application/generation/generation-starter.d.ts +44 -4
  214. package/dist/application/generation/generation-starter.js +175 -8
  215. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  216. package/dist/application/generation/generation-step-executor.js +471 -108
  217. package/dist/application/generation/proposed-step-validator.js +96 -30
  218. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  219. package/dist/application/generation/replay-policy-loader.js +29 -0
  220. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  221. package/dist/application/generation/risk-evaluator.js +118 -3
  222. package/dist/application/generation/runtime-observer.d.ts +39 -7
  223. package/dist/application/generation/runtime-observer.js +193 -24
  224. package/dist/application/impact/impact-resolver.d.ts +32 -0
  225. package/dist/application/impact/impact-resolver.js +160 -0
  226. package/dist/application/init/init-service.js +26 -13
  227. package/dist/application/interaction/action-executor.d.ts +3 -2
  228. package/dist/application/interaction/action-executor.js +11 -1
  229. package/dist/application/interaction/action-target.d.ts +17 -0
  230. package/dist/application/interaction/action-target.js +40 -0
  231. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  232. package/dist/application/interaction/external-step-runner.js +332 -0
  233. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  234. package/dist/application/interaction/fallback-resolver.js +7 -5
  235. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  236. package/dist/application/interaction/scroll-to-executor.js +118 -36
  237. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  238. package/dist/application/journey/external-flow-resolver.js +22 -0
  239. package/dist/application/journey/journey-check-service.d.ts +54 -0
  240. package/dist/application/journey/journey-check-service.js +207 -0
  241. package/dist/application/journey/journey-promoter.d.ts +26 -0
  242. package/dist/application/journey/journey-promoter.js +123 -0
  243. package/dist/application/journey/journey-resolver.d.ts +42 -0
  244. package/dist/application/journey/journey-resolver.js +239 -0
  245. package/dist/application/journey/journey-retirer.d.ts +25 -0
  246. package/dist/application/journey/journey-retirer.js +87 -0
  247. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  248. package/dist/application/knowledge/anchor-resolver.js +110 -0
  249. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  250. package/dist/application/knowledge/knowledge-loader.js +36 -0
  251. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  252. package/dist/application/locator/layout-failure-summary.js +67 -0
  253. package/dist/application/locator/layout-traversal.d.ts +11 -0
  254. package/dist/application/locator/layout-traversal.js +18 -0
  255. package/dist/application/locator/locator-resolver.d.ts +13 -1
  256. package/dist/application/locator/locator-resolver.js +182 -18
  257. package/dist/application/observe/observe-service.d.ts +20 -0
  258. package/dist/application/observe/observe-service.js +91 -0
  259. package/dist/application/project/project-describer.d.ts +14 -6
  260. package/dist/application/project/project-describer.js +38 -5
  261. package/dist/application/recognition/screen-detector.d.ts +28 -0
  262. package/dist/application/recognition/screen-detector.js +111 -0
  263. package/dist/application/recorder/locator-selector.js +151 -17
  264. package/dist/application/recorder/recorder-service.d.ts +16 -4
  265. package/dist/application/recorder/recorder-service.js +420 -128
  266. package/dist/application/report/report-writer.d.ts +5 -0
  267. package/dist/application/report/report-writer.js +17 -1
  268. package/dist/application/runtime/cold-launch.d.ts +28 -0
  269. package/dist/application/runtime/cold-launch.js +59 -0
  270. package/dist/application/runtime/step-runner.d.ts +49 -4
  271. package/dist/application/runtime/step-runner.js +721 -130
  272. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  273. package/dist/application/runtime/verify-runtime.js +577 -175
  274. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  275. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  276. package/dist/application/ui/observed-ui-snapshot-provider.d.ts +15 -0
  277. package/dist/application/ui/observed-ui-snapshot-provider.js +66 -0
  278. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  279. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  280. package/dist/application/ui/ui-stability-probe.d.ts +9 -0
  281. package/dist/application/ui/ui-stability-probe.js +24 -0
  282. package/dist/application/wait/idle-advice.d.ts +6 -0
  283. package/dist/application/wait/idle-advice.js +27 -0
  284. package/dist/application/wait/idle-profiles.d.ts +15 -0
  285. package/dist/application/wait/idle-profiles.js +75 -0
  286. package/dist/application/wait/idle-waiter.d.ts +28 -4
  287. package/dist/application/wait/idle-waiter.js +201 -15
  288. package/dist/cli/commands/align.d.ts +3 -0
  289. package/dist/cli/commands/align.js +124 -0
  290. package/dist/cli/commands/baseline.d.ts +3 -0
  291. package/dist/cli/commands/baseline.js +130 -0
  292. package/dist/cli/commands/context.js +300 -27
  293. package/dist/cli/commands/contract.d.ts +3 -0
  294. package/dist/cli/commands/contract.js +120 -0
  295. package/dist/cli/commands/diagnose.d.ts +3 -0
  296. package/dist/cli/commands/diagnose.js +84 -0
  297. package/dist/cli/commands/doctor.js +16 -9
  298. package/dist/cli/commands/failure.d.ts +3 -0
  299. package/dist/cli/commands/failure.js +63 -0
  300. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  301. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  302. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  303. package/dist/cli/commands/generation/session-commands.js +472 -0
  304. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  305. package/dist/cli/commands/generation/shared.js +291 -0
  306. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  307. package/dist/cli/commands/generation/step-commands.js +315 -0
  308. package/dist/cli/commands/generation.js +10 -507
  309. package/dist/cli/commands/impact.d.ts +3 -0
  310. package/dist/cli/commands/impact.js +87 -0
  311. package/dist/cli/commands/init.js +13 -6
  312. package/dist/cli/commands/journey.d.ts +3 -0
  313. package/dist/cli/commands/journey.js +382 -0
  314. package/dist/cli/commands/knowledge.d.ts +3 -0
  315. package/dist/cli/commands/knowledge.js +93 -0
  316. package/dist/cli/commands/observe.d.ts +3 -0
  317. package/dist/cli/commands/observe.js +127 -0
  318. package/dist/cli/commands/project.js +2 -1
  319. package/dist/cli/commands/record.js +18 -5
  320. package/dist/cli/commands/verify.js +326 -64
  321. package/dist/cli/dependencies.d.ts +136 -1
  322. package/dist/cli/dependencies.js +504 -52
  323. package/dist/cli/diagnostics-recorder.d.ts +31 -0
  324. package/dist/cli/diagnostics-recorder.js +82 -0
  325. package/dist/cli/diff-verification.d.ts +41 -0
  326. package/dist/cli/diff-verification.js +192 -0
  327. package/dist/cli/main.d.ts +1 -1
  328. package/dist/cli/main.js +107 -2
  329. package/dist/cli/output.d.ts +5 -3
  330. package/dist/cli/output.js +12 -0
  331. package/dist/cli/program.js +21 -1
  332. package/dist/cli/project-root.d.ts +1 -0
  333. package/dist/cli/project-root.js +6 -0
  334. package/dist/cli/runtime-selection.d.ts +22 -0
  335. package/dist/cli/runtime-selection.js +92 -0
  336. package/dist/cli/version.d.ts +1 -0
  337. package/dist/cli/version.js +14 -0
  338. package/dist/cli/workspace-guard.d.ts +2 -0
  339. package/dist/cli/workspace-guard.js +3 -0
  340. package/dist/domain/binding-reference.d.ts +4 -0
  341. package/dist/domain/binding-reference.js +23 -0
  342. package/dist/domain/checkpoint.d.ts +404 -0
  343. package/dist/domain/checkpoint.js +297 -0
  344. package/dist/domain/config.d.ts +107 -1
  345. package/dist/domain/config.js +52 -6
  346. package/dist/domain/contract.d.ts +413 -0
  347. package/dist/domain/contract.js +196 -0
  348. package/dist/domain/diagnostics.d.ts +1396 -0
  349. package/dist/domain/diagnostics.js +193 -0
  350. package/dist/domain/external-flow.d.ts +493 -0
  351. package/dist/domain/external-flow.js +15 -0
  352. package/dist/domain/failure-classification.d.ts +176 -0
  353. package/dist/domain/failure-classification.js +169 -0
  354. package/dist/domain/failure.d.ts +2 -1
  355. package/dist/domain/failure.js +123 -0
  356. package/dist/domain/generation.d.ts +1671 -132
  357. package/dist/domain/generation.js +202 -13
  358. package/dist/domain/geometry.d.ts +13 -0
  359. package/dist/domain/geometry.js +16 -0
  360. package/dist/domain/impact.d.ts +71 -0
  361. package/dist/domain/impact.js +76 -0
  362. package/dist/domain/init.d.ts +12 -4
  363. package/dist/domain/init.js +24 -18
  364. package/dist/domain/journey-composition.d.ts +2285 -0
  365. package/dist/domain/journey-composition.js +85 -0
  366. package/dist/domain/journey-lifecycle.d.ts +10 -0
  367. package/dist/domain/journey-lifecycle.js +9 -0
  368. package/dist/domain/journey.d.ts +2419 -212
  369. package/dist/domain/journey.js +384 -14
  370. package/dist/domain/knowledge.d.ts +165 -0
  371. package/dist/domain/knowledge.js +188 -0
  372. package/dist/domain/layout.d.ts +34 -5
  373. package/dist/domain/layout.js +64 -6
  374. package/dist/domain/locator-evidence.d.ts +3 -0
  375. package/dist/domain/locator-evidence.js +36 -0
  376. package/dist/domain/logcat-event.d.ts +54 -0
  377. package/dist/domain/logcat-event.js +40 -0
  378. package/dist/domain/observation.d.ts +33 -0
  379. package/dist/domain/observation.js +18 -0
  380. package/dist/domain/project-context.d.ts +219 -1
  381. package/dist/domain/project-context.js +209 -6
  382. package/dist/domain/proposed-step.d.ts +340 -60
  383. package/dist/domain/proposed-step.js +23 -3
  384. package/dist/domain/report.d.ts +1455 -28
  385. package/dist/domain/report.js +211 -14
  386. package/dist/domain/runtime-snapshot.d.ts +58 -1
  387. package/dist/domain/runtime-snapshot.js +14 -3
  388. package/dist/domain/runtime.d.ts +50 -0
  389. package/dist/domain/runtime.js +36 -0
  390. package/dist/domain/system-app-profiles.d.ts +6 -0
  391. package/dist/domain/system-app-profiles.js +43 -0
  392. package/dist/domain/ui-backend.d.ts +28 -0
  393. package/dist/domain/ui-backend.js +33 -0
  394. package/dist/domain/ui-cache.d.ts +11 -0
  395. package/dist/domain/ui-cache.js +10 -0
  396. package/dist/domain/verify-receipt.d.ts +17 -0
  397. package/dist/domain/verify-receipt.js +17 -0
  398. package/dist/domain/window-hierarchy.d.ts +84 -0
  399. package/dist/domain/window-hierarchy.js +172 -0
  400. package/dist/domain/workflow-manifest.d.ts +77 -0
  401. package/dist/domain/workflow-manifest.js +136 -0
  402. package/dist/domain/workspace.d.ts +30 -0
  403. package/dist/domain/workspace.js +74 -0
  404. package/dist/ports/adb.d.ts +34 -1
  405. package/dist/ports/align-prompt.d.ts +11 -0
  406. package/dist/ports/align-prompt.js +6 -0
  407. package/dist/ports/anchor-resolver.d.ts +30 -0
  408. package/dist/ports/anchor-resolver.js +1 -0
  409. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  410. package/dist/ports/annotated-screen-resolver.js +1 -0
  411. package/dist/ports/camera-probe.d.ts +23 -0
  412. package/dist/ports/camera-probe.js +8 -0
  413. package/dist/ports/context-document-writer.d.ts +24 -0
  414. package/dist/ports/context-document-writer.js +1 -0
  415. package/dist/ports/detached-process-launcher.d.ts +12 -0
  416. package/dist/ports/detached-process-launcher.js +1 -0
  417. package/dist/ports/diagnostics.d.ts +15 -0
  418. package/dist/ports/diagnostics.js +1 -0
  419. package/dist/ports/external-flow-registry.d.ts +37 -0
  420. package/dist/ports/external-flow-registry.js +1 -0
  421. package/dist/ports/generation-prompt.d.ts +2 -1
  422. package/dist/ports/generation-session-store.d.ts +12 -2
  423. package/dist/ports/git-diff.d.ts +9 -0
  424. package/dist/ports/git-diff.js +1 -0
  425. package/dist/ports/journey-composition-store.d.ts +17 -0
  426. package/dist/ports/journey-composition-store.js +1 -0
  427. package/dist/ports/knowledge-registry.d.ts +20 -0
  428. package/dist/ports/knowledge-registry.js +1 -0
  429. package/dist/ports/process-runner.d.ts +7 -0
  430. package/dist/ports/project-file-inspector.d.ts +1 -0
  431. package/dist/ports/project-identity-inspector.d.ts +24 -0
  432. package/dist/ports/project-identity-inspector.js +1 -0
  433. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  434. package/dist/ports/project-inventory-inspector.js +1 -0
  435. package/dist/ports/project-module-discoverer.d.ts +26 -0
  436. package/dist/ports/project-module-discoverer.js +1 -0
  437. package/dist/ports/recorder-prompt.d.ts +10 -1
  438. package/dist/ports/runtime-backend.d.ts +89 -0
  439. package/dist/ports/runtime-backend.js +13 -0
  440. package/dist/ports/runtime-capability.d.ts +12 -0
  441. package/dist/ports/runtime-capability.js +20 -0
  442. package/dist/ports/runtime-session-ports.d.ts +25 -0
  443. package/dist/ports/runtime-session-ports.js +1 -0
  444. package/dist/ports/screenshot.d.ts +11 -0
  445. package/dist/ports/screenshot.js +1 -0
  446. package/dist/ports/skill-installer.d.ts +2 -2
  447. package/dist/ports/ui-snapshot.d.ts +35 -0
  448. package/dist/ports/ui-snapshot.js +1 -0
  449. package/dist/ports/ui-stability.d.ts +19 -0
  450. package/dist/ports/ui-stability.js +1 -0
  451. package/dist/ports/workspace-layout.d.ts +4 -0
  452. package/dist/ports/workspace-layout.js +1 -0
  453. package/dist/shared/errors.d.ts +2 -0
  454. package/dist/shared/errors.js +22 -0
  455. package/dist/shared/paths.d.ts +2 -0
  456. package/dist/shared/paths.js +24 -0
  457. package/dist/shared/strings.d.ts +2 -0
  458. package/dist/shared/strings.js +16 -0
  459. package/package.json +7 -2
  460. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  461. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  462. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  463. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  464. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  465. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  466. package/dist/ports/android-cli.d.ts +0 -21
  467. /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
@@ -0,0 +1,70 @@
1
+ ---
2
+ schemaVersion: 2
3
+ kind: taphound.journeyBrief
4
+ caseId: CASE-002
5
+ ---
6
+
7
+ # Goal
8
+
9
+ Open Search, submit an empty query, and verify validation.
10
+
11
+ ## Preconditions
12
+
13
+ - Start from an independent cold launch.
14
+ - Use the approved `search-basic` fixture.
15
+
16
+ ## Expected Journey
17
+
18
+ 1. Open Search from Home.
19
+ 2. Leave the query empty.
20
+ 3. Submit the query.
21
+ 4. Observe the empty-query validation state.
22
+
23
+ ## State Transition Map
24
+
25
+ ```mermaid
26
+ stateDiagram-v2
27
+ HomeActivity --> SearchActivity: click open_search [source]
28
+ SearchActivity --> SearchActivity+Keyboard: click search_input [source]
29
+ SearchActivity+Keyboard --> SearchActivity+Dialog: click submit_search [needs-observation]
30
+ ```
31
+
32
+ | edge | action | from | to | confidence | locator hint |
33
+ |------|--------|------|----|-----------|--------------|
34
+ | e1 | click | HomeActivity | SearchActivity | source | resourceId: open_search |
35
+ | e2 | click | SearchActivity | SearchActivity+Keyboard | source | resourceId: search_input |
36
+ | e3 | click | SearchActivity+Keyboard | SearchActivity+Dialog | needs-observation | text: submit_search |
37
+
38
+ Overlay sub-states of the same Activity (keyboard/dialog/drawer) use distinct
39
+ node names (`Activity+Suffix`).
40
+
41
+ ## Capability Notes
42
+
43
+ - Runtime variable capture: not supported — use a fixed unique string as the
44
+ business identifier.
45
+ - Multi-field locators: stop at the first field with a unique match; later
46
+ fields are not validated — text assertions must use a text-only locator.
47
+ - logcat expect: tag matches by exact equality (including all prefixes);
48
+ literal matches by substring.
49
+
50
+ ## Assertions
51
+
52
+ - `SearchActivity` remains foreground.
53
+ - The `empty_query_error` element is visible.
54
+
55
+ ## Implementation Hints
56
+
57
+ - Home entry resource ID: `open_search`.
58
+ - Submit resource ID: `submit_search`.
59
+ - Relevant module: `:feature:search`.
60
+
61
+ ## Constraints
62
+
63
+ - Do not use coordinates or visual guessing.
64
+ - Final Replay must pass.
65
+ - Idempotency: repeat runs create duplicate search history entries; history list uses index: 0.
66
+
67
+ ## Evidence References
68
+
69
+ - `feature/search/src/main/java/com/example/search/SearchScreen.kt`
70
+ - `feature/search/src/main/res/layout/search_screen.xml`
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: taphound-verify-change
3
+ description: >-
4
+ Prove an Android code change does what it should with independent
5
+ TapHound Replays: an intentional behavior change passes a hash-bound
6
+ Acceptance Contract (accept mode), and a refactor preserves previously
7
+ captured behavior by Baseline comparison (preserve mode). Records a
8
+ provenance manifest per Case. Use when an Android code change must be
9
+ proven before it is called done: new features with or without UI changes,
10
+ refactors, and UI migrations such as XML to Compose.
11
+ compatibility: Requires TapHound CLI, a verified Journey (or one generated first), and an installed app on an online Android device.
12
+ metadata:
13
+ author: TapHound
14
+ version: "1.0"
15
+ ---
16
+
17
+ # Verify one code change
18
+
19
+ This Workflow Skill turns "the change is done" into evidence. It owns the
20
+ Case, build/install provenance, and the final decision; TapHound Core owns
21
+ Replay, Verdicts, and Baselines. Never read or write
22
+ `.taphound/build/generations`, proposals, or snapshots.
23
+
24
+ ## Choose the mode per Case
25
+
26
+ Classify every change before coding starts; preserve needs evidence from the
27
+ **pre-change** app.
28
+
29
+ | The change | Mode and path | Gate |
30
+ |-------------------------------------------------------|---------------------------------------|---------------------------------------------------|
31
+ | 1. New behavior without UI changes (data, logic, API) | accept, via an existing UI flow | Contract `pass`; prove the behavior with `logcatEvent` assertions on structured app logs |
32
+ | 2. New behavior with UI changes | accept, with a newly generated Journey | Contract `pass` |
33
+ | 3. Refactor with no UI change | preserve, Baseline | `baseline compare` `equivalent: true` |
34
+ | 4. UI toolkit migration (for example XML → Compose) | preserve, large UI refactor | the new Journey proves every frozen observable |
35
+ | 5. Major structural UI change in the same toolkit | preserve: Baseline if the old Journey still replays on the new build, otherwise large UI refactor | as above |
36
+
37
+ Read `references/accept.md` for accept and `references/preserve.md` for
38
+ preserve (its "Large UI refactor" section covers 4 and 5). Generate any
39
+ missing Journey with the `taphound-journey-generator` Skill first.
40
+
41
+ One Case covers one behavior. A change that adds behavior and must keep
42
+ other behavior is several Cases, each in its own mode; no result substitutes
43
+ for another. If pre-change evidence no longer exists for a preserve Case,
44
+ the Case is `PAUSED`, never reconstructed from post-change behavior.
45
+
46
+ For a quick smoke check while still coding, use `taphound-flash`; it is not
47
+ evidence and never replaces this Skill's gate.
48
+
49
+ ## Shared rules
50
+
51
+ - **Case id**: lowercase letters, digits, and hyphens, starting with a
52
+ letter, at most 64 characters.
53
+ - **Independent Replay**: every gate run is a new `taphound verify` process
54
+ with `--policy-from-meta`. Never fall back to a looser policy when meta or
55
+ Context is unavailable; stop at `PAUSED` instead.
56
+ - **Selectors are not gates**: `verify --diff` may choose extra affected
57
+ Journeys; record its `--base`, `--head`, and tiers (`p0,p1` by default)
58
+ or `used: false`, but it never decides the Case.
59
+ - **Outcomes**: `PASS` only on the mode's gate with successful recorded
60
+ commands. Deterministic failed evidence is `FAIL`; keep its CLI result
61
+ unchanged. A refusal, missing precondition, interrupted recovery, or
62
+ required human approval is `PAUSED` with a reason, never a fabricated
63
+ Verdict. No reviewer may rewrite a deterministic `fail` or `invalid`.
64
+ - **Never overwrite** a Journey, Contract, Baseline, manifest, or result
65
+ file without the user's permission.
66
+
67
+ ## Provenance manifest
68
+
69
+ Write one manifest per Case at `.taphound/build/workflows/<caseId>/manifest.json`
70
+ and keep each command's JSON output in that directory. The build subtree is
71
+ ephemeral and Git-ignored; check the directory is under it and not a
72
+ symlink before writing. `schemas/workflow-manifest.schema.json` gives the
73
+ exact shape (`case.path` is `accept` or `preserve`). Core also enforces:
74
+
75
+ - every `commands[].jsonResultPath` and `diffs.*.path` lies inside
76
+ `.taphound/build/workflows/<caseId>/` (normalized, relative, `/`
77
+ separators);
78
+ - `outcome.path` equals `case.path`, and `PAUSED` has a `pauseReason`;
79
+ - `PASS` needs `evidence.reportPath`, at least one command, every
80
+ `exitCode` 0, and `bindings.replayPolicy.strict: true`;
81
+ - accept `PASS` also needs `outcome.verdict: "pass"`,
82
+ `evidence.verdictPath`, and `bindings.contractSha256`;
83
+ - preserve `PASS` also needs `outcome.equivalent: true` and
84
+ `evidence.beforeReportPath`, `baselinePath`, and `compareResultPath`.
85
+
86
+ Record each executed CLI argv, exit code, and JSON result path; the
87
+ Journey, Contract, Knowledge, and replayPolicy bindings; the requirement
88
+ source reference and the SHA-256 of a redacted summary; and the
89
+ implementation and verification-asset diffs as separate files with
90
+ SHA-256. Do not store secrets, raw request data, or raw Logcat payloads.
91
+ Never treat another Case's result as this Case's proof.
@@ -0,0 +1,38 @@
1
+ # Accept mode
2
+
3
+ A new feature, fix, or intentional UI change. The gate is a hash-bound
4
+ Acceptance Contract whose Verdict is `pass` in an independent Replay.
5
+
6
+ 1. Record the Case id (lowercase letters/digits/hyphens, starting with a
7
+ letter), requirement source reference and SHA-256 of a redacted summary.
8
+ Freeze source/implementation and validation-asset diff files separately
9
+ with SHA-256. Do not store secrets or raw Logcat payloads in a manifest.
10
+ Record the chosen `verify --diff` `--base`, `--head` and `--scope`
11
+ (`p0,p1` by default, add `p2` explicitly) or `used:false`.
12
+ `verify --diff` is a selector only, never the Accept completion gate.
13
+ 2. Ensure the user-approved app is built and installed by the external
14
+ workflow. Obtain a verified published Journey through the
15
+ `taphound-journey-generator` Skill and `generation finalize` when needed;
16
+ this Skill never reads or writes the generation bundle, proposals, or
17
+ snapshots. Validate a hash-bound Contract with
18
+ `taphound contract --project <project> --contract <path> --json`.
19
+ 3. Start a **new CLI process** for independent device evidence:
20
+
21
+ ```
22
+ taphound verify --project <project> --contract <contract.json> --policy-from-meta --device <serial> --json
23
+ ```
24
+
25
+ Do not fall back to a looser policy when meta or Context is unavailable.
26
+ For a long-lived Journey, require a published strict replayPolicy and
27
+ matching Journey/Contract/Knowledge bindings. For an intentionally
28
+ hand-authored Journey with no meta, stop at `PAUSED` and ask whether to
29
+ generate a verified Journey; do not claim equivalent finalize policy.
30
+ A passing Contract Verdict **`pass`** with `reportStatus:"passed"` is the
31
+ Accept gate. `fail`, `invalid`, `inconclusive`, `needsReview`, a failed
32
+ Replay, or missing evidence never count as pass.
33
+ 4. After the gate, optionally promote a long-lived Journey using
34
+ `taphound journey promote --project <project> --journey <journey.json> --reason <reason> --json`.
35
+ A separately requested future Preserve Baseline can be made with
36
+ `taphound baseline capture --project <project> --report <report.json> --verdict <verdict.json> --contract-sha256 <digest> --out <baseline.json> --json`.
37
+ The Baseline is not this Case's pass condition. Never overwrite an
38
+ existing asset without user permission.
@@ -0,0 +1,357 @@
1
+ # Preserve mode
2
+
3
+ A refactor or internal change that must not change observable behavior. The
4
+ gate is a Baseline captured from the pre-change app and an `equivalent:true`
5
+ comparison against an independent post-change Replay. Paths such as
6
+ `scripts/handoff.mjs` are relative to this Skill's directory.
7
+
8
+ 1. Before modifying the app, freeze a verified Journey, the requirement
9
+ source/redacted digest, its SHA-256, the replayPolicy meta digest (if
10
+ generated), Knowledge hash and matching runtime/Contract/Screen
11
+ capability. Capture the original implementation and validation asset
12
+ diffs separately. If pre-change evidence is unavailable after work has
13
+ started, mark Workflow `PAUSED`; never create a "before" Baseline from
14
+ post-change behavior.
15
+ 2. On the **pre-change installed app**, run an independent CLI process:
16
+
17
+ ```
18
+ taphound verify --project <project> --journey <journey.json> --policy-from-meta --device <serial> --json
19
+ ```
20
+
21
+ If Screen facts or a Contract hash must be compared, use
22
+ `--contract <contract.json>` instead of `--journey` on **both** runs,
23
+ and supply the same strict `--policy-from-meta`. Only capture from a
24
+ report with `status:"passed"`:
25
+
26
+ ```
27
+ taphound baseline capture --project <project> --report <pre-report.json> --out <baseline.json> --json
28
+ ```
29
+
30
+ For a Contract-bound Baseline add `--verdict <pre-verdict.json>
31
+ --contract-sha256 <digest>`; if the after-run is Journey-only, add
32
+ `--no-screen-facts` on capture. Never change the frozen Journey or
33
+ Baseline to make a regression disappear.
34
+ 3. Build/install the changed app by the external workflow. In another
35
+ process, repeat the **same** `verify --journey` or `verify --contract`
36
+ form with the frozen Journey/Contract and strict policy. A failed
37
+ Replay ends the Case as `FAIL`, not a comparable success. Compare:
38
+
39
+ ```
40
+ taphound baseline compare --project <project> --baseline <baseline.json> --report <post-report.json> --json
41
+ ```
42
+
43
+ Add `--verdict <post-verdict.json>` for a Contract Baseline. Only
44
+ `equivalent:true` and `coverage` of frozen facts yields Preserve `PASS`.
45
+ Drift gives `FAIL`; incomparable identity, Screen capability, policy,
46
+ or missing evidence gives `PAUSED` pending remediation, never `PASS`.
47
+ 4. `verify --diff <ref> --base <ref> --head <ref> --scope <p0,p1,p2>
48
+ --json` may select additional affected Journeys, but it is neither a
49
+ Contract Verdict nor a Baseline result. Record actual selected tiers and
50
+ refs, or `used:false`.
51
+
52
+ ## Two-agent, two-worktree handoff
53
+
54
+ When Agent A owns the historical implementation and Agent B owns the target,
55
+ hand B **one absolute `handoff.md` path**, not A's chat or a fabricated
56
+ Baseline. This Skill ships `scripts/handoff.mjs` (relative to this installed
57
+ Skill). It packages an immutable Case directory alongside that MD with
58
+ `handoff.json`, frozen Journey/meta, Baseline, optional Contract, and **only**
59
+ the original `report.json`/optional `verdict.json`. Do not export Logcat,
60
+ screenshots, or captured raw values. Choose an existing shared directory
61
+ outside both worktrees. Do not overwrite another Case. Preserve each
62
+ worktree's existing drafts, generated assets and validation files.
63
+ Inspect the before-run JSON for user-generated or sensitive content before
64
+ export; if it cannot be shared, keep the Case `PAUSED`, rather than copying
65
+ or silently sanitizing evidence. SHA-256 detects accidental or untrusted
66
+ drift across a handed-off bundle, but is not a digital signature against a
67
+ writer with access to the shared directory.
68
+
69
+ **Agent A (before changing the app):**
70
+
71
+ 1. Check out the true historical commit. Build and install that APK on one
72
+ online device, record its local SHA-256 and the build/install command or
73
+ receipt in the private Workflow manifest. The helper checks the local APK
74
+ bytes against A's asserted installed digest; it **cannot measure the
75
+ installed binary on the device**. A must independently establish install
76
+ provenance, never infer it from `handoff.md`.
77
+ 2. Obtain a valid conventional Journey/meta with a generated, focused-input
78
+ Replay policy. Run the independent `verify --policy-from-meta` from step 2
79
+ above on the **historical installed app**, then capture its Baseline from
80
+ that exact passing report. If using a Contract, retain a passing Verdict
81
+ from `verify --contract` and include its hash when capturing the Baseline.
82
+ Do not reuse post-change evidence. `PAUSED` if these facts are missing.
83
+ 3. Write a private JSON input file (outside the handoff) with this shape:
84
+
85
+ ```json
86
+ {
87
+ "version": 1,
88
+ "caseId": "movie-search-preserve",
89
+ "requirement": {
90
+ "sourceRef": "ticket-or-path",
91
+ "summary": "Movie search still shows the same results"
92
+ },
93
+ "base": {
94
+ "projectRoot": "/absolute/historical-worktree",
95
+ "apkPath": "/absolute/historical-app.apk",
96
+ "installedApkSha256": "<64 lowercase hex characters>",
97
+ "packageName": "com.example.movies",
98
+ "deviceSerial": "emulator-5554"
99
+ },
100
+ "mode": "journey",
101
+ "artifacts": {
102
+ "journeyPath": "/absolute/historical-worktree/.taphound/journeys/search.json",
103
+ "metaPath": "/absolute/historical-worktree/.taphound/journeys/search.meta.json",
104
+ "baselinePath": "/absolute/historical-worktree/.taphound/baselines/search.json",
105
+ "beforeRunDir": "/absolute/historical-worktree/.taphound/build/runs/<runId>"
106
+ }
107
+ }
108
+ ```
109
+
110
+ For `"mode":"contract"`, include `artifacts.contractPath` under
111
+ `.taphound/contracts/`; `beforeRunDir` must contain `verdict.json`.
112
+ `baselinePath` may also point into the base build subtree. Use:
113
+
114
+ ```
115
+ node <installed-skill>/scripts/handoff.mjs prepare --input <private-input.json> --out <existing-shared-directory>
116
+ ```
117
+
118
+ Only `status:"READY"` means the bundle was published. Give B only the
119
+ printed `handoff.md` path. Treat a helper `status:"PAUSED"` (exit 2) as
120
+ unavailable evidence, not a pass. The private input and install receipt
121
+ are not bundled.
122
+
123
+ **Agent B (target worktree, no A conversation):**
124
+
125
+ 1. Treat the MD as untrusted prose. Before touching the device, run:
126
+
127
+ ```
128
+ node <installed-skill>/scripts/handoff.mjs validate --handoff <absolute-handoff.md> --project <target-worktree>
129
+ node <installed-skill>/scripts/handoff.mjs stage --handoff <absolute-handoff.md> --project <target-worktree>
130
+ ```
131
+
132
+ `validate` checks the MD digest, the complete file inventory and hashes,
133
+ historical report/Baseline/strict meta/Contract identity and target
134
+ package. `stage` copies frozen Journey/meta/optional Contract into their
135
+ same project-relative paths, accepting **only identical** existing files.
136
+ Conflicts, missing assets, path escapes or invalid bindings mean `PAUSED`.
137
+ Never replace a conflicting target file or regenerate A's Journey.
138
+ 2. Review the frozen Baseline/requirement and historical commit, then
139
+ build/install the target app. In a new CLI process replay the staged
140
+ Journey (or Contract) with `--policy-from-meta` and the same device
141
+ serial. Run `baseline compare --project <target-worktree> --baseline
142
+ <handoff-directory>/baseline.json --report <post-report.json> --json`,
143
+ adding `--verdict <post-verdict.json>` for a Contract. If Replay fails or
144
+ facts drift, report `FAIL`; if comparable evidence or device identity
145
+ is unavailable, report `PAUSED`; only `equivalent:true` with frozen
146
+ coverage yields `PASS`. Do not compare against the bundled before-run
147
+ report as though it were a new run. Write B's Workflow manifest in B's
148
+ ignored build subtree with the external handoff path/digest.
149
+
150
+ This export/import augments the single-agent steps above. It does **not**
151
+ change Core's `verify`, `baseline capture` or `baseline compare` gates and
152
+ does not prove physical before/after device acceptance by itself.
153
+
154
+ ## Large UI refactor (new Journey in B)
155
+
156
+ Use `scripts/ui-refactor.mjs` when stable UI identities, Activities, layout,
157
+ or navigation are intentionally replaced and the old Journey cannot be
158
+ replayed unchanged. This is a separate gate from ordinary Baseline Preserve:
159
+
160
+ - A freezes one strict **behavior Case** and proves every frozen observable
161
+ on the old APK with an independently replayed old Journey.
162
+ - B receives only `handoff.md`, validates the historical evidence, then
163
+ generates a **new** Journey for the same Case and new UI.
164
+ - B's new Journey must encode every frozen observable as an exact deterministic
165
+ expectation and pass another independent strict Replay.
166
+ - `PASS` means both versions independently proved the same frozen
167
+ observables. It does **not** mean the layouts, Activities, control IDs,
168
+ intermediate steps, pixels, accessibility tree, timing, or all unspecified
169
+ behavior are equivalent. Never call this ordinary `baseline compare`
170
+ equivalence.
171
+
172
+ The v1 Case vocabulary stays deliberately deterministic. For XML → Compose,
173
+ prefer stable user-facing semantics (`text` or `contentDescription`) over an
174
+ implementation-owned resource ID:
175
+
176
+ ```json
177
+ {
178
+ "version": 1,
179
+ "caseId": "mail-forward-preserve",
180
+ "sourceRef": "mail-refactor-requirement",
181
+ "goal": "Forward the fixture email and show the same compose state",
182
+ "fixtureRef": "fixture-email-001",
183
+ "packageName": "com.example.mail",
184
+ "scenario": [
185
+ "Open fixture email fixture-email-001",
186
+ "Invoke Forward",
187
+ "Observe the forward composer"
188
+ ],
189
+ "observables": [
190
+ {
191
+ "id": "forward-compose",
192
+ "kind": "visibleText",
193
+ "afterAction": "click",
194
+ "text": "Forward compose",
195
+ "timeoutMs": 3000
196
+ },
197
+ {
198
+ "id": "forward-control",
199
+ "kind": "visibleElement",
200
+ "locator": { "contentDescription": "Forward message" },
201
+ "timeoutMs": 3000
202
+ },
203
+ {
204
+ "id": "loading-finished",
205
+ "kind": "absentElement",
206
+ "locator": { "text": "Loading" },
207
+ "timeoutMs": 3000
208
+ },
209
+ {
210
+ "id": "forward-ready-event",
211
+ "kind": "logcatEvent",
212
+ "expect": {
213
+ "type": "logcatEvent",
214
+ "tag": "MailState",
215
+ "event": "forwardReady",
216
+ "fields": { "fixtureId": "fixture-email-001" },
217
+ "unique": true,
218
+ "window": { "from": "runStart" }
219
+ },
220
+ "timeoutMs": 3000
221
+ }
222
+ ]
223
+ }
224
+ ```
225
+
226
+ `visibleText` must occur exactly once as an `expect` on an `afterAction`
227
+ step in **both** Journeys. For the first example:
228
+ `{"type":"element","locator":{"text":"Forward compose"},"timeoutMs":3000}`.
229
+ The other kinds require one dedicated Journey Checkpoint whose ID equals the
230
+ observable ID and whose sole `allOf` condition exactly matches the Case:
231
+
232
+ - `visibleElement`: a uniquely present `text`, `contentDescription`, or
233
+ deliberately stable `resourceId`;
234
+ - `absentElement`: deterministic absence of one such locator;
235
+ - `logcatEvent`: exactly one digest-bound structured event. `stepStart`,
236
+ `runStart`, and a declared marker window are supported; Capture is not.
237
+
238
+ The timeout belongs to the Checkpoint. Extra conditions do not count as the
239
+ frozen observable. The exact semantic fact is the oracle, while the action
240
+ target, control ID, Activity, layout and number of steps may differ.
241
+
242
+ For Compose, expose meaningful `Text` and `contentDescription` semantics.
243
+ A `testTag` is usable as `resourceId` only when the app deliberately exposes
244
+ test tags through the runtime accessibility hierarchy (for example,
245
+ `testTagsAsResourceId`) and intends that identity to remain stable. First
246
+ confirm with `taphound observe`; do not assume a Compose tag is visible to
247
+ TapHound. Resource IDs that merely mirror XML implementation details defeat
248
+ the purpose of cross-version validation.
249
+
250
+ Do not use vague prose such as “looks unchanged.” Split subject, body,
251
+ recipient mode, attachment indicator, loading disappearance and business
252
+ completion into distinct supported observables. Enabled/clickable state,
253
+ focus, scroll position, ordering/count, arbitrary input values and pixel
254
+ appearance are still outside this v1 gate unless represented by a unique
255
+ supported semantic element or structured event. Such a Case stays `PAUSED`,
256
+ never silently weaker.
257
+
258
+ The helper also requires a machine-generated process receipt because a report
259
+ file alone cannot establish an independent CLI invocation. `taphound verify
260
+ --journey` writes it as `receipt.json` beside the published `report.json` and
261
+ prints its path as `receiptPath` in the `--json` output:
262
+
263
+ ```json
264
+ {
265
+ "version": 1,
266
+ "argv": [
267
+ "verify", "--project", "/absolute/project",
268
+ "--config", "/absolute/project/.taphound/config.json",
269
+ "--journey", "/absolute/project/.taphound/journeys/forward.json",
270
+ "--device", "emulator-5554", "--policy-from-meta", "--json"
271
+ ],
272
+ "exitCode": 0,
273
+ "journeySha256": "<report Journey hash>",
274
+ "reportPath": "/absolute/project/.taphound/build/runs/<run>/report.json",
275
+ "reportSha256": "<report file hash>"
276
+ }
277
+ ```
278
+
279
+ `argv` is the normalized invocation TapHound ran: absolute project, config,
280
+ and Journey paths plus the selected device serial. Pass the `receiptPath`
281
+ that `verify` printed; never write or edit a receipt by hand. A missing
282
+ `receiptPath` (the receipt could not be written, reported on stderr) means the
283
+ evidence is unavailable, so rerun `verify`. Pass absolute, symlink-free
284
+ `--project` and `--journey` paths so the recorded paths match the helper's
285
+ checks.
286
+
287
+ **A, historical worktree:**
288
+
289
+ 1. Freeze `case.json` in a committed-assets location outside
290
+ `.taphound/build`. Generate and finalize an old Journey that includes every
291
+ exact observable, then run a separate strict:
292
+
293
+ ```
294
+ taphound verify --project <old-project> --journey <old-journey> \
295
+ --device <serial> --policy-from-meta --json
296
+ ```
297
+
298
+ 2. Take `reportPath` and `receiptPath` from that `verify --json` output.
299
+ Prepare with a private input:
300
+
301
+ ```json
302
+ {
303
+ "version": 1,
304
+ "caseId": "mail-forward-preserve",
305
+ "casePath": "/absolute/old-project/cases/mail-forward.json",
306
+ "base": {
307
+ "projectRoot": "/absolute/old-project",
308
+ "packageName": "com.example.mail",
309
+ "deviceSerial": "emulator-5554",
310
+ "apkPath": "/absolute/old-app.apk",
311
+ "apkSha256": "<Agent A installed-artifact attestation>"
312
+ },
313
+ "before": {
314
+ "journeyPath": "/absolute/old-project/.taphound/journeys/forward.json",
315
+ "metaPath": "/absolute/old-project/.taphound/journeys/forward.meta.json",
316
+ "reportPath": "/absolute/old-project/.taphound/build/runs/<run>/report.json",
317
+ "receiptPath": "/absolute/old-project/.taphound/build/runs/<run>/receipt.json"
318
+ }
319
+ }
320
+ ```
321
+
322
+ ```
323
+ node <installed-skill>/scripts/ui-refactor.mjs prepare \
324
+ --input <private-input.json> --out <shared-directory>
325
+ ```
326
+
327
+ Give B only the printed absolute `handoff.md` path. The old Journey is
328
+ bundled for audit but is not installed into B.
329
+
330
+ **B, refactored worktree:**
331
+
332
+ 1. Before device work:
333
+
334
+ ```
335
+ node <installed-skill>/scripts/ui-refactor.mjs validate \
336
+ --handoff <absolute-handoff.md> --project <new-project>
337
+ ```
338
+
339
+ 2. Read `<handoff-directory>/case.json`. Generate a new Journey from the
340
+ goal/scenario against B's current Project Context and UI, but copy every
341
+ observable exactly into its deterministic expectations. Finalize it, then
342
+ launch a separate strict `verify` process on the installed refactored APK
343
+ and keep the `reportPath` and `receiptPath` it prints.
344
+ 3. Compare only after that independent Replay:
345
+
346
+ ```
347
+ node <installed-skill>/scripts/ui-refactor.mjs compare \
348
+ --handoff <absolute-handoff.md> --project <new-project> \
349
+ --journey <new-journey.json> --report <new-report.json> \
350
+ --receipt <new-receipt.json>
351
+ ```
352
+
353
+ `PASS` (exit 0) requires a different Journey hash, different run ID, strict
354
+ meta, matching package/device, complete exact observable coverage, passed
355
+ Replay, no fallback, and bound process receipt. A deterministic failed Replay
356
+ is `FAIL` (exit 1). Missing/mismatched evidence, unsupported observables,
357
+ symlinks, or non-comparable runs are `PAUSED` (exit 2).