atdd 0.7.1__tar.gz → 0.7.2__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 (214) hide show
  1. {atdd-0.7.1/src/atdd.egg-info → atdd-0.7.2}/PKG-INFO +1 -1
  2. {atdd-0.7.1 → atdd-0.7.2}/pyproject.toml +1 -1
  3. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/registry.py +6 -6
  4. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/traceability.py +5 -5
  5. atdd-0.7.2/src/atdd/coach/conventions/naming.convention.yaml +296 -0
  6. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/conventions/session.convention.yaml +1 -0
  7. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/templates/ATDD.md +1 -0
  8. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/templates/SESSION-TEMPLATE.md +6 -1
  9. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/train.convention.yaml +17 -0
  10. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_plan_wagons.py +70 -3
  11. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/telemetry.convention.yaml +25 -20
  12. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +1 -1
  13. {atdd-0.7.1 → atdd-0.7.2/src/atdd.egg-info}/PKG-INFO +1 -1
  14. {atdd-0.7.1 → atdd-0.7.2}/src/atdd.egg-info/SOURCES.txt +1 -0
  15. {atdd-0.7.1 → atdd-0.7.2}/LICENSE +0 -0
  16. {atdd-0.7.1 → atdd-0.7.2}/README.md +0 -0
  17. {atdd-0.7.1 → atdd-0.7.2}/setup.cfg +0 -0
  18. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/__init__.py +0 -0
  19. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/__main__.py +0 -0
  20. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/cli.py +0 -0
  21. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/__init__.py +0 -0
  22. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/__init__.py +0 -0
  23. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
  24. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/analyze_migrations.py +0 -0
  25. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/consumers.py +0 -0
  26. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/gate.py +0 -0
  27. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/infer_governance_status.py +0 -0
  28. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/initializer.py +0 -0
  29. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/interface.py +0 -0
  30. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/inventory.py +0 -0
  31. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/migration.py +0 -0
  32. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/session.py +0 -0
  33. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/sync.py +0 -0
  34. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/test_interface.py +0 -0
  35. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/test_runner.py +0 -0
  36. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/tests/__init__.py +0 -0
  37. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
  38. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/overlays/__init__.py +0 -0
  39. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/overlays/claude.md +0 -0
  40. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/schemas/config.schema.json +0 -0
  41. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/schemas/manifest.schema.json +0 -0
  42. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/__init__.py +0 -0
  43. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/config.py +0 -0
  44. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/coverage_phase.py +0 -0
  45. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/graph/__init__.py +0 -0
  46. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/graph/urn.py +0 -0
  47. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/locale_phase.py +0 -0
  48. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/repo.py +0 -0
  49. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/utils/train_spec_phase.py +0 -0
  50. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/__init__.py +0 -0
  51. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/shared_fixtures.py +0 -0
  52. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
  53. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_registry.py +0 -0
  54. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_release_versioning.py +0 -0
  55. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_session_validation.py +0 -0
  56. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_traceability.py +0 -0
  57. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_train_registry.py +0 -0
  58. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
  59. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
  60. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/__init__.py +0 -0
  61. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
  62. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
  63. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
  64. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
  65. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
  66. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
  67. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/coverage.convention.yaml +0 -0
  68. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/design.convention.yaml +0 -0
  69. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
  70. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
  71. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
  72. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/green.convention.yaml +0 -0
  73. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
  74. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
  75. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
  76. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/__init__.py +0 -0
  77. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
  78. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
  79. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
  80. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
  81. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
  82. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
  83. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/train.convention.yaml +0 -0
  84. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
  85. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/schemas/design_system.schema.json +0 -0
  86. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/__init__.py +0 -0
  87. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/conftest.py +0 -0
  88. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_commons_structure.py +0 -0
  89. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_complexity.py +0 -0
  90. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
  91. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
  92. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
  93. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
  94. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
  95. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
  96. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
  97. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_hierarchy_coverage.py +0 -0
  98. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_i18n_runtime.py +0 -0
  99. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
  100. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
  101. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
  102. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
  103. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_python_architecture.py +0 -0
  104. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
  105. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
  106. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
  107. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_train_urns.py +0 -0
  108. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
  109. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
  110. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
  111. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/conftest.py +0 -0
  112. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/__init__.py +0 -0
  113. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
  114. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
  115. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
  116. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/component.convention.yaml +0 -0
  117. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/coverage.convention.yaml +0 -0
  118. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
  119. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
  120. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
  121. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
  122. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/wagon.convention.yaml +0 -0
  123. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
  124. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
  125. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/appendix.schema.json +0 -0
  126. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/component.schema.json +0 -0
  127. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/feature.schema.json +0 -0
  128. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/train.schema.json +0 -0
  129. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/wagon.schema.json +0 -0
  130. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
  131. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/__init__.py +0 -0
  132. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/conftest.py +0 -0
  133. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
  134. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_hierarchy_coverage.py +0 -0
  135. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
  136. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
  137. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
  138. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_train_validation.py +0 -0
  139. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
  140. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
  141. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
  142. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/__init__.py +0 -0
  143. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/artifact.convention.yaml +0 -0
  144. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
  145. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/coverage.convention.yaml +0 -0
  146. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
  147. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
  148. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/red.convention.yaml +0 -0
  149. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
  150. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/conventions/security.convention.yaml +0 -0
  151. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
  152. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/artifact.schema.json +0 -0
  153. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/contract.schema.json +0 -0
  154. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
  155. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/db.tmpl.json +0 -0
  156. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
  157. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
  158. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/event.tmpl.json +0 -0
  159. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/http.tmpl.json +0 -0
  160. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/job.tmpl.json +0 -0
  161. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/load.tmpl.json +0 -0
  162. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/locale_manifest.schema.json +0 -0
  163. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
  164. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/pack.schema.json +0 -0
  165. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
  166. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
  167. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/script.tmpl.json +0 -0
  168. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
  169. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
  170. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
  171. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
  172. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
  173. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
  174. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
  175. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
  176. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/utils/__init__.py +0 -0
  177. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/utils/filename.py +0 -0
  178. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/__init__.py +0 -0
  179. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
  180. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
  181. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/conftest.py +0 -0
  182. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
  183. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
  184. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
  185. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
  186. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
  187. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_artifact_naming_category.py +0 -0
  188. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
  189. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_contract_security.py +0 -0
  190. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_contracts_structure.py +0 -0
  191. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
  192. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
  193. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
  194. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_hierarchy_coverage.py +0 -0
  195. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_isolation.py +0 -0
  196. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_locale_coverage.py +0 -0
  197. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
  198. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
  199. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_migration_generation.py +0 -0
  200. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
  201. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
  202. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
  203. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
  204. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
  205. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_train_backend_e2e.py +0 -0
  206. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_train_frontend_e2e.py +0 -0
  207. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_train_frontend_python.py +0 -0
  208. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
  209. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
  210. {atdd-0.7.1 → atdd-0.7.2}/src/atdd/version_check.py +0 -0
  211. {atdd-0.7.1 → atdd-0.7.2}/src/atdd.egg-info/dependency_links.txt +0 -0
  212. {atdd-0.7.1 → atdd-0.7.2}/src/atdd.egg-info/entry_points.txt +0 -0
  213. {atdd-0.7.1 → atdd-0.7.2}/src/atdd.egg-info/requires.txt +0 -0
  214. {atdd-0.7.1 → atdd-0.7.2}/src/atdd.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.7.1
