Conversation
`Shift+F` draws the selected bead where a root is drawn, what the forest draws beneath that bead anywhere else, and nothing else. It is for finishing one bead, so what it takes away is everything a reader does not have to do in order to close the one they are on. Everything beneath the focused bead is already in the tree it is drawn in, because a tree's children are the nesting restricted to what its root reached. So the mode is a change to what the layout walks rather than to what was collected, and the bead keeps the place it carries everywhere else — which is what lets a fold set on it survive the key both ways. The mode stands on the bead named at the keystroke rather than on the selection, so walking about under it moves nothing. Pressing again puts the forest back with the selection on the bead it was rooted at. The bead leaving the collection is the one thing that ends the mode on its own.
Rooting the forest at one bead leaves every other root and every other project undrawn, and *degrade, never disappear* says they may not simply go. Each project keeps a collapsed line standing for the roots it is holding back, under its own line, opening onto them as the line over the trees the filter holds back already does. That line stands over open work with seats on it, which the filter's line never does: the filter keeps a tree with an agent on it, so its own line can say `no live agent` and be right. This one cannot. It carries what the roots behind it add up to, and says how many seats and how many beads want looking at, so a reader is never told by omission that there is nobody back there. It also names the key that brings them back, being the line a reader is looking at when they want them back. A row with no room for that hint gives it up whole, because `F for th…` names no key while the counts are the part of the row that is nowhere else on the screen.
Every root but the focused bead's is behind a line while the forest is rooted at one bead, so that line is what is shut over the beads in those roots. It joins the chain above them, which is the one answer both the ancestry a lost selection falls back to and the opening that reaches a line are read from. A search offers what it can be taken to, so it walks the focused tree from the focused bead and the other roots from theirs: a bead above the focused one is drawn nowhere, and counting it would step the reader onto it and report nothing found. Putting the forest back opens whatever has been shut over the bead it was rooted at, asked of the forest the reader is coming back to rather than the one they are leaving, so a bead already drawn there is left as it is. The press says the screen changed, which is what asks for the row to be drawn again. A collection that no longer holds the focused bead lets the place it stood on go. Held, it would take the next press of the key and spend it putting back a forest that was already back, and the bead coming back in a later collection would turn the mode on again with nobody asking. A bead the tracker moved is followed to where it moved to, by the bead rather than by the way down that used to reach it.
Rooting the forest at one bead draws that bead where a root is drawn and stops there, so the beads above it are in no drawing. They go behind the line that holds every other root back, under the same project, and that line counts them: a seat on one of them is a seat nothing else on the screen says is there, and *no live agent is hidden* leaves no room for it. The focused bead stays at the root of the forest rather than being drawn a second time behind the line, so opening the line never redraws the tree the reader is standing in. What is behind it is the root they are working under and every branch off it, resting shut as a held-back root does. The line joins the chain above those beads, so a search counts them and going to one opens the line on the way. Every copy of that bead is left out of the root behind the line, so the mode draws it once, at the copy the key was pressed on. Where the forest is rooted is therefore asked before the trees are: for a bead its own tree reaches twice, the first way down to it, and to everything only that copy reaches, is a way down to a row nothing draws. A search that answered with one of those would count a bead it could not then land on. A search steps through the beads in the order the rows come out, and the drawing is asked for that order rather than told it a second time: the focused bead's tree from that bead, then the roots behind the line in the order the line opens onto them. A reader standing on the line and stepping to the next match steps into what is behind it, because a shut line is asked what it holds rather than read past, and this one holds roots. With every fold open, the beads that order yields are the beads the rows draw, in the order they draw them, which is what holds the two together as the mode moves the rows about. A root the tracker files under another root is followed the same way as a bead moved further down. Its place carries no steps, so the name to look it up by is the tree's own, and the mode goes on standing on the bead instead of ending on a collection that still holds it. The line counts the beads behind it rather than the beads in the roots they came from, because the focused bead and everything beneath it are on the screen already. A run behind the line stands for the members left in it and what is beneath them, counted by putting the bead drawn elsewhere among the beads the way down came through: that is the set the walk already stops at, so a way back into it is cut here exactly as the drawing cuts it as a loop. It says `3 roots held back`. The root the reader is standing in is behind it as well now, so *other* is not true of what is back there, and every root it counts has a row of its own nowhere else. A row inside the line is a bead row and says what is beneath it in the work, the focused branch included where it is beneath that bead. That is what a shut fold has counted everywhere since two copies of a bead were made not to add up, and `shut_over` now carries this instance of it.
The bead the forest is rooted at was drawn where a root is drawn and kept the id it has as a child, so the one bead the reader pressed the key for read as a suffix while every other root, its own parent among them, read whole. A column of shortened ids is read by putting the drawn root in front of each one, and the root this branch came out of is behind the line. So the drawing rooted at one bead shortens against that bead: it reads whole where a root would, and the beads under it read as its children. What is behind the line is a drawing of its own and shortens against its own root, so the root the focused branch came out of and the beads still in it read exactly as they do with the mode off. A bead with a way down on either side of the line has a row on either side, and each row reads against the root of the drawing it sits in: `abbreviate` cuts nothing off an id the drawn root is not a prefix of, so the two spellings differ and both put a reader on the one bead. The line's anchor looks past a root that holds no bead. A root whose tracker refused leads its project whatever the filter says and holds none, so a reader standing on the shut line and stepping to the next match walked past everything the line holds and came round to the top of the screen.
A root whose tracker refuses on a later read keeps a row saying it would not read, and the mode was following the row rather than the bead. So it stayed on with nothing to root the forest at: every root came back on the screen while the mode was still set, and the next press was spent putting back a forest that was already back rather than rooting it at the bead the reader was on. A bead the collection no longer holds ends the mode, and a root that will not read is such a bead however much of its header is still drawn.
Merged
GraemeF
added a commit
that referenced
this pull request
Sep 12, 2026
`main` has carried four squashes since `v0.7.0`, and nobody running `bdi` can reach any of them until a version is cut. One of the four is breaking, which this repository has called a minor bump at every version below 1.0, `v0.4.0` and `v0.7.0` included. The notes say what a reader has to act on and leave out what they cannot. The badge chain is the only item that changes what an existing config draws, so it has the Upgrading section to itself. The row that has gone is quoted rather than described, because a reader who has that string on their screen searches a frozen page for the string. The collapsed line's wording and the gap between that row's cells are not mentioned at all: the line did not exist at `v0.7.0`, so nobody arriving from there ever saw what was corrected. There is no Maintenance section, because the range holds no dependency, CI, test or docs commit. The README gains a row for `F`, which shipped in #76 without one. Until now the table's only case pair was `/` `n` `N`, one row for one meaning, so a reader who had met `f` as *focus the selected bead's pane* would read `F` as a variant of it. The two rows name the noun that separates them, a pane and the forest, and `the whole forest` is the program's own key hint for that row. `docs/bdi-frame.svg` was read against the new id rule rather than assumed current, and it is unchanged by it. `atlas-1` is the front of `atlas-10` as a string, but the rule measures a bead only against the row above it and those two are drawn at the same depth. What would restyle that picture is a child whose id is its parent's with a dot and more on the end.
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.
Shift+Fdraws the selected bead where a root is drawn, with everything the forest draws beneath that bead anywhere else, and nothing else. It is for finishing one bead, so what it takes away is everything a reader does not have to do in order to close the one they are on. Pressing it again puts the forest back, with the selection on the bead it was rooted at.The mode is a change to what the layout walks rather than to what is collected, and the focused bead keeps the place it carries everywhere else. That is what lets a fold set on it survive the key in both directions.
Everything the mode stops drawing goes behind one collapsed line per project, under that project's own line, opening onto it as the line over the trees the filter holds back already does: every other root, every other project's, and the focused bead's own root for the part of it that is left. That last one is drawn without the focused bead, which stays at the root of the forest, so opening the line never redraws the tree the reader is standing in. It is a group like the filter's, so the fold, the selection handle and the tail behaviour come with it.
The part worth a reviewer's attention is what that line says. It stands over open work with seats on it, which the filter's line never does: the filter keeps a tree with an agent on it, so
no live agentis true on its own line and cannot be true on this one. This line counts the beads behind it rather than the beads in the roots they came from, because the focused bead and everything beneath it are on the screen, and it says how many seats and how many beads want looking at. It also names the key that brings the roots back, and a row with no room for that hint gives the hint up whole rather than cutting it:F for th…names no key, while the counts are the part of the line a reader can read nowhere else on the screen.3 roots held backis the line's own count, and it is roots rather than beads. A root whose tracker refused holds no beads, and0 beadsdrawn over a root that is really there and really unreadable is the reading degrade, never disappear exists to prevent.The mode is held to that promise at its edges. A search counts a bead only where it can take the reader to it, and every bead the mode stops drawing is now behind a line the search opens on the way. Putting the forest back opens whatever has been shut over the focused bead in the meantime, a bead the tracker has reparented is followed to where it moved to, and a bead that leaves the collection ends the mode, because nothing is left to root the forest at. A root whose tracker stops reading has left it too, however much of its own row is still drawn. One count is left as it is: a root row behind the line says what is beneath it in the work, the focused bead's branch included, which is what every bead row in
bdisays and what a shut fold has always counted.Closes bdi-2bb.56.1, bdi-2bb.56.2, bdi-eouw and bdi-5mod.