Files
orca/.ciagent/GRILL_v0.11.md
T
Jon Chery e45611b416 docs(P00): grill v0.11 — 6 binding conditions (C-23..C-28), P10 split into P10a/P10b
GRILL stage: adversarial review across 6 forcing questions. Verdict: PROCEED-WITH-CONDITIONS.
- C-23: orca-pull.sh distinguishes cluster-wide vs ns-scoped txns (gate P10a)
- C-24: split P10 into P10a (txn plane) + P10b (drift detection); phase count 23->24; tags shift by 1
- C-25: orca upgrade post-cutover verification + rollback (gate P14a)
- C-26: per-phase LoC soft ceiling ~800 (no gate, recorded)
- C-27: orca upgrade creates orca system user on existing peers (gate P14a)
- C-28: P15.5 two sub-waves (ingress+doctor nft, then threat model+doctor mTLS) (gate P15.5)
ROADMAP updated: 24 phases, tags v0.10.0..v0.10.22.

---ci---
project: orca
phase: 0
milestone: v0.11
status: grill
---/ci---
2026-08-07 03:40:55 +00:00

9.1 KiB

Grill: v0.11 Production Hardening — Phase 0 Adversarial Review

Status: PROCEED-WITH-CONDITIONS. The v0.11 plan is sound; 6 binding conditions (C-23…C-28) gate specific phases. The plan adopts R-017…R-020 and D-215…D-237 from 5 research docs with operator decisions Q1=A, Q2=C, Q3=A, Q4=A, Q5=A. The grill reviewed the plan adversarially across the same 9 axes as GRILL_v0.9 (vision, feasibility, scope, risk, security, operational, cost, competitive, exit).

Forcing questions + verdicts

FQ1 — R-020 deadlock with --force + per-ns scoping

Question: With --force + per-namespace scoping (Q4=A), can a single drifted peer still block a cluster-wide txn (e.g., namespace creation)? If yes, is the --force escape hatch documented in C-09's failure contract?

Verdict: PARTIAL-BLOCK remains for cluster-wide txns. A namespace creation txn touches all peers (the new namespace dir is created on every peer). If one peer is drifted, the pre-flight gate refuses the txn cluster-wide. --force overrides this, but --force on a namespace-creation txn is risky (it forces the new namespace onto a drifted peer without reconciling the drift first).

