atdd 0.7.1__py3-none-any.whl → 0.7.3__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/coach/commands/registry.py +6 -6
- atdd/coach/commands/traceability.py +5 -5
- atdd/coach/conventions/naming.convention.yaml +296 -0
- atdd/coach/conventions/session.convention.yaml +1 -0
- atdd/coach/schemas/config.schema.json +26 -0
- atdd/coach/templates/ATDD.md +1 -0
- atdd/coach/templates/SESSION-TEMPLATE.md +6 -1
- atdd/coach/validators/test_session_archive_status.py +339 -0
- atdd/coach/validators/test_session_manifest_alignment.py +387 -0
- atdd/coach/validators/test_session_validation.py +161 -0
- atdd/planner/conventions/train.convention.yaml +17 -0
- atdd/planner/validators/test_plan_wagons.py +70 -3
- atdd/tester/conventions/telemetry.convention.yaml +25 -20
- atdd/tester/schemas/telemetry_tracking_manifest.schema.json +1 -1
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/METADATA +1 -1
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/RECORD +20 -17
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/WHEEL +0 -0
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/entry_points.txt +0 -0
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/licenses/LICENSE +0 -0
- {atdd-0.7.1.dist-info → atdd-0.7.3.dist-info}/top_level.txt +0 -0
atdd/coach/commands/registry.py
CHANGED
|
@@ -10,7 +10,7 @@ Architecture: 4-Layer Clean Architecture (single file)
|
|
|
10
10
|
Registries:
|
|
11
11
|
- plan/_wagons.yaml from wagon manifests
|
|
12
12
|
- contracts/_artifacts.yaml from contract schemas
|
|
13
|
-
- telemetry/
|
|
13
|
+
- telemetry/_telemetry.yaml from telemetry signals
|
|
14
14
|
- atdd/tester/_tests.yaml from test files
|
|
15
15
|
- python/_implementations.yaml from Python files
|
|
16
16
|
- supabase/_functions.yaml from function files
|
|
@@ -89,8 +89,8 @@ class RegistryLoader:
|
|
|
89
89
|
return yaml.safe_load(f) or {"artifacts": []}
|
|
90
90
|
|
|
91
91
|
def load_telemetry(self) -> Dict[str, Any]:
|
|
92
|
-
"""Load telemetry registry (telemetry/
|
|
93
|
-
registry_path = self.telemetry_dir / "
|
|
92
|
+
"""Load telemetry registry (telemetry/_telemetry.yaml)."""
|
|
93
|
+
registry_path = self.telemetry_dir / "_telemetry.yaml"
|
|
94
94
|
if not registry_path.exists():
|
|
95
95
|
return {"signals": []}
|
|
96
96
|
|
|
@@ -776,7 +776,7 @@ class RegistryBuilder:
|
|
|
776
776
|
|
|
777
777
|
def update_telemetry_registry(self, mode: str = "interactive", preview_only: bool = None) -> Dict[str, Any]:
|
|
778
778
|
"""
|
|
779
|
-
Update telemetry/
|
|
779
|
+
Update telemetry/_telemetry.yaml from telemetry signal files.
|
|
780
780
|
|
|
781
781
|
Args:
|
|
782
782
|
mode: "interactive" (prompt), "apply" (no prompt), or "check" (verify only)
|
|
@@ -791,7 +791,7 @@ class RegistryBuilder:
|
|
|
791
791
|
print("\n📊 Analyzing telemetry registry from signal files...")
|
|
792
792
|
|
|
793
793
|
# Load existing registry
|
|
794
|
-
registry_path = self.telemetry_dir / "
|
|
794
|
+
registry_path = self.telemetry_dir / "_telemetry.yaml"
|
|
795
795
|
existing_signals = {}
|
|
796
796
|
if registry_path.exists():
|
|
797
797
|
with open(registry_path) as f:
|
|
@@ -812,7 +812,7 @@ class RegistryBuilder:
|
|
|
812
812
|
# Scan for telemetry signal files (JSON or YAML)
|
|
813
813
|
json_files = list(self.telemetry_dir.glob("**/*.json"))
|
|
814
814
|
yaml_files = list(self.telemetry_dir.glob("**/*.yaml"))
|
|
815
|
-
signal_files = [f for f in (json_files + yaml_files) if "
|
|
815
|
+
signal_files = [f for f in (json_files + yaml_files) if "_telemetry" not in f.name]
|
|
816
816
|
|
|
817
817
|
stats["total_files"] = len(signal_files)
|
|
818
818
|
|
|
@@ -1435,8 +1435,8 @@ class TraceabilityReconciler:
|
|
|
1435
1435
|
|
|
1436
1436
|
for telemetry in telemetry_files:
|
|
1437
1437
|
# Skip manifest and pack files (not signal files)
|
|
1438
|
-
if (telemetry.file_path.endswith('
|
|
1439
|
-
telemetry.file_path.endswith('
|
|
1438
|
+
if (telemetry.file_path.endswith('_taxonomy.yaml') or
|
|
1439
|
+
telemetry.file_path.endswith('_telemetry.yaml') or
|
|
1440
1440
|
'.pack.' in telemetry.file_path):
|
|
1441
1441
|
continue
|
|
1442
1442
|
|
|
@@ -1493,9 +1493,9 @@ class TraceabilityReconciler:
|
|
|
1493
1493
|
|
|
1494
1494
|
telemetry_id = telemetry.telemetry_id
|
|
1495
1495
|
|
|
1496
|
-
# Skip manifest files (
|
|
1497
|
-
if telemetry.file_path.endswith('
|
|
1498
|
-
telemetry.file_path.endswith('
|
|
1496
|
+
# Skip manifest files (_taxonomy.yaml, _telemetry.yaml)
|
|
1497
|
+
if telemetry.file_path.endswith('_taxonomy.yaml') or \
|
|
1498
|
+
telemetry.file_path.endswith('_telemetry.yaml') or \
|
|
1499
1499
|
'.pack.' in telemetry.file_path:
|
|
1500
1500
|
continue
|
|
1501
1501
|
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
name: "Master Naming Convention"
|
|
3
|
+
description: "Consolidated naming patterns for all ATDD archetypes with regex validation"
|
|
4
|
+
|
|
5
|
+
# Purpose
|
|
6
|
+
purpose: |
|
|
7
|
+
Single source of truth for naming patterns across all archetypes.
|
|
8
|
+
Each archetype has: pattern, regex, examples, and validator reference.
|
|
9
|
+
For detailed semantics, see archetype-specific conventions.
|
|
10
|
+
|
|
11
|
+
# Separator Semantics (from artifact-naming.convention.yaml)
|
|
12
|
+
separator_semantics:
|
|
13
|
+
colon: "Hierarchical descent (unlimited depth)"
|
|
14
|
+
dot: "Lateral variation (typically 0-1 levels)"
|
|
15
|
+
hyphen: "Word separator within segments (kebab-case)"
|
|
16
|
+
|
|
17
|
+
# Naming Patterns by Archetype
|
|
18
|
+
patterns:
|
|
19
|
+
|
|
20
|
+
wagon:
|
|
21
|
+
description: "Bounded context performing specific action on specific object"
|
|
22
|
+
semantic_pattern: "verb-object"
|
|
23
|
+
format: "kebab-case"
|
|
24
|
+
regex: "^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$"
|
|
25
|
+
urn_format: "wagon:{wagon-name}"
|
|
26
|
+
urn_regex: "^wagon:[a-z][a-z0-9-]+$"
|
|
27
|
+
examples:
|
|
28
|
+
valid:
|
|
29
|
+
- "authenticate-identity"
|
|
30
|
+
- "resolve-dilemmas"
|
|
31
|
+
- "commit-state"
|
|
32
|
+
- "burn-timebank"
|
|
33
|
+
- "juggle-domains"
|
|
34
|
+
- "manage-inventory"
|
|
35
|
+
invalid:
|
|
36
|
+
- "authentication" # Missing object (noun only)
|
|
37
|
+
- "dilemma-resolver" # Wrong order (object-verb)
|
|
38
|
+
- "resolving-dilemmas" # Gerund instead of verb
|
|
39
|
+
- "ResolveDilemmas" # PascalCase
|
|
40
|
+
filesystem:
|
|
41
|
+
directory: "plan/{wagon_snake_case}/"
|
|
42
|
+
manifest: "plan/{wagon_snake_case}/_{wagon_snake_case}.yaml"
|
|
43
|
+
note: "Directory uses snake_case: resolve_dilemmas"
|
|
44
|
+
validator:
|
|
45
|
+
file: "src/atdd/planner/validators/test_plan_wagons.py"
|
|
46
|
+
spec: "SPEC-PLATFORM-WAGONS-0008"
|
|
47
|
+
convention_ref: "atdd/planner/conventions/wagon.convention.yaml"
|
|
48
|
+
|
|
49
|
+
feature:
|
|
50
|
+
description: "Specific capability within a wagon"
|
|
51
|
+
semantic_pattern: "verb-object"
|
|
52
|
+
format: "kebab-case"
|
|
53
|
+
regex: "^[a-z][a-z0-9]*-[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$"
|
|
54
|
+
urn_format: "feature:{wagon}:{feature-name}"
|
|
55
|
+
urn_regex: "^feature:[a-z][a-z0-9-]+:[a-z][a-z0-9-]+$"
|
|
56
|
+
examples:
|
|
57
|
+
valid:
|
|
58
|
+
- "capture-choice"
|
|
59
|
+
- "pair-fragments"
|
|
60
|
+
- "score-domains"
|
|
61
|
+
- "sign-commit"
|
|
62
|
+
- "validate-input"
|
|
63
|
+
invalid:
|
|
64
|
+
- "choice-capture" # Wrong order
|
|
65
|
+
- "capturing" # Missing object
|
|
66
|
+
- "fragment_pairing" # Snake case
|
|
67
|
+
filesystem:
|
|
68
|
+
file: "plan/{wagon}/features/{feature_snake_case}.yaml"
|
|
69
|
+
validator:
|
|
70
|
+
file: "src/atdd/planner/validators/test_plan_wagons.py"
|
|
71
|
+
spec: "SPEC-PLATFORM-WAGONS-0009"
|
|
72
|
+
convention_ref: "atdd/planner/conventions/feature.convention.yaml"
|
|
73
|
+
|
|
74
|
+
contract:
|
|
75
|
+
description: "Data exchange contract between wagons"
|
|
76
|
+
semantic_pattern: "theme:hierarchy:aspect(.variant)?"
|
|
77
|
+
format: "kebab-case segments with colon/dot separators"
|
|
78
|
+
id_regex: "^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+(\\.[a-z][a-z0-9-]+)?$"
|
|
79
|
+
urn_format: "contract:{artifact-name}"
|
|
80
|
+
urn_regex: "^contract:[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+(\\.[a-z][a-z0-9-]+)?$"
|
|
81
|
+
examples:
|
|
82
|
+
schema_id:
|
|
83
|
+
- "mechanic:timebank.remaining"
|
|
84
|
+
- "match:dilemma:current"
|
|
85
|
+
- "commons:ux:foundations:color"
|
|
86
|
+
- "sensory:gesture.raw"
|
|
87
|
+
urn:
|
|
88
|
+
- "contract:mechanic:timebank.remaining"
|
|
89
|
+
- "contract:match:dilemma:current"
|
|
90
|
+
- "contract:commons:ux:foundations:color"
|
|
91
|
+
id_vs_urn:
|
|
92
|
+
schema_id: "NO 'contract:' prefix (e.g., mechanic:timebank.remaining)"
|
|
93
|
+
wagon_urn: "WITH 'contract:' prefix (e.g., contract:mechanic:timebank.remaining)"
|
|
94
|
+
filesystem:
|
|
95
|
+
pattern: "contracts/{theme}/{domain}/{aspect}.schema.json"
|
|
96
|
+
example: "contracts/mechanic/timebank/remaining.schema.json"
|
|
97
|
+
validator:
|
|
98
|
+
file: "src/atdd/tester/validators/test_contract_schema_compliance.py"
|
|
99
|
+
spec: "SPEC-TESTER-VAL-0001"
|
|
100
|
+
convention_ref: "atdd/tester/conventions/contract.convention.yaml"
|
|
101
|
+
naming_authority: "atdd/planner/conventions/artifact-naming.convention.yaml"
|
|
102
|
+
|
|
103
|
+
telemetry:
|
|
104
|
+
description: "Observability and analytics tracking signals"
|
|
105
|
+
semantic_pattern: "theme:hierarchy:aspect(.variant)?"
|
|
106
|
+
format: "kebab-case segments with colon/dot separators"
|
|
107
|
+
signal_id_regex: "^[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)+\\.(event|metric|trace|log)\\.(ui|ux|be|db|nw|st|tm|sc|au|fn|if)(\\.[a-z][a-z0-9-]+)?$"
|
|
108
|
+
urn_format: "telemetry:{theme}(:{path})*:{aspect}(.{variant})?"
|
|
109
|
+
urn_regex: "^telemetry:[a-z][a-z0-9-]*(:[a-z][a-z0-9-]+)*(\\.[a-z][a-z0-9-]+)?$"
|
|
110
|
+
examples:
|
|
111
|
+
signal_id:
|
|
112
|
+
- "mechanic:decision.choice.event.be"
|
|
113
|
+
- "match:dilemma:current.metric.be.selection-duration"
|
|
114
|
+
- "juggle:goal.detected.event.be"
|
|
115
|
+
urn:
|
|
116
|
+
- "telemetry:mechanic:decision.choice"
|
|
117
|
+
- "telemetry:juggle:goal.detected"
|
|
118
|
+
- "telemetry:mechanic:episode.timer"
|
|
119
|
+
id_vs_urn:
|
|
120
|
+
signal_id: "NO 'telemetry:' prefix, includes .type.plane (e.g., mechanic:decision.choice.event.be)"
|
|
121
|
+
wagon_urn: "WITH 'telemetry:' prefix, NO type.plane (e.g., telemetry:mechanic:decision.choice)"
|
|
122
|
+
filesystem:
|
|
123
|
+
pattern: "telemetry/{theme}/{domain}/{aspect}.{type}.{plane}[.{measure}].json"
|
|
124
|
+
example: "telemetry/mechanic/decision/choice.event.be.json"
|
|
125
|
+
validator:
|
|
126
|
+
file: "src/atdd/tester/validators/test_telemetry_structure.py"
|
|
127
|
+
spec: "SPEC-TESTER-CONV-0050"
|
|
128
|
+
convention_ref: "atdd/tester/conventions/telemetry.convention.yaml"
|
|
129
|
+
|
|
130
|
+
train:
|
|
131
|
+
description: "User journey or end-to-end workflow"
|
|
132
|
+
semantic_pattern: "{NNNN}-{slug}"
|
|
133
|
+
format: "4-digit hierarchical prefix + kebab-case slug"
|
|
134
|
+
regex: "^\\d{4}-[a-z][a-z0-9-]+$"
|
|
135
|
+
numbering:
|
|
136
|
+
pattern: "[Theme][Category][Variation]-{slug}"
|
|
137
|
+
theme_digit: "0-9 (commons=0, mechanic=1, scenario=2, match=3, etc.)"
|
|
138
|
+
category_digit: "0=nominal, 1=error, 2=alternate, 3=exception"
|
|
139
|
+
variation_digits: "01-99"
|
|
140
|
+
examples:
|
|
141
|
+
valid:
|
|
142
|
+
- "1001-decision-standard"
|
|
143
|
+
- "3006-episode-match-complete"
|
|
144
|
+
- "0201-sso-authentication"
|
|
145
|
+
- "2301-empty-input-file"
|
|
146
|
+
invalid:
|
|
147
|
+
- "101-decision" # Only 3 digits
|
|
148
|
+
- "1001_decision" # Underscore
|
|
149
|
+
- "1001-Decision" # PascalCase
|
|
150
|
+
filesystem:
|
|
151
|
+
registry: "plan/_trains.yaml"
|
|
152
|
+
spec: "plan/_trains/{train_id}.yaml"
|
|
153
|
+
validator:
|
|
154
|
+
file: "src/atdd/planner/validators/test_train_validation.py"
|
|
155
|
+
spec: "SPEC-TRAIN-VAL-0001"
|
|
156
|
+
convention_ref: "atdd/planner/conventions/train.convention.yaml"
|
|
157
|
+
|
|
158
|
+
acceptance:
|
|
159
|
+
description: "Acceptance criteria URN for test traceability"
|
|
160
|
+
semantic_pattern: "acc:{wagon}:{wmbt}-{harness}-{NNN}[-{slug}]"
|
|
161
|
+
format: "Structured URN with step code, harness, and sequence"
|
|
162
|
+
regex: "^acc:[a-z][a-z0-9_-]+:([DLPCEMYRK][0-9]{3}-(UNIT|HTTP|EVENT|WS|E2E|A11Y|VIS|METRIC|JOB|DB|SEC|LOAD|SCRIPT|WIDGET|GOLDEN|BLOC|INTEGRATION|RLS|EDGE|REALTIME|STORAGE)-[0-9]{3}(?:-[a-z0-9-]+)?|[A-Z][0-9]{3})$"
|
|
163
|
+
components:
|
|
164
|
+
wagon: "Parent wagon (kebab-case)"
|
|
165
|
+
wmbt_id: "Step code [DLPCEMYRK] + 3-digit sequence (e.g., C004)"
|
|
166
|
+
harness: "Test harness type (uppercase)"
|
|
167
|
+
sequence: "Zero-padded 3-digit number (001-999)"
|
|
168
|
+
slug: "Optional kebab-case descriptor"
|
|
169
|
+
step_codes:
|
|
170
|
+
D: "Discovery"
|
|
171
|
+
L: "Load"
|
|
172
|
+
P: "Parse"
|
|
173
|
+
C: "Compute"
|
|
174
|
+
E: "Emit"
|
|
175
|
+
M: "Mutate"
|
|
176
|
+
Y: "Yield"
|
|
177
|
+
R: "Render"
|
|
178
|
+
K: "Keep"
|
|
179
|
+
harness_types:
|
|
180
|
+
- "UNIT"
|
|
181
|
+
- "HTTP"
|
|
182
|
+
- "EVENT"
|
|
183
|
+
- "WS"
|
|
184
|
+
- "E2E"
|
|
185
|
+
- "A11Y"
|
|
186
|
+
- "VIS"
|
|
187
|
+
- "METRIC"
|
|
188
|
+
- "JOB"
|
|
189
|
+
- "DB"
|
|
190
|
+
- "SEC"
|
|
191
|
+
- "LOAD"
|
|
192
|
+
- "SCRIPT"
|
|
193
|
+
- "WIDGET"
|
|
194
|
+
- "GOLDEN"
|
|
195
|
+
- "BLOC"
|
|
196
|
+
- "INTEGRATION"
|
|
197
|
+
- "RLS"
|
|
198
|
+
- "EDGE"
|
|
199
|
+
- "REALTIME"
|
|
200
|
+
- "STORAGE"
|
|
201
|
+
examples:
|
|
202
|
+
valid:
|
|
203
|
+
- "acc:commit-state:M001-INTEGRATION-001"
|
|
204
|
+
- "acc:pace-dilemmas:P011-VISUAL-001"
|
|
205
|
+
- "acc:maintain-ux:C004-E2E-019-user-connection"
|
|
206
|
+
- "acc:resolve-dilemmas:C001-UNIT-001-choice-validation"
|
|
207
|
+
invalid:
|
|
208
|
+
- "acc:commit-state:M01-INTEGRATION-001" # Only 2 digits in WMBT
|
|
209
|
+
- "acc:commit-state:M001-integration-001" # Lowercase harness
|
|
210
|
+
- "acc:commit-state:M001-INTEGRATION-01" # Only 2 digits in sequence
|
|
211
|
+
validator:
|
|
212
|
+
file: "src/atdd/tester/validators/test_contract_schema_compliance.py"
|
|
213
|
+
spec: "SPEC-TESTER-VAL-0020"
|
|
214
|
+
convention_ref: "atdd/planner/conventions/acceptance.convention.yaml"
|
|
215
|
+
|
|
216
|
+
wmbt:
|
|
217
|
+
description: "What Must Be True step identifier"
|
|
218
|
+
semantic_pattern: "wmbt:{wagon}:{step_code}{NNN}"
|
|
219
|
+
format: "Step code letter + 3-digit sequence"
|
|
220
|
+
regex: "^wmbt:[a-z][a-z0-9-]+:[DLPCEMYRK][0-9]{3}$"
|
|
221
|
+
examples:
|
|
222
|
+
valid:
|
|
223
|
+
- "wmbt:resolve-dilemmas:C001"
|
|
224
|
+
- "wmbt:commit-state:M001"
|
|
225
|
+
- "wmbt:pace-dilemmas:P011"
|
|
226
|
+
invalid:
|
|
227
|
+
- "wmbt:resolve-dilemmas:C01" # Only 2 digits
|
|
228
|
+
- "wmbt:resolve-dilemmas:X001" # Invalid step code
|
|
229
|
+
filesystem:
|
|
230
|
+
file: "plan/{wagon}/wmbt/{step_code}{NNN}.yaml"
|
|
231
|
+
validator:
|
|
232
|
+
file: "src/atdd/planner/validators/test_wmbt_consistency.py"
|
|
233
|
+
spec: "SPEC-PLANNER-VAL-0030"
|
|
234
|
+
convention_ref: "atdd/planner/conventions/wmbt.convention.yaml"
|
|
235
|
+
|
|
236
|
+
appendix:
|
|
237
|
+
description: "Supplementary reference data"
|
|
238
|
+
semantic_pattern: "appendix:{type}"
|
|
239
|
+
format: "kebab-case type identifier"
|
|
240
|
+
regex: "^appendix:[a-z][a-z0-9-]+$"
|
|
241
|
+
examples:
|
|
242
|
+
valid:
|
|
243
|
+
- "appendix:theme-catalog"
|
|
244
|
+
- "appendix:error-codes"
|
|
245
|
+
- "appendix:locale-mappings"
|
|
246
|
+
invalid:
|
|
247
|
+
- "appendix:ThemeCatalog" # PascalCase
|
|
248
|
+
- "appendix_theme" # Underscore separator
|
|
249
|
+
note: "Currently not strictly enforced - documentation pattern"
|
|
250
|
+
validator:
|
|
251
|
+
file: "Not yet implemented"
|
|
252
|
+
spec: "Pending"
|
|
253
|
+
|
|
254
|
+
system:
|
|
255
|
+
description: "External system or service reference"
|
|
256
|
+
semantic_pattern: "system:{service-name}"
|
|
257
|
+
format: "kebab-case service identifier"
|
|
258
|
+
regex: "^system:[a-z][a-z0-9-]+$"
|
|
259
|
+
examples:
|
|
260
|
+
valid:
|
|
261
|
+
- "system:external"
|
|
262
|
+
- "system:scenario-library"
|
|
263
|
+
- "system:filesystem"
|
|
264
|
+
- "system:posthog"
|
|
265
|
+
invalid:
|
|
266
|
+
- "system:External" # PascalCase
|
|
267
|
+
- "external-system" # Missing prefix
|
|
268
|
+
note: "Used in wagon consume references for external dependencies"
|
|
269
|
+
validator:
|
|
270
|
+
file: "Not yet implemented"
|
|
271
|
+
spec: "Pending"
|
|
272
|
+
|
|
273
|
+
# Validation Summary
|
|
274
|
+
validation_summary:
|
|
275
|
+
enforced:
|
|
276
|
+
- wagon: "SPEC-PLATFORM-WAGONS-0008"
|
|
277
|
+
- feature: "SPEC-PLATFORM-WAGONS-0009"
|
|
278
|
+
- contract: "SPEC-PLATFORM-WAGONS-0006"
|
|
279
|
+
- telemetry: "SPEC-PLATFORM-WAGONS-0007"
|
|
280
|
+
- train: "SPEC-TRAIN-VAL-0001"
|
|
281
|
+
- acceptance: "SPEC-TESTER-VAL-0020"
|
|
282
|
+
- wmbt: "SPEC-PLANNER-VAL-0030"
|
|
283
|
+
pending:
|
|
284
|
+
- appendix: "Not yet enforced"
|
|
285
|
+
- system: "Not yet enforced"
|
|
286
|
+
|
|
287
|
+
# Cross-References
|
|
288
|
+
references:
|
|
289
|
+
artifact_naming: "atdd/planner/conventions/artifact-naming.convention.yaml"
|
|
290
|
+
wagon: "atdd/planner/conventions/wagon.convention.yaml"
|
|
291
|
+
feature: "atdd/planner/conventions/feature.convention.yaml"
|
|
292
|
+
contract: "atdd/tester/conventions/contract.convention.yaml"
|
|
293
|
+
telemetry: "atdd/tester/conventions/telemetry.convention.yaml"
|
|
294
|
+
train: "atdd/planner/conventions/train.convention.yaml"
|
|
295
|
+
acceptance: "atdd/planner/conventions/acceptance.convention.yaml"
|
|
296
|
+
wmbt: "atdd/planner/conventions/wmbt.convention.yaml"
|
|
@@ -132,6 +132,32 @@
|
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
134
|
"additionalProperties": false
|
|
135
|
+
},
|
|
136
|
+
"coach": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"description": "Coach agent validation settings",
|
|
139
|
+
"properties": {
|
|
140
|
+
"session_gate_command_prefixes": {
|
|
141
|
+
"type": "array",
|
|
142
|
+
"description": "Allowed prefixes for gate commands in session files",
|
|
143
|
+
"items": {"type": "string"},
|
|
144
|
+
"default": ["atdd", "pytest", "python", "npm", "supabase"],
|
|
145
|
+
"examples": [["atdd", "pytest", "npm run test"]]
|
|
146
|
+
},
|
|
147
|
+
"session_gate_command_exceptions": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"description": "Session files exempt from gate command prefix validation (by filename pattern)",
|
|
150
|
+
"items": {"type": "string"},
|
|
151
|
+
"default": [],
|
|
152
|
+
"examples": [["SESSION-00-*.md", "SESSION-01-legacy.md"]]
|
|
153
|
+
},
|
|
154
|
+
"archive_status_warnings": {
|
|
155
|
+
"type": "boolean",
|
|
156
|
+
"description": "Warn when COMPLETE sessions not in archive or archived sessions not COMPLETE",
|
|
157
|
+
"default": true
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"additionalProperties": false
|
|
135
161
|
}
|
|
136
162
|
},
|
|
137
163
|
"required": ["version", "release"],
|
atdd/coach/templates/ATDD.md
CHANGED
|
@@ -21,6 +21,10 @@ type: "{type}" # implementation | migration | refactor | analysis | planning |
|
|
|
21
21
|
complexity: 3 # 1=Trivial, 2=Low, 3=Medium, 4=High, 5=Very High
|
|
22
22
|
archetypes:
|
|
23
23
|
- "{archetype}" # db | be | fe | contracts | wmbt | wagon | train | telemetry | migrations
|
|
24
|
+
# NOTE: If archetypes includes 'train', you MUST create/update BOTH:
|
|
25
|
+
# 1. plan/_trains.yaml (registry entry with train_id, description, path, wagons)
|
|
26
|
+
# 2. plan/_trains/{train_id}.yaml (full spec with participants, sequence, etc.)
|
|
27
|
+
# Validator SPEC-TRAIN-VAL-0003 enforces spec file exists for each registry entry.
|
|
24
28
|
|
|
25
29
|
# Scope definition
|
|
26
30
|
scope:
|
|
@@ -38,7 +42,8 @@ workflow_phases:
|
|
|
38
42
|
planner:
|
|
39
43
|
status: "TODO" # TODO | IN_PROGRESS | DONE | SKIPPED | N/A
|
|
40
44
|
artifacts:
|
|
41
|
-
train: false # plan/_trains.yaml updated
|
|
45
|
+
train: false # plan/_trains.yaml updated (registry entry)
|
|
46
|
+
train_spec: false # plan/_trains/{train_id}.yaml exists (full spec)
|
|
42
47
|
wagon: false # plan/{wagon}/_{wagon}.yaml exists
|
|
43
48
|
feature: false # plan/{wagon}/features/{feature}.yaml exists
|
|
44
49
|
wmbt: false # WMBTs defined in feature YAML
|