Operator decision (resolves grill C-04 + escalation E-03): keep 2 milestones (v0.9 + v0.10), keep all phases (40 total, exceeds 35 soft limit), v1.0 is UAT-gated and cut as a separate tag (v1.0.0) after v0.10 completion per operator sign-off — not a separate milestone. Relabels all v1.0 milestone references to v0.10 across ROADMAP, REQUIREMENTS, GRILL_v0.9, IDEATION_v0.9, PRD_v0.9, PROJECT. Phase content unchanged; only the milestone label moves. Historical grill narrative (the original PRD §23 counts and the E-03 auto-split reasoning) preserved verbatim for audit integrity. C-04 and E-03 marked RESOLVED in GRILL_v0.9.md. Milestone structure: - v0.9: Re-architecture Foundation & Workloads (13 phases P00..P0X) - v0.10: Production Hardening (19 phases P00..P16, milestone tag v0.10.0) - v1.0: UAT-gated production-ready cut (separate v1.0.0 tag, not a milestone) verify-reqs: 90 requirements consistent. ---ci--- project: orca phase: 0 milestone: v0.9 status: complete gate: C-04 resolved ---/ci---
6.3 KiB
Orca — Comprehensive Product Requirements Document (v0.9/v0.10)
Audience: Operators, AI agents, downstream tooling authors
This PRD SUPERSEDES the shipped v0.1–v0.8 architecture. The v0.9 and v0.10 milestones implement a re-architecture whose load-bearing rules (R-001…R-016) and decisions (D-068…D-206) replace or demote several earlier documented decisions. See §22 decision-trace and the Supersession Table in
ARCHITECTURE.mdfor the recorded reversals and their evidence basis.
Status
| Item | Status |
|---|---|
| Spec lock-in | ✅ R-001…R-016 + D-001…D-206 settled |
| v0.1–v0.8 implementation | ✅ shipped (REQ-001..060, D-001..D-047) |
| v0.9 implementation | ⬜ Phase 0 pre-execution (this file is the spec input) |
| v0.10 implementation | ⬜ planning (post-PRD) |
| v1.x multi-host state | ⬜ parked (post-v1.0) |
| v2.x full Nomad-HCL | ⬜ parked (post-v1.x) |
Override justification (recorded for the grill supersession)
The v0.9/v0.10 re-architecture is justified on six independent grounds rather than preference. Each reverses a prior documented decision; the new evidence basis is recorded with the reversal in the Supersession Table:
- The v0.8 daemon model is operationally failing in the target environment — R-001 ("no orca binary on any server") is a response to measured pain, not preference.
- step-ca is externally mandated (D-101) — the operator environment requires an external CA; AD-010's "too heavyweight" rationale is no longer operative.
- Multi-tenancy is a hard product requirement (R-002) — real multi-tenant use cases cannot be served by the single-namespace layout; the "no multi-tenancy" anti-pattern is obsolete.
- WASM is a hard workload requirement (D-088) — workloads are WASM, not
processes;
os/execis insufficient; the "no container runtime" anti-pattern is reversed. - SSH-push is the only viable deployment target for the operator's bare-Linux/Proxmox environment — installing/maintaining an orca daemon on every peer is operationally infeasible.
- Simplicity/vision correction — the v0.1-v0.8 daemon model was a wrong turn against the original CLI-first vision; the re-architecture corrects the vision.
Canonical references
The full PRD text was provided by the operator and adopted wholesale. The load-bearing rules (R-001…R-016), the concept model (§4), the architecture (§5), the milestone plan (§23), and the decision trace (§22) are reproduced in the operator's original document. This file is the auditable pointer to that source; the substantive planning artifacts live in:
IDEATION_v0.9.md— 30 ideas (REQ-061..REQ-090), three tiersGRILL_v0.9.md— 9-axis adversarial review, 19 binding conditions, 10 phase challengesREQUIREMENTS.md— REQ-061..REQ-090 appendedROADMAP.md— v0.9 (13 phases) + v0.10 (19 phases) appendedPERSONAS.md— security/network/devops reactivatedARCHITECTURE.md— v0.9 banners + Supersession Table
The 16 load-bearing rules (invariants)
| ID | Rule |
|---|---|
| R-001 | No Orca Go binary runs on any server. The orca CLI on the operator's host is the only Orca software. Servers run Linux + systemd + apt-managed packages + config files written by the CLI. |
| R-002 | Filesystem paths are namespaces. ORCA_HOME hosts many namespaces; each is a dir with db/, .env, .env.secrets, jobs/, alloc/, ns.md. _defaults/ always exists. No namespace column in SQLite. |
| R-003 | Cluster lead is always bare Linux; Proxmox can never be lead. |
| R-004 | Workload migration Linux↔Proxmox supported; runtime can change at migration; SPIFFE identity preserved. |
| R-005 | Storage replication enables migration; a Service's count replicas share one runtime {} block. |
| R-006 | mTLS on by default; cluster CA = step-ca; Traefik + LoadCredential= are load-bearing. |
| R-007 | Sockets by default (/run/orca/alloc-<id>/port-<name>.sock); 127.0.0.1 opt-in. |
| R-008 | CLI results cached locally with per-class TTLs (orca_cache SQLite). |
| R-009 | CLI host SPOF mitigated by external shared state in v1.x; v0.10 ships the abstractions + cache layer. |
| R-010 | Control plane updates are transactional (ArgoCD-style desired-state/lead-applier). |
| R-011 | Each namespace has .env (plaintext) and .env.secrets (AES-256-GCM, per-line nonce); master key per ORCA_HOME at cluster/master.key. |
| R-012 | Workload kinds are Job, Service, DaemonSet; schema-separated by kind: in frontmatter. |
| R-013 | Jobspec format is Markdown with YAML frontmatter (.md preferred); .yaml and .hcl accepted by parser dispatcher. |
| R-014 | All user-facing config is Markdown with YAML frontmatter; body preserved verbatim. |
| R-015 | Body of every .md config file is preserved verbatim and surfaced in inspect, history, diffs. |
| R-016 | .env and .env.secrets are exempt from R-014 — standard dotenv format retained. |
Milestone summary (§23, reordered per grill PC-01..PC-10)
v0.9 — Workloads + Re-architecture Foundation (13 phases)
P00 (deprecation sweep + migration-ordering + txn-design spike + test-infra bootstrap + persona reactivation + doc banners), P0a1 (path resolver + config demotion), P0a2 (namespace CRUD + inheritance), P0b (Markdown jobspec parser + fuzz), P0c (schemas + emitter interface), P01 (SSH-push transport + host-path volumes), P02 (service + Traefik emitter), P03 (update stanza), P04 (lifecycle hooks), P05 (constraints + CLI-side scheduler), P06 (task groups), P07a/P07b/P07c (process+podman / wasmtime [C-01 gated] / pve-vm+ct runtimes), P08 (sockets), P09 (Syncthing [C-02 gated]), P10 (lead rules + migration), P0X (ship + audit).
v0.10 — Production Hardening (19 phases)
P00 (CLI cache), P01 (metrics), P01.5 (SPIFFE spike [C-08 gated]), P02 (ACL), P03 (secrets), P04 (backup/restore), P05 (drain + daemon drain-and-stop), P06 (alloc history), P07 (recovery), P08 (integration tests), P09 (collector+aggregator), P10 (transactional plane [C-09 gated]), P11 (job lint), P12 (job verify), P13 (ns subcommands), P14a/P14b/P14c (data / daemon cutover / mixed-version tolerance), P15 (README), P15.5 (threat model [C-19 gated]), P16 (final review + ship — v1.0.0 release).
See ROADMAP.md for the full reordered plan and GRILL_v0.9.md for the 19
binding conditions (C-01..C-19) and 10 phase challenges (PC-01..PC-10) that
gate specific phases.