What FreeWilly shipped.
Every entry in docs/CHANGELOG.md, read at 7dad90f and dated by the commit that wrote it.
- DD284 · 704a856A silent install on a blocked machine exits 1 at the preflight page instead of 7, and /MERGETASKS is overwritten
Silent Setup skips the tasks and preflight pages, so a blocked machine exits 7 from PrepareToInstall and /MERGETASKS holds; measured exit 7, nothing installed, on the test guest.
- DD282 · e7a49b1A release never reaches winget-pkgs: the manifests stay in the repository unsubmitted
publish-release.ps1 runs wingetcreate submit after the release exists when WINGET_TOKEN is set, and skips without failing on a draft, stale manifests or a missing token.
- DD281 · d2192d9No winget manifest exists, so
winget installcannot find FreeWillybuild\winget carries manifests for alegauss.FreeWilly, rewritten from the built installer by update-winget.ps1 during update-release; winget validate passes on v1.0.15.
- DD280 · 6db267athe filesystem check refuses on a distribution that will not start, which is the one whose filesystem needs it
A distribution that will not start is checked by the UUID read off its ext4.vhdx and a launch under the hold that attaches the disk; it repaired the disk it was measured on.
- DD279 · b5313fbthe relay's dispose joins its accept thread for five seconds inside a teardown budget of four
The relay's join now takes the same budget as the calls around it, so the last wait that could outlast a session ending no longer stops the steps behind it running.
- DD278 · 9324afdsix callers spell their own version of what a wsl call said, and none falls back to the exit code
The six restatements now call one Detail that carries the separator, so a wsl call which exited non-zero and wrote nothing names its exit code instead of resolving to nothing.
- DD277 · 0b55204the teardown lines two processes now write are both labelled stop, so nobody can tell which wrote one
A teardown step is written under its writer's own column word, so the host's stop and the tray's backstop are told apart in the file DD188 leaves that question in.
- DD276 · e174fcca logoff on a machine that never provisioned an engine now writes a terminate failure
A terminate that finds nothing registered now says there was nothing to take down, so a logoff on a machine with no engine stops writing a failure about one.
- DD275 · e59e232the terminate a session ending depends on is given 15 seconds inside a budget of 4
Every wsl.exe a hurried teardown runs is bounded by half the shutdown budget, so one call that hangs gives up in time for the next rather than spending the four seconds alone.
- DD274 · f4a2f35a child Windows refused to start reads in the journal as a tool that exited without a word
An exit code Windows chose now reads as what it is, so 0xC0000142 and 0x40010004 say the launch was refused or killed rather than arriving as a bare number.
- DD273 · 39de7aaa teardown killed mid-way writes nothing, because the stop's one journal line is composed only after every step
A hurried stop writes each step into the journal as it finishes, so a teardown Windows kills part way through still says how far it got.
- DD272 · e245431the tray's backstop reads a quiet pipe as the host having taken the distribution down, and the pipe goes quiet first
The backstop now asks whether the distribution is running, so a host that stopped serving the pipe but never reached the terminate is finished off rather than trusted.
- DD271 · c24e851a session-ending stop reaches the terminate that unmounts ext4 only after three other wsl.exe calls
A hurried stop now runs wsl --terminate before anything else, so the step that unmounts ext4 lands inside the four seconds Windows allows rather than behind three other launches.
- DD270 · 18c8bbba wsl.exe that fails to start during a shutdown opens a modal Windows error box and blocks until dismissed
Every wsl.exe FreeWilly starts inherits SEM_FAILCRITICALERRORS, so a launch Windows refuses during a shutdown fails at once rather than holding the teardown on an unclickable box.
- DD269 · 7bef7a5a start can be asked for while the provisioner is rewriting the engine binaries, and nothing stops the two overlapping
The provisioner holds a lock across the import and the unpack, and a start waits up to twenty seconds for it out of its own budget, saying so where it waited.
- DD267 · 7bef7a5the retry reads the launcher's exit code only, so a binary the daemon forks being busy is never tried again
A start now relaunches on the daemon log's own words as well as on the exit code, so a busy containerd under a daemon that exec'd fine is retried rather than reported.
- DD266 · e207bd7the journal says wsl.exe exited without a word when the words are in the log the launch redirected them to
A launcher that exited silently has the daemon log's last line read and quoted in the journal, and a launcher that named its own cause is still not sent to the log.
- DD265 · c8d91efan upgrade that replaces dockerd while a start is asked for leaves the engine down until somebody asks again
A start launches the daemon again up to three times where the launcher exited 126, pausing between, and says how many relaunches it took where there was one.
- DD264 · e086173nothing drives a client that stops reading without hanging up, so the drain deadline has never run
The state the deadline guards cannot occur while the listeners reserve no buffers, so a test pins the mechanism and the count that would notice the buffers changing.
- DD263 · 01d459ethe relay's figures cannot say how many connections are open, so a channel it never released is invisible
Figures carries a fourth clause only when it is not zero, so a quiet engine holding channels reads differently from one holding none, and the count comes back down.
- DD262 · e773053docker logs -f, attach and the websocket endpoints are upgraded connections the live drill never drives
A live drill drives an attach and a follow ended from either side, asserting the abandoned one takes its channel with it; the websocket path is the same branch, so it needs no case.
- DD261 · d0eb4f7every process this product starts but one inherits the caller's working directory and holds a lock on it
Every starter names the system directory but the shim, which inherits so a relative build context still resolves, and a source guard fails the next one written without it.
- DD260 · ff953b2the suite never drives an attach or an exec through the relay, so a broken teardown ships green
A live drill runs compose run, start -a and exec through a relay served from the working tree and asserts the exit code each client reports, including a container that failed.
- DD259 · 65fd9dadocker compose run, start -a and exec exit 1 with a broken pipe after the container has already succeeded
The teardown drains and closes the handle instead of disconnecting it, so a client reading an upgraded stream to its end gets the broken pipe every client reads as the end.
- DD258 · 3caee25a follow across a compose recreate costs a second call, because it reports the replacement rather than following it
A follow on a role address now crosses one recreate and marks the seam as a row in the payload, so
compose upand the read watching it are one call again; an id address still ends. - DD257 · f36be98a follow is bound to a container id, so a compose recreate ends it and the session is told the log ended
A follow that ends on the stream now asks the daemon once who answers the address, so a container replaced under it says so instead of reporting the log ended, with or without
--until. - DD256 · 8857c73a follow stopped by Ctrl+C reports the deadline it never reached, so the transcript names a wait that did not happen
A follow now reports which of five endings stopped it, on two linked sources rather than one, so only the deadline names a duration and a stop, a ceiling and a log that ended say so.
- DD255 · e8d90eda follow's exit code is decided at the surface and asserted a layer below it, so what a session branches on is untested
Four tests now drive a follow through
AgentSurface.Readagainst a framed fake daemon, so the exit code a session branches on is asserted where it is decided, beside the payload. - DD254 · eaeaf71two help rows run past the terminal's width, so a folded summary lands in the column a verb name goes in
read contextanddo reclaimnow break their summaries the wayread logsdoes, and the width is asserted over every help row rather than only the rows that declare a break. - DD253 · 53cef06a follow re-splits its whole buffer per chunk, so
--follow --outspends its deadline splitting rather than readingLogTallycarries the split across chunks and counts the payload as it grows, so a follow costs what it reads and--follow --outspends its deadline reading. - DD252 · 634c9f4the
--requestrefusal states the opposite of the rule: a bare path is told it begins with a slash when it does notEvery
--requestrefusal now says what a correct value looks like after the colon, so a bare path is no longer told it begins with a slash, and each one is asserted by name. - DD251 · 587fd59
read logscannot follow, so watching a run live drops the session back to the docker CLIread logs --followwatches a run to a line (--until), a deadline (--timeout) or the token budget, so following a seed no longer sends the session todocker compose logs -f. - DD250 · 3ffc15e
read verify --requestcannot assert a path is gone: a 404 is only ever a failureread verify --requestnow takes--expect 404(or a comma list), so a path that must be gone has a check that passes, and a missed expectation prints the status that arrived. - DD249 · a1928f9the page slices the help by prefix, and the guard on that slice shares the assumption so it cannot catch it
helpExcerpt and every guard in product.test.mjs share one whole-verb matcher, and a case states the rule so the page and its guard cannot agree wrongly again.
- DD248 · c86e108the guard on the generated help matches verbs by prefix, so a verb that is a prefix of another passes unseen
The guard compares whole verbs, so --compact is no longer answered by --compact-drill; proved by re-running it against the stale file it had passed.
- DD247 · d56b2a9the elevated route has no rehearsal, and it is the one that shipped broken twice against a real disk
--compact-drill --as-administrator points the same sequence at the scratch distribution, so the diskpart route is answered over half a gigabyte of wasted disk.
- DD246 · 04867bfthe site says the compaction ends where Windows stops allowing it, which stopped being true, and names no verb for it
The site and llms.txt say the hand-back can be refused and what the page then offers, naming the rights, the WSL shutdown and the free decline, plus the compaction verb.
- DD245 · 84b3d21the two compaction sequences carry the same five steps twice, and the copy already inherited a wrong verb once
DiskCompaction.Walk carries the five beats once and both routes pass what differs, so a take-down cannot be copied and inherit the wrong verb again.
- DD244 · cffc967a compaction whose prune failed reports the prune as its outcome, so the withdrawn hand-back is never recognised
Failure reads the step that decides the run through the same predicate Succeeded does, so a prune that could not reach the daemon no longer hides a withdrawn hand-back.
- DD243 · 3fbae86diskpart reports its progress to a log nobody reads, so the longest step of a compaction is one unchanging line
A channel beside the steps carries diskpart's own percentages, read out of the log it is writing, matched on the number so a translated machine reads the same climb.
- DD242 · 8a9c602there is no compaction verb, so the one piece of work on this page a terminal cannot start
--compact runs the compaction through the same seam the button reaches, and names --as-administrator rather than reaching for it where Windows has withdrawn the other route.
- DD241 · e8100cathe driver cannot reach the compaction, so the one path with a UAC prompt is only ever exercised by hand
--compact drives the compaction and goes on into the elevated half where the page offers it, stopping at the UAC prompt because that one is nobody's to automate.
- DD240 · 12e43bc--drive-window never returns when no window is open, which is the machine it was written to serve
The launched window goes through the shell, so it gets its own handles and the driver's exit closes the caller's pipe; measured at 2.4 seconds where it used to never return.
- DD239 · f3273b9the panel says it is compacting and then nothing for minutes, so a working run looks the same as a hung one
A timer on the UI thread reads the queue the run is filling and redraws only when something landed, so both runs show their steps as they happen.
- DD238 · fa066ffdiskpart cannot open the virtual disk because terminating the distribution leaves the WSL2 VM holding it
The elevated compaction shuts WSL down, waits for Windows to release the disk, and the plan names every distribution that stops; diskpart returned 21.4 GB on the first run.
- DD237 · ccc370fWindows has withdrawn the hand-back that needed no admin, so the Compact button now ends at a wall on every machine
The refused ending now carries a button that runs diskpart under one runas, naming the four verbs first, and the tray itself stays unelevated.
- DD236 · c44a042an install over a running tray leaves the stop to Restart Manager, which cannot close a tray or its detached engine
The stop moved above both callers, and the install asks for it on the ready page and again in PrepareToInstall, which is the only one a silent install reaches.
- DD235 · b8fc17fthe window's prune buttons run under the budget written for a list, so a big machine gets a timeout not a reclaim
The client's timeout is gone and each call links a token cancelled after its own budget, so the three prunes get ten minutes on the same client a list gets twenty seconds on.
- DD234 · 84d1cbdthe compaction drops the build cache under a twenty second budget, so the fuller the disk the surer that step fails
EngineBudget names both kinds of call, the compaction's prune is asked as Housekeeping with ten minutes, and its ping keeps the twenty seconds telling a stopped engine from a busy one.
- DD233 · 18686f2the site scrolls sideways on a phone: the nav measures 625px at a 390px viewport and nothing below 1180px sheds
The nav drops the alegauss chip and the repo button below 600px, the brand shrinks below 380px, and the card grids use minmax(min(...)), so every route measures zero overflow from 320px.
- DD232 · a6d83aathe clean-room release fails on its last step, because two commands are folded into one line of YAML
The drafting step is a literal block, so it runs as two commands, and a test refuses any run: whose next line is indented into it, which is what folded them.
- DD231 · 13f3b4ethe preflight calls this tool's own running engine an unidentified rival and tells the user to uninstall it first
The pipe signal drops out where a host of this tool's holds the engine slot, so a running FreeWilly is no longer reported as an unidentified engine the user is told to uninstall.
- DD230 · 8303d89the site's generated help has been missing three verbs since they shipped, and the check runs only in the safe direction
The generated help carries the three verbs it was missing, and the check now also asserts that every verb the command prints reached it, which is the direction that goes stale.
- DD229 · 9dd97abthree places describe the Engine page's readings and all three describe the one from before the Compact button
The site, llms.txt and the budget note describe the disk from both sides and name the Compact button, and the measured figure for read health is 146 rather than the 138 it was.
- DD228 · 010e831a temporary distribution left by an interrupted run makes the next one refuse instead of taking it back
Every import first terminates and unregisters the name it is about to take, so a run that meets a leftover of its own clears it and says so instead of stopping on ERROR_ALREADY_EXISTS.
- DD227 · fa403efCheck filesystem and Compact show no confirmation, so pressing either does nothing at all
The confirmation was there all along and the driver could not see it: DD222's finding was wrong, and a dialog is now found through the window that owns it rather than under the desktop.
- DD226 · dcdb78ethe Compact plan asks somebody to stop Docker for a hand-back this machine has already refused once
A hand-back Windows refuses is written down beside the install, so the plan says so and asks whether to try anyway; a hand-back that works forgets it, because the flag is disabled and not removed.
- DD225 · 42be8a5the compaction measures the disk's length, which a sparse file keeps, so a hand-back that worked reports no bytes
The compaction and the panel read what the volume is charging for through GetCompressedFileSize, so a hand-back that worked reports the space a sparse file's length cannot show.
- DD224 · 0011925the Compact button cannot succeed: WSL refuses --set-sparse outright and names the flag DD211 will not pass
A hand-back Windows refuses is recognised by the flag it points at, not its translated prose, and the page says Windows has turned this off rather than inviting a second interruption.
- DD223 · acf55c1prepared rescue images are never swept, so a manifest bump orphans one and an uninstall leaves it behind
Keeping a new prepared image drops the ones this build no longer names, and the uninstaller takes whichever are left, so an Alpine bump and a removal both stop leaving tarballs behind.
- DD222 · a405a4dthe driving verb's check half has never been run, because the tray holding the slot was an older build
Both halves ran against a current window: the read-only one walked the whole page, and the check half found no confirmation appears at all, which is the window's defect and not the driver's.
- DD221 · 4df80cathe compaction has never run against a real virtual disk, so the one path that hands blocks back is unexercised
A --compact-drill verb grows a scratch disk, empties it and drives the shipped compaction at it; the first run showed WSL refuses --set-sparse outright, so the button cannot work.
- DD220 · c9748d4the panel can call a filesystem clean while showing e2fsck's complaints about it directly underneath
A clean verdict over a transcript says the tool declined to change anything and printed something anyway, on both surfaces, without either of them reading e2fsck's prose for a verdict.
- DD219 · 24efb64the status pill is a typed width, so its text runs out the side on a machine whose fonts are not the author's
The pill's width is a slot the build fills from a measurement of the chip text, so it hugs its copy under DejaVu and under whatever a machine falls back to.
- DD218 · 8dec752the social card still draws the square placeholder mark, so a shared link shows a logo the site no longer uses
The card is a template the build fills from public/logo.svg, sized by height the way the site sizes it, so the orca is on every share and the next artwork change carries through on its own.
- DD217 · 83bd43athe findings end with the version banner, because the two streams are concatenated rather than interleaved
Both streams are read as arrival-ordered pieces and decoded through one stateful decoder each, so e2fsck's banner sits where it was written instead of under the summary line.
- DD216 · 4188c7fevery check fetches e2fsprogs over the network, so the first one is slow and an offline one refuses
The rescue keeps a prepared image beside the install, so only the first check fetches e2fsprogs and every later one works offline; the dialog names that fetch instead of blaming the disk.
- DD215 · 1e5333athe repair has never run against a dirty filesystem, so the one path that writes is unexercised
A --fsck-drill verb makes a scratch ext4 image, breaks it on purpose and walks the write path: the check found errors, the panel offered Repair, e2fsck mended it and the disk came back clean.
- DD214 · 755ea37every test of the window reads the window's own source, so nothing catches a control that is wired wrong
A --drive-window verb works the real window through UI Automation and prints what it says; --check drives the filesystem check, and the dialog is pressed by control id rather than caption.
- DD213 · dc26711a check run from the terminal is announced as an outage, because only the window tells the tray
A stop a verb asks for reaches the tray through a signal of its own, so no balloon calls it an outage, and the verb leaves the engine where the caller asked and names the command that starts it.
- DD212 · 25c2c0fthe readings panel still says the distribution is not running after the check has started the engine again
The readings follow the engine state change the window is already told about, so the panel stops disagreeing with the strip above it.
- DD211 · 423c1bfthe virtual disk keeps every gigabyte an image or a build cache ever used, and nothing on the page hands it back
The Engine page has a Compact button: it drops the build cache, trims the filesystem and hands the freed blocks back to Windows with wsl --manage --set-sparse, reporting both sizes.
- DD210 · 1e1d3aethe filesystem check stops Docker with no warning, reports its own stop as an outage, and leaves the engine down
The check asks before it interrupts anything, tells the tray the stop was asked for so no failure is announced, and starts the engine again when it finishes.
- DD209 · e01a8b7unregistering the rescue while it is still running wedges every WSL operation on the machine
The rescue is terminated before it is unregistered, so the call that removes it is the one WSL handles rather than the one it blocks on.
- DD208 · ecd6fd3stopping a project leaves every service that was already down saying Stopping… forever, and the header with them
A verb now reaches only the containers it has something to do to, and a wait ends where the list reports the outcome, so a project stop no longer strands a one-shot that exited yesterday.
- DD207 · e35f64athe filesystem check stops the engine without announcing it, so the live host revives it while e2fsck reads the disk
The check announces its stop the way --stop does, so the host ends deliberately instead of putting the engine back under e2fsck.
- DD206 · 390a814the site and llms.txt describe the Engine page as the journal alone, which it stopped being three commits ago
The site copy and llms.txt now describe the readings and the filesystem check the Engine page has carried since DD197, not the journal alone.
- DD205 · c6b210fa check leaves the engine stopped, and the page that stopped it offers no way to start it again
The outcome that stopped the engine now carries the action that starts it, on every ending but the one where the check could not finish.
- DD204 · c231c46the filesystem check is assembled twice, once for the verb and once for the window, so the two can drift apart
The verb and the window reach one assembly of the check, and the routing gap that had left --fsck unreachable since it shipped is closed.
- DD203 · 7dcbf3dno run of the check has ever imported a rescue, terminated the engine and read a disk in sequence, from either surface
The check ran end to end against this machine, all eight steps, and found the live host reviving the engine into the middle of it.
- DD202 · 2beb170fourteen tests fail whenever a real FreeWilly is running, so the suite cannot go green on a machine that has one
The fourteen single-instance tests skip with the reason where a live product holds their slot, so the suite goes green on the machine developing it.
- DD201 · 583c934the filesystem check refuses on every machine, because two commands it runs are not in a minirootfs
The two util-linux commands are gone: the root device comes out of /proc/mounts and blkid answers both directions from a listing, checked against the live distribution.
- DD200 · 7447353the start check reads a kernel log every distribution shares, so another disk's fault reads as this one's
The start check reads this filesystem's own error count and mount options out of the kernel, and the shared log it used to match on is gone rather than filtered.
- DD199 · 13c47cbnothing repairs a corrupt distribution filesystem, and the check cannot run against a mounted root
The Engine page checks the filesystem and offers a repair only once a check has found something, stating beforehand that the engine stops for it.
- DD198 · 674c43dthe agent surface has no reading for the health of WSL, the distribution or the disk
read health answers for the machine under the engine in one call, off the same report the window draws, at 138 tokens against a ceiling of 200.
- DD197 · b659d63no single surface says what state WSL, the distribution and the engine are in
The Engine page carries the five readings the diagnosis took by hand, off one call the start check shares, with a copy button beside them.
- DD196 · 7fe4a6dthe distribution ships without e2fsprogs, so nothing on it can check or repair its own filesystem
Provisioning installs e2fsprogs and e2fsprogs-extra and proves e2fsck is on PATH, so the repair has something to run when apk cannot.
- DD194 · 3ae27eaA fixture capture of the builds page draws its times in the operator's zone, so two machines make two pictures
The builds fixture anchors a wall clock stamped with the drawing machine's own offset, so a capture shows 09:29 in every zone rather than the operator's.
- DD193 · 6afee13A build's start is printed in the daemon's UTC, so one begun at 09:49 on this machine shows on the page as 12:49
The column and the detail pane convert a start to this machine's zone through one shared call, so the 09:49 build the page showed as 12:49 reads 09:49.
- DD192 · d9bbfc4stdout and stderr share one buffer, so a journal line decodes half of what wsl.exe said as noise
The launcher's two streams are buffered and decoded apart, so the half naming the condition survives instead of being traded for the other.
- DD191 · d10dac5nothing asks whether the distribution filesystem is clean, so a dirty one is found by the start that fails
The host now reads the distribution's mount for filesystem errors at start and writes to its root on a long interval, saying so without refusing.
- DD190 · 7efc5aca distribution whose root went read-only fails with getpwnam and a pointer to a log inside it
getpwnam failing with 5 now reads back as an unreadable root, and the e2fsck commands are printed where a log inside it used to be named.
- DD189 · ffa268athe daemon is killed rather than asked to stop, so no container gets a SIGTERM at a quit or a shutdown
Every teardown now sends dockerd a SIGTERM and waits, on a budget the caller chooses, so containers stop themselves before the kill.
- DD188 · 695ddf8the tray answers a session ending by spawning a stop process Windows kills before it reaches the distribution
The tray now answers a session ending in-process: it tells the live host, waits out the same budget, and takes the distribution down where the host cannot.
- DD187 · 5865543the engine host is never told the session is ending, so nothing tears it down at a shutdown
The host now takes SessionEnding, cancels the token Ctrl+C cancels and holds Windows until the terminate and its journal line are both written.
- DD185 · f2e6617the window, tray and CLI print em dashes the site is bound to quote
62 of the 64 em dashes the window, tray and CLI print became a colon, a comma or a full stop, so the twins the site publishes now quote none.
- DD186 · 63c2673Every page ends without a pointer to any other tool the same author publishes
Every route ends on one house ad slot above the footer, drawn by japode-ads with storage off and FreeWilly excluded, following the site's own theme toggle.
- DD184 · 0794e60the published prose carries the mannerisms of generated text
201 of the 207 em dashes are gone from the site copy, the README and llms.txt, each replaced by the relation its sentence actually had, and the hero and download chips lost their emoji.
- DD183 · 41f9802The balloon fires the instant the engine stops answering, so a blip the host heals in ten seconds interrupts the user
The balloon is armed at the crossing and fires only if the engine is still gone fifteen seconds later, so a blip the host heals costs the user nothing and a real outage still speaks.
- DD182 · 5052e22A restart line names the attempt and not the outage, so how long the engine was away is a subtraction across two lines
The revival line now ends with how long the engine was unreachable, measured from the poll that first missed it, so an incident's cost is in the sentence that closes it.
- DD181 · 65c9b11The clause naming what is on the machine is measured once and reused, so a verdict quotes evidence half a minute old
The poll that establishes a finding states it flat and every poll that repeats it says it is as of the first quiet poll, so a verdict no longer passes off older evidence as current.
- DD180 · b834c2bA poll that could not connect names no relay figure, so a silence with no stumble in it is a dead end for the reader
A ping that never connected now carries what the relay accepted, what it stumbled over and whether its loop is alive, so the Windows side of the pipe is named where it is the suspect.
- DD179 · 695c5e2The pipe accept loop returns without a word when a connection wait throws, so a dead relay reads as a healthy engine
The loop now tells a stop from a death by the cancellation token rather than the exception type, records what killed it, and the host writes that as a relay line on its next poll.
- DD178 · f8aef09the shaped surface figure moves with the calendar, so an exact gate goes red on a tree nobody touched
The clock reaches read doctor through the machine seam and the shaped measurement pins it beside the fixtures, so the exact token figure is the fixtures' and no longer the calendar's.
- DD177 · e43a760the site's tray section names a menu item DD171 removed, and the drawing draws it
The tray bullet, the diagram caption and llms.txt lost the update-check item DD171 removed, and the regenerated product module is what the counts read, so the site's menu is the menu TrayMenu builds.
- DD176 · 2b89045About sets the daemon's newest API version beside the pinned one, so a working pin reads as a mismatch
The row leads with the pinned version and then states the range the daemon serves, one spelling for all three numbers.
- DD175 · 52f9422The journal says the daemon is running when what was checked is the wsl.exe handle on this side
A silent poll now asks the machine what is there, so the journal names a distribution that stopped, a daemon that died, or the launcher it could only see.
- DD174 · 746c864The first five quiet polls write nothing, so the journal cannot say when an outage began
The host now writes the poll that starts a run of silence, so an incident is dated at both ends instead of only at the verdict six polls later.
- DD173 · 05f762dA ping timeout reads the same whether the pipe never connected or the daemon never replied
A ping that runs out of budget now says which stage it ran out on, so the journal separates a connection nothing accepted from a daemon that went quiet.
- DD172 · 1e67740The balloon announcing a release does nothing when clicked, so the offer is reachable only through the tray menu
Clicking the balloon reaches the same install the menu item does, guarded on the balloon on screen being that release's, so a click on a failure starts nothing.
- DD171 · 46135a7The release check ships off, so an install learns a version exists only if somebody found the menu item first
Reversing DD154: the tray asks on every launch, the setting and its menu tick are gone, and the site and About state the second host rather than qualifying it as a switch.
- DD170 · 3afc58dA destination already ticked is shown by the caller's spelling, so a capture of volumes photographs the containers list
ShowTab hands Show the button's own tag on both paths, so a destination named in any casing draws its own page, and a strip entry the switch does not answer now fails a test.
- DD169 · 47c8acaWhether a volume is anonymous is guessed from its name being 64 hex characters, not read off the daemon's label
The daemon's label decides where the list carries one, proven by any volume in it having one, and the sixty-four hex characters stay as the fallback for a daemon that stamps none.
- DD168 · 3bbbca1An anonymous volume's name fills the column with 64 characters, where the app's own delete dialog shows 12
The name column draws twelve characters and an ellipsis for a generated name, the whole digest moved to the tooltip, and the delete dialog reads the row's rule instead of its own copy.
- DD167 · 2b02e16Nothing says a container's image left the store, so a digest row and an empty USED BY read as two lists disagreeing
A container running on an image the store no longer has says image gone beside the digest, read off Image equalling ImageID, and the sample machine carries one.
- DD166 · d209a81A container's image column prints a full sha256 digest, so what is running is truncated mid-hash
A bare digest now reads as the twelve characters docker ps prints, spelled once in ImageReference.Short and used by the window, the CLI list and the agent surface.
- DD165 · de537a3The engine journal is a file nobody finds, so a user who watched the engine go offline has nothing to read
An Engine destination follows the host journal live, with the restart count, the file path and Copy all - and the site's destination count now comes from the nav strip instead of being typed.
- DD164 · 5911617The host gives up after five attempts, so an engine that could not come back stays down until somebody clicks Start
The five quick attempts still run and still say so, but the host now settles into a five-minute interval instead of exiting, and the tray says once that it is working on it.
- DD163 · 4f3ae49The journal records the engine and nothing around it, so a suspend, a logoff and a killed host read as one silence
The journal now carries the host coming up and going down, a suspend, a resume, the session ending, and the tray's own view of the engine and of every click - one timeline, not half.
- DD162 · 50e91abA start that fails inside wsl.exe blames the daemon log, and that log is empty because the daemon never ran
A refused launch now reads wsl.exe exited -1 with the message it wrote, decoded from the UTF-16LE it writes on stdout, and the daemon log is only named where a daemon actually ran.
- DD161 · 27d2980the release is created by CI on a tag rather than by the script that built it
build\update-release.cmd upload now creates the release itself, from the installer it built, with the versioned asset and its SHA-256 attached.
- DD160 · 7448390the tray section on the site describes a menu the product no longer has
The section states the item count from TrayMenu, names one item per bullet, and says that Quit takes the engine with it.
- DD159 · cae324fthe counts on the site are typed where the source could state them
The site reads its counts from ProvisioningStep, engine-manifest.json, PreflightInspection.Rows and CommandLine.HelpText at build time, and the help block is a slice of the real output.
- DD158 · e4a7d4athe hero sends a reader to GitHub before answering what the install touches
The hero button scrolls to the download section and the one inside it leaves; the window caption claims what the code does; and the matrix charges for Compose and Buildx.
- DD157 · 42edbe1the site states counts the source has moved past
Every drifted count corrected in the page, the feature pages and llms.txt; Compose, Buildx and the Builds destination named for the first time; the help block titled as the excerpt it is.
- DD156 · d5932efthe landing page closes by asking for the .NET SDK
The clone section is gone and the page ends on the download; llms.txt no longer says no packaged install exists, and from source now points at the README section that holds it.
- DD155 · 5462977the nav wraps its own labels once the download button is in it
The duplicate Download link went, the plain labels stopped wrapping mid-phrase, and the gap and the 'part of' chip give way before the labels do.
- DD154 · 3cc932ean installed copy never learns a newer version exists
The tray asks the release API once on launch and every six hours, off unless turned on, and offers an installer only after checking it against the SHA-256 the release publishes.
- DD153 · 4354740the site has no way to get the thing it argues for
A download section after the non-goals, the primary button in the nav and the hero, and Releases in the footer - all pointing at releases/latest, which no version number can go stale in.
- DD152 · be179b1the release page offers a bare .exe beside the installer
release.yml now attaches the installer and its SHA256SUMS.txt, and nothing else; the bare .exe stays a thing build.cmd produces.
- DD151 · c78bc05the release gate fails on a checkout that has no vendored roadkeep engine
The test now asserts a conditional claim: where nothing is vendored, there is nothing to resolve and it stands aside instead of failing.
- DD150 · a229e75check.yml compiles the installer without publishing everything it packages, so every push fails on a missing file
check.yml publishes the forwarder as well as the tray, and the publish directories are read out of the script so a third binary is under the rule too.
- DD149 · 11050c4The relay's accept loop waits on the thread pool, so work elsewhere in the process stalls every docker client at once
The accept loop blocks on a background thread of its own, and a dispose ends the wait by closing the handle underneath it.
- DD148 · a9e0869do compose up takes no arguments, so a project that names its own files cannot use the verb at all
The verb takes -f the way compose does: given any, they are the project and no convention is consulted; given none, the directory answers as before.
- DD147 · 82c5082A budget figure is typed rather than produced, so an exact gate can bind a number nobody measured
The measurement writes the figures it produced when asked to, so a recorded number is one a run produced rather than one somebody typed.
- DD146 · 5896bb1A successful install keeps no record of what it was cleared on, and the uninstall deletes a file nothing writes
The reading the wizard acted on is written to {app} once it exists, every row and not only the blockers, by the one writer both paths use.
- DD145 · 483c7f4A wizard page is checked by reading Pascal, so an overlap is found by somebody running an installer
A committed harness compiles the page block on its own, renders every state it has and fails on an overlap, a control off the surface or a caption that does not match.
- DD143 · 41625b3do compose up reads only docker-compose.yml, so the agent verb brings up a different stack than the project defines
The verb names the override compose would apply as well as the base, and prints every file that went into the project it brought up.
- DD142 · d0d8616Every docker client fails together for a burst of tens of seconds, then all of them work again untouched
The count of refused pipe instances reaches the host log, so a burst that leaves the engine reading healthy now names itself instead of being argued from Hyper-V events.
- DD141 · e53913bThe docker CLI's failure names the pipe but not the one command that brings the engine back
The docker on PATH is a console forwarder that runs the vendor CLI untouched and, where a failure meets an unanswered pipe, names the verb that starts the engine.
- DD144 · bfa7d35The agent budget gate is red on a clean checkout: the shaped surface measures 812 tokens against 813 recorded
The figure is 812, which is what the task cost on the commit that recorded 813 and never measured it, so the gate is green and exact again.
- DD140 · 53e8055Clicking the tray icon does nothing, so the window is only reachable by right-clicking into a menu that lists it fourth
A left click on the tray icon opens the window, and Open window leads the context menu instead of sitting fourth, so the icon answers the gesture a user already makes.
- DD139 · 71a3dbfOne named volume anywhere hides the bind mounts again, because only the empty state ever mentions them
The totals line carries a third clause naming the same bind mounts the empty state counts, so a tab that has rows still says what it is not showing.
- DD138 · 02ae6fcA compose file that binds host folders leaves the volumes tab saying nothing has been created, which reads as lost data
With the list empty the tab now says how many bind mounts are in use, who holds them and that they are host folders the engine does not own, rather than that nothing was created.
- DD137 · 1f478c6Why the engine host stopped is printed to a hidden console, so a daemon that vanished leaves no evidence
The host writes what it saw and every restart it attempted to engine.log beside the install, capped at 64 KB and silent while the engine is up.
- DD136 · 1801917Nothing brings the engine back when WSL2 stops under sleep, so a resumed machine is left with no daemon
The engine host puts back an engine it loses, backing off across five attempts and saying so if it runs out, while Ctrl+C and an announced --stop still come down at once.
- DD135 · e5c64dcThe engine does not come up when FreeWilly does, so every session starts with the daemon stopped
Opening the tray starts the engine, under a menu setting that ships on and is remembered in settings.json, so turning it off restores the run-when-asked behaviour exactly.
- DD134 · a844b6aA slow ping through the relay reads as a dead engine, so the host terminates a daemon that is working
A status now says whether it is evidence, so only a local process handle or a probe that answered ends the watch; a slow ping raises the relay and never terminates the distribution.
- DD133 · 404f8cbThe docker_engine named pipe disappears under a long build, then returns on its own
One engine host per session, and a run of quiet polls rather than one deciding it is gone.
- DD132 · a0a8895Turning the missing feature on is left to the user, so an install that could finish itself ends in a terminal
Setup runs the command the row named behind one runas prompt, reads the reboot-pending key for evidence, and leaves a RunOnce so the install reopens after the restart.
- DD131 · 5e37ee1A machine without WSL2 gets a message box naming a command, which assumes the reader knows what WSL2 is
The blocked install lands on a page that expands the term, numbers the steps, hands over the command with a Copy button and a link to Microsoft, and re-checks in place.
- DD130 · 7106e69Setup writes every file and only then reads the machine, so a laptop without WSL2 gets an install it cannot use
Setup reads the machine from a copy in {tmp} on a page before wpReady, so a laptop without WSL2 is stopped with nothing written, and an unattended one exits 7 with the report on disk.
- DD129 · 924a6feA logoff, a shutdown or an End task never reaches the quit path, so the engine outlives the session
The stop is hung off SessionEnding too, so a logoff or a shutdown leaves no engine and no virtual machine behind.
- DD128 · 3524004Quitting the tray leaves the engine and its WSL virtual machine running, so the memory stays held
Quit runs the same stop the menu item does, so leaving the tray stops serving the pipe, kills the daemon and terminates the distribution the WSL2 memory was held by.
- DD127 · 56c2a76A compose project's header never folds, because its hit target is arranged at nothing
Clicking a compose project's header folds its containers away and clicking it again brings them back.
- DD126 · 8f704bbThe build details link buildx prints opens nothing, because it addresses a dashboard this machine does not have
The docker-desktop scheme is registered to this install, and the ref in the link opens a Builds destination listing the history with the named record shown in full.
- DD125 · 374275bA plain docker compose up cannot bind a Windows path, because the relay forwards the create request unchanged
The relay's client direction reads the request head, respells every drive-letter bind source in a container-create body, and forwards everything else byte for byte.
- DD124 · 4076db0A plain shell has no docker compose, because DOCKER_CONFIG is left for the user to set by hand
DOCKER_CONFIG is written by the installer beside the PATH entry and repaired by the tray at startup, both gated on this install owning the docker command, so a plain shell has docker compose.
- DD123 · 9602413The Select Additional Tasks page draws its checkboxes clipped, so a tick is a fragment and an untick is a sliver
The page is drawn from plain checkboxes, which render at that scaling; [Tasks] stays the answer Setup acts on, so every Tasks: parameter and /MERGETASKS keep working.
- DD122 · 1125a9bA provision fails on the step that unpacks the engine, on a machine where nothing is wrong but a slow first boot
The caller names which kind of call it is: the reads keep the preflight's fifteen seconds, the import and the unpack get five minutes, and the failure says which budget was exceeded.
- DD121 · 29a9a1cUninstalling while FreeWilly runs leaves the .exe and its root on disk, and never offers to stop the engine first
A page states what closes and asks about the distribution; the uninstall stops the engine and quits the tray by the product's own verbs, and empties the root before Inno reads it.
- DD120 · 7b38d82A start that cannot work leaves the tray breathing Starting until it is quit, and never says what went wrong
The tray refuses a start with no distribution and names the verb that fixes it, and gives up on one that outlasts the engine's own budget.
- DD119 · 8de9537The installer finishes with no engine on the machine, so docker is not a command and the first start hangs
Setup provisions the engine on its own page, behind a ticked task and behind the preflight, and the uninstall takes back what it placed.
- DD118 · 956e91eNothing says how far behind the vendored engine is, so a fix filed upstream is one this project keeps not having
The gate runs the vendored engine beside the action it floats on and prints both versions, so a rule one has and the other lacks is red on the push rather than on a developer's machine.
- DD116 · d1f00b9ROADKEEP_HOME arrives unexpanded, so every hook runs a sibling checkout rather than the engine this repo vendors
The launcher expands the variable it is handed and prefers the copy vendored here, so every hook runs this project's engine — and a build fails if resolution leaves it.
- DD115 · 646e121Committed agent configuration is rewritten by whatever session is open, and a trimmed entry ships inside another change
A test reads the committed settings and fails the build where a trim takes a granted tool or unwires the guard owning the governed files, instead of it landing in another change.
- DD114 · 43b0500Restarting a project reaches its database last, so its dependents end up pointing at one that restarted after them
A restart reaches what is depended on first, like a start, because the fan-out now splits on where the project lands rather than on whether the verb brings it up or takes it down.
- DD113 · 48212a8The fixture machine's compose project declares no dependencies, so the ordering DD107 added is never exercised by it
The sample project declares
depends_onthe way compose spells it, so a fixture run orders its services rather than taking the fallback, and the capture is unchanged. - DD112 · d01fcb3The set of folded-away projects is never narrowed, so a project brought back under its old name comes back folded
A fold is narrowed on every answered refresh, so a project's absence forgets it rather than holding it against the next project to use that name — decided, not left to omission.
- DD111 · 46930a4One row type describes a container and a project header, and nothing says which members a header answers
ContainerRow.Membersnames what a container answers, what a project answers and what both do, and a test fails a member in no set or answered by the wrong row. - DD110 · aae3fcdThe containers page builds every row twice on each refresh, once only to read the project label off it
The containers page projects each container once and prunes from the rows it just made, and a guard over the source fails a second call to the same projection.
- DD109 · c323ca4A build after an interrupted one cannot pick a project, and build.cmd clears the cause only afterwards
Every build command names the project file, so a leftover
_wpftmp.csprojcannot leave MSBuild unable to choose, andbuild.cmdclears one before the publish rather than after it. - DD108 · fab74ebA project's row stops waiting when the last call was answered, not when its containers are down
A project header reads its wait off its own containers, so it says
Stopping…for exactly as long as something under it is stopping and ends on the event that ends theirs. - DD107 · a5f4fe7A project is stopped one service at a time, so its row carries no verb and four clicks do what one should
A project's row carries the four verbs, fanned across its containers in compose's own dependency order, with each refusal on the child that refused and the count on the header.
- DD106 · 1cff64aEvery container of a compose project is a peer row, so the project it belongs to is invisible
A compose project is one header carrying its own chevron and a running-of-total count, its containers indented under it, sorted and filtered as one thing.
- DD105 · 13e06a0Nothing can be typed into the window: the WinForms pump drops every key press the WPF windows need
A WinForms IMessageFilter now offers every thread message to ComponentDispatcher before the pump translates it, which is the pass WPF's own loop performs, so the filter box, Tab and Escape work.
- DD104 · 8deae92The water's second repeat is never drawn, so the drift empties the band from the right instead of moving it
Every layer is now arranged at the width it is drawn at, so the drift moves water rather than withdrawing it, and the far layer's direction and each layer's own rise are the site's.
- DD103 · 455819bThree tests fail whenever a tray is running, and the failure names an assertion rather than the tray
Every test that claims the tray slot reads it first, so a suite run while FreeWilly is up says the tray is holding the object rather than reporting an assertion nobody could have made.
- DD102 · 9484b28The installer script is compiled only by the release workflow, so a syntax error in it is found by the release
check.ymlcompilesbuild/installer.isson every push and asserts the installer came out, so Inno refuses a bad construct on the commit rather than on the tag. - DD101 · 7add576A bind source that looks like a distribution path and is not there stays unchecked, and it is the expensive failure
read doctorasks the engine's distribution whether a bind source it cannot settle from the string is there, and warns without claiming which of empty and unreachable it is. - DD100 · 0731091The test named for verb coverage checks a hand-written list, so a verb added to the router is asserted by nothing
Every verb is a declared constant the test reflects over, and a second guard refuses a string literal in the router, so neither route to an undocumented verb is open.
- DD99 · 43b0c4aThe tray icon is always drawn at 16 pixels, so the per-monitor-DPI manifest buys a shell-scaled icon anyway
StateIcon.Iconasks Windows for the notification area's size, andTrayScaleredraws when a dock or the scale slider moves it, so the tray stays sharp without a restart. - DD98 · f979461Nothing stops a read verb constructing a machine read inside itself and re-widening the token gate
A guard over
AgentSurface.csderived fromMachineReads' own seams fails the build on a verb that constructs one, andWindowsMachineFactsleft the file entirely. - DD97 · 9824375Two features write one Run value: the installer's start-with-Windows and the engine's autostart, with different commands
The tray's entry and the engine's have different names under Run, so neither overwrites the other, and the uninstaller takes both.
- DD96 · 8d589cfA bind source only compose up can respell, so every other route to the daemon still mounts an empty directory
read doctor's mounts row says an unreachable bind source is created empty rather than refused, and gives the spelling this engine needs. - DD95 · d7f2f5fDD75 shipped its bind translation with no test, and left the two helpers it replaced behind as dead code
An edit that silently did not apply took three guards and one deletion with it, so the new behaviour was verified by hand and by nothing the build runs.
- DD94 · 1d8de6aThe site's own README lists eleven shipped tasks as work deliberately still to come
The list of what is still to come is gone; the roadmap carries it (design §DD94 superseded: no build reading roadkeep was described there).
- DD93 · 925e8d2A binding law says the site must carry no measured number, and the site has published measured numbers since DD23 landed
The deferral is closed: the budget file is the site's generated source, and a measured cost is generated or absent.
- DD92 · 4fafe81The hero badge and a section of its own still say the project is in development with nothing to download
The badge, the status call to action and the honest-status section are gone, and the build-from-source section carries the availability truth in a form a reader can act on.
- DD91 · ad4f3ffThe site publishes a burndown of its own backlog: a board of every DD line, block progress bars and a next-task line
The board, its generator and the status route are gone, the site publishes no progress figure, and the backlog is a link out rather than a page.
- DD90 · 840863dReader-facing pages print internal task ids and a per-verb progress mark: DD badges, Block G, shipped or designed
The page lists the ten verbs the registry dispatches with no per-row mark, and a test asserts that list both ways; no task id reaches a reader.
- DD89 · 259a828The folder Pages actually serves is a hand-written copy of a page the site replaced, and no build regenerates it
The legacy folder is gone and the built artefact is the only publish, with the tray mark moved to build/ where nothing serves it.
- DD88 · b903ba4npm run build is the site's only gate and no push ever runs it, so it stayed broken for 21 commits
The site build runs on every push and pull request and the deploy still waits to be asked, so a red build is found by whoever pushed it.
- DD87 · 925660aThe HTML shells kept the old name, so the served page title still said DockerDesk after the prose sweep
index.html is markup rather than copy so it sat outside the content module DD71 swept, and the legacy docs/ folder Pages serves today was not swept at all.
- DD86 · 054eb5fThe old name survives as adoption code and an agent skill, for a product that has no installed base to adopt
The old name is gone from the paths, the label, the probe, the installer and the agent files, and every guard for a state that cannot occur went with it.
- DD85 · 3184301The tray icon is three abstract rings, so the one surface always on screen carries none of the product mark
The tray icon is the mark with the three shapes shrunk to a badge in its corner, so L8 needed no amending (design §DD85 superseded: luminance cannot replace shape on a mark this dark).
- DD84 · 0f14463The published site serves no robots.txt and no sitemap.xml, and both answer 404 where the old folder had them
Both are generated from the route table, so a route that exists appears and a rename moves them (design §DD84 superseded: per-route lastmod needs a module graph or a second list).
- DD83 · d536869Nothing in the window names the build, the engine version behind it, or the API version the client speaks
An About destination names the build, the engine, the API level and every pinned artefact, read from the manifest and the daemon and never typed.
- DD82 · 3996d82Visible is set before the icon and tooltip exist, so Windows persists an empty tooltip for the tray entry
The image and the tooltip are set before visibility, so the shell's notify-add carries both and the overflow flyout names the entry.
- DD81 · c439264A second launch starts a second tray rather than raising the first, so two icons and two event streams run
A second launch signals the tray that is already running, which restores and activates its window, then exits zero without printing at anybody who double-clicked.
- DD80 · 436b21bLaunching the executable shows nothing, and the shortcuts the installer writes carry no window verb
A bare launch is the tray and the window, and the Run key that starts with Windows is the one caller that asks for silence with --tray.
- DD79 · c42cf68SessionLabel.For reads as the one place a label is stamped and nothing in the product stamps through it
ComposeUprenders every pairSessionLabel.Forreturns, so a second label is a change to one method, and a test drives offForrather than the key the old assertion named. - DD78 · 87cf631The shaped token figure is banded because two of its inputs are read from the machine and not a fixture
The context read and the host-port read arrive through
MachineReads, defaulted to this machine, so the shaped token figure is asserted exactly at 771 instead of banded at 15%. - DD76 · 9c2fd44docker inside a user WSL2 distribution reaches nothing, the toggle Docker Desktop calls WSL integration
A WSL shell is told the engine is on the Windows side, that docker.exe reaches it through interop, and that it reads every path it is handed as a Windows one.
- DD75 · 5d1463aA bind mount spelled the Windows way is sent to a Linux daemon that resolves only its own paths
The generated override respells every Windows bind source the distribution's way, read from compose config as JSON, and refuses the ones no drive letter can reach.
- DD74 · 586c384No buildx is placed, so a Dockerfile with a cache mount or a heredoc cannot build on a clean install
Buildx is a fifth pinned artefact placed beside Compose, so docker build is BuildKit and a cache mount stops failing on the mount option.
- DD73 · fd5312cdocker compose is not a command on a clean install, and the do compose verb shells into exactly that
Compose is a fourth pinned artefact placed under this install's own cli-plugins, and the bundled call sets DOCKER_CONFIG so docker compose is a subcommand.
- DD72 · 7a218a1The session label key is the last name in the rename set that is state on a machine rather than spelling in a build
The key written is freewilly.session and both spellings are read, so a machine mid-migration keeps every session a previous build labelled.
- DD71 · 0e3c719README and the site still name the product and the distribution as they were before the rename
README, the site copy, llms.txt and the DD23 spec filename name FreeWilly, and the distribution is freewilly with no second name anywhere.
- DD70 · 4f0da4dA list that changed under a refresh and an engine that is still starting both arrive with no transition
The three lists are reconciled by row id rather than replaced, so a row that joined fades in and one that left fades out while nothing else moves.
- DD69 · 0f34d4fThe window carries none of the ocean the mark swims in, and its lowest strip is margin and then the frame
The window's foot is the mark's own water, in the site's three blues and geometry, drifting only while the engine runs and held at phase zero for a capture.
- DD68 · 64c1c4fThe console-width guard asserts on every rendered line, including the evidence lines DD52 must not wrap
The remedy's wrap width is the renderer's only length rule and is named as a constant, and a second test states out loud that an evidence line may exceed it.
- DD67 · c41788aNo popup this product draws has ever been photographed, and the one path that could is not reachable
--show-menuholds the tray's own context menu open with no icon and no window, so the screen copy photographs a popup at last: 237x168, and byte-identical across two runs. - DD65 · 6b36b50The budget file still says the agent surface does not exist, so the ratio it was built to prove is unrecorded
The same task through read context, doctor, logs and verify is 4 calls and 774 tokens against the baseline's 6 and 11711, recorded as task-for-task rather than payload-for-payload.
- DD64 · 30ec7d3The test that gates every cost claim can go red for a reason that is not cost
The fake speaks HTTP/1.1, so the close .NET's retry was racing is gone (design §DD64 superseded: it said the fake could not tell a counted body from an EOF-delimited one, and the response says which).
- DD59 · 030613cThe site is served from a base path containing the old name, so every published route moves at once
The base path, the canonical URL and the repository URL are freewilly everywhere, written once in vite.config.ts, and the site build is green again.
- DD66 · d465734Every container row threw while being measured, so the list has drawn nothing since the pages were split
The two styles a row template is BasedOn moved into the page that uses them, where a StaticResource is legal, and a check refuses a DynamicResource on BasedOn.
- DD63 · 4575583No verb on this surface creates anything, so the session stamp has nothing to stamp
do compose up is the first verb that creates: the services come from the CLI, a generated override outside the project stamps each one, and the answer names the undo.
- DD62 · 3e59085The page for the agent's operator names only the interruption, so the surface reads as a saving in keystrokes
Eight rows pair what plain docker costs an agent with the verb that replaces it, and every cost, ceiling and shipped badge is generated from agent-budget.json and the verb registry.
- DD61 · 1b693f0A screen copy of the window carries a blurred image of what is behind it, because the Fluent backdrop transmits it
Capture-Window.ps1 asks DWM for the window's system backdrop and refuses to copy one that has it, with no flag to waive it - so the leak is a refusal rather than a printed warning.
- DD60 · 19bb532Fifteen lines of governed prose name DockerDesk, and the guard denies the edit that would change them
The non-goal, five ledger entries and the skill directory moved through the verb that owns each; what still reads dockerdesk in the prose files is quoting a surface DD59 and DD71 have yet to change.
- DD58 · 0097fe6The agent surface is invoked as dockerdesk and quoted that way in allowlist patterns matched literally
The invocation is freewilly everywhere it is quoted, and a guard derives the allowlist pattern from the executable's own name so the two cannot drift into matching nothing.
- DD57 · dc68aedThe installer identifies the product by an AppId with the old name inside it, so a rename installs a second one
An old install is upgraded in place: the AppId never changes, the labels around it do, and the Run value the old name owned is deleted rather than left starting a missing exe.
- DD56 · 1387375The rival probe carries a rule that exists only because dockerdesk contains docker, and freewilly does not
Both names this project has owned are skipped by name before the rival table is consulted, so an adopted install is never told to uninstall the engine it is running.
- DD55 · e6982dbThe engine owns a WSL distribution and an app root both named dockerdesk, and a rename orphans them
An install made before the rename is adopted where it stands: both names resolve from what is on disk and registered, and nothing moves - distro is the BasePath WSL holds.
- DD54 · 523cdf2Every project, namespace and assembly in the tree spells DockerDesk, so a rename starts at the solution file
The build spells FreeWilly throughout - projects, namespaces, assembly, icon and the harness - while the app root and the WSL distribution stay behind for DD55 to migrate.
- DD53 · 084860dThe test guest cannot be returned to a clean snapshot, so the machine a check was measured on is gone once it drifts
vm.ps1 gained a revert action that names the snapshot and what reverting discards, and refuses without -Yes rather than prompting - so a state a row was measured on is reachable again.
- DD52 · 4e07b2bThe rival row prints its evidence as one 254-character line, and wrapping it on spaces splits a path
The rival row names the products and puts each path, pipe and distribution on its own line, whole - so the evidence can be copied into a shell or grepped, and the JSON report carries it as a list.
- DD51 · 915e22eA claim on the site that has gone false is invisible until somebody reads the page against the product
node --test asserts the site's own claims: the generated roadmap figures, the route pair and heads, the twin per route with the CTA dropped, the 1200x630 card, and no scrollIntoView.
- DD50 · 66106ebThe site is whatever was last committed to docs, so a broken page is public with no gate between
A workflow_dispatch-only Pages job whose single gate is npm run build (typecheck, the prerender route and head checks), publishing site/dist to the same URL.
- DD49 · 8a70c9aThe og image points at an svg, so every share of this link renders a card with no image at all
A 1200x630 og.png rasterised from public/og.svg on every build, with the mark and the tagline, and og:image points at it on every route.
- DD48 · df7bba8Everything is one scroll, so a pillar gets a paragraph and there is no page to link at
Five depth pages from one record each, whose route, title and description are read off the same record, so a pillar cannot ship half-declared or untitled.
- DD47 · 46a5ad6A visitor weighing this against Docker Desktop, Rancher, Podman or a plain WSL2 daemon infers it from prose
A comparison matrix grouped by the law each row comes from, with a column per rival for what it genuinely wins, and a machine-readable table twin.
- DD46 · 3ab0deaNobody configuring an agent can find the read and do split, or the one allowlist line that pays for it
A page for the agent's operator: the read/do split, the one allowlist line Bash(freewilly read:*), the DD32 plugin, and the refusals, marked as the designed Block-G surface.
- DD45 · 2d32771Nothing on the site says who the operator is, so the positioning is still a GUI with no licence fee
A section per design law in the order an agent meets them, and the two-actor split, replace the GUI-with-no-licence-fee positioning the pre-DD23 page shipped under.
- DD44 · 3898e93The hero asserts what the tool is, so what it costs an agent per call is nowhere on the page
The hero autoplays the five-call agent session with its per-call token targets, and the transcript scrolls its own list rather than the window.
- DD43 · 2c46793The status rows are typed into the page, and five of them are already wrong about what has shipped
The status page and the landing summary are generated from roadkeep export --json on every build, so a shipped task moves its own row and no progress figure is typed.
- DD42 · 8225c7fA Claude-first product answers an agent only in hydrated markup, in the first thing anybody reads
Every route emits a Markdown twin converted from the same render, a manifest lists the routes and their twin sizes, and llms.txt moves into the build with the twin convention.
- DD41 · 766aa3dA static host needs a file per route, and nothing checks that a route has a page or a page a title
Each route prerenders to its own file with a replace-or-throw head, and the route map and metadata table assert against each other in both directions at import time.
- DD40 · ba66593The site is one hand-written page, dark-only, with every claim typed into the markup that displays it
The landing page renders from a Vite React Tailwind workspace: copy in one content module the sections iterate, and the theme follows the OS.
- DD39 · 1d95059The window opens at one fixed size on the primary screen every time and forgets which list was being read
The window opens where it was left, at the size it was left, on the tab that was being read - and a rectangle that no longer lands on a monitor is refused rather than opened off-screen.
- DD38 · d465734No window can be drawn without a running daemon holding the containers the picture is meant to show
The window takes a seam rather than the client, and a SampleMachine stands in at it, so --fixture draws every page from a machine that is the same everywhere.
- DD37 · 8accec1No heading sorts and no list filters, so finding one container among forty is done with the scrollbar
Every heading is a button that sorts and carries a glyph, and one box per list narrows over the rows in hand; both are held by the page so a refresh cannot drop them.
- DD36 · 5f4d5c0A row says its state in plain text and carries six always-visible captions, so a list of forty reads as a form
State is a tinted chip that tells a clean exit from a kill and carries its own evidence, and the six captions per row are Logs, one verb and an overflow that is always drawn.
- DD35 · 61c92d9Three lists, the engine, the logs and the shell share one window class, so a fourth list grows the same two files
The shell keeps the engine line, the terms and a nav strip; each list is a page built on first visit and kept alive, so a fourth adds a file rather than growing two.
- DD34 · a531573The two windows redeclare their chrome and one red is spelled four times, so a meaning has four definitions
The danger red, the engine's three colours and the font stack live in one Palette of bytes, and markup reaches them with x:Static as claude-tray's Brand does.
- DD33 · 7c6fc45A client with no shell cannot reach this surface at all, the CLI being the only head there is
The CLI-first inversion is recorded as a decision with a price: a spec that survives shipping, a cap of six tools in the budget file, and a test that no head arrives uncapped.
- DD32 · 406bfb6An agent meeting this machine has no way to know the surface exists, so it reaches for docker
A skill naming the verbs, an allowlist line and a generated brief ship with the install, which proposes all three and writes none of them into your configuration.
- DD31 · 8fa2fccEvery session re-derives the whole machine, because nothing states what moved since the last one
read changes --since is a delta over the daemon's own bounded history, collapsed per object, and it refuses rather than skipping when the cursor reaches past it.
- DD30 · 1a57c92Nothing proves a service is reachable: a running container with a bound port can answer nothing
A connect from Windows, an optional GET and the health check's own output turn running into answering, and --wait makes the same call the readiness primitive.
- DD29 · 6148394What an agent created is indistinguishable from what the user created, so cleanup is prune or nothing
A confirm token computed over the printed list scopes cleanup to one session's label, so a stale plan refuses instead of deleting what arrived in between.
- DD28 · 7270645Port is already allocated does not say what holds the port, and the answer is not in Docker at all
A refusal carries the Windows fact that explains it: read ports names the pid holding a port, and cannot connect became three causes with three remedies.
- DD27 · 1efb391A container log is read unbounded, so a restart loop is paid for eight times in identical traces
read logs takes a cursor, a level, a dedup that turned 634 estimated tokens into 95, a ceiling it never cuts in silence, and an --out that turns the read into a Grep.
- DD26 · d809754Why a container is not answering is a join across five commands, and inspect is read for four fields
One read doctor joins the five commands and returns a verdict and a remedy per row over the preflight's own model, including the port fact only Windows can answer.
- DD25 · eb01779Learning what this machine is running costs five commands, and it repeats in full every session
One read context answers the whole machine at 102 estimated tokens against 5718 for the three list reads it replaces, and an OOM row closes the canonical question in the first call.
- DD24 · 37136c6Reading a container and deleting a volume are one allowlist decision, so every read costs an approval
read and do are separate argv namespaces so one allowlist line grants every read, and a test drives each read verb and requires every request it made to be a GET.
- DD23 · 2f7b7c1Nothing measures what a Docker task costs an agent, so a cheaper surface is an unfalsifiable claim
A benchmark measures the canonical task at 11711 estimated tokens over six calls, and agent-budget.json is the ceiling it reads, so a response that grew fails a build.
- DD22 · 27f0024Verifying a window copies the screen, so a capture twice photographed private content that was in front of it
A --capture-window verb renders the window off-screen so nothing else can be in the frame, and the screen copy kept for popups refuses when anything overlaps it.
- DD21 · 978c6d0The tray icon was not in the visible notification area while the tray was running, so the glance costs a click
The icon registers and Windows files it into the overflow, so the install says where it went and how to keep it in sight, and nothing here promotes itself.
- DD20 · 7c25369A leftover docker context sends the CLI to another pipe, so docker reports no daemon while this engine is answering
A preflight row reads the active context and names both endpoints, so a CLI pointing elsewhere is visible, and it changes no setting of the user's.
- DD19 · 152c71dInside a VM the preflight calls virtualization enabled and clears an install that WSL2 then refuses to start
The row reads whether this machine is itself a guest, and abstains inside one instead of reading HypervisorPresent as proof it can host a hypervisor.
- DD18 · a0fa4f6On a Windows 11 that never had WSL, the preflight spends 15 seconds saying it could not read the WSL2 row
The row asks
wsl --statusfirst, so a bare machine is named in milliseconds with the remedy that applies, and--versionis only reached once something says WSL is there. - DD16 · 2503921The preflight reports no rival engine on a machine where Docker Desktop is installed per-user and
dockeris on PATHThe row now asks what owns the docker command, resolving it off PATH the way a shell does and reading the registered WSL distributions, and it names every signal it found.
- DD15 · d63cdaaEvery release is built on one developer's machine, so the first download finds what that machine hid
Two Windows workflows: a check that builds, tests and starts the published .exe on every push, and a tag that drafts a release carrying SHA-256 sums for a person to publish.
- DD14 · 612a887There is nothing to hand a user: no executable, no installer, and no uninstall that respects their data
One FreeWilly.exe with every verb behind an argument, an Inno Setup installer that is per-user with no administrator prompt, and an uninstall that asks before deleting the distribution.
- DD17 · f54a7fbNo clean Windows is reachable from here, so a red preflight row and a real install have never been executed
vm.ps1runs the product preflight inside a Windows 11 guest through vmrun and reads back what it said. - DD13 · 593c64bNothing states the terms: a visitor cannot tell this is free at any headcount, and no NOTICE covers the bundled engine
Apache-2.0 stated in the README's first paragraph, in LICENSE and in the window's About, with a NOTICE generated from the install manifest so a new download cannot ship unattributed.
- DD12 · 97f33cdVolumes are invisible: a user cannot see which exist, what they cost on disk, or which containers mount them
Volumes with their sizes and what mounts them, the compose project read off the name, and a deletion that names all of it first because a volume is the one thing here that does not come back.
- DD11 · 5aab4f6Tens of gigabytes of layers accumulate and nothing says which images are dangling or still in use
Images sorted by size, each row saying whether a container holds it or it is dangling, with per-image removal and a dangling-only prune that names the space before the click and after it.
- DD10 · 8f84033There is no way into a running container: no shell, so anything the log does not say is unreachable
The terminal the user already has, running docker exec: the image is asked which shell it has first, so one with neither says so on the row instead of opening a window that closes.
- DD9 · a77f719A container that exits immediately shows a state and nothing about the cause, so the user leaves for a terminal
A window per container: frame headers stripped, stderr told from stdout, follow on by default, copy-all to the clipboard, and a buffer capped at 5,000 lines that drops from the front.
- DD8 · ceb01f1The list is read-only: a container cannot be started, stopped, restarted or removed from it
Start, stop, restart and remove on every row: the click lands in a pending state, the event stream is what ends it, and a refusal shows the daemon's own sentence where the button is.
- DD7 · 71f944eThere is no window: a user cannot see which containers exist, their state, or the ports they publish
A WPF window lists containers with their ports as links, refreshed by the event stream, and says something designed when it is empty.
- DD6 · d026f93Answering is Docker up? costs opening a window, and starting the engine costs a command line
A tray icon carries the engine state as a shape, and its menu starts the engine in a process that outlives the tray or stops it.
- DD5 · 036713fA container started in a terminal never appears in the window, and the list is only as fresh as the last refresh
EngineEvents reads /events as the daemon writes it and re-opens the stream after every break, so nothing here polls.
- DD4 · a5e2628Nothing in this project can ask the engine anything: no client for the Docker API over the Windows named pipe
DockerApi speaks the Engine API over the named pipe with no NuGet dependency: ping, version, containers, and a stream for endpoints that never end.
- DD3 · 7f1c666Nothing starts or stops the engine, and a UI that reports running before the socket answers is lying
freewilly --runstarts the distro and daemon, serves \\.\pipe\docker_engine, and reports Running only once the engine answers. - DD2 · ce0063aThere is no unattended way to put a container engine on Windows without installing Docker Desktop
freewilly --provisionputs upstream Moby 29.7.2 in an owned WSL2 distro and docker.exe where an installer can add it to PATH. - DD1 · e330beeA Windows user cannot tell why Docker will not run here: WSL2 missing, virtualization off, or a rival engine
freewilly --preflightreports the Windows build, virtualization, the WSL2 kernel and any rival engine one row each with the action that fixes it, and exits 1 while a blocker is not green.