@guanlin4924/devflow-pi 0.1.94 → 0.1.96

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 (245) hide show
  1. package/README.md +34 -4
  2. package/node_modules/@playwright/test/LICENSE +202 -0
  3. package/node_modules/@playwright/test/NOTICE +5 -0
  4. package/node_modules/@playwright/test/README.md +318 -0
  5. package/node_modules/@playwright/test/cli.js +19 -0
  6. package/node_modules/@playwright/test/index.d.ts +18 -0
  7. package/node_modules/@playwright/test/index.js +17 -0
  8. package/node_modules/@playwright/test/index.mjs +18 -0
  9. package/node_modules/@playwright/test/package.json +35 -0
  10. package/node_modules/@playwright/test/reporter.d.ts +17 -0
  11. package/node_modules/@playwright/test/reporter.js +17 -0
  12. package/node_modules/@playwright/test/reporter.mjs +17 -0
  13. package/node_modules/playwright/LICENSE +202 -0
  14. package/node_modules/playwright/NOTICE +5 -0
  15. package/node_modules/playwright/README.md +318 -0
  16. package/node_modules/playwright/ThirdPartyNotices.txt +14 -0
  17. package/node_modules/playwright/cli.js +19 -0
  18. package/node_modules/playwright/index.d.ts +17 -0
  19. package/node_modules/playwright/index.js +17 -0
  20. package/node_modules/playwright/index.mjs +18 -0
  21. package/node_modules/playwright/jsx-runtime.js +42 -0
  22. package/node_modules/playwright/jsx-runtime.mjs +21 -0
  23. package/node_modules/playwright/lib/agents/agentParser.js +89 -0
  24. package/node_modules/playwright/lib/agents/copilot-setup-steps.yml +34 -0
  25. package/node_modules/playwright/lib/agents/generateAgents.js +395 -0
  26. package/node_modules/playwright/lib/agents/playwright-test-coverage.prompt.md +31 -0
  27. package/node_modules/playwright/lib/agents/playwright-test-generate.prompt.md +8 -0
  28. package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +88 -0
  29. package/node_modules/playwright/lib/agents/playwright-test-heal.prompt.md +6 -0
  30. package/node_modules/playwright/lib/agents/playwright-test-healer.agent.md +56 -0
  31. package/node_modules/playwright/lib/agents/playwright-test-plan.prompt.md +9 -0
  32. package/node_modules/playwright/lib/agents/playwright-test-planner.agent.md +74 -0
  33. package/node_modules/playwright/lib/cli/reportActions.js +78 -0
  34. package/node_modules/playwright/lib/cli/testActions.js +214 -0
  35. package/node_modules/playwright/lib/common/index.js +2923 -0
  36. package/node_modules/playwright/lib/common/index.js.txt +34 -0
  37. package/node_modules/playwright/lib/errorContext.js +129 -0
  38. package/node_modules/playwright/lib/globals.js +58 -0
  39. package/node_modules/playwright/lib/index.js +815 -0
  40. package/node_modules/playwright/lib/isomorphic.js +260 -0
  41. package/node_modules/playwright/lib/isomorphic.js.txt +9 -0
  42. package/node_modules/playwright/lib/loader/loaderProcessEntry.js +34 -0
  43. package/node_modules/playwright/lib/loader/loaderProcessEntry.js.txt +9 -0
  44. package/node_modules/playwright/lib/matchers/expect.js +13490 -0
  45. package/node_modules/playwright/lib/matchers/expect.js.LICENSE +640 -0
  46. package/node_modules/playwright/lib/matchers/expect.js.txt +67 -0
  47. package/node_modules/playwright/lib/mcp/test/browserBackend.js +135 -0
  48. package/node_modules/playwright/lib/mcp/test/generatorTools.js +122 -0
  49. package/node_modules/playwright/lib/mcp/test/plannerTools.js +150 -0
  50. package/node_modules/playwright/lib/mcp/test/seed.js +82 -0
  51. package/node_modules/playwright/lib/mcp/test/streams.js +44 -0
  52. package/node_modules/playwright/lib/mcp/test/testBackend.js +99 -0
  53. package/node_modules/playwright/lib/mcp/test/testContext.js +306 -0
  54. package/node_modules/playwright/lib/mcp/test/testTool.js +30 -0
  55. package/node_modules/playwright/lib/mcp/test/testTools.js +98 -0
  56. package/node_modules/playwright/lib/package.js +47 -0
  57. package/node_modules/playwright/lib/program.js +241 -0
  58. package/node_modules/playwright/lib/runner/index.js +8527 -0
  59. package/node_modules/playwright/lib/runner/index.js.txt +61 -0
  60. package/node_modules/playwright/lib/transform/babelBundle.js +72274 -0
  61. package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +2384 -0
  62. package/node_modules/playwright/lib/transform/babelBundle.js.txt +325 -0
  63. package/node_modules/playwright/lib/transform/esmLoader.js +8054 -0
  64. package/node_modules/playwright/lib/transform/esmLoader.js.LICENSE +355 -0
  65. package/node_modules/playwright/lib/transform/esmLoader.js.txt +60 -0
  66. package/node_modules/playwright/lib/util.js +373 -0
  67. package/node_modules/playwright/lib/worker/workerProcessEntry.js +1861 -0
  68. package/node_modules/playwright/lib/worker/workerProcessEntry.js.txt +19 -0
  69. package/node_modules/playwright/package.json +55 -0
  70. package/node_modules/playwright/test.d.ts +18 -0
  71. package/node_modules/playwright/test.js +24 -0
  72. package/node_modules/playwright/test.mjs +35 -0
  73. package/node_modules/playwright/types/test.d.ts +11074 -0
  74. package/node_modules/playwright/types/testReporter.d.ts +950 -0
  75. package/node_modules/playwright-core/LICENSE +202 -0
  76. package/node_modules/playwright-core/NOTICE +5 -0
  77. package/node_modules/playwright-core/README.md +3 -0
  78. package/node_modules/playwright-core/ThirdPartyNotices.txt +13 -0
  79. package/node_modules/playwright-core/bin/install_media_pack.ps1 +5 -0
  80. package/node_modules/playwright-core/bin/install_webkit_wsl.ps1 +33 -0
  81. package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +42 -0
  82. package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +13 -0
  83. package/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +24 -0
  84. package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +42 -0
  85. package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +12 -0
  86. package/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +24 -0
  87. package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +48 -0
  88. package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +11 -0
  89. package/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +23 -0
  90. package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +48 -0
  91. package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +11 -0
  92. package/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +23 -0
  93. package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +48 -0
  94. package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +11 -0
  95. package/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +24 -0
  96. package/node_modules/playwright-core/browsers.json +52 -0
  97. package/node_modules/playwright-core/cli.js +21 -0
  98. package/node_modules/playwright-core/index.d.ts +17 -0
  99. package/node_modules/playwright-core/index.js +17 -0
  100. package/node_modules/playwright-core/index.mjs +28 -0
  101. package/node_modules/playwright-core/lib/bootstrap.js +88 -0
  102. package/node_modules/playwright-core/lib/coreBundle.js +75813 -0
  103. package/node_modules/playwright-core/lib/entry/cliDaemon.js +5 -0
  104. package/node_modules/playwright-core/lib/entry/dashboardApp.js +3 -0
  105. package/node_modules/playwright-core/lib/entry/mcp.js +10 -0
  106. package/node_modules/playwright-core/lib/entry/oopBrowserDownload.js +3 -0
  107. package/node_modules/playwright-core/lib/package.js +50 -0
  108. package/node_modules/playwright-core/lib/server/chromium/appIcon.png +0 -0
  109. package/node_modules/playwright-core/lib/server/electron/loader.js +116 -0
  110. package/node_modules/playwright-core/lib/serverRegistry.js +1939 -0
  111. package/node_modules/playwright-core/lib/serverRegistry.js.LICENSE +65 -0
  112. package/node_modules/playwright-core/lib/tools/cli-client/channelSessions.js +141 -0
  113. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +6 -0
  114. package/node_modules/playwright-core/lib/tools/cli-client/help.json +721 -0
  115. package/node_modules/playwright-core/lib/tools/cli-client/minimist.js +128 -0
  116. package/node_modules/playwright-core/lib/tools/cli-client/output.js +351 -0
  117. package/node_modules/playwright-core/lib/tools/cli-client/program.js +418 -0
  118. package/node_modules/playwright-core/lib/tools/cli-client/registry.js +180 -0
  119. package/node_modules/playwright-core/lib/tools/cli-client/session.js +259 -0
  120. package/node_modules/playwright-core/lib/tools/dashboard/appIcon.png +0 -0
  121. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +425 -0
  122. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/element-attributes.md +23 -0
  123. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/playwright-tests.md +39 -0
  124. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/request-mocking.md +87 -0
  125. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +241 -0
  126. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +225 -0
  127. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/storage-state.md +275 -0
  128. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +433 -0
  129. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/tracing.md +139 -0
  130. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +143 -0
  131. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/SKILL.md +136 -0
  132. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/gallery-spec.md +144 -0
  133. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/migration.md +89 -0
  134. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/react.md +69 -0
  135. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/typing.md +173 -0
  136. package/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/vue.md +77 -0
  137. package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +174 -0
  138. package/node_modules/playwright-core/lib/tools/utils/extension.js +112 -0
  139. package/node_modules/playwright-core/lib/tools/utils/socketConnection.js +108 -0
  140. package/node_modules/playwright-core/lib/utilsBundle.js +85357 -0
  141. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +1890 -0
  142. package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
  143. package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
  144. package/node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
  145. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
  146. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
  147. package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
  148. package/node_modules/playwright-core/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
  149. package/node_modules/playwright-core/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
  150. package/node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
  151. package/node_modules/playwright-core/lib/vite/dashboard/index.html +29 -0
  152. package/node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg +24 -0
  153. package/node_modules/playwright-core/lib/vite/htmlReport/index.html +16 -0
  154. package/node_modules/playwright-core/lib/vite/htmlReport/report.css +2 -0
  155. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +32 -0
  156. package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
  157. package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-CVQWJZAA.js +32 -0
  158. package/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  159. package/node_modules/playwright-core/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
  160. package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +129 -0
  161. package/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
  162. package/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +9 -0
  163. package/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-BbkfBe3n.js +32 -0
  164. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +182 -0
  165. package/node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
  166. package/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-DywYcAf8.js +7 -0
  167. package/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
  168. package/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  169. package/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.Bqk9acqE.css +1 -0
  170. package/node_modules/playwright-core/lib/vite/traceViewer/index.B4cLoZK3.js +1 -0
  171. package/node_modules/playwright-core/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
  172. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +44 -0
  173. package/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +16 -0
  174. package/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +9 -0
  175. package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
  176. package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +10 -0
  177. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +4 -0
  178. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CU5KtEkS.js +5 -0
  179. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
  180. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +18 -0
  181. package/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
  182. package/node_modules/playwright-core/lib/webp_codec.LICENSE +173 -0
  183. package/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
  184. package/node_modules/playwright-core/lib/xdg-open +1267 -0
  185. package/node_modules/playwright-core/package.json +34 -0
  186. package/node_modules/playwright-core/types/protocol.d.ts +24645 -0
  187. package/node_modules/playwright-core/types/structs.d.ts +52 -0
  188. package/node_modules/playwright-core/types/types.d.ts +26632 -0
  189. package/package.json +13 -2
  190. package/plugins/devflow-core/extensions/devflow-core.ts +432 -7
  191. package/plugins/devflow-core/runtime/hooks/hook_common.py +514 -0
  192. package/plugins/devflow-core/runtime/hooks/index_gate.py +47 -16
  193. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/acceptance_test_runner.py +488 -71
  194. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/advance_state.rb +51 -0
  195. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/approval_pins.py +433 -0
  196. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/approval_store.py +137 -0
  197. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/dsl_coverage.py +87 -0
  198. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/dsl_draft.py +53 -0
  199. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/dsl_v1.py +318 -0
  200. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/environment_profile.py +134 -0
  201. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/execution_contract.rb +1 -0
  202. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/execution_surface.py +138 -0
  203. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/playwright_adapter.py +515 -0
  204. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/tc_hash.py +132 -0
  205. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/test_command_policy.py +102 -8
  206. package/plugins/devflow-core/skills/workflow-orchestrator/scripts/validate_state.rb +13 -0
  207. package/plugins/devflow-core/skills/workflow-orchestrator/templates/feature-development.yaml +13 -34
  208. package/plugins/devflow-core/skills/workflow-pipeline/SKILL.md +3 -1
  209. package/plugins/devflow-core/skills/workflow-pipeline/references/pipeline-flow.md +68 -140
  210. package/plugins/devflow-core/skills/workflow-project-context/scripts/validate_initialization_database.py +1 -1
  211. package/plugins/devflow-implementation/skills/workflow-execute-phase/references/execute-phase.md +3 -1
  212. package/plugins/devflow-intel/extensions/devflow-intel.ts +1 -1
  213. package/plugins/devflow-intel/skills/workflow-code-index/scripts/code_index.py +23 -4
  214. package/plugins/devflow-quality/runtime/playwright/devflow-test-dsl-v1.schema.json +872 -0
  215. package/plugins/devflow-quality/runtime/playwright/playwright.config.mjs +46 -0
  216. package/plugins/devflow-quality/runtime/playwright/reporter.mjs +311 -0
  217. package/plugins/devflow-quality/runtime/playwright/runner.spec.mjs +1308 -0
  218. package/plugins/devflow-quality/runtime/playwright/runtime-manifest.json +11 -0
  219. package/plugins/devflow-quality/skills/workflow-acceptance-test-design/SKILL.md +3 -0
  220. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/SKILL.md +71 -58
  221. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/api-mainflow-rules.md +20 -15
  222. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/codebase-discovery.md +3 -1
  223. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/intermediate-format.md +115 -192
  224. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/mainflow-selection.md +27 -23
  225. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/project-dsl-contract.md +78 -153
  226. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/references/ui-mainflow-rules.md +36 -83
  227. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/scripts/compile_dsl.py +497 -556
  228. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/scripts/export_legacy_testagent.py +647 -0
  229. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/scripts/normalize_case_payloads.py +10 -3
  230. package/plugins/devflow-quality/skills/workflow-generate-mainflow-cases/scripts/validate_case_payloads.py +165 -275
  231. package/plugins/devflow-quality/skills/workflow-human-acceptance/SKILL.md +63 -0
  232. package/plugins/devflow-quality/skills/workflow-release-closeout/SKILL.md +4 -4
  233. package/plugins/devflow-quality/skills/workflow-run-acceptance-tests/SKILL.md +17 -9
  234. package/src/approval-store.ts +340 -0
  235. package/src/cli.ts +10 -0
  236. package/src/constants.ts +1 -1
  237. package/src/doctor.ts +268 -2
  238. package/src/initialization-store.ts +48 -1
  239. package/src/mcp/auth.ts +103 -0
  240. package/src/mcp/core.ts +102 -0
  241. package/src/mcp/server.ts +193 -0
  242. package/src/mcp/types.ts +5 -0
  243. package/src/paths.ts +12 -1
  244. package/src/project-context.ts +24 -1
  245. package/templates/omp/hook-config.json +6 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "schema_version": 1,