3
+ Version: 0.7.2
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "atdd"
7
- version = "0.7.1"
7
+ version = "0.7.2"
8
8
  description = "ATDD Platform - Acceptance Test Driven Development toolkit"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"
@@ -10,7 +10,7 @@ Architecture: 4-Layer Clean Architecture (single file)
10
10
  Registries:
11
11
  - plan/_wagons.yaml from wagon manifests
12
12
  - contracts/_artifacts.yaml from contract schemas
13
- - telemetry/_signals.yaml from telemetry signals
13
+ - telemetry/_telemetry.yaml from telemetry signals
14
14
  - atdd/tester/_tests.yaml from test files
15
15
  - python/_implementations.yaml from Python files
16
16
  - supabase/_functions.yaml from function files
@@ -89,8 +89,8 @@ class RegistryLoader:
89
89
  return yaml.safe_load(f) or {"artifacts": []}
90
90
 
91
91
  def load_telemetry(self) -> Dict[str, Any]:
92
- """Load telemetry registry (telemetry/_signals.yaml)."""
93
- registry_path = self.telemetry_dir / "_signals.yaml"
92
+ """Load telemetry registry (telemetry/_telemetry.yaml)."""
93
+ registry_path = self.telemetry_dir / "_telemetry.yaml"
94
94
  if not registry_path.exists():
95
95
  return {"signals": []}
96
96
 
@@ -776,7 +776,7 @@ class RegistryBuilder:
776
776
 
777
777
  def update_telemetry_registry(self, mode: str = "interactive", preview_only: bool = None) -> Dict[str, Any]:
