docs(init): validate v0.6 specification
---ci--- project: orca phase: 0 milestone: v0.6 status: specify ---/ci---
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"phase": 0,
|
"phase": 0,
|
||||||
"stage": "complete",
|
"stage": "specify",
|
||||||
"milestone": "v0.5",
|
"milestone": "v0.6",
|
||||||
"milestone_slug": "distribution",
|
"milestone_slug": "node-bootstrap-proxmox",
|
||||||
"phase_role": "final",
|
"phase_role": "pre_execution",
|
||||||
"attempts": 0,
|
"attempts": 0,
|
||||||
"updated_at": "2026-08-03T19:15:00Z",
|
"updated_at": "2026-08-03T20:00:00Z",
|
||||||
"milestone_complete": true,
|
"milestone_complete": false,
|
||||||
"next_milestone": null
|
"next_milestone": null
|
||||||
}
|
}
|
||||||
@@ -191,3 +191,54 @@ edit coreci/orca --private=false` so that `install.sh` can pull
|
|||||||
release binaries unauthenticated (REQ-045). This is an operational
|
release binaries unauthenticated (REQ-045). This is an operational
|
||||||
step performed during the P0 ship, verified by an unauth `curl`
|
step performed during the P0 ship, verified by an unauth `curl`
|
||||||
against the releases API.
|
against the releases API.
|
||||||
|
|
||||||
|
## v0.6 Scope Summary — Node Bootstrap & Proxmox
|
||||||
|
|
||||||
|
v0.6 is a 3-execution-phase milestone that turns `orca init` from a
|
||||||
|
bare `mkdir` into a full single-node cluster bootstrap, and adds
|
||||||
|
Proxmox 8 & 9 as a first-class remote node type joined over SSH with
|
||||||
|
least-privilege role delegation. The engine functionality from
|
||||||
|
v0.1–v0.5 is unchanged; this milestone is about **bootstrap
|
||||||
|
ergonomics** and **heterogeneous node support**:
|
||||||
|
|
||||||
|
- **P01 — `orca init` full bootstrap.** A single `orca init` call now:
|
||||||
|
(a) creates the namespace dir (`~/.orca` or `/root/.orca` with
|
||||||
|
`--system`); (b) runs all DB migrations including the new 0006
|
||||||
|
(`nodes.kind`, `nodes.os` — backward-compatible nullable columns);
|
||||||
|
(c) bootstraps the internal CA via `security.CAInit` if `ca.crt` is
|
||||||
|
absent; (d) generates the server cert via `security.GenerateCSR` +
|
||||||
|
`ca.SignCSR` if `server.crt` is absent; (e) auto-detects the local
|
||||||
|
OS via `/etc/os-release` `ID=` field (ubuntu/debian/alpine); (f)
|
||||||
|
registers a `localhost` node with `kind=localhost`, `os=<detected>`,
|
||||||
|
`addr=localhost:8443` if no localhost node exists yet. After
|
||||||
|
`orca init`, `orca doctor` MUST pass with zero FAILs. Idempotent:
|
||||||
|
re-running `orca init` is a no-op (or refresh) for already-provisioned
|
||||||
|
artifacts. Covers REQ-047, REQ-048, REQ-049.
|
||||||
|
- **P02 — Proxmox SSH join.** `orca node join --type proxmox --host
|
||||||
|
<addr> --user root --password <pw>` (password via flag or
|
||||||
|
`$ORCA_PROXMOX_PASSWORD`, **never persisted**) bootstraps a remote
|
||||||
|
Proxmox 8/9 host via `golang.org/x/crypto/ssh` (new direct dep).
|
||||||
|
Steps: (1) SSH password-auth; (2) generate or load orca's SSH
|
||||||
|
keypair (`~/.orca/orca_ssh_key` / `.pub`, 0600/0644); (3) deploy
|
||||||
|
pubkey to remote `~orca/.ssh/authorized_keys`; (4) create `orca`
|
||||||
|
user (config-overridable name via `--proxmox-user`, default `orca`);
|
||||||
|
(5) create PVE custom role `OrcaOperator` (config-overridable via
|
||||||
|
`--proxmox-role`) with privileges `VM.Audit`,
|
||||||
|
`Datastore.AllocateSpace`, `SDN.Use`; (6) assign role to `orca`
|
||||||
|
user on `/`; (7) drop `/etc/sudoers.d/orca` allowlist (`pct`, `qm`,
|
||||||
|
`pvesh`, `apt-get`, `dpkg` — no shell-escape commands); (8) record
|
||||||
|
node row `kind=proxmox`, `os=pve`, audit log. Idempotent re-run.
|
||||||
|
Covers REQ-050, REQ-051.
|
||||||
|
- **P03 — `doctor os` + `doctor proxmox`.** Extends `orca doctor`
|
||||||
|
with two new checks: `doctor os` re-runs `/etc/os-release` detection
|
||||||
|
and verifies it matches the stored localhost node row's `os` field
|
||||||
|
(drift = WARN); `doctor proxmox` iterates `kind=proxmox` nodes and
|
||||||
|
SSH-probes each with `pveversion` / `pvecmd status` (3s timeout per
|
||||||
|
peer per D-038 pattern), reporting PASS/WARN/FAIL per node. All
|
||||||
|
bootstrap + join actions emit structured audit-log entries. Covers
|
||||||
|
REQ-052.
|
||||||
|
- **P04 — Final review + ship + audit.** Milestone release.
|
||||||
|
|
||||||
|
The vision ("minimalist, offline-first, CLI-first orchestration
|
||||||
|
engine") is unchanged. v0.6 is a bootstrap-ergonomics + heterogeneous-
|
||||||
|
nodes milestone, not a direction change.
|
||||||
|
|||||||
@@ -99,3 +99,14 @@ Docker image published to Gitea container registry (REQ-046).
|
|||||||
- **P2** (v0.4.3): `install.sh` 1-liner + in-place update (REQ-043/044) + README quickstart (REQ-016).
|
- **P2** (v0.4.3): `install.sh` 1-liner + in-place update (REQ-043/044) + README quickstart (REQ-016).
|
||||||
- **P3** (v0.4.4): Docker release — distroless image + Gitea container registry (REQ-046).
|
- **P3** (v0.4.4): Docker release — distroless image + Gitea container registry (REQ-046).
|
||||||
- **P4** (v0.4.5): final review + audit + milestone release.
|
- **P4** (v0.4.5): final review + audit + milestone release.
|
||||||
|
|
||||||
|
## v0.6 Requirements — Node Bootstrap & Proxmox
|
||||||
|
|
||||||
|
| ID | Requirement | Priority | Phase | Status |
|
||||||
|
|----|-------------|----------|-------|--------|
|
||||||
|
| REQ-047 | `orca init` auto-provisions CA + server cert + DB migrations + localhost node (idempotent; safe re-run) | High | **v0.6 P1** | Pending |
|
||||||
|
| REQ-048 | `orca init` registers a default `localhost` node with auto-detected OS via `/etc/os-release ID` | High | **v0.6 P1** | Pending |
|
||||||
|
| REQ-049 | Node schema extension: `nodes.kind` (localhost\|linux\|proxmox) + `nodes.os` columns (migration 0006, backward-compatible) | High | **v0.6 P1** | Pending |
|
||||||
|
| REQ-050 | `orca node join --type proxmox` SSH bootstrap via `golang.org/x/crypto/ssh` (new direct dep); password auth, deploy orca pubkey, create `orca` user (config-overridable), assign PVE role, drop sudoers allowlist; idempotent | High | **v0.6 P2** | Pending |
|
||||||
|
| REQ-051 | Proxmox least-privilege `OrcaOperator` PVE role (VM.Audit, Datastore.AllocateSpace, SDN.Use) + `orca` user + `/etc/sudoers.d/orca` allowlist (pct, qm, pvesh, apt-get, dpkg); config-overridable user/role names | High | **v0.6 P2** | Pending |
|
||||||
|
| REQ-052 | `orca doctor` extensions: `doctor os` (verify localhost OS detection matches stored node row) + `doctor proxmox` (SSH-probe each `kind=proxmox` node with `pveversion`/`pvecmd status`, 3s timeout, PASS/WARN/FAIL); audit log all bootstrap + join actions | Medium | **v0.6 P3** | Pending |
|
||||||
|
|||||||
@@ -88,3 +88,25 @@ verified HTTP 200.
|
|||||||
|
|
||||||
**Milestone tag**: `v0.4.5` (final phase patch = milestone release per
|
**Milestone tag**: `v0.4.5` (final phase patch = milestone release per
|
||||||
feature-milestone promotion rule). Per-phase tags: `v0.4.1`…`v0.4.5`.
|
feature-milestone promotion rule). Per-phase tags: `v0.4.1`…`v0.4.5`.
|
||||||
|
|
||||||
|
## Milestone v0.6: Node Bootstrap & Proxmox
|
||||||
|
|
||||||
|
Scope: make `orca init` produce a fully working single-node cluster
|
||||||
|
(CA + server cert + DB + localhost node registered with auto-detected
|
||||||
|
OS), and add Proxmox 8 & 9 as a first-class remote node type joined
|
||||||
|
over SSH with least-privilege role delegation.
|
||||||
|
|
||||||
|
- [ ] Phase 0: Pre-execution (specify → clarify → research → plan → grill) — tag `v0.5.0`
|
||||||
|
- [ ] Phase 1: `orca init` full bootstrap + localhost node + schema 0006 (REQ-047, REQ-048, REQ-049) — tag `v0.5.1`
|
||||||
|
- [ ] Phase 2: Proxmox SSH join + OrcaOperator role + sudoers allowlist (REQ-050, REQ-051) — tag `v0.5.2`
|
||||||
|
- [ ] Phase 3: `doctor os` + `doctor proxmox` SSH probe + audit logging (REQ-052) — tag `v0.5.3`
|
||||||
|
- [ ] Phase 4: Final review + ship + audit (milestone release) — tag `v0.5.4`
|
||||||
|
|
||||||
|
**Milestone type**: feature (P1/P2/P3 ship `feat` phases).
|
||||||
|
**Milestone tag**: `v0.5.4` (final phase patch = milestone release per
|
||||||
|
feature-milestone promotion rule). Per-phase tags: `v0.5.0`…`v0.5.4`.
|
||||||
|
|
||||||
|
Tags run on the previous minor's patch line (v0.5.x) per
|
||||||
|
branch-strategy.md. The milestone branch label uses the milestone
|
||||||
|
number (`milestone/v0.6-node-bootstrap-proxmox`); no separate minor
|
||||||
|
tag is created.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"slug": "orca",
|
"slug": "orca",
|
||||||
"name": "Orca",
|
"name": "Orca",
|
||||||
"description": "Offline/CLI-first orchestration engine (Orca) — Nomad-inspired, far simpler than Kubernetes",
|
"description": "Offline/CLI-first orchestration engine (Orca) — Nomad-inspired, far simpler than Kubernetes",
|
||||||
"milestone": "v0.5",
|
"milestone": "v0.6",
|
||||||
"phase": 0,
|
"phase": 0,
|
||||||
"milestone_type": "feature",
|
"milestone_type": "feature",
|
||||||
"default_branch": "main",
|
"default_branch": "main",
|
||||||
|
|||||||
Reference in New Issue
Block a user