3
+ "runtime_version": "0.1.0",
4
+ "playwright_version": "1.63.0",
5
+ "files": {
6
+ "runner.spec.mjs": "5612cde9ddef5a203829d86ab45788d65cbe83891ff7dbb73c308aa9345ead83",
7
+ "playwright.config.mjs": "301c0b97e229f83e6934994718b11b93a1da5d46ec606cfd11a8292e9d622b02",
8
+ "reporter.mjs": "5c91d68c50a93603f583cf82345d427bcd9ce9a7cfb78fd6d0989abddbd55275",
9
+ "devflow-test-dsl-v1.schema.json": "21ce608adcaf60ac138b532b7731f3b74c3e2749cba26dfeb12fc12ce0b6e5f3"
10
+ }
11
+ }
@@ -43,6 +43,7 @@ description: "Use after integration verification and before change planning to d
43
43
  "acceptance_refs": ["AC-0001"],
44
44
  "requirement_refs": ["REQ-0001", "BR-0001"],
45
45
  "test_type": "api|page|permission|boundary|resilience|migration|performance",
46
+ "execution_surface": "http|ui|api_flow|project_test",
46
47
  "target": "外部可观察的 API、页面或运行边界",
47
48
  "preconditions": ["身份、数据和环境前置条件"],
48
49
  "steps": ["测试操作"],
