feat: a surface you can ask, and the rollback the vision named - #23
Merged
Conversation
Two things a caller could not do. `<command> --help` answered `--help has no value`, and every missing argument surfaced singly, so learning `plan-operation` cost seven invocations. One table is now read by both `--help` and the parser, bound by a test that removes each flag it calls required and requires the refusal to name it. And `rollback` existed in the vision and in no code. Installing a new version leaves the old tree in place and moves only the exposed command, so the bytes were always there and nothing pointed back at them. `software --prefix` reads the program directory; `rollback --to <version> --prefix` points the command at one of the versions in it. Both need no network, which is why they are commands you type rather than the three-phase exchange install and update must be. The version is named, never inferred: there is no record of which was previous, only what is on disk, and these strings do not order reliably. Rendered from NDDev-it-com/setup-systems@9180548. Claude-Session: https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA
On Windows a rooted path is not an absolute path: Path::new("/tmp") answers
is_absolute() == false, because absolute means a drive letter or a UNC prefix.
The new argv table test built its complete invocations from /tmp, so launch --
whose --prefix is checked for absoluteness at parse time -- refused the fixture
before it reached its assertion.
The product code is right. The fixture proved the right thing on two systems and
nothing at all on the third.
Rendered from NDDev-it-com/setup-systems@d233a90.
Claude-Session: https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA
…date Present::exposed answered by resolving bin/<command>. Windows reserves symlink creation for privileged processes, so expose writes a hard link or a copy there and canonicalizing one returns its own path -- the answer was always "no version is exposed" on a prefix where one plainly was. Not cosmetic: that reading is what separates an install from an update, so every software_update on Windows refused as an update of nothing while the version it would have updated sat right there. The version is recorded beside the command and read back now. A dangling link still exposes nothing, whatever the record says. Rendered from NDDev-it-com/setup-systems@fa233ff. Claude-Session: https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rendered from
NDDev-it-com/setup-systems@9180548. Two things a caller could not do.You could not ask what a command takes
The flag parser read every
--flagas taking a value, so the one question a caller could ask was met with a complaint about its grammar. And every missing argument surfaced singly, so learningplan-operationcost seven invocations — measured by a peer building the consumer half who already knew the shape.Now
--helpanswers, and one refusal names everything missing at once.One table read by both
--helpand the parser, bound by a test that removes each flag it calls required and requires the refusal to name it. Observed red in both directions.And
rollbackexisted in the vision and in no codegrep -rn rollback crates/returned zero. Installing a new version leaves the old tree in place and moves only the exposed command, so the bytes were always there and nothing pointed back at them.Both need no network, which is why they are commands you type rather than the three-phase exchange install and update must be. The version is named, never inferred — there is no record of which was previous, only what is on disk, and cursor's
2026.08.11-e8db854sorts by string, not by release.Exercised against a real vendor install of opencode.
pi answered the wrong absence
Its
softwareisSomewith an npm delivery, sosoftware --prefixsaid no version of pi is installed — an invitation to install one this build cannot. Three states, not two; pi is the middle one and now says so.Gate
347 tests,
clippy -D warnings, conformance 23/23 on all seven, three-OS matrix.https://claude.ai/code/session_012UZkeU7yQhyZqKAaDaQEjA