feat(doctor): nine checks, and the three shapes that keep them honest (T47a) - #25
Merged
Conversation
… systems The module was declared without the host gate and the macOS and Linux hosts never got the field, so every leg but this developer's own failed to build. And the suite assumed a healthy runner: CI measured port 80 inside a reserved range on the Windows runner, where the check is right and the premise was wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes T47a, the read half of T47.
mix doctorexamines nine things and says what it found, writingnothing: no row, no file, nothing enqueued, and no elevation prompt can result from a call.
T47 was one roadmap line covering four subsystems. The split is by what the code does to the
machine rather than by subsystem, because that is the boundary a reviewer can accept on one side of
and reject on the other. Repair, flushing the deferred privileged queue, and stale generated
configuration are T47b's.
Nine checks, each read from the subsystem that owns the answer
The hosts block through T41's own comparison, the resolver through T45's probe, the DNS server
through T44, answering on 80 and 443 through T42, the pending queue through T40b/T64, every declared
domain through T46's report rendered rather than recomputed — which T46 asked for by name — the
home's permissions through T3a, what this system promises about a service's descendants, and the port
ranges this system has reserved.
Three shapes worth more than the checks
Noteis notProblem. What MixEngine can promise about a killed daemon's descendants is totalon Windows, the immediate child on Linux, and nothing on macOS. Reporting the macOS answer as a
fault would report the operating system as broken and leave a user with nothing to do; reporting it
as nothing at all is the exact failure ADR 0007 exists to prevent. The same distinction keeps
hosts_onlya supported mode — T46a closed it as one — rather than a permanent fault on everymachine that never wired a resolver.
Skippedis not silence. Every check appears in every report in a fixed order, so a shorter liston one operating system cannot read as a clean bill of health.
A
Problemcarries a closed id and never advice. T46 argued that a diagnostic must not suggest afix it cannot perform, because the advice drifts from the thing that performs it. An id is a name for
a condition, and being closed is what stops T47b's repairs and this build's findings drifting apart
at all: a repair for a condition nothing produces will not compile.
The check that earns its keep
Windows reserves port ranges — Hyper-V, WSL, Docker Desktop and
winnatall take them — and a bindinto one fails with an access error. It reads as a permission problem, so a person who hits it
goes looking at elevation, UAC and the firewall, none of which is the answer. This is the one check
that saves a wrong search rather than reporting something findable.
And it found one immediately. The GitHub Windows runner has port 80 inside a reserved range, so
mix doctorreports a problem on an empty home there — correctly, because a front end on thatmachine genuinely could not bind 80. The finding was right and this PR's first test premise was
wrong: a suite may assert that its condition is absent and then present, never that the machine
running it is well.
The
icaclsquestion T3a left open is settled: keep itT3a deferred it because the apply path was verified working and the check had no caller. This task
is the caller, and the whole of what it needs is "is inheritance still severed, yes or no" — which
icaclsanswers. The ~150 lines ofunsafeFFI buy a trustee comparison nothing asks for. Whatwould reopen it: a caller that needs to know who has access rather than whether inheritance was
severed.
Design:
docs/superpowers/specs/2026-08-24-t47a-doctor-design.md