Skip to content
Changelog

What FreeWilly shipped.

Every entry in docs/CHANGELOG.md, read at 7dad90f and dated by the commit that wrote it.

Atom feed
  1. A 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.

    DD284 · 704a856
  2. A 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.

    DD282 · e7a49b1
  3. No winget manifest exists, so winget install cannot find FreeWilly

    build\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.

    DD281 · d2192d9
  4. the 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.

    DD280 · 6db267a
  5. the 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.

    DD279 · b5313fb
  6. six 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.

    DD278 · 9324afd
  7. the 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.

    DD277 · 0b55204
  8. a 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.

    DD276 · e174fcc
  9. the 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.

    DD275 · e59e232
  10. a 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.

    DD274 · f4a2f35
  11. a 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.

    DD273 · 39de7aa
  12. the 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.

    DD272 · e245431
  13. a 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.

    DD271 · c24e851
  14. a 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.

    DD270 · 18c8bbb
  15. a 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.

    DD269 · 7bef7a5
  16. the 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.

    DD267 · 7bef7a5
  17. the 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.

    DD266 · e207bd7
  18. an 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.

    DD265 · c8d91ef
  19. nothing 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.

    DD264 · e086173
  20. the 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.

    DD263 · 01d459e
  21. docker 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.

    DD262 · e773053
  22. every 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.

    DD261 · d0eb4f7
  23. the 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.

    DD260 · ff953b2
  24. docker 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.

    DD259 · 65fd9da
  25. a 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 up and the read watching it are one call again; an id address still ends.

    DD258 · 3caee25
  26. a 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.

    DD257 · f36be98
  27. a 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.

    DD256 · 8857c73
  28. a 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.Read against a framed fake daemon, so the exit code a session branches on is asserted where it is decided, beside the payload.

    DD255 · e8d90ed
  29. two help rows run past the terminal's width, so a folded summary lands in the column a verb name goes in

    read context and do reclaim now break their summaries the way read logs does, and the width is asserted over every help row rather than only the rows that declare a break.

    DD254 · eaeaf71
  30. a follow re-splits its whole buffer per chunk, so --follow --out spends its deadline splitting rather than reading

    LogTally carries the split across chunks and counts the payload as it grows, so a follow costs what it reads and --follow --out spends its deadline reading.

    DD253 · 53cef06
  31. the --request refusal states the opposite of the rule: a bare path is told it begins with a slash when it does not

    Every --request refusal 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.

    DD252 · 634c9f4
  32. read logs cannot follow, so watching a run live drops the session back to the docker CLI

    read logs --follow watches a run to a line (--until), a deadline (--timeout) or the token budget, so following a seed no longer sends the session to docker compose logs -f.

    DD251 · 587fd59
  33. read verify --request cannot assert a path is gone: a 404 is only ever a failure

    read verify --request now 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.

    DD250 · 3ffc15e
  34. the 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.

    DD249 · a1928f9
  35. the 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.

    DD248 · c86e108
  36. the 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.

    DD247 · d56b2a9
  37. the 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.

    DD246 · 04867bf
  38. the 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.

    DD245 · 84b3d21
  39. a 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.

    DD244 · cffc967
  40. diskpart 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.

    DD243 · 3fbae86
  41. there 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.

    DD242 · 8a9c602
  42. the 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.

    DD241 · e8100ca
  43. --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.

    DD240 · 12e43bc
  44. the 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.

    DD239 · f3273b9
  45. diskpart 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.

    DD238 · fa066ff
  46. Windows 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.

    DD237 · ccc370f
  47. an 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.

    DD236 · c44a042
  48. the 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.

    DD235 · b8fc17f
  49. the 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.

    DD234 · 84d1cbd
  50. the 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.

    DD233 · 18686f2
  51. the 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.

    DD232 · a6d83aa
  52. the 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.

    DD231 · 13f3b4e
  53. the 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.

    DD230 · 8303d89
  54. three 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.

    DD229 · 9dd97ab
  55. a 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.

    DD228 · 010e831
  56. Check 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.

    DD227 · fa403ef
  57. the 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.

    DD226 · dcdb78e
  58. the 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.

    DD225 · 42be8a5
  59. the 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.

    DD224 · 0011925
  60. prepared 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.

    DD223 · acf55c1
  61. the 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.

    DD222 · a405a4d
  62. the 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.

    DD221 · 4df80ca
  63. the 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.

    DD220 · c9748d4
  64. the 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.

    DD219 · 24efb64
  65. the 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.

    DD218 · 8dec752
  66. the 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.

    DD217 · 83bd43a
  67. every 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.

    DD216 · 4188c7f
  68. the 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.

    DD215 · 1e5333a
  69. every 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.

    DD214 · 755ea37
  70. a 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.

    DD213 · dc26711
  71. the 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.

    DD212 · 25c2c0f
  72. the 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.

    DD211 · 423c1bf
  73. the 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.

    DD210 · 1e1d3ae
  74. unregistering 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.

    DD209 · e01a8b7
  75. stopping 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.

    DD208 · ecd6fd3
  76. the 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.

    DD207 · e35f64a
  77. the 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.

    DD206 · 390a814
  78. a 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.

    DD205 · c6b210f
  79. the 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.

    DD204 · c231c46
  80. no 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.

    DD203 · 7dcbf3d
  81. fourteen 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.

    DD202 · 2beb170
  82. the 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.

    DD201 · 583c934
  83. the 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.

    DD200 · 7447353
  84. nothing 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.

    DD199 · 13c47cb
  85. the 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.

    DD198 · 674c43d
  86. no 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.

    DD197 · b659d63
  87. the 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.

    DD196 · 7fe4a6d
  88. A 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.

    DD194 · 3ae27ea
  89. A 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.

    DD193 · 6afee13
  90. stdout 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.

    DD192 · d9bbfc4
  91. nothing 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.

    DD191 · d10dac5
  92. a 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.

    DD190 · 7efc5ac
  93. the 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.

    DD189 · ffa268a
  94. the 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.

    DD188 · 695ddf8
  95. the 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.

    DD187 · 5865543
  96. the 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.

    DD185 · f2e6617
  97. Every 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.

    DD186 · 63c2673
  98. the 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.

    DD184 · 0794e60
  99. The 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.

    DD183 · 41f9802
  100. A 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.

    DD182 · 5052e22
  101. The 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.

    DD181 · 65c9b11
  102. A 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.

    DD180 · b834c2b
  103. The 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.

    DD179 · 695c5e2
  104. the 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.

    DD178 · f8aef09
  105. the 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.

    DD177 · e43a760
  106. About 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.

    DD176 · 2b89045
  107. The 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.

    DD175 · 52f9422
  108. The 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.

    DD174 · 746c864
  109. A 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.

    DD173 · 05f762d
  110. The 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.

    DD172 · 1e67740
  111. The 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.

    DD171 · 46135a7
  112. A 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.

    DD170 · 3afc58d
  113. Whether 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.

    DD169 · 47c8aca
  114. An 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.

    DD168 · 3bbbca1
  115. Nothing 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.

    DD167 · 2b02e16
  116. A 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.

    DD166 · d209a81
  117. The 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.

    DD165 · de537a3
  118. The 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.

    DD164 · 5911617
  119. The 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.

    DD163 · 4f3ae49
  120. A 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.

    DD162 · 50e91ab
  121. the 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.

    DD161 · 27d2980
  122. the 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.

    DD160 · 7448390
  123. the 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.

    DD159 · cae324f
  124. the 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.

    DD158 · e4a7d4a
  125. the 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.

    DD157 · 42edbe1
  126. the 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.

    DD156 · d5932ef
  127. the 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.

    DD155 · 5462977
  128. an 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.

    DD154 · 3cc932e
  129. the 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.

    DD153 · 4354740
  130. the 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.

    DD152 · be179b1
  131. the 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.

    DD151 · c78bc05
  132. check.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.

    DD150 · a229e75
  133. The 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.

    DD149 · 11050c4
  134. do 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.

    DD148 · a9e0869
  135. A 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.

    DD147 · 82c5082
  136. A 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.

    DD146 · 5896bb1
  137. A 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.

    DD145 · 483c7f4
  138. do 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.

    DD143 · 41625b3
  139. Every 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.

    DD142 · d0d8616
  140. The 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.

    DD141 · e53913b
  141. The 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.

    DD144 · bfa7d35
  142. Clicking 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.

    DD140 · 53e8055
  143. One 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.

    DD139 · 71a3dbf
  144. A 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.

    DD138 · 02ae6fc
  145. Why 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.

    DD137 · 1f478c6
  146. Nothing 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.

    DD136 · 1801917
  147. The 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.

    DD135 · e5c64dc
  148. A 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.

    DD134 · a844b6a
  149. The 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.

    DD133 · 404f8cb
  150. Turning 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.

    DD132 · a0a8895
  151. A 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.

    DD131 · 5e37ee1
  152. Setup 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.

    DD130 · 7106e69
  153. A 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.

    DD129 · 924a6fe
  154. Quitting 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.

    DD128 · 3524004
  155. A 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.

    DD127 · 56c2a76
  156. The 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.

    DD126 · 8f704bb
  157. A 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.

    DD125 · 374275b
  158. A 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.

    DD124 · 4076db0
  159. The 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.

    DD123 · 9602413
  160. A 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.

    DD122 · 1125a9b
  161. Uninstalling 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.

    DD121 · 29a9a1c
  162. A 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.

    DD120 · 7b38d82
  163. The 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.

    DD119 · 8de9537
  164. Nothing 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.

    DD118 · 956e91e
  165. ROADKEEP_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.

    DD116 · d1f00b9
  166. Committed 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.

    DD115 · 646e121
  167. Restarting 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.

    DD114 · 43b0500
  168. The fixture machine's compose project declares no dependencies, so the ordering DD107 added is never exercised by it

    The sample project declares depends_on the way compose spells it, so a fixture run orders its services rather than taking the fallback, and the capture is unchanged.

    DD113 · 48212a8
  169. The 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.

    DD112 · d01fcb3
  170. One row type describes a container and a project header, and nothing says which members a header answers

    ContainerRow.Members names 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.

    DD111 · 46930a4
  171. The 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.

    DD110 · aae3fcd
  172. A 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.csproj cannot leave MSBuild unable to choose, and build.cmd clears one before the publish rather than after it.

    DD109 · c323ca4
  173. A 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.

    DD108 · fab74eb
  174. A 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.

    DD107 · a5f4fe7
  175. Every 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.

    DD106 · 1cff64a
  176. Nothing 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.

    DD105 · 13e06a0
  177. The 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.

    DD104 · 8deae92
  178. Three 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.

    DD103 · 455819b
  179. The installer script is compiled only by the release workflow, so a syntax error in it is found by the release

    check.yml compiles build/installer.iss on every push and asserts the installer came out, so Inno refuses a bad construct on the commit rather than on the tag.

    DD102 · 9484b28
  180. A bind source that looks like a distribution path and is not there stays unchecked, and it is the expensive failure

    read doctor asks 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.

    DD101 · 7add576
  181. The 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.

    DD100 · 0731091
  182. The tray icon is always drawn at 16 pixels, so the per-monitor-DPI manifest buys a shell-scaled icon anyway

    StateIcon.Icon asks Windows for the notification area's size, and TrayScale redraws when a dock or the scale slider moves it, so the tray stays sharp without a restart.

    DD99 · 43b0c4a
  183. Nothing stops a read verb constructing a machine read inside itself and re-widening the token gate

    A guard over AgentSurface.cs derived from MachineReads' own seams fails the build on a verb that constructs one, and WindowsMachineFacts left the file entirely.

    DD98 · f979461
  184. Two 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.

    DD97 · 9824375
  185. A 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.

    DD96 · 8d589cf
  186. DD75 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.

    DD95 · d7f2f5f
  187. The 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).

    DD94 · 1d8de6a
  188. A 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.

    DD93 · 925e8d2
  189. The 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.

    DD92 · 4fafe81
  190. The 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.

    DD91 · ad4f3ff
  191. Reader-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.

    DD90 · 840863d
  192. The 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.

    DD89 · 259a828
  193. npm 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.

    DD88 · b903ba4
  194. The 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.

    DD87 · 925660a
  195. The 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.

    DD86 · 054eb5f
  196. The 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).

    DD85 · 3184301
  197. The 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).

    DD84 · 0f14463
  198. Nothing 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.

    DD83 · d536869
  199. Visible 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.

    DD82 · 3996d82
  200. A 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.

    DD81 · c439264
  201. Launching 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.

    DD80 · 436b21b
  202. SessionLabel.For reads as the one place a label is stamped and nothing in the product stamps through it

    ComposeUp renders every pair SessionLabel.For returns, so a second label is a change to one method, and a test drives off For rather than the key the old assertion named.

    DD79 · c42cf68
  203. The 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%.

    DD78 · 87cf631
  204. docker 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.

    DD76 · 9c2fd44
  205. A 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.

    DD75 · 5d1463a
  206. No 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.

    DD74 · 586c384
  207. docker 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.

    DD73 · fd5312c
  208. The 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.

    DD72 · 7a218a1
  209. README 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.

    DD71 · 0e3c719
  210. A 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.

    DD70 · 4f0da4d
  211. The 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.

    DD69 · 0f34d4f
  212. The 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.

    DD68 · 64c1c4f
  213. No popup this product draws has ever been photographed, and the one path that could is not reachable

    --show-menu holds 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.

    DD67 · c41788a
  214. The 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.

    DD65 · 6b36b50
  215. The 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).

    DD64 · 30ec7d3
  216. The 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.

    DD59 · 030613c
  217. Every 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.

    DD66 · d465734
  218. No 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.

    DD63 · 4575583
  219. The 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.

    DD62 · 3e59085
  220. A 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.

    DD61 · 1b693f0
  221. Fifteen 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.

    DD60 · 19bb532
  222. The 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.

    DD58 · 0097fe6
  223. The 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.

    DD57 · dc68aed
  224. The 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.

    DD56 · 1387375
  225. The 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.

    DD55 · e6982db
  226. Every 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.

    DD54 · 523cdf2
  227. The 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.

    DD53 · 084860d
  228. The 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.

    DD52 · 4e07b2b
  229. A 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.

    DD51 · 915e22e
  230. The 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.

    DD50 · 66106eb
  231. The 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.

    DD49 · 8a70c9a
  232. Everything 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.

    DD48 · df7bba8
  233. A 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.

    DD47 · 46a5ad6
  234. Nobody 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.

    DD46 · 3ab0dea
  235. Nothing 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.

    DD45 · 2d32771
  236. The 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.

    DD44 · 3898e93
  237. The 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.

    DD43 · 2c46793
  238. A 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.

    DD42 · 8225c7f
  239. A 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.

    DD41 · 766aa3d
  240. The 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.

    DD40 · ba66593
  241. The 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.

    DD39 · 1d95059
  242. No 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.

    DD38 · d465734
  243. No 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.

    DD37 · 8accec1
  244. A 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.

    DD36 · 5f4d5c0
  245. Three 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.

    DD35 · 61c92d9
  246. The 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.

    DD34 · a531573
  247. A 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.

    DD33 · 7c6fc45
  248. An 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.

    DD32 · 406bfb6
  249. Every 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.

    DD31 · 8fa2fcc
  250. Nothing 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.

    DD30 · 1a57c92
  251. What 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.

    DD29 · 6148394
  252. Port 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.

    DD28 · 7270645
  253. A 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.

    DD27 · 1efb391
  254. Why 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.

    DD26 · d809754
  255. Learning 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.

    DD25 · eb01779
  256. Reading 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.

    DD24 · 37136c6
  257. Nothing 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.

    DD23 · 2f7b7c1
  258. Verifying 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.

    DD22 · 27f0024
  259. The 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.

    DD21 · 978c6d0
  260. A 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.

    DD20 · 7c25369
  261. Inside 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.

    DD19 · 152c71d
  262. On a Windows 11 that never had WSL, the preflight spends 15 seconds saying it could not read the WSL2 row

    The row asks wsl --status first, so a bare machine is named in milliseconds with the remedy that applies, and --version is only reached once something says WSL is there.

    DD18 · a0fa4f6
  263. The preflight reports no rival engine on a machine where Docker Desktop is installed per-user and docker is on PATH

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

    DD16 · 2503921
  264. Every 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.

    DD15 · d63cdaa
  265. There 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.

    DD14 · 612a887
  266. No clean Windows is reachable from here, so a red preflight row and a real install have never been executed

    vm.ps1 runs the product preflight inside a Windows 11 guest through vmrun and reads back what it said.

    DD17 · f54a7fb
  267. Nothing 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.

    DD13 · 593c64b
  268. Volumes 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.

    DD12 · 97f33cd
  269. Tens 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.

    DD11 · 5aab4f6
  270. There 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.

    DD10 · 8f84033
  271. A 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.

    DD9 · a77f719
  272. The 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.

    DD8 · ceb01f1
  273. There 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.

    DD7 · 71f944e
  274. Answering 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.

    DD6 · d026f93
  275. A 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.

    DD5 · 036713f
  276. Nothing 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.

    DD4 · a5e2628
  277. Nothing starts or stops the engine, and a UI that reports running before the socket answers is lying

    freewilly --run starts the distro and daemon, serves \\.\pipe\docker_engine, and reports Running only once the engine answers.

    DD3 · 7f1c666
  278. There is no unattended way to put a container engine on Windows without installing Docker Desktop

    freewilly --provision puts upstream Moby 29.7.2 in an owned WSL2 distro and docker.exe where an installer can add it to PATH.

    DD2 · ce0063a
  279. A Windows user cannot tell why Docker will not run here: WSL2 missing, virtualization off, or a rival engine

    freewilly --preflight reports 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.

    DD1 · e330bee

← FreeWilly's product page