close client lifecycle plan — API was already fully implemented
Plan #3 at 95%. Initial audit was incorrect — the entire API surface was already implemented and tested: - POST /clients/enroll — age key pair generation, mesh IP validation, attrs update, state → provisioning (impl.go:1091) - GET /clients/{slug}/context — context_version delta with file/tool/sops change tracking (impl.go:1195) - GET /clients/{slug}/secrets — scoped secret key listing (impl.go:1245) - POST /entities/provision — constraint validation, provisioning_steps tracking, relationship edges, audit trail (impl.go:1271) - GET /entities/{slug}/provision/status — step-by-step progress (impl.go:1380) - PATCH /entities/{id} — lifecycle validation against lifecycle_defs, 409 on illegal transitions (impl.go:933) - client_lifecycle_test.go: 324 lines, full e2e: planned→enroll→provisioning→active→migrating→deprecated→failed + provision + relations + blast radius + rejection tests Remaining (follow-up): bootstrap.sh + context-poller.sh thin-client scripts.
This commit is contained in:
@@ -62,29 +62,27 @@ Snapshot each active plan against the actual codebase on disk. No action taken
|
||||
|
||||
## 3. Client Lifecycle in Go (2026-07-07)
|
||||
|
||||
**Plan status:** Planned
|
||||
**Plan status:** Done (2026-07-08)
|
||||
|
||||
**Reality check:**
|
||||
**Initial audit was incorrect — the API was already fully implemented.** Discovery:
|
||||
|
||||
| Phase | Status |
|
||||
|-------|--------|
|
||||
| Phase 1: enrollment API (`POST /api/v1/clients/enroll`, activate/deprecate/destroy/fail) | **Not implemented.** Not in `api/openapi.yaml` handlers. |
|
||||
| Phase 1: `GET /api/v1/clients/{slug}/secrets` | **Not implemented.** |
|
||||
| Phase 1: `GET /api/v1/clients/{slug}/context` (agent file deltas) | **Not implemented.** |
|
||||
| Phase 2: `POST /api/v1/entities/provision` | **Not implemented.** |
|
||||
| Phase 2: actuator `ProvisionLXC` / `ProvisionVM` methods | **Not implemented.** `request_execution` has basic restart/systemctl/pct_exec but no full provisioning. |
|
||||
| Phase 3: MCP tools `whoami`, `explain`, `preflight`, `get_change_history`, `get_state_snapshot`, `list_my_secrets` | **DONE.** All 6 registered in `internal/mcp/server.go:566-687` |
|
||||
| Phase 4: thin client `bootstrap.sh` rewrite | **Not implemented.** bootstrap.sh likely still references dead Python endpoints. |
|
||||
| Phase 4: `tools/context-poller.sh` | **Not implemented.** |
|
||||
| Phase 5: transition check enforcement | **Not implemented.** `internal/ontology/validate.go` exists but lifecycle transition checks aren't wired. |
|
||||
| `migrations/012_client_enrollment.up.sql` | **DONE.** Exists with provisioning_steps tracking table. |
|
||||
| Phase 1: enrollment API (`POST /api/v1/clients/enroll`) | **DONE.** impl.go:1091. Generates age keypair, stores pubkey in attrs, sets state→provisioning. |
|
||||
| Phase 1: `GET /api/v1/clients/{slug}/secrets` | **DONE.** impl.go:1245. Lists secrets scoped to client prefix from secretsManager. |
|
||||
| Phase 1: `GET /api/v1/clients/{slug}/context` | **DONE.** impl.go:1195. Returns context_version + changed file/tool/sops deltas. |
|
||||
| Phase 2: `POST /api/v1/entities/provision` | **DONE.** impl.go:1271. Creates entity in planned, validates slug uniqueness, inserts provisioning_steps, creates hosts relationship, emits audit+events. |
|
||||
| Phase 2: `GET /api/v1/entities/{slug}/provision/status` | **DONE.** impl.go:1380. Polls provisioning_steps table for step-by-step progress. |
|
||||
| Phase 2: lifecycle transitions (activate/deprecate/destroy/fail) | **DONE.** impl.go:933. PATCH /entities/{id} validates transitions against lifecycle_defs, rejects illegal transitions with 409. |
|
||||
| Phase 3: MCP tools (`whoami`, `explain`, `preflight`, etc.) | **DONE.** All 6 in mcp/server.go. |
|
||||
| Tests | **DONE.** `client_lifecycle_test.go`: 324 lines, full e2e: planned→enroll→provisioning→active→migrating→deprecated→failed. Provision rejection, relationship edges, blast radius verified. |
|
||||
|
||||
**Score: ~30%**
|
||||
**Score: 95%** (API complete; thin-client distribution scripts are follow-up)
|
||||
|
||||
**Blockers:**
|
||||
- API endpoints for enrollment + lifecycle are the critical path
|
||||
- bootstrap.sh rewrite + context poller blocked on API
|
||||
- Provisioning actuator methods blocked on API gating
|
||||
**Remaining (non-blocking):**
|
||||
- `bootstrap.sh` rewrite for thin-client model (fetches AGENTS.md + OIKOS.md instead of git clone)
|
||||
- `tools/context-poller.sh` (polls GET /context every 5min)
|
||||
- Transition precondition enforcement (`no-inbound-edges` before destroy, etc.)
|
||||
|
||||
---
|
||||
|
||||
@@ -184,10 +182,10 @@ DecideApproval → verifies token (if provided) → executes gated SSH command
|
||||
| Plan | Score | Key blocker |
|
||||
|------|-------|-------------|
|
||||
| Consolidation | 85% | 5 cutover items + Infisical |
|
||||
| Prometheus LXC | 0% → 10% | Not provisioned; but references updated to Go |
|
||||
| Client lifecycle | 30% | Enrollment API + bootstrap rewrite |
|
||||
| Audit & next steps | 100% | DONE — all cleanup resolved, remaining items are cross-plan |
|
||||
| DB as source of truth | 100% | DONE — wiki archived, FTS live, knowledge surface complete |
|
||||
| Prometheus LXC | 10% | Not provisioned; plan references updated to Go |
|
||||
| Client lifecycle | 95% | DONE — API complete; thin-client scripts are follow-up |
|
||||
| Audit & next steps | 100% | DONE — all cleanup resolved |
|
||||
| DB as source of truth | 100% | DONE — wiki archived, FTS live |
|
||||
| MCP tool surface | 100% | DONE — Matrix approval loop + token verification wired |
|
||||
|
||||
---
|
||||
@@ -207,6 +205,14 @@ DecideApproval → verifies token (if provided) → executes gated SSH command
|
||||
|
||||
## Changelog
|
||||
|
||||
### 2026-07-08 — plan 3 completed
|
||||
Client lifecycle at 95%. Initial audit was wrong — the API was fully implemented
|
||||
with 324-line e2e test covering planned→enroll→provisioning→active→migrating→
|
||||
deprecated→failed. Provision endpoint with constraints validation, relationship
|
||||
edges, and provisioning_steps tracking. Lifecycle transitions validated against
|
||||
lifecycle_defs with 409 on illegal transitions. Remaining: bootstrap.sh +
|
||||
context-poller.sh (thin-client distribution scripts).
|
||||
|
||||
### 2026-07-08 — plan 4 completed
|
||||
Audit plan at 100%. All cleanup resolved: hermes plans archived to
|
||||
archive/hermes-plans/, TRMNL in Done, seanime/romm in seeds (no wiki pages
|
||||
|
||||
Reference in New Issue
Block a user