feat(ui): move between regions, name rows by identity, sort from the column - #45
Closed
Brad (bmethod) wants to merge 4 commits into
Closed
feat(ui): move between regions, name rows by identity, sort from the column#45Brad (bmethod) wants to merge 4 commits into
Brad (bmethod) wants to merge 4 commits into
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 11:49
fcb2b70 to
7db7eba
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 11:50
7f8fe9b to
5230100
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 11:59
7db7eba to
f893416
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 12:00
5230100 to
2d6f703
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 12:13
f893416 to
934f2a5
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 12:14
2d6f703 to
d5f7680
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 12:57
934f2a5 to
e2c2202
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 12:57
d5f7680 to
ce5e285
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 13:07
e2c2202 to
bca13d6
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 13:07
ce5e285 to
8e1d16d
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 13:16
bca13d6 to
ba723b4
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 13:16
8e1d16d to
733aa80
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 13:36
ba723b4 to
2ebb732
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 13:38
733aa80 to
cfa83ba
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 13:48
2ebb732 to
9171e6c
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 13:50
cfa83ba to
835d202
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 13:57
9171e6c to
4ec9ac7
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 13:57
835d202 to
86fd912
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 14:06
4ec9ac7 to
5ae1c12
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 14:06
86fd912 to
9037aea
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 14:13
5ae1c12 to
75d56ff
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 14:13
9037aea to
d7dc29d
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 14:26
75d56ff to
67ad575
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 14:27
d7dc29d to
685e3e8
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
2 times, most recently
from
September 10, 2026 14:37
6f718b9 to
1db148c
Compare
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 14:37
685e3e8 to
6dd2206
Compare
Brad (bmethod)
force-pushed
the
issue-24-phase-7
branch
from
September 10, 2026 14:50
1db148c to
ade7d51
Compare
A screen's lists are regions of one flat selection. Left and right move between them, up and down move inside the one in focus, and a region with no rows is skipped because a reader cannot stand on a row that is not there. The focused region's title takes the accent colour and its rule stops being dim, so nobody has to press a key to find out where they are. Home has four regions and its tile row is one of them, which makes the tiles the same rule as everything else rather than a second one. Storage has three. A line that expands under another now carries a rule down its left edge as well as its indent. The indent alone reads as a new top-level line at a glance, and it is the rule that says whose line this is. One helper draws the concern detail, the capability diagnostic, the Storage drill-down and the agent detail's open sections. One marker says a row has more inside it: `▸` closed, `▾` open, the count beside the name. It is drawn whether or not anything is open, so a reader can see what is worth opening without opening it. The agent detail's sections, the Settings capability rows and unreadable sources, the Home concerns and the Storage filesystems all draw through it. `Busiest agents` re-sorts every second and a reader's target moves under the cursor. A key now holds the row order while every reading in those rows keeps updating. Holding the order is not freezing the data: a dashboard that lies while it is read would be worse than one that moves. A lane that ended drops out, a lane that climbed does not push in, the section says it is holding where its count sits, and leaving the screen releases it. Claude-Session: https://claude.ai/code/session_01B4rKWUEy6WF5MRxtBEwFdB
A name holds the name. Nothing is appended to make one unique any more: an id that appears on some rows and not others reads as arbitrary, so the process id is a column of its own on every row, beside the pane address phase 7 added. Two lanes with one name are told apart by scanning a column. A narrowing list sheds its optional columns in one order until the name has its floor back: the trend first, then the pane address, and the id last, because the id is the one that is on every row. A sorted column says so in its own heading. The arrow leads on a numeric column, so the heading still ends where the digits under it end, and follows the word on a text column. Each screen sorts the headings it draws, which is why Home's `Busiest agents` cycles its own four rather than the Agents column set: a marker has to sit on a heading the reader can see. An unread source says what it costs instead of which interface was missing. The readings it feeds are blank rather than zero, and the row names where those readings are. Blank and zero are different answers, and a dashboard that shows zero for a number it could not read is lying. The interface and the system's own words stay in the drill-down, which is where a reader goes to fix it. The collapsed group of unreadable sources now sits at the depth of the rows it summarises rather than two columns to their left. `Recent changes` gives its time, kind and subject their own columns, so three rows scan as three rows and a cut subject ends in its mark instead of stopping mid-word. Claude-Session: https://claude.ai/code/session_01B4rKWUEy6WF5MRxtBEwFdB
An arrow moves within the focused region, along that region's own axis: left and right along the horizontal tile row, up and down down a vertical list, and left and right along Timeline's time cursor, which is what that region contains. Tab and Shift+Tab move between regions. That is one rule rather than two. The earlier draft gave left and right the job of leaving a region, which could not be universal: those arrows already move the time cursor inside Timeline's own region, and a horizontal row of tiles was left navigating vertically. Tab no longer changes screens anywhere. Every screen has a number key and those are printed across the header at all times, so the discoverable route to a screen is not the one being repurposed, and a key that moved regions on two screens and changed screens on the rest would be the second rule this removes. The footer and the help panel say so, and the help panel now names the number keys as the way to a screen. Claude-Session: https://claude.ai/code/session_01B4rKWUEy6WF5MRxtBEwFdB
Taking the disambiguator out of lane names moved the problem rather than removing it: Home's busiest agents and the Builds lanes had no id column to put it in, so six rows read `method` with nothing beside them. Ambiguous but labelled became ambiguous and silent. Both lists now carry the same dim id column the Agents list has, and `LaneBuilds` carries the process leading its lane so the Builds row has one to draw. The agent detail already named its process in the identity block, which is where one lane at a time belongs; a test now holds it there. Home shares its width with the column beside it, so when the name cannot keep its floor the state column goes instead. A blocked or running lane already shows in its numbers; a name that identifies nothing shows in nothing. The guard is the property that failed rather than the column that fixes it: six lanes named `method`, every reading identical, rendered on Home, Agents and Builds at two widths, and no two drawn rows may read the same. A future narrowing that drops the column fails it whatever the column is called. Claude-Session: https://claude.ai/code/session_01B4rKWUEy6WF5MRxtBEwFdB
Brad (bmethod)
force-pushed
the
issue-24-design
branch
from
September 10, 2026 14:50
6dd2206 to
ecf30e9
Compare
Collaborator
Author
|
Closing in favour of a fresh pull request on the same branch, for the same reason as #44. This one was opened against The branch and its work are unchanged. |
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.
All of #38: the second design pass. Stacked on #44, and the last of the #24 work.
The owner ran the app after the first design pass and asked for a second. Every item below was re-checked at 180x50 against a tree holding all seven phases, after a 200-second run so the charts held real history — anything already fixed was struck rather than filed.
Move between regions, not just within one
Home holds four regions and the keyboard reached them as one flat list. Arrows move within the focused region along its own axis;
TabandShift+Tabmove between regions. Left and right run along the horizontal tile row, up and down through a list, and Timeline keeps left and right for its time cursor.The first draft had left and right leaving the region, which reads as one rule and is not: it makes moving along a horizontal row of tiles a matter of pressing down, and Timeline could not follow it at all because those keys already mean the cursor there. The agent building it flagged that rather than picking the nicer-feeling option, and the rule it exposed is the one shipped.
Tab no longer changes screens anywhere. The alternative was Tab moving regions on the two screens that have them and changing screens on the other five, which is the second rule this change exists to remove. The number keys
1-7remain and are printed across the header at all times; the help panel now states them, since that route had been implied by Tab. A test pins that Tab leaves a single-region screen alone.Regions exist on Home and Storage, the only screens with more than one selectable list.
A child line looks like a child
A vertical rule at the left of every continuation line, keeping the indent — drawn as a box's own left border, so it runs the full height of its content without anyone counting lines. Four sites through one helper: the concern detail, the capability diagnostic, the Storage drill-down, the agent detail sections.
One pattern for one idea
▸collapsed,▾open, the count beside the name. Searching the UI sources for those glyphs finds them inwidgets.tsxalone; five sites draw through one component, and a row draws its marker whether or not anything is open — so a reader can see what is worth pressing Enter on without pressing it.Hold the order while reading
Busiest agentsre-sorted every second and the reader's target moved under the cursor.oholds the row order while the values keep updating: a dashboard that freezes its data lies while you read it. A lane that ended drops out; a lane that climbed does not push in. The hold releases on leaving the screen.orather thanp, because pinning a sample and holding an order are different things.An id is a column, not part of a name
The same list read
.hclaude claude ken-1295besidemethod PID 3405beside.2claude claude dotfiles PID 2557288— correct behaviour, since the id appeared only where names collided, and unreadable presentation, because to a reader it looks arbitrary.The name column holds the name; a dim id column holds the process id for every row.
distinguishis gone from the lane model, so no name is appended to.Every list that draws lane names carries the column — Home, Agents and Builds. The builds lane model had no process id at all and carries one now. The agent detail already names its process in its identity line, which is where that belongs for a screen showing one lane, and a test holds it there.
The guard pins the property rather than the column: six lanes named
methodwith every reading identical, rendered at two widths, and no two drawn rows may read the same. A future narrowing that drops the column fails it whatever the column is called.Where Home's width cannot keep the name readable, the state column goes instead. A blocked or running lane already shows in its numbers; a name that identifies nothing shows in nothing.
Sort from the column
The sorted heading carries
↑or↓, chosen in one place. On a numeric column the arrow leads, so the heading still ends where its digits end — putting it after the label broke the alignment an earlier phase established.Builds and Resources do not sort, each for a reason rather than by omission: Builds' rows are not lanes and have no comparator, and Resources is a tree that sorting would flatten.
Say what unread means
57 sources vsys cannot readnamed a mechanism and no consequence. It now names what a reader loses — every wait reading is blank rather than zero, and which screens those are. The interface and the system's own words stay in the drill-down, which is where someone goes to fix it rather than to understand what they are missing.Separate what is separate
Recent changestruncated mid-sentence with no mark. It has three columns now, and its subject cuts through the same helper every other cell uses.Proof
399 tests, 0 fail.
This line read 385 while the branch sat under #43 and #44. The stack was replayed onto the merged phase-5, which carries four tests the review rounds added there, and 385 was itself one too high — a duplicate entered during the test-file split and overstated every figure from that commit until it was found. #43 records why only the count could see it.
Plants throughout, and three of them caught a test rather than the code:
One decision came from a capture rather than a test. The Agents list sheds optional columns as it narrows, ordered trend, id, pane — identity last, which sounded right. The 180-column frame showed an empty pane column surviving while every process id was dropped. The order is now trend, pane, id: identity that always exists outranks identity that usually does not. Four widths are pinned.
Closes #38. Part of #24.
https://claude.ai/code/session_01B4rKWUEy6WF5MRxtBEwFdB