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:
33
.devloop/browser_test_results.json
Normal file
33
.devloop/browser_test_results.json
Normal 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
|
||||
}
|
||||
}
|
||||
16
.devloop/current_plan.json
Normal file
16
.devloop/current_plan.json
Normal 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"
|
||||
]
|
||||
}
|
||||
64
.devloop/test_results.json
Normal file
64
.devloop/test_results.json
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user