tuner-testkit 5.3.0__tar.gz → 5.3.1__tar.gz

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 (285) hide show
  1. {tuner_testkit-5.3.0/tuner_testkit.egg-info → tuner_testkit-5.3.1}/PKG-INFO +2 -2
  2. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/README.md +1 -1
  3. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/pyproject.toml +1 -1
  4. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/__init__.py +1 -1
  5. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/work-task.mdc +2 -2
  6. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/AGENTS.md +2 -2
  7. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/agent-task-log.md +1 -1
  8. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/artifacts-layout.md +3 -2
  9. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/metadata-conventions.md +1 -1
  10. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/work-task.md +3 -1
  11. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/store.py +46 -18
  12. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/tests/test_store.py +23 -0
  13. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1/tuner_testkit.egg-info}/PKG-INFO +2 -2
  14. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/LICENSE +0 -0
  15. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/setup.cfg +0 -0
  16. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/__init__.py +0 -0
  17. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/__main__.py +0 -0
  18. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/__init__.py +0 -0
  19. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/api.py +0 -0
  20. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/db.py +0 -0
  21. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/generators.py +0 -0
  22. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/ids.py +0 -0
  23. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/_internal/wait.py +0 -0
  24. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/base.py +0 -0
  25. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/context.py +0 -0
  26. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/action_words/registry.py +0 -0
  27. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/__init__.py +0 -0
  28. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/app.py +0 -0
  29. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/errors.py +0 -0
  30. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/router.py +0 -0
  31. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/spec.py +0 -0
  32. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_mock/store.py +0 -0
  33. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/__init__.py +0 -0
  34. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/auth.py +0 -0
  35. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/__init__.py +0 -0
  36. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/capture.py +0 -0
  37. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/codegen.py +0 -0
  38. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/freeze.py +0 -0
  39. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/mocks.py +0 -0
  40. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/normalize.py +0 -0
  41. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/pipeline.py +0 -0
  42. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_objects/recording/sanitize.py +0 -0
  43. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_test/__init__.py +0 -0
  44. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_test/client.py +0 -0
  45. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_test/errors.py +0 -0
  46. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_test/jsonpath.py +0 -0
  47. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/api_test/model.py +0 -0
  48. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/__init__.py +0 -0
  49. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/_shared/__init__.py +0 -0
  50. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/_shared/changelog.py +0 -0
  51. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/__init__.py +0 -0
  52. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/__main__.py +0 -0
  53. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/addon.py +0 -0
  54. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/cli.py +0 -0
  55. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/playwright_tap.py +0 -0
  56. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/tests/__init__.py +0 -0
  57. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/api_recorder/tests/test_addon.py +0 -0
  58. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/__init__.py +0 -0
  59. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/__main__.py +0 -0
  60. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/build.py +0 -0
  61. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/cli.py +0 -0
  62. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/bdd-asset-pipeline.md +0 -0
  63. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-self-learning.md +0 -0
  64. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-source-to-design.md +0 -0
  65. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks/sync_registry.py +0 -0
  66. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks.json +0 -0
  67. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/agent-task-log.mdc +0 -0
  68. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-authoring.mdc +0 -0
  69. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-handover.mdc +0 -0
  70. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/assets-knowledge.mdc +0 -0
  71. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-asset-layering.mdc +0 -0
  72. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-pipeline-gates.mdc +0 -0
  73. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-stage-layout.mdc +0 -0
  74. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/commit-convention.mdc +0 -0
  75. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/explore-safety.mdc +0 -0
  76. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/index-hygiene.mdc +0 -0
  77. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-db.mdc +0 -0
  78. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-fake.mdc +0 -0
  79. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-logging.mdc +0 -0
  80. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-page-test.mdc +0 -0
  81. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/testcases.mdc +0 -0
  82. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/analyze-mcp-network/SKILL.md +0 -0
  83. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-action-word/SKILL.md +0 -0
  84. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-app/SKILL.md +0 -0
  85. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-design-knowledge/SKILL.md +0 -0
  86. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-feature-sets/SKILL.md +0 -0
  87. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-test-design/SKILL.md +0 -0
  88. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/dump-ddl/SKILL.md +0 -0
  89. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/explore-sut/SKILL.md +0 -0
  90. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-authoring/SKILL.md +0 -0
  91. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-review-lint/SKILL.md +0 -0
  92. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/freeze-api-objects/SKILL.md +0 -0
  93. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/generate-test-report/SKILL.md +0 -0
  94. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-behave-steps/SKILL.md +0 -0
  95. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-index/SKILL.md +0 -0
  96. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-page-objects/SKILL.md +0 -0
  97. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testcases/SKILL.md +0 -0
  98. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/release-template/SKILL.md +0 -0
  99. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/reuse-analysis/SKILL.md +0 -0
  100. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-feature-playwright-mcp/SKILL.md +0 -0
  101. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-test-execution/SKILL.md +0 -0
  102. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/MANIFEST.txt +0 -0
  103. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/action-words-syntax.md +0 -0
  104. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/api-objects-syntax.md +0 -0
  105. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/apps-authoring-syntax.md +0 -0
  106. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/assets-knowledge-syntax.md +0 -0
  107. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/bdd-run-gherkin-in-playwrightMCP.md +0 -0
  108. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-gerkin-syntax.md +0 -0
  109. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-step-definitions.md +0 -0
  110. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/commit-convention.md +0 -0
  111. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/design-knowledge-syntax.md +0 -0
  112. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/page-objects-syntax.md +0 -0
  113. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/sut-self-learning.md +0 -0
  114. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/test-design-syntax.md +0 -0
  115. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/docs/spec/testcase-syntax.md +0 -0
  116. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/README.md +0 -0
  117. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/commit-msg +0 -0
  118. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-commit +0 -0
  119. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-push +0 -0
  120. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/secret_scan.py +0 -0
  121. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/validate_commit_msg.py +0 -0
  122. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/paths.py +0 -0
  123. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/source.py +0 -0
  124. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/targets.py +0 -0
  125. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/tests/test_cli.py +0 -0
  126. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dna/tests/test_targets.py +0 -0
  127. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/dump_ddl.py +0 -0
  128. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/__init__.py +0 -0
  129. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/__main__.py +0 -0
  130. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/cli.py +0 -0
  131. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/persist.py +0 -0
  132. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/tests/__init__.py +0 -0
  133. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/tests/test_cli.py +0 -0
  134. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/evidence/tests/test_persist.py +0 -0
  135. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/index_ai/__init__.py +0 -0
  136. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/index_ai/__main__.py +0 -0
  137. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/index_ai/registry.py +0 -0
  138. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/__init__.py +0 -0
  139. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/__main__.py +0 -0
  140. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/manifest.py +0 -0
  141. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/scaffold.py +0 -0
  142. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/INDEX.project.md +0 -0
  143. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/apps/__init__.py +0 -0
  144. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/behave.ini +0 -0
  145. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/config/env.py +0 -0
  146. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/data/sut-accounts.example.yaml +0 -0
  147. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/gitignore +0 -0
  148. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/__init__.py +0 -0
  149. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/action_words/__init__.py +0 -0
  150. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/__init__.py +0 -0
  151. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/params.py +0 -0
  152. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/action_words/models.py +0 -0
  153. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/__init__.py +0 -0
  154. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/auth.py +0 -0
  155. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/recording/__init__.py +0 -0
  156. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/registry.py +0 -0
  157. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/__init__.py +0 -0
  158. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/session.py +0 -0
  159. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/api_environment.py +0 -0
  160. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/given.py +0 -0
  161. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/then.py +0 -0
  162. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/when.py +0 -0
  163. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_environment.py +0 -0
  164. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/given.py +0 -0
  165. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/then.py +0 -0
  166. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/when.py +0 -0
  167. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/tests/pytest/conftest.py +0 -0
  168. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/workbench.cmd +0 -0
  169. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/stubs/workbench.sh +0 -0
  170. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/tests/test_git_hooks.py +0 -0
  171. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/init_repo/tests/test_scaffold.py +0 -0
  172. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/mock_server/__init__.py +0 -0
  173. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/mock_server/__main__.py +0 -0
  174. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/mock_server/cli.py +0 -0
  175. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/mock_server/seed.py +0 -0
  176. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/mock_server/tool.py +0 -0
  177. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/__init__.py +0 -0
  178. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/__main__.py +0 -0
  179. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/capture.py +0 -0
  180. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/cli.py +0 -0
  181. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/codegen.py +0 -0
  182. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/freeze.py +0 -0
  183. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/inject.py +0 -0
  184. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/session.py +0 -0
  185. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/tests/__init__.py +0 -0
  186. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/tests/test_capture.py +0 -0
  187. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/tests/test_cli.py +0 -0
  188. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/page_recorder/tests/test_freeze.py +0 -0
  189. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/recorder/__init__.py +0 -0
  190. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/recorder/__main__.py +0 -0
  191. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/recorder/cli.py +0 -0
  192. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/recorder/tests/__init__.py +0 -0
  193. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/recorder/tests/test_cli.py +0 -0
  194. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/__init__.py +0 -0
  195. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/__main__.py +0 -0
  196. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/cli.py +0 -0
  197. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/apps/task/validate.py +0 -0
  198. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/artifacts.py +0 -0
  199. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/__init__.py +0 -0
  200. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/build.py +0 -0
  201. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/directory.py +0 -0
  202. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/front_matter.py +0 -0
  203. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/scan.py +0 -0
  204. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/tests/test_build.py +0 -0
  205. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/tests/test_directory.py +0 -0
  206. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/catalog/tests/test_front_matter.py +0 -0
  207. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/config.py +0 -0
  208. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/db/__init__.py +0 -0
  209. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/db/client.py +0 -0
  210. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/db/connection.py +0 -0
  211. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/excel/__init__.py +0 -0
  212. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/excel/workbook.py +0 -0
  213. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/__init__.py +0 -0
  214. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/__main__.py +0 -0
  215. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/catalog.py +0 -0
  216. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/china.py +0 -0
  217. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/cli.py +0 -0
  218. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/core.py +0 -0
  219. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/medical.py +0 -0
  220. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/fake/wrappers.py +0 -0
  221. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/__init__.py +0 -0
  222. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/context.py +0 -0
  223. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/core.py +0 -0
  224. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/helpers.py +0 -0
  225. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/hooks.py +0 -0
  226. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/logging/scenario_file.py +0 -0
  227. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/__init__.py +0 -0
  228. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/__main__.py +0 -0
  229. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/base.py +0 -0
  230. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/driver.py +0 -0
  231. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/errors.py +0 -0
  232. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/harvest.py +0 -0
  233. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/health.py +0 -0
  234. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/locator.py +0 -0
  235. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/model.py +0 -0
  236. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/registry.py +0 -0
  237. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/session.py +0 -0
  238. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/steps.py +0 -0
  239. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/page_test/testing.py +0 -0
  240. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/project.py +0 -0
  241. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/testcases/__init__.py +0 -0
  242. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/testcases/__main__.py +0 -0
  243. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/testcases/tests/test_validate.py +0 -0
  244. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/testcases/validate.py +0 -0
  245. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/tools/__init__.py +0 -0
  246. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/tools/manifest.py +0 -0
  247. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/tools/runner.py +0 -0
  248. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/tools/tests/test_manifest.py +0 -0
  249. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/tools/tests/test_runner.py +0 -0
  250. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/__init__.py +0 -0
  251. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/__main__.py +0 -0
  252. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/app.py +0 -0
  253. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/cli.py +0 -0
  254. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/kinds/__init__.py +0 -0
  255. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/kinds/app_generic.py +0 -0
  256. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/kinds/word_db_seed.py +0 -0
  257. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/kinds/word_generic.py +0 -0
  258. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/static/app.css +0 -0
  259. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/_params_form.html +0 -0
  260. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/ai.html +0 -0
  261. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/ai_detail.html +0 -0
  262. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/base.html +0 -0
  263. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/env.html +0 -0
  264. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/history.html +0 -0
  265. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/home.html +0 -0
  266. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/knowledge.html +0 -0
  267. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/run.html +0 -0
  268. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/tool.html +0 -0
  269. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/tools.html +0 -0
  270. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/word.html +0 -0
  271. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/word_db_seed.html +0 -0
  272. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/templates/words.html +0 -0
  273. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workbench/tests/test_app.py +0 -0
  274. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/__init__.py +0 -0
  275. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/__main__.py +0 -0
  276. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/cli.py +0 -0
  277. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/index_render.py +0 -0
  278. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/meta.py +0 -0
  279. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/tests/test_index_render.py +0 -0
  280. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit/workspace/tests/test_meta.py +0 -0
  281. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit.egg-info/SOURCES.txt +0 -0
  282. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit.egg-info/dependency_links.txt +0 -0
  283. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit.egg-info/entry_points.txt +0 -0
  284. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit.egg-info/requires.txt +0 -0
  285. {tuner_testkit-5.3.0 → tuner_testkit-5.3.1}/tuner_testkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuner-testkit
