opencode-swarm-plugin 0.44.0 → 0.44.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.
- package/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.ts +16 -10
- package/dist/compaction-prompt-scoring.js +139 -0
- package/dist/eval-capture.js +12811 -0
- package/dist/hive.d.ts.map +1 -1
- package/dist/index.js +7644 -62599
- package/dist/plugin.js +23766 -78721
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-review.d.ts.map +1 -1
- package/package.json +17 -5
- package/.changeset/swarm-insights-data-layer.md +0 -63
- package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
- package/.hive/analysis/session-data-quality-audit.md +0 -320
- package/.hive/eval-results.json +0 -483
- package/.hive/issues.jsonl +0 -138
- package/.hive/memories.jsonl +0 -729
- package/.opencode/eval-history.jsonl +0 -327
- package/.turbo/turbo-build.log +0 -9
- package/CHANGELOG.md +0 -2286
- package/SCORER-ANALYSIS.md +0 -598
- package/docs/analysis/subagent-coordination-patterns.md +0 -902
- package/docs/analysis-socratic-planner-pattern.md +0 -504
- package/docs/planning/ADR-001-monorepo-structure.md +0 -171
- package/docs/planning/ADR-002-package-extraction.md +0 -393
- package/docs/planning/ADR-003-performance-improvements.md +0 -451
- package/docs/planning/ADR-004-message-queue-features.md +0 -187
- package/docs/planning/ADR-005-devtools-observability.md +0 -202
- package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
- package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
- package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
- package/docs/planning/ADR-010-cass-inhousing.md +0 -1215
- package/docs/planning/ROADMAP.md +0 -368
- package/docs/semantic-memory-cli-syntax.md +0 -123
- package/docs/swarm-mail-architecture.md +0 -1147
- package/docs/testing/context-recovery-test.md +0 -470
- package/evals/ARCHITECTURE.md +0 -1189
- package/evals/README.md +0 -768
- package/evals/compaction-prompt.eval.ts +0 -149
- package/evals/compaction-resumption.eval.ts +0 -289
- package/evals/coordinator-behavior.eval.ts +0 -307
- package/evals/coordinator-session.eval.ts +0 -154
- package/evals/evalite.config.ts.bak +0 -15
- package/evals/example.eval.ts +0 -31
- package/evals/fixtures/cass-baseline.ts +0 -217
- package/evals/fixtures/compaction-cases.ts +0 -350
- package/evals/fixtures/compaction-prompt-cases.ts +0 -311
- package/evals/fixtures/coordinator-sessions.ts +0 -328
- package/evals/fixtures/decomposition-cases.ts +0 -105
- package/evals/lib/compaction-loader.test.ts +0 -248
- package/evals/lib/compaction-loader.ts +0 -320
- package/evals/lib/data-loader.evalite-test.ts +0 -289
- package/evals/lib/data-loader.test.ts +0 -345
- package/evals/lib/data-loader.ts +0 -281
- package/evals/lib/llm.ts +0 -115
- package/evals/scorers/compaction-prompt-scorers.ts +0 -145
- package/evals/scorers/compaction-scorers.ts +0 -305
- package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
- package/evals/scorers/coordinator-discipline.ts +0 -325
- package/evals/scorers/index.test.ts +0 -146
- package/evals/scorers/index.ts +0 -328
- package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
- package/evals/scorers/outcome-scorers.ts +0 -349
- package/evals/swarm-decomposition.eval.ts +0 -121
- package/examples/commands/swarm.md +0 -745
- package/examples/plugin-wrapper-template.ts +0 -2515
- package/examples/skills/hive-workflow/SKILL.md +0 -212
- package/examples/skills/skill-creator/SKILL.md +0 -223
- package/examples/skills/swarm-coordination/SKILL.md +0 -292
- package/global-skills/cli-builder/SKILL.md +0 -344
- package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
- package/global-skills/learning-systems/SKILL.md +0 -644
- package/global-skills/skill-creator/LICENSE.txt +0 -202
- package/global-skills/skill-creator/SKILL.md +0 -352
- package/global-skills/skill-creator/references/output-patterns.md +0 -82
- package/global-skills/skill-creator/references/workflows.md +0 -28
- package/global-skills/swarm-coordination/SKILL.md +0 -995
- package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
- package/global-skills/swarm-coordination/references/strategies.md +0 -138
- package/global-skills/system-design/SKILL.md +0 -213
- package/global-skills/testing-patterns/SKILL.md +0 -430
- package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
- package/opencode-swarm-plugin-0.30.7.tgz +0 -0
- package/opencode-swarm-plugin-0.31.0.tgz +0 -0
- package/scripts/cleanup-test-memories.ts +0 -346
- package/scripts/init-skill.ts +0 -222
- package/scripts/migrate-unknown-sessions.ts +0 -349
- package/scripts/validate-skill.ts +0 -204
- package/src/agent-mail.ts +0 -1724
- package/src/anti-patterns.test.ts +0 -1167
- package/src/anti-patterns.ts +0 -448
- package/src/compaction-capture.integration.test.ts +0 -257
- package/src/compaction-hook.test.ts +0 -838
- package/src/compaction-hook.ts +0 -1204
- package/src/compaction-observability.integration.test.ts +0 -139
- package/src/compaction-observability.test.ts +0 -187
- package/src/compaction-observability.ts +0 -324
- package/src/compaction-prompt-scorers.test.ts +0 -475
- package/src/compaction-prompt-scoring.ts +0 -300
- package/src/contributor-tools.test.ts +0 -133
- package/src/contributor-tools.ts +0 -201
- package/src/dashboard.test.ts +0 -611
- package/src/dashboard.ts +0 -462
- package/src/error-enrichment.test.ts +0 -403
- package/src/error-enrichment.ts +0 -219
- package/src/eval-capture.test.ts +0 -1015
- package/src/eval-capture.ts +0 -929
- package/src/eval-gates.test.ts +0 -306
- package/src/eval-gates.ts +0 -218
- package/src/eval-history.test.ts +0 -508
- package/src/eval-history.ts +0 -214
- package/src/eval-learning.test.ts +0 -378
- package/src/eval-learning.ts +0 -360
- package/src/eval-runner.test.ts +0 -223
- package/src/eval-runner.ts +0 -402
- package/src/export-tools.test.ts +0 -476
- package/src/export-tools.ts +0 -257
- package/src/hive.integration.test.ts +0 -2241
- package/src/hive.ts +0 -1628
- package/src/index.ts +0 -940
- package/src/learning.integration.test.ts +0 -1815
- package/src/learning.ts +0 -1079
- package/src/logger.test.ts +0 -189
- package/src/logger.ts +0 -135
- package/src/mandate-promotion.test.ts +0 -473
- package/src/mandate-promotion.ts +0 -239
- package/src/mandate-storage.integration.test.ts +0 -601
- package/src/mandate-storage.test.ts +0 -578
- package/src/mandate-storage.ts +0 -794
- package/src/mandates.ts +0 -540
- package/src/memory-tools.test.ts +0 -195
- package/src/memory-tools.ts +0 -344
- package/src/memory.integration.test.ts +0 -334
- package/src/memory.test.ts +0 -158
- package/src/memory.ts +0 -527
- package/src/model-selection.test.ts +0 -188
- package/src/model-selection.ts +0 -68
- package/src/observability-tools.test.ts +0 -359
- package/src/observability-tools.ts +0 -871
- package/src/output-guardrails.test.ts +0 -438
- package/src/output-guardrails.ts +0 -381
- package/src/pattern-maturity.test.ts +0 -1160
- package/src/pattern-maturity.ts +0 -525
- package/src/planning-guardrails.test.ts +0 -491
- package/src/planning-guardrails.ts +0 -438
- package/src/plugin.ts +0 -23
- package/src/post-compaction-tracker.test.ts +0 -251
- package/src/post-compaction-tracker.ts +0 -237
- package/src/query-tools.test.ts +0 -636
- package/src/query-tools.ts +0 -324
- package/src/rate-limiter.integration.test.ts +0 -466
- package/src/rate-limiter.ts +0 -774
- package/src/replay-tools.test.ts +0 -496
- package/src/replay-tools.ts +0 -240
- package/src/repo-crawl.integration.test.ts +0 -441
- package/src/repo-crawl.ts +0 -610
- package/src/schemas/cell-events.test.ts +0 -347
- package/src/schemas/cell-events.ts +0 -807
- package/src/schemas/cell.ts +0 -257
- package/src/schemas/evaluation.ts +0 -166
- package/src/schemas/index.test.ts +0 -199
- package/src/schemas/index.ts +0 -286
- package/src/schemas/mandate.ts +0 -232
- package/src/schemas/swarm-context.ts +0 -115
- package/src/schemas/task.ts +0 -161
- package/src/schemas/worker-handoff.test.ts +0 -302
- package/src/schemas/worker-handoff.ts +0 -131
- package/src/sessions/agent-discovery.test.ts +0 -137
- package/src/sessions/agent-discovery.ts +0 -112
- package/src/sessions/index.ts +0 -15
- package/src/skills.integration.test.ts +0 -1192
- package/src/skills.test.ts +0 -643
- package/src/skills.ts +0 -1549
- package/src/storage.integration.test.ts +0 -341
- package/src/storage.ts +0 -884
- package/src/structured.integration.test.ts +0 -817
- package/src/structured.test.ts +0 -1046
- package/src/structured.ts +0 -762
- package/src/swarm-decompose.test.ts +0 -188
- package/src/swarm-decompose.ts +0 -1302
- package/src/swarm-deferred.integration.test.ts +0 -157
- package/src/swarm-deferred.test.ts +0 -38
- package/src/swarm-insights.test.ts +0 -214
- package/src/swarm-insights.ts +0 -459
- package/src/swarm-mail.integration.test.ts +0 -970
- package/src/swarm-mail.ts +0 -739
- package/src/swarm-orchestrate.integration.test.ts +0 -282
- package/src/swarm-orchestrate.test.ts +0 -548
- package/src/swarm-orchestrate.ts +0 -3084
- package/src/swarm-prompts.test.ts +0 -1270
- package/src/swarm-prompts.ts +0 -2077
- package/src/swarm-research.integration.test.ts +0 -701
- package/src/swarm-research.test.ts +0 -698
- package/src/swarm-research.ts +0 -472
- package/src/swarm-review.integration.test.ts +0 -285
- package/src/swarm-review.test.ts +0 -879
- package/src/swarm-review.ts +0 -709
- package/src/swarm-strategies.ts +0 -407
- package/src/swarm-worktree.test.ts +0 -501
- package/src/swarm-worktree.ts +0 -575
- package/src/swarm.integration.test.ts +0 -2377
- package/src/swarm.ts +0 -38
- package/src/tool-adapter.integration.test.ts +0 -1221
- package/src/tool-availability.ts +0 -461
- package/tsconfig.json +0 -28
|
@@ -1,475 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for compaction prompt quality scorers
|
|
3
|
-
*
|
|
4
|
-
* TDD approach - tests written FIRST to define scorer behavior
|
|
5
|
-
* Tests the PURE scoring functions (not evalite wrappers)
|
|
6
|
-
*
|
|
7
|
-
* **Case-Sensitivity Verification**:
|
|
8
|
-
* All tool name regexes MUST be case-insensitive (/i flag) because:
|
|
9
|
-
* - LLMs generate inconsistent casing (Edit vs edit, Read vs read)
|
|
10
|
-
* - Fixtures contain mixed case examples
|
|
11
|
-
* - Scoring must be robust to case variations
|
|
12
|
-
*
|
|
13
|
-
* Fixed in commit adding /i flags to Edit, Write, bash patterns.
|
|
14
|
-
* Tests added to prevent regression.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { describe, expect, test } from "bun:test";
|
|
18
|
-
import type { CompactionPrompt } from "./compaction-prompt-scoring.js";
|
|
19
|
-
import {
|
|
20
|
-
scoreActionability,
|
|
21
|
-
scoreCoordinatorIdentity,
|
|
22
|
-
scoreEpicIdSpecificity,
|
|
23
|
-
scoreForbiddenToolsPresent,
|
|
24
|
-
scorePostCompactionDiscipline,
|
|
25
|
-
} from "./compaction-prompt-scoring.js";
|
|
26
|
-
|
|
27
|
-
describe("Case-Insensitive Tool Detection (Regression Prevention)", () => {
|
|
28
|
-
test("all scorers handle mixed-case tool names correctly", () => {
|
|
29
|
-
// Real-world example with mixed casing from LLM output
|
|
30
|
-
const prompt: CompactionPrompt = {
|
|
31
|
-
content: `┌─────────────────────────────────────────┐
|
|
32
|
-
│ YOU ARE THE COORDINATOR │
|
|
33
|
-
└─────────────────────────────────────────┘
|
|
34
|
-
|
|
35
|
-
You are coordinating epic mjkw81rkq4c.
|
|
36
|
-
|
|
37
|
-
## IMMEDIATE ACTIONS
|
|
38
|
-
|
|
39
|
-
1. swarm_status(epic_id='mjkw81rkq4c', project_key='/path')
|
|
40
|
-
2. swarmmail_inbox()
|
|
41
|
-
|
|
42
|
-
## FORBIDDEN TOOLS
|
|
43
|
-
|
|
44
|
-
NEVER use these tools - delegate to workers:
|
|
45
|
-
- edit (file modifications)
|
|
46
|
-
- write (file creation)
|
|
47
|
-
- BASH (shell commands for file mods)
|
|
48
|
-
- swarmmail_reserve (only workers)
|
|
49
|
-
- git commit (workers handle)
|
|
50
|
-
|
|
51
|
-
ALWAYS spawn workers for code changes.`,
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// Epic ID detection should work
|
|
55
|
-
const epicResult = scoreEpicIdSpecificity(prompt);
|
|
56
|
-
expect(epicResult.score).toBe(1.0);
|
|
57
|
-
|
|
58
|
-
// Actionability should detect swarm_status
|
|
59
|
-
const actionResult = scoreActionability(prompt);
|
|
60
|
-
expect(actionResult.score).toBe(1.0);
|
|
61
|
-
|
|
62
|
-
// Coordinator identity should detect ASCII + NEVER/ALWAYS
|
|
63
|
-
const identityResult = scoreCoordinatorIdentity(prompt);
|
|
64
|
-
expect(identityResult.score).toBe(1.0);
|
|
65
|
-
|
|
66
|
-
// Forbidden tools should detect all 5 despite mixed case
|
|
67
|
-
const forbiddenResult = scoreForbiddenToolsPresent(prompt);
|
|
68
|
-
expect(forbiddenResult.score).toBe(1.0);
|
|
69
|
-
expect(forbiddenResult.message).toContain("All 5");
|
|
70
|
-
|
|
71
|
-
// Post-compaction discipline should detect swarm_status as first tool
|
|
72
|
-
const disciplineResult = scorePostCompactionDiscipline(prompt);
|
|
73
|
-
expect(disciplineResult.score).toBe(1.0);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test("forbidden tools scorer detects lowercase tool names", () => {
|
|
77
|
-
// Previously failed before /i flags were added
|
|
78
|
-
const prompt: CompactionPrompt = {
|
|
79
|
-
content: `Don't use: edit, write, bash, swarmmail_reserve, git commit`,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
83
|
-
|
|
84
|
-
// Should detect all 5 tools regardless of case
|
|
85
|
-
expect(result.score).toBe(1.0);
|
|
86
|
-
expect(result.message).toContain("All 5");
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test("forbidden tools scorer detects UPPERCASE tool names", () => {
|
|
90
|
-
const prompt: CompactionPrompt = {
|
|
91
|
-
content: `Forbidden: EDIT, WRITE, BASH, swarmmail_reserve, git commit`,
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
95
|
-
|
|
96
|
-
expect(result.score).toBe(1.0);
|
|
97
|
-
expect(result.message).toContain("All 5");
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test("post-compaction discipline detects mixed-case first tools", () => {
|
|
101
|
-
const testCases = [
|
|
102
|
-
{ tool: "EDIT", shouldPass: false },
|
|
103
|
-
{ tool: "edit", shouldPass: false },
|
|
104
|
-
{ tool: "Edit", shouldPass: false },
|
|
105
|
-
{ tool: "WRITE", shouldPass: false },
|
|
106
|
-
{ tool: "write", shouldPass: false },
|
|
107
|
-
{ tool: "READ", shouldPass: false },
|
|
108
|
-
{ tool: "read", shouldPass: false },
|
|
109
|
-
{ tool: "swarm_status", shouldPass: true },
|
|
110
|
-
{ tool: "SWARM_STATUS", shouldPass: true },
|
|
111
|
-
{ tool: "swarmmail_inbox", shouldPass: true },
|
|
112
|
-
];
|
|
113
|
-
|
|
114
|
-
for (const { tool, shouldPass } of testCases) {
|
|
115
|
-
const prompt: CompactionPrompt = {
|
|
116
|
-
content: `1. ${tool}()`,
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
120
|
-
|
|
121
|
-
if (shouldPass) {
|
|
122
|
-
expect(result.score).toBe(1.0);
|
|
123
|
-
} else {
|
|
124
|
-
expect(result.score).toBe(0.0);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe("epicIdSpecificity scorer", () => {
|
|
131
|
-
test("scores 1.0 for real epic IDs", () => {
|
|
132
|
-
const prompt: CompactionPrompt = {
|
|
133
|
-
content: "Continue coordinating epic mjkw81rkq4c",
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const result = scoreEpicIdSpecificity(prompt);
|
|
137
|
-
|
|
138
|
-
expect(result.score).toBe(1.0);
|
|
139
|
-
expect(result.message).toContain("real epic ID");
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
test("scores 0.0 for placeholder IDs like <epic-id>", () => {
|
|
143
|
-
const prompt: CompactionPrompt = {
|
|
144
|
-
content: "Continue coordinating epic <epic-id>",
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const result = scoreEpicIdSpecificity(prompt);
|
|
148
|
-
|
|
149
|
-
expect(result.score).toBe(0.0);
|
|
150
|
-
expect(result.message).toContain("placeholder");
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
test("scores 0.0 for bd-xxx placeholders", () => {
|
|
154
|
-
const prompt: CompactionPrompt = {
|
|
155
|
-
content: "Check status of bd-xxx",
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
const result = scoreEpicIdSpecificity(prompt);
|
|
159
|
-
|
|
160
|
-
expect(result.score).toBe(0.0);
|
|
161
|
-
expect(result.message).toContain("placeholder");
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test("scores 0.0 for generic <path> placeholders", () => {
|
|
165
|
-
const prompt: CompactionPrompt = {
|
|
166
|
-
content: "Project at <path>",
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const result = scoreEpicIdSpecificity(prompt);
|
|
170
|
-
|
|
171
|
-
expect(result.score).toBe(0.0);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
test("scores 0.0 when no epic ID found", () => {
|
|
175
|
-
const prompt: CompactionPrompt = {
|
|
176
|
-
content: "Continue working on the task",
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const result = scoreEpicIdSpecificity(prompt);
|
|
180
|
-
|
|
181
|
-
expect(result.score).toBe(0.0);
|
|
182
|
-
expect(result.message).toContain("No epic ID");
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
describe("actionability scorer", () => {
|
|
187
|
-
test("scores 1.0 when swarm_status has real epic ID", () => {
|
|
188
|
-
const prompt: CompactionPrompt = {
|
|
189
|
-
content: `First action:
|
|
190
|
-
swarm_status(epic_id='mjkw81rkq4c', project_key='/path/to/project')`,
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const result = scoreActionability(prompt);
|
|
194
|
-
|
|
195
|
-
expect(result.score).toBe(1.0);
|
|
196
|
-
expect(result.message).toContain("actionable tool call");
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
test("scores 1.0 when swarmmail_inbox is present", () => {
|
|
200
|
-
const prompt: CompactionPrompt = {
|
|
201
|
-
content: `Check messages:
|
|
202
|
-
swarmmail_inbox()`,
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
const result = scoreActionability(prompt);
|
|
206
|
-
|
|
207
|
-
expect(result.score).toBe(1.0);
|
|
208
|
-
expect(result.message).toContain("actionable tool call");
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
test("scores 0.0 for generic instructions without tool calls", () => {
|
|
212
|
-
const prompt: CompactionPrompt = {
|
|
213
|
-
content: "Check the status of workers and review progress",
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
const result = scoreActionability(prompt);
|
|
217
|
-
|
|
218
|
-
expect(result.score).toBe(0.0);
|
|
219
|
-
expect(result.message).toContain("No actionable");
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
test("scores 0.0 for swarm_status with placeholders", () => {
|
|
223
|
-
const prompt: CompactionPrompt = {
|
|
224
|
-
content: `swarm_status(epic_id='<epic-id>', project_key='<path>')`,
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
const result = scoreActionability(prompt);
|
|
228
|
-
|
|
229
|
-
expect(result.score).toBe(0.0);
|
|
230
|
-
expect(result.message).toContain("placeholder");
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
describe("coordinatorIdentity scorer", () => {
|
|
235
|
-
test("scores 1.0 with ASCII header and strong mandates", () => {
|
|
236
|
-
const prompt: CompactionPrompt = {
|
|
237
|
-
content: `┌─────────────────────────────────────────┐
|
|
238
|
-
│ YOU ARE THE COORDINATOR │
|
|
239
|
-
│ │
|
|
240
|
-
│ NEVER spawn workers yourself │
|
|
241
|
-
│ ALWAYS review worker output │
|
|
242
|
-
└─────────────────────────────────────────┘
|
|
243
|
-
|
|
244
|
-
Continue coordinating the swarm.`,
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
const result = scoreCoordinatorIdentity(prompt);
|
|
248
|
-
|
|
249
|
-
expect(result.score).toBe(1.0);
|
|
250
|
-
expect(result.message).toContain("ASCII header");
|
|
251
|
-
expect(result.message).toContain("strong mandates");
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
test("scores 0.5 with ASCII header but weak language", () => {
|
|
255
|
-
const prompt: CompactionPrompt = {
|
|
256
|
-
content: `┌─────────────────────────────────────────┐
|
|
257
|
-
│ COORDINATOR MODE │
|
|
258
|
-
└─────────────────────────────────────────┘
|
|
259
|
-
|
|
260
|
-
You should consider delegating work.`,
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
const result = scoreCoordinatorIdentity(prompt);
|
|
264
|
-
|
|
265
|
-
expect(result.score).toBe(0.5);
|
|
266
|
-
expect(result.message).toContain("weak language");
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
test("scores 0.0 without ASCII header", () => {
|
|
270
|
-
const prompt: CompactionPrompt = {
|
|
271
|
-
content: `You are the coordinator. NEVER do work directly. ALWAYS delegate.`,
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
const result = scoreCoordinatorIdentity(prompt);
|
|
275
|
-
|
|
276
|
-
expect(result.score).toBe(0.0);
|
|
277
|
-
expect(result.message).toContain("No ASCII header");
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
describe("forbiddenToolsPresent scorer", () => {
|
|
282
|
-
test("scores 1.0 when all forbidden tools listed", () => {
|
|
283
|
-
const prompt: CompactionPrompt = {
|
|
284
|
-
content: `🚫 FORBIDDEN TOOLS - NEVER call these:
|
|
285
|
-
- Edit (use swarm_spawn_subtask)
|
|
286
|
-
- Write (use swarm_spawn_subtask)
|
|
287
|
-
- swarmmail_reserve (only workers reserve)
|
|
288
|
-
- git commit (workers commit)
|
|
289
|
-
- bash (for file modifications)`,
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
293
|
-
|
|
294
|
-
expect(result.score).toBe(1.0);
|
|
295
|
-
expect(result.message).toContain("All 5 forbidden tools");
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
test("scores 0.6 when 3 out of 5 tools listed", () => {
|
|
299
|
-
const prompt: CompactionPrompt = {
|
|
300
|
-
content: `🚫 FORBIDDEN TOOLS:
|
|
301
|
-
- Edit
|
|
302
|
-
- Write
|
|
303
|
-
- swarmmail_reserve`,
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
307
|
-
|
|
308
|
-
expect(result.score).toBe(0.6);
|
|
309
|
-
expect(result.message).toContain("3/5");
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
test("scores 0.4 when 2 out of 5 tools listed", () => {
|
|
313
|
-
const prompt: CompactionPrompt = {
|
|
314
|
-
content: `Don't use Edit or Write directly.`,
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
318
|
-
|
|
319
|
-
expect(result.score).toBe(0.4);
|
|
320
|
-
expect(result.message).toContain("2/5");
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
test("scores 0.0 when no forbidden tools listed", () => {
|
|
324
|
-
const prompt: CompactionPrompt = {
|
|
325
|
-
content: "Continue coordinating the epic",
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
329
|
-
|
|
330
|
-
expect(result.score).toBe(0.0);
|
|
331
|
-
expect(result.message).toContain("0/5");
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
test("scores 1.0 with lowercase forbidden tools (case-insensitive)", () => {
|
|
335
|
-
const prompt: CompactionPrompt = {
|
|
336
|
-
content: `🚫 FORBIDDEN TOOLS - NEVER call these:
|
|
337
|
-
- edit (use swarm_spawn_subtask)
|
|
338
|
-
- write (use swarm_spawn_subtask)
|
|
339
|
-
- swarmmail_reserve (only workers reserve)
|
|
340
|
-
- git commit (workers commit)
|
|
341
|
-
- bash (for file modifications)`,
|
|
342
|
-
};
|
|
343
|
-
|
|
344
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
345
|
-
|
|
346
|
-
expect(result.score).toBe(1.0);
|
|
347
|
-
expect(result.message).toContain("All 5 forbidden tools");
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
test("scores correctly with mixed case forbidden tools", () => {
|
|
351
|
-
const prompt: CompactionPrompt = {
|
|
352
|
-
content: `Avoid: edit, Write, BASH`,
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
const result = scoreForbiddenToolsPresent(prompt);
|
|
356
|
-
|
|
357
|
-
expect(result.score).toBe(0.6);
|
|
358
|
-
expect(result.message).toContain("3/5");
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
describe("postCompactionDiscipline scorer", () => {
|
|
363
|
-
test("scores 1.0 when first tool is swarm_status", () => {
|
|
364
|
-
const prompt: CompactionPrompt = {
|
|
365
|
-
content: `Resume coordination:
|
|
366
|
-
|
|
367
|
-
1. swarm_status(epic_id='mjkw81rkq4c')
|
|
368
|
-
2. Check inbox
|
|
369
|
-
3. Review progress`,
|
|
370
|
-
};
|
|
371
|
-
|
|
372
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
373
|
-
|
|
374
|
-
expect(result.score).toBe(1.0);
|
|
375
|
-
expect(result.message).toContain("swarm_status");
|
|
376
|
-
expect(result.message).toContain("correct");
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
test("scores 1.0 when first tool is swarmmail_inbox", () => {
|
|
380
|
-
const prompt: CompactionPrompt = {
|
|
381
|
-
content: `Next steps:
|
|
382
|
-
1. swarmmail_inbox()
|
|
383
|
-
2. Review messages`,
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
387
|
-
|
|
388
|
-
expect(result.score).toBe(1.0);
|
|
389
|
-
expect(result.message).toContain("inbox");
|
|
390
|
-
expect(result.message).toContain("correct");
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
test("scores 0.0 when first tool is Edit", () => {
|
|
394
|
-
const prompt: CompactionPrompt = {
|
|
395
|
-
content: `Resume:
|
|
396
|
-
1. Edit(file='src/auth.ts', ...)
|
|
397
|
-
2. Check status`,
|
|
398
|
-
};
|
|
399
|
-
|
|
400
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
401
|
-
|
|
402
|
-
expect(result.score).toBe(0.0);
|
|
403
|
-
expect(result.message).toContain("Edit");
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
test("scores 0.0 when first tool is Write", () => {
|
|
407
|
-
const prompt: CompactionPrompt = {
|
|
408
|
-
content: `1. Write(file='README.md', ...)`,
|
|
409
|
-
};
|
|
410
|
-
|
|
411
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
412
|
-
|
|
413
|
-
expect(result.score).toBe(0.0);
|
|
414
|
-
expect(result.message).toContain("Write");
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
test("scores 0.0 when first tool is Read", () => {
|
|
418
|
-
const prompt: CompactionPrompt = {
|
|
419
|
-
content: `1. Read(file='src/index.ts')
|
|
420
|
-
2. swarm_status()`,
|
|
421
|
-
};
|
|
422
|
-
|
|
423
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
424
|
-
|
|
425
|
-
expect(result.score).toBe(0.0);
|
|
426
|
-
expect(result.message).toContain("Read");
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
test("scores 0.0 when no tool calls mentioned", () => {
|
|
430
|
-
const prompt: CompactionPrompt = {
|
|
431
|
-
content: "Continue coordinating the epic",
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
435
|
-
|
|
436
|
-
expect(result.score).toBe(0.0);
|
|
437
|
-
expect(result.message).toContain("No tool");
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
test("scores 0.0 when first tool is lowercase 'read' (case-insensitive)", () => {
|
|
441
|
-
const prompt: CompactionPrompt = {
|
|
442
|
-
content: `1. read(file='src/index.ts')
|
|
443
|
-
2. swarm_status()`,
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
447
|
-
|
|
448
|
-
expect(result.score).toBe(0.0);
|
|
449
|
-
expect(result.message).toContain("read");
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
test("scores 0.0 when first tool is lowercase 'edit'", () => {
|
|
453
|
-
const prompt: CompactionPrompt = {
|
|
454
|
-
content: `1. edit(file='src/auth.ts', ...)
|
|
455
|
-
2. swarm_status()`,
|
|
456
|
-
};
|
|
457
|
-
|
|
458
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
459
|
-
|
|
460
|
-
expect(result.score).toBe(0.0);
|
|
461
|
-
expect(result.message).toContain("edit");
|
|
462
|
-
});
|
|
463
|
-
|
|
464
|
-
test("scores 0.0 when first tool is lowercase 'write'", () => {
|
|
465
|
-
const prompt: CompactionPrompt = {
|
|
466
|
-
content: `1. write(file='README.md', content='...')
|
|
467
|
-
2. swarm_status()`,
|
|
468
|
-
};
|
|
469
|
-
|
|
470
|
-
const result = scorePostCompactionDiscipline(prompt);
|
|
471
|
-
|
|
472
|
-
expect(result.score).toBe(0.0);
|
|
473
|
-
expect(result.message).toContain("write");
|
|
474
|
-
});
|
|
475
|
-
});
|