v0.40.0
PR view + approve flow (#216, #217)
Lifecycle stepper (#216)
- Context-aware segments: an apply run's housekeeping phases fold into the apply segment (sub-phase detail) — no more plan-side re-activation mid-apply; "now" is per-execution.
- Relevance-gated bar: plan-only PRs render a plan-only bar;
movesonly with detected state moves;initonly when observed. - The active plan/apply segment partially fills with k-of-N stack progress; plain-language phase descriptions in tooltip + caption; prominent per-tier stage badge (PLANNING/APPLYING/…).
- Honest no-change claims during apply (counts-known gating, plan-rollup fallback tagline).
Approve flow (#217)
- PAM requires a reason — the decision modal now prefills an honest editable default, marks the field required, and blocks empty submits; the UI backend defaults a missing reason as defense.
- Approve/deny decisions push to watching pages: new tier endpoint
POST /api/gate/reconcile(fire-and-forget nudge from the UI backend after every successful PAM decision) + the tier panel refetches approvals on SSE nudges — the gates strip and stepper update within seconds, no reload.
Wire: LifecyclePhase gains optional detail/progress_pct; new reconcileGates operation (all additive). Serve/UI-side only — no runner behavior change.