3
- Version: 5.3.0
3
+ Version: 5.3.1
4
4
  Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
5
5
  Author: tuner-testkit contributors
6
6
  License-Expression: MIT
@@ -221,4 +221,4 @@ uv sync --extra all
221
221
  (被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
222
222
  验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
223
223
 
224
- 5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
224
+ 5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
@@ -173,4 +173,4 @@ uv sync --extra all
173
173
  (被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
174
174
  验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
175
175
 
176
- 5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
176
+ 5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tuner-testkit"
3
- version = "5.3.0"
3
+ version = "5.3.1"
4
4
  description = "Shared test runtime, recorders, and DNA overlay for SUT test repos"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -2,4 +2,4 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "5.3.0"
5
+ __version__ = "5.3.1"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Work tasks live in work/tasks. When a human must choose a missing evidence channel, write an inbox question and block the task instead of inventing the channel.
3
3
  alwaysApply: true
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  ---
6
6
 
7
7
  # 工作任务与人类提问
@@ -15,7 +15,7 @@ version: 1.0.0
15
15
  - 端到端点击用 `type: test-execution`,`design` 指向已有测试设计;报告写入 `assets/testreport/`,证据用 `tuner-evidence persist` 或 `attach` 挂上 `task_id`、截图、脱敏日志、接口 JSON。
16
16
  - 执行结束后把结果写入该测试设计的「执行反馈」,只引用证据路径。
17
17
  - 仓库没有写明的证据通道(典型是后端日志:SSH 目录、日志接口、Rancher API)立刻 `tuner-task ask`。日志主题用 `sut-log-source`。
18
- - 提问写入 `artifacts/inbox/questions/` 后停止这一支,把任务保持在 `blocked`,直到 `tuner-task answer`。
18
+ - 提问写入 `artifacts/inbox/questions/` 后停止这一支,把任务保持在 `blocked`,直到 `tuner-task answer`。回答后的问题文件在 `artifacts/inbox/archived-question/`。
19
19
 
20
20
  ## Must not
21
21
 
@@ -1,4 +1,4 @@
1
- <!-- version: 1.7.0 -->
1
+ <!-- version: 1.7.1 -->
2
2
  # AGENTS — 平台总入口(轻量 DM)
3
3
 
4
4
  > 本文件是"repo as a platform"的**稳定世界观**:只写不常变的分层结构与角色。
@@ -21,7 +21,7 @@
21
21
  | 测试层 | `tests/` | 自动化测试代码(behave `features/` + `pytest/`)。 | behave / pytest |
22
22
  | 文档层 | `docs/` | 仓库使用说明与规范(`docs/spec/**`)。 | 只读 |
23
23
 
24
- 配套:`config/`(环境/数据源)、`.cursor/`(AI 组件,见下)、`work/tasks/`(入库的任务上下文,规范 `docs/spec/work-task.md`)、`artifacts/`·`logs/`(运行产出,规范 `docs/spec/artifacts-layout.md`:MCP evidence 落 `artifacts/evidence/<run_id>/`;agent 任务记录落 `artifacts/inbox/`;阻塞式人类提问落 `artifacts/inbox/questions/`;工具运行落 `artifacts/runs/<run_id>/`;回归报告落 `artifacts/reports/<run_id>/`,每个 run 目录带 `manifest.json`)。SUT 登录本机文件:`data/sut-accounts.local.yaml`(gitignore)。
24
+ 配套:`config/`(环境/数据源)、`.cursor/`(AI 组件,见下)、`work/tasks/`(入库的任务上下文,规范 `docs/spec/work-task.md`)、`artifacts/`·`logs/`(运行产出,规范 `docs/spec/artifacts-layout.md`:MCP evidence 落 `artifacts/evidence/<run_id>/`;agent 任务记录落 `artifacts/inbox/`;阻塞式人类提问未回答时落 `artifacts/inbox/questions/`,回答后移到 `artifacts/inbox/archived-question/`;工具运行落 `artifacts/runs/<run_id>/`;回归报告落 `artifacts/reports/<run_id>/`,每个 run 目录带 `manifest.json`)。SUT 登录本机文件:`data/sut-accounts.local.yaml`(gitignore)。
25
25
 
26
26
  ## 2. 三角色
27
27
 
@@ -72,7 +72,7 @@ evidence:
72
72
  artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md
73
73
  ```
74
74
 
75
- 字段与命令见 `docs/spec/work-task.md`。提问后把对应 `work/tasks` 标为 `blocked`。回答写入任务的 `## Decisions`;可复用的通道说明策展到 `assets/domain-notes/`。
75
+ 回答后同一文件移到 `artifacts/inbox/archived-question/`。字段与命令见 `docs/spec/work-task.md`。提问后把对应 `work/tasks` 标为 `blocked`。回答写入任务的 `## Decisions`;可复用的通道说明策展到 `assets/domain-notes/`。
76
76
 
77
77
  ## 5. 密钥
78
78
 
@@ -16,7 +16,8 @@ description: 交付物目录 artifacts/ 的子目录职责、run 级 manifest.js
16
16
  artifacts/
17
17
  ├── evidence/<run_id>/ # Playwright MCP / 网络 dump(tuner-evidence persist);脱敏;gitignore
18
18
  ├── inbox/<utc>-<agent>-<slice>.md # agent 任务记录(agent-task-log.md);gitignore
19
- ├── inbox/questions/Q-<YYYYMMDD>-<nnn>.md # 阻塞式人类提问(work-task.md);gitignore
19
+ ├── inbox/questions/Q-<YYYYMMDD>-<nnn>.md # 未回答的人类提问(work-task.md);gitignore
20
+ ├── inbox/archived-question/Q-<YYYYMMDD>-<nnn>.md # 已回答的提问;gitignore
20
21
  ├── runs/<run_id>/ # 工具 / 动作词的一次运行(tuner-workspace run、工作台);gitignore
21
22
  ├── reports/<run_id>/ # 一次回归(behave / pytest)的报告与摘要;gitignore
22
23
  ├── catalogs/workspace.json # tuner-workspace catalog 产物;gitignore
@@ -68,7 +69,7 @@ artifacts/
68
69
  | behave(`*_environment.py` 钩子) | `reports/<run_id>/` | `summary.json`(feature/scenario 状态)、`manifest.json`;`-f html-pretty -o $TUNER_REPORT_DIR/report.html` 时 html 同目录 |
69
70
  | pytest | `reports/<run_id>/` | `pytest --junitxml artifacts/reports/<run_id>/junit.xml`,再 `tuner_testkit.artifacts.finish_run` 写 manifest |
70
71
  | `tuner-evidence persist` / `attach` | `evidence/<run_id>/` | `network.jsonl` / `actions.jsonl` / `run_summary.md` / `screenshots/` / `logs/` / `api/`;`manifest.params.task_id` 指向 `work/tasks` |
71
- | agent(编排) | `inbox/` | 会话流水见 `agent-task-log.md`;人类提问见 `inbox/questions/` 与 `work-task.md` |
72
+ | agent(编排) | `inbox/` | 会话流水见 `agent-task-log.md`;未回答提问见 `inbox/questions/`,已回答见 `inbox/archived-question/` |
72
73
  | `tuner-workspace catalog` | `catalogs/workspace.json` | 见 `tuner_testkit/workspace/README.md` |
73
74
 
74
75
  环境变量 `TUNER_REPORT_DIR` 指定本次回归的 run 目录(不设则钩子自动生成 `reports/<run_id>/`);
@@ -54,7 +54,7 @@ catalog 同时用 `git log --diff-filter=A --format=%ae -- <path>` 算首次提
54
54
  ### 任务与测试设计
55
55
 
56
56
  - `kind: task` 落在 `work/tasks/TASK-*.md`,字段见 `docs/spec/work-task.md`。
57
- - `kind: question` 落在 `artifacts/inbox/questions/Q-*.md`(不入库)。
57
+ - `kind: question` 未回答落在 `artifacts/inbox/questions/Q-*.md`,回答后移到 `artifacts/inbox/archived-question/`(不入库)。
58
58
  - `kind: testdesign` 落在 `assets/testdesign/<sut>/<slug>.md`,字段见 `docs/spec/test-design-syntax.md`。
59
59
  - `kind: testcase` 落在 `assets/testcases/<模块>/<功能>.md`;模块说明是 `testcase-module`,总索引是 `testcase-index`。字段见 `docs/spec/testcase-syntax.md`。
60
60
 
@@ -14,7 +14,8 @@ description: 入库任务 work/tasks、阻塞式人类提问,以及和测试
14
14
 
15
15
  ```text
16
16
  work/tasks/TASK-<YYYYMMDD>-<nnn>.md # 入库
17
- artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md # gitignore,本机异步信箱
17
+ artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md # 未回答;gitignore
18
+ artifacts/inbox/archived-question/Q-<YYYYMMDD>-<nnn>.md # 已回答;gitignore
18
19
  ```
19
20
 
20
21
  `work/**` 的提交 scope 是 `work`。问题文件不入库;人答完后的结论写回任务的 `## Decisions`,需要留下的通道说明再策展到 `assets/domain-notes/`。
@@ -73,6 +74,7 @@ tuner-task answer Q-20260924-001 --option rancher-api \
73
74
  ```
74
75
 
75
76
  - 提问立刻落盘,并把任务标为 `blocked`。只挡住依赖该答案的回写;不依赖日志的点击可以先做完,但在回答前不要编写取日志实现,也不要选定通道。
77
+ - `tuner-task answer` 把问题文件从 `questions/` 移到 `archived-question/`,未回答的问题仍只留在 `questions/`。同一天的新问题编号会计入归档,避免复用已回答的 ID。
76
78
  - `--note` 只留可入库的指向。CLI 拒绝 `password=` / `token:` / `Bearer …` 这类赋值。
77
79
  - `skip` 表示报告里日志证据写「无」,设计上的日志断言保持未验证。
78
80
  - `tuner-task finish` 在仍有 `status: open` 且 `blocking: true` 的问题时失败。
@@ -49,6 +49,10 @@ def questions_dir(root: Path) -> Path:
49
49
  return root / "artifacts" / "inbox" / "questions"
50
50
 
51
51
 
52
+ def archived_questions_dir(root: Path) -> Path:
53
+ return root / "artifacts" / "inbox" / "archived-question"
54
+
55
+
52
56
  def _utc_day() -> str:
53
57
  return datetime.now(timezone.utc).strftime("%Y%m%d")
54
58
 
@@ -57,6 +61,19 @@ def _today() -> str:
57
61
  return datetime.now(timezone.utc).strftime("%Y-%m-%d")
58
62
 
59
63
 
64
+ def _next_question_id(repo: Path) -> str:
65
+ """Next Q-id for today, counting both the open inbox and the archive."""
66
+ day = _utc_day()
67
+ pat = re.compile(rf"^Q-{day}-(\d+)$")
68
+ nums: list[int] = []
69
+ for directory in (questions_dir(repo), archived_questions_dir(repo)):
70
+ if not directory.is_dir():
71
+ continue
72
+ nums.extend(int(m.group(1)) for path in directory.glob(f"Q-{day}-*.md") if (m := pat.match(path.stem)))
73
+ questions_dir(repo).mkdir(parents=True, exist_ok=True)
74
+ return f"Q-{day}-{max(nums, default=0) + 1:03d}"
75
+
76
+
60
77
  def _next_seq(directory: Path, prefix: str, day: str) -> str:
61
78
  directory.mkdir(parents=True, exist_ok=True)
62
79
  pat = re.compile(rf"^{re.escape(prefix)}-{day}-(\d+)$")
@@ -300,7 +317,7 @@ def ask_question(
300
317
  ids = [item["id"] for item in chosen]
301
318
  if len(ids) != len(set(ids)):
302
319
  raise ValueError("option ids must be unique")
303
- question_id = _next_seq(questions_dir(repo), "Q", _utc_day())
320
+ question_id = _next_question_id(repo)
304
321
  prompt_one = " ".join(prompt.split())
305
322
  meta: dict[str, Any] = {
306
323
  "kind": "question",
@@ -347,25 +364,31 @@ def ask_question(
347
364
 
348
365
  def list_questions(*, root: Path | None = None, status: str | None = "open") -> list[dict[str, Any]]:
349
366
  repo = Path(root) if root is not None else project_root()
350
- directory = questions_dir(repo)
351
- if not directory.is_dir():
352
- return []
367
+ if status == "answered":
368
+ directories = [archived_questions_dir(repo)]
369
+ elif status == "open":
370
+ directories = [questions_dir(repo)]
371
+ else:
372
+ directories = [questions_dir(repo), archived_questions_dir(repo)]
353
373
  rows = []
354
- for path in sorted(directory.glob("Q-*.md")):
355
- meta, _ = _read(path)
356
- if status and meta.get("status") != status:
374
+ for directory in directories:
375
+ if not directory.is_dir():
357
376
  continue
358
- rows.append(
359
- {
360
- "id": meta.get("id"),
361
- "task_id": meta.get("task_id"),
362
- "topic": meta.get("topic"),
363
- "status": meta.get("status"),
364
- "blocking": meta.get("blocking"),
365
- "prompt": meta.get("prompt"),
366
- "path": path.relative_to(repo).as_posix(),
367
- }
368
- )
377
+ for path in sorted(directory.glob("Q-*.md")):
378
+ meta, _ = _read(path)
379
+ if status and meta.get("status") != status:
380
+ continue
381
+ rows.append(
382
+ {
383
+ "id": meta.get("id"),
384
+ "task_id": meta.get("task_id"),
385
+ "topic": meta.get("topic"),
386
+ "status": meta.get("status"),
387
+ "blocking": meta.get("blocking"),
388
+ "prompt": meta.get("prompt"),
389
+ "path": path.relative_to(repo).as_posix(),
390
+ }
391
+ )
369
392
  return rows
370
393
 
371
394
 
@@ -432,6 +455,10 @@ def answer_question(
432
455
  "answered": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
433
456
  }
434
457
  _write(path, meta, text)
458
+ dest = archived_questions_dir(repo) / path.name
459
+ dest.parent.mkdir(parents=True, exist_ok=True)
460
+ path.replace(dest)
461
+ path = dest
435
462
  task_id = str(meta.get("task_id") or "")
436
463
  task_path = _task_path(repo, task_id)
437
464
  task_meta, task_text = _read(task_path)
@@ -454,6 +481,7 @@ def answer_question(
454
481
  "id": question_id,
455
482
  "status": "answered",
456
483
  "option": option,
484
+ "path": path.relative_to(repo).as_posix(),
457
485
  "task_id": task_id,
458
486
  "task_status": task_meta.get("status"),
459
487
  "curated": curated or None,
@@ -51,6 +51,10 @@ def test_ask_blocks_until_answer_then_curates(tmp_path: Path):
51
51
  root=tmp_path,
52
52
  )
53
53
  assert answered["task_status"] == "in_progress"
54
+ assert answered["path"].startswith("artifacts/inbox/archived-question/")
55
+ assert not (tmp_path / "artifacts" / "inbox" / "questions" / f"{asked['id']}.md").is_file()
56
+ archived = tmp_path / answered["path"]
57
+ assert "status: answered" in archived.read_text(encoding="utf-8")
54
58
  note = (tmp_path / answered["curated"]).read_text(encoding="utf-8")
55
59
  assert "rancher-api" in note
56
60
  assert parse_front_matter(note)["kind"] == "domain-note"
@@ -97,6 +101,25 @@ def test_bind_appends_output(tmp_path: Path):
97
101
  assert shown["evidence"] == ["artifacts/evidence/20260924T000000Z-home"]
98
102
 
99
103
 
104
+ def test_answer_archives_question_and_keeps_id(tmp_path: Path):
105
+ created = create_task(task_type="explore", title="看日志", root=tmp_path, author="qa@example.com")
106
+ first = ask_question(
107
+ task_id=created["id"],
108
+ topic="sut-log-source",
109
+ prompt="日志从哪取",
110
+ root=tmp_path,
111
+ )
112
+ answer_question(first["id"], option="skip", root=tmp_path)
113
+ second = ask_question(
114
+ task_id=created["id"],
115
+ topic="sut-log-source",
116
+ prompt="再确认一次通道",
117
+ root=tmp_path,
118
+ )
119
+ assert second["id"] != first["id"]
120
+ assert int(second["id"].rsplit("-", 1)[-1]) == int(first["id"].rsplit("-", 1)[-1]) + 1
121
+
122
+
100
123
  def test_finish_refuses_open_question(tmp_path: Path):
101
124
  created = create_task(task_type="explore", title="摸页面", root=tmp_path, author="qa@example.com")
102
125
  ask_question(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuner-testkit
3
- Version: 5.3.0
3
+ Version: 5.3.1
4
4
  Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
5
5
  Author: tuner-testkit contributors
6
6
  License-Expression: MIT
@@ -221,4 +221,4 @@ uv sync --extra all
221
221
  (被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
222
222
  验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
223
223
 
224
- 5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
224
+ 5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
File without changes
File without changes