@cleocode/cleo 2026.2.8 → 2026.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +14 -13
  2. package/dist/cli/index.js +22676 -26012
  3. package/dist/cli/index.js.map +4 -4
  4. package/dist/mcp/index.js +1651 -802
  5. package/dist/mcp/index.js.map +4 -4
  6. package/drizzle/20260301053344_careless_changeling/migration.sql +27 -0
  7. package/drizzle/20260301053344_careless_changeling/snapshot.json +2598 -0
  8. package/package.json +3 -4
  9. package/packages/ct-skills/skills/ct-cleo/SKILL.md +49 -22
  10. package/templates/CLEO-INJECTION.md +32 -138
  11. package/templates/cleo-gitignore +66 -49
  12. package/templates/git-hooks/pre-commit +24 -6
  13. package/schemas/archive/agent-configs.schema.json +0 -120
  14. package/schemas/archive/agent-registry.schema.json +0 -132
  15. package/schemas/archive/archive.schema.json +0 -450
  16. package/schemas/archive/claudedocs-frontmatter.schema.json +0 -162
  17. package/schemas/archive/commands-index.schema.json +0 -158
  18. package/schemas/archive/contribution.schema.json +0 -722
  19. package/schemas/archive/critical-path.schema.json +0 -246
  20. package/schemas/archive/deps-cache.schema.json +0 -97
  21. package/schemas/archive/doctor-output.schema.json +0 -283
  22. package/schemas/archive/error.schema.json +0 -161
  23. package/schemas/archive/export-package.schema.json +0 -375
  24. package/schemas/archive/global-config.schema.json +0 -219
  25. package/schemas/archive/log.schema.json +0 -250
  26. package/schemas/archive/metrics.schema.json +0 -328
  27. package/schemas/archive/migrations.schema.json +0 -150
  28. package/schemas/archive/nexus-registry.schema.json +0 -90
  29. package/schemas/archive/output.schema.json +0 -164
  30. package/schemas/archive/rcsd-consensus-report.schema.json +0 -491
  31. package/schemas/archive/rcsd-hitl-resolution.schema.json +0 -216
  32. package/schemas/archive/rcsd-index.schema.json +0 -384
  33. package/schemas/archive/rcsd-manifest.schema.json +0 -264
  34. package/schemas/archive/rcsd-research-output.schema.json +0 -564
  35. package/schemas/archive/rcsd-spec-frontmatter.schema.json +0 -225
  36. package/schemas/archive/releases.schema.json +0 -267
  37. package/schemas/archive/skills-manifest.schema.json +0 -91
  38. package/schemas/archive/skillsmp.schema.json +0 -208
  39. package/schemas/archive/spec-index.schema.json +0 -196
  40. package/schemas/archive/todo.schema.json +0 -995
  41. package/schemas/claudedocs-frontmatter.schema.json +0 -162
  42. package/schemas/commands-index.schema.json +0 -158
  43. package/schemas/rcsd-consensus-report.schema.json +0 -494
  44. package/schemas/rcsd-hitl-resolution.schema.json +0 -219
  45. package/schemas/rcsd-index.schema.json +0 -387
  46. package/schemas/rcsd-manifest.schema.json +0 -267
  47. package/schemas/rcsd-research-output.schema.json +0 -567
  48. package/schemas/rcsd-spec-frontmatter.schema.json +0 -225
  49. package/schemas/todo.schema.json +0 -994
  50. package/skills/_shared/cleo-style-guide.md +0 -84
  51. package/skills/_shared/manifest-operations.md +0 -810
  52. package/skills/_shared/placeholders.json +0 -433
  53. package/skills/_shared/skill-chaining-patterns.md +0 -240
  54. package/skills/_shared/subagent-protocol-base.md +0 -221
  55. package/skills/_shared/task-system-integration.md +0 -232
  56. package/skills/_shared/testing-framework-config.md +0 -110
  57. package/skills/agentskills-integrate.md +0 -104
  58. package/skills/agentskills-specs.md +0 -255
  59. package/skills/agentskills-what-are-skills.md +0 -75
  60. package/skills/manifest.json +0 -510
  61. package/templates/AGENT-INJECTION.md +0 -166
  62. /package/schemas/{research-manifest.schema.json → archive/research-manifest.schema.json} +0 -0
