atdd 0.7.3__tar.gz → 0.7.4__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 (218) hide show
  1. {atdd-0.7.3/src/atdd.egg-info → atdd-0.7.4}/PKG-INFO +1 -1
  2. {atdd-0.7.3 → atdd-0.7.4}/pyproject.toml +1 -1
  3. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/wagon.convention.yaml +27 -19
  4. atdd-0.7.4/src/atdd/tester/conventions/artifact.convention.yaml +276 -0
  5. atdd-0.7.4/src/atdd/tester/validators/test_artifact_naming_category.py +294 -0
  6. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contracts_structure.py +5 -2
  7. {atdd-0.7.3 → atdd-0.7.4/src/atdd.egg-info}/PKG-INFO +1 -1
  8. atdd-0.7.3/src/atdd/tester/conventions/artifact.convention.yaml +0 -257
  9. atdd-0.7.3/src/atdd/tester/validators/test_artifact_naming_category.py +0 -307
  10. {atdd-0.7.3 → atdd-0.7.4}/LICENSE +0 -0
  11. {atdd-0.7.3 → atdd-0.7.4}/README.md +0 -0
  12. {atdd-0.7.3 → atdd-0.7.4}/setup.cfg +0 -0
  13. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/__init__.py +0 -0
  14. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/__main__.py +0 -0
  15. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/cli.py +0 -0
  16. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/__init__.py +0 -0
  17. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/__init__.py +0 -0
  18. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/add_persistence_metadata.py +0 -0
  19. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/analyze_migrations.py +0 -0
  20. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/consumers.py +0 -0
  21. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/gate.py +0 -0
  22. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/infer_governance_status.py +0 -0
  23. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/initializer.py +0 -0
  24. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/interface.py +0 -0
  25. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/inventory.py +0 -0
  26. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/migration.py +0 -0
  27. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/registry.py +0 -0
  28. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/session.py +0 -0
  29. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/sync.py +0 -0
  30. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/test_interface.py +0 -0
  31. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/test_runner.py +0 -0
  32. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/tests/__init__.py +0 -0
  33. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/tests/test_telemetry_array_validation.py +0 -0
  34. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/commands/traceability.py +0 -0
  35. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/conventions/naming.convention.yaml +0 -0
  36. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/conventions/session.convention.yaml +0 -0
  37. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/overlays/__init__.py +0 -0
  38. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/overlays/claude.md +0 -0
  39. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/schemas/config.schema.json +0 -0
  40. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/schemas/manifest.schema.json +0 -0
  41. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/templates/ATDD.md +0 -0
  42. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/templates/SESSION-TEMPLATE.md +0 -0
  43. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/__init__.py +0 -0
  44. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/config.py +0 -0
  45. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/coverage_phase.py +0 -0
  46. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/graph/__init__.py +0 -0
  47. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/graph/urn.py +0 -0
  48. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/locale_phase.py +0 -0
  49. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/repo.py +0 -0
  50. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/utils/train_spec_phase.py +0 -0
  51. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/__init__.py +0 -0
  52. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/shared_fixtures.py +0 -0
  53. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_enrich_wagon_registry.py +0 -0
  54. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_registry.py +0 -0
  55. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_release_versioning.py +0 -0
  56. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_archive_status.py +0 -0
  57. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_manifest_alignment.py +0 -0
  58. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_session_validation.py +0 -0
  59. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_traceability.py +0 -0
  60. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_train_registry.py +0 -0
  61. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_update_feature_paths.py +0 -0
  62. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coach/validators/test_validate_contract_consumers.py +0 -0
  63. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/__init__.py +0 -0
  64. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/adapter.recipe.yaml +0 -0
  65. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/backend.convention.yaml +0 -0
  66. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/boundaries.convention.yaml +0 -0
  67. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/commons.convention.yaml +0 -0
  68. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/complexity.recipe.yaml +0 -0
  69. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/component-naming.convention.yaml +0 -0
  70. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/coverage.convention.yaml +0 -0
  71. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/design.convention.yaml +0 -0
  72. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/design.recipe.yaml +0 -0
  73. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/dto.convention.yaml +0 -0
  74. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/frontend.convention.yaml +0 -0
  75. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/green.convention.yaml +0 -0
  76. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/presentation.convention.yaml +0 -0
  77. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/refactor.convention.yaml +0 -0
  78. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/technology.convention.yaml +0 -0
  79. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/__init__.py +0 -0
  80. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_adapter_recipe.py +0 -0
  81. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_complexity_recipe.py +0 -0
  82. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_component_taxonomy.py +0 -0
  83. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_component_urn_naming.py +0 -0
  84. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/tests/test_thinness_recipe.py +0 -0
  85. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/thinness.recipe.yaml +0 -0
  86. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/train.convention.yaml +0 -0
  87. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/conventions/verification.protocol.yaml +0 -0
  88. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/schemas/design_system.schema.json +0 -0
  89. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/__init__.py +0 -0
  90. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/conftest.py +0 -0
  91. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_commons_structure.py +0 -0
  92. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_complexity.py +0 -0
  93. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_cross_language_consistency.py +0 -0
  94. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_design_system_compliance.py +0 -0
  95. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_dto_testing_patterns.py +0 -0
  96. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_cross_stack_layers.py +0 -0
  97. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_layer_dependencies.py +0 -0
  98. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_python_layer_structure.py +0 -0
  99. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_green_supabase_layer_structure.py +0 -0
  100. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_hierarchy_coverage.py +0 -0
  101. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_i18n_runtime.py +0 -0
  102. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_import_boundaries.py +0 -0
  103. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_init_file_urns.py +0 -0
  104. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_preact_layer_boundaries.py +0 -0
  105. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_presentation_convention.py +0 -0
  106. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_python_architecture.py +0 -0
  107. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_quality_metrics.py +0 -0
  108. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_station_master_pattern.py +0 -0
  109. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_train_infrastructure.py +0 -0
  110. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_train_urns.py +0 -0
  111. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_typescript_architecture.py +0 -0
  112. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_usecase_structure.py +0 -0
  113. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/coder/validators/test_wagon_boundaries.py +0 -0
  114. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/conftest.py +0 -0
  115. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/__init__.py +0 -0
  116. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/acceptance.convention.yaml +0 -0
  117. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/appendix.convention.yaml +0 -0
  118. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/artifact-naming.convention.yaml +0 -0
  119. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/component.convention.yaml +0 -0
  120. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/coverage.convention.yaml +0 -0
  121. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/criteria.convention.yaml +0 -0
  122. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/feature.convention.yaml +0 -0
  123. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/interface.convention.yaml +0 -0
  124. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/steps.convention.yaml +0 -0
  125. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/train.convention.yaml +0 -0
  126. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/conventions/wmbt.convention.yaml +0 -0
  127. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/acceptance.schema.json +0 -0
  128. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/appendix.schema.json +0 -0
  129. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/component.schema.json +0 -0
  130. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/feature.schema.json +0 -0
  131. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/train.schema.json +0 -0
  132. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/wagon.schema.json +0 -0
  133. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/schemas/wmbt.schema.json +0 -0
  134. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/__init__.py +0 -0
  135. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/conftest.py +0 -0
  136. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_draft_wagon_registry.py +0 -0
  137. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_hierarchy_coverage.py +0 -0
  138. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_cross_refs.py +0 -0
  139. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_uniqueness.py +0 -0
  140. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_urn_resolution.py +0 -0
  141. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_plan_wagons.py +0 -0
  142. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_train_validation.py +0 -0
  143. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wagon_urn_chain.py +0 -0
  144. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wmbt_consistency.py +0 -0
  145. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/planner/validators/test_wmbt_vocabulary.py +0 -0
  146. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/__init__.py +0 -0
  147. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/contract.convention.yaml +0 -0
  148. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/coverage.convention.yaml +0 -0
  149. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/filename.convention.yaml +0 -0
  150. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/migration.convention.yaml +0 -0
  151. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/red.convention.yaml +0 -0
  152. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/routing.convention.yaml +0 -0
  153. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/security.convention.yaml +0 -0
  154. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/conventions/telemetry.convention.yaml +0 -0
  155. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/a11y.tmpl.json +0 -0
  156. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/artifact.schema.json +0 -0
  157. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/contract.schema.json +0 -0
  158. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/contract.tmpl.json +0 -0
  159. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/db.tmpl.json +0 -0
  160. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/e2e.tmpl.json +0 -0
  161. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/edge_function.tmpl.json +0 -0
  162. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/event.tmpl.json +0 -0
  163. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/http.tmpl.json +0 -0
  164. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/job.tmpl.json +0 -0
  165. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/load.tmpl.json +0 -0
  166. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/locale_manifest.schema.json +0 -0
  167. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/metric.tmpl.json +0 -0
  168. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/pack.schema.json +0 -0
  169. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/realtime.tmpl.json +0 -0
  170. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/rls.tmpl.json +0 -0
  171. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/script.tmpl.json +0 -0
  172. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/sec.tmpl.json +0 -0
  173. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/storage.tmpl.json +0 -0
  174. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/telemetry.schema.json +0 -0
  175. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/telemetry_tracking_manifest.schema.json +0 -0
  176. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/test_filename.schema.json +0 -0
  177. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/test_intent.schema.json +0 -0
  178. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/unit.tmpl.json +0 -0
  179. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/visual.tmpl.json +0 -0
  180. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/schemas/ws.tmpl.json +0 -0
  181. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/utils/__init__.py +0 -0
  182. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/utils/filename.py +0 -0
  183. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/__init__.py +0 -0
  184. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/cleanup_duplicate_headers.py +0 -0
  185. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/cleanup_duplicate_headers_v2.py +0 -0
  186. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/conftest.py +0 -0
  187. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/coverage_gap_report.py +0 -0
  188. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/fix_dual_ac_references.py +0 -0
  189. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/remove_duplicate_lines.py +0 -0
  190. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_acceptance_urn_filename_mapping.py +0 -0
  191. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_acceptance_urn_separator.py +0 -0
  192. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contract_schema_compliance.py +0 -0
  193. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_contract_security.py +0 -0
  194. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_coverage_adequacy.py +0 -0
  195. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_dual_ac_reference.py +0 -0
  196. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_fixture_validity.py +0 -0
  197. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_hierarchy_coverage.py +0 -0
  198. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_isolation.py +0 -0
  199. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_locale_coverage.py +0 -0
  200. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_coverage.py +0 -0
  201. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_criteria.py +0 -0
  202. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_migration_generation.py +0 -0
  203. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_python_test_naming.py +0 -0
  204. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_layer_validation.py +0 -0
  205. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_python_layer_structure.py +0 -0
  206. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_red_supabase_layer_structure.py +0 -0
  207. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_telemetry_structure.py +0 -0
  208. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_backend_e2e.py +0 -0
  209. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_frontend_e2e.py +0 -0
  210. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_train_frontend_python.py +0 -0
  211. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_typescript_test_naming.py +0 -0
  212. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/tester/validators/test_typescript_test_structure.py +0 -0
  213. {atdd-0.7.3 → atdd-0.7.4}/src/atdd/version_check.py +0 -0
  214. {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/SOURCES.txt +0 -0
  215. {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/dependency_links.txt +0 -0
  216. {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/entry_points.txt +0 -0
  217. {atdd-0.7.3 → atdd-0.7.4}/src/atdd.egg-info/requires.txt +0 -0
  218. {atdd-0.7.3 → atdd-0.7.4}/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.3
3
+ Version: 0.7.4
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.3"
7
+ version = "0.7.4"
8
8
  description = "ATDD Platform - Acceptance Test Driven Development toolkit"
9
9
  requires-python = ">=3.10"
10
10
  readme = "README.md"
@@ -177,30 +177,35 @@ artifact_contracts:
177
177
  note: "Full artifact contract conventions defined in artifact.convention.yaml"
178
178
 
179
179
  urn_format:
180
- contract_urn: "contract:domain:resource (e.g., contract:ux:foundations, contract:match:result)"
181
- telemetry_urn: "telemetry:domain:resource[.category] (e.g., telemetry:ux:foundations, telemetry:ux:foundations.colors)"
180
+ contract_urn: "contract:{theme}(:{category})*:{aspect}(.{variant})?"
181
+ telemetry_urn: "telemetry:{theme}(:{category})*:{aspect}(.{variant})?"
182
+ examples:
183
+ - "contract:commons:ux:foundations:color"
184
+ - "contract:mechanic:decision.choice"
185
+ - "contract:sensory:gesture.raw"
186
+ - "telemetry:commons:ux:foundations"
182
187
 
183
188
  telemetry_filesystem:
184
189
  description: "Telemetry URN maps to filesystem directory containing signal files"
185
- pattern: "telemetry/{domain}/{resource}[/{category}]/{signal-type}.{plane}[.{measure}].json"
186
- urn_to_path: "telemetry:{domain}:{resource}[.{category}] → telemetry/{domain}/{resource}[/{category}]/"
190
+ pattern: "telemetry/{segments}/{signal-type}.{plane}[.{measure}].json"
191
+ urn_to_path: "telemetry:{theme}:{segments} → telemetry/{theme}/{segments}/"
187
192
 
188
193
  examples:
189
194
  - urn: "telemetry:mechanic:decision.choice"
190
- path: "telemetry/decision/choice/"
195
+ path: "telemetry/mechanic/decision/choice/"
191
196
  files:
192
197
  - "metric.db.count.json"
193
198
  - "metric.be.duration.json"
194
199
  - "event.be.json"
195
200
 
196
- - urn: "telemetry:ux:foundations"
197
- path: "telemetry/ux/foundations/"
201
+ - urn: "telemetry:commons:ux:foundations"
202
+ path: "telemetry/commons/ux/foundations/"
198
203
  files:
199
204
  - "metric.ui.render_latency.json"
200
205
  - "event.ui.json"
201
206
 
202
- - urn: "telemetry:ux:foundations.colors"
203
- path: "telemetry/ux/foundations/colors/"
207
+ - urn: "telemetry:commons:ux:foundations:color"
208
+ path: "telemetry/commons/ux/foundations/color/"
204
209
  files:
205
210
  - "metric.ui.render_latency.json"
206
211
  - "event.ui.json"
@@ -222,18 +227,21 @@ artifact_contracts:
222
227
 
223
228
  produce_artifacts:
224
229
  required_fields:
225
- - name: "Artifact name (e.g., ux:foundations)"
226
- - contract: "Contract URN or null (e.g., contract:ux:foundations)"
227
- - telemetry: "Telemetry URN for observability and analytics or null (e.g., telemetry:ux:foundations)"
230
+ - name: "Artifact name (e.g., commons:ux:foundations)"
231
+ - contract: "Contract URN or null (e.g., contract:commons:ux:foundations)"
232
+ - telemetry: "Telemetry URN for observability and analytics or null (e.g., telemetry:commons:ux:foundations)"
228
233
  optional_fields:
229
234
  - to: "Visibility (internal|external), defaults to external"
230
235
  - urn: "Legacy artifact URN"
231
236
  - version: "Version string (e.g., v1)"
232
237
 
233
238
  example:
234
- - name: ux:foundations
235
- contract: contract:ux:foundations
236
- telemetry: telemetry:ux:foundations
239
+ - name: commons:ux:foundations
240
+ contract: contract:commons:ux:foundations
241
+ telemetry: telemetry:commons:ux:foundations
242
+ - name: commons:ux:foundations:color
243
+ contract: contract:commons:ux:foundations:color
244
+ telemetry: telemetry:commons:ux:foundations:color
237
245
  - name: internal:cache
238
246
  contract: null
239
247
  telemetry: null
@@ -251,10 +259,10 @@ artifact_contracts:
251
259
 
252
260
  example:
253
261
  - name: appendix:mockup
254
- - name: match:config
255
- from: wagon:setup-match
256
- contract: contract:match:config
257
- telemetry: telemetry:match:config
262
+ - name: commons:ux:foundations
263
+ from: wagon:maintain-ux
264
+ contract: contract:commons:ux:foundations
265
+ telemetry: telemetry:commons:ux:foundations
258
266
 
259
267
  features_format:
260
268
  legacy_format:
@@ -0,0 +1,276 @@
1
+ # Artifact Convention
2
+ # Defines naming, versioning, organization, and API mapping rules for artifact-centric contracts
3
+ # Aligned with canonical artifact-naming.convention.yaml v2.1
4
+
5
+ description: "Artifact-centric contract system using theme-based hierarchical taxonomy with variant facets"
6
+
7
+ naming:
8
+ logical_pattern: "{theme}(:{category})*:{aspect}(.{variant})?"
9
+ physical_pattern: "contracts/{theme}/{segments}/{aspect}[/{variant}].schema.json"
10
+ rationale: "Theme-based organization enables clear architectural boundaries. Colon separator denotes hierarchical descent (unlimited depth), dot separator denotes lateral variant (typically 0-1). Each segment becomes a directory level."
11
+
12
+ examples:
13
+ - logical: "commons:ux:foundations"
14
+ physical: "contracts/commons/ux/foundations.schema.json"
15
+
16
+ - logical: "commons:ux:foundations:color"
17
+ physical: "contracts/commons/ux/foundations/color.schema.json"
18
+
19
+ - logical: "mechanic:decision.choice"
20
+ physical: "contracts/mechanic/decision/choice.schema.json"
21
+
22
+ - logical: "match:result"
23
+ physical: "contracts/match/result.schema.json"
24
+
25
+ - logical: "sensory:gesture.raw"
26
+ physical: "contracts/sensory/gesture/raw.schema.json"
27
+
28
+ versioning:
29
+ location: "Separate version field"
30
+ filename_pattern: "{segments}.schema.json"
31
+ id_pattern: "{artifact_name}"
32
+ version_field: "version"
33
+ rationale: "Version tracked in separate 'version' field, NOT embedded in $id. Allows artifact identity to remain stable across versions. Supports monolithic deployment with coordinated releases."
34
+
35
+ examples:
36
+ - artifact: "commons/ux/foundations/color.schema.json"
37
+ id_field: "commons:ux:foundations:color"
38
+ version_field: "1.0.0"
39
+
40
+ - artifact: "mechanic/decision/choice.schema.json"
41
+ id_field: "mechanic:decision.choice"
42
+ version_field: "1.0.0"
43
+
44
+ - artifact: "match/result.schema.json"
45
+ id_field: "match:result"
46
+ version_field: "1.2.3"
47
+
48
+ - artifact: "sensory/gesture/raw.schema.json"
49
+ id_field: "sensory:gesture.raw"
50
+ version_field: "1.0.0"
51
+
52
+ organization:
53
+ strategy: "by_theme"
54
+ directory_structure: "contracts/{theme}/"
55
+ rationale: "Theme-based directories enable clear architectural boundaries. Each theme represents a bounded context. Unlimited hierarchical depth supported via colons."
56
+
57
+ structure:
58
+ root: "contracts/"
59
+ themes:
60
+ - "commons/"
61
+ - "match/"
62
+ - "mechanic/"
63
+ - "sensory/"
64
+ - "player/"
65
+ - "scenario/"
66
+ - "partnership/"
67
+ - "league/"
68
+ - "audience/"
69
+ - "monetization/"
70
+
71
+ api_mapping:
72
+ description: "Artifact names map to REST API endpoints for external consumption. Hierarchy levels add path segments, variants treated as resources."
73
+ pattern: "/{theme}s/{id}/{segments}[/{variant}]"
74
+
75
+ methods:
76
+ new: POST
77
+ created: POST
78
+ registered: POST
79
+ started: POST
80
+ result: GET
81
+ active: GET
82
+ config: GET
83
+ events: GET
84
+ current: GET
85
+ foundations: GET
86
+ updated: PUT
87
+ closed: PUT
88
+ completed: PUT
89
+ terminated: DELETE
90
+ deleted: DELETE
91
+
92
+ examples:
93
+ - artifact: "commons:ux:foundations"
94
+ endpoint: "GET /commons/{id}/ux/foundations"
95
+ description: "Retrieve UX foundations"
96
+
97
+ - artifact: "commons:ux:foundations:color"
98
+ endpoint: "GET /commons/{id}/ux/foundations/color"
99
+ description: "Retrieve UX color foundations"
100
+
101
+ - artifact: "match:result"
102
+ endpoint: "GET /matches/{id}/result"
103
+ description: "Retrieve match result"
104
+
105
+ - artifact: "session:new"
106
+ endpoint: "POST /sessions"
107
+ description: "Create new session"
108
+
109
+ - artifact: "player:identity"
110
+ endpoint: "GET /players/{id}"
111
+ description: "Retrieve player identity"
112
+
113
+ - artifact: "match:config"
114
+ endpoint: "GET /matches/{id}/config"
115
+ description: "Retrieve match configuration"
116
+
117
+ - artifact: "player:updated"
118
+ endpoint: "PUT /players/{id}"
119
+ description: "Update player"
120
+
121
+ - artifact: "match:terminated"
122
+ endpoint: "DELETE /matches/{id}"
123
+ description: "Terminate match"
124
+
125
+ ownership:
126
+ producer: "Generates artifact contract (wagon that declares artifact in produce[])"
127
+ consumer: "References existing contract (wagon that declares artifact in consume[])"
128
+ single_source: "One artifact = one JSON file. Multiple wagons reference same file. Zero duplication."
129
+
130
+ rules:
131
+ - "Producer wagon owns the artifact schema generation"
132
+ - "Consumer wagon validates artifact existence and references it"
133
+ - "Artifact path declared in wagon manifest contract: field"
134
+ - "Only producer generates; consumers must never modify"
135
+
136
+ metadata:
137
+ description: "Artifact schemas include x-artifact-metadata for tooling and API generation"
138
+
139
+ fields:
140
+ theme: "Architectural theme (commons, match, mechanic, etc.)"
141
+ aspect: "Final leaf resource noun"
142
+ variant: "Optional lateral variation"
143
+ api:
144
+ method: "HTTP method (GET, POST, PUT, DELETE)"
145
+ path: "REST endpoint path"
146
+
147
+ example:
148
+ theme: "match"
149
+ aspect: "result"
150
+ api:
151
+ method: "GET"
152
+ path: "/matches/{id}/result"
153
+
154
+ validation:
155
+ required_fields: ["$schema", "$id", "version", "title", "type", "properties"]
156
+ schema_compliance: "JSON Schema Draft-07"
157
+ id_pattern: "^[a-z]+(?::[a-z][a-z0-9-]*)+(?:\\.[a-z][a-z0-9-]*)?$"
158
+ version_pattern: "^\\d+\\.\\d+\\.\\d+$"
159
+
160
+ artifact_urns:
161
+ urn_pattern:
162
+ format: "contract:{artifact_name}"
163
+ conversion_rule: "URN exactly matches artifact name - preserves colons for hierarchy and dots for variants. Pattern: contract:{theme}(:{category})*:{aspect}(.{variant})?"
164
+
165
+ examples:
166
+ artifact_to_urn:
167
+ - artifact_name: "commons:ux:foundations"
168
+ urn: "contract:commons:ux:foundations"
169
+
170
+ - artifact_name: "commons:ux:foundations:color"
171
+ urn: "contract:commons:ux:foundations:color"
172
+
173
+ - artifact_name: "mechanic:decision.choice"
174
+ urn: "contract:mechanic:decision.choice"
175
+
176
+ - artifact_name: "sensory:gesture.raw"
177
+ urn: "contract:sensory:gesture.raw"
178
+
179
+ bidirectional_linkage:
180
+ validation: "URN must resolve to a contract in the registry. All colons and dots preserved."
181
+
182
+ migration_strategy:
183
+ refactor_note: "Legacy URNs contract:{domain}:{resource}[.{category}] migrate to contract:{theme}(:{category})*:{aspect}(.{variant})?. Version suffix removed from $id."
184
+
185
+ wagon_artifacts:
186
+ produce_example:
187
+ wagon: "maintain-ux"
188
+ produce:
189
+ - name: "commons:ux:foundations"
190
+ urn: "contract:commons:ux:foundations"
191
+ to: "external"
192
+
193
+ - name: "commons:ux:foundations:color"
194
+ urn: "contract:commons:ux:foundations:color"
195
+ to: "external"
196
+
197
+ consume_example:
198
+ wagon: "stage-characters"
199
+ consume:
200
+ - name: "commons:ux:foundations"
201
+ urn: "contract:commons:ux:foundations"
202
+ from: "wagon:maintain-ux"
203
+
204
+ contract_artifacts:
205
+ id_field: "id: {artifact_name}"
206
+ urn_mapping: "URN contract:{artifact_name} maps directly to $id {artifact_name}"
207
+
208
+ example:
209
+ - id: "commons:ux:foundations"
210
+ version: "1.0.0"
211
+ path: "commons/ux/foundations.schema.json"
212
+ producer: "wagon:maintain-ux"
213
+ urn_match: "contract:commons:ux:foundations"
214
+
215
+ - id: "commons:ux:foundations:color"
216
+ version: "1.0.0"
217
+ path: "commons/ux/foundations/color.schema.json"
218
+ producer: "wagon:maintain-ux"
219
+ urn_match: "contract:commons:ux:foundations:color"
220
+
221
+ - id: "mechanic:decision.choice"
222
+ version: "1.0.0"
223
+ path: "mechanic/decision/choice.schema.json"
224
+ producer: "wagon:resolve-dilemmas"
225
+ urn_match: "contract:mechanic:decision.choice"
226
+
227
+ demo_mode:
228
+ description: "Artifacts write to demo/contracts/artifacts/ when mode_demo: true"
229
+ path_prefix: "demo/contracts/artifacts/"
230
+
231
+ examples:
232
+ complete_workflow:
233
+ - step: "Wagon declares artifact in produce[]"
234
+ example: |
235
+ produce:
236
+ - name: mechanic:decision.choice
237
+ to: external
238
+ contract: contracts/mechanic/decision/choice.schema.json
239
+
240
+ - step: "Tester agent classifies artifact ownership"
241
+ result: "producer: true, path: mechanic/decision/choice.schema.json"
242
+
243
+ - step: "Schema generation creates artifact"
244
+ output: "contracts/mechanic/decision/choice.schema.json"
245
+ content: |
246
+ {
247
+ "$schema": "http://json-schema.org/draft-07/schema#",
248
+ "$id": "mechanic:decision.choice",
249
+ "version": "1.0.0",
250
+ "title": "Decision Choice",
251
+ "type": "object",
252
+ "properties": {...},
253
+ "x-artifact-metadata": {
254
+ "theme": "mechanic",
255
+ "aspect": "decision",
256
+ "variant": "choice",
257
+ "api": {
258
+ "method": "POST",
259
+ "path": "/decisions"
260
+ }
261
+ }
262
+ }
263
+
264
+ - step: "Consumer wagon references artifact"
265
+ example: |
266
+ consume:
267
+ - name: mechanic:decision.choice
268
+ from: wagon:resolve-dilemmas
269
+ contract: contracts/mechanic/decision/choice.schema.json
270
+
271
+ - step: "Pack generation references (not embeds) artifact"
272
+ pack_manifest: |
273
+ produce:
274
+ - artifact: mechanic:decision.choice
275
+ contract: ../artifacts/mechanic/decision/choice.schema.json
276
+ owner: true
@@ -0,0 +1,294 @@
1
+ """
2
+ RED Tests for Artifact Naming Convention with Theme-Based Hierarchical Taxonomy
3
+
4
+ SPEC: SPEC-TESTER-CONV-0059 through SPEC-TESTER-CONV-0067
5
+ Feature: Artifact naming uses theme-based hierarchical pattern with variant facets
6
+ Background:
7
+ - Colon separator denotes hierarchical descent (unlimited depth)
8
+ - Dot separator denotes lateral variant (typically 0-1)
9
+ - Pattern: {theme}(:{category})*:{aspect}(.{variant})?
10
+ - Examples use commons:ux:foundations:color instead of legacy ux:foundations
11
+ """
12
+
13
+ import pytest
14
+ import yaml
15
+ from pathlib import Path
16
+
17
+
18
+ @pytest.fixture
19
+ def artifact_convention():
20
+ """Load artifact.convention.yaml"""
21
+ # File is at atdd/tester/audits/test_*.py, convention is at atdd/tester/conventions/
22
+ convention_path = Path(__file__).parent.parent / "conventions" / "artifact.convention.yaml"
23
+ assert convention_path.exists(), f"Convention file not found: {convention_path}"
24
+
25
+ with open(convention_path) as f:
26
+ return yaml.safe_load(f)
27
+
28
+
29
+ # SPEC-TESTER-CONV-0059
30
+ def test_logical_pattern_has_theme_hierarchy(artifact_convention):
31
+ """Logical naming pattern supports theme-based hierarchy with variants"""
32
+ naming = artifact_convention.get("naming", {})
33
+ logical_pattern = naming.get("logical_pattern")
34
+
35
+ assert logical_pattern == "{theme}(:{category})*:{aspect}(.{variant})?", \
36
+ f"Expected logical_pattern to be '{{theme}}(:{{category}})*:{{aspect}}(.{{variant}})?', got: {logical_pattern}"
37
+
38
+ # Verify rationale explains hierarchy vs variant
39
+ rationale = naming.get("rationale", "")
40
+ assert "colon" in rationale.lower() or "hierarchy" in rationale.lower(), \
41
+ "Rationale should explain colon separator for hierarchical descent"
42
+
43
+
44
+ # SPEC-TESTER-CONV-0060
45
+ def test_physical_pattern_has_segments(artifact_convention):
46
+ """Physical path pattern supports hierarchical segments"""
47
+ naming = artifact_convention.get("naming", {})
48
+ physical_pattern = naming.get("physical_pattern")
49
+
50
+ assert "contracts/" in physical_pattern and ".schema.json" in physical_pattern, \
51
+ f"Expected physical_pattern with contracts/ prefix and .schema.json extension, got: {physical_pattern}"
52
+
53
+ # Check examples demonstrate theme-based patterns
54
+ examples = naming.get("examples", [])
55
+ assert len(examples) >= 2, "Should have examples for various hierarchy depths"
56
+
57
+
58
+ # SPEC-TESTER-CONV-0061
59
+ def test_examples_use_theme_hierarchy(artifact_convention):
60
+ """Examples use theme-based hierarchy (commons:ux:foundations:color)"""
61
+ naming = artifact_convention.get("naming", {})
62
+ examples = naming.get("examples", [])
63
+
64
+ # Check for commons:ux:foundations hierarchy examples
65
+ ux_base = None
66
+ ux_deep = None
67
+
68
+ for example in examples:
69
+ if example.get("logical") == "commons:ux:foundations":
70
+ ux_base = example
71
+ if example.get("logical") == "commons:ux:foundations:color":
72
+ ux_deep = example
73
+
74
+ assert ux_base is not None, "Missing commons:ux:foundations base example"
75
+ assert "contracts/commons/ux/foundations" in ux_base.get("physical", ""), \
76
+ f"commons:ux:foundations should map to contracts/commons/ux/foundations path"
77
+
78
+ assert ux_deep is not None, "Missing commons:ux:foundations:color deep hierarchy example"
79
+ assert "contracts/commons/ux/foundations/color" in ux_deep.get("physical", ""), \
80
+ f"commons:ux:foundations:color should map to contracts/commons/ux/foundations/color path"
81
+
82
+
83
+ # SPEC-TESTER-CONV-0061 (part 2)
84
+ def test_no_legacy_domain_resource_examples(artifact_convention):
85
+ """No legacy domain:resource examples remain (should use theme-based)"""
86
+ naming = artifact_convention.get("naming", {})
87
+ examples = naming.get("examples", [])
88
+
89
+ for example in examples:
90
+ logical = example.get("logical", "")
91
+ # Legacy patterns like "ux:foundations" or "design:tokens" without theme prefix
92
+ if logical.count(":") == 1:
93
+ # Single colon is OK for simple patterns like "match:result"
94
+ pass
95
+ # Check no "ux:foundations.colors" dot-for-hierarchy pattern
96
+ assert ".colors" not in logical or logical.count(":") >= 2, \
97
+ f"Found legacy dot-for-hierarchy example: {logical}"
98
+
99
+
100
+ # SPEC-TESTER-CONV-0062
101
+ def test_api_pattern_has_theme_segments(artifact_convention):
102
+ """API mapping supports theme-based hierarchy"""
103
+ api_mapping = artifact_convention.get("api_mapping", {})
104
+ pattern = api_mapping.get("pattern")
105
+
106
+ # Pattern should include theme and segments
107
+ assert "{" in pattern and "}" in pattern, \
108
+ f"Expected API pattern with template variables, got: {pattern}"
109
+
110
+
111
+ # SPEC-TESTER-CONV-0062 (part 2)
112
+ def test_api_examples_include_theme_based(artifact_convention):
113
+ """API examples include theme-based patterns"""
114
+ api_mapping = artifact_convention.get("api_mapping", {})
115
+ examples = api_mapping.get("examples", [])
116
+
117
+ # Check for theme-based examples
118
+ has_commons_example = False
119
+ has_match_example = False
120
+
121
+ for example in examples:
122
+ artifact = example.get("artifact", "")
123
+ if artifact.startswith("commons:"):
124
+ has_commons_example = True
125
+ if artifact.startswith("match:"):
126
+ has_match_example = True
127
+
128
+ assert has_commons_example or has_match_example, \
129
+ "API examples should include theme-based patterns (commons:*, match:*, etc.)"
130
+
131
+
132
+ # SPEC-TESTER-CONV-0063
133
+ def test_urn_pattern_preserves_colons_and_dots(artifact_convention):
134
+ """URN pattern preserves colons for hierarchy and dots for variants"""
135
+ artifact_urns = artifact_convention.get("artifact_urns", {})
136
+ urn_pattern = artifact_urns.get("urn_pattern", {})
137
+
138
+ format_str = urn_pattern.get("format")
139
+ assert format_str == "contract:{artifact_name}", \
140
+ f"Expected URN format 'contract:{{artifact_name}}', got: {format_str}"
141
+
142
+ # Check conversion rule explains preservation
143
+ conversion_rule = urn_pattern.get("conversion_rule", "")
144
+ assert "colon" in conversion_rule.lower() or "hierarchy" in conversion_rule.lower(), \
145
+ "Conversion rule should explain colon preservation for hierarchy"
146
+
147
+
148
+ # SPEC-TESTER-CONV-0063 (part 2)
149
+ def test_urn_examples_use_theme_hierarchy(artifact_convention):
150
+ """URN examples use theme-based hierarchy"""
151
+ artifact_urns = artifact_convention.get("artifact_urns", {})
152
+ examples = artifact_urns.get("examples", {})
153
+ artifact_to_urn = examples.get("artifact_to_urn", [])
154
+
155
+ # Check for theme-based examples
156
+ has_theme_example = False
157
+ has_variant_example = False
158
+
159
+ for example in artifact_to_urn:
160
+ artifact_name = example.get("artifact_name", "")
161
+ urn = example.get("urn", "")
162
+
163
+ # Theme-based: multiple colons
164
+ if artifact_name.count(":") >= 2:
165
+ has_theme_example = True
166
+ # URN should match artifact with contract: prefix
167
+ assert urn == f"contract:{artifact_name}", \
168
+ f"URN should be 'contract:{artifact_name}', got: {urn}"
169
+
170
+ # Variant: has dot
171
+ if "." in artifact_name:
172
+ has_variant_example = True
173
+
174
+ assert has_theme_example, "Missing theme-based hierarchy URN example (multiple colons)"
175
+
176
+
177
+ # SPEC-TESTER-CONV-0064
178
+ def test_contract_id_unversioned(artifact_convention):
179
+ """Contract ID field uses unversioned artifact name"""
180
+ contract_artifacts = artifact_convention.get("contract_artifacts", {})
181
+ id_field = contract_artifacts.get("id_field")
182
+
183
+ # Should NOT have :v{version} suffix
184
+ assert ":v{version}" not in id_field and ":v1" not in id_field, \
185
+ f"ID field should be unversioned, got: {id_field}"
186
+
187
+ # Should reference artifact_name
188
+ assert "{artifact_name}" in id_field, \
189
+ f"ID field should reference artifact_name, got: {id_field}"
190
+
191
+
192
+ # SPEC-TESTER-CONV-0064 (part 2)
193
+ def test_contract_examples_use_theme_hierarchy(artifact_convention):
194
+ """Contract examples use theme-based hierarchy"""
195
+ contract_artifacts = artifact_convention.get("contract_artifacts", {})
196
+ examples = contract_artifacts.get("example", [])
197
+
198
+ # Check for theme-based examples
199
+ has_theme_example = False
200
+
201
+ for example in examples:
202
+ id_value = example.get("id", "")
203
+ # Theme-based: has multiple colons and NO :v suffix
204
+ if id_value.count(":") >= 2 and ":v" not in id_value:
205
+ has_theme_example = True
206
+ # Should have separate version field
207
+ assert "version" in example, \
208
+ f"Example should have separate version field, got: {example}"
209
+
210
+ assert has_theme_example, "Missing theme-based hierarchy contract example"
211
+
212
+
213
+ # SPEC-TESTER-CONV-0065
214
+ def test_wagon_examples_use_maintain_ux(artifact_convention):
215
+ """Wagon artifacts examples updated to maintain-ux"""
216
+ wagon_artifacts = artifact_convention.get("wagon_artifacts", {})
217
+ produce_example = wagon_artifacts.get("produce_example", {})
218
+
219
+ wagon_name = produce_example.get("wagon")
220
+ assert wagon_name == "maintain-ux", \
221
+ f"Expected producer wagon 'maintain-ux', got: {wagon_name}"
222
+
223
+
224
+ # SPEC-TESTER-CONV-0065 (part 2)
225
+ def test_wagon_produces_theme_hierarchy_artifacts(artifact_convention):
226
+ """Wagon produces theme-based hierarchy artifacts"""
227
+ wagon_artifacts = artifact_convention.get("wagon_artifacts", {})
228
+ produce_example = wagon_artifacts.get("produce_example", {})
229
+ produce = produce_example.get("produce", [])
230
+
231
+ # Check for theme-based artifacts
232
+ has_theme_artifact = False
233
+
234
+ for item in produce:
235
+ name = item.get("name", "")
236
+ urn = item.get("urn", "")
237
+
238
+ # Theme-based: multiple colons
239
+ if name.count(":") >= 2:
240
+ has_theme_artifact = True
241
+ # URN should match name with contract: prefix
242
+ assert urn == f"contract:{name}", \
243
+ f"Expected URN 'contract:{name}', got: {urn}"
244
+
245
+ assert has_theme_artifact, "Missing theme-based hierarchy in produce artifacts"
246
+
247
+
248
+ # SPEC-TESTER-CONV-0066
249
+ def test_validation_regex_allows_theme_hierarchy(artifact_convention):
250
+ """Validation regex allows unlimited colons and optional variant dot"""
251
+ import re
252
+
253
+ validation = artifact_convention.get("validation", {})
254
+ id_pattern = validation.get("id_pattern")
255
+
256
+ assert id_pattern is not None, "Missing id_pattern in validation section"
257
+
258
+ # Test the regex against valid patterns
259
+ test_cases = [
260
+ ("commons:ux:foundations:color", True), # Deep hierarchy
261
+ ("commons:ux:foundations", True), # Medium hierarchy
262
+ ("mechanic:decision.choice", True), # Variant with dot
263
+ ("match:result", True), # Simple theme:aspect
264
+ ("sensory:gesture.raw", True), # Theme:aspect.variant
265
+ ("invalid", False), # No colon at all
266
+ ("no-version:v1", False), # Old style with version suffix
267
+ ]
268
+
269
+ for test_input, should_match in test_cases:
270
+ match = re.match(id_pattern, test_input)
271
+ if should_match:
272
+ assert match is not None, \
273
+ f"Pattern '{id_pattern}' should match '{test_input}'"
274
+ else:
275
+ # Note: some patterns may or may not match depending on regex specifics
276
+ pass
277
+
278
+
279
+ # SPEC-TESTER-CONV-0067
280
+ def test_migration_note_documents_refactoring(artifact_convention):
281
+ """Migration note documents legacy URN refactoring"""
282
+ artifact_urns = artifact_convention.get("artifact_urns", {})
283
+ migration_strategy = artifact_urns.get("migration_strategy", {})
284
+ refactor_note = migration_strategy.get("refactor_note", "")
285
+
286
+ assert refactor_note != "", "Missing refactor_note in migration_strategy"
287
+
288
+ # Check for legacy pattern documentation
289
+ assert "legacy" in refactor_note.lower() or "migrate" in refactor_note.lower(), \
290
+ "Should document legacy migration"
291
+
292
+ # Check for version suffix removal
293
+ assert "version" in refactor_note.lower() or "$id" in refactor_note.lower(), \
294
+ "Should mention version removal from $id"