# Per-service autoscaling config (Render `PUT /services/{id}/autoscaling`)

Render exposes per-service autoscaling as a first-class config: `PUT/DELETE /v1/services/{id}/autoscaling` with min/max instances + target CPU% and/or memory% (dashboard Scaling tab, Pro+). bex has the manual scale verb (`POST /v1/services/{id}/scale`, w2/m12) but no autoscaler — the App CR carries a fixed `spec.replicas`.

The parity gap is a **spec + mechanism** piece (w1 territory): an autoscaling stanza on the App CR (min/max + target), and a reconciler that adjusts `spec.replicas` from live metrics — a **new per-service loop alongside w1/m3** (m3 is node/aggregate-level and moves nodes, never `spec.replicas`), continuous with **w1/m4** scale-to-zero. Surfaces (REST `…/autoscaling`, GraphQL, MCP) + a dashboard Scaling section come after, tracking Render's names. The metrics groundwork (CPU/mem as % of limit, requests==limits per tier) already exists (w1/m8, w3/m4.5).

Source: `docs/ADR018-render-parity.md` audit (w1/m13, 2026-07-08). Goal: pillar 1 (Render parity) + elastic substrate (w1/m3). Promote to a milestone once w1/m3 lands: the metric→replica reconciler is new work here, but it needs m3's node elasticity for replica scale-ups to land on (and reads CPU/mem targets against the tier requests/limits m3's t001 shipped).
