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.
- package/README.md +49 -149
- package/README.zh-CN.md +47 -147
- package/assets/skills/taphound-case-suite/SKILL.md +363 -0
- package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
- package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
- package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
- package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
- package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
- package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
- package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
- package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
- package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
- package/assets/skills/taphound-flash/SKILL.md +115 -0
- package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
- package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
- package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
- package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
- package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
- package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
- package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
- package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
- package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
- package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
- package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
- package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
- package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
- package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
- package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
- package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
- package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
- package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
- package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
- package/assets/skills/taphound-verify-change/SKILL.md +91 -0
- package/assets/skills/taphound-verify-change/references/accept.md +38 -0
- package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
- package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
- package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
- package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
- package/dist/adapters/adb/adb-adapter.d.ts +16 -2
- package/dist/adapters/adb/adb-adapter.js +199 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
- package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
- package/dist/adapters/adb/ui-automator-parser.js +160 -0
- package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
- package/dist/adapters/adb/window-topology-parser.js +101 -0
- package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
- package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
- package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
- package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
- package/dist/adapters/android-cli/layout-parser.js +12 -8
- package/dist/adapters/appium/appium-doctor.d.ts +7 -0
- package/dist/adapters/appium/appium-doctor.js +128 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
- package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
- package/dist/adapters/camera/camera-probe-adapter.js +286 -0
- package/dist/adapters/filesystem/artifact-store.js +40 -1
- package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
- package/dist/adapters/filesystem/context-document-writer.js +112 -0
- package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
- package/dist/adapters/filesystem/external-flow-registry.js +325 -0
- package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
- package/dist/adapters/filesystem/generation-session-store.js +281 -855
- package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
- package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
- package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
- package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
- package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
- package/dist/adapters/filesystem/journey-composition-store.js +151 -0
- package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
- package/dist/adapters/filesystem/knowledge-registry.js +223 -0
- package/dist/adapters/filesystem/project-bound-file.js +3 -5
- package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
- package/dist/adapters/filesystem/project-file-inspector.js +57 -28
- package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
- package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
- package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
- package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
- package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
- package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
- package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
- package/dist/adapters/filesystem/skill-installer.js +40 -11
- package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
- package/dist/adapters/filesystem/workspace-layout.js +57 -0
- package/dist/adapters/git/node-git-diff.d.ts +17 -0
- package/dist/adapters/git/node-git-diff.js +114 -0
- package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
- package/dist/adapters/process/node-detached-process-launcher.js +96 -0
- package/dist/adapters/process/node-process-runner.js +11 -2
- package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
- package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
- package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
- package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
- package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
- package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
- package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
- package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
- package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
- package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
- package/dist/adapters/runtime/session-adb-view.js +193 -0
- package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
- package/dist/adapters/runtime/session-backed-ports.js +43 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
- package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
- package/dist/adapters/ui/device-layout-temp.js +18 -0
- package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
- package/dist/adapters/ui/device-ui-environment.js +81 -0
- package/dist/adapters/ui/layout-normalization.d.ts +9 -0
- package/dist/adapters/ui/layout-normalization.js +44 -0
- package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
- package/dist/adapters/ui/ui-snapshot-error.js +12 -0
- package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
- package/dist/adapters/ui/ui-snapshot-support.js +12 -0
- package/dist/application/align/align-service.d.ts +42 -0
- package/dist/application/align/align-service.js +106 -0
- package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
- package/dist/application/assertion/expectation-evaluator.js +156 -18
- package/dist/application/assertion/guarded-expectation.d.ts +45 -0
- package/dist/application/assertion/guarded-expectation.js +74 -0
- package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
- package/dist/application/checkpoint/baseline-capturer.js +163 -0
- package/dist/application/checkpoint/baseline-error.d.ts +5 -0
- package/dist/application/checkpoint/baseline-error.js +8 -0
- package/dist/application/checkpoint/baseline-service.d.ts +31 -0
- package/dist/application/checkpoint/baseline-service.js +147 -0
- package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
- package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
- package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
- package/dist/application/checkpoint/regression-comparator.js +192 -0
- package/dist/application/collector/logcat-collector.d.ts +22 -1
- package/dist/application/collector/logcat-collector.js +103 -15
- package/dist/application/collector/logcat-event.d.ts +8 -0
- package/dist/application/collector/logcat-event.js +79 -0
- package/dist/application/collector/logcat-stop.d.ts +2 -0
- package/dist/application/collector/logcat-stop.js +11 -0
- package/dist/application/context/context-generator.d.ts +45 -0
- package/dist/application/context/context-generator.js +228 -0
- package/dist/application/context/context-loader.d.ts +40 -0
- package/dist/application/context/context-loader.js +223 -0
- package/dist/application/context/context-refresher.d.ts +59 -0
- package/dist/application/context/context-refresher.js +349 -0
- package/dist/application/context/context-rehasher.d.ts +36 -0
- package/dist/application/context/context-rehasher.js +110 -0
- package/dist/application/context/context-validator.d.ts +23 -1
- package/dist/application/context/context-validator.js +116 -9
- package/dist/application/context/evidence-hash.d.ts +1 -0
- package/dist/application/context/evidence-hash.js +125 -0
- package/dist/application/context/evidence-match.d.ts +9 -0
- package/dist/application/context/evidence-match.js +8 -0
- package/dist/application/context/shard-identity.d.ts +2 -0
- package/dist/application/context/shard-identity.js +7 -0
- package/dist/application/contract/contract-loader.d.ts +25 -0
- package/dist/application/contract/contract-loader.js +68 -0
- package/dist/application/contract/contract-review.d.ts +25 -0
- package/dist/application/contract/contract-review.js +51 -0
- package/dist/application/contract/contract-verifier.d.ts +53 -0
- package/dist/application/contract/contract-verifier.js +645 -0
- package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
- package/dist/application/devices/resolve-device-assignments.js +60 -0
- package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
- package/dist/application/diagnosis/failure-classifier.js +179 -0
- package/dist/application/doctor/doctor-service.d.ts +36 -3
- package/dist/application/doctor/doctor-service.js +255 -25
- package/dist/application/generation/generation-app-preparer.d.ts +20 -0
- package/dist/application/generation/generation-app-preparer.js +28 -0
- package/dist/application/generation/generation-config-service.d.ts +21 -0
- package/dist/application/generation/generation-config-service.js +53 -0
- package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
- package/dist/application/generation/generation-confirmation-service.js +109 -24
- package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
- package/dist/application/generation/generation-context-snapshot.js +29 -0
- package/dist/application/generation/generation-finalizer.d.ts +15 -9
- package/dist/application/generation/generation-finalizer.js +167 -70
- package/dist/application/generation/generation-publisher.js +12 -8
- package/dist/application/generation/generation-recovery-service.d.ts +35 -0
- package/dist/application/generation/generation-recovery-service.js +144 -0
- package/dist/application/generation/generation-reopen-service.d.ts +15 -0
- package/dist/application/generation/generation-reopen-service.js +37 -0
- package/dist/application/generation/generation-replace-service.d.ts +32 -0
- package/dist/application/generation/generation-replace-service.js +116 -0
- package/dist/application/generation/generation-starter.d.ts +44 -4
- package/dist/application/generation/generation-starter.js +175 -8
- package/dist/application/generation/generation-step-executor.d.ts +67 -5
- package/dist/application/generation/generation-step-executor.js +471 -108
- package/dist/application/generation/proposed-step-validator.js +96 -30
- package/dist/application/generation/replay-policy-loader.d.ts +16 -0
- package/dist/application/generation/replay-policy-loader.js +29 -0
- package/dist/application/generation/risk-evaluator.d.ts +4 -1
- package/dist/application/generation/risk-evaluator.js +118 -3
- package/dist/application/generation/runtime-observer.d.ts +39 -7
- package/dist/application/generation/runtime-observer.js +193 -24
- package/dist/application/impact/impact-resolver.d.ts +32 -0
- package/dist/application/impact/impact-resolver.js +160 -0
- package/dist/application/init/init-service.js +26 -13
- package/dist/application/interaction/action-executor.d.ts +3 -2
- package/dist/application/interaction/action-executor.js +11 -1
- package/dist/application/interaction/action-target.d.ts +17 -0
- package/dist/application/interaction/action-target.js +40 -0
- package/dist/application/interaction/external-step-runner.d.ts +153 -0
- package/dist/application/interaction/external-step-runner.js +332 -0
- package/dist/application/interaction/fallback-resolver.d.ts +6 -3
- package/dist/application/interaction/fallback-resolver.js +7 -5
- package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
- package/dist/application/interaction/scroll-to-executor.js +118 -36
- package/dist/application/journey/external-flow-resolver.d.ts +25 -0
- package/dist/application/journey/external-flow-resolver.js +22 -0
- package/dist/application/journey/journey-check-service.d.ts +54 -0
- package/dist/application/journey/journey-check-service.js +207 -0
- package/dist/application/journey/journey-promoter.d.ts +26 -0
- package/dist/application/journey/journey-promoter.js +123 -0
- package/dist/application/journey/journey-resolver.d.ts +42 -0
- package/dist/application/journey/journey-resolver.js +239 -0
- package/dist/application/journey/journey-retirer.d.ts +25 -0
- package/dist/application/journey/journey-retirer.js +87 -0
- package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
- package/dist/application/knowledge/anchor-resolver.js +110 -0
- package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
- package/dist/application/knowledge/knowledge-loader.js +36 -0
- package/dist/application/locator/layout-failure-summary.d.ts +2 -0
- package/dist/application/locator/layout-failure-summary.js +67 -0
- package/dist/application/locator/layout-traversal.d.ts +11 -0
- package/dist/application/locator/layout-traversal.js +18 -0
- package/dist/application/locator/locator-resolver.d.ts +13 -1
- package/dist/application/locator/locator-resolver.js +182 -18
- package/dist/application/observe/observe-service.d.ts +20 -0
- package/dist/application/observe/observe-service.js +91 -0
- package/dist/application/project/project-describer.d.ts +14 -6
- package/dist/application/project/project-describer.js +38 -5
- package/dist/application/recognition/screen-detector.d.ts +28 -0
- package/dist/application/recognition/screen-detector.js +111 -0
- package/dist/application/recorder/locator-selector.js +151 -17
- package/dist/application/recorder/recorder-service.d.ts +16 -4
- package/dist/application/recorder/recorder-service.js +420 -128
- package/dist/application/report/report-writer.js +1 -1
- package/dist/application/runtime/cold-launch.d.ts +28 -0
- package/dist/application/runtime/cold-launch.js +59 -0
- package/dist/application/runtime/step-runner.d.ts +49 -4
- package/dist/application/runtime/step-runner.js +721 -130
- package/dist/application/runtime/verify-runtime.d.ts +57 -7
- package/dist/application/runtime/verify-runtime.js +554 -174
- package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
- package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
- package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
- package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
- package/dist/application/ui/ui-stability-probe.d.ts +3 -0
- package/dist/application/ui/ui-stability-probe.js +8 -0
- package/dist/application/wait/idle-advice.d.ts +6 -0
- package/dist/application/wait/idle-advice.js +27 -0
- package/dist/application/wait/idle-profiles.d.ts +15 -0
- package/dist/application/wait/idle-profiles.js +75 -0
- package/dist/application/wait/idle-waiter.d.ts +28 -4
- package/dist/application/wait/idle-waiter.js +186 -15
- package/dist/cli/commands/align.d.ts +3 -0
- package/dist/cli/commands/align.js +124 -0
- package/dist/cli/commands/baseline.d.ts +3 -0
- package/dist/cli/commands/baseline.js +130 -0
- package/dist/cli/commands/context.js +300 -27
- package/dist/cli/commands/contract.d.ts +3 -0
- package/dist/cli/commands/contract.js +120 -0
- package/dist/cli/commands/doctor.js +16 -9
- package/dist/cli/commands/failure.d.ts +3 -0
- package/dist/cli/commands/failure.js +63 -0
- package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
- package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
- package/dist/cli/commands/generation/session-commands.d.ts +11 -0
- package/dist/cli/commands/generation/session-commands.js +472 -0
- package/dist/cli/commands/generation/shared.d.ts +1414 -0
- package/dist/cli/commands/generation/shared.js +291 -0
- package/dist/cli/commands/generation/step-commands.d.ts +8 -0
- package/dist/cli/commands/generation/step-commands.js +315 -0
- package/dist/cli/commands/generation.js +10 -507
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.js +87 -0
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/journey.d.ts +3 -0
- package/dist/cli/commands/journey.js +382 -0
- package/dist/cli/commands/knowledge.d.ts +3 -0
- package/dist/cli/commands/knowledge.js +93 -0
- package/dist/cli/commands/observe.d.ts +3 -0
- package/dist/cli/commands/observe.js +127 -0
- package/dist/cli/commands/project.js +2 -1
- package/dist/cli/commands/record.js +18 -5
- package/dist/cli/commands/verify.js +273 -63
- package/dist/cli/dependencies.d.ts +125 -1
- package/dist/cli/dependencies.js +450 -51
- package/dist/cli/diff-verification.d.ts +41 -0
- package/dist/cli/diff-verification.js +192 -0
- package/dist/cli/main.js +49 -1
- package/dist/cli/output.d.ts +5 -3
- package/dist/cli/output.js +12 -0
- package/dist/cli/program.js +19 -1
- package/dist/cli/project-root.d.ts +1 -0
- package/dist/cli/project-root.js +6 -0
- package/dist/cli/runtime-selection.d.ts +22 -0
- package/dist/cli/runtime-selection.js +92 -0
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/workspace-guard.d.ts +2 -0
- package/dist/cli/workspace-guard.js +3 -0
- package/dist/domain/binding-reference.d.ts +4 -0
- package/dist/domain/binding-reference.js +23 -0
- package/dist/domain/checkpoint.d.ts +404 -0
- package/dist/domain/checkpoint.js +297 -0
- package/dist/domain/config.d.ts +107 -1
- package/dist/domain/config.js +52 -6
- package/dist/domain/contract.d.ts +413 -0
- package/dist/domain/contract.js +196 -0
- package/dist/domain/external-flow.d.ts +493 -0
- package/dist/domain/external-flow.js +15 -0
- package/dist/domain/failure-classification.d.ts +176 -0
- package/dist/domain/failure-classification.js +169 -0
- package/dist/domain/failure.d.ts +2 -1
- package/dist/domain/failure.js +123 -0
- package/dist/domain/generation.d.ts +1671 -132
- package/dist/domain/generation.js +202 -13
- package/dist/domain/geometry.d.ts +13 -0
- package/dist/domain/geometry.js +16 -0
- package/dist/domain/impact.d.ts +71 -0
- package/dist/domain/impact.js +76 -0
- package/dist/domain/init.d.ts +12 -4
- package/dist/domain/init.js +24 -18
- package/dist/domain/journey-composition.d.ts +2285 -0
- package/dist/domain/journey-composition.js +85 -0
- package/dist/domain/journey-lifecycle.d.ts +10 -0
- package/dist/domain/journey-lifecycle.js +9 -0
- package/dist/domain/journey.d.ts +2419 -212
- package/dist/domain/journey.js +384 -14
- package/dist/domain/knowledge.d.ts +165 -0
- package/dist/domain/knowledge.js +188 -0
- package/dist/domain/layout.d.ts +34 -5
- package/dist/domain/layout.js +64 -6
- package/dist/domain/locator-evidence.d.ts +3 -0
- package/dist/domain/locator-evidence.js +36 -0
- package/dist/domain/logcat-event.d.ts +54 -0
- package/dist/domain/logcat-event.js +40 -0
- package/dist/domain/observation.d.ts +33 -0
- package/dist/domain/observation.js +18 -0
- package/dist/domain/project-context.d.ts +219 -1
- package/dist/domain/project-context.js +209 -6
- package/dist/domain/proposed-step.d.ts +340 -60
- package/dist/domain/proposed-step.js +23 -3
- package/dist/domain/report.d.ts +1455 -28
- package/dist/domain/report.js +211 -14
- package/dist/domain/runtime-snapshot.d.ts +58 -1
- package/dist/domain/runtime-snapshot.js +14 -3
- package/dist/domain/runtime.d.ts +50 -0
- package/dist/domain/runtime.js +36 -0
- package/dist/domain/system-app-profiles.d.ts +6 -0
- package/dist/domain/system-app-profiles.js +43 -0
- package/dist/domain/ui-backend.d.ts +28 -0
- package/dist/domain/ui-backend.js +33 -0
- package/dist/domain/ui-cache.d.ts +11 -0
- package/dist/domain/ui-cache.js +10 -0
- package/dist/domain/window-hierarchy.d.ts +84 -0
- package/dist/domain/window-hierarchy.js +172 -0
- package/dist/domain/workflow-manifest.d.ts +77 -0
- package/dist/domain/workflow-manifest.js +136 -0
- package/dist/domain/workspace.d.ts +28 -0
- package/dist/domain/workspace.js +72 -0
- package/dist/ports/adb.d.ts +34 -1
- package/dist/ports/align-prompt.d.ts +11 -0
- package/dist/ports/align-prompt.js +6 -0
- package/dist/ports/anchor-resolver.d.ts +30 -0
- package/dist/ports/anchor-resolver.js +1 -0
- package/dist/ports/annotated-screen-resolver.d.ts +4 -0
- package/dist/ports/annotated-screen-resolver.js +1 -0
- package/dist/ports/camera-probe.d.ts +23 -0
- package/dist/ports/camera-probe.js +8 -0
- package/dist/ports/context-document-writer.d.ts +24 -0
- package/dist/ports/context-document-writer.js +1 -0
- package/dist/ports/detached-process-launcher.d.ts +12 -0
- package/dist/ports/detached-process-launcher.js +1 -0
- package/dist/ports/external-flow-registry.d.ts +37 -0
- package/dist/ports/external-flow-registry.js +1 -0
- package/dist/ports/generation-prompt.d.ts +2 -1
- package/dist/ports/generation-session-store.d.ts +12 -2
- package/dist/ports/git-diff.d.ts +9 -0
- package/dist/ports/git-diff.js +1 -0
- package/dist/ports/journey-composition-store.d.ts +17 -0
- package/dist/ports/journey-composition-store.js +1 -0
- package/dist/ports/knowledge-registry.d.ts +20 -0
- package/dist/ports/knowledge-registry.js +1 -0
- package/dist/ports/process-runner.d.ts +7 -0
- package/dist/ports/project-file-inspector.d.ts +1 -0
- package/dist/ports/project-identity-inspector.d.ts +24 -0
- package/dist/ports/project-identity-inspector.js +1 -0
- package/dist/ports/project-inventory-inspector.d.ts +21 -0
- package/dist/ports/project-inventory-inspector.js +1 -0
- package/dist/ports/project-module-discoverer.d.ts +26 -0
- package/dist/ports/project-module-discoverer.js +1 -0
- package/dist/ports/recorder-prompt.d.ts +10 -1
- package/dist/ports/runtime-backend.d.ts +89 -0
- package/dist/ports/runtime-backend.js +13 -0
- package/dist/ports/runtime-capability.d.ts +12 -0
- package/dist/ports/runtime-capability.js +20 -0
- package/dist/ports/runtime-session-ports.d.ts +25 -0
- package/dist/ports/runtime-session-ports.js +1 -0
- package/dist/ports/screenshot.d.ts +11 -0
- package/dist/ports/screenshot.js +1 -0
- package/dist/ports/skill-installer.d.ts +2 -2
- package/dist/ports/ui-snapshot.d.ts +35 -0
- package/dist/ports/ui-snapshot.js +1 -0
- package/dist/ports/ui-stability.d.ts +19 -0
- package/dist/ports/ui-stability.js +1 -0
- package/dist/ports/workspace-layout.d.ts +4 -0
- package/dist/ports/workspace-layout.js +1 -0
- package/dist/shared/errors.d.ts +2 -0
- package/dist/shared/errors.js +22 -0
- package/dist/shared/paths.d.ts +2 -0
- package/dist/shared/paths.js +24 -0
- package/dist/shared/strings.d.ts +2 -0
- package/dist/shared/strings.js +16 -0
- package/package.json +6 -1
- package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
- package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
- package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
- package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
- package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
- package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
- package/dist/ports/android-cli.d.ts +0 -21
- /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
|
@@ -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,349 @@
|
|
|
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:
|
|
260
|
+
|
|
261
|
+
```json
|
|
262
|
+
{
|
|
263
|
+
"version": 1,
|
|
264
|
+
"argv": [
|
|
265
|
+
"verify", "--project", "/absolute/project",
|
|
266
|
+
"--journey", "/absolute/project/.taphound/journeys/forward.json",
|
|
267
|
+
"--device", "emulator-5554", "--policy-from-meta", "--json"
|
|
268
|
+
],
|
|
269
|
+
"exitCode": 0,
|
|
270
|
+
"journeySha256": "<report Journey hash>",
|
|
271
|
+
"reportPath": "/absolute/project/.taphound/build/runs/<run>/report.json",
|
|
272
|
+
"reportSha256": "<report file hash>"
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
The workflow runner must capture actual argv, exit status, and resulting
|
|
277
|
+
digests. An agent must not write a success receipt merely because a report
|
|
278
|
+
exists.
|
|
279
|
+
|
|
280
|
+
**A, historical worktree:**
|
|
281
|
+
|
|
282
|
+
1. Freeze `case.json` in a committed-assets location outside
|
|
283
|
+
`.taphound/build`. Generate and finalize an old Journey that includes every
|
|
284
|
+
exact observable, then run a separate strict:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
taphound verify --project <old-project> --journey <old-journey> \
|
|
288
|
+
--device <serial> --policy-from-meta --json
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
2. Record its process receipt. Prepare with a private input:
|
|
292
|
+
|
|
293
|
+
```json
|
|
294
|
+
{
|
|
295
|
+
"version": 1,
|
|
296
|
+
"caseId": "mail-forward-preserve",
|
|
297
|
+
"casePath": "/absolute/old-project/cases/mail-forward.json",
|
|
298
|
+
"base": {
|
|
299
|
+
"projectRoot": "/absolute/old-project",
|
|
300
|
+
"packageName": "com.example.mail",
|
|
301
|
+
"deviceSerial": "emulator-5554",
|
|
302
|
+
"apkPath": "/absolute/old-app.apk",
|
|
303
|
+
"apkSha256": "<Agent A installed-artifact attestation>"
|
|
304
|
+
},
|
|
305
|
+
"before": {
|
|
306
|
+
"journeyPath": "/absolute/old-project/.taphound/journeys/forward.json",
|
|
307
|
+
"metaPath": "/absolute/old-project/.taphound/journeys/forward.meta.json",
|
|
308
|
+
"reportPath": "/absolute/old-project/.taphound/build/runs/<run>/report.json",
|
|
309
|
+
"receiptPath": "/absolute/old-project/.taphound/build/workflows/<case>/receipt.json"
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
node <installed-skill>/scripts/ui-refactor.mjs prepare \
|
|
316
|
+
--input <private-input.json> --out <shared-directory>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Give B only the printed absolute `handoff.md` path. The old Journey is
|
|
320
|
+
bundled for audit but is not installed into B.
|
|
321
|
+
|
|
322
|
+
**B, refactored worktree:**
|
|
323
|
+
|
|
324
|
+
1. Before device work:
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
node <installed-skill>/scripts/ui-refactor.mjs validate \
|
|
328
|
+
--handoff <absolute-handoff.md> --project <new-project>
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
2. Read `<handoff-directory>/case.json`. Generate a new Journey from the
|
|
332
|
+
goal/scenario against B's current Project Context and UI, but copy every
|
|
333
|
+
observable exactly into its deterministic expectations. Finalize it, then
|
|
334
|
+
launch a separate strict `verify` process on the installed refactored APK
|
|
335
|
+
and record the same receipt shape.
|
|
336
|
+
3. Compare only after that independent Replay:
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
node <installed-skill>/scripts/ui-refactor.mjs compare \
|
|
340
|
+
--handoff <absolute-handoff.md> --project <new-project> \
|
|
341
|
+
--journey <new-journey.json> --report <new-report.json> \
|
|
342
|
+
--receipt <new-receipt.json>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
`PASS` (exit 0) requires a different Journey hash, different run ID, strict
|
|
346
|
+
meta, matching package/device, complete exact observable coverage, passed
|
|
347
|
+
Replay, no fallback, and bound process receipt. A deterministic failed Replay
|
|
348
|
+
is `FAIL` (exit 1). Missing/mismatched evidence, unsupported observables,
|
|
349
|
+
symlinks, or non-comparable runs are `PAUSED` (exit 2).
|