diff --git a/docs/superpowers/plans/2026-04-07-plan3-runtime-management.md b/docs/superpowers/plans/2026-04-07-plan3-runtime-management.md
index 333bce3..be82cad 100644
--- a/docs/superpowers/plans/2026-04-07-plan3-runtime-management.md
+++ b/docs/superpowers/plans/2026-04-07-plan3-runtime-management.md
@@ -1,6 +1,8 @@
# Plan 3: Runtime Management in the Server
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+> **Status: COMPLETED** — Verified 2026-04-09. All runtime management fully ported to cameleer3-server with enhancements beyond the original plan.
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking.
**Goal:** Move environment management, app lifecycle, JAR upload, and Docker container orchestration from the SaaS layer into the server, so the server is a self-sufficient product that can deploy and manage Camel applications.
@@ -78,7 +80,7 @@ src/main/resources/db/migration/
**Files:**
- Modify: `cameleer3-server-app/pom.xml`
-- [ ] **Step 1: Add docker-java dependency**
+- [x] **Step 1: Add docker-java dependency**
```xml
@@ -93,12 +95,12 @@ src/main/resources/db/migration/
```
-- [ ] **Step 2: Verify build**
+- [x] **Step 2: Verify build**
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn compile -pl cameleer3-server-app`
Expected: BUILD SUCCESS.
-- [ ] **Step 3: Commit**
+- [x] **Step 3: Commit**
```bash
git add cameleer3-server-app/pom.xml
@@ -112,7 +114,7 @@ git commit -m "chore: add docker-java dependency for runtime orchestration"
**Files:**
- Create: `cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql`
-- [ ] **Step 1: Write migration**
+- [x] **Step 1: Write migration**
```sql
-- V3__runtime_management.sql
@@ -171,7 +173,7 @@ CREATE INDEX idx_deployments_env_id ON deployments(environment_id);
INSERT INTO environments (slug, display_name) VALUES ('default', 'Default');
```
-- [ ] **Step 2: Commit**
+- [x] **Step 2: Commit**
```bash
git add cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql
@@ -185,7 +187,7 @@ git commit -m "feat: add runtime management database schema (environments, apps,
**Files:**
- Create all records in `cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/`
-- [ ] **Step 1: Create all domain records**
+- [x] **Step 1: Create all domain records**
```java
// Environment.java
@@ -233,7 +235,7 @@ package com.cameleer3.server.core.runtime;
public enum RoutingMode { path, subdomain }
```
-- [ ] **Step 2: Commit**
+- [x] **Step 2: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
@@ -247,7 +249,7 @@ git commit -m "feat: add runtime management domain records"
**Files:**
- Create repository interfaces and RuntimeOrchestrator in `core/runtime/`
-- [ ] **Step 1: Create repository interfaces**
+- [x] **Step 1: Create repository interfaces**
```java
// EnvironmentRepository.java
@@ -299,7 +301,7 @@ public interface DeploymentRepository {
}
```
-- [ ] **Step 2: Create RuntimeOrchestrator interface**
+- [x] **Step 2: Create RuntimeOrchestrator interface**
```java
// RuntimeOrchestrator.java
@@ -340,7 +342,7 @@ public record ContainerStatus(String state, boolean running, int exitCode, Strin
}
```
-- [ ] **Step 3: Commit**
+- [x] **Step 3: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
@@ -354,7 +356,7 @@ git commit -m "feat: add runtime repository interfaces and RuntimeOrchestrator"
**Files:**
- Create service classes in `core/runtime/`
-- [ ] **Step 1: Create EnvironmentService**
+- [x] **Step 1: Create EnvironmentService**
```java
package com.cameleer3.server.core.runtime;
@@ -390,7 +392,7 @@ public class EnvironmentService {
}
```
-- [ ] **Step 2: Create AppService**
+- [x] **Step 2: Create AppService**
```java
package com.cameleer3.server.core.runtime;
@@ -473,7 +475,7 @@ public class AppService {
}
```
-- [ ] **Step 3: Create DeploymentService**
+- [x] **Step 3: Create DeploymentService**
```java
package com.cameleer3.server.core.runtime;
@@ -531,7 +533,7 @@ public class DeploymentService {
}
```
-- [ ] **Step 4: Commit**
+- [x] **Step 4: Commit**
```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
@@ -545,7 +547,7 @@ git commit -m "feat: add EnvironmentService, AppService, DeploymentService"
**Files:**
- Create all Postgres repositories in `app/storage/`
-- [ ] **Step 1: Implement all four repositories**
+- [x] **Step 1: Implement all four repositories**
Follow the pattern from `PostgresUserRepository.java` — `JdbcTemplate` with row mappers. Each repository implements its core interface with standard SQL (INSERT, SELECT, UPDATE, DELETE).
@@ -555,7 +557,7 @@ Key patterns to follow:
- `UUID.randomUUID()` for ID generation
- `Timestamp.from(Instant)` for timestamp parameters
-- [ ] **Step 2: Wire beans**
+- [x] **Step 2: Wire beans**
Create `RuntimeBeanConfig.java` in `app/config/`:
@@ -594,12 +596,12 @@ public class RuntimeBeanConfig {
}
```
-- [ ] **Step 3: Run tests**
+- [x] **Step 3: Run tests**
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn test -pl cameleer3-server-app`
Expected: PASS (Flyway applies V3 migration, context loads).
-- [ ] **Step 4: Commit**
+- [x] **Step 4: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/Postgres*Repository.java
@@ -616,7 +618,7 @@ git commit -m "feat: implement PostgreSQL repositories for runtime management"
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DisabledRuntimeOrchestrator.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/RuntimeOrchestratorAutoConfig.java`
-- [ ] **Step 1: Implement DisabledRuntimeOrchestrator**
+- [x] **Step 1: Implement DisabledRuntimeOrchestrator**
```java
package com.cameleer3.server.app.runtime;
@@ -634,7 +636,7 @@ public class DisabledRuntimeOrchestrator implements RuntimeOrchestrator {
}
```
-- [ ] **Step 2: Implement DockerRuntimeOrchestrator**
+- [x] **Step 2: Implement DockerRuntimeOrchestrator**
Port from SaaS `DockerRuntimeOrchestrator.java`, adapted:
- Uses docker-java `DockerClientImpl` with zerodep transport
@@ -680,7 +682,7 @@ public String startContainer(ContainerRequest request) {
}
```
-- [ ] **Step 3: Implement RuntimeOrchestratorAutoConfig**
+- [x] **Step 3: Implement RuntimeOrchestratorAutoConfig**
```java
package com.cameleer3.server.app.runtime;
@@ -713,7 +715,7 @@ public class RuntimeOrchestratorAutoConfig {
}
```
-- [ ] **Step 4: Commit**
+- [x] **Step 4: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/
@@ -727,7 +729,7 @@ git commit -m "feat: implement DockerRuntimeOrchestrator with volume-mount JAR d
**Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java`
-- [ ] **Step 1: Implement async deployment pipeline**
+- [x] **Step 1: Implement async deployment pipeline**
```java
package com.cameleer3.server.app.runtime;
@@ -819,7 +821,7 @@ public class DeploymentExecutor {
}
```
-- [ ] **Step 2: Add async config**
+- [x] **Step 2: Add async config**
Add to `RuntimeBeanConfig.java` or create `AsyncConfig.java`:
@@ -836,7 +838,7 @@ public TaskExecutor deploymentTaskExecutor() {
}
```
-- [ ] **Step 3: Commit**
+- [x] **Step 3: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java
@@ -852,11 +854,11 @@ git commit -m "feat: implement async DeploymentExecutor pipeline"
- Create: `AppController.java` (under `/api/v1/apps`, OPERATOR role)
- Create: `DeploymentController.java` (under `/api/v1/apps/{appId}/deployments`, OPERATOR role)
-- [ ] **Step 1: Implement EnvironmentAdminController**
+- [x] **Step 1: Implement EnvironmentAdminController**
CRUD for environments. Path: `/api/v1/admin/environments`. Requires ADMIN role. Follows existing controller patterns (OpenAPI annotations, ResponseEntity).
-- [ ] **Step 2: Implement AppController**
+- [x] **Step 2: Implement AppController**
App CRUD + JAR upload. Path: `/api/v1/apps`. Requires OPERATOR role. JAR upload via `multipart/form-data`. Returns app versions.
@@ -870,7 +872,7 @@ public ResponseEntity uploadJar(@PathVariable UUID appId,
}
```
-- [ ] **Step 3: Implement DeploymentController**
+- [x] **Step 3: Implement DeploymentController**
Deploy, stop, restart, promote, logs. Path: `/api/v1/apps/{appId}/deployments`. Requires OPERATOR role.
@@ -894,7 +896,7 @@ public ResponseEntity promote(@PathVariable UUID appId, @PathVariabl
}
```
-- [ ] **Step 4: Add security rules to SecurityConfig**
+- [x] **Step 4: Add security rules to SecurityConfig**
Add to `SecurityConfig.filterChain()`:
```java
@@ -902,7 +904,7 @@ Add to `SecurityConfig.filterChain()`:
.requestMatchers("/api/v1/apps/**").hasAnyRole("OPERATOR", "ADMIN")
```
-- [ ] **Step 5: Commit**
+- [x] **Step 5: Commit**
```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/EnvironmentAdminController.java
@@ -918,7 +920,7 @@ git commit -m "feat: add REST controllers for environment, app, and deployment m
**Files:**
- Modify: `cameleer3-server-app/src/main/resources/application.yml`
-- [ ] **Step 1: Add runtime config properties**
+- [x] **Step 1: Add runtime config properties**
```yaml
cameleer:
@@ -935,12 +937,12 @@ cameleer:
routing-domain: ${CAMELEER_ROUTING_DOMAIN:localhost}
```
-- [ ] **Step 2: Run full test suite**
+- [x] **Step 2: Run full test suite**
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
Expected: PASS.
-- [ ] **Step 3: Commit**
+- [x] **Step 3: Commit**
```bash
git add cameleer3-server-app/src/main/resources/application.yml
@@ -951,19 +953,19 @@ git commit -m "feat: add runtime management configuration properties"
### Task 11: Integration Tests
-- [ ] **Step 1: Write EnvironmentAdminController integration test**
+- [x] **Step 1: Write EnvironmentAdminController integration test**
Test CRUD operations for environments. Follows existing pattern from `AgentRegistrationControllerIT`.
-- [ ] **Step 2: Write AppController integration test**
+- [x] **Step 2: Write AppController integration test**
Test app creation, JAR upload, version listing.
-- [ ] **Step 3: Write DeploymentController integration test**
+- [x] **Step 3: Write DeploymentController integration test**
Test deployment creation (with `DisabledRuntimeOrchestrator` — verifies the deployment record is created even if Docker is unavailable). Full Docker tests require Docker-in-Docker and are out of scope for CI.
-- [ ] **Step 4: Commit**
+- [x] **Step 4: Commit**
```bash
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/
@@ -974,16 +976,16 @@ git commit -m "test: add integration tests for runtime management API"
### Task 12: Final Verification
-- [ ] **Step 1: Run full build**
+- [x] **Step 1: Run full build**
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
Expected: All tests PASS.
-- [ ] **Step 2: Verify schema applies cleanly**
+- [x] **Step 2: Verify schema applies cleanly**
Fresh Testcontainers PostgreSQL should apply V1 + V2 + V3 without errors.
-- [ ] **Step 3: Commit any remaining fixes**
+- [x] **Step 3: Commit any remaining fixes**
```bash
git add -A