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.
@@ -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/_signals.yaml from telemetry signals
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/_signals.yaml)."""
93
- registry_path = self.telemetry_dir / "_signals.yaml"
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/_signals.yaml from telemetry signal files.
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 / "_signals.yaml"
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 "_signals" not in f.name]
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('_tracking.yaml') or
1439
- telemetry.file_path.endswith('_signals.yaml') or
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 (_tracking.yaml, _signals.yaml)
1497
- if telemetry.file_path.endswith('_tracking.yaml') or \
1498
- telemetry.file_path.endswith('_signals.yaml') or \
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"
@@ -354,6 +354,7 @@ archetypes:
354
354
  id: "telemetry"
355
355
  description: "Observability and monitoring artifacts"
356
356
  artifacts:
357
+ - "telemetry/_taxonomy.yaml"
357
358
  - "telemetry/_telemetry.yaml"
358
359
  - "telemetry/{domain}/*.yaml"
359
360
  patterns:
@@ -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"],
@@ -53,6 +53,7 @@ manifest:
53
53
  - artifacts: "contracts/_artifacts.yaml"
54
54
  - contracts: "contracts/_contracts.yaml"
55
55
  - telemetry: "telemetry/_telemetry.yaml"
56
+ - taxonomy: "telemetry/_taxonomy.yaml"
56
57
 
57
58
  tests:
58
59
  - frontend: "web/tests"
@@ -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