diff --git a/.opencode/agents/agent-evolver.md b/.opencode/agents/agent-evolver.md index 335a3b6b4..73f2fcd47 100644 --- a/.opencode/agents/agent-evolver.md +++ b/.opencode/agents/agent-evolver.md @@ -89,6 +89,110 @@ You receive: --- +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-EVLV] Agent Evolution Report (Cycle N)` +- **Proposals**: `[AUTO-EVLV] Announce: Proposal ` +- **Announcements**: `[AUTO-EVLV] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Agent Evolution Tracking Functions + +```bash +# Find and delete previous agent evolver tracking issue +function cleanup_previous_evolver_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-EVLV] Agent Evolution Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous agent evolver tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Agent evolution cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Agent Evolution | Agent: agent-evolver\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous agent evolver tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create agent evolution tracking issue +function create_evolver_tracking_issue() { + local cycle="$1" + local title="[AUTO-EVLV] Agent Evolution Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created agent evolver tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create agent evolver tracking issue" + return 1 + fi +} + +# Create agent evolution announcement issue +function create_evolver_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-EVLV] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created agent evolver announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create agent evolver announcement issue" + return 1 + fi +} +``` + ## CRITICAL: Bash Sleep for Genuine Waiting **You MUST use the Bash tool to sleep between analysis cycles.** Do NOT @@ -115,16 +219,22 @@ LOOP: cycle += 1 # ── Step 1: Gather performance data ────────────────────────── - # Read the session state issue for agent performance signals + # Read tracking issues from various agents for performance signals - session_issue = find issue titled "[Automated] Product Build Session State" - if not found: - # Session state issue not created yet — sleep and retry. + # Find tracking issues from all automation agents + tracking_issues = query Forgejo for all open issues with "Automation Tracking" label + + if tracking_issues is empty: + # No tracking issues yet — sleep and retry. # MUST use Bash tool: bash("sleep 600", timeout=900000) # 10 min sleep, 15 min timeout continue - comments = fetch all comments on session_issue (recent first) + # Collect comments and content from all tracking issues + all_tracking_data = [] + for issue in tracking_issues: + comments = fetch all comments on issue + all_tracking_data.extend([issue.body] + [c.body for c in comments]) # Also gather data from: # - PR comments (review outcomes, merge failures) @@ -142,9 +252,9 @@ LOOP: duplicate_work: [], # Cases where agents did redundant work } - # Parse checkpoint comments for failure patterns - for comment in comments: - extract_performance_signals(comment, performance_data) + # Parse tracking data for failure patterns + for data in all_tracking_data: + extract_performance_signals(data, performance_data) # ── Step 2: Identify systematic patterns ───────────────────── patterns = [] @@ -360,36 +470,95 @@ LOOP: existing_prs = query Forgejo for PRs from improvement/* branches for pr in existing_prs: if pr.state == "closed" and pr.merged: - post comment on session state issue: - "Agent improvement PR # merged. Change to : + announcement_body = "# 🎆 Agent Improvement Merged - --- - **Automated by CleverAgents Bot** - Supervisor: Agent Evolver | Agent: agent-evolver" +**PR**: # +**Agent**: +**Summary**: +**Status**: Successfully merged + +## Impact + +This agent improvement has been applied to the system and should improve agent performance. + +--- +**Automated by CleverAgents Bot** +Supervisor: Agent Evolution | Agent: agent-evolver" + + create_evolver_announcement_issue "PR # Merged" "Medium" "$announcement_body" elif pr.state == "closed" and not pr.merged: rejected_changes.add(extract_pattern_signature(pr)) - post comment on session state issue: - "Agent improvement PR # rejected by human reviewer. + announcement_body = "# ⚠️ Agent Improvement Rejected - --- - **Automated by CleverAgents Bot** - Supervisor: Agent Evolver | Agent: agent-evolver" +**PR**: # +**Status**: Rejected by human reviewer +**Reason**: Closed without merging - # ── Step 7: Post progress ──────────────────────────────────── +## Next Actions + +This improvement pattern has been marked as rejected and will not be re-proposed. + +--- +**Automated by CleverAgents Bot** +Supervisor: Agent Evolution | Agent: agent-evolver" + + create_evolver_announcement_issue "PR # Rejected" "Low" "$announcement_body" + + # ── Step 7: Post progress via individual tracking issue ────────────── if cycle % 3 == 0: - post comment on session state issue: - "Agent evolver cycle : - - Patterns analyzed: - - Proposal issues created: - - Proposals approved: - - Proposals rejected: - - Improvement PRs created: - - PRs merged: - - PRs rejected: + next_report_time = date -d "+1.5 hours" -Iseconds + tracking_body = "# Agent Evolution Report — $(date +'%Y-%m-%d %H:%M:%S') - --- - **Automated by CleverAgents Bot** - Supervisor: Agent Evolver | Agent: agent-evolver" +**Agent**: agent-evolver +**Cycle**: $cycle +**Reporting Interval**: 3 cycles (~90 minutes) (Next report expected: $next_report_time) +**Status**: active + +## Summary + +Agent evolution system analyzing patterns and proposing improvements with ${#pending_proposals[@]} proposals pending and ${#pending_prs[@]} PRs awaiting merge. + +## Details + +**Analysis Status**: Active - monitoring automation agent performance patterns +**Current Cycle**: $cycle +**Patterns Analyzed**: patterns examined this cycle +**Pending Proposals**: ${#pending_proposals[@]} awaiting human approval +**Active PRs**: ${#pending_prs[@]} improvement PRs pending merge + +### Improvement Statistics + +| Metric | Count | Status | +|--------|-------|--------| +| Patterns Analyzed | | This cycle | +| Proposal Issues Created | | Total | +| Proposals Approved | | Total | +| Proposals Rejected | | Total | +| Improvement PRs Created | | Total | +| PRs Merged | | Total | +| PRs Rejected | | Total | + +## Health Indicators + +- **Pattern Detection**: Active and monitoring automation tracking issues +- **Proposal Rate**: new proposals this cycle +- **Approval Rate**: $(( approved_count * 100 / total_proposals ))% human approval rate +- **Implementation Rate**: $(( merged_count * 100 / total_prs ))% PR merge rate +- **System Impact**: agent improvements deployed + +## Next Actions + +- Continue monitoring automation tracking issues for patterns +- Review pending proposals for human approval signals +- Monitor existing improvement PRs for merge status +- Next evolution analysis in ~90 minutes + +--- +**Automated by CleverAgents Bot** +Supervisor: Agent Evolution | Agent: agent-evolver" + + cleanup_previous_evolver_tracking + create_evolver_tracking_issue $cycle "$tracking_body" # Sleep before next cycle. MUST use Bash tool: bash("sleep 1800", timeout=2400000) # 30 min sleep, 40 min timeout @@ -470,11 +639,12 @@ No exceptions — every comment, every issue body, every PR description. ## Health Signaling -Every 3 cycles, post a brief health signal comment on the session state issue: -``` -[HEALTH] agent-evolver cycle : alive, patterns_analyzed: , - proposals_pending: , prs_pending: -``` +Every 3 cycles, create individual tracking issues with comprehensive status: +- Pattern analysis statistics and discovery metrics +- Proposal workflow status (pending, approved, rejected) +- PR monitoring status (merged, rejected, awaiting review) +- Overall agent evolution system health indicators +- Cross-agent coordination status via automation tracking issues ## Context Self-Management diff --git a/.opencode/agents/bug-hunter.md b/.opencode/agents/bug-hunter.md index 8dabf8892..29c7b8994 100644 --- a/.opencode/agents/bug-hunter.md +++ b/.opencode/agents/bug-hunter.md @@ -90,6 +90,96 @@ Determine your mode based on the parameters you receive: - **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one - **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues +### Bug Hunter Tracking Functions + +```bash +# Find and delete previous bug hunter pool tracking issue +function cleanup_previous_bug_hunter_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-BUG-POOL] Bug Detection Pool Status")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous bug hunter tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Bug hunting cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Bug Detection Pool | Agent: bug-hunter\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous bug hunter tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create bug detection pool tracking issue +function create_bug_hunter_tracking_issue() { + local cycle="$1" + local title="[AUTO-BUG-POOL] Bug Detection Pool Status (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created bug hunter tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create bug hunter tracking issue" + return 1 + fi +} + +# Create bug hunter announcement issue +function create_bug_hunter_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-BUG-POOL] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created bug hunter announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create bug hunter announcement issue" + return 1 + fi +} +``` + --- ### Setup @@ -101,6 +191,7 @@ You receive: - **Git full name / email** — for git identity - **Forgejo username** — for API operations - **Max workers (N)** — number of parallel scan workers to maintain +- **Cycle number** — Current cycle number for tracking issue naming - **Spec context** (optional) — specification summary If no spec context is provided, invoke `ref-reader` once at startup. @@ -118,10 +209,7 @@ set timeout explicitly. You MUST NOT voluntarily exit — sleep and re-poll. ### Pool Supervision Loop ``` -# Check if session state issue number was provided -if SESSION_STATE_ISSUE_NUMBER not provided: - error: "SESSION_STATE_ISSUE_NUMBER is required. This should be provided by product-builder." - ask user for the session state issue number +# Initialize tracking system - no session state issue required N = max_workers ref_summary = load via ref-reader @@ -217,19 +305,63 @@ LOOP: NEW_SID = create session + prompt_async for next_module active[next_module] = NEW_SID - # ── Step 5: Post progress ──────────────────────────────────── + # ── Step 5: Post progress via individual tracking issue ──────── if cycle % 60 == 0: # Every ~10 minutes with 10-second monitoring - post comment on session state issue: - "[HEALTH] bug-hunter | Iteration: | Status: active\n" + - "- Type: pool-supervisor\n" + - "- Active workers: / \n" + - "- Work completed: / modules scanned\n" + - "- Findings filed: \n" + - "- Last action: \n" + - "- Next check: in 10 minutes\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Bug Hunting | Agent: bug-hunter" + next_health_time=$(date -d "+10 minutes" -Iseconds) + tracking_body="# Bug Detection Pool Status — $(date +'%Y-%m-%d %H:%M:%S') + +**Agent**: bug-hunter +**Cycle**: $cycle +**Reporting Interval**: 10 minutes (Next report expected: $next_health_time) +**Status**: active + +## Summary + +Bug detection pool managing ${#active[@]} workers scanning ${#all_modules[@]} modules with $findings_total findings filed. + +## Details + +**Pool Status**: Active - scanning for potential bugs across codebase +**Active Workers**: ${#active[@]} / $N +**Progress**: ${#scanned_modules[@]}/${#all_modules[@]} modules scanned ($(( ${#scanned_modules[@]} * 100 / ${#all_modules[@]} ))%) +**Findings Filed**: $findings_total total findings + +### Module Scanning Progress + +| Module | Status | Worker | Findings | Duration | +|--------|--------|---------|----------|----------| +$(for module in "${!active[@]}"; do + local worker="${active[$module]:0:8}..." + local findings="${module_findings[$module]:-0}" + local duration="$(( ($(date +%s) - ${worker_start_times[$module]}) / 60 ))min" + echo "| $module | In Progress | $worker | $findings | $duration |" +done) + +### Completed Modules +$(for module in "${scanned_modules[@]}" | head -10; do + echo "- $module (${module_findings[$module]:-0} findings)" +done) + +## Health Indicators + +- **Module Completion**: ${#scanned_modules[@]}/${#all_modules[@]} ($(( ${#scanned_modules[@]} * 100 / ${#all_modules[@]} ))%) +- **Worker Utilization**: ${#active[@]}/$N ($(( ${#active[@]} * 100 / N ))%) +- **Bug Detection Rate**: $findings_total findings across ${#scanned_modules[@]} modules +- **System Status**: Operational and actively scanning + +## Next Actions + +- Continue monitoring ${#active[@]} active scan workers +- Dispatch workers to remaining ${#unscanned_modules[@]} unscanned modules +- Process findings from completed scans +- Next health report in ~10 minutes + +--- +**Automated by CleverAgents Bot** +Supervisor: Bug Detection Pool | Agent: bug-hunter" + + cleanup_previous_bug_hunter_tracking + create_bug_hunter_tracking_issue $cycle "$tracking_body" # ── IMMEDIATELY loop back ──────────────────────────────────── ``` @@ -303,12 +435,33 @@ You receive: 3. **Check existing bug issues** — query Forgejo for all open issues with Type/Bug label. Build a knowledge base of known bugs to avoid duplicates. -4. **Post coordination comment** on the session state issue: - ``` - Bug hunter instance starting. - Module focus: - Clone: $CLONE_DIR - ``` +4. **Post coordination via tracking issue**: + local coordination_body="# 🕵️ Bug Hunter Worker Started + +**Instance ID**: $INSTANCE_ID +**Module Focus**: $module_focus +**Clone Directory**: $CLONE_DIR +**Timestamp**: $(date +'%Y-%m-%d %H:%M:%S') + +## Scanning Plan + +This worker instance will perform comprehensive bug detection analysis on the assigned module, focusing on: +- Error handling patterns +- Concurrency safety +- Security vulnerabilities +- Boundary condition handling +- Resource management issues + +## Coordination + +Other automation agents can track this worker's progress through this tracking issue and related bug reports. + +--- +**Automated by CleverAgents Bot** +Worker: Bug Detection | Agent: bug-hunter +**Worker Type**: Module Scanner" + + create_bug_hunter_announcement_issue "Worker $INSTANCE_ID Started" "Medium" "$coordination_body" ### Analysis Process diff --git a/.opencode/agents/epic-planner.md b/.opencode/agents/epic-planner.md index 27451c867..01bf28d75 100644 --- a/.opencode/agents/epic-planner.md +++ b/.opencode/agents/epic-planner.md @@ -85,6 +85,110 @@ If these are not provided in your context, invoke `ref-reader` IMMEDIATELY to ob **Consequence**: Creating new labels causes confusion and duplicates. Use ONLY the labels listed above. +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-EPIC] Epic Planning Health Report (Cycle N)` +- **Hierarchy Reports**: `[AUTO-EPIC] Hierarchy Compliance Report (Cycle N)` +- **Announcements**: `[AUTO-EPIC] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Epic Planning Tracking Functions + +```bash +# Find and delete previous epic planner tracking issue +function cleanup_previous_epic_planner_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-EPIC] Epic Planning Health Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous epic planner tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Epic planning cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Epic Planning | Agent: epic-planner\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous epic planner tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create epic planning tracking issue +function create_epic_planner_tracking_issue() { + local cycle="$1" + local title="[AUTO-EPIC] Epic Planning Health Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created epic planner tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create epic planner tracking issue" + return 1 + fi +} + +# Create epic planning announcement issue +function create_epic_planner_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-EPIC] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created epic planner announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create epic planner announcement issue" + return 1 + fi +} +``` + #### Creating Issues (CONTRIBUTING.md Section: Creating Issues) - **Title Format**: Clear, imperative statements - **Metadata Section**: Must include all required fields @@ -745,8 +849,9 @@ def post_hierarchy_health_report(cycle, violations_fixed, legendaries_closed, ep **Automated by CleverAgents Bot** Supervisor: Epic Planning | Agent: epic-planner""" - # Post to session state issue - forgejo_create_issue_comment(owner, repo, SESSION_STATE_ISSUE_NUMBER, body=health_report) + # Create individual tracking issue for health report + cleanup_previous_epic_planner_tracking + create_epic_planner_tracking_issue $cycle "$health_report" ``` --- @@ -759,7 +864,7 @@ You receive on first invocation: - **Forgejo username** — for API operations - **Instance ID** — unique identifier for this supervisor instance - **Max workers (N)** — not used (this supervisor doesn't dispatch workers) -- **SESSION_STATE_ISSUE_NUMBER** — for health reporting +- **Cycle number** — Current cycle number for tracking issue naming If you need project rules, specification content, or contribution guidelines, invoke `ref-reader` and `spec-reader`. diff --git a/.opencode/agents/implementation-orchestrator.md b/.opencode/agents/implementation-orchestrator.md index 56294e18d..9a25249ee 100644 --- a/.opencode/agents/implementation-orchestrator.md +++ b/.opencode/agents/implementation-orchestrator.md @@ -1025,23 +1025,60 @@ LOOP FOREVER: # ── STEP 1: Check PR work queue (EVERY cycle) ─────────────────── pr_work_queue = check_pr_work_needed() - # Report PR priority status if needed + # Report PR priority status via individual tracking issue if needed if pr_work_queue and cycle % 5 == 0: - forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - body=f"[STATUS] Implementation pool: PR-FIRST MODE\n" + - f"- {len(pr_work_queue)} PRs need work\n" + - f"- {len(active_pr_workers)} PR workers active\n" + - f"- {len(active_issue_workers)} issue workers active\n" + - f"- Available slots: {max_workers - len(active_pr_workers) - len(active_issue_workers)}\n\n" + - "No new issues will be started until all PRs have workers.\n\n" + - "PR Work Queue:\n" + - "\n".join([f" - PR #{pw['pr'].number}: {pw['work_type']} (priority: {pw['priority_score']})" - for pw in pr_work_queue[:5]]) + - "\n\n---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Implementation | Agent: implementation-orchestrator" - ) + next_report_time = datetime.now() + timedelta(minutes=estimate_next_cycle_time() * 5) + tracking_body = f"""# Implementation Pool Status — PR-FIRST MODE — {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} + +**Agent**: implementation-orchestrator +**Cycle**: {cycle} +**Reporting Interval**: Every 5 cycles (~variable timing) (Next report expected: {next_report_time.isoformat()}) +**Status**: PR-FIRST MODE - Blocking issue work + +## Summary + +🚨 **CRITICAL**: {len(pr_work_queue)} PRs need workers - NO new issues until ALL PRs have workers assigned! + +Pool managing {len(active_pr_workers)} PR fixes and {len(active_issue_workers)} issue implementations. + +## Details + +**Pool Status**: PR-FIRST MODE - All PR work takes absolute priority +**Active Workers**: {len(active_pr_workers)} PR fixes, {len(active_issue_workers)} issue implementations +**Available Slots**: {max_workers - len(active_pr_workers) - len(active_issue_workers)} +**Queue Status**: {len(pr_work_queue)} PRs pending worker assignment + +### PR Work Queue ({len(pr_work_queue)} items) + +| PR | Work Type | Priority Score | Issue | +|----|-----------|----------------|---------| +""" + "\n".join([f"| #{pw['pr'].number} | {pw['work_type']} | {pw['priority_score']} | #{pw.get('issue_number', 'unknown')} |" + for pw in pr_work_queue[:10]]) + f""" + +### Policy Enforcement + +⚠️ **NO NEW ISSUES** will be started until all PRs have active workers or are blocked by human feedback. + +### Next Actions + +- Continue dispatching workers to {len(pr_work_queue)} pending PRs +- Monitor {len(active_pr_workers)} active PR workers for completion +- Maintain absolute PR-first priority +- Next status update in ~5 cycles + +## Health Indicators + +- **PR Coverage**: {len(active_pr_workers)}/{len(pr_work_queue) + len(active_pr_workers)} PRs have workers +- **Worker Utilization**: {len(active_pr_workers + active_issue_workers)}/{max_workers} ({int((len(active_pr_workers) + len(active_issue_workers))/max_workers*100)}%) +- **Queue Health**: {len(pr_work_queue)} PRs waiting for workers +- **System Policy**: PR-FIRST MODE enforced + +--- +**Automated by CleverAgents Bot** +Supervisor: Implementation Pool | Agent: implementation-orchestrator""" + + cleanup_previous_tracking() + create_tracking_issue(cycle, tracking_body) # ── STEP 2: Dispatch workers to PRs first (ABSOLUTE PRIORITY) ──── slots_available = max_workers - len(active_pr_workers) - len(active_issue_workers) @@ -1329,9 +1366,8 @@ LOOP FOREVER: lines.append(f" - Issue #{issue_num}: session {session_id[:8]}...") return "\n".join(lines) if lines else " (none)" - forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - # REPLACED: Now creates individual tracking issue instead + # REPLACED: Now creates individual tracking issue instead + # (Implementation already updated above) # Create comprehensive health tracking issue next_health_report = datetime.now() + timedelta(minutes=estimate_next_cycle_time() * 10) health_body = f"""# Implementation Pool Health Report — {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} @@ -1520,27 +1556,31 @@ Supervisor: Implementation Pool | Agent: implementation-orchestrator""" ## Health Signaling -Every 10 monitoring iterations, post a standardized health signal: +Every 10 monitoring iterations, create an individual tracking issue with health status: ``` -post comment on session state issue #SESSION_STATE_ISSUE_NUMBER: - "[HEALTH] issue-implementor | Iteration: | Status: active\n" + - "- Type: pool-supervisor\n" + - "- Total active workers: / \n" + - " - PR fix workers: \n" + - " - Issue implementation workers: \n" + - "- Work completed:\n" + - " - PRs merged: \n" + - " - Issues completed: \n" + - "- Queues:\n" + - " - PRs needing work: \n" + - " - Issues queued: \n" + - "- Failed retries: \n" + - "- Mode: <'PR-FIRST' if pr_work_queue else 'NORMAL'>\n" + - "- Last action: \n" + - "- Next check: in 10 iterations\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Implementation | Agent: implementation-orchestrator" +# Create health tracking issue with comprehensive status +cleanup_previous_implementation_tracking +create_implementation_tracking_issue $cycle \ + "[HEALTH] issue-implementor | Iteration: $N | Status: active + +- Type: pool-supervisor +- Total active workers: $((${#active_pr_workers[@]} + ${#active_issue_workers[@]})) / $max_workers + - PR fix workers: ${#active_pr_workers[@]} + - Issue implementation workers: ${#active_issue_workers[@]} +- Work completed: + - PRs merged: $count_of_completed_prs + - Issues completed: ${#completed_issues[@]} +- Queues: + - PRs needing work: ${#pr_work_queue[@]} + - Issues queued: ${#queue[@]} +- Failed retries: $sum_of_failed_retries +- Mode: ${pr_work_queue:+'PR-FIRST'}${pr_work_queue:-'NORMAL'} +- Last action: $brief_description +- Next check: in 10 iterations + +--- +**Automated by CleverAgents Bot** +Supervisor: Implementation | Agent: implementation-orchestrator" ``` This standardized format allows the system-watchdog to detect zombie supervisors and monitor overall system health from a single issue. diff --git a/.opencode/agents/product-builder.md b/.opencode/agents/product-builder.md index d1eb7d4ca..69d2103f6 100644 --- a/.opencode/agents/product-builder.md +++ b/.opencode/agents/product-builder.md @@ -42,6 +42,112 @@ permission: # CleverAgents Product Builder +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of using a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-PROD-BLDR] Product Builder Status (Cycle N)` +- **Announcements**: `[AUTO-PROD-BLDR] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Product Builder Tracking Functions + +```bash +# Find and delete previous product builder tracking issue +function cleanup_previous_product_builder_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-PROD-BLDR] Product Builder Status")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous product builder tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Product builder cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Product Builder | Agent: product-builder\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous product builder tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create product builder tracking issue +function create_product_builder_tracking_issue() { + local cycle="$1" + local title="[AUTO-PROD-BLDR] Product Builder Status (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created product builder tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + + # Store the issue number for this cycle + export CURRENT_TRACKING_ISSUE="$issue_number" + return 0 + else + echo "✗ Failed to create product builder tracking issue" + return 1 + fi +} + +# Create product builder announcement issue +function create_product_builder_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-PROD-BLDR] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created product builder announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create product builder announcement issue" + return 1 + fi +} +``` + # ⚠️ CRITICAL EXECUTION MODEL ⚠️ **YOUR ONLY JOBS:** @@ -302,8 +408,10 @@ forgejo_add_issue_labels( labels="Type/Task,State/In Progress,Priority/Medium,Type/Automation" ) -# This issue number is passed to EVERY supervisor -SESSION_STATE_ISSUE_NUMBER = session_state_issue.number +# Initialize tracking system for this session +cycle = 1 +cleanup_previous_product_builder_tracking +create_product_builder_tracking_issue $cycle "Initial product builder session started" ``` ### Step 5: Post initial session comment @@ -643,7 +751,6 @@ rm -f /tmp/supervisor-sessions.env launch_supervisor("implementation-orchestrator", "implementor-pool", "AUTO-IMP-SUP", "You are the implementation pool supervisor. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Forgejo PAT: . Git: . Username: . Password: . Max parallel workers: N_FULL. @@ -653,7 +760,6 @@ launch_supervisor("implementation-orchestrator", "implementor-pool", "AUTO-IMP-S launch_supervisor("continuous-pr-reviewer", "reviewer-pool", "AUTO-REV-SUP", "You are the PR review pool supervisor. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: reviewer-pool-1. Forgejo PAT: . Git: . Username: . Password: . Max workers: N_HALF. @@ -662,7 +768,6 @@ launch_supervisor("continuous-pr-reviewer", "reviewer-pool", "AUTO-REV-SUP", launch_supervisor("uat-tester", "tester-pool", "AUTO-UAT-SUP", "You are the UAT testing pool supervisor. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: uat-pool-1. Forgejo PAT: . Git: . Username: . max_workers: N_QUARTER. @@ -671,7 +776,6 @@ launch_supervisor("uat-tester", "tester-pool", "AUTO-UAT-SUP", launch_supervisor("bug-hunter", "hunter-pool", "AUTO-BUG-SUP", "You are the bug hunting pool supervisor. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: hunter-pool-1. Forgejo PAT: . Git: . Username: . max_workers: N_QUARTER. @@ -680,7 +784,6 @@ launch_supervisor("bug-hunter", "hunter-pool", "AUTO-BUG-SUP", launch_supervisor("test-infra-improver", "test-infra-pool", "AUTO-INF-SUP", "You are the test infrastructure improvement pool supervisor. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: test-infra-pool-1. Forgejo PAT: . Git: . Username: . max_workers: N_QUARTER. @@ -689,7 +792,6 @@ launch_supervisor("test-infra-improver", "test-infra-pool", "AUTO-INF-SUP", launch_supervisor("architect", "architect", "AUTO-ARCH", "You are the continuous architecture designer. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: architect-1. Forgejo PAT: . Git: . Username: . Product vision: . @@ -698,7 +800,6 @@ launch_supervisor("architect", "architect", "AUTO-ARCH", launch_supervisor("epic-planner", "epic-planner", "AUTO-EPIC", "You are the continuous epic planner. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: epic-planner-1. Forgejo PAT: . Git: . Username: . When creating tracking issues, ALWAYS include these labels: @@ -706,7 +807,6 @@ launch_supervisor("epic-planner", "epic-planner", "AUTO-EPIC", launch_supervisor("human-liaison", "human-liaison", "AUTO-HUMAN", "You are the human liaison. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: human-liaison-1. Forgejo PAT: . Username: . CRITICAL: When feedback leads to conclusions that change ticket nature, @@ -717,7 +817,6 @@ launch_supervisor("human-liaison", "human-liaison", "AUTO-HUMAN", launch_supervisor("agent-evolver", "agent-evolver", "AUTO-EVLV", "You are the agent evolver. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: agent-evolver-1. Forgejo PAT: . Git: . Username: . When creating tracking issues, ALWAYS include these labels: @@ -725,7 +824,6 @@ launch_supervisor("agent-evolver", "agent-evolver", "AUTO-EVLV", launch_supervisor("architecture-guard", "arch-guard", "AUTO-GUARD", "You are the architecture guard. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Forgejo PAT: . Git: . When creating tracking issues, ALWAYS include these labels: @@ -733,7 +831,6 @@ launch_supervisor("architecture-guard", "arch-guard", "AUTO-GUARD", launch_supervisor("spec-updater", "spec-updater", "AUTO-SPEC", "You are the spec updater. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Forgejo PAT: . Git: . When creating tracking issues, ALWAYS include these labels: @@ -741,7 +838,6 @@ launch_supervisor("spec-updater", "spec-updater", "AUTO-SPEC", launch_supervisor("backlog-groomer", "backlog-groomer", "AUTO-BLOG", "You are the backlog groomer. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: groomer-1. Forgejo PAT: . Username: . When creating tracking issues, ALWAYS include these labels: @@ -749,7 +845,6 @@ launch_supervisor("backlog-groomer", "backlog-groomer", "AUTO-BLOG", launch_supervisor("docs-writer", "docs-writer", "AUTO-DOCS", "You are the documentation writer. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Forgejo PAT: . Git: . When creating tracking issues, ALWAYS include these labels: @@ -757,7 +852,6 @@ launch_supervisor("docs-writer", "docs-writer", "AUTO-DOCS", launch_supervisor("timeline-updater", "timeline-updater", "AUTO-TIME", "You are the timeline updater. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Forgejo PAT: . Git: . Current day number: . When creating tracking issues, ALWAYS include these labels: @@ -765,7 +859,6 @@ launch_supervisor("timeline-updater", "timeline-updater", "AUTO-TIME", launch_supervisor("project-owner", "project-owner", "AUTO-OWNR", "You are the project owner and triager. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: project-owner-1. Forgejo PAT: . Git: . Username: . When creating tracking issues, ALWAYS include these labels: @@ -773,7 +866,6 @@ launch_supervisor("project-owner", "project-owner", "AUTO-OWNR", launch_supervisor("system-watchdog", "system-watchdog", "AUTO-WDOG", "You are the system watchdog. - SESSION STATE ISSUE: #{SESSION_STATE_ISSUE_NUMBER} Repo: /. Instance ID: watchdog-1. Forgejo PAT: . Username: . Password: . OpenCode server: http://localhost:4096. @@ -992,16 +1084,19 @@ MONITORING LOOP (runs until product is verified complete): if no worker activity found in last 15 minutes: # Pool supervisor might be zombied - running but not dispatching - forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - body="[WARNING] Pool supervisor '${display_name}' appears inactive:\n" + - "- Session ${session_id} is running but no worker activity in 15+ minutes\n" + - "- Expected ${expected_workers} parallel workers\n" + - "- Re-launching supervisor to restore worker pool\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Product Builder | Agent: product-builder" - ) + # Create announcement issue for supervisor warning + create_product_builder_announcement_issue \ + "Supervisor ${display_name} appears inactive" \ + "Priority/High" \ + "[WARNING] Pool supervisor '${display_name}' appears inactive: + +- Session ${session_id} is running but no worker activity in 15+ minutes +- Expected ${expected_workers} parallel workers +- Re-launching supervisor to restore worker pool + +--- +**Automated by CleverAgents Bot** +Supervisor: Product Builder | Agent: product-builder" # Re-launch the zombie supervisor metadata = SUPERVISOR_METADATA[display_name] launch_supervisor(metadata["agent"], display_name, metadata["tag"], metadata["prompt"]) @@ -1010,10 +1105,12 @@ MONITORING LOOP (runs until product is verified complete): # ── Check system watchdog alerts (every 3 heartbeats) ──────── if heartbeat_count % 3 == 0: # Query the session state issue for recent watchdog alerts - WATCHDOG_COMMENTS = forgejo_list_issue_comments( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - since=(3 minutes ago) # Check comments from last 3 minutes - ) + # Check for system watchdog alerts in recent tracking issues + WATCHDOG_COMMENTS = bash("curl -s 'https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&labels=Automation+Tracking' -H 'Authorization: token $FORGEJO_PAT' | jq -r '.[] | select(.title | contains(\"[AUTO-SYS-WATCH]\")) | .number'", timeout=30000) + # Get recent comments from watchdog tracking issues + for issue_num in WATCHDOG_COMMENTS: + comments = forgejo_list_issue_comments(owner, repo, issue_num, since=(3 minutes ago)) + # Process watchdog alerts from comments for comment in WATCHDOG_COMMENTS: if "[WATCHDOG ALERT]" in comment.body or "[SYSTEM ALERT]" in comment.body: @@ -1024,15 +1121,18 @@ MONITORING LOOP (runs until product is verified complete): if "forbidden API flag" in alert_body or "force_merge" in alert_body: # Critical: An agent is violating quality gates agent_name = extract agent name from alert - forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - body="[CRITICAL] Responding to watchdog alert about ${agent_name}:\n" + - "- Detected quality gate violation\n" + - "- Re-launching supervisor with strict enforcement reminder\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Product Builder | Agent: product-builder" - ) + # Create critical announcement issue for watchdog response + create_product_builder_announcement_issue \ + "Critical: Responding to watchdog alert about ${agent_name}" \ + "Priority/Critical" \ + "[CRITICAL] Responding to watchdog alert about ${agent_name}: + +- Detected quality gate violation +- Re-launching supervisor with strict enforcement reminder + +--- +**Automated by CleverAgents Bot** +Supervisor: Product Builder | Agent: product-builder" # Re-launch the offending supervisor elif "stuck in error loop" in alert_body: @@ -1085,10 +1185,15 @@ MONITORING LOOP (runs until product is verified complete): # Get worker counts from each pool supervisor's recent health signals try: - recent_comments = forgejo_list_issue_comments( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - limit=50, since=(60 minutes ago) - ) + # Get recent comments from current tracking issue to check convergence + if [[ -n "$CURRENT_TRACKING_ISSUE" ]]; then + recent_comments = forgejo_list_issue_comments( + owner, repo, CURRENT_TRACKING_ISSUE, + limit=50, since=(60 minutes ago) + ) + else + recent_comments = [] + fi for comment in recent_comments: if "[HEALTH]" in comment.body: @@ -1127,19 +1232,25 @@ MONITORING LOOP (runs until product is verified complete): worker_summary += f" - Bug hunter pool: check logs (N_QUARTER={N_QUARTER} max)\n" worker_summary += f" - Test infra pool: check logs (N_QUARTER={N_QUARTER} max)\n" - forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - body=f"[HEARTBEAT] Product Builder #{heartbeat_count}:\n" + - f"- Supervisors relaunched: {supervisors_relaunched}\n" + - f"- Open issues: {len(open_issues) if 'open_issues' in locals() else 'unknown'}\n" + - f"- Open PRs: {len(open_prs) if 'open_prs' in locals() else 'unknown'}\n" + - f"- All 16 supervisors monitored: YES\n\n" + - worker_summary + "\n" + - f"Target parallelism: N={N} (Full={N_FULL}, Half={N_HALF}, Quarter={N_QUARTER})\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Product Builder | Agent: product-builder" - ) + # Update current tracking issue with heartbeat every 10 cycles + if [[ $((heartbeat_count % 10)) == 0 ]] && [[ -n "$CURRENT_TRACKING_ISSUE" ]]; then + cleanup_previous_product_builder_tracking + create_product_builder_tracking_issue $((cycle + heartbeat_count)) \ + "[HEARTBEAT] Product Builder #${heartbeat_count}: + +- Supervisors relaunched: ${supervisors_relaunched} +- Open issues: ${len(open_issues) if 'open_issues' in locals() else 'unknown'} +- Open PRs: ${len(open_prs) if 'open_prs' in locals() else 'unknown'} +- All 16 supervisors monitored: YES + +${worker_summary} + +Target parallelism: N=${N} (Full=${N_FULL}, Half=${N_HALF}, Quarter=${N_QUARTER}) + +--- +**Automated by CleverAgents Bot** +Supervisor: Product Builder | Agent: product-builder" + fi # ── IMMEDIATELY loop back ──────────────────────────────────── # No extra delays. Sleep at the top of the next iteration. diff --git a/.opencode/agents/project-owner.md b/.opencode/agents/project-owner.md index ae2fdb7ff..d6e14946e 100644 --- a/.opencode/agents/project-owner.md +++ b/.opencode/agents/project-owner.md @@ -45,6 +45,109 @@ would make, based on the specification, milestone goals, and project state. every 5 minutes for new work. You use `bash sleep` for genuine blocking waits. +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-PROJ-OWN] Project Owner Report (Cycle N)` +- **Announcements**: `[AUTO-PROJ-OWN] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Project Owner Tracking Functions + +```bash +# Find and delete previous project owner tracking issue +function cleanup_previous_project_owner_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-PROJ-OWN] Project Owner Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous project owner tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Project owner cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Project Owner | Agent: project-owner\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous project owner tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create project owner tracking issue +function create_project_owner_tracking_issue() { + local cycle="$1" + local title="[AUTO-PROJ-OWN] Project Owner Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created project owner tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create project owner tracking issue" + return 1 + fi +} + +# Create project owner announcement issue +function create_project_owner_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-PROJ-OWN] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created project owner announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create project owner announcement issue" + return 1 + fi +} +``` + --- ## CRITICAL: Label Management Protocol @@ -637,20 +740,40 @@ No exceptions — every comment, every issue body, every PR description. ## Health Signaling -Every 5 cycles, post a standardized health signal on the session state issue: -``` -forgejo_create_issue_comment( - owner, repo, SESSION_STATE_ISSUE_NUMBER, - body="[HEALTH] project-owner | Iteration: | Status: active\n" + - "- Type: singleton\n" + - "- Active workers: N/A\n" + - "- Work completed: triaged issues, assigned MoSCoW to issues\n" + - "- Last action: \n" + - "- Next check: in 300 seconds\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Project Owner | Agent: project-owner" -) +Every 5 cycles, create an individual tracking issue with project status: +```bash +# Every 5th cycle, post health update +if [[ $((cycle % 5)) == 0 ]]; then + cleanup_previous_project_owner_tracking + + tracking_body=" +[HEALTH] project-owner | Iteration: $cycle | Status: active + +**Progress Summary:** +- Type: singleton +- Active workers: N/A +- Work completed: triaged $triaged_count issues, assigned MoSCoW to $moscow_assigned issues +- Last action: $brief_description +- Next check: in 300 seconds + +**Triage Statistics:** +- Issues triaged this cycle: $cycle_triaged +- MoSCoW labels assigned: $cycle_moscow +- Developer assignments made: $cycle_assignments +- Priority adjustments: $cycle_priority_changes + +**Strategic Health:** +- Active milestones monitored: $active_milestones_count +- Critical issues unassigned: $critical_unassigned_count +- Pending developer questions: $pending_questions_count + +--- +**Automated by CleverAgents Bot** +Supervisor: Project Owner | Agent: project-owner +" + + create_project_owner_tracking_issue $cycle "$tracking_body" +fi ``` ## Context Self-Management diff --git a/.opencode/agents/shared/bug_hunter_tracking_update.md b/.opencode/agents/shared/bug_hunter_tracking_update.md index fa81739ec..cc9c2ca00 100644 --- a/.opencode/agents/shared/bug_hunter_tracking_update.md +++ b/.opencode/agents/shared/bug_hunter_tracking_update.md @@ -139,9 +139,8 @@ function create_bug_hunter_announcement_issue() { **Remove this code:** ``` # Check if session state issue number was provided -if SESSION_STATE_ISSUE_NUMBER not provided: - error: "SESSION_STATE_ISSUE_NUMBER is required. This should be provided by product-builder." - ask user for the session state issue number +# Now uses individual tracking issues instead of session state issue +# No SESSION_STATE_ISSUE_NUMBER parameter needed ``` **Replace with:** diff --git a/.opencode/agents/spec-updater.md b/.opencode/agents/spec-updater.md index a4a3bf79b..669654e2d 100644 --- a/.opencode/agents/spec-updater.md +++ b/.opencode/agents/spec-updater.md @@ -44,6 +44,110 @@ permission: # CleverAgents Specification Updater +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-SPEC] Specification Update Report (Cycle N)` +- **Proposals**: `[AUTO-SPEC] Announce: Proposal ` +- **Announcements**: `[AUTO-SPEC] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Spec Update Tracking Functions + +```bash +# Find and delete previous spec updater tracking issue +function cleanup_previous_spec_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-SPEC] Specification Update Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous spec updater tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Specification update cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Specification Updates | Agent: spec-updater\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous spec updater tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create spec update tracking issue +function create_spec_tracking_issue() { + local cycle="$1" + local title="[AUTO-SPEC] Specification Update Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created spec updater tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create spec updater tracking issue" + return 1 + fi +} + +# Create spec update announcement issue +function create_spec_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-SPEC] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created spec updater announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create spec updater announcement issue" + return 1 + fi +} +``` + ## Clone Isolation Protocol **CRITICAL: You MUST work in your own isolated clone. NEVER operate in /app.** @@ -245,24 +349,39 @@ reverting deliberate decisions. and reference to the approved proposal issue (`Closes #`). 5. Add the label **`needs feedback`** to the PR. 6. **Do NOT merge this PR.** A human must review and merge it. - 7. Post a comment on the session state issue: - ``` - Spec update proposal # approved. PR created: # - Label: needs feedback (awaiting human review before merge) + 7. Create an announcement issue: + ```bash + announcement_body="# 📝 Specification Proposal Approved + +**Proposal Issue**: # +**PR Created**: # +**Status**: Awaiting human review +**Priority**: Needs feedback + +## Summary + +Spec update proposal has been approved and a PR has been created for human review before merge. + +--- +**Automated by CleverAgents Bot** +Supervisor: Specification Updates | Agent: spec-updater" + + create_spec_announcement_issue "Proposal # Approved" "Medium" "$announcement_body" ``` When a proposal is rejected (issue closed without approval): - Record to avoid re-proposing the same change. - - Post a note on the session state issue. + - Create a rejection announcement issue. 8. **Keep spec PRs up to date:** If master has advanced since a spec PR was created, rebase the spec branch onto master, force-push, and ensure the PR is still mergeable. Retry indefinitely with reclone fallback. -9. **Post a Forgejo comment** — on the session state issue, post a summary of: +9. **Create tracking issue** — create individual tracking issue with summary of: - Spec proposals created (with issue numbers) - Proposals approved and PRs created - Proposals rejected + - Overall specification alignment status - Issues created for incorrect deviations - Whether a monolithic→split restructure was proposed @@ -323,13 +442,36 @@ function run_proactive_spec_scan(): # Create a proposal issue (same as Step 6a in main process) create_proposal_issue(discrepancy) - # Step 4: Track metrics - post comment on session state issue: - "[HEALTH] spec-updater proactive scan complete: - - Modules scanned: - - Discrepancies found: - - Proposals created: - - Already pending: " + # Step 4: Track metrics via tracking issue + tracking_body="# Specification Proactive Scan Complete — $(date +'%Y-%m-%d %H:%M:%S') + +**Agent**: spec-updater +**Scan Type**: Proactive +**Status**: Complete + +## Summary + +Proactive specification alignment scan completed with modules examined and discrepancies identified. + +## Details + +**Modules Scanned**: +**Discrepancies Found**: +**Proposals Created**: +**Already Pending**: + +## Health Indicators + +- **Specification Alignment**: $(( (modules_scanned - discrepancies_found) * 100 / modules_scanned ))% aligned +- **Discovery Rate**: new discrepancies identified +- **Action Rate**: proposals created for remediation + +--- +**Automated by CleverAgents Bot** +Supervisor: Specification Updates | Agent: spec-updater" + + cleanup_previous_spec_tracking + create_spec_tracking_issue $cycle "$tracking_body" ``` **You MUST generate at least one proposal issue per scan cycle if ANY @@ -340,11 +482,12 @@ even deeper module-by-module comparison and report findings. ## Health Signaling -Every 5 cycles, post a brief health signal comment on the session state issue: -``` -[HEALTH] spec-updater cycle : alive, proposals_pending: , - proposals_created_total: , last_scan: -``` +Every 5 cycles, create individual tracking issues with comprehensive status: +- Specification alignment analysis and metrics +- Proposal workflow status (pending, approved, rejected) +- PR monitoring status for spec updates +- Overall specification evolution health indicators +- Cross-implementation consistency checks ## Context Self-Management diff --git a/.opencode/agents/test-infra-improver.md b/.opencode/agents/test-infra-improver.md index 039f37f8c..aa348c5af 100644 --- a/.opencode/agents/test-infra-improver.md +++ b/.opencode/agents/test-infra-improver.md @@ -115,18 +115,122 @@ set timeout explicitly. You MUST NOT voluntarily exit — sleep and re-poll. --- +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-INF-POOL] Infrastructure Analysis Report (Cycle N)` +- **Worker Reports**: `[AUTO-INF-POOL] Announce: Worker Complete` +- **Announcements**: `[AUTO-INF-POOL] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### Test Infrastructure Tracking Functions + +```bash +# Find and delete previous test infra tracking issue +function cleanup_previous_infra_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-INF-POOL] Infrastructure Analysis Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous test infra tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"Test infrastructure analysis cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: Test Infrastructure Analysis | Agent: test-infra-improver\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous test infra tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create test infra tracking issue +function create_infra_tracking_issue() { + local cycle="$1" + local title="[AUTO-INF-POOL] Infrastructure Analysis Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created test infra tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create test infra tracking issue" + return 1 + fi +} + +# Create test infra announcement issue +function create_infra_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-INF-POOL] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created test infra announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create test infra announcement issue" + return 1 + fi +} +``` + ## Pool Supervisor Mode ### Setup You receive: -- **SESSION STATE ISSUE** — Issue number for all health signals and status updates (REQUIRED) - **Repo owner/name** — for Forgejo API calls - **Instance ID** — unique identifier - **Forgejo PAT** — for HTTPS git auth and API access - **Git full name / email** — for git identity - **Forgejo username** — for API operations - **Max workers (N)** — number of parallel analysis workers +- **Cycle number** — Current cycle number for tracking issue naming - **Spec context** (optional) — specification summary If no spec context is provided, invoke `ref-reader` once at startup. @@ -134,10 +238,7 @@ If no spec context is provided, invoke `ref-reader` once at startup. ### Pool Supervision Loop ``` -# Check if session state issue number was provided -if SESSION_STATE_ISSUE_NUMBER not provided: - error: "SESSION_STATE_ISSUE_NUMBER is required. This should be provided by product-builder." - ask user for the session state issue number +# Initialize tracking system - no session state issue required N = max_workers ref_summary = load via ref-reader @@ -235,17 +336,61 @@ LOOP: # ── Post progress ──────────────────────────────────────────── if cycle % 60 == 0: # Every ~10 minutes with 10-second monitoring - post comment on session state issue: - "[HEALTH] test-infra-improver | Iteration: | Status: active\n" + - "- Type: pool-supervisor\n" + - "- Active workers: / \n" + - "- Work completed: / areas analyzed\n" + - "- Issues filed: \n" + - "- Last action: \n" + - "- Next check: in 10 minutes\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: Test Infrastructure | Agent: test-infra-improver" + next_health_time=$(date -d "+10 minutes" -Iseconds) + tracking_body="# Test Infrastructure Analysis Pool Status — $(date +'%Y-%m-%d %H:%M:%S') + +**Agent**: test-infra-improver +**Cycle**: $cycle +**Reporting Interval**: 10 minutes (Next report expected: $next_health_time) +**Status**: active + +## Summary + +Test infrastructure analysis pool managing ${#active[@]} workers analyzing ${#analysis_areas[@]} areas with $findings_total improvement proposals filed. + +## Details + +**Pool Status**: Active - analyzing testing infrastructure optimization opportunities +**Active Workers**: ${#active[@]} / $N +**Progress**: ${#analyzed_areas[@]}/${#analysis_areas[@]} areas analyzed ($(( ${#analyzed_areas[@]} * 100 / ${#analysis_areas[@]} ))%) +**Findings Filed**: $findings_total improvement proposals + +### Analysis Areas Progress + +| Area | Status | Worker | Findings | Duration | +|------|--------|---------|----------|----------| +$(for area in "${!active[@]}"; do + local worker="${active[$area]:0:8}..." + local findings="${area_findings[$area]:-0}" + local duration="$(( ($(date +%s) - ${worker_start_times[$area]}) / 60 ))min" + echo "| $area | In Progress | $worker | $findings | $duration |" +done) + +### Completed Areas +$(for area in "${analyzed_areas[@]}" | head -5; do + echo "- $area (${area_findings[$area]:-0} findings)" +done) + +## Health Indicators + +- **Analysis Completion**: ${#analyzed_areas[@]}/${#analysis_areas[@]} ($(( ${#analyzed_areas[@]} * 100 / ${#analysis_areas[@]} ))%) +- **Worker Utilization**: ${#active[@]}/$N ($(( ${#active[@]} * 100 / N ))%) +- **Improvement Rate**: $findings_total proposals across ${#analyzed_areas[@]} areas +- **System Status**: Operational and actively analyzing + +## Next Actions + +- Continue monitoring ${#active[@]} active analysis workers +- Dispatch workers to remaining ${#unanalyzed_areas[@]} unanalyzed areas +- Process findings from completed analyses +- Next health report in ~10 minutes + +--- +**Automated by CleverAgents Bot** +Supervisor: Test Infrastructure Analysis | Agent: test-infra-improver" + + cleanup_previous_infra_tracking + create_infra_tracking_issue $cycle "$tracking_body" ``` --- diff --git a/.opencode/agents/uat-tester.md b/.opencode/agents/uat-tester.md index 0ae0f91de..1c27d4978 100644 --- a/.opencode/agents/uat-tester.md +++ b/.opencode/agents/uat-tester.md @@ -69,6 +69,110 @@ You are a user acceptance testing agent. You operate in one of two modes: This dual-mode design allows the product-builder to launch a single UAT tester instance that manages N parallel testers internally. +## Automation Tracking System + +**Updated**: This agent creates individual tracking issues instead of posting comments to a session state issue. + +### Tracking Issue Format +- **Health Reports**: `[AUTO-UAT-POOL] UAT Testing Report (Cycle N)` +- **Worker Reports**: `[AUTO-UAT-POOL] Announce: Worker Complete` +- **Announcements**: `[AUTO-UAT-POOL] Announce: ` +- **Labels**: "Automation Tracking" + any relevant priority labels + +### Cleanup Protocol +- **ONE ISSUE PER CYCLE**: Delete previous cycle's tracking issue before creating new one +- **PRESERVE ANNOUNCEMENTS**: Don't delete announcement issues + +### UAT Testing Tracking Functions + +```bash +# Find and delete previous UAT testing tracking issue +function cleanup_previous_uat_tracking() { + local previous_issue=$(curl -s "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues?state=open&type=issues&labels=Automation+Tracking" \ + -H "Authorization: token $FORGEJO_PAT" | \ + jq -r '.[] | select(.title | contains("[AUTO-UAT-POOL] UAT Testing Report")) | .number' | head -1) + + if [[ -n "$previous_issue" && "$previous_issue" != "null" ]]; then + echo "Cleaning up previous UAT testing tracking issue #$previous_issue" + + # Close with final comment + curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue/comments" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"body\": \"UAT testing cycle completed. Closing this tracking issue.\\n\\n---\\n**Automated by CleverAgents Bot**\\nSupervisor: UAT Testing | Agent: uat-tester\"}" + + # Close the issue + curl -s -X PATCH "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$previous_issue" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"state": "closed"}' + + echo "✓ Previous UAT testing tracking issue #$previous_issue closed" + sleep 2 + fi +} + +# Create UAT testing tracking issue +function create_uat_tracking_issue() { + local cycle="$1" + local title="[AUTO-UAT-POOL] UAT Testing Report (Cycle $cycle)" + local body="$2" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created UAT testing tracking issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + echo "✓ Applied 'Automation Tracking' label to issue #$issue_number" + return 0 + else + echo "✗ Failed to create UAT testing tracking issue" + return 1 + fi +} + +# Create UAT testing announcement issue +function create_uat_announcement_issue() { + local message="$1" + local priority="$2" + local body="$3" + local title="[AUTO-UAT-POOL] Announce: $message" + + local response=$(curl -s -X POST "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$title\", \"body\": \"$body\"}") + + local issue_number=$(echo "$response" | jq -r '.number') + + if [[ "$issue_number" != "null" && -n "$issue_number" ]]; then + echo "✓ Created UAT testing announcement issue #$issue_number" + + # CRITICAL: Apply "Automation Tracking" label + curl -s -X PUT "https://git.cleverthis.com/api/v1/repos/$owner/$repo/issues/$issue_number/labels" \ + -H "Authorization: token $FORGEJO_PAT" \ + -H "Content-Type: application/json" \ + -d '{"labels": ["Automation Tracking"]}' + + return 0 + else + echo "✗ Failed to create UAT testing announcement issue" + return 1 + fi +} +``` + ## Documentation Generation In addition to finding bugs, UAT testers capture successful end-to-end @@ -125,9 +229,8 @@ set timeout explicitly. You MUST NOT voluntarily exit — sleep and re-poll. ### Pool Supervision Loop -**IMPORTANT: Progress reports MUST be posted as comments on the session state -issue — NEVER as separate new issues.** The SESSION_STATE_ISSUE_NUMBER must be -provided by the caller (usually product-builder). +**IMPORTANT: Progress reports MUST be posted as individual tracking issues +with the "Automation Tracking" label.** This replaces the old session state system. ``` N = max_workers @@ -140,10 +243,11 @@ example_categories_covered = set() cycle = 0 SERVER = "http://localhost:4096" -# ── Check for session state issue number ───────────────────────── -if SESSION_STATE_ISSUE_NUMBER not provided: - error: "SESSION_STATE_ISSUE_NUMBER is required. This should be provided by product-builder." - ask user for the session state issue number +# ── Setup automation tracking system ──────────────────────────── +cycle_number = 1 +owner = "" +repo = "" +FORGEJO_PAT = "" # ── RESUME: Adopt existing UAT worker sessions from previous run ─ EXISTING_WORKERS = bash("curl -s ${SERVER}/session | python3 -c \" @@ -231,25 +335,41 @@ LOOP: NEW_SID = create session + prompt_async for next_area active[next_area] = NEW_SID - # ── Step 4: Post progress (as COMMENT on session state issue) ───── - # NEVER create a new Forgejo issue for progress reports. - # Always post as a comment on SESSION_STATE_ISSUE_NUMBER. + # ── Step 4: Create individual tracking issue for progress ───────── if cycle % 60 == 0: # Every ~10 minutes with 10-second monitoring - post comment on issue #SESSION_STATE_ISSUE_NUMBER: - "[HEALTH] uat-tester | Iteration: | Status: active\n" + - "- Type: pool-supervisor\n" + - "- Active workers: / \n" + - "- Work completed: / areas tested\n" + - "- Coverage: %\n" + - "- Bugs filed: \n" + - "- Documentation:\n" + - " - Examples generated: \n" + - " - Categories covered: \n" + - "- Last action: \n" + - "- Next check: in 10 minutes\n\n" + - "---\n" + - "**Automated by CleverAgents Bot**\n" + - "Supervisor: UAT Testing | Agent: uat-tester" + # Clean up previous tracking issue and create new one + cleanup_previous_uat_tracking + + tracking_body=" +[HEALTH] uat-tester | Iteration: $cycle | Status: active + +**Progress Summary:** +- Type: pool-supervisor +- Active workers: ${#active[@]} / $N +- Work completed: ${#tested_areas[@]}/${#feature_areas[@]} areas tested +- Coverage: $((${#tested_areas[@]} * 100 / ${#feature_areas[@]}))% +- Bugs filed: $bugs_found_total +- Documentation: + - Examples generated: $docs_generated_total + - Categories covered: ${example_categories_covered[@]} +- Last action: $brief_description +- Next check: in 10 minutes + +**Active Testing Areas:** +$(for area in "${!active[@]}"; do echo "- $area (session: ${active[$area]})"; done) + +**Completed Areas:** +$(for area in "${tested_areas[@]}"; do echo "- ✓ $area"; done) + +**Remaining Areas:** +$(for area in "${untested[@]}"; do echo "- ○ $area"; done) + +--- +**Automated by CleverAgents Bot** +Supervisor: UAT Testing | Agent: uat-tester +" + + create_uat_tracking_issue $cycle "$tracking_body" # ── IMMEDIATELY loop back ──────────────────────────────────── ``` @@ -693,10 +813,10 @@ No exceptions — every comment, every issue body, every PR description. ## Important Rules -- **NEVER create new Forgejo issues for progress reports.** In Pool - Supervisor Mode, use the SESSION_STATE_ISSUE_NUMBER provided by the - caller and post ALL progress updates as comments on that single issue. - Creating separate issues for each progress report pollutes the issue tracker. +- **CREATE individual tracking issues for progress reports.** In Pool + Supervisor Mode, create individual tracking issues with the "Automation Tracking" + label for each cycle. Clean up previous cycles to maintain exactly one active + tracking issue at a time. - **NEVER work in /app.** Always use your isolated clone (Worker Mode) or Forgejo API only (Pool Supervisor Mode). - **NEVER modify code.** You are a tester, not a fixer. File issues only.