opencode-swarm-plugin 0.37.0 → 0.39.1

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