atdd 0.2.1__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.
- atdd/__init__.py +6 -0
- atdd/__main__.py +4 -0
- atdd/cli.py +404 -0
- atdd/coach/__init__.py +0 -0
- atdd/coach/commands/__init__.py +0 -0
- atdd/coach/commands/add_persistence_metadata.py +215 -0
- atdd/coach/commands/analyze_migrations.py +188 -0
- atdd/coach/commands/consumers.py +720 -0
- atdd/coach/commands/infer_governance_status.py +149 -0
- atdd/coach/commands/initializer.py +177 -0
- atdd/coach/commands/interface.py +1078 -0
- atdd/coach/commands/inventory.py +565 -0
- atdd/coach/commands/migration.py +240 -0
- atdd/coach/commands/registry.py +1560 -0
- atdd/coach/commands/session.py +430 -0
- atdd/coach/commands/sync.py +405 -0
- atdd/coach/commands/test_interface.py +399 -0
- atdd/coach/commands/test_runner.py +141 -0
- atdd/coach/commands/tests/__init__.py +1 -0
- atdd/coach/commands/tests/test_telemetry_array_validation.py +235 -0
- atdd/coach/commands/traceability.py +4264 -0
- atdd/coach/conventions/session.convention.yaml +754 -0
- atdd/coach/overlays/__init__.py +2 -0
- atdd/coach/overlays/claude.md +2 -0
- atdd/coach/schemas/config.schema.json +34 -0
- atdd/coach/schemas/manifest.schema.json +101 -0
- atdd/coach/templates/ATDD.md +282 -0
- atdd/coach/templates/SESSION-TEMPLATE.md +327 -0
- atdd/coach/utils/__init__.py +0 -0
- atdd/coach/utils/graph/__init__.py +0 -0
- atdd/coach/utils/graph/urn.py +875 -0
- atdd/coach/validators/__init__.py +0 -0
- atdd/coach/validators/shared_fixtures.py +365 -0
- atdd/coach/validators/test_enrich_wagon_registry.py +167 -0
- atdd/coach/validators/test_registry.py +575 -0
- atdd/coach/validators/test_session_validation.py +1183 -0
- atdd/coach/validators/test_traceability.py +448 -0
- atdd/coach/validators/test_update_feature_paths.py +108 -0
- atdd/coach/validators/test_validate_contract_consumers.py +297 -0
- atdd/coder/__init__.py +1 -0
- atdd/coder/conventions/adapter.recipe.yaml +88 -0
- atdd/coder/conventions/backend.convention.yaml +460 -0
- atdd/coder/conventions/boundaries.convention.yaml +666 -0
- atdd/coder/conventions/commons.convention.yaml +460 -0
- atdd/coder/conventions/complexity.recipe.yaml +109 -0
- atdd/coder/conventions/component-naming.convention.yaml +178 -0
- atdd/coder/conventions/design.convention.yaml +327 -0
- atdd/coder/conventions/design.recipe.yaml +273 -0
- atdd/coder/conventions/dto.convention.yaml +660 -0
- atdd/coder/conventions/frontend.convention.yaml +542 -0
- atdd/coder/conventions/green.convention.yaml +1012 -0
- atdd/coder/conventions/presentation.convention.yaml +587 -0
- atdd/coder/conventions/refactor.convention.yaml +535 -0
- atdd/coder/conventions/technology.convention.yaml +206 -0
- atdd/coder/conventions/tests/__init__.py +0 -0
- atdd/coder/conventions/tests/test_adapter_recipe.py +302 -0
- atdd/coder/conventions/tests/test_complexity_recipe.py +289 -0
- atdd/coder/conventions/tests/test_component_taxonomy.py +278 -0
- atdd/coder/conventions/tests/test_component_urn_naming.py +165 -0
- atdd/coder/conventions/tests/test_thinness_recipe.py +286 -0
- atdd/coder/conventions/thinness.recipe.yaml +82 -0
- atdd/coder/conventions/train.convention.yaml +325 -0
- atdd/coder/conventions/verification.protocol.yaml +53 -0
- atdd/coder/schemas/design_system.schema.json +361 -0
- atdd/coder/validators/__init__.py +0 -0
- atdd/coder/validators/test_commons_structure.py +485 -0
- atdd/coder/validators/test_complexity.py +416 -0
- atdd/coder/validators/test_cross_language_consistency.py +431 -0
- atdd/coder/validators/test_design_system_compliance.py +413 -0
- atdd/coder/validators/test_dto_testing_patterns.py +268 -0
- atdd/coder/validators/test_green_cross_stack_layers.py +168 -0
- atdd/coder/validators/test_green_layer_dependencies.py +148 -0
- atdd/coder/validators/test_green_python_layer_structure.py +103 -0
- atdd/coder/validators/test_green_supabase_layer_structure.py +103 -0
- atdd/coder/validators/test_import_boundaries.py +396 -0
- atdd/coder/validators/test_init_file_urns.py +593 -0
- atdd/coder/validators/test_preact_layer_boundaries.py +221 -0
- atdd/coder/validators/test_presentation_convention.py +260 -0
- atdd/coder/validators/test_python_architecture.py +674 -0
- atdd/coder/validators/test_quality_metrics.py +420 -0
- atdd/coder/validators/test_station_master_pattern.py +244 -0
- atdd/coder/validators/test_train_infrastructure.py +454 -0
- atdd/coder/validators/test_train_urns.py +293 -0
- atdd/coder/validators/test_typescript_architecture.py +616 -0
- atdd/coder/validators/test_usecase_structure.py +421 -0
- atdd/coder/validators/test_wagon_boundaries.py +586 -0
- atdd/conftest.py +126 -0
- atdd/planner/__init__.py +1 -0
- atdd/planner/conventions/acceptance.convention.yaml +538 -0
- atdd/planner/conventions/appendix.convention.yaml +187 -0
- atdd/planner/conventions/artifact-naming.convention.yaml +852 -0
- atdd/planner/conventions/component.convention.yaml +670 -0
- atdd/planner/conventions/criteria.convention.yaml +141 -0
- atdd/planner/conventions/feature.convention.yaml +371 -0
- atdd/planner/conventions/interface.convention.yaml +382 -0
- atdd/planner/conventions/steps.convention.yaml +141 -0
- atdd/planner/conventions/train.convention.yaml +552 -0
- atdd/planner/conventions/wagon.convention.yaml +275 -0
- atdd/planner/conventions/wmbt.convention.yaml +258 -0
- atdd/planner/schemas/acceptance.schema.json +336 -0
- atdd/planner/schemas/appendix.schema.json +78 -0
- atdd/planner/schemas/component.schema.json +114 -0
- atdd/planner/schemas/feature.schema.json +197 -0
- atdd/planner/schemas/train.schema.json +192 -0
- atdd/planner/schemas/wagon.schema.json +281 -0
- atdd/planner/schemas/wmbt.schema.json +59 -0
- atdd/planner/validators/__init__.py +0 -0
- atdd/planner/validators/conftest.py +5 -0
- atdd/planner/validators/test_draft_wagon_registry.py +374 -0
- atdd/planner/validators/test_plan_cross_refs.py +240 -0
- atdd/planner/validators/test_plan_uniqueness.py +224 -0
- atdd/planner/validators/test_plan_urn_resolution.py +268 -0
- atdd/planner/validators/test_plan_wagons.py +174 -0
- atdd/planner/validators/test_train_validation.py +514 -0
- atdd/planner/validators/test_wagon_urn_chain.py +648 -0
- atdd/planner/validators/test_wmbt_consistency.py +327 -0
- atdd/planner/validators/test_wmbt_vocabulary.py +632 -0
- atdd/tester/__init__.py +1 -0
- atdd/tester/conventions/artifact.convention.yaml +257 -0
- atdd/tester/conventions/contract.convention.yaml +1009 -0
- atdd/tester/conventions/filename.convention.yaml +555 -0
- atdd/tester/conventions/migration.convention.yaml +509 -0
- atdd/tester/conventions/red.convention.yaml +797 -0
- atdd/tester/conventions/routing.convention.yaml +51 -0
- atdd/tester/conventions/telemetry.convention.yaml +458 -0
- atdd/tester/schemas/a11y.tmpl.json +17 -0
- atdd/tester/schemas/artifact.schema.json +189 -0
- atdd/tester/schemas/contract.schema.json +591 -0
- atdd/tester/schemas/contract.tmpl.json +95 -0
- atdd/tester/schemas/db.tmpl.json +20 -0
- atdd/tester/schemas/e2e.tmpl.json +17 -0
- atdd/tester/schemas/edge_function.tmpl.json +17 -0
- atdd/tester/schemas/event.tmpl.json +17 -0
- atdd/tester/schemas/http.tmpl.json +19 -0
- atdd/tester/schemas/job.tmpl.json +18 -0
- atdd/tester/schemas/load.tmpl.json +21 -0
- atdd/tester/schemas/metric.tmpl.json +19 -0
- atdd/tester/schemas/pack.schema.json +139 -0
- atdd/tester/schemas/realtime.tmpl.json +20 -0
- atdd/tester/schemas/rls.tmpl.json +18 -0
- atdd/tester/schemas/script.tmpl.json +16 -0
- atdd/tester/schemas/sec.tmpl.json +18 -0
- atdd/tester/schemas/storage.tmpl.json +18 -0
- atdd/tester/schemas/telemetry.schema.json +128 -0
- atdd/tester/schemas/telemetry_tracking_manifest.schema.json +143 -0
- atdd/tester/schemas/test_filename.schema.json +194 -0
- atdd/tester/schemas/test_intent.schema.json +179 -0
- atdd/tester/schemas/unit.tmpl.json +18 -0
- atdd/tester/schemas/visual.tmpl.json +18 -0
- atdd/tester/schemas/ws.tmpl.json +17 -0
- atdd/tester/utils/__init__.py +0 -0
- atdd/tester/utils/filename.py +300 -0
- atdd/tester/validators/__init__.py +0 -0
- atdd/tester/validators/cleanup_duplicate_headers.py +116 -0
- atdd/tester/validators/cleanup_duplicate_headers_v2.py +135 -0
- atdd/tester/validators/conftest.py +5 -0
- atdd/tester/validators/coverage_gap_report.py +321 -0
- atdd/tester/validators/fix_dual_ac_references.py +179 -0
- atdd/tester/validators/remove_duplicate_lines.py +93 -0
- atdd/tester/validators/test_acceptance_urn_filename_mapping.py +359 -0
- atdd/tester/validators/test_acceptance_urn_separator.py +166 -0
- atdd/tester/validators/test_artifact_naming_category.py +307 -0
- atdd/tester/validators/test_contract_schema_compliance.py +706 -0
- atdd/tester/validators/test_contracts_structure.py +200 -0
- atdd/tester/validators/test_coverage_adequacy.py +797 -0
- atdd/tester/validators/test_dual_ac_reference.py +225 -0
- atdd/tester/validators/test_fixture_validity.py +372 -0
- atdd/tester/validators/test_isolation.py +487 -0
- atdd/tester/validators/test_migration_coverage.py +204 -0
- atdd/tester/validators/test_migration_criteria.py +276 -0
- atdd/tester/validators/test_migration_generation.py +116 -0
- atdd/tester/validators/test_python_test_naming.py +410 -0
- atdd/tester/validators/test_red_layer_validation.py +95 -0
- atdd/tester/validators/test_red_python_layer_structure.py +87 -0
- atdd/tester/validators/test_red_supabase_layer_structure.py +90 -0
- atdd/tester/validators/test_telemetry_structure.py +634 -0
- atdd/tester/validators/test_typescript_test_naming.py +301 -0
- atdd/tester/validators/test_typescript_test_structure.py +84 -0
- atdd-0.2.1.dist-info/METADATA +221 -0
- atdd-0.2.1.dist-info/RECORD +184 -0
- atdd-0.2.1.dist-info/WHEEL +5 -0
- atdd-0.2.1.dist-info/entry_points.txt +2 -0
- atdd-0.2.1.dist-info/licenses/LICENSE +674 -0
- atdd-0.2.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
name: "Train Convention"
|
|
3
|
+
description: "Convention for multi-wagon workflow orchestration with theme-based numbering"
|
|
4
|
+
|
|
5
|
+
# Production implementation (SESSION-12)
|
|
6
|
+
production_implementation:
|
|
7
|
+
location: "python/trains/"
|
|
8
|
+
executor: "TrainRunner (python/trains/runner.py)"
|
|
9
|
+
pattern: "Trains are production orchestration, not test infrastructure"
|
|
10
|
+
convention: "atdd/coder/conventions/train.convention.yaml"
|
|
11
|
+
note: "See coder train convention for implementation patterns"
|
|
12
|
+
|
|
13
|
+
# Train structure defined in schema
|
|
14
|
+
structure:
|
|
15
|
+
$ref: "schemas:planner:train"
|
|
16
|
+
|
|
17
|
+
# Hierarchical numbering system: [Theme][Category][Variation]
|
|
18
|
+
numbering:
|
|
19
|
+
pattern: "{theme_digit}{category_digit}{variation_digits}-{kebab-case-name}"
|
|
20
|
+
description: "Four-digit hierarchical prefix: [Theme 0-9][Category 0-3][Variation 01-99] + kebab-case name"
|
|
21
|
+
|
|
22
|
+
structure:
|
|
23
|
+
theme: "Single digit 0-9 identifying the theme"
|
|
24
|
+
category: "Single digit 0-3 identifying the test category"
|
|
25
|
+
variation: "Two digits 01-99 identifying specific train within category"
|
|
26
|
+
|
|
27
|
+
categories:
|
|
28
|
+
"0":
|
|
29
|
+
name: "nominal"
|
|
30
|
+
description: "Happy path - perfect conditions, standard flows"
|
|
31
|
+
examples:
|
|
32
|
+
- "0001-auth-session-standard"
|
|
33
|
+
- "2001-story-to-graph-perfect"
|
|
34
|
+
- "3001-solo-match-complete"
|
|
35
|
+
|
|
36
|
+
"1":
|
|
37
|
+
name: "error"
|
|
38
|
+
description: "Unexpected system failures - crashes, unavailability, infrastructure issues"
|
|
39
|
+
examples:
|
|
40
|
+
- "0101-auth-service-offline"
|
|
41
|
+
- "2101-graph-database-offline"
|
|
42
|
+
- "3101-state-commit-service-crash"
|
|
43
|
+
|
|
44
|
+
"2":
|
|
45
|
+
name: "alternate"
|
|
46
|
+
description: "Valid alternative flows - different inputs, modes, configurations"
|
|
47
|
+
examples:
|
|
48
|
+
- "0201-sso-authentication"
|
|
49
|
+
- "2201-xml-source-conversion"
|
|
50
|
+
- "3201-match-with-pause-resume"
|
|
51
|
+
|
|
52
|
+
"3":
|
|
53
|
+
name: "exception"
|
|
54
|
+
description: "Expected failures handled gracefully - validation errors, business rule violations"
|
|
55
|
+
examples:
|
|
56
|
+
- "0301-invalid-credentials"
|
|
57
|
+
- "2301-empty-input-file"
|
|
58
|
+
- "3301-fragment-pool-exhausted"
|
|
59
|
+
|
|
60
|
+
theme_ranges:
|
|
61
|
+
commons:
|
|
62
|
+
theme_digit: "0"
|
|
63
|
+
category_range: "00-03"
|
|
64
|
+
variation_range: "01-99"
|
|
65
|
+
description: "Identity, session, account, identifiers, UX systems"
|
|
66
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
67
|
+
examples:
|
|
68
|
+
- "0001-auth-session-standard (nominal)"
|
|
69
|
+
- "0101-auth-service-offline (error)"
|
|
70
|
+
- "0201-sso-authentication (alternate)"
|
|
71
|
+
- "0301-invalid-credentials (exception)"
|
|
72
|
+
|
|
73
|
+
mechanic:
|
|
74
|
+
theme_digit: "1"
|
|
75
|
+
category_range: "10-13"
|
|
76
|
+
variation_range: "01-99"
|
|
77
|
+
description: "Core decision loop, timebank, predictions, domain impacts"
|
|
78
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
79
|
+
examples:
|
|
80
|
+
- "1001-decision-standard (nominal)"
|
|
81
|
+
- "1101-state-commit-service-crash (error)"
|
|
82
|
+
- "1201-instant-decision-no-timebank (alternate)"
|
|
83
|
+
- "1301-timebank-exhausted (exception)"
|
|
84
|
+
|
|
85
|
+
scenario:
|
|
86
|
+
theme_digit: "2"
|
|
87
|
+
category_range: "20-23"
|
|
88
|
+
variation_range: "01-99"
|
|
89
|
+
description: "Story processing, curation, graph construction, fragments"
|
|
90
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
91
|
+
examples:
|
|
92
|
+
- "2001-story-to-graph-perfect (nominal)"
|
|
93
|
+
- "2101-graph-database-offline (error)"
|
|
94
|
+
- "2201-xml-source-conversion (alternate)"
|
|
95
|
+
- "2301-empty-input-file (exception)"
|
|
96
|
+
|
|
97
|
+
match:
|
|
98
|
+
theme_digit: "3"
|
|
99
|
+
category_range: "30-33"
|
|
100
|
+
variation_range: "01-99"
|
|
101
|
+
description: "Solo, duel, team gameplay orchestration"
|
|
102
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
103
|
+
examples:
|
|
104
|
+
- "3001-solo-match-complete (nominal)"
|
|
105
|
+
- "3101-state-commit-service-crash (error)"
|
|
106
|
+
- "3201-match-with-pause-resume (alternate)"
|
|
107
|
+
- "3301-fragment-pool-exhausted (exception)"
|
|
108
|
+
|
|
109
|
+
sensory:
|
|
110
|
+
theme_digit: "4"
|
|
111
|
+
category_range: "40-43"
|
|
112
|
+
variation_range: "01-99"
|
|
113
|
+
description: "Gesture interpretation, tone, feedback, audio, haptics"
|
|
114
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
115
|
+
examples:
|
|
116
|
+
- "4001-gesture-interpretation-standard (nominal)"
|
|
117
|
+
- "4101-gesture-sensor-failure (error)"
|
|
118
|
+
- "4201-keyboard-input-fallback (alternate)"
|
|
119
|
+
- "4301-ambiguous-gesture-detected (exception)"
|
|
120
|
+
|
|
121
|
+
player:
|
|
122
|
+
theme_digit: "5"
|
|
123
|
+
category_range: "50-53"
|
|
124
|
+
variation_range: "01-99"
|
|
125
|
+
description: "Onboarding, progression, achievements, review"
|
|
126
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
127
|
+
examples:
|
|
128
|
+
- "5001-rating-update-standard (nominal)"
|
|
129
|
+
- "5101-rating-service-unavailable (error)"
|
|
130
|
+
- "5201-provisional-rating-period (alternate)"
|
|
131
|
+
- "5301-achievement-already-unlocked (exception)"
|
|
132
|
+
|
|
133
|
+
league:
|
|
134
|
+
theme_digit: "6"
|
|
135
|
+
category_range: "60-63"
|
|
136
|
+
variation_range: "01-99"
|
|
137
|
+
description: "Tournaments, brackets, leaderboards, rewards"
|
|
138
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
139
|
+
examples:
|
|
140
|
+
- "6001-league-definition-standard (nominal)"
|
|
141
|
+
- "6101-leaderboard-service-crash (error)"
|
|
142
|
+
- "6201-league-delegation-to-partner (alternate)"
|
|
143
|
+
- "6301-insufficient-participants (exception)"
|
|
144
|
+
|
|
145
|
+
audience:
|
|
146
|
+
theme_digit: "7"
|
|
147
|
+
category_range: "70-73"
|
|
148
|
+
variation_range: "01-99"
|
|
149
|
+
description: "Streaming, donations, viewer engagement"
|
|
150
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
151
|
+
examples:
|
|
152
|
+
- "7001-stream-broadcast-standard (nominal)"
|
|
153
|
+
- "7101-streaming-platform-offline (error)"
|
|
154
|
+
- "7201-multi-platform-broadcast (alternate)"
|
|
155
|
+
- "7301-donation-insufficient-balance (exception)"
|
|
156
|
+
|
|
157
|
+
monetization:
|
|
158
|
+
theme_digit: "8"
|
|
159
|
+
category_range: "80-83"
|
|
160
|
+
variation_range: "01-99"
|
|
161
|
+
description: "Wallets, cameo flows, transactions, reconciliation"
|
|
162
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
163
|
+
examples:
|
|
164
|
+
- "8001-wallet-initialization-standard (nominal)"
|
|
165
|
+
- "8101-wallet-service-unavailable (error)"
|
|
166
|
+
- "8201-sponsor-backed-minting (alternate)"
|
|
167
|
+
- "8301-insufficient-balance-for-spend (exception)"
|
|
168
|
+
|
|
169
|
+
partnership:
|
|
170
|
+
theme_digit: "9"
|
|
171
|
+
category_range: "90-93"
|
|
172
|
+
variation_range: "01-99"
|
|
173
|
+
description: "Sponsors, partners, personas, attribution, reporting"
|
|
174
|
+
capacity: "400 trains (4 categories × 100 variations)"
|
|
175
|
+
examples:
|
|
176
|
+
- "9001-sponsor-onboarding-standard (nominal)"
|
|
177
|
+
- "9101-reporting-service-crash (error)"
|
|
178
|
+
- "9201-multi-sponsor-agreement (alternate)"
|
|
179
|
+
- "9301-sponsor-agreement-expired (exception)"
|
|
180
|
+
|
|
181
|
+
capacity:
|
|
182
|
+
per_theme: 400
|
|
183
|
+
per_category: 100
|
|
184
|
+
total_system: 4000
|
|
185
|
+
description: "10 themes × 4 categories × 100 variations = 4,000 possible trains"
|
|
186
|
+
|
|
187
|
+
validation:
|
|
188
|
+
pattern: "^[0-9]{4}-[a-z][a-z0-9-]*$"
|
|
189
|
+
theme_digit: "Position 0: Theme category (0-9)"
|
|
190
|
+
category_digit: "Position 1: Test category (0=nominal, 1=error, 2=alternate, 3=exception)"
|
|
191
|
+
variation_digits: "Position 2-3: Variation within category (01-99)"
|
|
192
|
+
name_part: "kebab-case descriptive name"
|
|
193
|
+
|
|
194
|
+
# URN naming pattern
|
|
195
|
+
urn_naming:
|
|
196
|
+
pattern: "train:{train_id}"
|
|
197
|
+
description: "Unique identifier for train using hierarchical theme-category-variation-name format"
|
|
198
|
+
|
|
199
|
+
examples:
|
|
200
|
+
- urn: "train:2001-story-to-graph-perfect"
|
|
201
|
+
train_id: "2001-story-to-graph-perfect"
|
|
202
|
+
theme: "scenario"
|
|
203
|
+
theme_digit: "2"
|
|
204
|
+
category: "nominal"
|
|
205
|
+
category_digit: "0"
|
|
206
|
+
variation: 1
|
|
207
|
+
|
|
208
|
+
theme_orchestrator_urn:
|
|
209
|
+
pattern: "urn: train:{theme}:{train_id}"
|
|
210
|
+
description: "Theme-level implementation of specific train workflows"
|
|
211
|
+
location: "python/shared/{theme}.py"
|
|
212
|
+
|
|
213
|
+
examples:
|
|
214
|
+
- urn: "train:mechanic:1001-decision-standard"
|
|
215
|
+
file: "python/shared/mechanic.py"
|
|
216
|
+
theme: "mechanic"
|
|
217
|
+
train_id: "1001-decision-standard"
|
|
218
|
+
description: "Implements standard decision flow: pace → resolve → commit → juggle"
|
|
219
|
+
|
|
220
|
+
- urn: "train:match:3001-match-setup-standard"
|
|
221
|
+
file: "python/shared/match.py"
|
|
222
|
+
theme: "match"
|
|
223
|
+
train_id: "3001-match-setup-standard"
|
|
224
|
+
description: "Implements match setup: supply-fragments → setup-match → play-match"
|
|
225
|
+
|
|
226
|
+
multi_train_format:
|
|
227
|
+
pattern: "Multiple URN lines for files implementing multiple trains"
|
|
228
|
+
example: |
|
|
229
|
+
# urn: train:match:3001-match-setup-standard
|
|
230
|
+
# urn: train:match:3004-match-completion-standard
|
|
231
|
+
# urn: train:match:3005-match-turn-cycle-standard
|
|
232
|
+
|
|
233
|
+
rationale: |
|
|
234
|
+
Theme orchestrators implement the workflows defined in train YAML files.
|
|
235
|
+
Each orchestrator can implement multiple trains within its theme.
|
|
236
|
+
URN format: train:{theme}:{train_id} directly references the train specification.
|
|
237
|
+
|
|
238
|
+
examples_continued:
|
|
239
|
+
- urn: "train:3301-fragment-pool-exhausted"
|
|
240
|
+
train_id: "3301-fragment-pool-exhausted"
|
|
241
|
+
theme: "match"
|
|
242
|
+
theme_digit: "3"
|
|
243
|
+
category: "exception"
|
|
244
|
+
category_digit: "3"
|
|
245
|
+
variation: 1
|
|
246
|
+
|
|
247
|
+
- urn: "train:0101-auth-service-offline"
|
|
248
|
+
train_id: "0101-auth-service-offline"
|
|
249
|
+
theme: "commons"
|
|
250
|
+
theme_digit: "0"
|
|
251
|
+
category: "error"
|
|
252
|
+
category_digit: "1"
|
|
253
|
+
variation: 1
|
|
254
|
+
|
|
255
|
+
# Registry organization
|
|
256
|
+
registry:
|
|
257
|
+
structure: "theme-category-grouped"
|
|
258
|
+
description: "Trains grouped by theme, then by category (nominal/error/alternate/exception) in _trains.yaml manifest"
|
|
259
|
+
|
|
260
|
+
format: |
|
|
261
|
+
trains:
|
|
262
|
+
0-commons:
|
|
263
|
+
00-commons-nominal:
|
|
264
|
+
- train_id: 0001-auth-session-standard
|
|
265
|
+
description: Standard authentication flow with session initialization
|
|
266
|
+
path: plan/_trains/0001-auth-session-standard.yaml
|
|
267
|
+
wagons: [authenticate-identity, init-session]
|
|
268
|
+
|
|
269
|
+
01-commons-error:
|
|
270
|
+
- train_id: 0101-auth-service-offline
|
|
271
|
+
description: Authentication service unavailable during login
|
|
272
|
+
path: plan/_trains/0101-auth-service-offline.yaml
|
|
273
|
+
wagons: [authenticate-identity]
|
|
274
|
+
|
|
275
|
+
02-commons-alternate:
|
|
276
|
+
- train_id: 0201-sso-authentication
|
|
277
|
+
description: Single sign-on authentication flow
|
|
278
|
+
path: plan/_trains/0201-sso-authentication.yaml
|
|
279
|
+
wagons: [authenticate-identity, init-session]
|
|
280
|
+
|
|
281
|
+
03-commons-exception:
|
|
282
|
+
- train_id: 0301-invalid-credentials
|
|
283
|
+
description: User provides invalid credentials (expected failure)
|
|
284
|
+
path: plan/_trains/0301-invalid-credentials.yaml
|
|
285
|
+
wagons: [authenticate-identity]
|
|
286
|
+
|
|
287
|
+
2-scenario:
|
|
288
|
+
20-scenario-nominal:
|
|
289
|
+
- train_id: 2001-story-to-graph-perfect
|
|
290
|
+
description: Perfect story conversion to knowledge graph
|
|
291
|
+
path: plan/_trains/2001-story-to-graph-perfect.yaml
|
|
292
|
+
wagons: [curate-scenario, prepare-materials, model-scenario, construct-graph]
|
|
293
|
+
|
|
294
|
+
path_structure: "plan/_trains/{train_id}.yaml"
|
|
295
|
+
|
|
296
|
+
benefits:
|
|
297
|
+
- "Flat file structure - no subdirectories needed"
|
|
298
|
+
- "Train ID contains all metadata (theme, category, variation)"
|
|
299
|
+
- "Simple file organization - all trains in single directory"
|
|
300
|
+
- "Natural sorting by train ID (numeric order)"
|
|
301
|
+
- "4-category structure mirrors WMBT test categories"
|
|
302
|
+
|
|
303
|
+
# Naming conventions
|
|
304
|
+
naming:
|
|
305
|
+
train_id:
|
|
306
|
+
pattern: "{number}-{descriptive-name}"
|
|
307
|
+
format: "kebab-case"
|
|
308
|
+
preference: "Action-object or flow-descriptor pattern"
|
|
309
|
+
examples:
|
|
310
|
+
- "20-story-to-scenario (process flow)"
|
|
311
|
+
- "30-match-solo (mode-type)"
|
|
312
|
+
- "00-auth-session (action-object)"
|
|
313
|
+
|
|
314
|
+
title:
|
|
315
|
+
format: "Title Case"
|
|
316
|
+
description: "Human-readable name for display"
|
|
317
|
+
examples:
|
|
318
|
+
- "Story to Scenario Pipeline"
|
|
319
|
+
- "Match Solo Core Loop"
|
|
320
|
+
- "Auth Session Handshake"
|
|
321
|
+
|
|
322
|
+
file_naming:
|
|
323
|
+
pattern: "{train_id}.yaml"
|
|
324
|
+
location: "plan/_trains/"
|
|
325
|
+
structure: "flat (no subdirectories)"
|
|
326
|
+
examples:
|
|
327
|
+
- "plan/_trains/0001-auth-session-standard.yaml"
|
|
328
|
+
- "plan/_trains/2001-story-to-graph-perfect.yaml"
|
|
329
|
+
- "plan/_trains/3001-solo-match-complete.yaml"
|
|
330
|
+
- "plan/_trains/4301-ambiguous-gesture-detected.yaml"
|
|
331
|
+
|
|
332
|
+
# Theme alignment
|
|
333
|
+
theme_alignment:
|
|
334
|
+
description: "Train themes should align with primary wagon themes"
|
|
335
|
+
rules:
|
|
336
|
+
- "Primary theme = first digit of train_id"
|
|
337
|
+
- "Secondary themes allowed when train spans multiple themes"
|
|
338
|
+
- "Most wagons in train should match primary theme"
|
|
339
|
+
|
|
340
|
+
examples:
|
|
341
|
+
- train_id: "20-story-to-scenario"
|
|
342
|
+
themes: ["scenario"]
|
|
343
|
+
wagons: ["prepare-materials", "model-scenario", "construct-graph"]
|
|
344
|
+
alignment: "All wagons are scenario theme"
|
|
345
|
+
|
|
346
|
+
- train_id: "30-match-solo"
|
|
347
|
+
themes: ["match", "mechanic"]
|
|
348
|
+
wagons: ["play-match", "pace-dilemmas", "resolve-dilemmas", "burn-timebank"]
|
|
349
|
+
alignment: "Mix of match and mechanic wagons"
|
|
350
|
+
|
|
351
|
+
# Dependency patterns
|
|
352
|
+
dependencies:
|
|
353
|
+
format: "train:{train_id}"
|
|
354
|
+
description: "Reference prerequisite trains that must run first"
|
|
355
|
+
|
|
356
|
+
patterns:
|
|
357
|
+
foundation_first:
|
|
358
|
+
description: "Commons trains (00-09) often precede others"
|
|
359
|
+
examples:
|
|
360
|
+
- "train:00-auth-session required before train:30-match-solo"
|
|
361
|
+
- "train:01-account-registration required before train:00-auth-session"
|
|
362
|
+
|
|
363
|
+
data_flow:
|
|
364
|
+
description: "Trains consuming artifacts depend on producing trains"
|
|
365
|
+
examples:
|
|
366
|
+
- "train:30-match-solo depends on train:21-scenario-curation for fragments"
|
|
367
|
+
- "train:21-scenario-curation depends on train:20-story-to-scenario for graphs"
|
|
368
|
+
|
|
369
|
+
validation:
|
|
370
|
+
pattern: "^train:[0-9]{2}-[a-z][a-z0-9-]*$"
|
|
371
|
+
circular: "Circular dependencies are not allowed"
|
|
372
|
+
|
|
373
|
+
# Train scope and sizing
|
|
374
|
+
scope:
|
|
375
|
+
wagon_count:
|
|
376
|
+
recommended_range: "3-7 wagons"
|
|
377
|
+
rationale: "Trains should tell ONE coherent journey with clear outcome"
|
|
378
|
+
|
|
379
|
+
guidelines:
|
|
380
|
+
minimum: "2 wagons (too simple, might just be a step)"
|
|
381
|
+
sweet_spot: "3-7 wagons (focused journey with clear narrative)"
|
|
382
|
+
warning: "8-12 wagons (review for multiple journeys)"
|
|
383
|
+
antipattern: "13+ wagons (definitely multiple journeys - decompose)"
|
|
384
|
+
|
|
385
|
+
examples:
|
|
386
|
+
good_5_wagon:
|
|
387
|
+
train_id: "1001-decision-standard"
|
|
388
|
+
wagons: 5
|
|
389
|
+
journey: "Player makes decision and sees domain impact"
|
|
390
|
+
outcome: "ONE clear result: Domain impact visualization"
|
|
391
|
+
|
|
392
|
+
good_6_wagon:
|
|
393
|
+
train_id: "1004-decision-with-domain-preview"
|
|
394
|
+
wagons: 6
|
|
395
|
+
journey: "Player explores domain before deciding"
|
|
396
|
+
outcome: "ONE clear result: Informed decision after preview"
|
|
397
|
+
|
|
398
|
+
bad_16_wagon:
|
|
399
|
+
train_id: "3001-solo-match-complete (antipattern)"
|
|
400
|
+
wagons: 16
|
|
401
|
+
journeys: "MULTIPLE: setup AND exploration AND scoring AND logging"
|
|
402
|
+
problem: "No single outcome - trying to be entire game loop"
|
|
403
|
+
solution: "Decompose into 5-6 focused trains of 3-7 wagons each"
|
|
404
|
+
|
|
405
|
+
one_journey_test:
|
|
406
|
+
description: "Can you state the outcome in ONE sentence without 'and'?"
|
|
407
|
+
pass: "Player sees domain impact from their decision"
|
|
408
|
+
fail: "Player sets up match AND makes decisions AND sees impact AND gets scored"
|
|
409
|
+
|
|
410
|
+
decomposition_signals:
|
|
411
|
+
- "Outcome description contains multiple 'AND' conjunctions"
|
|
412
|
+
- "Train has both setup AND teardown (match lifecycle)"
|
|
413
|
+
- "Mix of exploratory (gesture) AND core mechanic flows"
|
|
414
|
+
- "Multiple independent feedback loops"
|
|
415
|
+
- "Participants from 3+ different themes"
|
|
416
|
+
|
|
417
|
+
# Participant patterns
|
|
418
|
+
participants:
|
|
419
|
+
description: "Actors involved in the train workflow"
|
|
420
|
+
|
|
421
|
+
types:
|
|
422
|
+
wagon:
|
|
423
|
+
pattern: "wagon:{wagon-id}"
|
|
424
|
+
description: "Wagon that performs processing"
|
|
425
|
+
examples:
|
|
426
|
+
- "wagon:prepare-materials"
|
|
427
|
+
- "wagon:resolve-dilemmas"
|
|
428
|
+
|
|
429
|
+
user:
|
|
430
|
+
pattern: "user:{role}"
|
|
431
|
+
description: "Human actor with specific role"
|
|
432
|
+
examples:
|
|
433
|
+
- "user:player"
|
|
434
|
+
- "user:sponsor"
|
|
435
|
+
- "user:partner"
|
|
436
|
+
|
|
437
|
+
system:
|
|
438
|
+
pattern: "system:{source}"
|
|
439
|
+
description: "External system or data source"
|
|
440
|
+
examples:
|
|
441
|
+
- "system:external"
|
|
442
|
+
- "system:scenario-library"
|
|
443
|
+
- "system:filesystem"
|
|
444
|
+
|
|
445
|
+
validation:
|
|
446
|
+
pattern: "^(wagon|user|system):[a-z][a-z0-9-]*$"
|
|
447
|
+
uniqueness: "Each participant should be listed once"
|
|
448
|
+
|
|
449
|
+
# Sequence patterns
|
|
450
|
+
sequence:
|
|
451
|
+
description: "Ordered workflow steps with control flow"
|
|
452
|
+
|
|
453
|
+
elements:
|
|
454
|
+
step:
|
|
455
|
+
description: "Single artifact transfer between participants"
|
|
456
|
+
required: ["step", "intent", "from", "to", "artifact"]
|
|
457
|
+
example:
|
|
458
|
+
step: 1
|
|
459
|
+
intent: "transform raw materials into structured steps"
|
|
460
|
+
from: "system:external"
|
|
461
|
+
to: "wagon:prepare-materials"
|
|
462
|
+
artifact: "material:raw-story"
|
|
463
|
+
|
|
464
|
+
loop:
|
|
465
|
+
description: "Repeated sequence until condition met"
|
|
466
|
+
required: ["name", "condition", "steps"]
|
|
467
|
+
example:
|
|
468
|
+
loop:
|
|
469
|
+
name: "dilemma cycle"
|
|
470
|
+
condition: "repeat until pace-dilemmas emits pacing:exhausted"
|
|
471
|
+
steps:
|
|
472
|
+
- step: 8
|
|
473
|
+
intent: "surface dilemma to resolution"
|
|
474
|
+
from: "wagon:pace-dilemmas"
|
|
475
|
+
to: "wagon:resolve-dilemmas"
|
|
476
|
+
artifact: "match:dilemma.current"
|
|
477
|
+
|
|
478
|
+
route:
|
|
479
|
+
description: "Conditional branching based on conditions"
|
|
480
|
+
required: ["name", "branches"]
|
|
481
|
+
example:
|
|
482
|
+
route:
|
|
483
|
+
name: "gesture routing"
|
|
484
|
+
branches:
|
|
485
|
+
- condition: "when gesture:swipe detected"
|
|
486
|
+
steps:
|
|
487
|
+
- step: 10
|
|
488
|
+
intent: "derive tone for preview"
|
|
489
|
+
from: "wagon:interpret-gesture"
|
|
490
|
+
to: "wagon:derive-tone"
|
|
491
|
+
artifact: "gesture:raw"
|
|
492
|
+
|
|
493
|
+
# Artifact flow
|
|
494
|
+
artifact_flow:
|
|
495
|
+
description: "Artifacts flow between participants as the train executes"
|
|
496
|
+
|
|
497
|
+
format: "{domain}:{resource}"
|
|
498
|
+
pattern: "^[a-z][a-z0-9-]*:[a-z][a-z0-9.-]*$"
|
|
499
|
+
|
|
500
|
+
examples:
|
|
501
|
+
- artifact: "material:raw-story"
|
|
502
|
+
domain: "material"
|
|
503
|
+
resource: "raw-story"
|
|
504
|
+
|
|
505
|
+
- artifact: "scenario:material.steps"
|
|
506
|
+
domain: "scenario"
|
|
507
|
+
resource: "material.steps"
|
|
508
|
+
|
|
509
|
+
- artifact: "match:dilemma.current"
|
|
510
|
+
domain: "match"
|
|
511
|
+
resource: "dilemma.current"
|
|
512
|
+
|
|
513
|
+
validation:
|
|
514
|
+
produced_before_consumed: "Artifacts must be produced before being consumed in sequence"
|
|
515
|
+
defined_in_wagons: "Artifacts should be defined in participant wagon manifests"
|
|
516
|
+
|
|
517
|
+
# Variation strategies
|
|
518
|
+
variation_strategies:
|
|
519
|
+
description: "How to create train variations within a theme"
|
|
520
|
+
|
|
521
|
+
by_mode:
|
|
522
|
+
description: "Different operational modes"
|
|
523
|
+
examples:
|
|
524
|
+
- "30-match-solo, 31-match-duel, 32-match-team"
|
|
525
|
+
- "80-wallet-init, 81-wallet-transfer, 82-wallet-reconcile"
|
|
526
|
+
|
|
527
|
+
by_complexity:
|
|
528
|
+
description: "Progressive enhancement of base flow"
|
|
529
|
+
examples:
|
|
530
|
+
- "10-decision-core (basic), 11-decision-timeout (adds timebank), 12-decision-preview (adds prediction)"
|
|
531
|
+
|
|
532
|
+
by_persona:
|
|
533
|
+
description: "Different user journeys"
|
|
534
|
+
examples:
|
|
535
|
+
- "01-player-registration, 02-sponsor-registration, 03-partner-registration"
|
|
536
|
+
|
|
537
|
+
by_phase:
|
|
538
|
+
description: "Lifecycle or temporal phases"
|
|
539
|
+
examples:
|
|
540
|
+
- "60-tournament-setup, 61-tournament-active, 62-tournament-complete"
|
|
541
|
+
|
|
542
|
+
schema_references:
|
|
543
|
+
train: "schemas/planner/train.schema.json"
|
|
544
|
+
|
|
545
|
+
validation_rules:
|
|
546
|
+
- "train_id must match pattern: {theme_digit}{variation_digit}-{name}"
|
|
547
|
+
- "First digit determines primary theme category"
|
|
548
|
+
- "File must exist at path: plan/_trains/{train_id}.yaml"
|
|
549
|
+
- "All participants must be declared in participants list"
|
|
550
|
+
- "Dependencies must reference valid train_ids"
|
|
551
|
+
- "Artifacts in sequence must follow domain:resource pattern"
|
|
552
|
+
- "Themes array must include primary theme based on first digit"
|