PROBE SWEEP 3 — the SHARPENED rule, read from healthprobe.go rather than assumed
catalog f5f6a152b513, 2026-09-21, controller v0.261.0

  type: http                      -> ANY response is healthy. ONLY THE PORT MATTERS.
  type: api  with NO expect block -> same as http (healthprobe.go:265). ONLY THE PORT.
  type: api  WITH expect.status   -> the PORT, the PATH and the STATUS all matter.

So a probe/compose PATH difference is only a candidate when the type is `api` WITH expect.

actualbudget         type=http  port=5006   path=None                   ok
adventurelog         type=api   port=8000   path=/api/                  PATH /api/ not in compose ['/api/\\'] (and expect={'status': 200})  <<< CANDIDATE
audiobookshelf       type=api   port=80     path=/healthcheck           ok
bentopdf             type=http  port=8080   path=None                   ok
bookstack            type=http  port=80     path=None                   ok
calcom               type=api   port=3000   path=/api/auth/providers    ok
calibre-web          type=http  port=8083   path=None                   ok
claper               type=http  port=4000   path=None                   ok
code-server          type=api   port=8443   path=/healthz               ok
crafty-controller    type=tcp   port=8443   path=None                   ok
docmost              type=http  port=3000   path=None                   ok
emby                 type=api   port=8096   path=/emby/system/ping      ok
ghost                type=http  port=2368   path=None                   ok
gitea                type=api   port=3000   path=/api/healthz           ok
glance               type=http  port=8080   path=None                   ok
gokapi               type=http  port=53842  path=None                   ok
grafana              type=api   port=3000   path=/api/health            ok
gramps-web           type=http  port=5000   path=None                   ok
home-assistant       type=api   port=8123   path=/api/                  ok
homebox              type=api   port=7745   path=/api/v1/status         ok
homepage             type=http  port=3000   path=None                   ok
immich               type=api   port=2283   path=/api/server/ping       ok
jellyfin             type=api   port=8096   path=/health                ok
kimai                type=http  port=8001   path=None                   ok
komga                type=api   port=25600  path=/actuator/health       ok
mealie               type=tcp   port=9000   path=None                   ok
n8n                  type=api   port=5678   path=/healthz               ok
navidrome            type=api   port=4533   path=/ping                  ok
nextcloud            type=api   port=80     path=/status.php            ok
onlyoffice           type=api   port=80     path=/healthcheck           ok
opengist             type=api   port=6157   path=/healthcheck           ok
outline              type=api   port=3000   path=/_health               ok
paperless-ngx        type=http  port=8000   path=None                   ok
papra                type=http  port=1221   path=None                   ok
plant-it             type=api   port=8080   path=/api/info              ok
plex                 type=api   port=32400  path=/identity              ok
privatebin           type=http  port=8080   path=None                   ok
radarr               type=api   port=7878   path=/ping                  ok
rallly               type=http  port=3000   path=None                   ok
recipe-importer      type=api   port=8000   path=/health                ok
romm                 type=http  port=8080   path=None                   ok
seerr                type=api   port=5055   path=/api/v1/status         ok
sonarr               type=api   port=8989   path=/ping                  ok
sparkyfitness        type=http  port=80     path=None                   ok
tandoor              type=http  port=8080   path=/accounts/login/       PORT 8080 not in compose ['80']  <<< CANDIDATE
termix               type=http  port=8080   path=None                   ok
uptime-kuma          type=http  port=3001   path=None                   ok
vaultwarden          type=api   port=80     path=/alive                 ok
vikunja              type=api   port=3456   path=/api/v1/info           ok
wanderer             type=http  port=3000   path=None                   ok
wger                 type=http  port=80     path=None                   PORT 80 not in compose ['8000']  <<< CANDIDATE
wishlist             type=http  port=3000   path=None                   ok
zipline              type=api   port=3000   path=/api/health            PATH /api/health not in compose ['/api/healthcheck'] (and expect={'status': 200})  <<< CANDIDATE

CANDIDATES: 4 -> ['adventurelog', 'tandoor', 'wger', 'zipline']

LIVE RESULTS 2026-09-21 on guest 9202:
  tandoor         CONFIRMED DEFECT  probe type http port 8080; the container listens on 80 ONLY.
                  Connection refused every time -> the box reads `unhealthy` while the app serves 200.
  zipline         CONFIRMED DEFECT  probe type api + expect 200 on /api/health; zipline 4.6.1
                  answers 404 there. The COMPOSE healthcheck in the same file uses /api/healthcheck
                  and is green. The box reads `unhealthy` while /dashboard answers 200.
  wger            SUSPECTED, NOT MEASURED. type http, port 80; wger/server serves 8000 and the
                  template's own traefik label says 8000. Not deployed tonight.
  home-assistant  NOT a defect, MEASURED: type api with NO expect block, so any response passes —
                  /api/ answers 401 without a token and that is healthy. Edge PROVEN tonight.
  adventurelog    NOT a defect, MEASURED: type api + expect 200 on /api/ port 8000, reads `running`.