778
778
  """
779
- Update telemetry/_signals.yaml from telemetry signal files.
779
+ Update telemetry/_telemetry.yaml from telemetry signal files.
780
780
 
781
781
  Args:
782
782
  mode: "interactive" (prompt), "apply" (no prompt), or "check" (verify only)
@@ -791,7 +791,7 @@ class RegistryBuilder:
791
791
  print("\n📊 Analyzing telemetry registry from signal files...")
792
792
 
793
793
  # Load existing registry
794
- registry_path = self.telemetry_dir / "_signals.yaml"
794
+ registry_path = self.telemetry_dir / "_telemetry.yaml"
795
795
  existing_signals = {}
796
796
  if registry_path.exists():
797
797
  with open(registry_path) as f:
@@ -812,7 +812,7 @@ class RegistryBuilder:
812
812
  # Scan for telemetry signal files (JSON or YAML)
813
813
  json_files = list(self.telemetry_dir.glob("**/*.json"))
814
814
  yaml_files = list(self.telemetry_dir.glob("**/*.yaml"))
815
- signal_files = [f for f in (json_files + yaml_files) if "_signals" not in f.name]
815
+ signal_files = [f for f in (json_files + yaml_files) if "_telemetry" not in f.name]
816
816
 
817
817
  stats["total_files"] = len(signal_files)
818
818
 
@@ -1435,8 +1435,8 @@ class TraceabilityReconciler:
1435
1435
 
1436
1436
  for telemetry in telemetry_files:
1437
1437
  # Skip manifest and pack files (not signal files)
1438
- if (telemetry.file_path.endswith('_tracking.yaml') or
1439
- telemetry.file_path.endswith('_signals.yaml') or
1438
+ if (telemetry.file_path.endswith('_taxonomy.yaml') or
1439
+ telemetry.file_path.endswith('_telemetry.yaml') or
1440
1440
  '.pack.' in telemetry.file_path):
1441
1441
  continue
1442
1442
 
@@ -1493,9 +1493,9 @@ class TraceabilityReconciler:
1493
1493
 
1494
1494
  telemetry_id = telemetry.telemetry_id
1495
1495
 
1496
- # Skip manifest files (_tracking.yaml, _signals.yaml)
1497
- if telemetry.file_path.endswith('_tracking.yaml') or \
1498
- telemetry.file_path.endswith('_signals.yaml') or \
1496
+ # Skip manifest files (_taxonomy.yaml, _telemetry.yaml)
1497
+ if telemetry.file_path.endswith('_taxonomy.yaml') or \
1498
+ telemetry.file_path.endswith('_telemetry.yaml') or \
1499
1499
  '.pack.' in telemetry.file_path:
1500
1500
  continue
1501
1501
 
@@ -0,0 +1,296 @@
1
+ version: "1.0"
2
+ name: "Master Naming Convention"
3
+ description: "Consolidated naming patterns for all ATDD archetypes with regex validation"
4
+
5
+ # Purpose
6
+ purpose: |
7
+ Single source of truth for naming patterns across all archetypes.
8
+ Each archetype has: pattern, regex, examples, and validator reference.
9
+ For detailed semantics, see archetype-specific conventions.
10
+
11
+ # Separator Semantics (from artifact-naming.convention.yaml)
12
+ separator_semantics:
13
+ colon: "Hierarchical descent (unlimited depth)"
14
+ dot: "Lateral variation (typically 0-1 levels)"
15
+ hyphen: "Word separator within segments (kebab-case)"
16
+
17
+ # Naming Patterns by Archetype
18
+ patterns:
19
+
20
+ wagon:
21
+ description: "Bounded context performing specific action on specific object"
22
+ semantic_pattern: "verb-object"
23
+ format: "kebab-case"
24
+ regex: "^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$"
25
+ urn_format: "wagon:{wagon-name}"
26
+ urn_regex: "^wagon:[a-z][a-z0-9-]+$"
27
+ examples:
28
+ valid:
29
+ - "authenticate-identity"
30
+ - "resolve-dilemmas"
31
+ - "commit-state"
32
+ - "burn-timebank"
33
+ - "juggle-domains"
34
+ - "manage-inventory"
35
+ invalid:
36
+ - "authentication" # Missing object (noun only)
37
+ - "dilemma-resolver" # Wrong order (object-verb)
38
+ - "resolving-dilemmas" # Gerund instead of verb
39
+ - "ResolveDilemmas" # PascalCase
40
+ filesystem:
41
+ directory: "plan/{wagon_snake_case}/"
42
+ manifest: "plan/{wagon_snake_case}/_{wagon_snake_case}.yaml"
43
+ note: "Directory uses snake_case: resolve_dilemmas"
44
+ validator:
45
+ file: "src/atdd/planner/validators/test_plan_wagons.py"
46
+ spec: "SPEC-PLATFORM-WAGONS-0008"
47
+ convention_ref: "atdd/planner/conventions/wagon.convention.yaml"
48
+
49
+ feature:
50
+ description: "Specific capability within a wagon"
51
+ semantic_pattern: "verb-object"
52
+ format: "kebab-case"
53
+ regex: "^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$"
54
+ urn_format: "feature:{wagon}:{feature-name}"
55
+ urn_regex: "^feature:[a-z][a-z0-9-]+:[a-z][a-z0-9-]+$"
56
+ examples:
57
+ valid:
58
+ - "capture-choice"
59
+ - "pair-fragments"
60
+ - "score-domains"
61
+ - "sign-commit"
62
+ - "validate-input"
63
+ invalid:
64
+ - "choice-capture" # Wrong order
65
+ - "capturing" # Missing object
66
+ - "fragment_pairing" # Snake case
67
+ filesystem:
68
+ file: "plan/{wagon}/features/{feature_snake_case}.yaml"
69
+ validator:
70
+ file: "src/atdd/planner/validators/test_plan_wagons.py"
71
+ spec: "SPEC-PLATFORM-WAGONS-0009"
72
+ convention_ref: "atdd/planner/conventions/feature.convention.yaml"
73
+
74
+ contract:
75
+ description: "Data exchange contract between wagons"
76
+ semantic_pattern: "theme:hierarchy:aspect(.variant)?"
77
+ format: "kebab-case segments with colon/dot separators"
78
+ id_regex: "^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+(\\.[a-z][a-z0-9-]+)?$"
79
+ urn_format: "contract:{artifact-name}"
80
+ urn_regex: "^contract:[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+(\\.[a-z][a-z0-9-]+)?$"
81
+ examples:
82
+ schema_id:
83
+ - "mechanic:timebank.remaining"
84
+ - "match:dilemma:current"
85
+ - "commons:ux:foundations:color"
86
+ - "sensory:gesture.raw"
87
+ urn:
88
+ - "contract:mechanic:timebank.remaining"
89
+ - "contract:match:dilemma:current"
90
+ - "contract:commons:ux:foundations:color"
91
+ id_vs_urn:
92
+ schema_id: "NO 'contract:' prefix (e.g., mechanic:timebank.remaining)"
93
+ wagon_urn: "WITH 'contract:' prefix (e.g., contract:mechanic:timebank.remaining)"
94
+ filesystem:
95
+ pattern: "contracts/{theme}/{domain}/{aspect}.schema.json"
96
+ example: "contracts/mechanic/timebank/remaining.schema.json"
97
+ validator:
98
+ file: "src/atdd/tester/validators/test_contract_schema_compliance.py"
99
+ spec: "SPEC-TESTER-VAL-0001"
100
+ convention_ref: "atdd/tester/conventions/contract.convention.yaml"
101
+ naming_authority: "atdd/planner/conventions/artifact-naming.convention.yaml"
102
+
103
+ telemetry:
104
+ description: "Observability and analytics tracking signals"
105
+ semantic_pattern: "theme:hierarchy:aspect(.variant)?"
106
+ format: "kebab-case segments with colon/dot separators"
107
+ signal_id_regex: "^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+\\.(event|metric|trace|log)\\.(ui|ux|be|db|nw|st|tm|sc|au|fn|if)(\\.[a-z][a-z0-9-]+)?$"
108
+ urn_format: "telemetry:{theme}(:{path})*:{aspect}(.{variant})?"
109
+ urn_regex: "^telemetry:[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)*(\\.[a-z][a-z0-9-]+)?$"
110
+ examples:
111
+ signal_id:
112
+ - "mechanic:decision.choice.event.be"
113
+ - "match:dilemma:current.metric.be.selection-duration"
114
+ - "juggle:goal.detected.event.be"
115
+ urn:
116
+ - "telemetry:mechanic:decision.choice"
117
+ - "telemetry:juggle:goal.detected"
118
+ - "telemetry:mechanic:episode.timer"
119
+ id_vs_urn:
120
+ signal_id: "NO 'telemetry:' prefix, includes .type.plane (e.g., mechanic:decision.choice.event.be)"
121
+ wagon_urn: "WITH 'telemetry:' prefix, NO type.plane (e.g., telemetry:mechanic:decision.choice)"
122
+ filesystem:
123
+ pattern: "telemetry/{theme}/{domain}/{aspect}.{type}.{plane}[.{measure}].json"
124
+ example: "telemetry/mechanic/decision/choice.event.be.json"
125
+ validator:
126
+ file: "src/atdd/tester/validators/test_telemetry_structure.py"
127
+ spec: "SPEC-TESTER-CONV-0050"
128
+ convention_ref: "atdd/tester/conventions/telemetry.convention.yaml"
129
+
130
+ train:
131
+ description: "User journey or end-to-end workflow"
132
+ semantic_pattern: "{NNNN}-{slug}"
133
+ format: "4-digit hierarchical prefix + kebab-case slug"
134
+ regex: "^\\d{4}-[a-z][a-z0-9-]+$"
135
+ numbering:
136
+ pattern: "[Theme][Category][Variation]-{slug}"
137
+ theme_digit: "0-9 (commons=0, mechanic=1, scenario=2, match=3, etc.)"
138
+ category_digit: "0=nominal, 1=error, 2=alternate, 3=exception"
139
+ variation_digits: "01-99"
140
+ examples:
141
+ valid:
142
+ - "1001-decision-standard"
143
+ - "3006-episode-match-complete"
144
+ - "0201-sso-authentication"
145
+ - "2301-empty-input-file"
146
+ invalid:
147
+ - "101-decision" # Only 3 digits
148
+ - "1001_decision" # Underscore
149
+ - "1001-Decision" # PascalCase
150
+ filesystem:
151
+ registry: "plan/_trains.yaml"
152
+ spec: "plan/_trains/{train_id}.yaml"
153
+ validator:
154
+ file: "src/atdd/planner/validators/test_train_validation.py"
155
+ spec: "SPEC-TRAIN-VAL-0001"
156
+ convention_ref: "atdd/planner/conventions/train.convention.yaml"
157
+
158
+ acceptance:
159
+ description: "Acceptance criteria URN for test traceability"
160
+ semantic_pattern: "acc:{wagon}:{wmbt}-{harness}-{NNN}[-{slug}]"
161
+ format: "Structured URN with step code, harness, and sequence"
162
+ regex: "^acc:[a-z][a-z0-9_-]+:([DLPCEMYRK][0-9]{3}-(UNIT|HTTP|EVENT|WS|E2E|A11Y|VIS|METRIC|JOB|DB|SEC|LOAD|SCRIPT|WIDGET|GOLDEN|BLOC|INTEGRATION|RLS|EDGE|REALTIME|STORAGE)-[0-9]{3}(?:-[a-z0-9-]+)?|[A-Z][0-9]{3})$"
163
+ components:
164
+ wagon: "Parent wagon (kebab-case)"
165
+ wmbt_id: "Step code [DLPCEMYRK] + 3-digit sequence (e.g., C004)"
166
+ harness: "Test harness type (uppercase)"
167
+ sequence: "Zero-padded 3-digit number (001-999)"
168
+ slug: "Optional kebab-case descriptor"
169
+ step_codes:
170
+ D: "Discovery"
171
+ L: "Load"
172
+ P: "Parse"
173
+ C: "Compute"
174
+ E: "Emit"
175
+ M: "Mutate"
176
+ Y: "Yield"
177
+ R: "Render"
178
+ K: "Keep"
179
+ harness_types:
180
+ - "UNIT"
181
+ - "HTTP"
182
+ - "EVENT"
183
+ - "WS"
184
+ - "E2E"
185
+ - "A11Y"
186
+ - "VIS"
187
+ - "METRIC"
188
+ - "JOB"
189
+ - "DB"
190
+ - "SEC"
191
+ - "LOAD"
192
+ - "SCRIPT"
193
+ - "WIDGET"
194
+ - "GOLDEN"
195
+ - "BLOC"
196
+ - "INTEGRATION"
197
+ - "RLS"
198
+ - "EDGE"
199
+ - "REALTIME"
200
+ - "STORAGE"
201
+ examples:
202
+ valid:
203
+ - "acc:commit-state:M001-INTEGRATION-001"
204
+ - "acc:pace-dilemmas:P011-VISUAL-001"
205
+ - "acc:maintain-ux:C004-E2E-019-user-connection"
206
+ - "acc:resolve-dilemmas:C001-UNIT-001-choice-validation"
207
+ invalid:
208
+ - "acc:commit-state:M01-INTEGRATION-001" # Only 2 digits in WMBT
209
+ - "acc:commit-state:M001-integration-001" # Lowercase harness
210
+ - "acc:commit-state:M001-INTEGRATION-01" # Only 2 digits in sequence
211
+ validator:
212
+ file: "src/atdd/tester/validators/test_contract_schema_compliance.py"
213
+ spec: "SPEC-TESTER-VAL-0020"
214
+ convention_ref: "atdd/planner/conventions/acceptance.convention.yaml"
215
+
216
+ wmbt:
217
+ description: "What Must Be True step identifier"
218
+ semantic_pattern: "wmbt:{wagon}:{step_code}{NNN}"
219
+ format: "Step code letter + 3-digit sequence"
220
+ regex: "^wmbt:[a-z][a-z0-9-]+:[DLPCEMYRK][0-9]{3}$"
221
+ examples:
222
+ valid:
223
+ - "wmbt:resolve-dilemmas:C001"
224
+ - "wmbt:commit-state:M001"
225
+ - "wmbt:pace-dilemmas:P011"
226
+ invalid:
227
+ - "wmbt:resolve-dilemmas:C01" # Only 2 digits
228
+ - "wmbt:resolve-dilemmas:X001" # Invalid step code
229
+ filesystem:
230
+ file: "plan/{wagon}/wmbt/{step_code}{NNN}.yaml"
231
+ validator:
232
+ file: "src/atdd/planner/validators/test_wmbt_consistency.py"
233
+ spec: "SPEC-PLANNER-VAL-0030"
234
+ convention_ref: "atdd/planner/conventions/wmbt.convention.yaml"
235
+
236
+ appendix:
237
+ description: "Supplementary reference data"
238
+ semantic_pattern: "appendix:{type}"
239
+ format: "kebab-case type identifier"
240
+ regex: "^appendix:[a-z][a-z0-9-]+$"
241
+ examples:
242
+ valid:
243
+ - "appendix:theme-catalog"
244
+ - "appendix:error-codes"
245
+ - "appendix:locale-mappings"
246
+ invalid:
247
+ - "appendix:ThemeCatalog" # PascalCase
248
+ - "appendix_theme" # Underscore separator
249
+ note: "Currently not strictly enforced - documentation pattern"
250
+ validator:
251
+ file: "Not yet implemented"
252
+ spec: "Pending"
253
+
254
+ system:
255
+ description: "External system or service reference"
256
+ semantic_pattern: "system:{service-name}"
257
+ format: "kebab-case service identifier"
258
+ regex: "^system:[a-z][a-z0-9-]+$"
259
+ examples:
260
+ valid:
261
+ - "system:external"
262
+ - "system:scenario-library"
263
+ - "system:filesystem"
264
+ - "system:posthog"
265
+ invalid:
266
+ - "system:External" # PascalCase
267
+ - "external-system" # Missing prefix
268
+ note: "Used in wagon consume references for external dependencies"
269
+ validator:
270
+ file: "Not yet implemented"
271
+ spec: "Pending"
272
+
273
+ # Validation Summary
274
+ validation_summary:
275
+ enforced:
276
+ - wagon: "SPEC-PLATFORM-WAGONS-0008"
277
+ - feature: "SPEC-PLATFORM-WAGONS-0009"
278
+ - contract: "SPEC-PLATFORM-WAGONS-0006"
279
+ - telemetry: "SPEC-PLATFORM-WAGONS-0007"
280
+ - train: "SPEC-TRAIN-VAL-0001"
281
+ - acceptance: "SPEC-TESTER-VAL-0020"
282
+ - wmbt: "SPEC-PLANNER-VAL-0030"
283
+ pending:
284
+ - appendix: "Not yet enforced"
285
+ - system: "Not yet enforced"
286
+
287
+ # Cross-References
288
+ references:
289
+ artifact_naming: "atdd/planner/conventions/artifact-naming.convention.yaml"
290
+ wagon: "atdd/planner/conventions/wagon.convention.yaml"
291
+ feature: "atdd/planner/conventions/feature.convention.yaml"
292
+ contract: "atdd/tester/conventions/contract.convention.yaml"
293
+ telemetry: "atdd/tester/conventions/telemetry.convention.yaml"
294
+ train: "atdd/planner/conventions/train.convention.yaml"
295
+ acceptance: "atdd/planner/conventions/acceptance.convention.yaml"
296
+ wmbt: "atdd/planner/conventions/wmbt.convention.yaml"
@@ -354,6 +354,7 @@ archetypes:
354
354
  id: "telemetry"
355
355
  description: "Observability and monitoring artifacts"
356
356
  artifacts:
357
+ - "telemetry/_taxonomy.yaml"
357
358
  - "telemetry/_telemetry.yaml"
358
359
  - "telemetry/{domain}/*.yaml"
359
360
  patterns:
@@ -53,6 +53,7 @@ manifest:
53
53
  - artifacts: "contracts/_artifacts.yaml"
54
54
  - contracts: "contracts/_contracts.yaml"
55
55
  - telemetry: "telemetry/_telemetry.yaml"
56
+ - taxonomy: "telemetry/_taxonomy.yaml"
56
57
 
57
58
  tests:
58
59
  - frontend: "web/tests"
@@ -21,6 +21,10 @@ type: "{type}" # implementation | migration | refactor | analysis | planning |
21
21
  complexity: 3 # 1=Trivial, 2=Low, 3=Medium, 4=High, 5=Very High
22
22
  archetypes:
23
23
  - "{archetype}" # db | be | fe | contracts | wmbt | wagon | train | telemetry | migrations
24
+ # NOTE: If archetypes includes 'train', you MUST create/update BOTH:
25
+ # 1. plan/_trains.yaml (registry entry with train_id, description, path, wagons)
26
+ # 2. plan/_trains/{train_id}.yaml (full spec with participants, sequence, etc.)
27
+ # Validator SPEC-TRAIN-VAL-0003 enforces spec file exists for each registry entry.
24
28
 
25
29
  # Scope definition
26
30
  scope:
@@ -38,7 +42,8 @@ workflow_phases:
38
42
  planner:
39
43
  status: "TODO" # TODO | IN_PROGRESS | DONE | SKIPPED | N/A
40
44
  artifacts:
41
- train: false # plan/_trains.yaml updated
45
+ train: false # plan/_trains.yaml updated (registry entry)
46
+ train_spec: false # plan/_trains/{train_id}.yaml exists (full spec)
42
47
  wagon: false # plan/{wagon}/_{wagon}.yaml exists
43
48
  feature: false # plan/{wagon}/features/{feature}.yaml exists
44
49
  wmbt: false # WMBTs defined in feature YAML
@@ -257,6 +257,23 @@ registry:
257
257
  structure: "theme-category-grouped"
258
258
  description: "Trains grouped by theme, then by category (nominal/error/alternate/exception) in _trains.yaml manifest"
259
259
 
260
+ # Two-file pattern: Registry + Per-Train Spec Files
261
+ two_file_pattern:
262
+ description: "Each train requires two files: a registry entry and a spec file"
263
+ files:
264
+ registry:
265
+ path: "plan/_trains.yaml"
266
+ purpose: "Central manifest listing all trains with summary metadata"
267
+ contains: "train_id, description, path, wagons (summary list)"
268
+ spec:
269
+ path: "plan/_trains/{train_id}.yaml"
270
+ purpose: "Full train specification with complete workflow definition"
271
+ contains: "train_id, title, themes, participants, sequence, dependencies, test, code, expectations"
272
+ validation:
273
+ rule: "Every registry entry MUST have a corresponding spec file"
274
+ validator: "SPEC-TRAIN-VAL-0003 (test_train_files_exist_for_registry_entries)"
275
+ enforcement: "Planner phase gate fails if spec file missing"
276
+
260
277
  format: |
261
278
  trains:
262
279
  0-commons:
@@ -95,6 +95,72 @@ def test_wagon_slugs_match_directory_names(wagon_manifests):
95
95
  f"Wagon slug '{wagon_slug}' doesn't match expected slug '{expected_slug}' (from directory '{directory_name}') for {path}"
96
96
 
97
97
 
98
+ @pytest.mark.platform
99
+ def test_wagon_names_follow_verb_object_pattern(wagon_manifests):
100
+ """
101
+ SPEC-PLATFORM-WAGONS-0008: Wagon names follow verb-object semantic pattern
102
+
103
+ Given: All wagon manifests
104
+ When: Checking wagon name format
105
+ Then: Wagon names follow verb-object pattern (e.g., resolve-dilemmas, commit-state)
106
+ - Format: verb-object (kebab-case, at least 2 hyphen-separated words)
107
+ - First segment should be a verb (action)
108
+ - Subsequent segments describe the object/domain
109
+ Per naming.convention.yaml wagon section
110
+ """
111
+ import re
112
+
113
+ # Pattern: verb-object with optional additional words (e.g., burn-timebank, juggle-domains)
114
+ # Requires at least 2 segments separated by hyphens
115
+ verb_object_pattern = re.compile(r"^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$")
116
+
117
+ for path, manifest in wagon_manifests:
118
+ wagon_name = manifest.get("wagon", "")
119
+ if wagon_name:
120
+ assert verb_object_pattern.match(wagon_name), \
121
+ f"Wagon {path}: name '{wagon_name}' doesn't follow verb-object pattern (e.g., resolve-dilemmas)"
122
+
123
+
124
+ @pytest.mark.platform
125
+ def test_feature_names_follow_verb_object_pattern(wagon_manifests):
126
+ """
127
+ SPEC-PLATFORM-WAGONS-0009: Feature names follow verb-object semantic pattern
128
+
129
+ Given: All wagon manifests with features[] entries
130
+ When: Checking feature name format from URNs
131
+ Then: Feature names follow verb-object pattern (e.g., capture-choice, pair-fragments)
132
+ - URN format: feature:{wagon}:{feature-name}
133
+ - Feature name requires at least 2 hyphen-separated words
134
+ Per naming.convention.yaml feature section
135
+ """
136
+ import re
137
+
138
+ # Pattern: verb-object with optional additional words
139
+ verb_object_pattern = re.compile(r"^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$")
140
+
141
+ for path, manifest in wagon_manifests:
142
+ features_list = manifest.get("features", [])
143
+ wagon_name = manifest.get("wagon", "")
144
+
145
+ for feature in features_list:
146
+ feature_name = None
147
+
148
+ # Extract feature name from URN
149
+ if isinstance(feature, dict) and "urn" in feature:
150
+ urn = feature["urn"]
151
+ parts = urn.split(":")
152
+ if len(parts) >= 3:
153
+ feature_name = parts[2]
154
+ elif isinstance(feature, str) and feature.startswith("feature:"):
155
+ parts = feature.split(":")
156
+ if len(parts) >= 3:
157
+ feature_name = parts[2]
158
+
159
+ if feature_name:
160
+ assert verb_object_pattern.match(feature_name), \
161
+ f"Wagon {wagon_name}: feature '{feature_name}' doesn't follow verb-object pattern (e.g., capture-choice)"
162
+
163
+
98
164
  @pytest.mark.platform
99
165
  def test_produce_artifact_names_follow_convention(wagon_manifests):
100
166
  """
