Duckeighty doctor
Diagnose whether the duckeighty local HTTPS ingress is correctly set up on this host. Checks the shared_ingress Docker network, traefik and dnsmasq containers, the macOS /etc/resolver entry, local CA trust, DNS resolution for *.duckeighty.test, and HTTPS reachability of traefik. Produces a checklist and the one command needed to fix whatever failed. Does not mutate any state. TRIGGER: the user reports that a *.duckeighty.test URL returns 404, NXDOMAIN, a TLS error, or connection refused; asks to check whether duckeighty is running; asks to debug the ingress; or is about to use the duckeighty-integrate skill and wants to confirm the stack is up first. SKIP: issues unrelated to the ingress path (e.g. the user is debugging application logic, not routing / DNS / TLS).From its SKILL.md
npx -y skills add mackee/duckeighty --skill duckeighty-doctorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `docker version --format '{{.Server.Version}}'` and 7 more.
- fetches URLsInstructs the agent to fetch 1 URL, including https://no-such-app.duckeighty.test/.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
duckeighty: doctor
Run the checks below in order. For each, run the exact command, judge the result, and note the single fix command if it fails. At the end, produce a compact table (check / status / fix) and point the user to the single next action.
This skill only diagnoses. Do not run setup-ca, setup-resolver, or
up from here — direct the user to the duckeighty-init skill or the manual command.
When a fix command is ./duckeighty.sh …, the user needs to run it from
their duckeighty checkout. Resolve the path in this order, no guessing:
-
$DUCKEIGHTY_CHECKOUTenv var if set. -
If the ingress is running, ask Docker directly:
docker compose ls --format json \ | python3 -c "import json,sys,os; p=next((x for x in json.load(sys.stdin) if x['Name']=='duckeighty'),None); print(os.path.dirname(os.path.dirname(p['ConfigFiles'])) if p else '')"This returns the checkout root (parent of
infra/compose.yaml) when theduckeightyproject is running. -
Otherwise ask the user for the path.
If the user has no checkout at all, tell them to run the duckeighty-init skill first instead of printing a fix command.
1. Docker is usable
docker version --format '{{.Server.Version}}'
Fails → "Start Docker Desktop (or your Docker daemon) and re-run."
2. shared_ingress network exists
docker network inspect shared_ingress >/dev/null 2>&1 && echo ok || echo missing
missing → "Run ./duckeighty.sh up from the duckeighty checkout. It
creates the network before compose up."
3. duckeighty compose project is up
docker compose ls --format json | python3 -c "import json,sys; print(next((p['Status'] for p in json.load(sys.stdin) if p['Name']=='duckeighty'),'missing'))"
Expect something like running(2). missing → ./duckeighty.sh up.
4. Both ingress containers exist and are on shared_ingress
docker ps --filter 'label=com.docker.compose.project=duckeighty' --format '{{.Names}}\t{{.Networks}}\t{{.Status}}'
Expect two rows: duckeighty-traefik-1 and duckeighty-dnsmasq-1, both
Up. The traefik row's Networks column must contain shared_ingress; if
not, the ingress compose diverged from upstream.
5. macOS resolver entry
test -f /etc/resolver/duckeighty.test && cat /etc/resolver/duckeighty.test
Expect:
nameserver 127.0.0.1
port 5354
Missing or wrong → "Run ./duckeighty.sh setup-resolver (sudo required,
one-time)."
6. DNS actually answers
dig +short @127.0.0.1 -p 5354 probe.duckeighty.test
Expect 127.0.0.1. Empty or timeout → dnsmasq is not listening on
5354/udp on 127.0.0.1. Check docker logs <dnsmasq container>; confirm
the published ports in infra/compose.yaml are intact.
7. Local CA is trusted
mkcert -CAROOT
ls "$(mkcert -CAROOT)/rootCA.pem" 2>/dev/null
Both must succeed. Missing → ./duckeighty.sh setup-ca.
If mkcert itself is missing, ask the user to install it:
brew install mkcert nss.
8. HTTPS path reaches Traefik
curl -sI https://no-such-app.duckeighty.test/ | head -1
A HTTP/2 404 response from Traefik is the happy path: DNS + TLS both
work, and the hostname just has no matching router yet. Other failures:
curl: (6) Could not resolve host→ step 5 or 6 failed- TLS / certificate errors → step 7 failed, or the user did not restart the browser / shell after installing the CA
curl: (7) Failed to connect→ step 3 failed, or ports 80/443 are occupied by another process
Report format
check status fix
1. docker daemon OK —
2. shared_ingress network OK —
3. duckeighty compose project OK —
4. traefik + dnsmasq on net OK —
5. /etc/resolver/… MISSING ./duckeighty.sh setup-resolver
6. DNS resolution FAIL (after step 5)
7. mkcert local CA OK —
8. HTTPS reaches traefik FAIL (after step 5)
End with the single first command the user should run. Do not dump all per-step fixes when one upstream fix unblocks the rest.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most debug triage skills give in ~1.2k tokens
Counted across 1,020 of the 1,639 authors here whose files we hold, read 2026-09-06
- Find root cause before attempting any fixin 134 of 1020, across 118 files
- Create a failing test case before implementing a fixin 109 of 1020, across 95 files
- Read error messages and stack traces completelyin 102 of 1020, across 88 files
- Reproduce the issue consistently before investigatingin 90 of 1020, across 77 files
- Make the smallest possible change to test a hypothesisin 90 of 1020, across 76 files
- Trace data flow backward to find the sourcein 84 of 1020, across 70 files
- Form a single hypothesis before testingin 78 of 1020, across 64 files
- Implement only one fix at a timein 76 of 1020, across 63 files
- Question the architecture if three fixes failin 73 of 1020, across 59 files
- Add diagnostic instrumentation at component boundariesin 68 of 1020, across 56 files
- Compare broken code against working examplesin 68 of 1020, across 57 files
- Write a regression test before applying the fixin 62 of 1020, across 55 files
Said here and by no other author read
- judge each check result
- note the single fix command if a check fails
- produce a compact status table at the end
- point the user to the single next action
- resolve the checkout path using environment variables or docker
- ask the user for the path if not found
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.