11 KiB
Phase 3: Autonomous Build Test MVP - Detailed Plan
Status: 🚀 IN PROGRESS Estimated Duration: 4-5 hours Goal: Build production-ready autonomous CI/CD workflow with retry logic
⏱️ Time Estimation
| Step | Activity | Estimated Time | Notes |
|---|---|---|---|
| 1 | Setup Test Repository | 20 min | Create repo, add sample Node.js project |
| 2 | Configure Gitea Webhook | 15 min | Set up webhook in Gitea |
| 3 | Build n8n Workflow (Base) | 60 min | Create 11-node workflow structure |
| 4 | Implement Retry Logic | 45 min | Add staticData counter, decision nodes |
| 5 | Test Success Path | 30 min | Verify workflow completes on valid code |
| 6 | Test Failure Path | 45 min | Test with intentional errors |
| 7 | Test Retry Loop | 45 min | Verify multiple retries work |
| 8 | Test Max Retries | 30 min | Ensure stops after 3 attempts |
| 9 | Gitea Status Updates | 30 min | Implement commit status API calls |
| 10 | Real Project Test | 45 min | Test with actual MVP project |
| 11 | Documentation | 30 min | Document workflow configuration |
| Total Estimated | 4-5 hours | Can be split across 2-3 sessions |
📅 Timeline Projection
Starting: 2025-12-02 Expected Completion: 2025-12-02 (same day, 4-5 hours total)
Session 1 (2 hours): Steps 1-5 (Setup + Base workflow + Success test) Session 2 (2 hours): Steps 6-9 (Failure tests + Gitea integration) Session 3 (1 hour): Steps 10-11 (Real project test + documentation)
Overview
Phase 3 leverages Phase 2 learnings to create an autonomous build/test system that can:
- Execute builds automatically
- Detect failures
- Provide feedback to OpenHands
- Retry with improved instructions
- Update commit status in Gitea
- Prevent infinite loops with max retry limit
Workflow: "Autonomous Build Test"
Flow Design
[1] Git Push (Gitea webhook)
↓
[2] Extract commit info (Code node)
↓
[3] Start OpenHands (SSH node)
→ Task: "Build project in /workspace/[project]"
↓
[4] Wait for completion (Wait node)
↓
[5] Check build results (Code node)
→ Capture exit code + errors
↓
[6] Decision: Build OK?
├─ YES → [7] Update Gitea status → [8] Success notification
└─ NO → [9] Format error feedback
↓
[10] Retry counter check
├─ < 3 → Back to [3] (retry with feedback)
└─ ≥ 3 → [11] Final failure notification
Key Components
A. Iteration Counter (n8n staticData)
Purpose: Track retry attempts to prevent infinite loops
Implementation in Code Node:
// Initialize retry counter
$workflow.staticData = $workflow.staticData || {};
$workflow.staticData.retry_count = ($workflow.staticData.retry_count || 0) + 1;
// Get current retry count
const retryCount = $workflow.staticData.retry_count;
// Check max retries
if (retryCount >= 3) {
return {
action: 'fail',
message: 'Max retries (3) exceeded',
retry_count: retryCount,
status: 'FAILED'
};
}
return {
action: 'retry',
retry_count: retryCount,
status: 'IN_PROGRESS'
};
B. Error Collection & Formatting
Purpose: Extract meaningful errors from OpenHands output for feedback
Implementation:
// Collect errors from OpenHands output
const sshOutput = $json;
const errors = sshOutput.stderr || sshOutput.stdout || 'Unknown error';
// Parse and format error message
const errorMsg = `Build failed with the following errors:
${errors}
Please analyze these errors and fix the issues to ensure a successful build.
Focus on:
1. Dependency issues (npm install errors)
2. Build script failures
3. Code syntax errors
4. Configuration problems
After fixing, the project should build successfully with: npm install && npm run build`;
// Include previous errors in feedback
return {
status: 'FAILED',
error_message: errorMsg,
stdout: sshOutput.stdout,
stderr: sshOutput.stderr,
code: sshOutput.code,
retry_count: $workflow.staticData.retry_count
};
C. Feedback Loop Mechanism
Purpose: Improve retry attempts by providing specific error feedback to OpenHands
Implementation:
// Get previous error
const previousError = $json.error_message || 'Unknown error';
// Build enhanced task with feedback
const projectName = $node["Extract Repo Info"].json.repo_name;
const task = `Build and test the project at /workspace/${projectName}.
PREVIOUS BUILD FAILED with errors:
${previousError}
Please:
1. Analyze the error messages carefully
2. Fix all identified issues
3. Ensure npm install completes successfully
4. Ensure npm run build completes successfully
5. Report any remaining issues clearly
This is retry attempt #${$workflow.staticData.retry_count}. Please be thorough and fix all problems.`;
D. Gitea Commit Status Update
Purpose: Update commit status in Gitea for visibility
HTTP Node Configuration:
# URL
POST https://git.oky.sh/api/v1/repos/{owner}/{repo}/statuses/{sha}
# Headers
Authorization: token {GITEA_API_TOKEN}
Content-Type: application/json
# Body (Success)
{
"state": "success",
"description": "Build passed ✅",
"context": "openhands/autonomous-build",
"target_url": "https://n8n.oky.sh"
}
# Body (Failure)
{
"state": "failure",
"description": "Build failed after 3 attempts ❌",
"context": "openhands/autonomous-build",
"target_url": "https://n8n.oky.sh"
}
Getting Gitea Token:
- Go to Gitea → Settings → Applications
- Generate Access Token
- Use token in HTTP node
E. Success Notification
Purpose: Notify when build succeeds
Options:
- HTTP to Slack/Discord
- Email notification
- Gitea commit status update only
Implementation:
// Format success message
const successMsg = {
status: 'SUCCESS',
repo: $node["Extract Repo Info"].json.repo_name,
branch: $node["Extract Repo Info"].json.branch,
commit: $node["Extract Repo Info"].json.commit_sha.substring(0, 8),
message: 'Build completed successfully',
retry_count: $workflow.staticData.retry_count,
emoji: '✅'
};
return successMsg;
Test Sequence
1. Create Test Repository
# In Gitea UI or via API
curl -X POST https://git.oky.sh/api/v1/user/repos \
-H "Authorization: token {GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"name":"autonomous-build-test","description":"Test repo for Phase 3"}'
2. Configure Webhook
- URL:
https://n8n.oky.sh/webhook/autonomous-build-test - Trigger: Push events
- Active: Yes
3. Build n8n Workflow
Nodes Required:
- Webhook - Receive Gitea push
- Extract Repo Info - Parse commit data
- Initialize Retry - Set retry counter
- OpenHands Build - Execute build via SSH
- Wait - Wait for completion
- Check Results - Evaluate build success
- Decision - Split success/failure paths
- Update Gitea Status - Success path
- Format Error - Failure path
- Check Retry Count - Decision node
- Retry Loop - Back to OpenHands or final failure
4. Test Successful Build
Steps:
- Push code with no errors to test repo
- Webhook triggers workflow
- OpenHands builds successfully
- Gitea status updated to "success"
- Success notification sent
Expected Result:
{
"status": "SUCCESS",
"repo": "autonomous-build-test",
"branch": "main",
"commit": "abc123de",
"message": "Build completed successfully",
"emoji": "✅"
}
5. Test Failure Path with Retry
Steps:
- Push code with intentional errors
- Webhook triggers workflow
- OpenHands fails build
- Errors formatted and sent back
- Retry counter increments
- OpenHands tries again with feedback
- Either succeeds or fails again
Expected Result (1st failure):
{
"status": "FAILED",
"error_message": "Build failed with errors:...",
"retry_count": 1
}
Expected Result (2nd attempt):
- OpenHands receives: "Previous build failed with: [errors]"
- Improved task with specific feedback
- Either succeeds or fails again
6. Test Max Retries
Steps:
- Push code with persistent errors
- Let workflow retry 3 times
- After 3rd failure, stop retrying
- Send final failure notification
- Update Gitea status to "failure"
Expected Result (3rd failure):
{
"status": "FAILED",
"message": "Max retries (3) exceeded",
"retry_count": 3
}
Implementation Steps
Step 1: Setup Test Repository
- Create test repository in Gitea
- Add a simple Node.js project with build script
- Configure Gitea webhook
Step 2: Create n8n Workflow
- Import or create new workflow
- Configure all 11 nodes
- Test with manual trigger
Step 3: Configure Credentials
- SSH credentials for n8n
- Gitea API token for status updates
- Notification endpoints (Slack/Email)
Step 4: Test Success Path
- Push valid code
- Verify workflow completes
- Check Gitea status updated
- Verify notification sent
Step 5: Test Retry Logic
- Push code with errors
- Verify failure detected
- Verify retry occurs
- Verify feedback provided
- Test multiple retries
Step 6: Test Max Retries
- Push persistent errors
- Verify 3 attempts made
- Verify stops after 3rd attempt
- Verify final failure notification
Step 7: Test with Real Project
- Use actual MVP project
- Verify build process works
- Test error scenarios
- Document results
Step 8: Document & Deploy
- Document workflow configuration
- Create user guide
- Deploy to production
- Monitor initial runs
Success Criteria
Must Have:
- End-to-end workflow completes successfully
- OpenHands executes build tasks autonomously
- n8n detects completion and checks results
- Feedback loop works (test at least 1 retry)
- Retry counter prevents infinite loops (max 3)
- Gitea commit status updated appropriately
- Notifications sent for success/failure
Nice to Have:
- Error categorization (dependency vs syntax)
- Build time tracking
- Detailed build logs stored
- Slack/Discord notifications
- Email alerts for failures
Reference Files
SDK Wrapper:
/home/bam/claude/mvp-factory/test-scripts/openhands-sdk-wrapper-sh.sh
Phase 2 Learnings:
- Data preservation pattern:
$node["Node Name"].json - SSH node overwrites data:
{code, stdout, stderr} - n8n API usage:
/home/bam/.n8n_api_key
n8n API Documentation:
- See
n8n-api.mdfor complete API reference
Existing Workflow:
- Workflow ID:
j1MmXaRhDjvkRSLa - See
N8N_DATA_PRESERVATION_SOLUTION.mdfor details
Troubleshooting
Retry Counter Issues
Symptom: Retry count always 1
Solution: Initialize staticData properly: $workflow.staticData = $workflow.staticData || {};
Gitea Status Not Updating
Symptom: Commit status stays "pending" Solution: Check Gitea token has correct permissions, verify URL format
OpenHands Not Using Feedback
Symptom: Subsequent retries have same errors Solution: Ensure error message is included in task string for retry
Workflow Hangs
Symptom: Workflow stops after OpenHands execution Solution: Add Wait node, ensure timeout configured
Phase 3 Timeline
Estimated Duration: 3-4 hours
Breakdown:
- Step 1-2: Setup (30 min)
- Step 3-4: Basic workflow (60 min)
- Step 5-6: Test retry logic (90 min)
- Step 7: Real project test (30 min)
- Step 8: Documentation (30 min)
Phase 3 Planning - Last Updated: 2025-12-02 Ready for implementation