atdd 0.1.0__py3-none-any.whl

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 (183) hide show
  1. atdd/__init__.py +0 -0
  2. atdd/cli.py +404 -0
  3. atdd/coach/__init__.py +0 -0
  4. atdd/coach/commands/__init__.py +0 -0
  5. atdd/coach/commands/add_persistence_metadata.py +215 -0
  6. atdd/coach/commands/analyze_migrations.py +188 -0
  7. atdd/coach/commands/consumers.py +720 -0
  8. atdd/coach/commands/infer_governance_status.py +149 -0
  9. atdd/coach/commands/initializer.py +177 -0
  10. atdd/coach/commands/interface.py +1078 -0
  11. atdd/coach/commands/inventory.py +565 -0
  12. atdd/coach/commands/migration.py +240 -0
  13. atdd/coach/commands/registry.py +1560 -0
  14. atdd/coach/commands/session.py +430 -0
  15. atdd/coach/commands/sync.py +405 -0
  16. atdd/coach/commands/test_interface.py +399 -0
  17. atdd/coach/commands/test_runner.py +141 -0
  18. atdd/coach/commands/tests/__init__.py +1 -0
  19. atdd/coach/commands/tests/test_telemetry_array_validation.py +235 -0
  20. atdd/coach/commands/traceability.py +4264 -0
  21. atdd/coach/conventions/session.convention.yaml +754 -0
  22. atdd/coach/overlays/__init__.py +2 -0
  23. atdd/coach/overlays/claude.md +2 -0
  24. atdd/coach/schemas/config.schema.json +34 -0
  25. atdd/coach/schemas/manifest.schema.json +101 -0
  26. atdd/coach/templates/ATDD.md +282 -0
  27. atdd/coach/templates/SESSION-TEMPLATE.md +327 -0
  28. atdd/coach/utils/__init__.py +0 -0
  29. atdd/coach/utils/graph/__init__.py +0 -0
  30. atdd/coach/utils/graph/urn.py +875 -0
  31. atdd/coach/validators/__init__.py +0 -0
  32. atdd/coach/validators/shared_fixtures.py +365 -0
  33. atdd/coach/validators/test_enrich_wagon_registry.py +167 -0
  34. atdd/coach/validators/test_registry.py +575 -0
  35. atdd/coach/validators/test_session_validation.py +1183 -0
  36. atdd/coach/validators/test_traceability.py +448 -0
  37. atdd/coach/validators/test_update_feature_paths.py +108 -0
  38. atdd/coach/validators/test_validate_contract_consumers.py +297 -0
  39. atdd/coder/__init__.py +1 -0
  40. atdd/coder/conventions/adapter.recipe.yaml +88 -0
  41. atdd/coder/conventions/backend.convention.yaml +460 -0
  42. atdd/coder/conventions/boundaries.convention.yaml +666 -0
  43. atdd/coder/conventions/commons.convention.yaml +460 -0
  44. atdd/coder/conventions/complexity.recipe.yaml +109 -0
  45. atdd/coder/conventions/component-naming.convention.yaml +178 -0
  46. atdd/coder/conventions/design.convention.yaml +327 -0
  47. atdd/coder/conventions/design.recipe.yaml +273 -0
  48. atdd/coder/conventions/dto.convention.yaml +660 -0
  49. atdd/coder/conventions/frontend.convention.yaml +542 -0
  50. atdd/coder/conventions/green.convention.yaml +1012 -0
  51. atdd/coder/conventions/presentation.convention.yaml +587 -0
  52. atdd/coder/conventions/refactor.convention.yaml +535 -0
  53. atdd/coder/conventions/technology.convention.yaml +206 -0
  54. atdd/coder/conventions/tests/__init__.py +0 -0
  55. atdd/coder/conventions/tests/test_adapter_recipe.py +302 -0
  56. atdd/coder/conventions/tests/test_complexity_recipe.py +289 -0
  57. atdd/coder/conventions/tests/test_component_taxonomy.py +278 -0
  58. atdd/coder/conventions/tests/test_component_urn_naming.py +165 -0
  59. atdd/coder/conventions/tests/test_thinness_recipe.py +286 -0
  60. atdd/coder/conventions/thinness.recipe.yaml +82 -0
  61. atdd/coder/conventions/train.convention.yaml +325 -0
  62. atdd/coder/conventions/verification.protocol.yaml +53 -0
  63. atdd/coder/schemas/design_system.schema.json +361 -0
  64. atdd/coder/validators/__init__.py +0 -0
  65. atdd/coder/validators/test_commons_structure.py +485 -0
  66. atdd/coder/validators/test_complexity.py +416 -0
  67. atdd/coder/validators/test_cross_language_consistency.py +431 -0
  68. atdd/coder/validators/test_design_system_compliance.py +413 -0
  69. atdd/coder/validators/test_dto_testing_patterns.py +268 -0
  70. atdd/coder/validators/test_green_cross_stack_layers.py +168 -0
  71. atdd/coder/validators/test_green_layer_dependencies.py +148 -0
  72. atdd/coder/validators/test_green_python_layer_structure.py +103 -0
  73. atdd/coder/validators/test_green_supabase_layer_structure.py +103 -0
  74. atdd/coder/validators/test_import_boundaries.py +396 -0
  75. atdd/coder/validators/test_init_file_urns.py +593 -0
  76. atdd/coder/validators/test_preact_layer_boundaries.py +221 -0
  77. atdd/coder/validators/test_presentation_convention.py +260 -0
  78. atdd/coder/validators/test_python_architecture.py +674 -0
  79. atdd/coder/validators/test_quality_metrics.py +420 -0
  80. atdd/coder/validators/test_station_master_pattern.py +244 -0
  81. atdd/coder/validators/test_train_infrastructure.py +454 -0
  82. atdd/coder/validators/test_train_urns.py +293 -0
  83. atdd/coder/validators/test_typescript_architecture.py +616 -0
  84. atdd/coder/validators/test_usecase_structure.py +421 -0
  85. atdd/coder/validators/test_wagon_boundaries.py +586 -0
  86. atdd/conftest.py +126 -0
  87. atdd/planner/__init__.py +1 -0
  88. atdd/planner/conventions/acceptance.convention.yaml +538 -0
  89. atdd/planner/conventions/appendix.convention.yaml +187 -0
  90. atdd/planner/conventions/artifact-naming.convention.yaml +852 -0
  91. atdd/planner/conventions/component.convention.yaml +670 -0
  92. atdd/planner/conventions/criteria.convention.yaml +141 -0
  93. atdd/planner/conventions/feature.convention.yaml +371 -0
  94. atdd/planner/conventions/interface.convention.yaml +382 -0
  95. atdd/planner/conventions/steps.convention.yaml +141 -0
  96. atdd/planner/conventions/train.convention.yaml +552 -0
  97. atdd/planner/conventions/wagon.convention.yaml +275 -0
  98. atdd/planner/conventions/wmbt.convention.yaml +258 -0
  99. atdd/planner/schemas/acceptance.schema.json +336 -0
  100. atdd/planner/schemas/appendix.schema.json +78 -0
  101. atdd/planner/schemas/component.schema.json +114 -0
  102. atdd/planner/schemas/feature.schema.json +197 -0
  103. atdd/planner/schemas/train.schema.json +192 -0
  104. atdd/planner/schemas/wagon.schema.json +281 -0
  105. atdd/planner/schemas/wmbt.schema.json +59 -0
  106. atdd/planner/validators/__init__.py +0 -0
  107. atdd/planner/validators/conftest.py +5 -0
  108. atdd/planner/validators/test_draft_wagon_registry.py +374 -0
  109. atdd/planner/validators/test_plan_cross_refs.py +240 -0
  110. atdd/planner/validators/test_plan_uniqueness.py +224 -0
  111. atdd/planner/validators/test_plan_urn_resolution.py +268 -0
  112. atdd/planner/validators/test_plan_wagons.py +174 -0
  113. atdd/planner/validators/test_train_validation.py +514 -0
  114. atdd/planner/validators/test_wagon_urn_chain.py +648 -0
  115. atdd/planner/validators/test_wmbt_consistency.py +327 -0
  116. atdd/planner/validators/test_wmbt_vocabulary.py +632 -0
  117. atdd/tester/__init__.py +1 -0
  118. atdd/tester/conventions/artifact.convention.yaml +257 -0
  119. atdd/tester/conventions/contract.convention.yaml +1009 -0
  120. atdd/tester/conventions/filename.convention.yaml +555 -0
  121. atdd/tester/conventions/migration.convention.yaml +509 -0
  122. atdd/tester/conventions/red.convention.yaml +797 -0
  123. atdd/tester/conventions/routing.convention.yaml +51 -0
  124. atdd/tester/conventions/telemetry.convention.yaml +458 -0
  125. atdd/tester/schemas/a11y.tmpl.json +17 -0
  126. atdd/tester/schemas/artifact.schema.json +189 -0
  127. atdd/tester/schemas/contract.schema.json +591 -0
  128. atdd/tester/schemas/contract.tmpl.json +95 -0
  129. atdd/tester/schemas/db.tmpl.json +20 -0
  130. atdd/tester/schemas/e2e.tmpl.json +17 -0
  131. atdd/tester/schemas/edge_function.tmpl.json +17 -0
  132. atdd/tester/schemas/event.tmpl.json +17 -0
  133. atdd/tester/schemas/http.tmpl.json +19 -0
  134. atdd/tester/schemas/job.tmpl.json +18 -0
  135. atdd/tester/schemas/load.tmpl.json +21 -0
  136. atdd/tester/schemas/metric.tmpl.json +19 -0
  137. atdd/tester/schemas/pack.schema.json +139 -0
  138. atdd/tester/schemas/realtime.tmpl.json +20 -0
  139. atdd/tester/schemas/rls.tmpl.json +18 -0
  140. atdd/tester/schemas/script.tmpl.json +16 -0
  141. atdd/tester/schemas/sec.tmpl.json +18 -0
  142. atdd/tester/schemas/storage.tmpl.json +18 -0
  143. atdd/tester/schemas/telemetry.schema.json +128 -0
  144. atdd/tester/schemas/telemetry_tracking_manifest.schema.json +143 -0
  145. atdd/tester/schemas/test_filename.schema.json +194 -0
  146. atdd/tester/schemas/test_intent.schema.json +179 -0
  147. atdd/tester/schemas/unit.tmpl.json +18 -0
  148. atdd/tester/schemas/visual.tmpl.json +18 -0
  149. atdd/tester/schemas/ws.tmpl.json +17 -0
  150. atdd/tester/utils/__init__.py +0 -0
  151. atdd/tester/utils/filename.py +300 -0
  152. atdd/tester/validators/__init__.py +0 -0
  153. atdd/tester/validators/cleanup_duplicate_headers.py +116 -0
  154. atdd/tester/validators/cleanup_duplicate_headers_v2.py +135 -0
  155. atdd/tester/validators/conftest.py +5 -0
  156. atdd/tester/validators/coverage_gap_report.py +321 -0
  157. atdd/tester/validators/fix_dual_ac_references.py +179 -0
  158. atdd/tester/validators/remove_duplicate_lines.py +93 -0
  159. atdd/tester/validators/test_acceptance_urn_filename_mapping.py +359 -0
  160. atdd/tester/validators/test_acceptance_urn_separator.py +166 -0
  161. atdd/tester/validators/test_artifact_naming_category.py +307 -0
  162. atdd/tester/validators/test_contract_schema_compliance.py +706 -0
  163. atdd/tester/validators/test_contracts_structure.py +200 -0
  164. atdd/tester/validators/test_coverage_adequacy.py +797 -0
  165. atdd/tester/validators/test_dual_ac_reference.py +225 -0
  166. atdd/tester/validators/test_fixture_validity.py +372 -0
  167. atdd/tester/validators/test_isolation.py +487 -0
  168. atdd/tester/validators/test_migration_coverage.py +204 -0
  169. atdd/tester/validators/test_migration_criteria.py +276 -0
  170. atdd/tester/validators/test_migration_generation.py +116 -0
  171. atdd/tester/validators/test_python_test_naming.py +410 -0
  172. atdd/tester/validators/test_red_layer_validation.py +95 -0
  173. atdd/tester/validators/test_red_python_layer_structure.py +87 -0
  174. atdd/tester/validators/test_red_supabase_layer_structure.py +90 -0
  175. atdd/tester/validators/test_telemetry_structure.py +634 -0
  176. atdd/tester/validators/test_typescript_test_naming.py +301 -0
  177. atdd/tester/validators/test_typescript_test_structure.py +84 -0
  178. atdd-0.1.0.dist-info/METADATA +191 -0
  179. atdd-0.1.0.dist-info/RECORD +183 -0
  180. atdd-0.1.0.dist-info/WHEEL +5 -0
  181. atdd-0.1.0.dist-info/entry_points.txt +2 -0
  182. atdd-0.1.0.dist-info/licenses/LICENSE +674 -0
  183. atdd-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,382 @@