Binding condition C-23: orca-pull.sh (C-09) must distinguish cluster-wide txns from namespace-scoped txns. Cluster-wide txns require --force with an explicit --i-understand-the-risk confirmation (or --yes for non-interactive). Namespace-scoped txns use per-ns scoping (drifted peer in ns-A doesn't block ns-B). Gate: P10.

Confidence: 0.88

FQ2 — P10 sizing (txn plane + drift detection in one phase)

Question: P10 now absorbs drift detection (~500 LoC Go + 150 LoC bash + systemd units), the largest single phase. Is this a vertical slice that can ship atomically, or does it need splitting (P10a txn plane, P10b drift)?

Verdict: SPLIT RECOMMENDED. P10 has 13 tasks spanning two distinct subsystems: (1) the transactional plane (T1-T2: txn bundle render, SCP, apply, C-09 failure contract) and (2) drift detection (T3-T13: internal/drift/, Path unit emitter, notify/remediate scripts, cadence config, pre-flight gate, orca user, NFS detection, job restart). The txn plane is a prerequisite for drift detection (T3's Aggregate reads applied txn manifests), so the split is clean: P10a (txn plane, T1-T2) ships first, P10b (drift detection, T3-T13) ships after P10a.

Binding condition C-24: Split P10 into P10a (transactional plane, REQ-075/079, C-09) and P10b (drift detection, R-018/R-019/R-020, REQ-103..113). P10a ships first; P10b depends on P10a. Tags: P10a v0.10.12, P10b v0.10.13. All subsequent phase tags shift by 1 (P11→v0.10.14, …, P16→v0.10.22). Phase count: 23 → 24.

Confidence: 0.92

FQ3 — Ingress default migration path (C1)

Question: Existing v0.9/v0.10 clusters run Traefik on :443. R-017 makes 127.0.0.1:8443 + nft the default. What's the upgrade path? Does orca upgrade (Q2=C) handle the binding cutover, or is it a manual operator step?

Verdict: UPGRADE HANDLES IT, but with a safety check. orca upgrade (REQ-115, P14a) is the thin wrapper (C2=a) that handles the Traefik binding cutover. The cutover is: (1) emit new Traefik static config with 127.0.0.1:8443, (2) emit /etc/nftables.d/orca.nft with DNAT, (3) systemctl reload traefik + nft -f, (4) verify curl :443 still routes. If step 4 fails, rollback to :443 + remove nft rules.

Binding condition C-25: orca upgrade (REQ-115) must include a post-cutover verification step (curl -k https://localhost:443/ returns 200 from Traefik) with automatic rollback on failure. Document the rollback procedure in docs/ingress.md. Gate: P14a.

Confidence: 0.90

FQ4 — Scope ceiling (LoC vs phase count)

Question: v0.11 stays at 23 phases (now 24 with C-24), but P09/P10 (now P10a/P10b)/P15.5 grow substantially. Is the phase count the right ceiling, or should there be a LoC/effort ceiling per phase?

Verdict: LOOSE LoC CEILING. Phase count is a proxy for effort, but P10b (drift detection) is ~650 LoC across Go + bash + systemd — at the upper end of what a single-phase vertical slice can handle. The grill recommends a soft LoC ceiling of ~800 LoC per phase (Go + bash + config), with splitting required above ~1200 LoC.

Binding condition C-26: Per-phase LoC soft ceiling: ~800 LoC (Go + bash + config). Split required above ~1200 LoC. P10b (~650 LoC) is within the soft ceiling; P15.5 (~400 LoC: nft emitter 200 + doctor mTLS 100 + threat model doc) is within. No action required for v0.11; recorded for future milestones. No gate.

Confidence: 0.85

FQ5 — orca system user on peers (operational impact)

Question: Creating a system user on every peer is a new operational requirement. Does this break any existing v0.9/v0.10 deployment that runs as root or as an existing service account?

Verdict: NO BREAK for existing deployments; NEW requirement for drift detection. The orca system user (REQ-111) is created at peer setup (orca node join / peer-setup script). Existing v0.9/v0.10 peers don't have the orca user, so drift detection's systemd Path units (which run as User=orca) won't start until the user is created. orca upgrade (REQ-115) must create the orca user on existing peers as part of the v0.11 migration.

Binding condition C-27: orca upgrade (REQ-115, P14a) must create the orca system user on existing peers (useradd -r orca idempotent) before P10b's drift detection can function. Document this as a migration prerequisite. Gate: P14a.

Confidence: 0.91

FQ6 — P15.5 is now a mega-phase (threat model + ingress + doctor mTLS)

Question: P15.5 was originally "threat model + security review" (C-19). It now absorbs ingress hybrid (R-017; REQ-099..102, ~400 LoC) + orca doctor mTLS (REQ-118). Is this too much for one phase?

Verdict: MANAGEABLE but at the ceiling. P15.5 is now ~500 LoC (nft emitter 200 + doctor mTLS 100 + threat model doc + tests). The ingress hybrid and threat model are related (both are security-hardening), so keeping them together is defensible. The orca doctor mTLS (REQ-118) is small and reuses P01/P01.5 infrastructure. The grill recommends keeping P15.5 as one phase but splitting the work into two sub-waves within the phase: (1) ingress hybrid + doctor nft, (2) threat model + doctor mTLS.

Binding condition C-28: P15.5 commits in two sub-waves: (1) ingress hybrid (REQ-099..102) + orca doctor nft (REQ-101), (2) threat model (C-19) + orca doctor mTLS (REQ-118). Both ship under the same phase tag (v0.10.20). No new phase; internal ordering only.

Confidence: 0.89

Binding conditions summary

ID Condition Gate Verification
C-23 orca-pull.sh distinguishes cluster-wide vs namespace-scoped txns; cluster-wide requires --force + --i-understand-the-risk (or --yes) P10a Test: cluster-wide txn refused without --force; ns-scoped txn blocks only the drifted ns
C-24 Split P10 into P10a (txn plane, REQ-075/079, C-09) + P10b (drift detection, R-018/R-019/R-020, REQ-103..113); P10b depends on P10a; tags shift by 1 P10a→P10b Plan shows P10a + P10b as separate phases; P10b tasks reference P10a txn manifests
C-25 orca upgrade (REQ-115) includes post-cutover verification (curl -k https://localhost:443/ returns 200) with automatic rollback on failure; rollback documented in docs/ingress.md P14a Test: cutover succeeds → 200; cutover fails → rollback to :443
C-26 Per-phase LoC soft ceiling: ~800 LoC (Go + bash + config); split required above ~1200 LoC (no gate) Recorded for future milestones
C-27 orca upgrade (REQ-115) creates orca system user on existing peers before P10b drift detection can function P14a Test: existing peer without orca user → orca upgrade creates it → drift detection starts
C-28 P15.5 commits in two sub-waves: (1) ingress hybrid + doctor nft, (2) threat model + doctor mTLS; same phase tag P15.5 Commits show two sub-waves; both under v0.10.20

Phase challenge summary

PC Phase Challenge Resolution
PC-11 P10a/P10b Txn plane + drift detection too large for one phase Split per C-24; P10a ships first, P10b depends on it
PC-12 P15.5 Mega-phase (threat model + ingress + doctor mTLS) Keep as one phase; two sub-waves per C-28
PC-13 P14a orca upgrade handles 3 migrations (data + binding + orca user) All three land in P14a per C-25, C-27; thin wrapper (C2=a)
PC-14 P09 Aggregator extension depends on P10b drift detection P09 in Wave 6 (after Wave 5 P10b); aggregator extension (REQ-107) only works once drift events exist

Overall verdict

PROCEED-WITH-CONDITIONS. The v0.11 plan is sound. 6 binding conditions (C-23…C-28) gate specific phases. The plan grows from 23 → 24 phases (C-24 splits P10 into P10a/P10b). All other phases are unchanged in count; their scope expands per the research folding (Q2=C, Q3=A).

The grill's confidence in the v0.11 plan is high (avg 0.89 across FQs). The primary risks (P10 sizing, R-020 deadlock, ingress migration) are all gated with verifiable conditions.