---
id: w1/m4.5/t002
title: Surface the sleeping state — list + overview badge, wakes-on-next-request hint
worker: worker1
status: done
estimate: 30m
depends_on: [w1/m4.5/t001, w1/m4/t005]
---

## Objective

Render the **Sleeping** state distinctly from **Suspended** everywhere status shows: the services list row and the service overview header get a Sleeping badge (per t001's mapping) plus the "wakes on the next request" hint copy; suspended keeps its existing rendering. All strings through `useTranslations()`. **Parity note:** the hint copy tracks Render's free-instance banner (parity); the distinct Sleeping badge is a deliberate bex divergence — Render keeps spun-down services showing as live — chosen because sleep is a first-class phase in bex.

## Context

- Status badge components: `dashboard/src/features/services/` (list + detail overview); phase/suspended already come from the `services`/`server(id)` GraphQL queries.
- i18n: every user-visible string via `t()` (dashboard/CLAUDE.md rule); add keys to the feature locales.

## Steps

1. Extend the status mapper with the Sleeping discrimination from t001.
2. Badge + hint in list and overview; empty-state/tooltip copy per the Render capture.
3. Locale keys (en + the other configured locales).

## Files

- `dashboard/src/features/services/` (status mapper, badge components, locales)

## Acceptance criteria

- [ ] A hibernated-by-idle app shows Sleeping + hint; a manually suspended app still shows Suspended; vitest snapshot-free assertions on the mapper.

## Out of scope

- Settings control (t003); wake flow (t004).
