Changes touching this path
- the spelling a newcomer and an agent both try first stops printing the whole wall: loot help <verb> ignored its argument and rendered the 157-line overview, so the discoverable form - the one that exists because git help <verb> does - was the one that did not work, while the working form had to be guessed. It is a routing fix and not a feature, because the per-verb printer already existed and reads FlagSpec::flags so a verb's help cannot drift from what its gate accepts; what was missing is that the help arm never looked at what followed it. help_for now returns the same name, spec and tail triple the table's own help gate builds, so there is exactly one printer and this verb reaches it rather than a copy - and help_sub splits into help_sub_at returning the index, because the routing needs what follows the token and two scans walking argv by their own rules is the class #1612 records. The pin is byte-identity rather than shape: loot help X and loot X --help produce the same bytes for all 69 dispatched verbs and every completed subcommand leaf, and the list is derived from loot completions bash, itself built from COMMANDS, so a verb added later cannot quietly get one spelling and not the other. Four breakages were each proved red before the tests were trusted, including reverting the arm to the unconditional wall and leaving the verb in the tail. A typo now gets the nearest verb and a stranger gets none, which required writing the first edit distance in this repo rather than reusing one - the brief said not to write a second and there was no first, loot-first hardcodes a five-name try list and loot's own unknown-command path prints the entire USAGE, which is the same damage this ticket fixes and is left to its own ticket rather than smuggled in. Two counts this change had to touch were both wrong in the same direction: a comment saying all 66 verb lines was caught by the census that reads USAGE, which holds 105, and the table is now 67 rows rather than the 66 recorded three lands ago, since a verb_of row landed in between (#1520)
8e103df8 · dbf3dbe6…
Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.