@@ -52,6 +53,8 @@ description: "Use after integration verification and before change planning to d
52
53
  }
53
54
  ```
54
55
 
56
+ - `execution_surface` 必须显式填写:单个 Core HTTP 请求且断言来自 `execution` 用 `http`;真实页面交互用 `ui`;受限 DSL 中的多步骤 API 或 UI/API 组合用 `api_flow`;项目自有测试命令、权限、边界、韧性、迁移和性能专项用 `project_test`。`page` 必须对应 `ui`,带 `execution.protocol: http` 的 Core API TC 必须对应 `http`;新冻结 TC 缺失或冲突会被 CP-3 拒绝。
57
+ - `automated` 的 `ui` / `api_flow` TC 在 `run-acceptance-tests` 绑定阶段必须有 v1 DSL(`workflow-generate-mainflow-cases` 生成,`covers` 逐条映射 `preconditions[i]`、`steps[i]` 和 `oracle`)并经用户批准 `execution_plan`,否则只会 blocked。因此每个前置条件和步骤要写成可单独映射的原子条目,oracle 要写成确定性的可观察结果(具体文案、URL、响应字段);需要纯视觉判断、缺少稳定 locator 或无法准备/隔离数据的场景,现在就标 `manual` 或 `blocked`,不要标 `automated`。
55
58
  - `manual` 额外写 `manual_reason` 和 `owner`;`blocked` 额外写 `blocked_by` 和 `owner`。
56
59
  - `replay`:可用稳定步骤再次触发,必须写 `replay_scope`(`component|page|api|integration`)。页面优先拆到组件、页面、接口或集成边界,不要求 AI 在真实环境盲目重试。
57
60
  - `causal`:用于已由 HAR、控制台、DOM 快照、服务日志或请求链路证明首个偏差、但暂不能稳定重放的缺陷。必须写 `causal_evidence_refs`(已有 `SRC-*` / `CODE-*`)和 `first_divergence`;后续执行绑定还必须提供实际证据文件,Core 会哈希留档。没有这些证据不能称为“已证实”。
@@ -1,55 +1,59 @@
1
1
  ---
2
2
  name: workflow-generate-mainflow-cases
3
- description: "Use after workflow-execute-phase to bind frozen API/page TC acceptance intent to importable positive mainflow automation cases."
3
+ description: "Use after code review, as the binding-phase prerequisite of run-acceptance-tests, to compile one deterministic devflow-test-dsl/v1 file per frozen automated ui/api_flow TC, validate the whole generated-cases directory, get an independent AI review, and propose execution_plan approvals for the user."
4
4
  ---
5
5
 
6
- # 主流程自动化用例生成
6
+ # 主流程自动化用例生成(Playwright DSL)
7
7
 
8
- 在 `execute` 完成后运行本 skill,生成当前测试聚合平台可导入的正向主流程自动化用例。只生成 `api-mainflow` 和 `ui-mainflow` 用例,不生成异常、边界、权限、安全、性能专项。
8
+ 为冻结套件中 `automation_mode: automated` 且 `execution_surface` 为 `ui` 或 `api_flow` 的正向主流程 TC 生成确定性的 `devflow-test-dsl/v1`,每个 TC 一个文件,交给 Devflow Playwright Runtime 执行。**这是 `run-acceptance-tests` 的真实前置条件**:没有 DSL 并经用户批准 `execution_plan` 的自动化 ui/api_flow TC 只会 `blocked(dsl_not_approved)`,不能进入收口。不生成异常、边界、权限、安全、性能专项;这些 TC 按 `run-acceptance-tests` 的降级规则处理。
9
9
 
10
10
  ## Hard Rules
11
11
 
12
12
  - MUST NOT hardcode `platform-backend` or `platform-frontend`.
13
13
  - MUST derive code roots from `.devflow/planning/navigation` and `.devflow/context/spec`.
14
14
  - MUST use `.devflow/planning/code-index/` for fine-grained entrypoint, route, component, API, call, import, and data-flow evidence when present.
15
- - MUST only generate `api-mainflow` and `ui-mainflow` cases.
16
- - MUST read the frozen `.devflow/planning/requirements/{feature}/tests.json` before selecting case scope. Only frozen positive `TC-*` with `test_type: api` or `page` may produce mainflow cases. Core-generated API TC carrying `execution.expect.error_code` is a negative/exception case and is excluded here; it is executed by `run-acceptance-tests`.
17
- - MUST NOT read `SUMMARY.md`, delivery self-reports, or diffs to decide what to test. Current code is allowed only to bind an already frozen TC to an entrypoint, selector, request, or runner adapter.
18
- - MUST run `scripts/compile_dsl.py` before final output.
19
- - MUST run `scripts/validate_case_payloads.py` before reporting success.
15
+ - MUST read the frozen `.devflow/planning/requirements/{feature}/tests.json` before selecting scope. Only frozen, `confirmed`, `automation_mode: automated` TCs whose `execution_surface` is `ui` or `api_flow` get a DSL (legacy `page` TCs derive to `ui`). `http` TCs (including Core-generated API TCs with `execution.expect.error_code`) and `project_test` TCs are executed by their own adapters, not here.
16
+ - MUST NOT read `SUMMARY.md`, delivery self-reports, or diffs to decide what to test. Current code is allowed only to bind an already frozen TC to an entrypoint, `data-testid`/locator, request path, or test data; it must never change the TC's steps or oracle.
17
+ - MUST NOT hand-write or hand-edit `TC-xxxx.json`. Write `case-descriptions.json` and run `compile_dsl.py`; the compiler owns `tc_sha256`, target/driver generation, and hard rejections (`ai_only`, Midscene, xpath, scripts, token injection, fixed waits).
18
+ - MUST run `compile_dsl.py`, then `validate_case_payloads.py` on the whole `generated-cases/{feature}` directory, before reporting success. Block if either exits non-zero.
20
19
  - MUST block if codebase discovery fails.
21
- - MUST block if generated DSL fails validation.
20
+ - MUST get an independent AI review of every DSL against its TC oracle (advisory) before proposing approvals. The reviewer must not be the agent that wrote the descriptions.
21
+ - MUST propose one `execution_plan` approval per automated TC with `devflow_approval`; only the user can approve it, in `/devflow` → “待审批”. The agent cannot confirm, must not write approval records, and must not treat an unapproved DSL as accepted.
22
+ - MUST NOT create `case-import-payloads.json`. That name belongs only to the explicit legacy TestAgent export and is never a Runtime DSL artifact (see Legacy export).
22
23
 
23
24
  ## Workflow Position
24
25
 
25
- This step sits between code execution and frozen acceptance execution. It runs after `execute` alongside `code-review`; `run-acceptance-tests` consumes both gates:
26
+ This skill is not a workflow step and must not appear in `pending_steps` or participate in main-chain ordering. It runs inside the binding phase of `run-acceptance-tests`:
26
27
 
27
- `execute -> code-review + generate-mainflow-cases -> run-acceptance-tests -> release-closeout`
28
+ `execute -> code-review -> [human acceptance] -> generate DSL (this skill) -> bind + user approves execution plans -> run-acceptance-tests -> release closeout`
28
29
 
29
- The workflow step id is `generate-mainflow-cases`, order `86`, and it depends on `execute`.
30
+ Before running, verify that the current feature's `code-review` is completed and the frozen TC suite is fresh (`devflow_acceptance_tests(feature)`). A generation, validation, or approval failure means the affected TCs cannot run as `devflow_playwright`; report it and either fix it or downgrade the TC (`manual` with a `mode_override` approval, or `blocked` with owner/reason). It never mutates workflow state itself.
30
31
 
31
32
  ## Required Outputs
32
33
 
33
- Always create or update:
34
+ Always create or update, under `.devflow/planning/generated-cases/{feature}/`:
34
35
 
35
- - `.devflow/planning/generated-cases/{feature}/source-map.md`
36
- - `.devflow/planning/generated-cases/{feature}/mainflow-analysis.md`
37
- - `.devflow/planning/generated-cases/{feature}/case-descriptions.json`
38
- - `.devflow/planning/generated-cases/{feature}/case-import-payloads.json`
39
- - `.devflow/planning/generated-cases/{feature}/validation-report.md`
40
- - `.devflow/planning/phases/{phase}/MAINFLOW-CASES.md`
36
+ - `source-map.md` — frozen TC ID, planning evidence, code-index evidence, source files, and the source of every non-testid locator.
37
+ - `mainflow-analysis.md` — included/excluded TCs with reasons (including TCs that need downgrade), assumptions, traceability.
38
+ - `case-descriptions.json` — the AI-written input (`references/intermediate-format.md`).
39
+ - `TC-xxxx.json` — one v1 DSL per automated ui/api_flow TC, written by `compile_dsl.py` only.
40
+ - `validation-report.md` — output of the directory validation.
41
+ - `ai-review.md` — the independent review findings per TC (advisory).
41
42
 
42
- The discovery script also writes support artifact `.devflow/planning/generated-cases/{feature}/codebase-discovery.json`.
43
+ Also `.devflow/planning/phases/{phase}/MAINFLOW-CASES.md` (summary) and support artifact `codebase-discovery.json` (written by the discovery script).
44
+
45
+ `case-import-payloads.json` is **not** an output of this skill.
43
46
 
44
47
  ## Resource Loading
45
48
 
46
49
  Read these references before generating cases:
47
50
 
48
51
  - `references/codebase-discovery.md` before scanning any source file.
49
- - `references/mainflow-selection.md` before deciding which flows become cases.
50
- - `references/intermediate-format.md` before writing `case-descriptions.json`.
51
- - `references/api-mainflow-rules.md` before generating API cases.
52
- - `references/ui-mainflow-rules.md` before generating UI cases.
52
+ - `references/mainflow-selection.md` before deciding which TCs become DSL.
53
+ - `references/intermediate-format.md` before writing `case-descriptions.json` (the exact accepted format).
54
+ - `references/project-dsl-contract.md` for the v1 DSL shape, `covers`, and the approval/hash rules.
55
+ - `references/api-mainflow-rules.md` before generating `api_flow` cases.
56
+ - `references/ui-mainflow-rules.md` before generating `ui` cases.
53
57
 
54
58
  ## Process
55
59
 
@@ -62,7 +66,7 @@ Read these references before generating cases:
62
66
 
63
67
  Stop if it exits non-zero.
64
68
 
65
- 3. Read the frozen TC suite first. Record the source `TC-*` for every selected mainflow case; a missing or stale source TC is a blocker. Then read planning inputs when present:
69
+ 3. Read the frozen TC suite first and list every `automated` TC whose surface is `ui` or `api_flow`. Record the source `TC-*` for each; a missing or stale TC is a blocker. Then read planning inputs when present:
66
70
  - `.devflow/planning/requirements/baseline.md`
67
71
  - `.devflow/planning/features/{feature}/功能点梳理.md`
68
72
  - `.devflow/planning/features/{feature}/UI-SPEC.md`
@@ -71,57 +75,66 @@ Read these references before generating cases:
71
75
  - `.devflow/planning/features/{feature}/变更清单.md`
72
76
  - `.devflow/planning/features/{feature}/PROGRESS.md`
73
77
 
74
- 4. Read discovery output, then read each discovered codebase's navigation and spec files. Select scan targets by codebase type:
78
+ 4. Read discovery output, then each discovered codebase's navigation and spec files. Select scan targets by codebase type:
75
79
  - Backend: router/controller, service/usecase, schema/dto/request/response, model/entity, API entry.
76
80
  - Frontend: router, pages/views, api/client, types/contracts, stores/hooks/components related to the feature.
77
81
 
78
- 5. If `.devflow/planning/code-index/` exists, query symbols and relations for candidate entrypoints and mainflow paths:
82
+ 5. If `.devflow/planning/code-index/` exists, query symbols and relations for candidate entrypoints and flows:
79
83
  - Backend/API: `routes_to`, `calls`, `reads`, `writes`, `config_uses`, `tested_by`.
80
84
  - Frontend/UI: route/page/component symbols, `routes_to`, `imports`, `calls` into API clients, store/hook relations.
81
- Read `evidence_path:evidence_line` before using an edge in case selection.
82
- 6. Inspect actual code paths that are both relevant to `{feature}` and reachable from navigation/spec/code-index. Do not scan excluded historical modules.
83
- 7. Write `source-map.md` with the frozen TC ID, planning evidence, code-index evidence when used, source evidence, and selected source files for each candidate case.
84
- 8. Write `mainflow-analysis.md` with included API/UI positive mainflows, excluded non-mainflows, assumptions, and traceability to frozen TC plus source evidence.
85
- 9. Write `case-descriptions.json` using the simplified format in `references/intermediate-format.md`. **Do NOT write raw DSL** — use locator strings like `"text:编辑"`, `"placeholder:请输入名称"`, `"css:.el-dialog__footer .el-button--primary"`.
86
- 10. Compile descriptions into strict DSL:
85
+ Read `evidence_path:evidence_line` before using an edge.
86
+ 6. Inspect actual code paths that are both relevant to `{feature}` and reachable from navigation/spec/code-index. Prefer `data-testid` for locators. Do not scan excluded historical modules.
87
+ 7. Write `source-map.md`, then `mainflow-analysis.md`.
88
+ 8. Write `case-descriptions.json` using `references/intermediate-format.md`: one case per TC, locator strings such as `"testid:save-btn"`, `"role:button:确定"`, `"label:用户名"`, and a `covers` mapping that covers every precondition, every step, and the oracle of the TC. Do NOT write raw DSL.
89
+ 9. Compile (writes one `TC-xxxx.json` per TC into `.devflow/planning/generated-cases/{feature}/`; all-or-nothing):
87
90
 
88
91
  ```text
