---
id: w1/m15/t004
title: Dashboard — service-type awareness (badge; worker has no URL; cron shows schedule/runs)
worker: worker1
status: done
estimate: 40m
depends_on: [w1/m15/t003]
---

## Objective

Make the dashboard type-aware: show a service-type badge in the services list and detail; a `background_worker` row shows no URL; a `cron_job` detail shows its schedule and recent runs.

## Context

- The services UI lives in `dashboard/src/features/services` (Apollo client of bex-api's GraphQL). It reads the `Service` type — which now carries `type` (and, for cron, `schedule` + run history exposed via t003's GraphQL fields).
- Read `dashboard/CLAUDE.md` before editing. The type field already exists on `Service` (`docs/ADR006-bex-api.md` GraphQL `services { id type ... }`); this task consumes it and the new cron fields.
- A web/private service shows a URL; a worker must not (it has none — t001). A cron shows schedule + recent runs (t002 status / t003 GraphQL).

## Steps

1. Add a service-type badge to the services list and the detail header, driven by `Service.type`.
2. For a `background_worker`, suppress the URL affordance (there is no URL).
3. For a `cron_job`, render its `schedule` and a recent-runs list on the detail view.

## Files

- `dashboard/src/features/services/` (list + detail components, GraphQL queries)

## Acceptance criteria

- [x] Each service shows a type badge; a worker row/detail shows no URL.
- [x] A cron detail shows its schedule and recent runs.
- [x] Dashboard tests pass.

## Out of scope

- The GraphQL/reconcile changes (t001–t003, prerequisites).
- Static-site UI (deferred to `w1/012`).
