Files
command-center/agent/managed-skills/status-surface-dead-signal-audit/SKILL.md
T
Frank 135bb2194d agent: repoint roles to frank-medium/dankclaw-3090; sync niri tweaks, memories, managed skills
- config.yml: default/commit -> frank-medium (dankserver); task/tiny/smol/vision -> frank-small (dankclaw-3090); vision xhigh
- models.yml: add llamacpp (dankclaw-3090) provider; frank-large preserve_thinking + context notes
- niri: focus-ring/border/shadow layout, hot-corners off, re-add noctalia.kdl include; blankpad eDP-1 scale 1.0
- memories: flush rollouts; retire frank_large + marreta_authentik skills; add auth-chain/kv-pool/quadlet-log skills
- managed-skills: 40+ new fleet runbook skills
- agent/skills: import built-in skill set
2026-09-17 12:27:08 -07:00

57 lines
3.2 KiB
Markdown

---
name: status-surface-dead-signal-audit
description: "Audit a Dank-fleet status surface (homepage cards, Prometheus targets, tests) for entries that can never be green because the producer cannot reach the target, classify them as outage vs config defect, and fix honestly (wip, repoint, blackbox) instead of silencing them."
---
# Dead-signal audit on the Dank fleet's status surfaces
Use when a status board, Prometheus target list, alert set or test suite has
permanently non-green entries, or before trusting one of those surfaces. The
failure mode is always the same shape: a signal that **cannot** succeed by
construction, which teaches the operator to ignore the surface it lives on.
## The surfaces, and what can actually be probed
| Surface | Producer's vantage point | Can reach |
|---|---|---|
| Homepage status cards | the `homepage-status` timer on **Dankclaw** | Dankclaw's loopback, Dankclaw container names, **published** LAN addresses |
| Prometheus scrape jobs | the `prometheus` container on Dankclaw | container names on `dankclaw_default`, LAN addresses, loopback of that host only |
| bats / e2e suites | the dev box | the repo, plus the live fleet over HTTPS/LAN |
Anything else — another host's loopback, or a container-internal port that was
never published — is unreachable no matter how healthy the service is.
## Procedure
1. **List the non-green entries.** Homepage: `python3 - boardcheck.py
/srv/homepage/status.json` on Dankclaw (`status.json` holds one dict per card
with `state` up/down/wip). Prometheus: query
`/api/v1/targets?state=active` and print `health != "up"` with `lastError`.
2. **Classify each one by producer reach**, not by the service. Ask: can the
thing that probes it get there at all?
3. **Fix in the direction of honesty, never of silence:**
- unreachable target → mark the card `wip` with the reason in its
`description` (the checker skips `wip`), or repoint the job at something
reachable. Do **not** open a database port on the LAN to make a badge
green, and do **not** delete a scrape job — an absent scrape and a healthy
one are indistinguishable.
- wrong path / wrong content type → fix the path (e.g. Gitea's `/metrics`
needs metrics enabled), or move page-only targets to a blackbox exporter in
probe mode.
- failing test → fix the selector. A chronic red test is a defect with an
owner, not a baseline (`find … | head -1` picked another service's file).
4. **Verify on the surface itself**, not in the config: re-read `status.json`
(expect 0 `down`), query `up == 0` targets, run the suite to green.
5. Write the rule where the next person will read it — the Homepage and
Observability pages both state it now.
## Traps
- The producer's vantage point is the whole question; a card or job can be
"down" for a service that answers perfectly from the host it runs on.
- `wip` is the existing convention for "real service, not probeable" (Gluetun,
WireGuard/UDP), not a suppression: keep the reason in the description.
- Alert rules must not depend on signals that are always red; scope them to
the services that can actually be healthy (`LlmEndpointDown` is scoped to
`frank-*` for exactly that reason).