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.
- atdd/__init__.py +0 -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.1.0.dist-info/METADATA +191 -0
- atdd-0.1.0.dist-info/RECORD +183 -0
- atdd-0.1.0.dist-info/WHEEL +5 -0
- atdd-0.1.0.dist-info/entry_points.txt +2 -0
- atdd-0.1.0.dist-info/licenses/LICENSE +674 -0
- atdd-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Feature Schema",
|
|
4
|
+
"description": "Schema for feature YAML files",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["urn", "wagon", "description", "sizing", "wmbts", "components"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"urn": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"pattern": "^feature:[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$",
|
|
11
|
+
"description": "Feature URN: feature:{wagon}:{feature}"
|
|
12
|
+
},
|
|
13
|
+
"wagon": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"pattern": "^wagon:[a-z][a-z0-9-]*$",
|
|
16
|
+
"description": "Parent wagon URN (e.g., wagon:burn-timebank)"
|
|
17
|
+
},
|
|
18
|
+
"description": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"minLength": 10,
|
|
21
|
+
"maxLength": 200,
|
|
22
|
+
"description": "One-liner describing feature purpose"
|
|
23
|
+
},
|
|
24
|
+
"sizing": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": ["wmbts", "footprint_score", "footprint_size"],
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"properties": {
|
|
29
|
+
"wmbts": {
|
|
30
|
+
"type": "integer",
|
|
31
|
+
"minimum": 0,
|
|
32
|
+
"description": "WMBT count covered by this feature"
|
|
33
|
+
},
|
|
34
|
+
"footprint_score": {
|
|
35
|
+
"type": "integer",
|
|
36
|
+
"minimum": 0,
|
|
37
|
+
"description": "Calculated footprint complexity score"
|
|
38
|
+
},
|
|
39
|
+
"footprint_size": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"enum": ["XS", "S", "M", "L", "XL"],
|
|
42
|
+
"description": "Footprint size category based on score"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"description": "Feature sizing metrics combining WMBT coverage and architectural footprint"
|
|
46
|
+
},
|
|
47
|
+
"wmbts": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"pattern": "^wmbt:[a-z][a-z0-9-]*:[DLPCEMYRK][0-9]{3}$"
|
|
52
|
+
},
|
|
53
|
+
"description": "WMBTs covered by this feature (e.g., wmbt:burn-timebank:E001)"
|
|
54
|
+
},
|
|
55
|
+
"components": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"description": "Component enumeration using URN references to component types from coder conventions",
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"properties": {
|
|
60
|
+
"backend": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"description": "Backend components grouped by architectural layer",
|
|
63
|
+
"additionalProperties": false,
|
|
64
|
+
"properties": {
|
|
65
|
+
"presentation": {
|
|
66
|
+
"type": "array",
|
|
67
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
68
|
+
},
|
|
69
|
+
"application": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
72
|
+
},
|
|
73
|
+
"domain": {
|
|
74
|
+
"type": "array",
|
|
75
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
76
|
+
},
|
|
77
|
+
"integration": {
|
|
78
|
+
"type": "array",
|
|
79
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"frontend": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"description": "Frontend components grouped by architectural layer",
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"properties": {
|
|
88
|
+
"presentation": {
|
|
89
|
+
"type": "array",
|
|
90
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
91
|
+
},
|
|
92
|
+
"application": {
|
|
93
|
+
"type": "array",
|
|
94
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
95
|
+
},
|
|
96
|
+
"domain": {
|
|
97
|
+
"type": "array",
|
|
98
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
99
|
+
},
|
|
100
|
+
"integration": {
|
|
101
|
+
"type": "array",
|
|
102
|
+
"items": {"$ref": "#/definitions/componentEntry"}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"anyOf": [
|
|
108
|
+
{"required": ["backend"]},
|
|
109
|
+
{"required": ["frontend"]}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"ioSeeds": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"description": "I/O seeds that propagate to child components with explicit wagon references",
|
|
115
|
+
"required": ["consume", "produce"],
|
|
116
|
+
"additionalProperties": false,
|
|
117
|
+
"properties": {
|
|
118
|
+
"consume": {
|
|
119
|
+
"type": "array",
|
|
120
|
+
"items": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"required": ["name", "contract"],
|
|
123
|
+
"additionalProperties": false,
|
|
124
|
+
"properties": {
|
|
125
|
+
"name": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"pattern": "^[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
128
|
+
"description": "Artifact name per artifact-naming.convention.yaml: domain(:category)*:aspect(.variant)?"
|
|
129
|
+
},
|
|
130
|
+
"contract": {
|
|
131
|
+
"type": ["string", "null"],
|
|
132
|
+
"pattern": "^(contract:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?|contracts/[a-z]+/[a-z][a-z0-9-]+\\.json)$",
|
|
133
|
+
"description": "Contract URN per artifact-naming.convention.yaml (e.g., contract:commons:ux:foundations, contract:match:result) or legacy path. Use null if no contract exists."
|
|
134
|
+
},
|
|
135
|
+
"telemetry": {
|
|
136
|
+
"type": ["string", "null"],
|
|
137
|
+
"pattern": "^telemetry:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
138
|
+
"description": "Telemetry URN for observability per artifact-naming.convention.yaml (e.g., telemetry:mechanic:decision.choice). Use null if telemetry not tracked."
|
|
139
|
+
},
|
|
140
|
+
"derived": {
|
|
141
|
+
"type": "boolean",
|
|
142
|
+
"description": "True if this is a new internal seed not in parent wagon"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"description": "Input seeds consumed by this feature"
|
|
147
|
+
},
|
|
148
|
+
"produce": {
|
|
149
|
+
"type": "array",
|
|
150
|
+
"items": {"$ref": "#/properties/ioSeeds/properties/consume/items"},
|
|
151
|
+
"description": "Output seeds produced by this feature"
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
"appendices": {
|
|
157
|
+
"type": "array",
|
|
158
|
+
"description": "Supplementary files for this feature",
|
|
159
|
+
"items": {
|
|
160
|
+
"$ref": "appendix.schema.json#/definitions/appendix_reference"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
"definitions": {
|
|
166
|
+
"componentEntry": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"required": ["type", "count", "rationale"],
|
|
169
|
+
"additionalProperties": false,
|
|
170
|
+
"properties": {
|
|
171
|
+
"type": {
|
|
172
|
+
"type": "string",
|
|
173
|
+
"enum": [
|
|
174
|
+
"controllers", "routes", "serializers", "validators", "middleware", "guards", "views",
|
|
175
|
+
"use_cases", "handlers", "ports", "dtos", "policies", "workflows",
|
|
176
|
+
"entities", "value_objects", "aggregates", "services", "specifications", "events", "exceptions",
|
|
177
|
+
"repositories", "clients", "caches", "engines", "formatters", "notifiers", "queues", "stores", "mappers", "schedulers", "monitors",
|
|
178
|
+
"components", "containers", "layouts", "styles", "animations", "forms", "hooks", "directives", "filters",
|
|
179
|
+
"interceptors", "synchronizers", "workers", "connectors"
|
|
180
|
+
],
|
|
181
|
+
"description": "Component type from component.schema.json componentType enum. Side and layer inferred from YAML hierarchy."
|
|
182
|
+
},
|
|
183
|
+
"count": {
|
|
184
|
+
"type": "integer",
|
|
185
|
+
"minimum": 1,
|
|
186
|
+
"description": "Number of components of this type"
|
|
187
|
+
},
|
|
188
|
+
"rationale": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"minLength": 10,
|
|
191
|
+
"maxLength": 200,
|
|
192
|
+
"description": "Brief explanation for why this component type is needed"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Train Schema",
|
|
4
|
+
"description": "Schema for train definitions orchestrating multi-wagon workflows with theme-based numbering",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"$comment": "Trains use hierarchical numbering [Theme][Category][Variation] (0001-0099: commons nominal, 0101-0199: commons error, etc.) where first digit = theme (0-9), second digit = category (0=nominal, 1=error, 2=alternate, 3=exception), third-fourth digits = variation (01-99)",
|
|
8
|
+
"required": [
|
|
9
|
+
"train_id",
|
|
10
|
+
"title",
|
|
11
|
+
"description",
|
|
12
|
+
"themes",
|
|
13
|
+
"participants",
|
|
14
|
+
"sequence"
|
|
15
|
+
],
|
|
16
|
+
"properties": {
|
|
17
|
+
"train_id": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"pattern": "^[0-9]{4}-[a-z][a-z0-9-]*$",
|
|
20
|
+
"description": "Train identifier with hierarchical numbering: {theme}{category}{variation}-{kebab-case-name} (e.g., 0001-auth-session-standard, 2301-empty-input-file)"
|
|
21
|
+
},
|
|
22
|
+
"title": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"minLength": 3,
|
|
25
|
+
"description": "Human-readable display name for the train"
|
|
26
|
+
},
|
|
27
|
+
"description": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"minLength": 10,
|
|
30
|
+
"description": "Concise description of the train's purpose and workflow"
|
|
31
|
+
},
|
|
32
|
+
"themes": {
|
|
33
|
+
"type": "array",
|
|
34
|
+
"description": "Theme categories this train belongs to",
|
|
35
|
+
"minItems": 1,
|
|
36
|
+
"items": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"enum": [
|
|
39
|
+
"commons",
|
|
40
|
+
"mechanic",
|
|
41
|
+
"scenario",
|
|
42
|
+
"match",
|
|
43
|
+
"sensory",
|
|
44
|
+
"player",
|
|
45
|
+
"league",
|
|
46
|
+
"audience",
|
|
47
|
+
"monetization",
|
|
48
|
+
"partnership"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"description": "Other trains that must run before this train",
|
|
55
|
+
"items": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"pattern": "^train:[0-9]{4}-[a-z][a-z0-9-]*$",
|
|
58
|
+
"description": "Train reference in format: train:{train_id}"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"participants": {
|
|
62
|
+
"type": "array",
|
|
63
|
+
"description": "Wagons, users, and systems involved in this train",
|
|
64
|
+
"minItems": 1,
|
|
65
|
+
"items": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"pattern": "^(wagon|user|system):[a-z][a-z0-9-]*$",
|
|
68
|
+
"description": "Participant reference: wagon:{wagon-id}, user:{role}, system:{source}"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"sequence": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"description": "Ordered steps, loops, and routes defining the train workflow",
|
|
74
|
+
"minItems": 1,
|
|
75
|
+
"items": {
|
|
76
|
+
"oneOf": [
|
|
77
|
+
{ "$ref": "#/definitions/step" },
|
|
78
|
+
{ "$ref": "#/definitions/loop" },
|
|
79
|
+
{ "$ref": "#/definitions/route" }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"definitions": {
|
|
85
|
+
"step": {
|
|
86
|
+
"type": "object",
|
|
87
|
+
"required": ["step", "intent", "from", "to", "artifact"],
|
|
88
|
+
"additionalProperties": false,
|
|
89
|
+
"properties": {
|
|
90
|
+
"step": {
|
|
91
|
+
"type": "integer",
|
|
92
|
+
"minimum": 1,
|
|
93
|
+
"description": "Step number in sequence"
|
|
94
|
+
},
|
|
95
|
+
"intent": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"minLength": 5,
|
|
98
|
+
"description": "What this step accomplishes"
|
|
99
|
+
},
|
|
100
|
+
"from": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"pattern": "^(wagon|user|system):[a-z][a-z0-9-]*$",
|
|
103
|
+
"description": "Source participant"
|
|
104
|
+
},
|
|
105
|
+
"to": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"pattern": "^(wagon|user|system):[a-z][a-z0-9-]*$",
|
|
108
|
+
"description": "Destination participant"
|
|
109
|
+
},
|
|
110
|
+
"artifact": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"pattern": "^[a-z][a-z0-9-]*:[a-z][a-z0-9.-]*$",
|
|
113
|
+
"description": "Artifact passed between participants (domain:resource format)"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"loop": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"required": ["loop"],
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"properties": {
|
|
122
|
+
"loop": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"required": ["name", "condition", "steps"],
|
|
125
|
+
"additionalProperties": false,
|
|
126
|
+
"properties": {
|
|
127
|
+
"name": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 3,
|
|
130
|
+
"description": "Loop identifier"
|
|
131
|
+
},
|
|
132
|
+
"condition": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"minLength": 5,
|
|
135
|
+
"description": "Loop continuation/exit condition"
|
|
136
|
+
},
|
|
137
|
+
"steps": {
|
|
138
|
+
"type": "array",
|
|
139
|
+
"minItems": 1,
|
|
140
|
+
"items": {
|
|
141
|
+
"oneOf": [
|
|
142
|
+
{ "$ref": "#/definitions/step" },
|
|
143
|
+
{ "$ref": "#/definitions/route" }
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"route": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"required": ["route"],
|
|
154
|
+
"additionalProperties": false,
|
|
155
|
+
"properties": {
|
|
156
|
+
"route": {
|
|
157
|
+
"type": "object",
|
|
158
|
+
"required": ["name", "branches"],
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"properties": {
|
|
161
|
+
"name": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"minLength": 3,
|
|
164
|
+
"description": "Route identifier"
|
|
165
|
+
},
|
|
166
|
+
"branches": {
|
|
167
|
+
"type": "array",
|
|
168
|
+
"minItems": 1,
|
|
169
|
+
"items": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"required": ["condition", "steps"],
|
|
172
|
+
"additionalProperties": false,
|
|
173
|
+
"properties": {
|
|
174
|
+
"condition": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"minLength": 5,
|
|
177
|
+
"description": "Branch condition"
|
|
178
|
+
},
|
|
179
|
+
"steps": {
|
|
180
|
+
"type": "array",
|
|
181
|
+
"minItems": 1,
|
|
182
|
+
"items": { "$ref": "#/definitions/step" }
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Wagon Manifest Schema",
|
|
4
|
+
"description": "Minimal wagon header (1:1 fields) with step-coded WMBT registry and retired index.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"$comment": "SPEC-COACH-UTILS-0281: Naming Conventions - URNs/slugs use kebab-case (wagon:maintain-ux, maintain-ux), directories use snake_case (plan/maintain_design/), manifest files use _{dirname}.yaml (_maintain_design.yaml). Conversion: slug.replace('-','_')→dirname, dirname.replace('_','-')→slug. Note: enforce total matches live WMBT entries in CI/code; draft-07 cannot express that constraint.",
|
|
8
|
+
"required": [
|
|
9
|
+
"wagon",
|
|
10
|
+
"description",
|
|
11
|
+
"subject",
|
|
12
|
+
"context",
|
|
13
|
+
"action",
|
|
14
|
+
"goal",
|
|
15
|
+
"outcome",
|
|
16
|
+
"produce",
|
|
17
|
+
"consume",
|
|
18
|
+
"wmbt"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"wagon": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
24
|
+
"description": "Wagon identifier in verb-object kebab-case (e.g., resolve-dilemmas, commit-state)."
|
|
25
|
+
},
|
|
26
|
+
"urn": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"pattern": "^wagon:[a-z][a-z0-9-]*$",
|
|
29
|
+
"description": "Optional URN for global addressing. Format: wagon:{slug}."
|
|
30
|
+
},
|
|
31
|
+
"name": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 3,
|
|
34
|
+
"description": "Optional human-readable display name (title-case allowed)."
|
|
35
|
+
},
|
|
36
|
+
"description": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"minLength": 10,
|
|
39
|
+
"description": "Concise one-liner explaining the wagon's purpose and scope."
|
|
40
|
+
},
|
|
41
|
+
"theme": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"enum": ["mechanic","scenario","match","sensory","player","league","audience","monetization","partnership","commons"],
|
|
44
|
+
"description": "High-level category to group related wagons for navigation and reporting."
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
"subject": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"pattern": "^[a-z]+:[a-z][a-z0-9-]*$",
|
|
50
|
+
"description": "Who/what performs the action (typed identifier, e.g., player:active, engine:orchestrator)."
|
|
51
|
+
},
|
|
52
|
+
"context": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1,
|
|
55
|
+
"description": "Situs/when/where as a short phrase (e.g., \"in-match, timebank-active\")."
|
|
56
|
+
},
|
|
57
|
+
"action": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"minLength": 1,
|
|
60
|
+
"description": "Single present-tense phrase of what the subject does (e.g., \"applies the chosen option\")."
|
|
61
|
+
},
|
|
62
|
+
"goal": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"minLength": 1,
|
|
65
|
+
"description": "Single intent that motivates the action (e.g., \"advance toward a stable business trajectory\")."
|
|
66
|
+
},
|
|
67
|
+
"outcome": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"minLength": 1,
|
|
70
|
+
"description": "Single measurable progress statement (e.g., \"choice applied and state updated\")."
|
|
71
|
+
},
|
|
72
|
+
"produce": {
|
|
73
|
+
"type": "array",
|
|
74
|
+
"description": "Artifacts produced and owned by this wagon",
|
|
75
|
+
"minItems": 1,
|
|
76
|
+
"items": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"required": ["name", "contract", "telemetry"],
|
|
79
|
+
"additionalProperties": false,
|
|
80
|
+
"properties": {
|
|
81
|
+
"name": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"pattern": "^[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
84
|
+
"description": "Artifact name per artifact-naming.convention.yaml: domain(:category)*:aspect(.variant)? - supports hierarchy (colons) and facets (dots). Examples: match:started, commons:auth.claims, commons:ux:foundations:color"
|
|
85
|
+
},
|
|
86
|
+
"to": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"enum": ["internal", "external"],
|
|
89
|
+
"default": "external",
|
|
90
|
+
"description": "Optional visibility: internal (private to this wagon), external (public to all wagons including self). Defaults to external when omitted."
|
|
91
|
+
},
|
|
92
|
+
"version": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"pattern": "^v\\d+$",
|
|
95
|
+
"description": "Optional version (e.g., v1)"
|
|
96
|
+
},
|
|
97
|
+
"contract": {
|
|
98
|
+
"type": ["string", "null"],
|
|
99
|
+
"pattern": "^(contract:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?|contracts/[a-z]+/[a-z][a-z0-9-]+\\.json)$",
|
|
100
|
+
"description": "Contract URN per artifact-naming.convention.yaml (e.g., contract:commons:ux:foundations, contract:commons:player.identity, contract:match:result) or legacy path (e.g., contracts/commons/ux/foundations.json). Required field, use null if no contract exists."
|
|
101
|
+
},
|
|
102
|
+
"telemetry": {
|
|
103
|
+
"type": ["string", "null"],
|
|
104
|
+
"pattern": "^telemetry:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
105
|
+
"description": "Telemetry URN for observability and analytics per artifact-naming.convention.yaml (e.g., telemetry:commons:ux:foundations, telemetry:mechanic:decision.choice → telemetry/mechanic/decision/choice/). Maps to directory containing signal files: metric.{plane}.{measure}.json and event.{plane}.json. Manifest generated from source files. Required field, use null if telemetry not tracked."
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"consume": {
|
|
111
|
+
"type": "array",
|
|
112
|
+
"description": "Artifacts consumed from other wagons",
|
|
113
|
+
"minItems": 0,
|
|
114
|
+
"items": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"required": ["name"],
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"properties": {
|
|
119
|
+
"name": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"pattern": "^[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
122
|
+
"description": "Artifact name per artifact-naming.convention.yaml: domain(:category)*:aspect(.variant)? - supports hierarchy (colons) and facets (dots). Examples: match:started, match:dilemma.current, commons:player.identity, appendix:mockup. Pattern: Events = past tense verbs, State = nouns/adjectives, Collections = plural"
|
|
123
|
+
},
|
|
124
|
+
"from": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"pattern": "^((wagon|system|appendix):[a-z][a-z0-9-]*|internal)$",
|
|
127
|
+
"description": "Optional source: wagon:slug (external wagon), system:service (platform), appendix:type (supplementary), or 'internal' (same wagon). Can be omitted when source is inferred from contract URN."
|
|
128
|
+
},
|
|
129
|
+
"version": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"pattern": "^v\\d+$",
|
|
132
|
+
"description": "Optional version requirement"
|
|
133
|
+
},
|
|
134
|
+
"contract": {
|
|
135
|
+
"type": ["string", "null"],
|
|
136
|
+
"pattern": "^(contract:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?|contracts/[a-z]+/[a-z][a-z0-9-]+\\.json)$",
|
|
137
|
+
"description": "Optional contract URN per artifact-naming.convention.yaml (e.g., contract:appendix:mockup, contract:match:dilemma.current, contract:match:result) or legacy path (e.g., contracts/appendix/mockup.json). Can be null if no contract exists."
|
|
138
|
+
},
|
|
139
|
+
"telemetry": {
|
|
140
|
+
"type": ["string", "null"],
|
|
141
|
+
"pattern": "^telemetry:[a-z][a-z0-9\\-]*:[a-z][a-z0-9\\-:]*(\\.[a-z][a-z0-9\\-]+)?$",
|
|
142
|
+
"description": "Optional telemetry URN for observability and analytics per artifact-naming.convention.yaml (e.g., telemetry:appendix:mockup, telemetry:mechanic:decision.choice → telemetry/mechanic/decision/choice/). Maps to directory containing signal JSON files. Can be null if telemetry not tracked."
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
"wmbt_step_codes": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"readOnly": true,
|
|
151
|
+
"const": {
|
|
152
|
+
"D": "Define",
|
|
153
|
+
"L": "Locate",
|
|
154
|
+
"P": "Prepare",
|
|
155
|
+
"C": "Confirm",
|
|
156
|
+
"E": "Execute",
|
|
157
|
+
"M": "Monitor",
|
|
158
|
+
"Y": "Modify",
|
|
159
|
+
"R": "Resolve",
|
|
160
|
+
"K": "Conclude"
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
"wmbt": {
|
|
165
|
+
"type": "object",
|
|
166
|
+
"minProperties": 0,
|
|
167
|
+
"additionalProperties": false,
|
|
168
|
+
"required": ["total"],
|
|
169
|
+
"properties": {
|
|
170
|
+
"total": {
|
|
171
|
+
"type": "integer",
|
|
172
|
+
"minimum": 0,
|
|
173
|
+
"description": "Total number of WMBTs in this wagon (sum across all steps). Can be 0 initially, populated via wmbt.action handoff."
|
|
174
|
+
},
|
|
175
|
+
"coverage": {
|
|
176
|
+
"type": "integer",
|
|
177
|
+
"minimum": 0,
|
|
178
|
+
"maximum": 100,
|
|
179
|
+
"description": "Optional WMBT coverage percentage (0-100). Measures completeness of WMBT planning and implementation."
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"patternProperties": {
|
|
183
|
+
"^[DLPCEMYRK][0-9]{3}$": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
"retired": {
|
|
191
|
+
"type": "object",
|
|
192
|
+
"additionalProperties": false,
|
|
193
|
+
"patternProperties": {
|
|
194
|
+
"^[DLPCEMYRK][0-9]{3}$": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"minLength": 1
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
"features": {
|
|
202
|
+
"oneOf": [
|
|
203
|
+
{
|
|
204
|
+
"type": "object",
|
|
205
|
+
"description": "Legacy: Features as object with slug:description pairs",
|
|
206
|
+
"additionalProperties": false,
|
|
207
|
+
"patternProperties": {
|
|
208
|
+
"^[a-z]+-[a-z0-9-]+$": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"minLength": 1,
|
|
211
|
+
"maxLength": 120
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"type": "array",
|
|
217
|
+
"description": "Features as URN array (e.g., [{ urn: 'feature:maintain-ux.provide-foundations' }])",
|
|
218
|
+
"items": {
|
|
219
|
+
"type": "object",
|
|
220
|
+
"required": ["urn"],
|
|
221
|
+
"additionalProperties": false,
|
|
222
|
+
"properties": {
|
|
223
|
+
"urn": {
|
|
224
|
+
"type": "string",
|
|
225
|
+
"pattern": "^feature:[a-z][a-z0-9-]+:[a-z][a-z0-9-]+$",
|
|
226
|
+
"description": "Feature URN in format feature:wagon-slug:feature-name (e.g., feature:maintain-ux:provide-foundations)"
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
]
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
"coverage": {
|
|
235
|
+
"type": "object",
|
|
236
|
+
"additionalProperties": false,
|
|
237
|
+
"description": "Optional coverage counts by lens for planning/reporting.",
|
|
238
|
+
"properties": {
|
|
239
|
+
"functional": { "type": "integer", "minimum": 0, "description": "Count of functional/technical WMBTs." },
|
|
240
|
+
"emotional": { "type": "integer", "minimum": 0, "description": "Count of emotional/UX WMBTs." },
|
|
241
|
+
"social": { "type": "integer", "minimum": 0, "description": "Count of social/collaborative WMBTs." }
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
"metadata": {
|
|
246
|
+
"type": "object",
|
|
247
|
+
"additionalProperties": false,
|
|
248
|
+
"description": "Optional metadata for versioning, dependencies, and timestamps.",
|
|
249
|
+
"properties": {
|
|
250
|
+
"version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$", "description": "Semantic version of this manifest." },
|
|
251
|
+
"dependencies": {
|
|
252
|
+
"type": "array",
|
|
253
|
+
"description": "Other wagon slugs this wagon depends on (planning view; interfaces are derived from artifacts).",
|
|
254
|
+
"items": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" }
|
|
255
|
+
},
|
|
256
|
+
"created": { "type": "string", "format": "date", "description": "Creation date (YYYY-MM-DD)." },
|
|
257
|
+
"updated": { "type": "string", "format": "date", "description": "Last updated (YYYY-MM-DD)." }
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
"appendices": {
|
|
262
|
+
"type": "array",
|
|
263
|
+
"description": "Supplementary files (mockups, diagrams, documents, etc.) that provide additional context for this wagon",
|
|
264
|
+
"items": {
|
|
265
|
+
"$ref": "appendix.schema.json#/definitions/appendix_reference"
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"definitions": {
|
|
270
|
+
"wmbt_ids": {
|
|
271
|
+
"type": "array",
|
|
272
|
+
"description": "List of WMBT ids for a given step. Use 3-digit ids, optional slug suffix.",
|
|
273
|
+
"items": {
|
|
274
|
+
"oneOf": [
|
|
275
|
+
{ "type": "integer", "minimum": 1, "maximum": 999, "description": "Numeric WMBT id (1..999 maps to 001..999)." },
|
|
276
|
+
{ "type": "string", "pattern": "^\\d{3}(-[a-z][a-z0-9-]*)?$", "description": "String id with optional suffix (e.g., \"001\" or \"001-define-scope\")." }
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|