agentsclimarketplace

Duckeighty doctor

Skill mackee/duckeighty/skills/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

Install
npx -y skills add mackee/duckeighty --skill duckeighty-doctor

Assembled 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:

  1. $DUCKEIGHTY_CHECKOUT env var if set.

  2. 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 the duckeighty project is running.

  3. 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.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.