@@ -1,995 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://cleo-dev.com/schemas/v3.1/todo.schema.json",
4
- "schemaVersion": "2.10.0",
5
- "title": "CLEO Task Schema",
6
- "description": "LEGACY: Documents the JSON file format. Runtime validation uses drizzle-zod (src/store/validation-schemas.ts). Data lives in SQLite (.cleo/tasks.db).",
7
- "type": "object",
8
- "required": [
9
- "version",
10
- "project",
11
- "lastUpdated",
12
- "tasks",
13
- "_meta"
14
- ],
15
- "additionalProperties": false,
16
- "properties": {
17
- "version": {
18
- "type": "string",
19
- "pattern": "^\\d+\\.\\d+\\.\\d+$",
20
- "description": "Legacy schema version field (deprecated, use _meta.schemaVersion)"
21
- },
22
- "project": {
23
- "type": "object",
24
- "required": [
25
- "name",
26
- "phases"
27
- ],
28
- "additionalProperties": false,
29
- "properties": {
30
- "name": {
31
- "type": "string",
32
- "minLength": 1,
33
- "description": "Project identifier for cross-session context."
34
- },
35
- "currentPhase": {
36
- "type": [
37
- "string",
38
- "null"
39
- ],
40
- "pattern": "^[a-z][a-z0-9-]*$",
41
- "description": "Slug of currently active phase. Must match a phase with status=active."
42
- },
43
- "phases": {
44
- "type": "object",
45
- "description": "Phase definitions with lifecycle tracking.",
46
- "patternProperties": {
47
- "^[a-z][a-z0-9-]*$": {
48
- "$ref": "#/definitions/phaseDefinition"
49
- }
50
- },
51
- "additionalProperties": false
52
- },
53
- "phaseHistory": {
54
- "type": "array",
55
- "description": "Chronological phase transition log for audit trail and progress analysis.",
56
- "items": {
57
- "type": "object",
58
- "required": [
59
- "phase",
60
- "transitionType",
61
- "timestamp",
62
- "taskCount"
63
- ],
64
- "additionalProperties": false,
65
- "properties": {
66
- "phase": {
67
- "type": "string",
68
- "pattern": "^[a-z][a-z0-9-]*$",
69
- "description": "Phase slug. Must match a key in project.phases."
70
- },
71
- "transitionType": {
72
- "type": "string",
73
- "enum": [
74
- "started",
75
- "completed",
76
- "rollback"
77
- ],
78
- "description": "started=phase became active, completed=phase finished, rollback=reverted to previous phase."
79
- },
80
- "timestamp": {
81
- "type": "string",
82
- "format": "date-time",
83
- "description": "ISO 8601 timestamp when transition occurred."
84
- },
85
- "taskCount": {
86
- "type": "integer",
87
- "minimum": 0,
88
- "description": "Number of tasks in this phase at transition time."
89
- },
90
- "fromPhase": {
91
- "type": [
92
- "string",
93
- "null"
94
- ],
95
- "pattern": "^[a-z][a-z0-9-]*$",
96
- "description": "Previous phase slug for rollback tracking. Null for initial phase start."
97
- },
98
- "reason": {
99
- "type": "string",
100
- "maxLength": 500,
101
- "description": "Optional context for transition (user note, automation trigger)."
102
- }
103
- }
104
- }
105
- },
106
- "releases": {
107
- "type": "array",
108
- "default": [],
109
- "description": "Release tracking for roadmap management. Each release tracks version, status, and associated tasks.",
110
- "items": {
111
- "type": "object",
112
- "required": [
113
- "version",
114
- "status"
115
- ],
116
- "additionalProperties": false,
117
- "properties": {
118
- "version": {
119
- "type": "string",
120
- "pattern": "^v?[0-9]+\\.[0-9]+\\.[0-9]+",
121
- "description": "Semantic version (e.g., v0.65.0 or 0.65.0)."
122
- },
123
- "status": {
124
- "type": "string",
125
- "enum": [
126
- "planned",
127
- "active",
128
- "released"
129
- ],
130
- "description": "Release lifecycle: planned=future, active=current development, released=shipped."
131
- },
132
- "targetDate": {
133
- "type": [
134
- "string",
135
- "null"
136
- ],
137
- "format": "date",
138
- "description": "Planned release date (YYYY-MM-DD). Null if not scheduled."
139
- },
140
- "releasedAt": {
141
- "type": [
142
- "string",
143
- "null"
144
- ],
145
- "format": "date-time",
146
- "description": "Actual release timestamp (ISO 8601). Null until released."
147
- },
148
- "tasks": {
149
- "type": "array",
150
- "default": [],
151
- "items": {
152
- "type": "string",
153
- "pattern": "^T[0-9]+$"
154
- },
155
- "uniqueItems": true,
156
- "description": "Task IDs included in this release."
157
- },
158
- "notes": {
159
- "type": [
160
- "string",
161
- "null"
162
- ],
163
- "maxLength": 5000,
164
- "description": "Release notes or changelog summary."
165
- },
166
- "changelog": {
167
- "type": [
168
- "string",
169
- "null"
170
- ],
171
- "description": "Generated CHANGELOG.md content for this release (cached for reuse). Auto-populated by lib/changelog.sh:generate_changelog()."
172
- }
173
- }
174
- }
175
- }
176
- }
177
- },
178
- "lastUpdated": {
179
- "type": "string",
180
- "format": "date-time",
181
- "description": "ISO 8601 timestamp of last modification."
182
- },
183
- "_meta": {
184
- "type": "object",
185
- "description": "System metadata for integrity and session tracking. CRITICAL for anti-hallucination.",
186
- "required": [
187
- "schemaVersion",
188
- "checksum",
189
- "configVersion"
190
- ],
191
- "additionalProperties": false,
192
- "properties": {
193
- "schemaVersion": {
194
- "type": "string",
195
- "pattern": "^\\d+\\.\\d+\\.\\d+$",
196
- "description": "Schema version for this file (semver). Canonical source for schema version (replaces root version field)."
197
- },
198
- "specVersion": {
199
- "type": "string",
200
- "pattern": "^\\d+\\.\\d+\\.\\d+$",
201
- "default": "3.1.0",
202
- "description": "LLM-Agent-First Spec version this data conforms to. Semantic versioning (major.minor.patch)."
203
- },
204
- "checksum": {
205
- "type": "string",
206
- "pattern": "^[a-f0-9]{16}$",
207
- "description": "SHA-256 truncated hash of tasks array. Verify before ANY write operation."
208
- },
209
- "configVersion": {
210
- "type": "string",
211
- "description": "Version of todo-config.json used. Ensures config compatibility."
212
- },
213
- "lastSessionId": {
214
- "type": [
215
- "string",
216
- "null"
217
- ],
218
- "description": "Session ID that last modified this file. Format: session_YYYYMMDD_HHMMSS_random"
219
- },
220
- "activeSession": {
221
- "type": [
222
- "string",
223
- "null"
224
- ],
225
- "description": "Currently active session (single-session mode). Null if no session active or in multi-session mode."
226
- },
227
- "multiSessionEnabled": {
228
- "type": "boolean",
229
- "default": false,
230
- "description": "Whether multi-session mode is active. When true, session state is in sessions.json."
231
- },
232
- "activeSessionCount": {
233
- "type": "integer",
234
- "minimum": 0,
235
- "default": 0,
236
- "description": "Number of active sessions (multi-session mode). Quick check without reading sessions.json."
237
- },
238
- "sessionsFile": {
239
- "type": [
240
- "string",
241
- "null"
242
- ],
243
- "default": "sessions.json",
244
- "description": "Relative path to sessions registry file. Null if multi-session disabled."
245
- },
246
- "generation": {
247
- "type": "integer",
248
- "minimum": 0,
249
- "default": 0,
250
- "description": "Generation counter for cache invalidation. Incremented on each write to enable dependency graph cache freshness checks."
251
- }
252
- }
253
- },
254
- "focus": {
255
- "type": "object",
256
- "description": "Session continuity state. CRITICAL for LLM agents to resume work correctly. NOTE: In multi-session mode (_meta.multiSessionEnabled=true), focus state moves to sessions.json. This object is read-only or null in multi-session mode.",
257
- "additionalProperties": false,
258
- "properties": {
259
- "currentTask": {
260
- "type": [
261
- "string",
262
- "null"
263
- ],
264
- "pattern": "^T\\d{3,}$",
265
- "description": "Task ID being worked on (single-session mode). MUST match the only task with status='active'. Null if no active task or in multi-session mode."
266
- },
267
- "currentPhase": {
268
- "type": [
269
- "string",
270
- "null"
271
- ],
272
- "pattern": "^[a-z][a-z0-9-]*$",
273
- "description": "Phase of currently focused task. Cached for quick reference."
274
- },
275
- "blockedUntil": {
276
- "type": [
277
- "string",
278
- "null"
279
- ],
280
- "description": "Global blocker if entire project is blocked."
281
- },
282
- "sessionNote": {
283
- "type": [
284
- "string",
285
- "null"
286
- ],
287
- "maxLength": 2500,
288
- "description": "Context from last session (single-session mode). In multi-session mode, notes are per-session in sessions.json. DEPRECATED: Use sessionNotes array for append-only history."
289
- },
290
- "sessionNotes": {
291
- "type": "array",
292
- "items": {
293
- "type": "object",
294
- "properties": {
295
- "note": {
296
- "type": "string",
297
- "description": "Session progress note content"
298
- },
299
- "timestamp": {
300
- "type": "string",
301
- "format": "date-time",
302
- "description": "When the note was added"
303
- },
304
- "conversationId": {
305
- "type": [
306
- "string",
307
- "null"
308
- ],
309
- "description": "Claude conversation ID for context"
310
- },
311
- "agent": {
312
- "type": [
313
- "string",
314
- "null"
315
- ],
316
- "description": "Agent identifier (opus-1, sonnet-2, etc.)"
317
- }
318
- },
319
- "required": [
320
- "note",
321
- "timestamp"
322
- ],
323
- "additionalProperties": false
324
- },
325
- "maxItems": 50,
326
- "default": [],
327
- "description": "Append-only session notes preserving conversation context"
328
- },
329
- "nextAction": {
330
- "type": [
331
- "string",
332
- "null"
333
- ],
334
- "maxLength": 500,
335
- "description": "Specific next step when resuming (e.g., 'Add validation to auth.ts:45')."
336
- },
337
- "primarySession": {
338
- "type": [
339
- "string",
340
- "null"
341
- ],
342
- "pattern": "^session_\\d{8}_\\d{6}_[a-f0-9]{6}$",
343
- "description": "In multi-session mode: the 'default' session for CLI commands without explicit --session. Null in single-session mode."
344
- }
345
- }
346
- },
347
- "tasks": {
348
- "type": "array",
349
- "description": "Flat array of all active tasks. Completed tasks archived via archive-todo.sh.",
350
- "items": {
351
- "$ref": "#/definitions/task"
352
- }
353
- },
354
- "labels": {
355
- "type": "object",
356
- "description": "Computed label-to-task-ID index. Derived from task.labels. Regenerate if stale.",
357
- "patternProperties": {
358
- "^[a-z][a-z0-9.-]*$": {
359
- "type": "array",
360
- "items": {
361
- "type": "string",
362
- "pattern": "^T\\d{3,}$"
363
- }
364
- }
365
- },
366
- "additionalProperties": false
367
- }
368
- },
369
- "definitions": {
370
- "phaseDefinition": {
371
- "type": "object",
372
- "required": [
373
- "order",
374
- "name",
375
- "status"
376
- ],
377
- "additionalProperties": false,
378
- "properties": {
379
- "order": {
380
- "type": "integer",
381
- "minimum": 1,
382
- "description": "Display order for phase sequencing."
383
- },
384
- "name": {
385
- "type": "string",
386
- "minLength": 1,
387
- "maxLength": 50,
388
- "description": "Human-readable phase name."
389
- },
390
- "description": {
391
- "type": "string",
392
- "maxLength": 200,
393
- "description": "Phase purpose and scope."
394
- },
395
- "status": {
396
- "type": "string",
397
- "enum": [
398
- "pending",
399
- "active",
400
- "completed"
401
- ],
402
- "description": "Phase lifecycle state. Only one phase can be active."
403
- },
404
- "startedAt": {
405
- "type": [
406
- "string",
407
- "null"
408
- ],
409
- "format": "date-time",
410
- "description": "When phase became active."
411
- },
412
- "completedAt": {
413
- "type": [
414
- "string",
415
- "null"
416
- ],
417
- "format": "date-time",
418
- "description": "When phase was completed."
419
- }
420
- },
421
- "allOf": [
422
- {
423
- "if": {
424
- "properties": {
425
- "status": {
426
- "enum": [
427
- "active",
428
- "completed"
429
- ]
430
- }
431
- }
432
- },
433
- "then": {
434
- "required": [
435
- "startedAt"
436
- ]
437
- }
438
- },
439
- {
440
- "if": {
441
- "properties": {
442
- "status": {
443
- "const": "completed"
444
- }
445
- }
446
- },
447
- "then": {
448
- "required": [
449
- "completedAt"
450
- ]
451
- }
452
- }
453
- ]
454
- },
455
- "task": {
456
- "type": "object",
457
- "required": [
458
- "id",
459
- "title",
460
- "status",
461
- "priority",
462
- "createdAt"
463
- ],
464
- "additionalProperties": false,
465
- "properties": {
466
- "id": {
467
- "type": "string",
468
- "pattern": "^T\\d{3,}$",
469
- "description": "Unique stable ID (T001, T002). NEVER reuse. NEVER change after creation."
470
- },
471
- "title": {
472
- "type": "string",
473
- "minLength": 1,
474
- "maxLength": 120,
475
- "description": "Actionable title starting with verb: 'Implement X', 'Fix Y', 'Add Z'."
476
- },
477
- "status": {
478
- "type": "string",
479
- "enum": [
480
- "pending",
481
- "active",
482
- "blocked",
483
- "done",
484
- "cancelled",
485
- "archived"
486
- ],
487
- "description": "pending=ready, active=working (ONE ONLY), blocked=stuck, done=completed, cancelled=soft-deleted, archived=retained for history."
488
- },
489
- "priority": {
490
- "type": "string",
491
- "enum": [
492
- "critical",
493
- "high",
494
- "medium",
495
- "low"
496
- ],
497
- "description": "Task priority. critical > high > medium > low."
498
- },
499
- "type": {
500
- "type": "string",
501
- "enum": [
502
- "epic",
503
- "task",
504
- "subtask"
505
- ],
506
- "default": "task",
507
- "description": "Task classification in hierarchy. epic: strategic initiative requiring decomposition. task: primary work unit. subtask: atomic operation. See HIERARCHY-ENHANCEMENT-SPEC.md."
508
- },
509
- "parentId": {
510
- "type": [
511
- "string",
512
- "null"
513
- ],
514
- "pattern": "^T\\d{3,}$",
515
- "default": null,
516
- "description": "Parent task ID for hierarchy. Null for root-level tasks. Must reference existing task. Max depth 3 (epic→task→subtask). Max 7 siblings per parent."
517
- },
518
- "position": {
519
- "type": [
520
- "integer",
521
- "null"
522
- ],
523
- "minimum": 1,
524
- "default": null,
525
- "description": "Display order within parent scope. 1-indexed, continuous sequence per parent. Null = not yet assigned (will be auto-assigned on next operation). See T805 for positional ordering system."
526
- },
527
- "positionVersion": {
528
- "type": "integer",
529
- "minimum": 0,
530
- "default": 0,
531
- "description": "Optimistic locking version for position changes. Incremented on each position modification."
532
- },
533
- "size": {
534
- "type": [
535
- "string",
536
- "null"
537
- ],
538
- "enum": [
539
- "small",
540
- "medium",
541
- "large",
542
- null
543
- ],
544
- "default": null,
545
- "description": "Scope-based size (NOT time). small: 1-2 files. medium: 3-7 files. large: 8+ files (should decompose). NO TIME ESTIMATES."
546
- },
547
- "phase": {
548
- "type": "string",
549
- "pattern": "^[a-z][a-z0-9-]*$",
550
- "description": "Phase slug (must exist in phases object)."
551
- },
552
- "description": {
553
- "type": "string",
554
- "maxLength": 2000,
555
- "description": "Detailed requirements, context, and implementation notes."
556
- },
557
- "files": {
558
- "type": "array",
559
- "items": {
560
- "type": "string"
561
- },
562
- "description": "Files to create/modify. Relative paths from project root."
563
- },
564
- "acceptance": {
565
- "type": "array",
566
- "items": {
567
- "type": "string",
568
- "maxLength": 200
569
- },
570
- "minItems": 1,
571
- "description": "Testable completion criteria. Task is done when ALL are met."
572
- },
573
- "depends": {
574
- "type": "array",
575
- "items": {
576
- "type": "string",
577
- "pattern": "^T\\d{3,}$"
578
- },
579
- "uniqueItems": true,
580
- "description": "Task IDs that must be 'done' before this can start. Validates on activation."
581
- },
582
- "epicLifecycle": {
583
- "type": [
584
- "string",
585
- "null"
586
- ],
587
- "enum": [
588
- "backlog",
589
- "planning",
590
- "active",
591
- "review",
592
- "released",
593
- "archived",
594
- null
595
- ],
596
- "default": null,
597
- "description": "Epic lifecycle state. Only applicable when type=epic. Null for tasks/subtasks."
598
- },
599
- "noAutoComplete": {
600
- "type": [
601
- "boolean",
602
- "null"
603
- ],
604
- "default": null,
605
- "description": "When true, this task/epic will NOT auto-complete even when all children are done. Use for permanent tracking epics or tasks that require explicit manual completion."
606
- },
607
- "blockedBy": {
608
- "type": "string",
609
- "maxLength": 300,
610
- "description": "Blocker reason. REQUIRED when status='blocked'."
611
- },
612
- "notes": {
613
- "type": "array",
614
- "items": {
615
- "type": "string",
616
- "maxLength": 5000
617
- },
618
- "description": "Append-only implementation log. NEVER delete entries. Timestamp recommended."
619
- },
620
- "labels": {
621
- "type": "array",
622
- "items": {
623
- "type": "string",
624
- "pattern": "^[a-z][a-z0-9.-]*$"
625
- },
626
- "uniqueItems": true,
627
- "description": "Tags for filtering (bug, feature, security, v0.5.0)."
628
- },
629
- "origin": {
630
- "type": [
631
- "string",
632
- "null"
633
- ],
634
- "enum": [
635
- "internal",
636
- "bug-report",
637
- "feature-request",
638
- "security",
639
- "technical-debt",
640
- "dependency",
641
- "regression",
642
- null
643
- ],
644
- "default": null,
645
- "description": "Task provenance classification for tracking source of work items."
646
- },
647
- "createdAt": {
648
- "type": "string",
649
- "format": "date-time",
650
- "description": "ISO 8601 creation timestamp."
651
- },
652
- "updatedAt": {
653
- "type": [
654
- "string",
655
- "null"
656
- ],
657
- "format": "date-time",
658
- "description": "Timestamp of last task modification, auto-set on mutations."
659
- },
660
- "completedAt": {
661
- "type": "string",
662
- "format": "date-time",
663
- "description": "ISO 8601 completion timestamp. REQUIRED when status='done'."
664
- },
665
- "cancelledAt": {
666
- "type": "string",
667
- "format": "date-time",
668
- "description": "ISO 8601 cancellation timestamp. REQUIRED when status='cancelled'."
669
- },
670
- "cancellationReason": {
671
- "type": "string",
672
- "minLength": 5,
673
- "maxLength": 300,
674
- "pattern": "^[^`$;|&<>]*$",
675
- "description": "Reason for cancellation. REQUIRED when status='cancelled'. 5-300 chars, no shell metacharacters."
676
- },
677
- "verification": {
678
- "type": [
679
- "object",
680
- "null"
681
- ],
682
- "default": null,
683
- "description": "Implementation verification state. Tracks pass/fail status across validation gates.",
684
- "additionalProperties": false,
685
- "properties": {
686
- "passed": {
687
- "type": "boolean",
688
- "default": false,
689
- "description": "Overall verification status. True only when ALL required gates pass."
690
- },
691
- "round": {
692
- "type": "integer",
693
- "minimum": 0,
694
- "default": 0,
695
- "description": "Current implementation round (0 = not started)."
696
- },
697
- "gates": {
698
- "type": "object",
699
- "additionalProperties": false,
700
- "properties": {
701
- "implemented": {
702
- "type": [
703
- "boolean",
704
- "null"
705
- ],
706
- "default": null,
707
- "description": "Coder Agent completed implementation."
708
- },
709
- "testsPassed": {
710
- "type": [
711
- "boolean",
712
- "null"
713
- ],
714
- "default": null,
715
- "description": "Testing Agent verified all tests pass."
716
- },
717
- "qaPassed": {
718
- "type": [
719
- "boolean",
720
- "null"
721
- ],
722
- "default": null,
723
- "description": "QA Agent verified acceptance criteria."
724
- },
725
- "cleanupDone": {
726
- "type": [
727
- "boolean",
728
- "null"
729
- ],
730
- "default": null,
731
- "description": "Cleanup Agent completed refactoring."
732
- },
733
- "securityPassed": {
734
- "type": [
735
- "boolean",
736
- "null"
737
- ],
738
- "default": null,
739
- "description": "Security Agent found no critical issues."
740
- },
741
- "documented": {
742
- "type": [
743
- "boolean",
744
- "null"
745
- ],
746
- "default": null,
747
- "description": "Docs Agent completed documentation."
748
- }
749
- }
750
- },
751
- "lastAgent": {
752
- "type": [
753
- "string",
754
- "null"
755
- ],
756
- "enum": [
757
- "planner",
758
- "coder",
759
- "testing",
760
- "qa",
761
- "cleanup",
762
- "security",
763
- "docs",
764
- null
765
- ],
766
- "default": null,
767
- "description": "Last agent to work on this task."
768
- },
769
- "lastUpdated": {
770
- "type": [
771
- "string",
772
- "null"
773
- ],
774
- "format": "date-time",
775
- "description": "Timestamp of last verification update."
776
- },
777
- "failureLog": {
778
- "type": "array",
779
- "default": [],
780
- "items": {
781
- "type": "object",
782
- "required": [
783
- "round",
784
- "agent",
785
- "reason",
786
- "timestamp"
787
- ],
788
- "additionalProperties": false,
789
- "properties": {
790
- "round": {
791
- "type": "integer",
792
- "minimum": 1
793
- },
794
- "agent": {
795
- "type": "string"
796
- },
797
- "reason": {
798
- "type": "string",
799
- "maxLength": 500
800
- },
801
- "timestamp": {
802
- "type": "string",
803
- "format": "date-time"
804
- }
805
- }
806
- },
807
- "description": "Log of verification failures for debugging."
808
- }
809
- }
810
- },
811
- "relates": {
812
- "type": "array",
813
- "default": [],
814
- "description": "Non-blocking relationships to other tasks. Use for cross-references, provenance tracking, and semantic connections.",
815
- "items": {
816
- "type": "object",
817
- "required": [
818
- "taskId",
819
- "type"
820
- ],
821
- "additionalProperties": false,
822
- "properties": {
823
- "taskId": {
824
- "type": "string",
825
- "pattern": "^T\\d{3,}$",
826
- "description": "Related task ID."
827
- },
828
- "type": {
829
- "type": "string",
830
- "enum": [
831
- "relates-to",
832
- "spawned-from",
833
- "deferred-to",
834
- "supersedes",
835
- "duplicates"
836
- ],
837
- "description": "Relationship type: relates-to (general), spawned-from (derived from), deferred-to (postponed to), supersedes (replaces), duplicates (same as)."
838
- },
839
- "reason": {
840
- "type": "string",
841
- "maxLength": 200,
842
- "description": "Optional explanation for the relationship."
843
- }
844
- }
845
- }
846
- },
847
- "createdBy": {
848
- "type": [
849
- "string",
850
- "null"
851
- ],
852
- "description": "Agent or user that created this task",
853
- "pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
854
- "default": null
855
- },
856
- "validatedBy": {
857
- "type": [
858
- "string",
859
- "null"
860
- ],
861
- "description": "Agent that validated this task's implementation",
862
- "pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
863
- "default": null
864
- },
865
- "testedBy": {
866
- "type": [
867
- "string",
868
- "null"
869
- ],
870
- "description": "Agent that executed tests for this task",
871
- "pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
872
- "default": null
873
- },
874
- "lifecycleState": {
875
- "type": [
876
- "string",
877
- "null"
878
- ],
879
- "enum": [
880
- "research",
881
- "consensus",
882
- "specification",
883
- "decomposition",
884
- "implementation",
885
- "validation",
886
- "testing",
887
- "release",
888
- null
889
- ],
890
- "description": "Current RCSD→IVTR pipeline state",
891
- "default": null
892
- },
893
- "validationHistory": {
894
- "type": "array",
895
- "description": "Full audit trail of all validation events",
896
- "items": {
897
- "type": "object",
898
- "required": [
899
- "gate",
900
- "result",
901
- "validator",
902
- "validatedAt"
903
- ],
904
- "additionalProperties": false,
905
- "properties": {
906
- "gate": {
907
- "type": "string",
908
- "enum": [
909
- "implemented",
910
- "testsPassed",
911
- "qaPassed",
912
- "securityPassed",
913
- "documented"
914
- ]
915
- },
916
- "result": {
917
- "type": "boolean",
918
- "description": "Validation outcome (true = pass, false = fail)"
919
- },
920
- "validator": {
921
- "type": "string",
922
- "description": "Agent ID that performed validation",
923
- "pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$"
924
- },
925
- "validatedAt": {
926
- "type": "string",
927
- "format": "date-time",
928
- "description": "ISO 8601 timestamp of validation"
929
- },
930
- "circularCheck": {
931
- "type": "string",
932
- "enum": [
933
- "pass",
934
- "fail",
935
- "skipped"
936
- ],
937
- "description": "Circular validation check result"
938
- },
939
- "notes": {
940
- "type": "string",
941
- "description": "Validation notes (test results, review comments, etc.)"
942
- }
943
- }
944
- },
945
- "default": []
946
- }
947
- },
948
- "allOf": [
949
- {
950
- "if": {
951
- "properties": {
952
- "status": {
953
- "const": "blocked"
954
- }
955
- }
956
- },
957
- "then": {
958
- "required": [
959
- "blockedBy"
960
- ]
961
- }
962
- },
963
- {
964
- "if": {
965
- "properties": {
966
- "status": {
967
- "const": "done"
968
- }
969
- }
970
- },
971
- "then": {
972
- "required": [
973
- "completedAt"
974
- ]
975
- }
976
- },
977
- {
978
- "if": {
979
- "properties": {
980
- "status": {
981
- "const": "cancelled"
982
- }
983
- }
984
- },
985
- "then": {
986
- "required": [
987
- "cancelledAt",
988
- "cancellationReason"
989
- ]
990
- }
991
- }
992
- ]
993
- }
994
- }
995
- }