opencode-swarm-plugin 0.31.6 → 0.32.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 (48) hide show
  1. package/.turbo/turbo-build.log +10 -9
  2. package/.turbo/turbo-test.log +319 -317
  3. package/CHANGELOG.md +158 -0
  4. package/README.md +7 -4
  5. package/bin/swarm.ts +388 -87
  6. package/dist/compaction-hook.d.ts +1 -1
  7. package/dist/compaction-hook.d.ts.map +1 -1
  8. package/dist/hive.d.ts.map +1 -1
  9. package/dist/index.d.ts +0 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +123 -134
  12. package/dist/memory-tools.d.ts.map +1 -1
  13. package/dist/memory.d.ts +5 -4
  14. package/dist/memory.d.ts.map +1 -1
  15. package/dist/plugin.js +118 -131
  16. package/dist/swarm-orchestrate.d.ts +29 -5
  17. package/dist/swarm-orchestrate.d.ts.map +1 -1
  18. package/dist/swarm-prompts.d.ts +7 -0
  19. package/dist/swarm-prompts.d.ts.map +1 -1
  20. package/dist/swarm.d.ts +0 -2
  21. package/dist/swarm.d.ts.map +1 -1
  22. package/evals/lib/{data-loader.test.ts → data-loader.evalite-test.ts} +7 -6
  23. package/evals/lib/data-loader.ts +1 -1
  24. package/evals/scorers/{outcome-scorers.test.ts → outcome-scorers.evalite-test.ts} +1 -1
  25. package/examples/plugin-wrapper-template.ts +19 -4
  26. package/global-skills/swarm-coordination/SKILL.md +118 -8
  27. package/package.json +2 -2
  28. package/src/compaction-hook.ts +5 -3
  29. package/src/hive.integration.test.ts +83 -1
  30. package/src/hive.ts +37 -12
  31. package/src/mandate-storage.integration.test.ts +601 -0
  32. package/src/memory-tools.ts +6 -4
  33. package/src/memory.integration.test.ts +117 -49
  34. package/src/memory.test.ts +41 -217
  35. package/src/memory.ts +12 -8
  36. package/src/repo-crawl.integration.test.ts +441 -0
  37. package/src/skills.integration.test.ts +1056 -0
  38. package/src/structured.integration.test.ts +817 -0
  39. package/src/swarm-deferred.integration.test.ts +157 -0
  40. package/src/swarm-deferred.test.ts +38 -0
  41. package/src/swarm-mail.integration.test.ts +15 -19
  42. package/src/swarm-orchestrate.integration.test.ts +282 -0
  43. package/src/swarm-orchestrate.ts +96 -201
  44. package/src/swarm-prompts.test.ts +92 -0
  45. package/src/swarm-prompts.ts +69 -0
  46. package/src/swarm-review.integration.test.ts +290 -0
  47. package/src/swarm.integration.test.ts +23 -20
  48. package/src/tool-adapter.integration.test.ts +1221 -0
@@ -2,328 +2,328 @@ $ bun test --timeout 10000 src/anti-patterns.test.ts src/mandate-promotion.test.
2
2
  bun test v1.3.4 (5eb2145b)
3
3
 
4
4
  src/structured.test.ts:
5
- (pass) extractJsonFromText > Strategy 1: Direct parse > extracts clean JSON directly [0.10ms]
6
- (pass) extractJsonFromText > Strategy 1: Direct parse > handles nested objects [0.01ms]
7
- (pass) extractJsonFromText > Strategy 1: Direct parse > handles arrays [0.01ms]
8
- (pass) extractJsonFromText > Strategy 1: Direct parse > handles complex nested structures [0.03ms]
9
- (pass) extractJsonFromText > Strategy 2: JSON code block > extracts JSON from ```json code block [0.14ms]
5
+ (pass) extractJsonFromText > Strategy 1: Direct parse > extracts clean JSON directly [0.77ms]
6
+ (pass) extractJsonFromText > Strategy 1: Direct parse > handles nested objects [0.06ms]
7
+ (pass) extractJsonFromText > Strategy 1: Direct parse > handles arrays [0.04ms]
8
+ (pass) extractJsonFromText > Strategy 1: Direct parse > handles complex nested structures [0.04ms]
9
+ (pass) extractJsonFromText > Strategy 2: JSON code block > extracts JSON from ```json code block [0.15ms]
10
10
  (pass) extractJsonFromText > Strategy 2: JSON code block > handles code block with surrounding text [0.02ms]
11
- (pass) extractJsonFromText > Strategy 2: JSON code block > handles multiline JSON in code block [0.12ms]
12
- (pass) extractJsonFromText > Strategy 3: Generic code block > extracts JSON from unlabeled code block [0.06ms]
11
+ (pass) extractJsonFromText > Strategy 2: JSON code block > handles multiline JSON in code block [0.01ms]
12
+ (pass) extractJsonFromText > Strategy 3: Generic code block > extracts JSON from unlabeled code block [0.02ms]
13
13
  (pass) extractJsonFromText > Strategy 3: Generic code block > prefers json-labeled block over generic block [0.02ms]
14
- (pass) extractJsonFromText > Strategy 4: Brace matching for objects > extracts JSON with surrounding text [0.06ms]
15
- (pass) extractJsonFromText > Strategy 4: Brace matching for objects > extracts first balanced object when multiple present [0.02ms]
14
+ (pass) extractJsonFromText > Strategy 4: Brace matching for objects > extracts JSON with surrounding text [0.01ms]
15
+ (pass) extractJsonFromText > Strategy 4: Brace matching for objects > extracts first balanced object when multiple present [0.05ms]
16
16
  (pass) extractJsonFromText > Strategy 4: Brace matching for objects > handles deeply nested objects [0.02ms]
17
- (pass) extractJsonFromText > Strategy 4: Brace matching for objects > handles strings containing braces [0.03ms]
17
+ (pass) extractJsonFromText > Strategy 4: Brace matching for objects > handles strings containing braces [0.01ms]
18
18
  (pass) extractJsonFromText > Strategy 4: Brace matching for objects > handles escaped quotes in strings [0.02ms]
