feat: Add DevLoop automation and HTML Reports

## DevLoop - Closed-Loop Development System
- Orchestrator for plan → build → test → analyze cycle
- Gemini planning via OpenCode CLI
- Claude implementation via CLI bridge
- Playwright browser testing integration
- Test runner with API, filesystem, and browser tests
- Persistent state in .devloop/ directory
- CLI tool: tools/devloop_cli.py

Usage:
  python tools/devloop_cli.py start 'Create new feature'
  python tools/devloop_cli.py plan 'Fix bug in X'
  python tools/devloop_cli.py test --study support_arm
  python tools/devloop_cli.py browser --level full

## HTML Reports (optimization_engine/reporting/)
- Interactive Plotly-based reports
- Convergence plot, Pareto front, parallel coordinates
- Parameter importance analysis
- Self-contained HTML (offline-capable)
- Tailwind CSS styling

## Playwright E2E Tests
- Home page tests
- Test results in test-results/

## LAC Knowledge Base Updates
- Session insights (failures, workarounds, patterns)
- Optimization memory for arm support study
This commit is contained in:
2026-01-24 21:18:18 -05:00
parent a3f18dc377
commit 3193831340
24 changed files with 6437 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
{
"timestamp": "2026-01-22T18:13:30.884945",
"scenarios": [
{
"scenario_id": "browser_home_stats",
"scenario_name": "Home page shows statistics",
"passed": true,
"duration_ms": 1413.166,
"error": null,
"details": {
"navigated_to": "http://localhost:3003/",
"found_selector": "text=Total Trials"
}
},
{
"scenario_id": "browser_expand_folder",
"scenario_name": "Topic folder expands on click",
"passed": true,
"duration_ms": 2785.3219999999997,
"error": null,
"details": {
"navigated_to": "http://localhost:3003/",
"found_selector": "span:has-text('completed'), span:has-text('running'), span:has-text('paused')",
"clicked": "button:has-text('trials')"
}
}
],
"summary": {
"passed": 2,
"failed": 0,
"total": 2
}
}

View File

@@ -0,0 +1,16 @@
{
"objective": "Implement Dashboard Intake & AtomizerSpec Integration: Phase 1 - Create backend intake API routes (create, introspect, list, topics endpoints) and spec_manager service. The spec_models.py and JSON schema have already been updated with SpecStatus, IntrospectionData, BaselineData, and ExpressionInfo models. Now need to create: 1) backend/api/services/spec_manager.py for centralized spec CRUD, 2) backend/api/routes/intake.py with endpoints for creating inbox folders, running introspection, listing inbox contents, and listing topics, 3) Register the intake router in main.py. Reference the plan at docs/plans/DASHBOARD_INTAKE_ATOMIZERSPEC_INTEGRATION.md",
"approach": "Fallback plan - manual implementation",
"tasks": [
{
"id": "task_001",
"description": "Implement: Implement Dashboard Intake & AtomizerSpec Integration: Phase 1 - Create backend intake API routes (create, introspect, list, topics endpoints) and spec_manager service. The spec_models.py and JSON schema have already been updated with SpecStatus, IntrospectionData, BaselineData, and ExpressionInfo models. Now need to create: 1) backend/api/services/spec_manager.py for centralized spec CRUD, 2) backend/api/routes/intake.py with endpoints for creating inbox folders, running introspection, listing inbox contents, and listing topics, 3) Register the intake router in main.py. Reference the plan at docs/plans/DASHBOARD_INTAKE_ATOMIZERSPEC_INTEGRATION.md",
"file": "TBD",
"priority": "high"
}
],
"test_scenarios": [],
"acceptance_criteria": [
"Implement Dashboard Intake & AtomizerSpec Integration: Phase 1 - Create backend intake API routes (create, introspect, list, topics endpoints) and spec_manager service. The spec_models.py and JSON schema have already been updated with SpecStatus, IntrospectionData, BaselineData, and ExpressionInfo models. Now need to create: 1) backend/api/services/spec_manager.py for centralized spec CRUD, 2) backend/api/routes/intake.py with endpoints for creating inbox folders, running introspection, listing inbox contents, and listing topics, 3) Register the intake router in main.py. Reference the plan at docs/plans/DASHBOARD_INTAKE_ATOMIZERSPEC_INTEGRATION.md"
]
}

View File

@@ -0,0 +1,64 @@
{
"timestamp": "2026-01-22T21:10:54.742272",
"scenarios": [
{
"scenario_id": "test_study_dir",
"scenario_name": "Study directory exists: stage_3_arm",
"passed": true,
"duration_ms": 0.0,
"error": null,
"details": {
"path": "C:\\Users\\antoi\\Atomizer\\studies\\Stage3\\stage_3_arm",
"exists": true
}
},
{
"scenario_id": "test_spec",
"scenario_name": "AtomizerSpec is valid JSON",
"passed": true,
"duration_ms": 1.045,
"error": null,
"details": {
"valid_json": true
}
},
{
"scenario_id": "test_readme",
"scenario_name": "README exists",
"passed": true,
"duration_ms": 0.0,
"error": null,
"details": {
"path": "C:\\Users\\antoi\\Atomizer\\studies\\Stage3\\stage_3_arm\\README.md",
"exists": true
}
},
{
"scenario_id": "test_run_script",
"scenario_name": "run_optimization.py exists",
"passed": true,
"duration_ms": 0.0,
"error": null,
"details": {
"path": "C:\\Users\\antoi\\Atomizer\\studies\\Stage3\\stage_3_arm\\run_optimization.py",
"exists": true
}
},
{
"scenario_id": "test_model_dir",
"scenario_name": "Model directory exists",
"passed": true,
"duration_ms": 0.0,
"error": null,
"details": {
"path": "C:\\Users\\antoi\\Atomizer\\studies\\Stage3\\stage_3_arm\\1_setup\\model",
"exists": true
}
}
],
"summary": {
"passed": 5,
"failed": 0,
"total": 5
}
}