UNPKG

claude-flow-novice

Version:

Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.

579 lines (426 loc) 14.7 kB
# BUG #23 Remediation: Task Mode Memory Leak Fix **Implementation Plan** **Priority:** HIGH **Estimated Effort:** 2-3 hours --- ## Immediate Action (Stop Current Epic) ### 1. Check Main Chat Memory ```bash # Get Main Chat PID and memory ps aux | grep -E "claude.*Tl" | grep -v grep | awk '{print "PID:", $2, "RSS:", $6/1024 "MB", "Command:", $11}' ``` **If RSS > 800 MB:** 1. Stop current epic execution (Ctrl+C in Main Chat) 2. Kill hung agent processes: ```bash pkill -f "claude.*agent" ``` 3. Restart Main Chat session (fresh memory) ### 2. Save Current Progress ```bash # Commit any deliverables created so far cd /mnt/c/Users/masha/Documents/claude-flow-novice git add planning/docker/ git status # Check what was delivered ls -lh planning/docker/*.md planning/docker/*.json ``` **Expected Phase 1 Deliverables:** - Sprint 1.1: ACE schema migration scripts - Sprint 1.2: Docker templates, hybrid routing config - Sprint 1.3: Validation tests **If any missing:** Note for recovery, proceed with fresh strategy. --- ## Fix Implementation (Choose Strategy) ### Strategy A: Chunked Epic Execution (RECOMMENDED) **Best for:** Production epics, large multi-phase projects **Steps:** #### 1. Update Epic Command **File:** `.claude/commands/cfn/cfn-loop-epic.md` **Add section:** ```markdown ## Memory-Safe Epic Execution **For epics >3 phases, use chunked execution:** ### Phase-by-Phase Execution Execute each phase in separate Main Chat session: **Phase 1:** \`\`\`bash /cfn-loop "Execute Phase 1: Infrastructure Templates" --epic-id "cfn-organizational-architecture-hybrid" --phase-id "phase-1" \`\`\` **Wait for completion, then start NEW Main Chat session:** **Phase 2:** \`\`\`bash /cfn-loop "Execute Phase 2: Team Deployments" --epic-id "cfn-organizational-architecture-hybrid" --phase-id "phase-2" --previous-phase "planning/docker/PHASE_1_COMPLETE.json" \`\`\` **Continue for remaining phases...** ### Benefits - Main Chat memory resets between phases - Natural checkpoint boundaries - Can monitor/validate between phases - Crash recovery: Resume from last completed phase ### Memory Limits - Single phase: <400 MB growth (safe) - Multi-phase in one session: >1 GB (UNSAFE) ``` #### 2. Update Coordinator to Support Phase Checkpointing **Create:** `.claude/skills/cfn-epic-management/checkpoint-phase.sh` ```bash #!/usr/bin/env bash # checkpoint-phase.sh - Save phase completion state for epic recovery set -euo pipefail EPIC_ID="${1:?Epic ID required}" PHASE_ID="${2:?Phase ID required}" OUTPUT_FILE="${3:-planning/docker/PHASE_${PHASE_ID}_COMPLETE.json}" # Collect phase results DELIVERABLES=$(git diff HEAD~1 --name-only | jq -R . | jq -s .) CONSENSUS=$(redis-cli GET "epic:${EPIC_ID}:${PHASE_ID}:consensus" || echo "0.0") ITERATIONS=$(redis-cli GET "epic:${EPIC_ID}:${PHASE_ID}:iterations" || echo "0") # Write checkpoint cat > "$OUTPUT_FILE" <<EOF { "epicId": "${EPIC_ID}", "phaseId": "${PHASE_ID}", "status": "complete", "completedAt": "$(date -Iseconds)", "consensus": ${CONSENSUS}, "iterations": ${ITERATIONS}, "deliverables": ${DELIVERABLES} } EOF echo "✅ Phase ${PHASE_ID} checkpoint saved: ${OUTPUT_FILE}" ``` #### 3. Update CFN v3 Coordinator **File:** `.claude/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md` **Add to completion protocol:** ```markdown ## Phase Completion Protocol After phase execution completes: 1. **Checkpoint Phase State:** \`\`\`bash ./.claude/skills/cfn-epic-management/checkpoint-phase.sh \ "$EPIC_ID" "$PHASE_ID" \ "planning/docker/PHASE_${PHASE_ID}_COMPLETE.json" \`\`\` 2. **Commit Deliverables:** \`\`\`bash git add . git commit -m "feat(epic-${EPIC_ID}): Complete Phase ${PHASE_ID}" git push origin main \`\`\` 3. **Report to User:** \`\`\` ✅ Phase ${PHASE_ID} complete Consensus: ${CONSENSUS} Deliverables: ${DELIVERABLE_COUNT} files Checkpoint: planning/docker/PHASE_${PHASE_ID}_COMPLETE.json NEXT STEPS: 1. Review deliverables: git show HEAD 2. Start new Main Chat session 3. Execute next phase: /cfn-loop "Execute Phase ${NEXT_PHASE_ID}" \`\`\` 4. **Exit Cleanly:** - Signal completion to Main Chat - Do NOT start next phase automatically - Allow Main Chat memory to reset ``` #### 4. Test Chunked Execution **Create:** `tests/memory-leak/test-chunked-epic.sh` ```bash #!/usr/bin/env bash # Test chunked epic execution (memory safety) set -euo pipefail EPIC_ID="test-chunked-epic-$(date +%s)" BASE_DIR="/mnt/c/Users/masha/Documents/claude-flow-novice" echo "Testing chunked epic execution..." # Record baseline memory BASELINE_MEM=$(ps aux | grep -E "claude.*Tl" | awk '{print $6}' | head -1) echo "Baseline memory: ${BASELINE_MEM} KB" # Execute Phase 1 (simulated) echo "Executing Phase 1..." cd "$BASE_DIR" # Spawn coordinator for Phase 1 only npx claude-flow-novice agent cfn-v3-coordinator \ --epic-id "$EPIC_ID" \ --phase-id "phase-1" \ --mode "standard" \ --checkpoint-on-complete & PHASE1_PID=$! wait $PHASE1_PID # Check memory after Phase 1 PHASE1_MEM=$(ps aux | grep -E "claude.*Tl" | awk '{print $6}' | head -1) PHASE1_GROWTH=$((PHASE1_MEM - BASELINE_MEM)) echo "Phase 1 memory growth: ${PHASE1_GROWTH} KB" # Verify checkpoint exists if [[ -f "planning/docker/PHASE_phase-1_COMPLETE.json" ]]; then echo "✅ Phase 1 checkpoint created" else echo "❌ Phase 1 checkpoint missing" exit 1 fi # CRITICAL: Kill Main Chat to reset memory (simulated) # In real usage, user starts new Main Chat session here # Execute Phase 2 (simulated - would be new session) echo "Executing Phase 2..." npx claude-flow-novice agent cfn-v3-coordinator \ --epic-id "$EPIC_ID" \ --phase-id "phase-2" \ --previous-phase "planning/docker/PHASE_phase-1_COMPLETE.json" \ --checkpoint-on-complete & PHASE2_PID=$! wait $PHASE2_PID # Check memory after Phase 2 PHASE2_MEM=$(ps aux | grep -E "claude.*Tl" | awk '{print $6}' | head -1) PHASE2_GROWTH=$((PHASE2_MEM - BASELINE_MEM)) echo "Phase 2 memory growth: ${PHASE2_GROWTH} KB" # Validate memory stayed reasonable if (( PHASE2_GROWTH < 600000 )); then echo "✅ Memory growth acceptable: ${PHASE2_GROWTH} KB" else echo "❌ Memory growth excessive: ${PHASE2_GROWTH} KB" exit 1 fi echo "✅ Chunked epic execution test passed" ``` --- ### Strategy B: CLI Mode for All Epics (ALTERNATIVE) **Best for:** Automated execution, cost optimization priority **Steps:** #### 1. Force CLI Mode for Epic Command **File:** `.claude/commands/cfn/cfn-loop-epic.md` **Update to enforce CLI:** ```markdown ## Epic Execution Mode **IMPORTANT:** Epic execution ALWAYS uses CLI Mode (cost + memory optimized). Task Mode is NOT supported for epics due to memory leak (BUG #23). ### Automatic Mode Selection \`\`\`bash /cfn-loop-epic "Epic Description" # Automatically uses CLI Mode # --mode=task is FORBIDDEN (will error) \`\`\` ### Why CLI Mode for Epics | Aspect | CLI Mode | Task Mode | |--------|----------|-----------| | Memory | Constant (~200 MB) | Growing (>1 GB) | | Cost | 95-98% savings | Expensive | | Visibility | Redis logs, web portal | Full Main Chat output | | Recovery | Swarm state persisted | Lost on crash | **Use Case Summary:** - Epic (4+ phases): CLI Mode ONLY - Single sprint debug: Task Mode OK - Multi-sprint (2-3): CLI Mode recommended ``` #### 2. Add Epic Mode Validation **Create:** `.claude/skills/cfn-epic-management/validate-epic-mode.sh` ```bash #!/usr/bin/env bash # Validate epic execution mode (prevent Task Mode memory leak) set -euo pipefail MODE="${1:?Mode required (cli|task)}" PHASE_COUNT="${2:?Phase count required}" if [[ "$MODE" == "task" ]] && (( PHASE_COUNT > 2 )); then echo "❌ ERROR: Task Mode not supported for epics >2 phases (BUG #23)" echo "" echo "Memory leak will crash Main Chat. Use CLI Mode instead:" echo "" echo " /cfn-loop-epic \"Your Epic\" # Uses CLI Mode automatically" echo "" echo "See: docs/BUG_23_TASK_MODE_MEMORY_LEAK.md" exit 1 fi if [[ "$MODE" == "task" ]] && (( PHASE_COUNT == 2 )); then echo "⚠️ WARNING: Task Mode with 2 phases may cause high memory (>600 MB)" echo "Recommend CLI Mode for better memory efficiency" echo "" read -p "Continue with Task Mode? (y/N) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi fi echo "✅ Mode validation passed: ${MODE} for ${PHASE_COUNT} phases" ``` #### 3. Update Epic Coordinator **File:** `.claude/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md` **Add to initialization:** ```markdown ## Epic Mode Initialization Before starting epic execution: \`\`\`bash # Validate mode is appropriate for epic size PHASE_COUNT=$(jq '.phases | length' "$EPIC_CONFIG") MODE="${SPAWN_MODE:-cli}" # Default to CLI ./.claude/skills/cfn-epic-management/validate-epic-mode.sh "$MODE" "$PHASE_COUNT" if [[ $? -ne 0 ]]; then echo "❌ Epic mode validation failed" exit 1 fi \`\`\` ``` --- ### Strategy C: Agent Output Truncation (MINIMAL CHANGE) **Best for:** Quick fix, keeping Task Mode option **Steps:** #### 1. Update Agent Output Standards **File:** `docs/AGENT_OUTPUT_STANDARDS.md` **Add section:** ```markdown ## Task Mode Output Limits (BUG #23 Mitigation) When spawned via Task() (detected by environment variable): ### Output Size Limits - **Max output:** 500 bytes per agent - **Format:** Structured JSON only - **Details:** Write to files, not console ### Required Output Format \`\`\`json { "confidence": 0.92, "deliverables": ["file1.ts", "file2.ts"], "issues": "None" } \`\`\` ### Example **❌ WRONG (causes memory leak):** \`\`\` Implemented authentication system. Created the following files: - src/auth/jwt.ts (150 lines) [... full file contents ...] - src/auth/middleware.ts (80 lines) [... full file contents ...] ... [continues for 50 KB] \`\`\` **✅ CORRECT (memory safe):** \`\`\` {"confidence":0.92,"deliverables":["src/auth/jwt.ts","src/auth/middleware.ts"],"issues":"None"} \`\`\` ``` #### 2. Update Agent Templates **Example:** `.claude/agents/cfn-dev-team/developers/dev-backend-api.md` **Add to output protocol:** ```markdown ## Output Protocol ### Detect Spawning Mode \`\`\`bash if [[ -n "$TASK_MODE" ]]; then # Spawned via Task() - use truncated output OUTPUT_MODE="minimal" else # Spawned via CLI - full output OK OUTPUT_MODE="full" fi \`\`\` ### Minimal Output (Task Mode) \`\`\`bash if [[ "$OUTPUT_MODE" == "minimal" ]]; then cat <<EOF {"confidence":${CONFIDENCE},"deliverables":[${DELIVERABLES}],"issues":"${ISSUES}"} EOF exit 0 fi \`\`\` ### Full Output (CLI Mode) \`\`\`bash # Standard detailed reporting echo "Implementation complete:" echo "Confidence: ${CONFIDENCE}" echo "Deliverables:" for file in $DELIVERABLES; do echo " - $file" done # ... detailed logs ... \`\`\` ``` #### 3. Test Output Truncation **Create:** `tests/memory-leak/test-output-truncation.sh` ```bash #!/usr/bin/env bash # Test agent output truncation (memory leak mitigation) set -euo pipefail echo "Testing output truncation..." # Set Task Mode environment export TASK_MODE="true" # Spawn agent OUTPUT=$(npx claude-flow-novice agent backend-dev --task-id "test-truncation") # Validate output size OUTPUT_SIZE=$(echo "$OUTPUT" | wc -c) if (( OUTPUT_SIZE > 500 )); then echo "❌ Output too large: ${OUTPUT_SIZE} bytes (max 500)" echo "Output: $OUTPUT" exit 1 fi # Validate JSON format if ! echo "$OUTPUT" | jq . >/dev/null 2>&1; then echo "❌ Output not valid JSON" exit 1 fi # Validate required fields CONFIDENCE=$(echo "$OUTPUT" | jq -r '.confidence') DELIVERABLES=$(echo "$OUTPUT" | jq -r '.deliverables | length') if [[ -z "$CONFIDENCE" ]] || (( DELIVERABLES == 0 )); then echo "❌ Missing required fields in output" exit 1 fi echo "✅ Output truncation test passed (${OUTPUT_SIZE} bytes)" ``` --- ## Recommended Implementation Order ### Phase 1: Immediate (Today) 1. **Stop current epic execution** if memory >800 MB 2. **Document issue** in CFN_LOOP_TASK_MODE.md (warning section) 3. **Switch to CLI Mode** for current epic: ```bash /cfn-loop-epic "AI Organizational Architecture - Hybrid from Start" # Uses CLI automatically ``` ### Phase 2: Short-term (Tomorrow) 1. **Implement Strategy A** (Chunked Epic Execution) - Create checkpoint-phase.sh skill - Update coordinator completion protocol - Test with 2-phase mini-epic 2. **Update documentation** - Add memory limits to epic command docs - Update Task Mode guide with warnings ### Phase 3: Long-term (Next Week) 1. **Implement Strategy B** (CLI Mode enforcement) - Add validate-epic-mode.sh - Update epic coordinator initialization - Test mode validation 2. **Optional:** Implement Strategy C (output truncation) - Only if Task Mode debugging still needed - Update agent templates - Test truncation compliance --- ## Validation Checklist - [ ] Current epic stopped (if memory >800 MB) - [ ] Progress committed to git - [ ] Epic restarted in CLI Mode OR chunked execution - [ ] Memory monitored during execution - [ ] Main Chat RSS stays <400 MB per phase - [ ] Checkpoint files created between phases - [ ] Documentation updated with warnings - [ ] Test suite validates chunked execution - [ ] Mode validation prevents Task Mode for large epics --- ## Success Criteria ### Memory Metrics **Before Fix:** - Main Chat: 756 MB (growing) - Epic: 4 phases, 15+ agents - Status: Memory leak confirmed **After Fix:** - Main Chat: <400 MB (constant per phase) - Epic: Same size, chunked execution - Status: Memory stable, no leak ### Operational Metrics - ✅ Epic completes without crash - ✅ Deliverables committed per phase - ✅ Checkpoints enable recovery - ✅ User can monitor progress between phases - ✅ Documentation prevents future memory leaks --- ## Related Documentation - **BUG #23 Analysis:** `docs/BUG_23_TASK_MODE_MEMORY_LEAK.md` - **Task Mode Guide:** `.claude/commands/CFN_LOOP_TASK_MODE.md` - **Agent Output Standards:** `docs/AGENT_OUTPUT_STANDARDS.md` - **Epic Execution:** `.claude/commands/cfn/cfn-loop-epic.md`