19
- (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > extracts arrays with surrounding text [0.10ms]
20
- (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > handles nested arrays [0.17ms]
21
- (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > prefers object matching over array when both present [0.04ms]
22
- (pass) extractJsonFromText > Strategy 6: JSON repair > fixes single quotes in keys (limited support) [0.14ms]
23
- (pass) extractJsonFromText > Strategy 6: JSON repair > fixes trailing commas in objects [0.02ms]
24
- (pass) extractJsonFromText > Strategy 6: JSON repair > fixes trailing commas in arrays [0.02ms]
25
- (pass) extractJsonFromText > Strategy 6: JSON repair > fixes multiple trailing commas [0.02ms]
19
+ (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > extracts arrays with surrounding text [0.01ms]
20
+ (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > handles nested arrays [0.02ms]
21
+ (pass) extractJsonFromText > Strategy 5: Bracket matching for arrays > prefers object matching over array when both present [0.01ms]
22
+ (pass) extractJsonFromText > Strategy 6: JSON repair > fixes single quotes in keys (limited support) [0.02ms]
23
+ (pass) extractJsonFromText > Strategy 6: JSON repair > fixes trailing commas in objects [0.11ms]
24
+ (pass) extractJsonFromText > Strategy 6: JSON repair > fixes trailing commas in arrays [0.03ms]
25
+ (pass) extractJsonFromText > Strategy 6: JSON repair > fixes multiple trailing commas
26
26
  (pass) extractJsonFromText > Error cases > throws JsonExtractionError for invalid JSON [0.02ms]
27
- (pass) extractJsonFromText > Error cases > throws JsonExtractionError for empty input [0.03ms]
28
- (pass) extractJsonFromText > Error cases > throws JsonExtractionError for unbalanced braces [0.01ms]
27
+ (pass) extractJsonFromText > Error cases > throws JsonExtractionError for empty input [0.04ms]
28
+ (pass) extractJsonFromText > Error cases > throws JsonExtractionError for unbalanced braces [0.02ms]
29
29
  (pass) extractJsonFromText > Error cases > throws JsonExtractionError for malformed JSON [0.03ms]
30
- (pass) extractJsonFromText > Error cases > includes attempted strategies in error [0.04ms]
31
- (pass) extractJsonFromText > Error cases > returns null for deeply nested input exceeding MAX_BRACE_DEPTH [0.05ms]
32
- (pass) formatZodErrors > formats single error with path [0.68ms]
33
- (pass) formatZodErrors > formats multiple errors [0.22ms]
34
- (pass) formatZodErrors > formats nested path [0.13ms]
30
+ (pass) extractJsonFromText > Error cases > includes attempted strategies in error [0.02ms]
31
+ (pass) extractJsonFromText > Error cases > returns null for deeply nested input exceeding MAX_BRACE_DEPTH [0.06ms]
32
+ (pass) formatZodErrors > formats single error with path [0.61ms]
33
+ (pass) formatZodErrors > formats multiple errors [0.16ms]
34
+ (pass) formatZodErrors > formats nested path [0.16ms]
35
35
  (pass) formatZodErrors > formats error without path [0.05ms]
36
- (pass) getSchemaByName > returns EvaluationSchema for 'evaluation' [0.02ms]
36
+ (pass) getSchemaByName > returns EvaluationSchema for 'evaluation' [0.03ms]
37
37
  (pass) getSchemaByName > returns TaskDecompositionSchema for 'task_decomposition'
38
38
  (pass) getSchemaByName > returns CellTreeSchema for 'cell_tree'
39
39
  (pass) getSchemaByName > throws error for unknown schema name [0.01ms]
40
40
  (pass) getSchemaByName > error message lists available schemas [0.01ms]
41
- (pass) StructuredValidationError > formats error bullets from ZodError [0.20ms]
42
- (pass) StructuredValidationError > handles null ZodError [0.03ms]
41
+ (pass) StructuredValidationError > formats error bullets from ZodError [0.11ms]
42
+ (pass) StructuredValidationError > handles null ZodError [0.02ms]
43
43
  (pass) StructuredValidationError > includes extraction method when provided [0.01ms]
44
- (pass) structured_extract_json > returns success for valid JSON [0.13ms]
45
- (pass) structured_extract_json > returns success for JSON in code block [0.04ms]
46
- (pass) structured_extract_json > returns error for invalid JSON [0.05ms]
47
- (pass) structured_extract_json > includes raw input preview in error [0.04ms]
48
- (pass) structured_validate > evaluation schema > validates correct evaluation [1.04ms]
49
- (pass) structured_validate > evaluation schema > returns error for invalid evaluation [0.16ms]
50
- (pass) structured_validate > evaluation schema > handles empty response [0.04ms]
51
- (pass) structured_validate > evaluation schema > handles whitespace-only response [0.01ms]
52
- (pass) structured_validate > task_decomposition schema > validates correct decomposition [0.67ms]
53
- (pass) structured_validate > cell_tree schema > validates correct bead tree [0.46ms]
54
- (pass) structured_validate > extracts JSON from markdown before validation [0.08ms]
55
- (pass) structured_validate > includes retry hint when attempts < max_retries [0.09ms]
56
- (pass) structured_parse_evaluation > parses valid evaluation [0.17ms]
57
- (pass) structured_parse_evaluation > identifies failed criteria in summary [0.05ms]
58
- (pass) structured_parse_evaluation > returns error for malformed JSON [0.08ms]
59
- (pass) structured_parse_evaluation > returns error for invalid evaluation schema [0.05ms]
60
- (pass) structured_parse_evaluation > includes expected shape in error feedback [0.05ms]
61
- (pass) structured_parse_decomposition > parses valid decomposition [0.27ms]
44
+ (pass) structured_extract_json > returns success for valid JSON [0.04ms]
45
+ (pass) structured_extract_json > returns success for JSON in code block [0.07ms]
46
+ (pass) structured_extract_json > returns error for invalid JSON [0.03ms]
47
+ (pass) structured_extract_json > includes raw input preview in error [0.07ms]
48
+ (pass) structured_validate > evaluation schema > validates correct evaluation [0.47ms]
49
+ (pass) structured_validate > evaluation schema > returns error for invalid evaluation [0.14ms]
50
+ (pass) structured_validate > evaluation schema > handles empty response [0.02ms]
51
+ (pass) structured_validate > evaluation schema > handles whitespace-only response [0.02ms]
52
+ (pass) structured_validate > task_decomposition schema > validates correct decomposition [0.28ms]
53
+ (pass) structured_validate > cell_tree schema > validates correct bead tree [0.33ms]
54
+ (pass) structured_validate > extracts JSON from markdown before validation [0.17ms]
55
+ (pass) structured_validate > includes retry hint when attempts < max_retries [0.03ms]
56
+ (pass) structured_parse_evaluation > parses valid evaluation [0.08ms]
57
+ (pass) structured_parse_evaluation > identifies failed criteria in summary [0.15ms]
58
+ (pass) structured_parse_evaluation > returns error for malformed JSON [0.06ms]
59
+ (pass) structured_parse_evaluation > returns error for invalid evaluation schema [0.02ms]
60
+ (pass) structured_parse_evaluation > includes expected shape in error feedback [0.08ms]
61
+ (pass) structured_parse_decomposition > parses valid decomposition [0.18ms]
62
62
  (pass) structured_parse_decomposition > includes effort breakdown in summary [0.08ms]
63
- (pass) structured_parse_decomposition > handles dependencies in summary [0.37ms]
64
- (pass) structured_parse_decomposition > deduplicates files in summary [0.10ms]
65
- (pass) structured_parse_decomposition > returns error for invalid decomposition [0.13ms]
66
- (pass) structured_parse_cell_tree > parses valid bead tree [0.18ms]
67
- (pass) structured_parse_cell_tree > calculates complexity total [0.20ms]
68
- (pass) structured_parse_cell_tree > lists unique files [0.07ms]
69
- (pass) structured_parse_cell_tree > returns error for invalid bead tree [0.11ms]
70
- (pass) structured_parse_cell_tree > includes expected shape in error [0.06ms]
63
+ (pass) structured_parse_decomposition > handles dependencies in summary [0.14ms]
64
+ (pass) structured_parse_decomposition > deduplicates files in summary [0.09ms]
65
+ (pass) structured_parse_decomposition > returns error for invalid decomposition [0.10ms]
66
+ (pass) structured_parse_cell_tree > parses valid bead tree [0.14ms]
67
+ (pass) structured_parse_cell_tree > calculates complexity total [0.07ms]
68
+ (pass) structured_parse_cell_tree > lists unique files [0.10ms]
69
+ (pass) structured_parse_cell_tree > returns error for invalid bead tree [0.07ms]
70
+ (pass) structured_parse_cell_tree > includes expected shape in error [0.08ms]
71
71
  (pass) Edge cases > handles JSON with unicode characters [0.02ms]
72
72
  (pass) Edge cases > handles very long strings in JSON [0.02ms]
73
73
  (pass) Edge cases > handles JSON with null values [0.02ms]
74
- (pass) Edge cases > handles JSON with boolean values [0.01ms]
74
+ (pass) Edge cases > handles JSON with boolean values
75
75
  (pass) Edge cases > handles JSON with number types [0.01ms]
76
- (pass) Edge cases > handles mixed content markdown with multiple code blocks [0.02ms]
76
+ (pass) Edge cases > handles mixed content markdown with multiple code blocks [0.01ms]
77
77
  (pass) Edge cases > handles JSON with escaped characters [0.02ms]
78
78
 
79
79
  src/mandate-storage.test.ts:
80
- (pass) InMemoryMandateStorage > Entry operations > should store and retrieve mandate entry [0.15ms]
81
- (pass) InMemoryMandateStorage > Entry operations > should return null for non-existent mandate [0.02ms]
82
- (pass) InMemoryMandateStorage > Entry operations > should find mandates by query [0.19ms]
83
- (pass) InMemoryMandateStorage > Entry operations > should list all mandates [0.07ms]
84
- (pass) InMemoryMandateStorage > Entry operations > should filter mandates by status [0.05ms]
85
- (pass) InMemoryMandateStorage > Entry operations > should filter mandates by content_type [0.05ms]
86
- (pass) InMemoryMandateStorage > Entry operations > should update mandate entry [0.06ms]
87
- (pass) InMemoryMandateStorage > Entry operations > should throw when updating non-existent mandate [0.07ms]
88
- (pass) InMemoryMandateStorage > Vote operations > should cast vote and verify storage [0.29ms]
89
- (pass) InMemoryMandateStorage > Vote operations > should prevent duplicate votes from same agent [0.08ms]
80
+ (pass) InMemoryMandateStorage > Entry operations > should store and retrieve mandate entry [0.04ms]
81
+ (pass) InMemoryMandateStorage > Entry operations > should return null for non-existent mandate [0.12ms]
82
+ (pass) InMemoryMandateStorage > Entry operations > should find mandates by query [0.05ms]
83
+ (pass) InMemoryMandateStorage > Entry operations > should list all mandates [0.14ms]
84
+ (pass) InMemoryMandateStorage > Entry operations > should filter mandates by status [0.06ms]
85
+ (pass) InMemoryMandateStorage > Entry operations > should filter mandates by content_type [0.06ms]
86
+ (pass) InMemoryMandateStorage > Entry operations > should update mandate entry [0.05ms]
87
+ (pass) InMemoryMandateStorage > Entry operations > should throw when updating non-existent mandate [0.09ms]
88
+ (pass) InMemoryMandateStorage > Vote operations > should cast vote and verify storage [0.10ms]
89
+ (pass) InMemoryMandateStorage > Vote operations > should prevent duplicate votes from same agent [0.05ms]
90
90
  (pass) InMemoryMandateStorage > Vote operations > should check if agent has voted [0.04ms]
91
- (pass) InMemoryMandateStorage > Vote operations > should get all votes for a mandate [0.06ms]
92
- (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with no votes [0.11ms]
93
- (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with recent upvotes [0.13ms]
94
- (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with mixed votes [0.06ms]
95
- (pass) InMemoryMandateStorage > Score calculation with decay > should apply decay to old votes [1.33ms]
96
- (pass) InMemoryMandateStorage > Score calculation with decay > should handle vote weights [0.06ms]
97
- (pass) InMemoryMandateStorage > Status updates based on score > should transition to mandate status with high score [0.19ms]
98
- (pass) InMemoryMandateStorage > Status updates based on score > should transition to established status [0.09ms]
99
- (pass) InMemoryMandateStorage > Status updates based on score > should transition to rejected status [0.06ms]
100
- (pass) InMemoryMandateStorage > Status updates based on score > should batch update all mandates [0.42ms]
101
- (pass) InMemoryMandateStorage > Factory > should create in-memory storage [0.03ms]
102
- (pass) InMemoryMandateStorage > Factory > should throw on unknown backend [0.02ms]
91
+ (pass) InMemoryMandateStorage > Vote operations > should get all votes for a mandate [0.03ms]
92
+ (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with no votes [0.10ms]
93
+ (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with recent upvotes [0.07ms]
94
+ (pass) InMemoryMandateStorage > Score calculation with decay > should calculate score with mixed votes [0.07ms]
95
+ (pass) InMemoryMandateStorage > Score calculation with decay > should apply decay to old votes [0.43ms]
96
+ (pass) InMemoryMandateStorage > Score calculation with decay > should handle vote weights [0.04ms]
97
+ (pass) InMemoryMandateStorage > Status updates based on score > should transition to mandate status with high score [0.14ms]
98
+ (pass) InMemoryMandateStorage > Status updates based on score > should transition to established status [0.06ms]
99
+ (pass) InMemoryMandateStorage > Status updates based on score > should transition to rejected status [0.05ms]
100
+ (pass) InMemoryMandateStorage > Status updates based on score > should batch update all mandates [0.10ms]
101
+ (pass) InMemoryMandateStorage > Factory > should create in-memory storage [0.04ms]
102
+ (pass) InMemoryMandateStorage > Factory > should throw on unknown backend [0.01ms]
103
103
 
104
104
  src/skills.test.ts:
105
- (pass) parseFrontmatter > parses valid frontmatter with all fields [1.81ms]
106
- (pass) parseFrontmatter > parses minimal frontmatter with only required fields [0.23ms]
107
- (pass) parseFrontmatter > returns null for missing name value [0.15ms]
105
+ (pass) parseFrontmatter > parses valid frontmatter with all fields [1.47ms]
106
+ (pass) parseFrontmatter > parses minimal frontmatter with only required fields [0.07ms]
107
+ (pass) parseFrontmatter > returns null for missing name value [0.04ms]
108
108
  (pass) parseFrontmatter > returns empty result for content without frontmatter [0.02ms]
109
109
  (pass) parseFrontmatter > returns empty result for empty content
110
- (pass) parseFrontmatter > handles frontmatter with extra fields [0.08ms]
111
- (pass) parseFrontmatter > handles multiline description [0.05ms]
112
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
110
+ (pass) parseFrontmatter > handles frontmatter with extra fields [0.07ms]
111
+ (pass) parseFrontmatter > handles multiline description [0.07ms]
112
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
113
113
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
114
- (pass) discoverSkills > discovers skills in project directory [12.55ms]
115
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
114
+ (pass) discoverSkills > discovers skills in project directory [7.79ms]
115
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
116
116
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
117
- (pass) discoverSkills > skips skills with invalid frontmatter [7.41ms]
118
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
117
+ (pass) discoverSkills > skips skills with invalid frontmatter [2.60ms]
118
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
119
119
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
120
- (pass) discoverSkills > caches discovered skills [10.15ms]
121
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
120
+ (pass) discoverSkills > caches discovered skills [2.52ms]
121
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
122
122
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
123
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
123
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
124
124
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
125
- (pass) discoverSkills > invalidates cache when requested [8.92ms]
126
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
125
+ (pass) discoverSkills > invalidates cache when requested [3.95ms]
126
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
127
127
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
128
- (pass) getSkill > returns skill by exact name [4.83ms]
129
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
128
+ (pass) getSkill > returns skill by exact name [3.19ms]
129
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
130
130
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
131
- (pass) getSkill > returns null for non-existent skill [3.98ms]
132
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
131
+ (pass) getSkill > returns null for non-existent skill [2.98ms]
132
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
133
133
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
134
- (pass) getSkill > returns null for empty name [3.38ms]
135
- [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766161903383-9r8cfj/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
134
+ (pass) getSkill > returns null for empty name [2.42ms]
135
+ [skills] Failed to load /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md: Skill at /Users/joel/Code/joelhooks/opencode-swarm-plugin/packages/opencode-swarm-plugin/.test-skills-1766423404981-kb9ck1/.opencode/skills/invalid-skill/SKILL.md missing required 'name' field
136
136
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
137
- (pass) listSkills > returns skill refs with name, description, and path [5.39ms]
138
- (pass) path traversal protection > detects basic path traversal attempts [0.16ms]
139
- (pass) path traversal protection > allows valid relative paths [0.04ms]
140
- (pass) path traversal protection > resolve + relative check catches encoded traversal [0.03ms]
141
- (pass) ES module compatibility > import.meta.url is available [0.05ms]
142
- (pass) ES module compatibility > can construct path from import.meta.url [0.26ms]
143
- (pass) validateCSOCompliance > description validation > passes for CSO-compliant description with 'Use when' [0.52ms]
144
- (pass) validateCSOCompliance > description validation > warns when missing 'Use when...' pattern [0.05ms]
145
- (pass) validateCSOCompliance > description validation > warns for first-person voice [0.02ms]
146
- (pass) validateCSOCompliance > description validation > warns for second-person voice [0.03ms]
137
+ (pass) listSkills > returns skill refs with name, description, and path [2.57ms]
138
+ (pass) path traversal protection > detects basic path traversal attempts [0.04ms]
139
+ (pass) path traversal protection > allows valid relative paths [0.02ms]
140
+ (pass) path traversal protection > resolve + relative check catches encoded traversal [0.01ms]
141
+ (pass) ES module compatibility > import.meta.url is available [0.02ms]
142
+ (pass) ES module compatibility > can construct path from import.meta.url [0.05ms]
143
+ (pass) validateCSOCompliance > description validation > passes for CSO-compliant description with 'Use when' [0.11ms]
144
+ (pass) validateCSOCompliance > description validation > warns when missing 'Use when...' pattern [0.02ms]
145
+ (pass) validateCSOCompliance > description validation > warns for first-person voice [0.03ms]
146
+ (pass) validateCSOCompliance > description validation > warns for second-person voice [0.01ms]
147
147
  (pass) validateCSOCompliance > description validation > rejects description > 1024 chars [0.03ms]
148
- (pass) validateCSOCompliance > description validation > suggests improvement for description > 500 chars [0.02ms]
149
- (pass) validateCSOCompliance > description validation > accepts description < 500 chars with no length warnings
148
+ (pass) validateCSOCompliance > description validation > suggests improvement for description > 500 chars [0.03ms]
149
+ (pass) validateCSOCompliance > description validation > accepts description < 500 chars with no length warnings [0.01ms]
150
150
  (pass) validateCSOCompliance > name validation > accepts gerund-based names [0.01ms]
151
151
  (pass) validateCSOCompliance > name validation > accepts verb-first names
152
- (pass) validateCSOCompliance > name validation > accepts action verbs [0.03ms]
153
- (pass) validateCSOCompliance > name validation > suggests verb-first for noun-first names [0.01ms]
154
- (pass) validateCSOCompliance > name validation > warns for name > 64 chars [0.10ms]
155
- (pass) validateCSOCompliance > name validation > warns for invalid name format [0.10ms]
156
- (pass) validateCSOCompliance > comprehensive examples > perfect CSO compliance [0.02ms]
157
- (pass) validateCSOCompliance > comprehensive examples > multiple critical issues [0.03ms]
152
+ (pass) validateCSOCompliance > name validation > accepts action verbs [0.02ms]
153
+ (pass) validateCSOCompliance > name validation > suggests verb-first for noun-first names
154
+ (pass) validateCSOCompliance > name validation > warns for name > 64 chars [0.01ms]
155
+ (pass) validateCSOCompliance > name validation > warns for invalid name format [0.02ms]
156
+ (pass) validateCSOCompliance > comprehensive examples > perfect CSO compliance [0.01ms]
157
+ (pass) validateCSOCompliance > comprehensive examples > multiple critical issues [0.01ms]
158
158
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
159
- (pass) edge cases > handles non-existent skills directory gracefully [3.57ms]
159
+ (pass) edge cases > handles non-existent skills directory gracefully [1.15ms]
160
160
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
161
- (pass) edge cases > handles empty skills directory [2.44ms]
161
+ (pass) edge cases > handles empty skills directory [1.91ms]
162
162
  [skills] Failed to load /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md: Skill at /Users/joel/.config/opencode/skills/ai-optimized-content/SKILL.md missing required 'name' field
163
- (pass) edge cases > handles skill directory without SKILL.md [3.48ms]
163
+ (pass) edge cases > handles skill directory without SKILL.md [2.12ms]
164
164
 
165
165
  src/anti-patterns.test.ts:
166
166
  (pass) PatternKindSchema > validates 'pattern' kind [0.03ms]
167
- (pass) PatternKindSchema > validates 'anti_pattern' kind [0.02ms]
167
+ (pass) PatternKindSchema > validates 'anti_pattern' kind
168
168
  (pass) PatternKindSchema > rejects invalid kind [0.09ms]
169
- (pass) DecompositionPatternSchema > validates a complete valid pattern [0.43ms]
170
- (pass) DecompositionPatternSchema > validates a valid anti-pattern [0.06ms]
171
- (pass) DecompositionPatternSchema > applies default values for optional fields [0.04ms]
172
- (pass) DecompositionPatternSchema > rejects negative success_count [0.07ms]
173
- (pass) DecompositionPatternSchema > rejects negative failure_count [0.19ms]
174
- (pass) DecompositionPatternSchema > rejects invalid kind [0.21ms]
175
- (pass) PatternInversionResultSchema > validates a complete inversion result [0.25ms]
176
- (pass) shouldInvertPattern > returns true when failure rate exceeds 60% [0.04ms]
169
+ (pass) DecompositionPatternSchema > validates a complete valid pattern [0.44ms]
170
+ (pass) DecompositionPatternSchema > validates a valid anti-pattern [0.15ms]
171
+ (pass) DecompositionPatternSchema > applies default values for optional fields [0.03ms]
172
+ (pass) DecompositionPatternSchema > rejects negative success_count [0.08ms]
173
+ (pass) DecompositionPatternSchema > rejects negative failure_count [0.05ms]
174
+ (pass) DecompositionPatternSchema > rejects invalid kind [0.02ms]
175
+ (pass) PatternInversionResultSchema > validates a complete inversion result [0.15ms]
176
+ (pass) shouldInvertPattern > returns true when failure rate exceeds 60% [0.02ms]
177
177
  (pass) shouldInvertPattern > returns true when failure rate equals 60%
178
178
  (pass) shouldInvertPattern > returns false when failure rate is below 60%
179
- (pass) shouldInvertPattern > returns false when failure rate is just below threshold
179
+ (pass) shouldInvertPattern > returns false when failure rate is just below threshold [0.02ms]
180
180
  (pass) shouldInvertPattern > returns false with insufficient observations (< minObservations)
181
181
  (pass) shouldInvertPattern > returns false when exactly at minObservations but low failure rate
182
- (pass) shouldInvertPattern > returns true when at minObservations with high failure rate [0.01ms]
183
- (pass) shouldInvertPattern > returns false when already an anti-pattern [0.01ms]
182
+ (pass) shouldInvertPattern > returns true when at minObservations with high failure rate
183
+ (pass) shouldInvertPattern > returns false when already an anti-pattern
184
184
  (pass) shouldInvertPattern > returns false with zero observations
185
185
  (pass) shouldInvertPattern > respects custom config minObservations
186
- (pass) shouldInvertPattern > respects custom config failureRatioThreshold
187
- (pass) invertToAntiPattern > converts pattern to anti-pattern with correct kind [0.05ms]
188
- (pass) invertToAntiPattern > prefixes content with AVOID: [0.03ms]
189
- (pass) invertToAntiPattern > appends reason to content
190
- (pass) invertToAntiPattern > preserves success and failure counts [0.02ms]
186
+ (pass) shouldInvertPattern > respects custom config failureRatioThreshold [0.04ms]
187
+ (pass) invertToAntiPattern > converts pattern to anti-pattern with correct kind [0.04ms]
188
+ (pass) invertToAntiPattern > prefixes content with AVOID: [0.02ms]
189
+ (pass) invertToAntiPattern > appends reason to content [0.01ms]
190
+ (pass) invertToAntiPattern > preserves success and failure counts
191
191
  (pass) invertToAntiPattern > preserves example_beads
192
- (pass) invertToAntiPattern > preserves tags [0.12ms]
193
- (pass) invertToAntiPattern > generates new ID with 'anti-' prefix [0.02ms]
194
- (pass) invertToAntiPattern > stores reason in inverted pattern [0.01ms]
195
- (pass) invertToAntiPattern > updates updated_at timestamp [0.02ms]
196
- (pass) invertToAntiPattern > returns original pattern in result [0.01ms]
192
+ (pass) invertToAntiPattern > preserves tags [0.01ms]
193
+ (pass) invertToAntiPattern > generates new ID with 'anti-' prefix
194
+ (pass) invertToAntiPattern > stores reason in inverted pattern
195
+ (pass) invertToAntiPattern > updates updated_at timestamp [0.03ms]
196
+ (pass) invertToAntiPattern > returns original pattern in result
197
197
  (pass) invertToAntiPattern > returns reason in result
198
198
  (pass) invertToAntiPattern > cleans existing AVOID: prefix [0.04ms]
199
- (pass) invertToAntiPattern > cleans existing DO NOT: prefix
199
+ (pass) invertToAntiPattern > cleans existing DO NOT: prefix [0.01ms]
200
200
  (pass) invertToAntiPattern > cleans existing NEVER: prefix
201
- (pass) invertToAntiPattern > respects custom antiPatternPrefix
202
- (pass) recordPatternObservation > increments success count on success [0.05ms]
203
- (pass) recordPatternObservation > increments failure count on failure [0.02ms]
204
- (pass) recordPatternObservation > adds bead to example_beads when provided [0.01ms]
201
+ (pass) invertToAntiPattern > respects custom antiPatternPrefix [0.02ms]
202
+ (pass) recordPatternObservation > increments success count on success [0.03ms]
203
+ (pass) recordPatternObservation > increments failure count on failure [0.01ms]
204
+ (pass) recordPatternObservation > adds bead to example_beads when provided
205
205
  (pass) recordPatternObservation > does not modify example_beads when beadId not provided
206
- (pass) recordPatternObservation > limits example_beads to MAX_EXAMPLE_BEADS (10) [0.04ms]
207
- (pass) recordPatternObservation > keeps newest beads when trimming example_beads [0.02ms]
208
- (pass) recordPatternObservation > updates updated_at timestamp [0.01ms]
206
+ (pass) recordPatternObservation > limits example_beads to MAX_EXAMPLE_BEADS (10) [0.03ms]
207
+ (pass) recordPatternObservation > keeps newest beads when trimming example_beads [0.01ms]
208
+ (pass) recordPatternObservation > updates updated_at timestamp
209
209
  (pass) recordPatternObservation > does not invert when below threshold
210
- (pass) recordPatternObservation > inverts when crossing threshold [0.02ms]
211
- (pass) recordPatternObservation > includes failure statistics in inversion reason [0.01ms]
212
- (pass) recordPatternObservation > does not invert already-inverted anti-patterns [0.01ms]
213
- (pass) recordPatternObservation > respects custom config for inversion [0.01ms]
214
- (pass) recordPatternObservation > preserves original pattern fields
215
- (pass) extractPatternsFromDescription > detects 'split by file type' pattern [0.26ms]
216
- (pass) extractPatternsFromDescription > detects 'splitting by file type' variant [0.01ms]
217
- (pass) extractPatternsFromDescription > detects 'split by component' pattern
210
+ (pass) recordPatternObservation > inverts when crossing threshold [0.04ms]
211
+ (pass) recordPatternObservation > includes failure statistics in inversion reason
212
+ (pass) recordPatternObservation > does not invert already-inverted anti-patterns
213
+ (pass) recordPatternObservation > respects custom config for inversion
214
+ (pass) recordPatternObservation > preserves original pattern fields [0.05ms]
215
+ (pass) extractPatternsFromDescription > detects 'split by file type' pattern [0.13ms]
216
+ (pass) extractPatternsFromDescription > detects 'splitting by file type' variant
217
+ (pass) extractPatternsFromDescription > detects 'split by component' pattern [0.02ms]
218
218
  (pass) extractPatternsFromDescription > detects 'split by layer' pattern
219
219
  (pass) extractPatternsFromDescription > detects 'split by feature' pattern
220
- (pass) extractPatternsFromDescription > detects 'one file per task' pattern [0.02ms]
221
- (pass) extractPatternsFromDescription > detects 'shared types first' pattern [0.02ms]
220
+ (pass) extractPatternsFromDescription > detects 'one file per task' pattern
221
+ (pass) extractPatternsFromDescription > detects 'shared types first' pattern
222
222
  (pass) extractPatternsFromDescription > detects 'API routes separate' pattern
223
223
  (pass) extractPatternsFromDescription > detects 'tests with code' pattern
224
224
  (pass) extractPatternsFromDescription > detects 'tests in separate subtask' pattern
225
- (pass) extractPatternsFromDescription > detects 'parallelize all' pattern
225
+ (pass) extractPatternsFromDescription > detects 'parallelize all' pattern [0.01ms]
226
226
  (pass) extractPatternsFromDescription > detects 'sequential order' pattern
227
227
  (pass) extractPatternsFromDescription > detects 'dependency chain' pattern
228
228
  (pass) extractPatternsFromDescription > returns empty array for unrecognized descriptions
229
- (pass) extractPatternsFromDescription > detects multiple patterns in one description [0.05ms]
230
- (pass) extractPatternsFromDescription > is case-insensitive [0.02ms]
231
- (pass) extractPatternsFromDescription > handles partial matches in longer sentences [0.01ms]
232
- (pass) createPattern > creates pattern with provided content [0.03ms]
233
- (pass) createPattern > creates pattern with kind='pattern' [0.01ms]
229
+ (pass) extractPatternsFromDescription > detects multiple patterns in one description
230
+ (pass) extractPatternsFromDescription > is case-insensitive
231
+ (pass) extractPatternsFromDescription > handles partial matches in longer sentences
232
+ (pass) createPattern > creates pattern with provided content [0.01ms]
233
+ (pass) createPattern > creates pattern with kind='pattern'
234
234
  (pass) createPattern > creates pattern with is_negative=false
235
235
  (pass) createPattern > initializes counts to zero
236
- (pass) createPattern > includes provided tags [0.01ms]
236
+ (pass) createPattern > includes provided tags
237
237
  (pass) createPattern > defaults to empty tags array
238
238
  (pass) createPattern > generates unique ID [0.01ms]
239
239
  (pass) createPattern > sets created_at timestamp [0.01ms]
240
240
  (pass) createPattern > sets updated_at equal to created_at
241
241
  (pass) createPattern > initializes example_beads to empty array
242
242
  (pass) formatAntiPatternsForPrompt > formats anti-patterns with header [0.04ms]
243
- (pass) formatAntiPatternsForPrompt > filters out non-anti-patterns [0.03ms]
244
- (pass) formatAntiPatternsForPrompt > returns empty string when no anti-patterns [0.01ms]
243
+ (pass) formatAntiPatternsForPrompt > filters out non-anti-patterns
244
+ (pass) formatAntiPatternsForPrompt > returns empty string when no anti-patterns [0.02ms]
245
245
  (pass) formatAntiPatternsForPrompt > returns empty string for empty array [0.01ms]
246
- (pass) formatAntiPatternsForPrompt > formats multiple anti-patterns [0.19ms]
247
- (pass) formatSuccessfulPatternsForPrompt > filters patterns below minSuccessRate [0.06ms]
248
- (pass) formatSuccessfulPatternsForPrompt > includes success rate percentage in output [0.02ms]
246
+ (pass) formatAntiPatternsForPrompt > formats multiple anti-patterns [0.01ms]
247
+ (pass) formatSuccessfulPatternsForPrompt > filters patterns below minSuccessRate [0.04ms]
248
+ (pass) formatSuccessfulPatternsForPrompt > includes success rate percentage in output
249
249
  (pass) formatSuccessfulPatternsForPrompt > filters out anti-patterns [0.01ms]
250
- (pass) formatSuccessfulPatternsForPrompt > filters out patterns with < 2 total observations [0.01ms]
251
- (pass) formatSuccessfulPatternsForPrompt > returns empty string when no qualifying patterns [0.02ms]
250
+ (pass) formatSuccessfulPatternsForPrompt > filters out patterns with < 2 total observations [0.02ms]
251
+ (pass) formatSuccessfulPatternsForPrompt > returns empty string when no qualifying patterns [0.03ms]
252
252
  (pass) formatSuccessfulPatternsForPrompt > returns empty string for empty array
253
- (pass) formatSuccessfulPatternsForPrompt > uses default minSuccessRate of 0.7 [0.01ms]
254
- (pass) formatSuccessfulPatternsForPrompt > respects custom minSuccessRate [0.01ms]
255
- (pass) formatSuccessfulPatternsForPrompt > formats multiple successful patterns
253
+ (pass) formatSuccessfulPatternsForPrompt > uses default minSuccessRate of 0.7
254
+ (pass) formatSuccessfulPatternsForPrompt > respects custom minSuccessRate [0.02ms]
255
+ (pass) formatSuccessfulPatternsForPrompt > formats multiple successful patterns [0.01ms]
256
256
  (pass) formatSuccessfulPatternsForPrompt > includes header when patterns exist [0.02ms]
257
- (pass) InMemoryPatternStorage > stores and retrieves a pattern [0.08ms]
258
- (pass) InMemoryPatternStorage > returns null for non-existent pattern [0.02ms]
259
- (pass) InMemoryPatternStorage > updates existing pattern on store [0.03ms]
260
- (pass) InMemoryPatternStorage > getAll returns all stored patterns [0.28ms]
261
- (pass) InMemoryPatternStorage > getAll returns empty array when no patterns [0.04ms]
262
- (pass) InMemoryPatternStorage > getAntiPatterns filters by kind [0.12ms]
263
- (pass) InMemoryPatternStorage > getByTag filters by tag [0.08ms]
264
- (pass) InMemoryPatternStorage > getByTag returns empty for non-existent tag [0.03ms]
265
- (pass) InMemoryPatternStorage > findByContent finds patterns by substring [0.07ms]
257
+ (pass) InMemoryPatternStorage > stores and retrieves a pattern [0.07ms]
258
+ (pass) InMemoryPatternStorage > returns null for non-existent pattern [0.03ms]
259
+ (pass) InMemoryPatternStorage > updates existing pattern on store [0.02ms]
260
+ (pass) InMemoryPatternStorage > getAll returns all stored patterns [0.04ms]
261
+ (pass) InMemoryPatternStorage > getAll returns empty array when no patterns [0.06ms]
262
+ (pass) InMemoryPatternStorage > getAntiPatterns filters by kind [0.06ms]
263
+ (pass) InMemoryPatternStorage > getByTag filters by tag [0.06ms]
264
+ (pass) InMemoryPatternStorage > getByTag returns empty for non-existent tag [0.02ms]
265
+ (pass) InMemoryPatternStorage > findByContent finds patterns by substring [0.06ms]
266
266
  (pass) InMemoryPatternStorage > findByContent is case-insensitive [0.02ms]
267
- (pass) InMemoryPatternStorage > findByContent returns empty for no matches [0.02ms]
267
+ (pass) InMemoryPatternStorage > findByContent returns empty for no matches [0.03ms]
268
268
 
269
269
  src/output-guardrails.test.ts:
270
- (pass) truncateWithBoundaries > returns unchanged text when under limit [0.08ms]
271
- (pass) truncateWithBoundaries > preserves complete JSON objects [6.29ms]
272
- (pass) truncateWithBoundaries > preserves nested JSON structure [0.12ms]
273
- (pass) truncateWithBoundaries > preserves code block boundaries [0.06ms]
274
- (pass) truncateWithBoundaries > preserves markdown header boundaries [0.03ms]
275
- (pass) truncateWithBoundaries > handles text without structure boundaries [0.02ms]
276
- (pass) truncateWithBoundaries > adds truncation suffix with character count [0.04ms]
270
+ (pass) truncateWithBoundaries > returns unchanged text when under limit [0.09ms]
271
+ (pass) truncateWithBoundaries > preserves complete JSON objects [6.28ms]
272
+ (pass) truncateWithBoundaries > preserves nested JSON structure [0.14ms]
273
+ (pass) truncateWithBoundaries > preserves code block boundaries [0.07ms]
274
+ (pass) truncateWithBoundaries > preserves markdown header boundaries
275
+ (pass) truncateWithBoundaries > handles text without structure boundaries [0.08ms]
276
+ (pass) truncateWithBoundaries > adds truncation suffix with character count [0.03ms]
277
277
  (pass) truncateWithBoundaries > avoids truncating mid-word [0.04ms]
278
278
  (pass) truncateWithBoundaries > handles empty string
279
279
  (pass) truncateWithBoundaries > handles exact limit length
280
- (pass) truncateWithBoundaries > handles just over limit [0.01ms]
280
+ (pass) truncateWithBoundaries > handles just over limit
281
281
  (pass) truncateWithBoundaries > extends limit by 20% to include matching braces
282
- (pass) truncateWithBoundaries > extends limit by 20% to include closing code block [0.01ms]
282
+ (pass) truncateWithBoundaries > extends limit by 20% to include closing code block
283
283
  (pass) guardrailOutput > skips configured tools
284
- (pass) guardrailOutput > truncates oversized output for non-skip tools [0.77ms]
285
- (pass) guardrailOutput > respects per-tool limits [0.16ms]
286
- (pass) guardrailOutput > uses custom config when provided [0.03ms]
287
- (pass) guardrailOutput > returns complete metadata [0.25ms]
288
- (pass) guardrailOutput > handles all skip tools from DEFAULT_GUARDRAIL_CONFIG [0.05ms]
289
- (pass) createMetrics > creates metrics entry from guardrail result [0.04ms]
290
- (pass) createMetrics > timestamp is reasonable
291
- (pass) DEFAULT_GUARDRAIL_CONFIG > has sensible defaults [0.01ms]
292
- (pass) DEFAULT_GUARDRAIL_CONFIG > includes higher limits for code/doc tools
284
+ (pass) guardrailOutput > truncates oversized output for non-skip tools [3.71ms]
285
+ (pass) guardrailOutput > respects per-tool limits [0.92ms]
286
+ (pass) guardrailOutput > uses custom config when provided [0.06ms]
287
+ (pass) guardrailOutput > returns complete metadata [3.03ms]
288
+ (pass) guardrailOutput > handles all skip tools from DEFAULT_GUARDRAIL_CONFIG [0.10ms]
289
+ (pass) createMetrics > creates metrics entry from guardrail result [0.10ms]
290
+ (pass) createMetrics > timestamp is reasonable [0.01ms]
291
+ (pass) DEFAULT_GUARDRAIL_CONFIG > has sensible defaults [0.02ms]
292
+ (pass) DEFAULT_GUARDRAIL_CONFIG > includes higher limits for code/doc tools [0.01ms]
293
293
  (pass) DEFAULT_GUARDRAIL_CONFIG > includes lower limits for stats tools
294
- (pass) DEFAULT_GUARDRAIL_CONFIG > skips all internal coordination tools [0.02ms]
295
- (pass) edge cases > handles JSON array at truncation boundary [0.02ms]
296
- (pass) edge cases > handles mixed code blocks and JSON [0.01ms]
297
- (pass) edge cases > handles unicode characters correctly [0.03ms]
298
- (pass) edge cases > handles CRLF line endings [0.01ms]
294
+ (pass) DEFAULT_GUARDRAIL_CONFIG > skips all internal coordination tools [0.03ms]
295
+ (pass) edge cases > handles JSON array at truncation boundary [0.01ms]
296
+ (pass) edge cases > handles mixed code blocks and JSON
297
+ (pass) edge cases > handles unicode characters correctly
298
+ (pass) edge cases > handles CRLF line endings
299
299
 
300
300
  src/pattern-maturity.test.ts:
301
- (pass) calculateDecayedCounts > returns zero counts for empty feedback [0.05ms]
301
+ (pass) calculateDecayedCounts > returns zero counts for empty feedback [0.10ms]
302
302
  (pass) calculateDecayedCounts > counts recent helpful feedback at full weight [0.04ms]
303
- (pass) calculateDecayedCounts > counts recent harmful feedback at full weight [0.02ms]
304
- (pass) calculateDecayedCounts > applies decay to old feedback
305
- (pass) calculateDecayedCounts > handles mixed feedback types
303
+ (pass) calculateDecayedCounts > counts recent harmful feedback at full weight
304
+ (pass) calculateDecayedCounts > applies decay to old feedback [0.04ms]
305
+ (pass) calculateDecayedCounts > handles mixed feedback types [0.02ms]
306
306
  (pass) calculateDecayedCounts > respects weight parameter
307
307
  (pass) calculateDecayedCounts > uses custom config half-life
308
- (pass) calculateDecayedCounts > uses custom now parameter for decay calculation
309
- (pass) calculateMaturityState > returns candidate with no feedback
308
+ (pass) calculateDecayedCounts > uses custom now parameter for decay calculation [0.04ms]
309
+ (pass) calculateMaturityState > returns candidate with no feedback [0.01ms]
310
310
  (pass) calculateMaturityState > returns candidate with insufficient feedback
311
311
  (pass) calculateMaturityState > returns established with enough neutral feedback
312
- (pass) calculateMaturityState > returns proven with strong positive feedback [0.19ms]
313
- (pass) calculateMaturityState > returns deprecated with high harmful ratio [0.02ms]
312
+ (pass) calculateMaturityState > returns proven with strong positive feedback [0.06ms]
313
+ (pass) calculateMaturityState > returns deprecated with high harmful ratio
314
314
  (pass) calculateMaturityState > proven requires minimum helpful count
315
315
  (pass) calculateMaturityState > proven requires low harmful ratio
316
- (pass) calculateMaturityState > deprecation takes priority over proven [0.04ms]
317
- (pass) calculateMaturityState > uses custom config thresholds [0.02ms]
318
- (pass) calculateMaturityState > accounts for decay in state calculation [0.01ms]
319
- (pass) createPatternMaturity > creates initial maturity in candidate state
320
- (pass) createPatternMaturity > sets last_validated timestamp [0.02ms]
321
- (pass) createPatternMaturity > does not set promoted_at or deprecated_at initially
322
- (pass) updatePatternMaturity > updates state based on feedback [0.06ms]
323
- (pass) updatePatternMaturity > updates helpful and harmful counts [0.01ms]
324
- (pass) updatePatternMaturity > sets promoted_at on first transition to proven [0.03ms]
325
- (pass) updatePatternMaturity > does not update promoted_at if already proven [0.04ms]
326
- (pass) updatePatternMaturity > sets deprecated_at on first transition to deprecated [0.02ms]
316
+ (pass) calculateMaturityState > deprecation takes priority over proven
317
+ (pass) calculateMaturityState > uses custom config thresholds [0.13ms]
318
+ (pass) calculateMaturityState > accounts for decay in state calculation
319
+ (pass) createPatternMaturity > creates initial maturity in candidate state [0.02ms]
320
+ (pass) createPatternMaturity > sets last_validated timestamp
321
+ (pass) createPatternMaturity > does not set promoted_at or deprecated_at initially [0.04ms]
322
+ (pass) updatePatternMaturity > updates state based on feedback
323
+ (pass) updatePatternMaturity > updates helpful and harmful counts
324
+ (pass) updatePatternMaturity > sets promoted_at on first transition to proven [0.08ms]
325
+ (pass) updatePatternMaturity > does not update promoted_at if already proven
326
+ (pass) updatePatternMaturity > sets deprecated_at on first transition to deprecated
327
327
  (pass) updatePatternMaturity > does not update deprecated_at if already deprecated
328
328
  (pass) updatePatternMaturity > updates last_validated timestamp
329
329
  (pass) updatePatternMaturity > handles state transitions: candidate -> established
@@ -331,143 +331,145 @@ src/pattern-maturity.test.ts:
331
331
  (pass) updatePatternMaturity > handles state transitions: proven -> deprecated
332
332
  (pass) updatePatternMaturity > handles empty feedback array
333
333
  [PatternMaturity] Promoting candidate with insufficient data: test-pattern (0 helpful observations)
334
- (pass) promotePattern > promotes candidate to proven [0.15ms]
334
+ (pass) promotePattern > promotes candidate to proven [0.28ms]
335
335
  (pass) promotePattern > promotes established to proven
336
336
  [PatternMaturity] Promoting candidate with insufficient data: test-pattern (0 helpful observations)
337
- (pass) promotePattern > sets promoted_at timestamp
337
+ (pass) promotePattern > sets promoted_at timestamp [0.02ms]
338
338
  [PatternMaturity] Promoting candidate with insufficient data: test-pattern (0 helpful observations)
339
339
  (pass) promotePattern > updates last_validated timestamp
340
340
  (pass) promotePattern > throws error when promoting deprecated pattern
341
341
  [PatternMaturity] Pattern already proven: test-pattern
342
342
  (pass) promotePattern > returns unchanged maturity when already proven
343
343
  (pass) deprecatePattern > deprecates candidate pattern
344
- (pass) deprecatePattern > deprecates established pattern
345
- (pass) deprecatePattern > deprecates proven pattern [0.13ms]
346
- (pass) deprecatePattern > sets deprecated_at timestamp [0.01ms]
344
+ (pass) deprecatePattern > deprecates established pattern [0.07ms]
345
+ (pass) deprecatePattern > deprecates proven pattern
346
+ (pass) deprecatePattern > sets deprecated_at timestamp
347
347
  (pass) deprecatePattern > updates last_validated timestamp
348
- (pass) deprecatePattern > returns unchanged maturity when already deprecated
349
- (pass) deprecatePattern > accepts optional reason parameter [0.02ms]
350
- (pass) getMaturityMultiplier > returns 0.5 for candidate
351
- (pass) getMaturityMultiplier > returns 1.0 for established [0.02ms]
348
+ (pass) deprecatePattern > returns unchanged maturity when already deprecated [0.03ms]
349
+ (pass) deprecatePattern > accepts optional reason parameter [0.11ms]
350
+ (pass) getMaturityMultiplier > returns 0.5 for candidate [0.04ms]
351
+ (pass) getMaturityMultiplier > returns 1.0 for established
352
352
  (pass) getMaturityMultiplier > returns 1.5 for proven
353
353
  (pass) getMaturityMultiplier > returns 0 for deprecated
354
- (pass) formatMaturityForPrompt > shows limited data for insufficient observations [0.04ms]
354
+ (pass) formatMaturityForPrompt > shows limited data for insufficient observations [0.07ms]
355
355
  (pass) formatMaturityForPrompt > shows singular observation for count of 1
356
- (pass) formatMaturityForPrompt > shows candidate with observation count when >= 3 [0.01ms]
356
+ (pass) formatMaturityForPrompt > shows candidate with observation count when >= 3 [0.03ms]
357
357
  (pass) formatMaturityForPrompt > shows established with percentages
358
358
  (pass) formatMaturityForPrompt > shows proven with helpful percentage
359
- (pass) formatMaturityForPrompt > shows deprecated with harmful percentage
359
+ (pass) formatMaturityForPrompt > shows deprecated with harmful percentage [0.03ms]
360
360
  (pass) formatMaturityForPrompt > rounds percentages correctly
361
361
  (pass) formatMaturityForPrompt > handles zero counts edge case [0.02ms]
362
- (pass) formatPatternsWithMaturityForPrompt > formats empty map [0.04ms]
363
- (pass) formatPatternsWithMaturityForPrompt > groups patterns by maturity state [0.04ms]
362
+ (pass) formatPatternsWithMaturityForPrompt > formats empty map
363
+ (pass) formatPatternsWithMaturityForPrompt > groups patterns by maturity state [0.07ms]
364
364
  (pass) formatPatternsWithMaturityForPrompt > omits sections with no patterns
365
365
  (pass) formatPatternsWithMaturityForPrompt > includes pattern maturity labels
366
- (pass) formatPatternsWithMaturityForPrompt > maintains multiple patterns in same section [0.06ms]
366
+ (pass) formatPatternsWithMaturityForPrompt > maintains multiple patterns in same section [0.09ms]
367
367
  (pass) formatPatternsWithMaturityForPrompt > formats section headers correctly
368
- (pass) InMemoryMaturityStorage > store and get > stores and retrieves maturity by pattern ID [0.09ms]
368
+ (pass) InMemoryMaturityStorage > store and get > stores and retrieves maturity by pattern ID
369
369
  (pass) InMemoryMaturityStorage > store and get > returns null for non-existent pattern
370
- (pass) InMemoryMaturityStorage > store and get > overwrites existing maturity on store
370
+ (pass) InMemoryMaturityStorage > store and get > overwrites existing maturity on store [0.14ms]
371
371
  (pass) InMemoryMaturityStorage > getAll > returns empty array when no maturities stored
372
- (pass) InMemoryMaturityStorage > getAll > returns all stored maturities [0.11ms]
373
- (pass) InMemoryMaturityStorage > getByState > returns empty array when no patterns match state
374
- (pass) InMemoryMaturityStorage > getByState > returns only patterns matching state [0.10ms]
372
+ (pass) InMemoryMaturityStorage > getAll > returns all stored maturities
373
+ (pass) InMemoryMaturityStorage > getByState > returns empty array when no patterns match state [0.11ms]
374
+ (pass) InMemoryMaturityStorage > getByState > returns only patterns matching state [0.06ms]
375
375
  (pass) InMemoryMaturityStorage > getByState > handles multiple patterns with same state [0.06ms]
376
376
  (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > stores and retrieves feedback for pattern [0.03ms]
377
- (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > returns empty array for pattern with no feedback
378
- (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > stores multiple feedback events for same pattern [0.04ms]
379
- (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > filters feedback by pattern ID [0.05ms]
380
- (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > preserves feedback event data [0.04ms]
381
- (pass) InMemoryMaturityStorage > integration: full workflow > supports complete maturity tracking workflow [0.05ms]
377
+ (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > returns empty array for pattern with no feedback [0.03ms]
378
+ (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > stores multiple feedback events for same pattern
379
+ (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > filters feedback by pattern ID
380
+ (pass) InMemoryMaturityStorage > storeFeedback and getFeedback > preserves feedback event data
381
+ (pass) InMemoryMaturityStorage > integration: full workflow > supports complete maturity tracking workflow [0.16ms]
382
382
 
383
383
  src/mandate-promotion.test.ts:
384
- (pass) shouldPromote > candidate stays candidate with insufficient votes [0.07ms]
385
- (pass) shouldPromote > candidate → established at threshold (net_votes >= 2) [0.01ms]
384
+ (pass) shouldPromote > candidate stays candidate with insufficient votes [0.06ms]
385
+ (pass) shouldPromote > candidate → established at threshold (net_votes >= 2) [0.06ms]
386
386
  (pass) shouldPromote > candidate → established above threshold
387
387
  (pass) shouldPromote > established stays established with insufficient mandate votes
388
- (pass) shouldPromote > established stays established with low vote ratio
388
+ (pass) shouldPromote > established stays established with low vote ratio [0.02ms]
389
389
  (pass) shouldPromote > established → mandate at threshold (net >= 5, ratio >= 0.7)
390
390
  (pass) shouldPromote > established → mandate above threshold
391
- (pass) shouldPromote > mandate stays mandate (no demotion) [0.07ms]
392
- (pass) shouldPromote > candidate → rejected with negative votes [0.01ms]
393
- (pass) shouldPromote > established → rejected with negative votes [0.01ms]
391
+ (pass) shouldPromote > mandate stays mandate (no demotion)
392
+ (pass) shouldPromote > candidate → rejected with negative votes
393
+ (pass) shouldPromote > established → rejected with negative votes
394
394
  (pass) shouldPromote > rejected stays rejected (permanent)
395
- (pass) shouldPromote > uses custom config thresholds [0.03ms]
396
- (pass) evaluatePromotion > returns correct promotion result for candidate → established [0.09ms]
395
+ (pass) shouldPromote > uses custom config thresholds [0.04ms]
396
+ (pass) evaluatePromotion > returns correct promotion result for candidate → established [0.07ms]
397
397
  (pass) evaluatePromotion > returns correct promotion result for established → mandate [0.02ms]
398
398
  (pass) evaluatePromotion > returns correct promotion result for candidate → rejected
399
- (pass) evaluatePromotion > returns correct result for no status change [0.03ms]
399
+ (pass) evaluatePromotion > returns correct result for no status change
400
400
  (pass) evaluatePromotion > returns correct result for mandate staying mandate
401
- (pass) evaluatePromotion > returns correct result for rejected staying rejected [0.01ms]
402
- (pass) decay affects promotion timing > net_votes can decay below promotion threshold [0.02ms]
403
- (pass) decay affects promotion timing > vote_ratio decay prevents mandate promotion [0.01ms]
401
+ (pass) evaluatePromotion > returns correct result for rejected staying rejected
402
+ (pass) decay affects promotion timing > net_votes can decay below promotion threshold [0.06ms]
403
+ (pass) decay affects promotion timing > vote_ratio decay prevents mandate promotion
404
404
  (pass) decay affects promotion timing > fresh votes can push over mandate threshold
405
- (pass) formatPromotionResult > formats promoted result with arrow [0.02ms]
405
+ (pass) formatPromotionResult > formats promoted result with arrow [0.04ms]
406
406
  (pass) formatPromotionResult > formats no-change result without arrow [0.02ms]
407
- (pass) evaluateBatchPromotions > evaluates multiple entries [0.08ms]
407
+ (pass) evaluateBatchPromotions > evaluates multiple entries [0.06ms]
408
408
  (pass) evaluateBatchPromotions > skips entries without scores
409
- (pass) getStatusChanges > filters to only promoted entries [0.06ms]
410
- (pass) groupByTransition > groups results by transition type [0.05ms]
411
- (pass) groupByTransition > uses status name for no-change transitions [0.04ms]
412
- (pass) edge cases > handles exact threshold values [0.02ms]
409
+ (pass) getStatusChanges > filters to only promoted entries
410
+ (pass) groupByTransition > groups results by transition type
411
+ (pass) groupByTransition > uses status name for no-change transitions
412
+ (pass) edge cases > handles exact threshold values
413
413
  (pass) edge cases > handles zero votes
414
- (pass) edge cases > handles negative vote ratio edge case [0.01ms]
414
+ (pass) edge cases > handles negative vote ratio edge case
415
415
  (pass) edge cases > rejects at exact rejection threshold
416
416
 
417
417
  src/schemas/index.test.ts:
418
- (pass) BeadSchema > validates a complete bead [1.06ms]
419
- (pass) BeadSchema > rejects invalid priority [0.11ms]
420
- (pass) BeadSchema > accepts all valid types [0.03ms]
421
- (pass) BeadCreateArgsSchema > validates minimal create args [0.14ms]
422
- (pass) BeadCreateArgsSchema > rejects empty title [0.13ms]
423
- (pass) EpicCreateArgsSchema > validates epic with subtasks [0.23ms]
424
- (pass) EpicCreateArgsSchema > requires at least one subtask [0.05ms]
425
- (pass) EvaluationSchema > validates a passing evaluation
418
+ (pass) BeadSchema > validates a complete bead [0.49ms]
419
+ (pass) BeadSchema > rejects invalid priority [0.18ms]
420
+ (pass) BeadSchema > accepts all valid types [0.04ms]
421
+ (pass) BeadCreateArgsSchema > validates minimal create args [0.09ms]
422
+ (pass) BeadCreateArgsSchema > rejects empty title [0.12ms]
423
+ (pass) EpicCreateArgsSchema > validates epic with subtasks [0.25ms]
424
+ (pass) EpicCreateArgsSchema > requires at least one subtask [0.02ms]
425
+ (pass) EvaluationSchema > validates a passing evaluation [0.07ms]
426
426
  (pass) EvaluationSchema > validates a failing evaluation with retry suggestion
427
- (pass) TaskDecompositionSchema > validates a decomposition
428
- (pass) TaskDecompositionSchema > validates subtask effort levels
429
- (pass) SwarmStatusSchema > validates swarm status [1.00ms]
430
- (pass) ValidationResultSchema > validates success result [0.25ms]
431
- (pass) ValidationResultSchema > validates failure result with errors [0.06ms]
427
+ (pass) TaskDecompositionSchema > validates a decomposition [0.03ms]
428
+ (pass) TaskDecompositionSchema > validates subtask effort levels [0.06ms]
429
+ (pass) SwarmStatusSchema > validates swarm status [0.25ms]
430
+ (pass) ValidationResultSchema > validates success result
431
+ (pass) ValidationResultSchema > validates failure result with errors
432
432
 
433
433
  src/schemas/cell-events.test.ts:
434
- (pass) CellEventSchema > createCellEvent > creates valid cell_created event [2.56ms]
435
- (pass) CellEventSchema > createCellEvent > creates valid cell_closed event [0.31ms]
434
+ (pass) CellEventSchema > createCellEvent > creates valid cell_created event [0.76ms]
435
+ (pass) CellEventSchema > createCellEvent > creates valid cell_closed event [0.18ms]
436
436
  (pass) CellEventSchema > createCellEvent > creates valid cell_dependency_added event [0.26ms]
437
- (pass) CellEventSchema > createCellEvent > creates valid cell_epic_child_added event [0.16ms]
438
- (pass) CellEventSchema > createCellEvent > throws on invalid event data [0.10ms]
439
- (pass) CellEventSchema > type guards > isCellEventType narrows type correctly [0.03ms]
440
- (pass) CellEventSchema > type guards > isStateTransitionEvent identifies status changes [0.03ms]
441
- (pass) CellEventSchema > type guards > isEpicEvent identifies epic operations [0.03ms]
442
- (pass) CellEventSchema > type guards > isAgentEvent detects agent-triggered events [0.63ms]
443
- (pass) CellEventSchema > getCellIdFromEvent > extracts cell_id from any event [0.04ms]
444
- (pass) CellEventSchema > discriminated union validation > validates against full CellEventSchema [0.02ms]
445
- (pass) CellEventSchema > discriminated union validation > rejects invalid event type [0.04ms]
446
- (pass) CellEventSchema > discriminated union validation > validates dependency types [0.04ms]
447
- (pass) CellEventSchema > event metadata > supports metadata field [0.04ms]
448
- (pass) CellEventSchema > epic closure eligible event > creates valid closure eligible event [0.22ms]
449
- (pass) CellEventSchema > status changed event > tracks status transitions [0.19ms]
450
- (pass) CellEventSchema > status changed event > includes optional reason for blocked/closed [0.02ms]
451
- (pass) CellEventSchema > comment events > creates comment with optional parent [0.54ms]
452
- (pass) CellEventSchema > work tracking events > tracks work start with file reservations [0.89ms]
437
+ (pass) CellEventSchema > createCellEvent > creates valid cell_epic_child_added event [0.15ms]
438
+ (pass) CellEventSchema > createCellEvent > throws on invalid event data [0.02ms]
439
+ (pass) CellEventSchema > type guards > isCellEventType narrows type correctly [0.08ms]
440
+ (pass) CellEventSchema > type guards > isStateTransitionEvent identifies status changes
441
+ (pass) CellEventSchema > type guards > isEpicEvent identifies epic operations [0.05ms]
442
+ (pass) CellEventSchema > type guards > isAgentEvent detects agent-triggered events [0.19ms]
443
+ (pass) CellEventSchema > getCellIdFromEvent > extracts cell_id from any event [0.05ms]
444
+ (pass) CellEventSchema > discriminated union validation > validates against full CellEventSchema
445
+ (pass) CellEventSchema > discriminated union validation > rejects invalid event type [0.02ms]
446
+ (pass) CellEventSchema > discriminated union validation > validates dependency types
447
+ (pass) CellEventSchema > event metadata > supports metadata field [0.09ms]
448
+ (pass) CellEventSchema > epic closure eligible event > creates valid closure eligible event [0.05ms]
449
+ (pass) CellEventSchema > status changed event > tracks status transitions [0.25ms]
450
+ (pass) CellEventSchema > status changed event > includes optional reason for blocked/closed [0.05ms]
451
+ (pass) CellEventSchema > comment events > creates comment with optional parent [5.28ms]
452
+ (pass) CellEventSchema > work tracking events > tracks work start with file reservations [0.15ms]
453
453
 
454
454
  src/schemas/worker-handoff.test.ts:
455
- (pass) WorkerHandoffContractSchema > valid contract parses correctly [0.90ms]
456
- (pass) WorkerHandoffContractSchema > missing task_id fails [0.08ms]
455
+ (pass) WorkerHandoffContractSchema > valid contract parses correctly [5.27ms]
456
+ (pass) WorkerHandoffContractSchema > missing task_id fails [0.13ms]
457
457
  (pass) WorkerHandoffContractSchema > empty files_owned is valid (read-only tasks) [0.02ms]
458
- (pass) WorkerHandoffContractSchema > empty success_criteria fails [0.04ms]
459
- (pass) WorkerHandoffContractSchema > invalid task_id format fails [0.04ms]
460
- (pass) WorkerHandoffContextSchema > valid context parses correctly [0.13ms]
461
- (pass) WorkerHandoffContextSchema > missing required fields fails [0.06ms]
462
- (pass) WorkerHandoffContextSchema > empty strings are valid [0.01ms]
458
+ (pass) WorkerHandoffContractSchema > empty success_criteria fails [0.05ms]
459
+ (pass) WorkerHandoffContractSchema > empty task_id fails [0.03ms]
460
+ (pass) WorkerHandoffContractSchema > short project name with hash is valid [0.02ms]
461
+ (pass) WorkerHandoffContractSchema > partial hash is valid (resolvePartialId will expand it) [0.02ms]
462
+ (pass) WorkerHandoffContextSchema > valid context parses correctly [0.16ms]
463
+ (pass) WorkerHandoffContextSchema > missing required fields fails [0.04ms]
464
+ (pass) WorkerHandoffContextSchema > empty strings are valid [0.03ms]
463
465
  (pass) WorkerHandoffEscalationSchema > valid escalation parses correctly [0.07ms]
464
- (pass) WorkerHandoffEscalationSchema > missing required fields fails [0.02ms]
465
- (pass) WorkerHandoffSchema > complete valid handoff parses correctly [0.10ms]
466
- (pass) WorkerHandoffSchema > missing contract section fails [0.03ms]
466
+ (pass) WorkerHandoffEscalationSchema > missing required fields fails
467
+ (pass) WorkerHandoffSchema > complete valid handoff parses correctly [0.11ms]
468
+ (pass) WorkerHandoffSchema > missing contract section fails [0.02ms]
467
469
  (pass) WorkerHandoffSchema > nested validation catches contract errors [0.04ms]
468
- (pass) WorkerHandoffSchema > type inference works correctly [0.02ms]
470
+ (pass) WorkerHandoffSchema > type inference works correctly
469
471
 
470
- 421 pass
472
+ 423 pass
471
473
  0 fail
472
- 772 expect() calls
473
- Ran 421 tests across 10 files. [229.00ms]
474
+ 775 expect() calls
475
+ Ran 423 tests across 10 files. [161.00ms]