An autonomous DevSecOps agent powered by IBM Bob that detects, remediates, and governs software supply chain vulnerabilities β end-to-end, without human intervention.
"Other tools detect vulnerabilities. ARCE detects, verifies, patches, tests, self-corrects, verifies the live application, and submits a governed PR β autonomously, with a compliance-ready audit trail. The human stays in control. The agent handles the engineering toil."
ARCE is a closed-loop, autonomous remediation pipeline that transforms a CVE detection into a governed, human-reviewable Pull Request β in minutes, not days. It orchestrates IBM Bob through a custom compliance-remediator mode with two MCP servers to execute 9 steps autonomously:
| Step | Action | What Happens |
|---|---|---|
| 1 | Detect | pip-audit scans dependencies and flags pyyaml==5.3.1 with CVE-2020-14343 |
| 2 | Verify Reachability | AST-based static analysis confirms yaml.load() is imported AND called β not just listed as a dependency |
| 3 | Patch | Upgrades pyyaml to latest stable version in requirements.txt |
| 4 | Test (FAIL) | Runs pytest β TypeError: load() missing 1 required positional argument: 'Loader' |
| 5 | Self-Correct | Bob reads the error, reasons about the breaking API change, and fixes yaml.load(f) β yaml.safe_load(f) |
| 6 | Test (PASS) | Runs pytest again β all 3 tests pass β |
| 7 | E2E Verify | Starts Flask app, uses Playwright to verify localhost:5000 and /api/health respond correctly |
| 8 | Generate Audit Trail | Produces audit.md β a compliance-ready document with CVE details, patch diff, test results, and agent reasoning |
| 9 | Create Governed PR | Submits a GitHub Pull Request with the audit trail as the PR body |
The self-correction at steps 4β6 is the killer feature. Bob doesn't just blindly patch β it upgrades, discovers the upgrade broke tests, reads the error message, reasons about the fix, and applies it. This is agentic reasoning, not scripted automation.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ARCE Full Stack β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Frontend (React 19 + TanStack Start) β β
β β - Marketing site (/) β β
β β - Live Dashboard (/dashboard) β β
β β - Documentation (/docs) β β
β β Port: 5173 β β
β ββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β β HTTP REST API (CORS enabled) β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Backend (FastAPI) β β
β β - 12 REST endpoints β β
β β - Data transformers β β
β β - Type-safe responses β β
β β Port: 8000 β β
β ββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β β File I/O β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Data Layer (runs/ directory) β β
β β runs/{run_id}/ β β
β β ββ run.json (structured data) β β
β β ββ audit.md (markdown report) β β
β β ββ sbom.json (bill of materials) β β
β ββββββββββββββββββ²ββββββββββββββββββββββββββββββββββ β
β β β
β β MCP Tools β
β β β
β ββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββ β
β β ARCE Pipeline (Bob + MCP Server) β β
β β ββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β MCP Server 1: arce-tools (FastMCP) β β β
β β β - check_reachability (AST analysis) β β β
β β β - run_tests (pytest subprocess) β β β
β β β - generate_audit_trail (audit.md) β β β
β β β - create_governed_pr (gh CLI) β β β
β β β - start/end_pipeline_run (run tracking) β β β
β β β - evaluate_policy (severity gating) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββ β β
β β ββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β MCP Server 2: Playwright β β β
β β β - browser_navigate, browser_snapshot β β β
β β β - browser_screenshot (E2E verification) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Detect β
pip-auditscans dependencies - Verify Reachability β AST analysis confirms usage
- Evaluate Policy β Severity-based gating
- Patch β Upgrade to latest stable version
- Test β Run pytest (may fail)
- Self-Correct β Bob fixes breaking changes
- Re-test β Verify fix works
- E2E Verify β Playwright checks live app
- Generate Audit β Create compliance trail
- Create PR β Submit governed pull request
- Dashboard β View results in real-time
| Component | Tool | Cost |
|---|---|---|
| Frontend | React 19 + TanStack Start + Vite 7 | Free |
| Backend API | FastAPI + Uvicorn | Free |
| Detection | pip-audit (backed by OSV.dev) |
Free |
| Agentic Core | IBM Bob β custom mode | Provided |
| MCP Server 1 | FastMCP (Python) β remediation tools |
Free |
| MCP Server 2 | @playwright/mcp β E2E browser verification |
Free |
| Testing | pytest |
Free |
| Static Analysis | Python ast module |
Built-in |
| PR Creation | GitHub CLI (gh) |
Free |
| UI Components | shadcn/ui + Tailwind CSS v4 | Free |
Total cost: $0 β Every component is free or open-source.
Frontend: Modern React dashboard with real-time metrics Backend: FastAPI REST API serving live remediation data View Legacy Streamlit Dashboard β
View the Governed PR on GitHub β
PR #2: Security: Patch CVE-2020-14343 β created autonomously by ARCE with full audit trail
# Windows
.\start-servers.ps1
# Linux/Mac
chmod +x start-servers.sh
./start-servers.shThat's it! This single command:
- β Installs all dependencies (backend + frontend)
- β
Starts FastAPI backend on
http://localhost:8000 - β
Starts React frontend on
http://localhost:5173 - β Configures CORS for local development
- Frontend Dashboard: http://localhost:5173
- Backend API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
- Python 3.10+
- Bun (or Node.js 18+) β
npm install -g bun - Git + GitHub CLI (
gh) βwinget install GitHub.cli - IBM Bob (provided by hackathon)
# Backend
pip install -r arce/requirements-api.txt
python arce/api_server.py
# Frontend (in new terminal)
cd Frontend
bun install
bun dev.\venv\Scripts\pip-audit.exe --format json -r demo-app/requirements.txtShould flag pyyaml==5.3.1 with CVE-2020-14343 (arbitrary code execution via unsafe YAML deserialization).
- Open Bob IDE β Settings β MCP Servers
- Add
arce-toolsandplaywrightservers (see MCP Configuration Guide) - Verify both servers show β Connected
- Switch to ARCE Compliance Remediator mode in Bob IDE
- Paste the pip-audit output and prompt:
I have scanned the demo-app directory with pip-audit and found vulnerabilities.
Here is the output: <paste CVE JSON>
Please execute the full remediation pipeline on the demo-app/ directory.
- Watch Bob autonomously execute all 9 steps π
- Verify the vulnerability exists:
.\venv\Scripts\pip-audit.exe --format json -r demo-app-jinja/requirements.txtShould flag jinja2==3.1.2 with CVE-2024-22195 (attribute injection via xmlattr filter).
- Switch to ARCE Compliance Remediator mode in Bob IDE
- Paste the pip-audit output and prompt:
I have scanned the demo-app-jinja directory with pip-audit and found vulnerabilities.
Here is the output: <paste CVE JSON>
Please execute the full remediation pipeline on the demo-app-jinja/ directory.
Remember to use project_dir="demo-app-jinja" when calling run_tests.
- Watch Bob autonomously detect the jinja2 vulnerability, upgrade to the latest version, and verify the fix through the attribute injection test π
Live Dashboard (already running at http://localhost:5173):
- Real-time KPIs (security score, open critical CVEs, auto-patched count)
- Repository status with severity breakdown
- Activity feed showing recent events
- Pull request details with AI reasoning trace
- Audit reports with download links
Check the Fix:
type demo-app\app.py # yaml.load(f) β yaml.safe_load(f) β
type demo-app\requirements.txt # pyyaml upgraded β
type audit.md # Full compliance document β
Legacy Streamlit Dashboard (optional):
cd dashboard
streamlit run streamlit_app.pyThe ARCE dashboard is a production-ready React application with:
Frontend Features:
- β‘ React 19 with TanStack Start for SSR
- π¨ Tailwind CSS v4 with custom design tokens
- π§© shadcn/ui components for consistent UI
- π Real-time metrics from live remediation runs
- π Smart fallback to mock data when backend unavailable
- π± Responsive design for desktop and mobile
Backend API (FastAPI):
- π 12 REST endpoints serving dashboard data
- π Data transformers converting run records to frontend types
- π CORS configured for secure local development
- π Type-safe responses matching frontend contracts
- π Aggregated metrics (KPIs, repositories, activity feed)
- π₯ File downloads for audit trails and SBOMs
Key Endpoints:
GET /api/kpis- Dashboard KPI metricsGET /api/repositories- Repository status listGET /api/activity- Activity feed eventsGET /api/pull-requests/open- Latest open PRGET /api/runs- All run recordsGET /api/audits/{run_id}/markdown- Download audit trail
Data Flow:
MCP Pipeline β runs/{run_id}/run.json β FastAPI β React Dashboard
See BACKEND-INTEGRATION.md for complete API documentation.
ARCE/
βββ Frontend/ # π React Dashboard (TanStack Start + Vite)
β βββ src/
β β βββ routes/ # File-based routing (/, /dashboard, /docs)
β β βββ components/ # UI components + shadcn primitives
β β βββ lib/api.ts # Backend adapter (wired to FastAPI)
β β βββ data/types.ts # TypeScript type definitions
β βββ .env.local # API base URL configuration
β βββ package.json # Frontend dependencies
β
βββ arce/ # Backend & MCP Server
β βββ api_server.py # π FastAPI REST API (12 endpoints)
β βββ requirements-api.txt # π Backend dependencies
β βββ mcp_server.py # FastMCP server with remediation tools
β βββ run_io.py # Run record I/O operations
β βββ policy/ # Policy engine for severity-based gating
β βββ schemas/ # JSON schemas for run records
β
βββ runs/ # π Run artifacts (created by pipeline)
β βββ {run_id}/ # Each run gets its own directory
β βββ run.json # Structured run record
β βββ audit.md # Compliance audit trail
β βββ sbom.json # Software bill of materials
β
βββ demo-app/ # Target application with known vulnerability
β βββ app.py # Flask app with vulnerable yaml.load()
β βββ config.yaml # App configuration
β βββ requirements.txt # pyyaml==5.3.1 β CVE-2020-14343
β βββ tests/ # pytest test suite
β
βββ demo-app-jinja/ # Second demo scenario (Jinja2 CVE)
β βββ app.py # Flask app with vulnerable xmlattr filter
β βββ requirements.txt # jinja2==3.1.2 β CVE-2024-22195
β βββ tests/ # pytest test suite
β
βββ dashboard/ # Legacy Streamlit Dashboard
β βββ streamlit_app.py # SOC-style dashboard
β βββ requirements.txt # streamlit + plotly dependencies
β
βββ .bob/ # IBM Bob configuration
β βββ mcp.json # MCP server registration
β βββ custom_modes.yaml # compliance-remediator mode definition
β
βββ start-servers.ps1 # π One-command startup (Windows)
βββ start-servers.sh # π One-command startup (Linux/Mac)
βββ test_integration.py # π Backend integration tests
βββ BACKEND-INTEGRATION.md # π API documentation (372 lines)
βββ FRONTEND-BACKEND-SETUP.md # π Setup guide (344 lines)
βββ INTEGRATION-SUMMARY.md # π Integration overview (390 lines)
βββ audit.md # Generated audit trail
βββ cve_output.json # pip-audit scan output
βββ setup-mcp.ps1 # MCP setup script
βββ MCP-CONFIGURATION-GUIDE.md # MCP configuration reference
git checkout main
git reset --hard origin/main
.\venv\Scripts\pip.exe install "pyyaml==5.3.1" --force-reinstallThis restores app.py to the vulnerable yaml.load() and pins pyyaml back to 5.3.1.
Uses Python's ast module to parse every .py file and walk the AST looking for:
import <package>orfrom <package> import ...statements- Function calls like
<package>.load(),<package>.dump(), etc.
Returns "reachable" (imported + called), "imported-but-unused", or "not-imported".
Why it matters: Prevents patching code that doesn't even use the vulnerable package β this is the Contextual Reasoning criterion.
Executes pytest via subprocess and returns structured JSON with pass/fail status, stdout, stderr, and return code. Bob reads this to reason about test failures.
Produces a compliance-ready markdown document with:
- CVE details and reachability verdict
- Patch diff
- Test results (before and after self-correction)
- E2E verification evidence
- Agent reasoning trace (with triple-fallback: Bob export β task logs β tool I/O)
Creates a Git branch, commits all changes, pushes, and opens a GitHub PR with audit.md as the PR body β all via git and gh CLI.
| Problem | Fix |
|---|---|
pytest not found |
Use .\venv\Scripts\pytest.exe or activate venv first |
| MCP server not connecting | Check .bob/mcp.json paths; see MCP Configuration Guide |
gh not recognized |
winget install GitHub.cli β gh auth login |
| Playwright fails | Run npx playwright install to download browsers |
| Tests fail on fresh clone | Ensure you're in demo-app/ dir when running pytest |
| pyyaml version wrong | pip install "pyyaml==5.3.1" --force-reinstall |
π Detailed troubleshooting: MCP Configuration Guide Β· MCP Server Troubleshooting
| Criterion | How ARCE Addresses It |
|---|---|
| Application of Tech | Bob is the central orchestrator via custom mode + 2 MCP servers. Every step runs through Bob. |
| Originality | Closed-loop autonomy with self-correction. Detects β Remediates β Tests β Self-corrects β Verifies β Governs. |
| Business Value | Reduces mean-time-to-remediate from days to minutes. Governance-ready audit trail for CISO/compliance teams. |
| Contextual Reasoning | AST-based reachability analysis β checks if the vulnerable package is actually imported and called before patching. |
| Knowledge Transfer | Streamlit governance dashboard + audit.md serve as knowledge transfer artifacts. |
Built with β€οΈ for the IBM Bob AI Agent Hackathon 2026
Total cost: $0 Β· Fully autonomous Β· Compliance-ready