1
+ version: "1.0"
2
+ name: "Interface Convention"
3
+ description: "Conventions for interface naming, contracts, and transformation patterns. Interfaces are produce/consume artifacts that define communication between wagons."
4
+
5
+ # Artifact contract references
6
+ artifact_contracts:
7
+ description: "Wagon manifests can reference shared artifact contracts for produce/consume items"
8
+
9
+ naming:
10
+ logical_pattern: "{domain}:{resource}[.{category}]"
11
+ physical_pattern: "contracts/{domain}/{resource}[/{category}].json"
12
+ rationale: "Domain-based organization enables REST API mapping and clear ownership. Colon separator denotes hierarchy, dot separator denotes facet. Optional category supports nested resources."
13
+
14
+ structure_rules:
15
+ flat: "Simple resources use FLAT structure: contracts/{domain}/{resource}.schema.json"
16
+ faceted: "Resources with category facet use NESTED structure: contracts/{domain}/{resource}/{category}.schema.json"
17
+ collection: "Resources containing MULTIPLE schemas use COLLECTION structure: contracts/{domain}/{resource}/*.schema.json"
18
+ determination: "Structure determined by: (1) dot (.) indicates faceted, (2) multiple schema files indicate collection, (3) otherwise flat"
19
+
20
+ patterns:
21
+ flat:
22
+ description: "Single schema file for single resource"
23
+ structure: "contracts/{domain}/{resource}.schema.json"
24
+ tests: "contracts/{domain}/tests/{resource}_schema_test.*"
25
+ artifact_name: "{domain}:{resource}"
26
+ examples: ["match:dilemma.current", "fragment:pool", "pacing:exhausted"]
27
+
28
+ faceted:
29
+ description: "Nested schema using dot notation for category facet"
30
+ structure: "contracts/{domain}/{resource}/{category}.schema.json"
31
+ tests: "contracts/{domain}/{resource}/tests/{category}_schema_test.*"
32
+ artifact_name: "{domain}:{resource}.{category}"
33
+ examples: ["ux:foundations.color", "ux:primitives.icon"]
34
+ note: "Category expressed as dot facet in artifact name"
35
+
36
+ collection:
37
+ description: "Directory containing multiple related schemas for a single resource"
38
+ structure: "contracts/{domain}/{resource}/*.schema.json"
39
+ tests: "contracts/{domain}/{resource}/tests/*_schema_test.*"
40
+ artifact_name: "{domain}:{resource}"
41
+ examples: ["ux:foundations (contains color, spacing, typography)", "ux:primitives (contains icon, shape, mask)"]
42
+ note: "Single wagon artifact maps to MULTIPLE schema files; may include optional catalog.schema.json as master index"
43
+ metadata:
44
+ collection: true
45
+ member: "Identifies specific schema (e.g., 'color', 'spacing')"
46
+ resource: "Same for all schemas in collection (e.g., 'foundations')"
47
+ metadata_example: |
48
+ {
49
+ "domain": "ux",
50
+ "resource": "foundations",
51
+ "collection": true,
52
+ "member": "color"
53
+ }
54
+
55
+ examples:
56
+ # Flat pattern examples
57
+ - logical: "match:dilemma.current"
58
+ physical: "contracts/dilemma/current.schema.json"
59
+ pattern: "flat"
60
+ note: "Single resource, singular noun → flat structure (NOT contracts/dilemma/current/current.schema.json)"
61
+
62
+ - logical: "fragment:pool"
63
+ physical: "contracts/fragment/pool.schema.json"
64
+ pattern: "flat"
65
+ note: "Single resource → flat structure (NOT contracts/fragment/pool/pool.schema.json)"
66
+
67
+ - logical: "mechanic:decision.choice"
68
+ physical: "contracts/decision/choice.schema.json"
69
+ pattern: "flat"
70
+ note: "Single resource → flat structure"
71
+
72
+ # Collection pattern examples (plural resources)
73
+ - logical: "ux:foundations"
74
+ physical: "contracts/commons/ux/foundations/*.schema.json"
75
+ pattern: "collection"
76
+ note: "Plural noun → collection with multiple schemas (color.schema.json, spacing.schema.json, typography.schema.json)"
77
+
78
+ - logical: "ux:primitives"
79
+ physical: "contracts/commons/ux/primitives/*.schema.json"
80
+ pattern: "collection"
81
+ note: "Plural noun → collection with multiple schemas (icon.schema.json, shape.schema.json, mask.schema.json)"
82
+
83
+ # Faceted pattern examples (dot notation)
84
+ - logical: "ux:foundations.color"
85
+ physical: "contracts/commons/ux/foundations/color.schema.json"
86
+ pattern: "faceted"
87
+ note: "Has dot facet → nested structure (alternative to collection pattern)"
88
+
89
+ directory_structure:
90
+ description: "Contracts and telemetry follow flexible directory pattern with required tests/"
91
+
92
+ contracts:
93
+ pattern: "contracts/{domain}/{resource}[/{category}]/"
94
+ tests_required: true
95
+ tests_pattern: "contracts/{domain}/{resource}[/{category}]/tests/"
96
+
97
+ flat_example:
98
+ structure: "contracts/commons/ux/foundations/"
99
+ contents:
100
+ - "color.schema.json"
101
+ - "spacing.schema.json"
102
+ - "tests/color_schema_test.json"
103
+ - "tests/spacing_schema_test.json"
104
+
105
+ nested_example:
106
+ structure: "contracts/commons/ux/primitives/icons/"
107
+ contents:
108
+ - "icon.schema.json"
109
+ - "tests/icon_schema_test.json"
110
+
111
+ telemetry:
112
+ pattern: "telemetry/{domain}/{resource}[/{category}]/"
113
+ tests_required: true
114
+ tests_pattern: "telemetry/{domain}/{resource}[/{category}]/tests/"
115
+
116
+ flat_example:
117
+ structure: "telemetry/ux/foundations/"
118
+ contents:
119
+ - "metric.ui.duration.json"
120
+ - "event.ux.json"
121
+ - "tests/metric_ui_duration_test.json"
122
+
123
+ nested_example:
124
+ structure: "telemetry/ux/primitives/icons/"
125
+ contents:
126
+ - "event.ui.json"
127
+ - "tests/event_ui_test.yaml"
128
+
129
+ validation:
130
+ enforcement: "Platform validation tests in tests/platform_validation/"
131
+ contracts_test: "test_contract_directories_have_tests_subdirectory"
132
+ telemetry_test: "test_telemetry_directories_have_tests_subdirectory"
133
+ rule: "Leaf directories (containing .schema.json or signal .json files) must have tests/"
134
+
135
+ ownership_rules:
136
+ producer: "Generates artifact contract (wagon that declares artifact in produce[])"
137
+ consumer: "References existing contract (wagon that declares artifact in consume[])"
138
+
139
+ contract_field:
140
+ required: false
141
+ recommended: true
142
+ rationale: "Optional for backward compatibility; recommended for artifact-centric contract system"
143
+ migration: "Transition from implicit contracts (no contract field) to explicit contracts (with contract field). Existing wagons work without contract field; new wagons should add explicit contract references"
144
+
145
+ api_mapping:
146
+ description: "Artifact names map to REST API endpoints for external consumption. Category facets add path segments."
147
+ pattern: "/{domain}s/{id}/{resource}[/{category}]"
148
+ methods:
149
+ new: POST
150
+ created: POST
151
+ registered: POST
152
+ started: POST
153
+ result: GET
154
+ active: GET
155
+ config: GET
156
+ events: GET
157
+ foundations: GET
158
+ updated: PUT
159
+ closed: PUT
160
+ completed: PUT
161
+ terminated: DELETE
162
+ deleted: DELETE
163
+ examples:
164
+ - artifact: "ux:foundations"
165
+ endpoint: "GET /uxs/{id}/foundations"
166
+ - artifact: "ux:foundations.colors"
167
+ endpoint: "GET /uxs/{id}/foundations/colors"
168
+ - artifact: "match:result"
169
+ endpoint: "GET /matches/{id}/result"
170
+ - artifact: "session:new"
171
+ endpoint: "POST /sessions"
172
+ - artifact: "player:identity"
173
+ endpoint: "GET /players/{id}"
174
+
175
+ examples:
176
+ producer:
177
+ wagon: "resolve-dilemmas"
178
+ produce:
179
+ - name: "mechanic:decision.choice"
180
+ to: "external"
181
+ contract: "contracts/artifacts/decision/choice.json"
182
+ note: "Producer wagon generates the artifact contract"
183
+
184
+ consumer:
185
+ wagon: "commit-state"
186
+ consume:
187
+ - name: "mechanic:decision.choice"
188
+ from: "wagon:resolve-dilemmas"
189
+ contract: "contracts/artifacts/decision/choice.json"
190
+ note: "Consumer wagon references existing contract"
191
+
192
+ # Artifact URNs (Uniform Resource Names)
193
+ artifact_urns:
194
+ description: "Stable URN references for wagon-contract bidirectional linkage"
195
+
196
+ purpose:
197
+ rationale: "Decouple wagon artifacts from contract versioning"
198
+ stability: "URNs remain stable while contract versions evolve"
199
+ separation_of_concerns: "Wagons declare WHAT (URN), contracts define HOW (version, schema, API)"
200
+ loose_coupling: "Contract evolution (v1→v2) doesn't require wagon YAML changes"
201
+ human_readable: "Clear domain language without version noise"
202
+
203
+ urn_pattern:
204
+ format: "contract:{domain}:{resource}[.{category}]"
205
+ domain: "First part of artifact name (before first colon)"
206
+ resource: "Second part of artifact name (after first colon, before dot if present)"
207
+ category: "Optional third part (after dot)"
208
+ conversion_rule: "Keep colon for hierarchy (domain:resource); preserve category as dot facet when present"
209
+
210
+ examples:
211
+ artifact_to_urn:
212
+ - artifact_name: "ux:foundations"
213
+ urn: "contract:ux:foundations"
214
+ - artifact_name: "ux:foundations.colors"
215
+ urn: "contract:ux:foundations.colors"
216
+ - artifact_name: "mechanic:decision.choice"
217
+ urn: "contract:mechanic:decision.choice"
218
+ - artifact_name: "match:result"
219
+ urn: "contract:match:result"
220
+ - artifact_name: "player:identity"
221
+ urn: "contract:player:identity"
222
+
223
+ wagon_artifacts:
224
+ description: "Artifacts in wagon YAML manifests (plan/{wagon}/*.yaml)"
225
+ urn_field: "urn"
226
+ purpose: "Links wagon artifact to contract without version coupling"
227
+ location: "Added to each produce/consume entry"
228
+
229
+ produce_example:
230
+ wagon: "maintain-ux"
231
+ produce:
232
+ - name: "ux:foundations"
233
+ urn: "contract:ux:foundations"
234
+ to: "external"
235
+ - name: "ux:foundations.colors"
236
+ urn: "contract:ux:foundations.colors"
237
+ to: "external"
238
+
239
+ consume_example:
240
+ wagon: "stage-characters"
241
+ consume:
242
+ - name: "ux:foundations"
243
+ urn: "contract:ux:foundations"
244
+ from: "wagon:maintain-ux"
245
+
246
+ contract_artifacts:
247
+ description: "Contract definitions in contracts/_artifacts.yaml"
248
+ id_field: "id: {domain}:{resource}[.{category}]:v{version}"
249
+ purpose: "Authoritative source for contract schema, version, API"
250
+ urn_mapping: "URN contract:{domain}:{resource}[.{category}] maps to any version of id {domain}:{resource}[.{category}]:v*"
251
+
252
+ example:
253
+ - id: "ux:foundations:v1"
254
+ version: "1.0.0"
255
+ path: "ux/foundations.json"
256
+ producer: "wagon:maintain-ux"
257
+ urn_match: "contract:ux:foundations"
258
+ note: "URN is version-agnostic, ID includes version"
259
+ - id: "ux:foundations.colors:v1"
260
+ version: "1.0.0"
261
+ path: "ux/foundations/colors.json"
262
+ producer: "wagon:maintain-ux"
263
+ urn_match: "contract:ux:foundations.colors"
264
+ note: "Category preserved in both URN and ID"
265
+
266
+ bidirectional_linkage:
267
+ wagon_to_contract: "Wagon URN → Contract ID lookup via domain.resource matching"
268
+ contract_to_wagon: "Contract producer field → Wagon name"
269
+ validation: "URN must resolve to contract in registry"
270
+ orphan_detection: "Wagon URN without matching contract = violation"
271
+
272
+ migration_strategy:
273
+ phase1: "Add urn field to all wagon artifacts (this upgrade)"
274
+ phase2: "Validate all URNs resolve to contracts"
275
+ phase3: "Generate missing contracts for orphaned URNs"
276
+ backward_compatibility: "URN field optional initially, required for new wagons"
277
+ refactor_note: "Legacy URNs contract:{domain}.{resource} → contract:{domain}:{resource}; category stays as a dot facet: contract:{domain}:{resource}.{category}"
278
+
279
+ # Artifact naming patterns
280
+ naming_patterns:
281
+ produce:
282
+ prompt: "What artifacts does this wagon create and own? Specify visibility with 'to'. Follow naming pattern: domain:activity-verb for signals/events (e.g., match:started, pacing:exhausted), domain:data-noun for state/data (e.g., player:identity, match:config)"
283
+ pattern: "array of {name: 'domain:artifact-name', to: 'internal|external'}"
284
+ naming_convention: "Events = past tense verbs, State = nouns/adjectives, Collections = plural"
285
+ examples:
286
+ - {name: "decision:chosen", to: "external", note: "data-noun pattern"}
287
+ - {name: "match:started", to: "external", note: "activity-verb pattern for signal"}
288
+ - {name: "player:identity", to: "external", note: "data-noun pattern for state"}
289
+
290
+ consume:
291
+ prompt: "What artifacts does this wagon consume? Follow naming pattern: domain:activity-verb for signals/events, domain:data-noun for state/data"
292
+ pattern: "array of {name: 'domain:artifact-name', from: 'wagon:slug|system:external|internal'}"
293
+ naming_convention: "Events = past tense verbs, State = nouns/adjectives, Collections = plural"
294
+ examples:
295
+ - {name: "match:dilemma.current", from: "wagon:pace-dilemmas", note: "data-noun"}
296
+ - {name: "time:remaining", from: "wagon:burn-timebank", note: "data-noun"}
297
+ - {name: "match:started", from: "wagon:play-match", note: "activity-verb signal"}
298
+ - {name: "player:identity", from: "system:external", note: "data-noun from external train"}
299
+
300
+ # Artifact transformation to features
301
+ artifact_transformation:
302
+ description: "How produce/consume artifacts seed feature names"
303
+ overview: |
304
+ Artifacts describe WHAT is produced/consumed (entities, states, events).
305
+ Features describe HOW to work with artifacts (actions, capabilities).
306
+ Transformation: artifact (WHAT) → feature (HOW)
307
+
308
+ rules:
309
+ domain_as_object:
310
+ pattern: "{verb}-{domain}"
311
+ when: "Domain is the primary focus of the feature"
312
+ rationale: "Feature acts on the entire domain"
313
+
314
+ resource_as_object:
315
+ pattern: "{verb}-{resource}"
316
+ when: "Resource is the primary focus of the feature"
317
+ rationale: "Feature acts on specific resource within domain"
318
+
319
+ by_artifact_type:
320
+ events:
321
+ description: "Past tense artifacts (ended, started, closed)"
322
+ typical_verbs: ["publish", "emit", "start", "close", "trigger"]
323
+ examples:
324
+ - artifact: "match:started"
325
+ domain: "match"
326
+ resource: "started"
327
+ feature: "start-match"
328
+ rationale: "Feature starts the match (verb:start + domain:match)"
329
+
330
+ - artifact: "session:closed"
331
+ domain: "session"
332
+ resource: "closed"
333
+ feature: "close-session"
334
+ rationale: "Feature closes the session (verb:close + domain:session)"
335
+
336
+ states:
337
+ description: "Adjective artifacts (remaining, active, current)"
338
+ typical_verbs: ["track", "monitor", "maintain", "update"]
339
+ examples:
340
+ - artifact: "mechanic:timebank.remaining"
341
+ domain: "timebank"
342
+ resource: "remaining"
343
+ feature: "track-timebank"
344
+ rationale: "Feature tracks the timebank (verb:track + domain:timebank)"
345
+
346
+ - artifact: "session:active"
347
+ domain: "session"
348
+ resource: "active"
349
+ feature: "maintain-session"
350
+ rationale: "Feature maintains active session (verb:maintain + domain:session)"
351
+
352
+ data:
353
+ description: "Noun artifacts (choice, identity, profile)"
354
+ typical_verbs: ["create", "manage", "process", "handle", "make"]
355
+ examples:
356
+ - artifact: "mechanic:decision.choice"
357
+ domain: "decision"
358
+ resource: "choice"
359
+ feature: "make-choice"
360
+ rationale: "Feature makes the choice (verb:make + resource:choice)"
361
+
362
+ - artifact: "player:identity"
363
+ domain: "player"
364
+ resource: "identity"
365
+ feature: "identify-player"
366
+ rationale: "Feature identifies the player (verb:identify + domain:player)"
367
+
368
+ configs:
369
+ description: "Configuration artifacts (config, settings, agreement)"
370
+ typical_verbs: ["configure", "setup", "initialize", "define"]
371
+ examples:
372
+ - artifact: "match:config"
373
+ domain: "match"
374
+ resource: "config"
375
+ feature: "configure-match"
376
+ rationale: "Feature configures the match (verb:configure + domain:match)"
377
+
378
+ - artifact: "league:config"
379
+ domain: "league"
380
+ resource: "config"
381
+ feature: "define-league"
382
+ rationale: "Feature defines league configuration (verb:define + domain:league)"
@@ -0,0 +1,141 @@
1
+ ---
2
+ title: JTBD Steps Convention
3
+ description: Unified 9-step convention with minimal but routable architecture mapping.
4
+ version: 4
5
+
6
+ steps:
7
+
8
+ define:
9
+ key_terms: [Define, Plan, Select, Determine, rule, policy, constraint, specification, invariant, requirement]
10
+ purpose: Frame the work and set boundaries
11
+ question: What must be defined upfront before anything else can proceed?
12
+ example: Define a duel as a synchronous PvP match between two teams
13
+ outputs: [Clear objectives, Success metrics, Constraint boundaries]
14
+ linguistic_patterns:
15
+ - "Define {object} as {specification}"
16
+ - "Plan {approach} for {outcome}"
17
+ - "Select {option} from {alternatives}"
18
+ - "Determine {criteria} for {decision}"
19
+ architecture:
20
+ layers: [domain]
21
+ sequence: [presentation.command, application.use_case, domain.create, integration.persist]
22
+
23
+ locate:
24
+ key_terms: [Locate, Gather, Access, Retrieve, find, search, fetch, query, lookup, discover]
25
+ purpose: Identify and access required inputs or resources
26
+ question: What must be found or accessed to do the job?
27
+ example: Locate peers across devices within 100ms latency
28
+ outputs: [Resource inventory, Access patterns, Dependency map]
29
+ linguistic_patterns:
30
+ - "Locate {resource} within {constraint}"
31
+ - "Gather {inputs} from {sources}"
32
+ - "Access {data} via {method}"
33
+ - "Retrieve {information} in {timeframe}"
34
+ architecture:
35
+ layers: [application]
36
+ sequence: [application.query, integration.read, application.aggregate, presentation.display]
37
+
38
+ prepare:
39
+ key_terms: [Prepare, Set up, Organize, Examine, setup, configure, initialize, stage, arrange, organize]
40
+ purpose: Make the environment/resources ready without starting execution
41
+ question: How must the executor prepare before acting?
42
+ example: Prepare the duel lobby and match players before countdown
43
+ outputs: [Prepared resources, Validated inputs, Ready state confirmation]
44
+ linguistic_patterns:
45
+ - "Prepare {environment} for {activity}"
46
+ - "Set up {infrastructure} with {configuration}"
47
+ - "Organize {resources} by {criteria}"
48
+ - "Examine {inputs} for {validation}"
49
+ architecture:
50
+ layers: [application]
51
+ sequence: [application.use_case, domain.validate, integration.read, application.stage]
52
+
53
+ confirm:
54
+ key_terms: [Confirm, Validate, Prioritize, Decide, validate, verify, check, ensure, authorize, approve]
55
+ purpose: Ensure preconditions and synchronization before moving forward
56
+ question: What must be verified or agreed upon to continue?
57
+ example: Confirm readiness from both teams before duel starts
58
+ outputs: [Precondition checklist, Permission verification, Go/no-go decision]
59
+ linguistic_patterns:
60
+ - "Confirm {precondition} before {action}"
61
+ - "Validate {input} against {criteria}"
62
+ - "Prioritize {items} by {importance}"
63
+ - "Decide {path} based on {conditions}"
64
+ architecture:
65
+ layers: [application]
66
+ sequence: [application.query, integration.read, domain.validate, application.decide]
67
+
68
+ execute:
69
+ key_terms: [Execute, Perform, Transact, Administer, perform, process, calculate, transform, create, generate]
70
+ purpose: Carry out the core action that changes state
71
+ question: What must the executor do to perform the job itself?
72
+ example: Execute player move and apply it locally in ≤2ms
73
+ outputs: [Completed core job, State changes, Performance metrics]
74
+ linguistic_patterns:
75
+ - "Execute {action} within {constraint}"
76
+ - "Perform {operation} on {target}"
77
+ - "Transact {change} to {system}"
78
+ - "Administer {process} per {protocol}"
79
+ architecture:
80
+ layers: [domain, application]
81
+ sequence: [presentation.command, application.use_case, domain.mutate, integration.persist]
82
+
83
+ monitor:
84
+ key_terms: [Monitor, Verify, Track, Check, display, show, track, observe, report, visualize]
85
+ purpose: Observe progress, quality, or risks to enable correction
86
+ question: What must be tracked during execution to ensure success?
87
+ example: Monitor state divergence and resync if thresholds are exceeded
88
+ outputs: [Progress indicators, Performance data, Anomaly reports]
89
+ linguistic_patterns:
90
+ - "Monitor {metric} for {threshold}"
91
+ - "Verify {state} remains {condition}"
92
+ - "Track {progress} against {target}"
93
+ - "Check {status} every {interval}"
94
+ architecture:
95
+ layers: [presentation]
96
+ sequence: [presentation.query, application.query, integration.read, application.aggregate, presentation.display]
97
+
98
+ modify:
99
+ key_terms: [Modify, Update, Adjust, Maintain, adjust, update, correct, patch, tune, amend]
100
+ purpose: Proactively adjust or optimize during normal operation
101
+ question: What might need to be changed for better outcomes?
102
+ example: Modify scoring rules mid-season if the meta shifts
103
+ outputs: [Adjustments made, Optimization results, Updated configurations]
104
+ linguistic_patterns:
105
+ - "Modify {parameter} when {condition}"
106
+ - "Update {configuration} to {value}"
107
+ - "Adjust {setting} for {optimization}"
108
+ - "Maintain {state} within {bounds}"
109
+ architecture:
110
+ layers: [application]
111
+ sequence: [presentation.command, application.use_case, domain.mutate, integration.persist]
112
+
113
+ resolve:
114
+ key_terms: [Resolve, Troubleshoot, Fix, Handle, error, exception, retry, recover, fallback, compensate]
115
+ purpose: Reactive problem-solving and exception handling
116
+ question: What problems must be addressed when things go wrong?
117
+ example: Resolve a disconnection by substituting a bot
118
+ outputs: [Problem resolutions, Recovery procedures, Workaround documentation]
119
+ linguistic_patterns:
120
+ - "Resolve {issue} using {method}"
121
+ - "Troubleshoot {problem} via {diagnosis}"
122
+ - "Fix {error} within {timeframe}"
123
+ - "Handle {exception} with {fallback}"
124
+ architecture:
125
+ layers: [application]
126
+ sequence: [application.event, application.use_case, domain.policy, integration.call_external, integration.persist]
127
+
128
+ conclude:
129
+ key_terms: [Conclude, Store, Finish, Close, complete, finish, archive, cleanup, close, record]
130
+ purpose: Close the loop and capture results
131
+ question: What must be done to finish the job and capture results?
132
+ example: Conclude the duel by updating Elo and archiving the match summary
133
+ outputs: [Completion confirmation, Results captured, Final documentation]
134
+ linguistic_patterns:
135
+ - "Conclude {job} with {summary}"
136
+ - "Store {results} in {location}"
137
+ - "Finish {process} by {action}"
138
+ - "Close {session} after {cleanup}"
139
+ architecture:
140
+ layers: [integration, application]
141
+ sequence: [application.use_case, domain.validate, integration.persist, integration.archive]