claude-flow-novice 2.5.2 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/CLAUDE.md +740 -978
- package/.claude/agents/core-agents/cost-savings-cfn-loop-coordinator.md +47 -2
- package/.claude/agents/custom/agent-builder.md +637 -0
- package/.claude/api-configs/config-current-zai-config.env +62 -0
- package/.claude/api-configs/config-test-zai-config.env +62 -0
- package/.claude/api-configs/env-backups/before-anthropic-20251020-025404.env +62 -0
- package/.claude/api-configs/env-backups/before-restore-20251020-025431.env +62 -0
- package/.claude/artifacts/reflection-merge-logs/cli-agent-spawning-v2.5.2-merge-report.md +61 -0
- package/.claude/commands/cfn-loop-epic.md +41 -17
- package/.claude/commands/cfn-loop.md +43 -30
- package/.claude/commands/custom-routing-activate.md +37 -123
- package/.claude/commands/custom-routing-deactivate.md +27 -124
- package/.claude/commands/switch-api.md +41 -16
- package/.claude/skills/agent-execution/execute-agent.sh +126 -0
- package/.claude/skills/redis-coordination/AGENT_LOGGING.md +280 -0
- package/.claude/skills/redis-coordination/agent-log.sh +124 -0
- package/.claude/skills/redis-coordination/init-swarm.sh +6 -1
- package/.claude/skills/redis-coordination/invoke-waiting-mode.sh +62 -5
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh +68 -8
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-1760949407 +933 -0
- package/.claude/skills/redis-coordination/store-epic-context.sh +123 -0
- package/.claude/skills/redis-coordination/test-iteration-feedback.sh +320 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/CLAUDE.md +76 -2
- package/dist/cli/agent-command.js +151 -0
- package/dist/cli/agent-command.js.map +1 -0
- package/dist/cli/agent-definition-parser.js +176 -0
- package/dist/cli/agent-definition-parser.js.map +1 -0
- package/dist/cli/agent-executor.js +176 -0
- package/dist/cli/agent-executor.js.map +1 -0
- package/dist/cli/agent-prompt-builder.js +188 -0
- package/dist/cli/agent-prompt-builder.js.map +1 -0
- package/dist/cli/agent-spawn.js +46 -1
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/anthropic-client.js +242 -0
- package/dist/cli/anthropic-client.js.map +1 -0
- package/dist/cli/cli-agent-context.js +353 -0
- package/dist/cli/cli-agent-context.js.map +1 -0
- package/dist/cli/cli-agent-context.test.js +451 -0
- package/dist/cli/cli-agent-context.test.js.map +1 -0
- package/dist/cli/index.js +115 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/iteration-history.js +188 -0
- package/dist/cli/iteration-history.js.map +1 -0
- package/package.json +3 -1
- package/scripts/switch-api.sh +233 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
##############################################################################
|
|
4
|
+
# Store Epic Context in Redis
|
|
5
|
+
# Stores epic-level context for CLI-spawned agents to access
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# ./store-epic-context.sh --task-id <id> \
|
|
9
|
+
# --epic-context <json> \
|
|
10
|
+
# [--phase-context <json>] \
|
|
11
|
+
# [--success-criteria <json>] \
|
|
12
|
+
# [--ttl <seconds>]
|
|
13
|
+
#
|
|
14
|
+
# Example:
|
|
15
|
+
# ./store-epic-context.sh --task-id "epic-auth-123" \
|
|
16
|
+
# --epic-context '{
|
|
17
|
+
# "epicGoal": "Build authentication system",
|
|
18
|
+
# "inScope": ["JWT auth", "RBAC", "Session management"],
|
|
19
|
+
# "outOfScope": ["OAuth", "MFA", "Biometrics"],
|
|
20
|
+
# "phases": ["assessment", "implementation", "validation"]
|
|
21
|
+
# }' \
|
|
22
|
+
# --phase-context '{
|
|
23
|
+
# "currentPhase": "assessment",
|
|
24
|
+
# "dependencies": [],
|
|
25
|
+
# "deliverables": ["Requirements doc", "Architecture design"]
|
|
26
|
+
# }' \
|
|
27
|
+
# --success-criteria '{
|
|
28
|
+
# "acceptanceCriteria": [
|
|
29
|
+
# "Core functionality implemented",
|
|
30
|
+
# "Tests pass >80% coverage",
|
|
31
|
+
# "Security review complete"
|
|
32
|
+
# ],
|
|
33
|
+
# "gateThreshold": 0.75,
|
|
34
|
+
# "consensusThreshold": 0.90
|
|
35
|
+
# }' \
|
|
36
|
+
# --ttl 86400
|
|
37
|
+
#
|
|
38
|
+
# Redis Keys Created:
|
|
39
|
+
# - swarm:<task-id>:epic-context
|
|
40
|
+
# - swarm:<task-id>:phase-context
|
|
41
|
+
# - swarm:<task-id>:success-criteria
|
|
42
|
+
#
|
|
43
|
+
# These keys are automatically read by cfn-spawn and injected as environment
|
|
44
|
+
# variables into spawned agents:
|
|
45
|
+
# - EPIC_CONTEXT
|
|
46
|
+
# - PHASE_CONTEXT
|
|
47
|
+
# - SUCCESS_CRITERIA
|
|
48
|
+
##############################################################################
|
|
49
|
+
|
|
50
|
+
set -euo pipefail
|
|
51
|
+
|
|
52
|
+
# Configuration
|
|
53
|
+
TASK_ID=""
|
|
54
|
+
EPIC_CONTEXT=""
|
|
55
|
+
PHASE_CONTEXT=""
|
|
56
|
+
SUCCESS_CRITERIA=""
|
|
57
|
+
TTL=86400 # 24 hours default
|
|
58
|
+
|
|
59
|
+
# Parse arguments
|
|
60
|
+
while [[ $# -gt 0 ]]; do
|
|
61
|
+
case $1 in
|
|
62
|
+
--task-id)
|
|
63
|
+
TASK_ID="$2"
|
|
64
|
+
shift 2
|
|
65
|
+
;;
|
|
66
|
+
--epic-context)
|
|
67
|
+
EPIC_CONTEXT="$2"
|
|
68
|
+
shift 2
|
|
69
|
+
;;
|
|
70
|
+
--phase-context)
|
|
71
|
+
PHASE_CONTEXT="$2"
|
|
72
|
+
shift 2
|
|
73
|
+
;;
|
|
74
|
+
--success-criteria)
|
|
75
|
+
SUCCESS_CRITERIA="$2"
|
|
76
|
+
shift 2
|
|
77
|
+
;;
|
|
78
|
+
--ttl)
|
|
79
|
+
TTL="$2"
|
|
80
|
+
shift 2
|
|
81
|
+
;;
|
|
82
|
+
*)
|
|
83
|
+
echo "Unknown option: $1"
|
|
84
|
+
exit 1
|
|
85
|
+
;;
|
|
86
|
+
esac
|
|
87
|
+
done
|
|
88
|
+
|
|
89
|
+
# Validation
|
|
90
|
+
if [ -z "$TASK_ID" ]; then
|
|
91
|
+
echo "Error: --task-id is required"
|
|
92
|
+
exit 1
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
if [ -z "$EPIC_CONTEXT" ]; then
|
|
96
|
+
echo "Error: --epic-context is required"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# Store epic context
|
|
101
|
+
echo "Storing epic context for task: $TASK_ID"
|
|
102
|
+
|
|
103
|
+
if [ -n "$EPIC_CONTEXT" ]; then
|
|
104
|
+
redis-cli set "swarm:${TASK_ID}:epic-context" "$EPIC_CONTEXT" EX "$TTL" > /dev/null
|
|
105
|
+
echo " ✓ Epic context stored (TTL: ${TTL}s)"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
if [ -n "$PHASE_CONTEXT" ]; then
|
|
109
|
+
redis-cli set "swarm:${TASK_ID}:phase-context" "$PHASE_CONTEXT" EX "$TTL" > /dev/null
|
|
110
|
+
echo " ✓ Phase context stored (TTL: ${TTL}s)"
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
if [ -n "$SUCCESS_CRITERIA" ]; then
|
|
114
|
+
redis-cli set "swarm:${TASK_ID}:success-criteria" "$SUCCESS_CRITERIA" EX "$TTL" > /dev/null
|
|
115
|
+
echo " ✓ Success criteria stored (TTL: ${TTL}s)"
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
echo "✅ Context storage complete"
|
|
119
|
+
echo ""
|
|
120
|
+
echo "CLI-spawned agents will automatically receive this context via environment variables:"
|
|
121
|
+
echo " - EPIC_CONTEXT"
|
|
122
|
+
echo " - PHASE_CONTEXT"
|
|
123
|
+
echo " - SUCCESS_CRITERIA"
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Test Script: Iteration Feedback Mechanism
|
|
4
|
+
#
|
|
5
|
+
# Validates that:
|
|
6
|
+
# 1. Validators can report feedback with confidence scores
|
|
7
|
+
# 2. Orchestrator collects and aggregates feedback
|
|
8
|
+
# 3. Feedback is passed to Loop 3 agents via wake signal
|
|
9
|
+
# 4. Feedback is stored in Redis with TTL
|
|
10
|
+
# 5. Agents can read feedback for iteration N
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
TASK_ID="test-feedback-$(date +%s)"
|
|
16
|
+
|
|
17
|
+
echo "=========================================="
|
|
18
|
+
echo "Iteration Feedback Mechanism Test"
|
|
19
|
+
echo "=========================================="
|
|
20
|
+
echo "Task ID: $TASK_ID"
|
|
21
|
+
echo ""
|
|
22
|
+
|
|
23
|
+
# Cleanup function
|
|
24
|
+
cleanup() {
|
|
25
|
+
echo ""
|
|
26
|
+
echo "Cleaning up Redis keys..."
|
|
27
|
+
redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli del >/dev/null 2>&1 || true
|
|
28
|
+
echo "✅ Cleanup complete"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Register cleanup on exit
|
|
32
|
+
trap cleanup EXIT
|
|
33
|
+
|
|
34
|
+
# Test 1: Validators report confidence with feedback
|
|
35
|
+
echo "=== Test 1: Validators Report Feedback ==="
|
|
36
|
+
echo ""
|
|
37
|
+
|
|
38
|
+
VALIDATOR_1="reviewer-1"
|
|
39
|
+
VALIDATOR_2="tester-1"
|
|
40
|
+
VALIDATOR_3="security-1"
|
|
41
|
+
|
|
42
|
+
# Validator 1: Low confidence with specific feedback
|
|
43
|
+
echo "[$VALIDATOR_1] Reporting confidence 0.65 with 2 feedback items..."
|
|
44
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh report \
|
|
45
|
+
--task-id "$TASK_ID" \
|
|
46
|
+
--agent-id "$VALIDATOR_1" \
|
|
47
|
+
--confidence 0.65 \
|
|
48
|
+
--iteration 1 \
|
|
49
|
+
--feedback "Add error handling for null inputs,Improve documentation for API endpoints"
|
|
50
|
+
|
|
51
|
+
echo ""
|
|
52
|
+
|
|
53
|
+
# Validator 2: Medium confidence with 3 feedback items
|
|
54
|
+
echo "[$VALIDATOR_2] Reporting confidence 0.72 with 3 feedback items..."
|
|
55
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh report \
|
|
56
|
+
--task-id "$TASK_ID" \
|
|
57
|
+
--agent-id "$VALIDATOR_2" \
|
|
58
|
+
--confidence 0.72 \
|
|
59
|
+
--iteration 1 \
|
|
60
|
+
--feedback "Increase test coverage to 80%,Add edge case tests for empty arrays,Fix flaky timeout test"
|
|
61
|
+
|
|
62
|
+
echo ""
|
|
63
|
+
|
|
64
|
+
# Validator 3: Low confidence with security feedback
|
|
65
|
+
echo "[$VALIDATOR_3] Reporting confidence 0.60 with 2 feedback items..."
|
|
66
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh report \
|
|
67
|
+
--task-id "$TASK_ID" \
|
|
68
|
+
--agent-id "$VALIDATOR_3" \
|
|
69
|
+
--confidence 0.60 \
|
|
70
|
+
--iteration 1 \
|
|
71
|
+
--feedback "Fix SQL injection vulnerability in query builder,Add rate limiting to API endpoints"
|
|
72
|
+
|
|
73
|
+
echo ""
|
|
74
|
+
|
|
75
|
+
# Test 2: Collect feedback from validators
|
|
76
|
+
echo "=== Test 2: Orchestrator Collects Feedback ==="
|
|
77
|
+
echo ""
|
|
78
|
+
|
|
79
|
+
COLLECT_OUTPUT=$($SCRIPT_DIR/invoke-waiting-mode.sh collect \
|
|
80
|
+
--task-id "$TASK_ID" \
|
|
81
|
+
--agent-ids "$VALIDATOR_1,$VALIDATOR_2,$VALIDATOR_3")
|
|
82
|
+
|
|
83
|
+
echo "$COLLECT_OUTPUT"
|
|
84
|
+
echo ""
|
|
85
|
+
|
|
86
|
+
# Extract consensus and feedback
|
|
87
|
+
CONSENSUS=$(echo "$COLLECT_OUTPUT" | tail -1)
|
|
88
|
+
echo "Calculated Consensus: $CONSENSUS"
|
|
89
|
+
|
|
90
|
+
# Verify feedback aggregation
|
|
91
|
+
if echo "$COLLECT_OUTPUT" | grep -q "Aggregated Feedback"; then
|
|
92
|
+
echo "✅ Feedback aggregated successfully"
|
|
93
|
+
FEEDBACK_COUNT=$(echo "$COLLECT_OUTPUT" | grep -c '^\s*-' || echo "0")
|
|
94
|
+
echo " Total feedback items: $FEEDBACK_COUNT"
|
|
95
|
+
else
|
|
96
|
+
echo "❌ No aggregated feedback found"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
echo ""
|
|
101
|
+
|
|
102
|
+
# Test 3: Wake Loop 3 agent with validator feedback
|
|
103
|
+
echo "=== Test 3: Wake Loop 3 Agent with Feedback ==="
|
|
104
|
+
echo ""
|
|
105
|
+
|
|
106
|
+
LOOP3_AGENT="backend-dev"
|
|
107
|
+
|
|
108
|
+
# Extract aggregated feedback for passing to Loop 3
|
|
109
|
+
LOOP2_FEEDBACK=$(echo "$COLLECT_OUTPUT" | sed -n '/Aggregated Feedback/,/Consensus:/p' | grep '^\s*-' | sed 's/^\s*-\s*//' | paste -sd ',' -)
|
|
110
|
+
|
|
111
|
+
# Build full feedback message
|
|
112
|
+
FULL_FEEDBACK="Improve consensus from $CONSENSUS to >=0.90,$LOOP2_FEEDBACK"
|
|
113
|
+
|
|
114
|
+
echo "Waking $LOOP3_AGENT with comprehensive feedback..."
|
|
115
|
+
echo "Feedback items: $(echo "$FULL_FEEDBACK" | tr ',' '\n' | wc -l)"
|
|
116
|
+
echo ""
|
|
117
|
+
|
|
118
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh wake \
|
|
119
|
+
--task-id "$TASK_ID" \
|
|
120
|
+
--agent-id "$LOOP3_AGENT" \
|
|
121
|
+
--reason "cfn_loop_iteration" \
|
|
122
|
+
--iteration 2 \
|
|
123
|
+
--priority 30 \
|
|
124
|
+
--feedback "$FULL_FEEDBACK"
|
|
125
|
+
|
|
126
|
+
echo ""
|
|
127
|
+
|
|
128
|
+
# Test 4: Verify feedback stored in Redis
|
|
129
|
+
echo "=== Test 4: Verify Feedback Storage ==="
|
|
130
|
+
echo ""
|
|
131
|
+
|
|
132
|
+
FEEDBACK_KEY="swarm:${TASK_ID}:${LOOP3_AGENT}:feedback:iteration-2"
|
|
133
|
+
echo "Checking Redis key: $FEEDBACK_KEY"
|
|
134
|
+
|
|
135
|
+
STORED_FEEDBACK=$(redis-cli get "$FEEDBACK_KEY")
|
|
136
|
+
|
|
137
|
+
if [ -n "$STORED_FEEDBACK" ] && [ "$STORED_FEEDBACK" != "(nil)" ]; then
|
|
138
|
+
echo "✅ Feedback stored successfully"
|
|
139
|
+
echo ""
|
|
140
|
+
echo "Stored feedback (JSON array):"
|
|
141
|
+
echo "$STORED_FEEDBACK" | jq '.'
|
|
142
|
+
echo ""
|
|
143
|
+
|
|
144
|
+
# Verify TTL
|
|
145
|
+
TTL=$(redis-cli ttl "$FEEDBACK_KEY")
|
|
146
|
+
echo "TTL: $TTL seconds ($(echo "scale=1; $TTL / 3600" | bc) hours)"
|
|
147
|
+
|
|
148
|
+
if [ "$TTL" -gt 0 ] && [ "$TTL" -le 86400 ]; then
|
|
149
|
+
echo "✅ TTL is correct (≤24 hours)"
|
|
150
|
+
else
|
|
151
|
+
echo "❌ TTL is incorrect: $TTL"
|
|
152
|
+
exit 1
|
|
153
|
+
fi
|
|
154
|
+
else
|
|
155
|
+
echo "❌ Feedback not found in Redis"
|
|
156
|
+
exit 1
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
echo ""
|
|
160
|
+
|
|
161
|
+
# Test 5: Agent reads feedback
|
|
162
|
+
echo "=== Test 5: Agent Reads Feedback ==="
|
|
163
|
+
echo ""
|
|
164
|
+
|
|
165
|
+
echo "Simulating agent reading feedback from Redis..."
|
|
166
|
+
AGENT_FEEDBACK=$(redis-cli get "$FEEDBACK_KEY")
|
|
167
|
+
|
|
168
|
+
if [ -n "$AGENT_FEEDBACK" ] && [ "$AGENT_FEEDBACK" != "(nil)" ]; then
|
|
169
|
+
echo "✅ Agent successfully read feedback"
|
|
170
|
+
echo ""
|
|
171
|
+
echo "Feedback items available to agent:"
|
|
172
|
+
echo "$AGENT_FEEDBACK" | jq -r '.[]' | nl -w2 -s'. '
|
|
173
|
+
echo ""
|
|
174
|
+
|
|
175
|
+
ITEM_COUNT=$(echo "$AGENT_FEEDBACK" | jq '. | length')
|
|
176
|
+
echo "Total actionable items: $ITEM_COUNT"
|
|
177
|
+
else
|
|
178
|
+
echo "❌ Agent failed to read feedback"
|
|
179
|
+
exit 1
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
echo ""
|
|
183
|
+
|
|
184
|
+
# Test 6: Wake queue contains feedback
|
|
185
|
+
echo "=== Test 6: Verify Wake Queue Feedback ==="
|
|
186
|
+
echo ""
|
|
187
|
+
|
|
188
|
+
WAKE_QUEUE="swarm:${TASK_ID}:${LOOP3_AGENT}:wake-queue"
|
|
189
|
+
echo "Checking wake queue: $WAKE_QUEUE"
|
|
190
|
+
|
|
191
|
+
# Pop wake message from queue
|
|
192
|
+
WAKE_MSG=$(redis-cli ZPOPMIN "$WAKE_QUEUE" 1 | sed -n '1p')
|
|
193
|
+
|
|
194
|
+
if [ -n "$WAKE_MSG" ] && [ "$WAKE_MSG" != "(nil)" ]; then
|
|
195
|
+
echo "✅ Wake message found in queue"
|
|
196
|
+
echo ""
|
|
197
|
+
echo "Wake message contents:"
|
|
198
|
+
echo "$WAKE_MSG" | jq '.'
|
|
199
|
+
echo ""
|
|
200
|
+
|
|
201
|
+
# Verify feedback in wake message
|
|
202
|
+
WAKE_FEEDBACK=$(echo "$WAKE_MSG" | jq -r '.feedback[]' 2>/dev/null | head -3)
|
|
203
|
+
if [ -n "$WAKE_FEEDBACK" ]; then
|
|
204
|
+
echo "✅ Feedback included in wake message"
|
|
205
|
+
echo ""
|
|
206
|
+
echo "First 3 feedback items:"
|
|
207
|
+
echo "$WAKE_MSG" | jq -r '.feedback[]' | head -3 | nl -w2 -s'. '
|
|
208
|
+
else
|
|
209
|
+
echo "❌ No feedback in wake message"
|
|
210
|
+
exit 1
|
|
211
|
+
fi
|
|
212
|
+
else
|
|
213
|
+
echo "❌ No wake message in queue"
|
|
214
|
+
exit 1
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
echo ""
|
|
218
|
+
|
|
219
|
+
# Test 7: Multiple iterations
|
|
220
|
+
echo "=== Test 7: Multiple Iteration Feedback ==="
|
|
221
|
+
echo ""
|
|
222
|
+
|
|
223
|
+
echo "Simulating iteration 3 feedback..."
|
|
224
|
+
ITERATION_3_FEEDBACK="Address remaining issues from iteration 2,Add integration tests,Update changelog"
|
|
225
|
+
|
|
226
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh wake \
|
|
227
|
+
--task-id "$TASK_ID" \
|
|
228
|
+
--agent-id "$LOOP3_AGENT" \
|
|
229
|
+
--reason "cfn_loop_iteration" \
|
|
230
|
+
--iteration 3 \
|
|
231
|
+
--priority 30 \
|
|
232
|
+
--feedback "$ITERATION_3_FEEDBACK"
|
|
233
|
+
|
|
234
|
+
echo ""
|
|
235
|
+
|
|
236
|
+
# Verify both iteration feedbacks are stored separately
|
|
237
|
+
FEEDBACK_KEY_2="swarm:${TASK_ID}:${LOOP3_AGENT}:feedback:iteration-2"
|
|
238
|
+
FEEDBACK_KEY_3="swarm:${TASK_ID}:${LOOP3_AGENT}:feedback:iteration-3"
|
|
239
|
+
|
|
240
|
+
FEEDBACK_2=$(redis-cli get "$FEEDBACK_KEY_2")
|
|
241
|
+
FEEDBACK_3=$(redis-cli get "$FEEDBACK_KEY_3")
|
|
242
|
+
|
|
243
|
+
if [ -n "$FEEDBACK_2" ] && [ "$FEEDBACK_2" != "(nil)" ]; then
|
|
244
|
+
echo "✅ Iteration 2 feedback persists"
|
|
245
|
+
echo " Items: $(echo "$FEEDBACK_2" | jq '. | length')"
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
if [ -n "$FEEDBACK_3" ] && [ "$FEEDBACK_3" != "(nil)" ]; then
|
|
249
|
+
echo "✅ Iteration 3 feedback stored"
|
|
250
|
+
echo " Items: $(echo "$FEEDBACK_3" | jq '. | length')"
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
echo ""
|
|
254
|
+
|
|
255
|
+
# Test 8: Edge cases
|
|
256
|
+
echo "=== Test 8: Edge Cases ==="
|
|
257
|
+
echo ""
|
|
258
|
+
|
|
259
|
+
# Empty feedback
|
|
260
|
+
echo "Testing wake with empty feedback..."
|
|
261
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh wake \
|
|
262
|
+
--task-id "$TASK_ID" \
|
|
263
|
+
--agent-id "test-agent" \
|
|
264
|
+
--reason "test" \
|
|
265
|
+
--iteration 1 \
|
|
266
|
+
--priority 50 \
|
|
267
|
+
--feedback ""
|
|
268
|
+
|
|
269
|
+
EMPTY_FEEDBACK_KEY="swarm:${TASK_ID}:test-agent:feedback:iteration-1"
|
|
270
|
+
EMPTY_RESULT=$(redis-cli get "$EMPTY_FEEDBACK_KEY")
|
|
271
|
+
|
|
272
|
+
if [ -z "$EMPTY_RESULT" ] || [ "$EMPTY_RESULT" = "(nil)" ]; then
|
|
273
|
+
echo "✅ Empty feedback not stored (expected)"
|
|
274
|
+
else
|
|
275
|
+
echo "⚠️ Empty feedback stored: $EMPTY_RESULT"
|
|
276
|
+
fi
|
|
277
|
+
|
|
278
|
+
echo ""
|
|
279
|
+
|
|
280
|
+
# Iteration 0 (no feedback storage)
|
|
281
|
+
echo "Testing wake with iteration 0..."
|
|
282
|
+
$SCRIPT_DIR/invoke-waiting-mode.sh wake \
|
|
283
|
+
--task-id "$TASK_ID" \
|
|
284
|
+
--agent-id "test-agent-2" \
|
|
285
|
+
--reason "initial" \
|
|
286
|
+
--iteration 0 \
|
|
287
|
+
--priority 50 \
|
|
288
|
+
--feedback "This should not be stored"
|
|
289
|
+
|
|
290
|
+
ITER_0_KEY="swarm:${TASK_ID}:test-agent-2:feedback:iteration-0"
|
|
291
|
+
ITER_0_RESULT=$(redis-cli get "$ITER_0_KEY")
|
|
292
|
+
|
|
293
|
+
if [ -z "$ITER_0_RESULT" ] || [ "$ITER_0_RESULT" = "(nil)" ]; then
|
|
294
|
+
echo "✅ Iteration 0 feedback not stored (expected)"
|
|
295
|
+
else
|
|
296
|
+
echo "❌ Iteration 0 feedback should not be stored: '$ITER_0_RESULT'"
|
|
297
|
+
exit 1
|
|
298
|
+
fi
|
|
299
|
+
|
|
300
|
+
echo ""
|
|
301
|
+
|
|
302
|
+
# Summary
|
|
303
|
+
echo "=========================================="
|
|
304
|
+
echo "Test Summary"
|
|
305
|
+
echo "=========================================="
|
|
306
|
+
echo "✅ All tests passed!"
|
|
307
|
+
echo ""
|
|
308
|
+
echo "Validated:"
|
|
309
|
+
echo " 1. Validators can report feedback with confidence"
|
|
310
|
+
echo " 2. Orchestrator collects and aggregates feedback"
|
|
311
|
+
echo " 3. Feedback passed to Loop 3 agents via wake signal"
|
|
312
|
+
echo " 4. Feedback stored in Redis with 24-hour TTL"
|
|
313
|
+
echo " 5. Agents can read feedback for iteration N"
|
|
314
|
+
echo " 6. Wake queue contains feedback in message"
|
|
315
|
+
echo " 7. Multiple iterations maintain separate feedback"
|
|
316
|
+
echo " 8. Edge cases handled correctly"
|
|
317
|
+
echo ""
|
|
318
|
+
echo "Task ID: $TASK_ID"
|
|
319
|
+
echo "Feedback mechanism is fully operational!"
|
|
320
|
+
echo ""
|