docs(init): validate specification — v0.13 Production Hardening Round 2 + UAT Plan

15 new requirements (REQ-149..REQ-163), 14 phases (P0+P01..P12+P13).
Three deep codebase sweeps surfaced ~60 gaps beyond v0.12:
- orca job run runs locally (scheduler/emitter/SSH-push dead code)
- jobspec schedule/timeout silently dropped (DaemonSet broken)
- acl.Check called zero times (v0.12 zero-trust not wired)
- command injection vectors (logs --job, tar-slip, sudoers, txn rollback)
- Go toolchain 1.25.0 (24 stdlib vulns)
- concurrency hazards (audit chain race, secrets data loss, no busy_timeout)
- cache never invalidated by writes
- massive doc drift (README mTLS claim false, cli.md missing 25 subcommands)

v1.0.0 stays deferred for post-v0.13 UAT signoff.

---ci---
project: orca
phase: 0
milestone: v0.13
status: specify
---/ci---
This commit is contained in:
Jon Chery
2026-08-07 18:43:04 +00:00
parent 64e5321c96
commit 8071793260
5 changed files with 269 additions and 141 deletions
+121
View File
@@ -548,3 +548,124 @@ The v1.0.0 production-ready tag stays deferred for post-v0.12 UAT
- Leader-elected Raft coordinator
- External CA / Let's Encrypt / cert transparency
- Online-only features (HSTS, OCSP stapling, telemetry)
## Milestone v0.13: Production Hardening Round 2 + UAT Plan — IN PROGRESS
**Scope**: final production hardening round before the v1.0.0
production-ready tag. Three deep codebase sweeps (security, reliability,
feature/doc claims) surfaced ~60 gaps beyond v0.12 — the most critical
being that `orca job run` runs locally via `exec.CommandContext` and
never invokes the scheduler/emitter/SSH-push path (the documented
deployment model is non-functional), jobspec `schedule:`/`timeout:` are
silently dropped by the markdown parser (DaemonSet is fundamentally
broken), `acl.Check` is called zero times in the codebase (v0.12's
headline zero-trust feature is library-complete but not wired), and
several command-injection vectors remain (`orca logs --job` backtick
RCE via `%q`, tar-slip in restore, sudoers injection, etc.). v0.13
closes all critical/high/medium findings and delivers the UAT plan +
signoff script that gates the v1.0.0 cut.
**Load-bearing architectural changes**:
- **R-022** — `orca job run` deploys to remote nodes via the scheduler
→ emitter → SSH-push pipeline. The local `exec.CommandContext` path
is removed. Constraints/capacity/affinity are enforced. This makes
the documented deployment model functional and is the prerequisite
for the UAT plan.
- **R-023** — Zero-trust enforcement is operationally wired:
`acl.Check` is invoked on every daemon handler + sshpush + txn apply
path; `acl.json` is 0600; audit `actor` carries OIDC sub/SVID;
WebAuthn registration requires auth; `cluster seal`/`unseal` +
`doctor audit`/`doctor modes` CLI commands exist.
### Phases (14 total: P0 + P01..P12 + P13 final)
- [ ] Phase P0: Pre-execution (SPECIFY→CLARIFY→RESEARCH→IDEATE→PLAN→GRILL) — tag `v0.12.0`
- [ ] Phase P01: Toolchain & dependency vulns (REQ-149) — tag `v0.12.1`
- [ ] Phase P02: Input validation & injection hardening (REQ-150) — tag `v0.12.2`
- [ ] Phase P03: Scheduler/deployment wiring + jobspec parser (REQ-151, REQ-152) — tag `v0.12.3`
- [ ] Phase P04: ACL enforcement + WebAuthn registration auth (REQ-153) — tag `v0.12.4`
- [ ] Phase P05: Seal/audit CLI + chain race + key zeroing (REQ-154) — tag `v0.12.5`
- [ ] Phase P06: auth init-idp real + auth register (REQ-155) — tag `v0.12.6`
- [ ] Phase P07: Concurrency safety (REQ-156) — tag `v0.12.7`
- [ ] Phase P08: Transport & SSH safety (REQ-157) — tag `v0.12.8`
- [ ] Phase P09: Migration & operational safety (REQ-158) — tag `v0.12.9`
- [ ] Phase P10: Observability & metrics (REQ-159) — tag `v0.12.10`
- [ ] Phase P11: Doc drift round 2 (REQ-160) — tag `v0.12.11`
- [ ] Phase P12: `--type linux` + UAT plan + signoff script (REQ-161, REQ-162, REQ-163) — tag `v0.12.12`
- [ ] Phase P13: Final review + ship + audit (milestone release) — tag `v0.12.13` = **v0.13 milestone release**
**Milestone tag**: `v0.12.13` (final phase patch = milestone release per
feature-milestone rule; no separate `v0.13.0` tag). Per-phase tags:
`v0.12.0`..`v0.12.13` (14 tags). Tags run on the previous minor's patch
line (v0.12.x). The milestone branch label uses the milestone number
(`milestone/v0.13-production-hardening-2`); no separate minor tag.
The v1.0.0 production-ready tag stays deferred for post-v0.13 UAT
signoff (operator runs `scripts/uat-signoff.sh`, pastes output back;
CI agent verifies and cuts v1.0.0).
### Per-phase REQ coverage (v0.13)
- **P01** — Toolchain bump (REQ-149)
- **P02** — Injection hardening (REQ-150)
- **P03** — Scheduler wiring + jobspec parser (REQ-151, REQ-152)
- **P04** — ACL enforcement + WebAuthn reg auth (REQ-153)
- **P05** — Seal/audit CLI + chain race + key zeroing (REQ-154)
- **P06** — auth init-idp real + auth register (REQ-155)
- **P07** — Concurrency safety (REQ-156)
- **P08** — Transport & SSH safety (REQ-157)
- **P09** — Migration & operational safety (REQ-158)
- **P10** — Observability & metrics (REQ-159)
- **P11** — Doc drift round 2 (REQ-160)
- **P12** — `--type linux` + UAT plan + signoff (REQ-161, REQ-162, REQ-163)
- **P13** — Final review + ship + audit
### New load-bearing rules adopted in Phase 0
- **R-022** — `orca job run` deploys to remote nodes via scheduler →
emitter → SSH-push. Local exec path removed. Constraints/capacity/
affinity enforced.
- **R-023** — Zero-trust enforcement is operationally wired:
`acl.Check` on every request path; `acl.json` 0600; audit actor =
OIDC sub/SVID; WebAuthn registration requires auth.
### Binding conditions (for GRILL ratification)
- **C-39**: P03 (scheduler wiring) is the riskiest phase — changes the
core `job run` path. Must not break existing `job run` (local
fallback if no remote nodes registered). Full test coverage before
P04 ships.
- **C-40**: P04 (ACL enforcement) is deny-by-default — must not lock
out the operator. Bootstrap ACL grants `cluster-admin` to the init
cert's SPIFFE SVID. Staged rollout: log-only mode for first run,
enforce after bootstrap ACL verified.
- **C-41**: P05 (seal) — C-35 residual risk still applies (IdP lost +
Shamir quorum unavailable → cluster unrecoverable). No backdoor.
- **C-42**: P12 (UAT plan + signoff) is the v1.0 gate artifact. If
P01..P11 slip, P12 still ships (honest signal via failing
assertions). The signoff script is idempotent and read-only.
- **C-43**: `verify-reqs` bold-format regex must be fixed in P11 so
the consistency gate works for v0.12 AND v0.13.
### Risk register (for grill + research, for ongoing monitoring)
- **P03 scheduler wiring is riskiest** (mitigation: C-39 local fallback)
- **P04 ACL deny-by-default could lock out operator** (mitigation: C-40 bootstrap ACL + staged rollout)
- **P05 seal residual risk** (mitigation: C-41 documented, no backdoor)
- **P02 injection hardening is high-count** (11 sub-fixes; mitigation: each is small and independently testable)
- **14 phases is large** (mitigation: operator accepted "no limit on phases"; many phases are small fix bundles)
- **UAT plan depends on P03 (scheduler) being functional** (mitigation: P12 ships regardless; failing assertions are honest signal)
### Deferred to v1.x (out of scope for v0.13) — unchanged from v0.12
- HA step-ca (active/passive via systemd)
- `sqlite-wal-shared` / `git` / `file+flock` state backends
- OS keyring integration for master key
- Full cluster-rolling-upgrade orchestrator (v0.13 ships the thin `orca upgrade` wrapper only)
- Live-migrate with storage replication (v0.13 ships drain+reschedule only)
- Journald log shipping (optional centralized audit)
- Network policy (`nftables` snippets beyond the ingress ruleset)
- GPU / TPU constraints
- jobspec `health` prober (v0.13 adds lint warning; enforcement deferred)
- jobspec `update` rolling/canary controller (v0.13 adds lint warning; enforcement deferred)
- jobspec `schedule.cron` scheduler loop (v0.13 adds lint warning; enforcement deferred)