89
- devflow_mainflow(action="compile", args=[".devflow/planning/generated-cases/{feature}/case-descriptions.json", "--output", ".devflow/planning/generated-cases/{feature}/case-import-payloads.json"])
92
+ devflow_mainflow(action="compile", args=[".devflow/planning/generated-cases/{feature}/case-descriptions.json", "--feature", "{feature}"])
90
93
  ```
91
94
 
92
- Stop if it exits non-zero. The compiler owns all target key selection, strategy decisions, and assertion formatting.
95
+ Stop and fix the descriptions if it exits non-zero. Do not pass `--output`: it no longer exists (only `--output-dir`, whose default is already the directory above) and the compiler rejects it. Compiler warnings (non-testid locators, high-risk texts) go into `source-map.md`/the handoff; prefer replacing them by a `data-testid`.
93
96
 
94
- 11. Validate compiled payloads:
97
+ 10. Validate the whole directory (pure data, never loads project code):
95
98
 
96
99
  ```text
97
- devflow_mainflow(action="validate", args=[".devflow/planning/generated-cases/{feature}/case-import-payloads.json", "--discovery", ".devflow/planning/generated-cases/{feature}/codebase-discovery.json", "--output", ".devflow/planning/generated-cases/{feature}/validation-report.md"])
100
+ devflow_mainflow(action="validate", args=[".devflow/planning/generated-cases/{feature}", "--suite", ".devflow/planning/requirements/{feature}/tests.json", "--output", ".devflow/planning/generated-cases/{feature}/validation-report.md"])
98
101
  ```
99
102
 
100
- Stop if it exits non-zero.
103
+ Stop if it exits non-zero. Read the warnings: an automated ui/api_flow TC listed as having no DSL will be blocked as `dsl_not_approved`.
104
+
105
+ 11. Independent AI review (advisory). Have a different agent than the author review each DSL against its frozen TC: read only the TC (`preconditions`, `steps`, `oracle`) and the DSL, and list omissions, weak assertions, assertions on the wrong object, ambiguous or unstable locators, missing data isolation, and any step that does not follow from the TC. Write the findings per TC to `ai-review.md`. Serious findings should be fixed by editing `case-descriptions.json` and repeating steps 9–11; any DSL byte change invalidates approval for that TC. The review never counts as a pass.
106
+
107
+ 12. Propose an execution plan per automated TC (one item per TC; `dsl_file` defaults to `.devflow/planning/generated-cases/{feature}/{tc_id}.json`):
108
+
109
+ ```text
110
+ devflow_approval(action="propose", feature="{feature}", kind="execution_plan",
111
+ items=[{"subject":"TC-0001","dsl_file":".devflow/planning/generated-cases/{feature}/TC-0001.json","review_issues":["<advisory issue from ai-review.md>"],"note":"<optional context>"}])
112
+ ```
101
113
 
102
- 11. Write `.devflow/planning/phases/{phase}/MAINFLOW-CASES.md` summarizing:
103
- - Generated case count by tag.
104
- - Import payload path.
105
- - Validation status.
106
- - Source evidence index.
107
- - Any environment data needed before execution.
114
+ Core pins `suite_graph_revision`, `suite_fingerprint`, `tc_sha256` and `dsl_sha256` and re-runs structural validation; the proposal is all-or-nothing. It requires database authority. Then ask the user to review each TC (oracle text, covering assertions, review issues) and decide in `/devflow` → “待审批”. Re-running `devflow_approval(action="list", feature="{feature}")` shows proposal status; do not wait on, simulate, or write approvals.
108
115
 
109
- 12. Report success only after compilation and validation pass.
116
+ 13. Write `.devflow/planning/phases/{phase}/MAINFLOW-CASES.md` summarizing: TC IDs and DSL paths, validation status, review issues, approval proposal status, downgrade candidates, environment data/profile needed.
117
+ 14. Report success only after compile, validate, and propose succeeded. Return a handoff containing the source TC IDs, DSL directory, `validation-report.md` and `ai-review.md` paths, proposal IDs/status, required environment/test data, TCs without DSL, and any gaps. Do not advance workflow state.
118
+
119
+ If a TC's DSL needs to change after it was approved (TC refrozen, code changed, review findings), recompile, revalidate, re-review, and propose again. Recompiling an unchanged description yields byte-identical output, so existing approvals stay valid.
110
120
 
111
121
  ## AI Scope
112
122
 
113
123
  AI is responsible for semantic judgment only:
114
124
 
115
- - Determine API/page test scope from frozen `TC-*`, not from implementation delivery prose.
116
- - Confirm implemented behavior from actual code.
117
- - Identify positive API mainflows.
118
- - Identify positive UI mainflows.
119
- - Generate `case-descriptions.json` in simplified intermediate format.
120
- - Record source evidence for each case.
121
-
122
- AI is NOT responsible for DSL formatting. The `compile_dsl.py` script owns:
123
- - Target key selection (`label`, `css`, `placeholder`, etc.)
124
- - Strategy decisions (`structured_first` vs `ai_only`)
125
- - Assertion type selection and formatting
126
- - Auth step generation
127
- - Step ID assignment and dependency wiring
125
+ - Decide which frozen TCs are eligible and which need downgrade.
126
+ - Confirm implemented behavior from actual code and bind entrypoints, locators, request paths, and data.
127
+ - Write `case-descriptions.json` faithful to each TC and its `covers`.
128
+ - Record source evidence in `source-map.md`.
129
+ - Review (as a different agent) each DSL against the oracle.
130
+
131
+ AI is NOT responsible for, and cannot override:
132
+
133
+ - DSL formatting, `tc_sha256`, target key selection, and step ID assignment (`compile_dsl.py`).
134
+ - Schema, semantic, secret-literal, and structural coverage checks (Core `dsl_v1`/`dsl_coverage` via `validate_case_payloads.py`).
135
+ - The approval of an execution plan or environment profile (only the user, in `/devflow`).
136
+ - Any pass/fail verdict (only Core's `run-acceptance-tests`).
137
+
138
+ ## Legacy export
139
+
140
+ Only when a developer explicitly asks for a TestAgent import file, run `scripts/export_legacy_testagent.py` directly with a separate legacy-format input and an explicit `--output` (for example `.devflow/planning/generated-cases/{feature}/legacy-testagent-import.json`). It is not exposed by `devflow_mainflow`, is not part of the gate, and its output cannot be bound to `devflow_playwright`, approved as an execution plan, or counted as an acceptance result. Never write its output as `TC-xxxx.json` and never describe it as a Runtime DSL artifact.
@@ -1,27 +1,32 @@
1
1
  # API Mainflow Rules
2
2
 
3
- API cases validate successful backend behavior through importable DSL.
3
+ 这里的 API 用例指冻结的、自动化的 `execution_surface: api_flow` TC:需要多步骤链式请求(变量提取、前后依赖)或 UI/API 组合,用 v1 DSL 表达。单个 Core HTTP 请求且断言来自冻结 TC 的 `execution` 的 API TC 是 `execution_surface: http`,由 Core 的 `http` adapter 直接执行,**不**生成 DSL;带 `execution.expect.error_code` 的异常码 TC 同理,本 Skill 不处理。
4
+
5
+ AI 写 `case-descriptions.json`(`intermediate-format.md`),`compile_dsl.py` 生成 `TC-xxxx.json`(`project-dsl-contract.md`)。
4
6
 
5
7
  ## Step Rules
6
8
 
7
- - Use `driver: "api"`.
8
- - Use HTTP method as `action`: `get`, `post`, `put`, `patch`, `delete`, `head`, or `options`.
9
- - Set `params.url` for every API step.
10
- - Put query values under `params.params`.
11
- - Put JSON request payloads under `params.json` or `params.body`.
12
- - Add success assertions for status code and key response fields where code/planning provide them.
13
- - Extract ids or tokens only into variables, never literal secrets.
14
- - Use `depends_on` to model required execution order.
9
+ - 每个请求是一个 API 步骤:`action` 写 `request` 并给 `method`,或直接写 `get`/`post`/`put`/`patch`/`delete`(`head`/`options` 不支持)。
10
+ - `url` 必填:以 `/` 开头相对已批准 profile 的 `api_base_url`(缺省 `base_url`);绝对 URL 的 origin 必须在 profile `api_origins` 中。不要把环境相关主机写死,也不要写变量 `${base_url}`(不是内置变量)。
11
+ - 查询参数写 `query`(标量),请求体写 `json`,请求头写 `headers`。
12
+ - 成功断言:`expect_status`,以及响应体断言 `assertions: [{ "pointer": "/data/status", "op": "equals", "value": "created" }]`(`op`:`equals`/`not_equals`/`contains`/`exists`/`not_exists`,JSON Pointer)。只写 `expect_status: 200` 且没有响应体断言,覆盖 oracle 时会被判为弱断言。没有 `status_code`/`json_path_*`/`regex` 之类旧断言类型。
13
+ - 用 `extract: { "order_id": "/data/id" }` 把 id 提取成变量,后续步骤用 `${order_id}`。只支持 JSON Pointer;提取到的令牌等敏感值写 `{ "pointer": "...", "sensitive": true }`。
14
+ - 步骤按写入顺序执行,没有 `depends_on`;失败即停止。
15
+ - 默认不重试;只有传输失败才可声明 `retry`,POST/PATCH 还需 `idempotent: true`。
16
+ - 凭据用 `variables` 的 `{ "secret": "ENV_KEY" }`,请求头写 `"Authorization": "Bearer ${auth_token}"`;不得出现 token/密码/cookie 字面量。
17
+ - 需要前置数据用 `data.setup`,清理用 `data.cleanup`(都只能是 API 步骤)。
15
18
 
16
- ## Source Evidence
19
+ ## covers 与 TC 忠实性
17
20
 
18
- Cite at least one planning artifact and one code artifact per case:
21
+ - TC 的每个前置条件(对应 `data.setup` 或步骤的 `covers.preconditions`)、每个步骤都要被某个 DSL 步骤覆盖,oracle 要被带 `assertions`/`expect_status` 的主流程 API 步骤覆盖:`covers: ["oracle"]`。
22
+ - DSL 不得增删或改写 TC 的步骤与 oracle;源码只补充路径、字段名和请求体。
23
+
24
+ ## Source Evidence
19
25
 
20
- - Planning: backend tech spec, change list, feature breakdown, or requirement baseline.
21
- - Code: router/controller and service/usecase, plus schema/model when they define the contract.
26
+ 每个 case 在 `source-map.md` 里至少引用一份规划产物(后端技术方案、变更清单、功能点梳理或需求基线)和一份代码产物(路由/控制器、service/usecase,以及定义契约的 schema/model)。证据不写入 DSL。
22
27
 
23
28
  ## Positive Mainflow Boundary
24
29
 
25
- Allowed: create/list/detail/update/execute success flow for the current feature.
30
+ 生成范围:当前功能的创建/查询/详情/更新/执行成功链路。
26
31
 
27
- Not allowed: invalid request, unauthorized access, missing resource, validation error, conflict, retry, timeout, or performance scenario.
32
+ 不生成:非法请求、未授权、资源缺失、校验错误、冲突、重试/超时场景、性能场景。这些 TC 走 Core HTTP adapter、项目自有 command 或降级为 `manual`/`blocked`。
@@ -2,6 +2,8 @@
2
2
 
3
3
  Use discovery before reading feature source files. The goal is to make the skill portable across projects that have valid `.devflow/planning` and `.devflow/context/spec` initialization artifacts.
4
4
 
5
+ Discovery only locates code roots so that entrypoints, `data-testid`s, routes, and request shapes can be read for the frozen TCs. It is **not** an input to compilation or validation: `validate_case_payloads.py` is pure data and never loads project code (`--discovery` is deprecated and ignored).
6
+
5
7
  ## Required Sources
6
8
 
7
9
  Read and cross-check:
@@ -43,7 +45,7 @@ Use `codebase-discovery.json` fields:
43
45
  - `codebases[].stack_key`
44
46
  - `codebases[].scan_profile`
45
47
 
46
- Current project discovery should resolve `BACKEND` and `FRONTEND`, but this is an output fact, not a skill rule.
48
+ Current project discovery should resolve `BACKEND` and `FRONTEND`, but this is an output fact, not a skill rule. Reading a codebase only supplies binding facts (entry URL, locator, request path); it never changes a frozen TC's steps or oracle.
47
49
 
48
50
  ## Scan Range By Type
49
51