@@ -153,9 +219,10 @@ def test_telemetry_urns_match_pattern(wagon_manifests):
153
219
 
154
220
  Given: Wagon produce items with non-null telemetry URNs
155
221
  When: Validating URN format
156
- Then: Telemetry URNs match pattern telemetry:{path}:{aspect}
157
- Supports multi-level paths (e.g., telemetry:commons:ux:foundations)
158
- Uses colons (not dots) for hierarchy
222
+ Then: Telemetry URNs match pattern telemetry:{path}:{aspect}(.{variant})?
223
+ - Colons (:) for hierarchical descent (e.g., telemetry:commons:ux:foundations)
224
+ - Dots (.) for lateral variants (e.g., telemetry:mechanic:decision.choice)
225
+ Per telemetry.convention.yaml id_vs_urn section
159
226
  """
160
227
  import re
161
228
 
@@ -318,7 +318,7 @@ tracking_structure:
318
318
  version: "1.1.0"
319
319
 
320
320
  manifest:
321
- location: "telemetry/_tracking.yaml"
321
+ location: "telemetry/_taxonomy.yaml"
322
322
  format: "YAML"
323
323
  purpose: "Central registry of all telemetry signals per artifact"
324
324
 
@@ -401,18 +401,23 @@ tracking_structure:
401
401
  signal_id_examples:
402
402
  - "commons:ux:foundations:color.metric.be.count"
403
403
  - "match:dilemma:current.metric.be.selection_duration"
404
- - "commons:ux:foundations:foundations.metric.be.error_rate"
405
- urn: "telemetry:{theme}(:{path})*:{aspect}"
404
+ - "mechanic:decision.choice.event.be"
405
+ urn: "telemetry:{theme}(:{path})*:{aspect}(.{variant})?"
406
406
  urn_examples:
407
- - "telemetry:commons:ux:foundations"
408
- - "telemetry:match:dilemma"
407
+ - "telemetry:mechanic:decision.choice"
408
+ - "telemetry:juggle:goal.detected"
409
+ - "telemetry:mechanic:episode.timer"
410
+ - "telemetry:match:dilemma:current"
409
411
  note: |
410
- $id in signal file: NO "telemetry:" prefix (e.g., commons:ux:foundations:color.metric.be.count)
411
- URN in wagon manifests: WITH "telemetry:" prefix (e.g., telemetry:commons:ux:foundations)
412
- artifact_ref: WITH "contract:" prefix (e.g., contract:commons:ux:foundations:color)
412
+ $id in signal file: NO "telemetry:" prefix (e.g., mechanic:decision.choice.event.be)
413
+ URN in wagon manifests: WITH "telemetry:" prefix (e.g., telemetry:mechanic:decision.choice)
414
+ artifact_ref: WITH "contract:" prefix (e.g., contract:mechanic:decision.choice)
413
415
 
414
- Hierarchy (colons) for path segments, dots for signal facets (type.plane.measure).
415
- Mirrors contract structure perfectly.
416
+ Hierarchy (colons) for path segments, dots for:
417
+ - Variants in URN (e.g., decision.choice, goal.detected)
418
+ - Signal facets in $id (type.plane.measure)
419
+
420
+ Aligns with artifact-naming.convention.yaml separator semantics.
416
421
 
417
422
  Examples:
418
423
  File: telemetry/commons/ux/foundations/color.metric.be.count.json
@@ -421,19 +426,19 @@ tracking_structure:
421
426
  artifact_ref: contract:commons:ux:foundations:color
422
427
 
423
428
  urn_path_mapping:
424
- pattern: "telemetry:{theme}(:{path})*:{aspect} (wagon manifest format)"
429
+ pattern: "telemetry:{theme}(:{path})*:{aspect}(.{variant})? (wagon manifest format)"
425
430
  path_construction:
426
- directory: "telemetry/{theme}/{path}/{aspect}/"
427
- filename: "{resource}.{type}.{plane}[.{measure}].json"
431
+ directory: "telemetry/{theme}/{path}/"
432
+ filename: "{aspect}[.{variant}].{type}.{plane}[.{measure}].json"
428
433
  round_trip: "URN ↔ path must be identity transformation"
429
- note: "Directory structure mirrors contracts exactly - aspect is subdirectory, resource is filename prefix"
434
+ note: "Directory structure mirrors contracts. Dot notation allowed for variants in URN."
430
435
  comparison:
431
- contract_path: "contracts/commons/ux/foundations/color.schema.json"
432
- contract_id: "commons:ux:foundations:color"
433
- contract_urn: "contract:commons:ux:foundations:color"
434
- telemetry_path: "telemetry/commons/ux/foundations/color.metric.be.count.json"
435
- telemetry_id: "commons:ux:foundations:color.metric.be.count"
436
- telemetry_urn: "telemetry:commons:ux:foundations"
436
+ contract_path: "contracts/mechanic/decision/choice.schema.json"
437
+ contract_id: "mechanic:decision.choice"
438
+ contract_urn: "contract:mechanic:decision.choice"
439
+ telemetry_path: "telemetry/mechanic/decision/choice.event.be.json"
440
+ telemetry_id: "mechanic:decision.choice.event.be"
441
+ telemetry_urn: "telemetry:mechanic:decision.choice"
437
442
 
438
443
  artifact_naming_grammar:
439
444
  pattern: "{theme}:{domain}:{aspect}"
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "telemetry-tracking-manifest-schema",
4
4
  "title": "Telemetry Tracking Manifest Schema",
5
- "description": "Schema for telemetry/_tracking.yaml manifest file",
5
+ "description": "Schema for telemetry/_taxonomy.yaml manifest file",
6
6
  "type": "object",
7
7
  "required": ["version", "planes", "measures", "artifacts"],
8
8
  "properties": {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdd
3
- Version: 0.7.1
3
+ Version: 0.7.2
4
4
  Summary: ATDD Platform - Acceptance Test Driven Development toolkit
5
5
  License: MIT
6
6
  Requires-Python: >=3.10
@@ -31,6 +31,7 @@ src/atdd/coach/commands/test_runner.py
31
31
  src/atdd/coach/commands/traceability.py
32
32
  src/atdd/coach/commands/tests/__init__.py
33
33
  src/atdd/coach/commands/tests/test_telemetry_array_validation.py
34
+ src/atdd/coach/conventions/naming.convention.yaml
34
35
  src/atdd/coach/conventions/session.convention.yaml
35
36
  src/atdd/coach/overlays/__init__.py
36
37
  src/atdd/coach/overlays/claude.md
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes