{
  "schema": 1,
  "note": "Append-only history. One object per incident, newest last. A generator run never rewrites or drops an entry; closing an incident updates its `closed`/`status` and appends the resolution evidence instead of deleting the original. An incident without a source is not written — `evidence` must name what was observed and when.",
  "entries": [
    {
      "id": "2026-11-02-search-backend-down",
      "opened": "2026-11-02T19:48:20Z",
      "closed": "2026-11-03T01:35:00Z",
      "status": "resolved",
      "severity": "degraded",
      "surface": "search",
      "impact": "search.tcp.systems is publicly served but its search backend does not answer. The static landing page at / returns 200 from Caddy's own file_server, so the site looks alive while every query path fails.",
      "evidence": [
        "curl -sS https://search.tcp.systems/search -> 502, 0 bytes (2026-11-02T19:48Z)",
        "curl https://search.tcp.systems/readyz -> 200, 0 bytes — Caddy file_server catch-all, not a health endpoint",
        "curl https://search.tcp.systems/nonexistent-xyz-123 -> 200, 0 bytes — confirms the catch-all",
        "ssh dsh: nothing listening on 127.0.0.1:8910 (ss -ltnp); only 127.0.0.1:8888 (SearXNG docker-proxy) is up",
        "Caddyfile search.tcp.systems: handle /search* -> reverse_proxy 100.64.0.6:8910",
        "RESOLVED 2026-11-03T01:35Z: curl https://search.tcp.systems/search?q=status-probe -> 200, 3739 bytes of results; the generator's first scheduled run measured the same handle up"
      ],
      "detection": "The old status page probed /readyz, which Caddy answers 200/0 bytes from disk regardless of the backend. That path can never report this outage. This surface probes the /search handle and classifies a 200 with an empty body as down.",
      "owner_action": "Restart/install the search serve unit on dsh (127.0.0.1:8910) or repoint the vhost at the live SearXNG lane on :8888."
    }
  ],
  "generation_id": "20261110T124844Z-b40072d0"
}
