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,285 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for swarm review feedback flow
|
|
3
|
-
*
|
|
4
|
-
* Tests the coordinator review feedback workflow with real HiveAdapter and swarm-mail.
|
|
5
|
-
* Verifies that review approval/rejection properly updates state.
|
|
6
|
-
*
|
|
7
|
-
* **ARCHITECTURE**: Coordinator-driven retry pattern (swarm_spawn_retry)
|
|
8
|
-
* - `approved` status: Sends message to worker (worker can complete)
|
|
9
|
-
* - `needs_changes` status: NO message sent (worker is dead, coordinator spawns retry)
|
|
10
|
-
* - After 3 rejections: Task marked blocked, NO message sent
|
|
11
|
-
*
|
|
12
|
-
* This aligns with the "worker is dead" philosophy - failed reviews require coordinator
|
|
13
|
-
* intervention via swarm_spawn_retry, not worker self-retry.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
17
|
-
import { join } from "node:path";
|
|
18
|
-
import { mkdirSync, rmSync } from "node:fs";
|
|
19
|
-
import { tmpdir } from "node:os";
|
|
20
|
-
import {
|
|
21
|
-
type SwarmMailAdapter,
|
|
22
|
-
clearAdapterCache,
|
|
23
|
-
getSwarmMailLibSQL,
|
|
24
|
-
} from "swarm-mail";
|
|
25
|
-
import {
|
|
26
|
-
getHiveAdapter,
|
|
27
|
-
hive_create,
|
|
28
|
-
setHiveWorkingDirectory,
|
|
29
|
-
} from "./hive";
|
|
30
|
-
import { swarm_review, swarm_review_feedback } from "./swarm-review";
|
|
31
|
-
|
|
32
|
-
const mockContext = {
|
|
33
|
-
sessionID: `test-review-integration-${Date.now()}`,
|
|
34
|
-
messageID: `test-message-${Date.now()}`,
|
|
35
|
-
agent: "test-coordinator",
|
|
36
|
-
abort: new AbortController().signal,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
describe("swarm_review integration", () => {
|
|
40
|
-
let testProjectPath: string;
|
|
41
|
-
let swarmMail: SwarmMailAdapter;
|
|
42
|
-
|
|
43
|
-
beforeEach(async () => {
|
|
44
|
-
// Create temp project directory
|
|
45
|
-
testProjectPath = join(tmpdir(), `swarm-review-test-${Date.now()}`);
|
|
46
|
-
mkdirSync(testProjectPath, { recursive: true });
|
|
47
|
-
|
|
48
|
-
// Initialize swarm-mail with file-based database
|
|
49
|
-
// (in-memory doesn't work with sendSwarmMessage's auto-adapter creation)
|
|
50
|
-
swarmMail = await getSwarmMailLibSQL(testProjectPath);
|
|
51
|
-
|
|
52
|
-
// Set hive working directory so hive tools work
|
|
53
|
-
setHiveWorkingDirectory(testProjectPath);
|
|
54
|
-
|
|
55
|
-
// Register coordinator and worker agents
|
|
56
|
-
await swarmMail.registerAgent(testProjectPath, "coordinator", {
|
|
57
|
-
program: "test",
|
|
58
|
-
model: "test-model",
|
|
59
|
-
});
|
|
60
|
-
await swarmMail.registerAgent(testProjectPath, "TestWorker", {
|
|
61
|
-
program: "test",
|
|
62
|
-
model: "test-model",
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
afterEach(async () => {
|
|
67
|
-
// Clean up
|
|
68
|
-
await swarmMail.close();
|
|
69
|
-
clearAdapterCache();
|
|
70
|
-
rmSync(testProjectPath, { recursive: true, force: true });
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test("review approved flow", async () => {
|
|
74
|
-
// Setup: create epic + subtask via hive tools
|
|
75
|
-
const epicResult = await hive_create.execute(
|
|
76
|
-
{
|
|
77
|
-
title: "Test Epic",
|
|
78
|
-
type: "epic",
|
|
79
|
-
priority: 1,
|
|
80
|
-
},
|
|
81
|
-
mockContext
|
|
82
|
-
);
|
|
83
|
-
const epic = JSON.parse(epicResult);
|
|
84
|
-
|
|
85
|
-
const subtaskResult = await hive_create.execute(
|
|
86
|
-
{
|
|
87
|
-
title: "Test Subtask",
|
|
88
|
-
type: "task",
|
|
89
|
-
priority: 2,
|
|
90
|
-
parent_id: epic.id,
|
|
91
|
-
},
|
|
92
|
-
mockContext
|
|
93
|
-
);
|
|
94
|
-
const subtask = JSON.parse(subtaskResult);
|
|
95
|
-
|
|
96
|
-
// Call swarm_review to generate review prompt
|
|
97
|
-
const reviewResult = await swarm_review.execute(
|
|
98
|
-
{
|
|
99
|
-
project_key: testProjectPath,
|
|
100
|
-
epic_id: epic.id,
|
|
101
|
-
task_id: subtask.id,
|
|
102
|
-
files_touched: ["test.ts"],
|
|
103
|
-
},
|
|
104
|
-
mockContext
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
const reviewParsed = JSON.parse(reviewResult);
|
|
108
|
-
expect(reviewParsed).toHaveProperty("review_prompt");
|
|
109
|
-
expect(reviewParsed.context.epic_id).toBe(epic.id);
|
|
110
|
-
expect(reviewParsed.context.task_id).toBe(subtask.id);
|
|
111
|
-
expect(reviewParsed.context.remaining_attempts).toBe(3);
|
|
112
|
-
|
|
113
|
-
// Call swarm_review_feedback with status="approved"
|
|
114
|
-
const feedbackResult = await swarm_review_feedback.execute(
|
|
115
|
-
{
|
|
116
|
-
project_key: testProjectPath,
|
|
117
|
-
task_id: subtask.id,
|
|
118
|
-
worker_id: "TestWorker",
|
|
119
|
-
status: "approved",
|
|
120
|
-
summary: "Looks good, clean implementation",
|
|
121
|
-
},
|
|
122
|
-
mockContext
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
const feedbackParsed = JSON.parse(feedbackResult);
|
|
126
|
-
expect(feedbackParsed.success).toBe(true);
|
|
127
|
-
expect(feedbackParsed.status).toBe("approved");
|
|
128
|
-
expect(feedbackParsed.task_id).toBe(subtask.id);
|
|
129
|
-
|
|
130
|
-
// Verify message was sent to worker
|
|
131
|
-
const messages = await swarmMail.getInbox(
|
|
132
|
-
testProjectPath,
|
|
133
|
-
"TestWorker",
|
|
134
|
-
{ limit: 10 }
|
|
135
|
-
);
|
|
136
|
-
expect(messages.length).toBeGreaterThan(0);
|
|
137
|
-
|
|
138
|
-
const approvalMessage = messages.find((m) =>
|
|
139
|
-
m.subject.includes("APPROVED")
|
|
140
|
-
);
|
|
141
|
-
expect(approvalMessage).toBeDefined();
|
|
142
|
-
expect(approvalMessage?.subject).toContain(subtask.id);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("review needs_changes flow", async () => {
|
|
146
|
-
// Setup: create epic + subtask
|
|
147
|
-
const epicResult = await hive_create.execute(
|
|
148
|
-
{
|
|
149
|
-
title: "Test Epic",
|
|
150
|
-
type: "epic",
|
|
151
|
-
priority: 1,
|
|
152
|
-
},
|
|
153
|
-
mockContext
|
|
154
|
-
);
|
|
155
|
-
const epic = JSON.parse(epicResult);
|
|
156
|
-
|
|
157
|
-
const subtaskResult = await hive_create.execute(
|
|
158
|
-
{
|
|
159
|
-
title: "Test Subtask",
|
|
160
|
-
type: "task",
|
|
161
|
-
priority: 2,
|
|
162
|
-
parent_id: epic.id,
|
|
163
|
-
},
|
|
164
|
-
mockContext
|
|
165
|
-
);
|
|
166
|
-
const subtask = JSON.parse(subtaskResult);
|
|
167
|
-
|
|
168
|
-
// Call swarm_review_feedback with status="needs_changes"
|
|
169
|
-
const issues = [
|
|
170
|
-
{
|
|
171
|
-
file: "src/auth.ts",
|
|
172
|
-
line: 42,
|
|
173
|
-
issue: "Missing null check",
|
|
174
|
-
suggestion: "Add if (!token) return null",
|
|
175
|
-
},
|
|
176
|
-
];
|
|
177
|
-
|
|
178
|
-
const feedbackResult = await swarm_review_feedback.execute(
|
|
179
|
-
{
|
|
180
|
-
project_key: testProjectPath,
|
|
181
|
-
task_id: subtask.id,
|
|
182
|
-
worker_id: "TestWorker",
|
|
183
|
-
status: "needs_changes",
|
|
184
|
-
issues: JSON.stringify(issues),
|
|
185
|
-
},
|
|
186
|
-
mockContext
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
const feedbackParsed = JSON.parse(feedbackResult);
|
|
190
|
-
expect(feedbackParsed.success).toBe(true);
|
|
191
|
-
expect(feedbackParsed.status).toBe("needs_changes");
|
|
192
|
-
expect(feedbackParsed.attempt).toBe(1);
|
|
193
|
-
expect(feedbackParsed.remaining_attempts).toBe(2);
|
|
194
|
-
|
|
195
|
-
// Verify retry_context is provided for coordinator to spawn retry
|
|
196
|
-
expect(feedbackParsed.retry_context).toBeDefined();
|
|
197
|
-
expect(feedbackParsed.retry_context.task_id).toBe(subtask.id);
|
|
198
|
-
expect(feedbackParsed.retry_context.attempt).toBe(1);
|
|
199
|
-
expect(feedbackParsed.retry_context.max_attempts).toBe(3);
|
|
200
|
-
expect(feedbackParsed.retry_context.issues).toEqual(issues);
|
|
201
|
-
expect(feedbackParsed.retry_context.next_action).toContain("swarm_spawn_retry");
|
|
202
|
-
|
|
203
|
-
// ARCHITECTURE CHANGE: No longer sends message to worker
|
|
204
|
-
// Worker is considered "dead" - coordinator must spawn retry
|
|
205
|
-
// Inbox should remain empty
|
|
206
|
-
const messages = await swarmMail.getInbox(
|
|
207
|
-
testProjectPath,
|
|
208
|
-
"TestWorker",
|
|
209
|
-
{ limit: 10 }
|
|
210
|
-
);
|
|
211
|
-
expect(messages.length).toBe(0);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
test("3-strike rule: task marked blocked after 3 rejections", async () => {
|
|
215
|
-
// Setup: create epic + subtask
|
|
216
|
-
const epicResult = await hive_create.execute(
|
|
217
|
-
{
|
|
218
|
-
title: "Test Epic",
|
|
219
|
-
type: "epic",
|
|
220
|
-
priority: 1,
|
|
221
|
-
},
|
|
222
|
-
mockContext
|
|
223
|
-
);
|
|
224
|
-
const epic = JSON.parse(epicResult);
|
|
225
|
-
|
|
226
|
-
const subtaskResult = await hive_create.execute(
|
|
227
|
-
{
|
|
228
|
-
title: "Test Subtask",
|
|
229
|
-
type: "task",
|
|
230
|
-
priority: 2,
|
|
231
|
-
parent_id: epic.id,
|
|
232
|
-
},
|
|
233
|
-
mockContext
|
|
234
|
-
);
|
|
235
|
-
const subtask = JSON.parse(subtaskResult);
|
|
236
|
-
|
|
237
|
-
const issues = [
|
|
238
|
-
{
|
|
239
|
-
file: "src/test.ts",
|
|
240
|
-
issue: "Still broken",
|
|
241
|
-
},
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
// Exhaust all 3 attempts
|
|
245
|
-
for (let i = 1; i <= 3; i++) {
|
|
246
|
-
const feedbackResult = await swarm_review_feedback.execute(
|
|
247
|
-
{
|
|
248
|
-
project_key: testProjectPath,
|
|
249
|
-
task_id: subtask.id,
|
|
250
|
-
worker_id: "TestWorker",
|
|
251
|
-
status: "needs_changes",
|
|
252
|
-
issues: JSON.stringify(issues),
|
|
253
|
-
},
|
|
254
|
-
mockContext
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
const feedbackParsed = JSON.parse(feedbackResult);
|
|
258
|
-
expect(feedbackParsed.success).toBe(true);
|
|
259
|
-
expect(feedbackParsed.status).toBe("needs_changes");
|
|
260
|
-
expect(feedbackParsed.attempt).toBe(i);
|
|
261
|
-
expect(feedbackParsed.remaining_attempts).toBe(3 - i);
|
|
262
|
-
|
|
263
|
-
if (i === 3) {
|
|
264
|
-
// Last attempt should mark task as failed
|
|
265
|
-
expect(feedbackParsed.task_failed).toBe(true);
|
|
266
|
-
expect(feedbackParsed.remaining_attempts).toBe(0);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Verify task was marked as blocked in hive
|
|
271
|
-
const hive = await getHiveAdapter(testProjectPath);
|
|
272
|
-
const updatedCell = await hive.getCell(testProjectPath, subtask.id);
|
|
273
|
-
expect(updatedCell?.status).toBe("blocked");
|
|
274
|
-
|
|
275
|
-
// ARCHITECTURE CHANGE: No longer sends failure message
|
|
276
|
-
// Worker is dead, coordinator handles escalation
|
|
277
|
-
// Inbox should remain empty
|
|
278
|
-
const messages = await swarmMail.getInbox(
|
|
279
|
-
testProjectPath,
|
|
280
|
-
"TestWorker",
|
|
281
|
-
{ limit: 10 }
|
|
282
|
-
);
|
|
283
|
-
expect(messages.length).toBe(0);
|
|
284
|
-
});
|
|
285
|
-
});
|