The overview block does not read stdout.columns, so it renders at a fixed width regardless of the terminal. The widest line is 95 characters and 9 of 64 lines exceed 80, so on an 80-column terminal (SSH, a split pane) the models and repos tables wrap and each wrapped fragment reads as a garbage line - at the closing moment of hyp init.
The daily and tools tables already fit. Only models and repos overflow.
Not urgent: the numbers are correct, and this only bites below 96 columns.
Where the width goes
The widest line is a models row, 95 characters:
| part |
width |
note |
| indent |
2 |
|
| provider + gap |
11 |
|
| model + gap |
27 |
sized by claude-haiku-4-5-20251001 (25) |
| input + gap |
11 |
|
| cached + gap |
15 |
1,169,377,480 |
| output + gap |
11 |
|
| bar |
18 |
BAR_WIDTH |
The trap: the bar cannot shrink on its own
Shrinking BAR_WIDTH saves 3 columns, not 14. A column is never narrower than its own header, and the bar's header is by input+output - 15 characters. Below 15 cells, the header sets the floor and further shrinking buys nothing.
An earlier version of this issue claimed the bar alone nearly closed the gap. It does not.
Fix
Two levers, both needed:
- Model column (-9).
MAX_MODEL_WIDTH = 30 never fires, so claude-haiku-4-5-20251001 sets the column width for every row. Ellipsize at 16 on a narrow terminal.
- Bar and its header (-12). Shrink
BAR_WIDTH to ~6 and shorten the header to share. The caption line beneath the table already spells out what the bar charts, so the header is not carrying that meaning alone.
Together: 95 to 74. Measured, not estimated - mockup below.
Plumbing: read stdout.columns in both callers (default 100 when absent, so piped output stays stable and tests stay deterministic), thread it into renderOverview, and give renderTable a width budget.
Every token count stays exact. Only the two columns carrying no information give ground.
Before, at 80 columns
provider model input cached output by
input+output
anthropic claude-fable-5 1,428,442 1,169,377,480 8,432,056 ▒▒▒
███████████████
anthropic claude-opus-4-8 1,634,958 741,775,344 7,437,378 ▒▒▒
██████████████
openai gpt-5.5 894,318 13,570,048 89,598 ▒▒█
After
provider model input cached output share
anthropic claude-fable-5 1,428,442 1,169,377,480 8,432,056 ▒█████
anthropic claude-opus-4-8 1,634,958 741,775,344 7,437,378 ▒█████
openai gpt-5.5 894,318 13,570,048 89,598 ▒█
anthropic claude-sonnet-5 3,978 45,466,960 363,797 ▒█
anthropic claude-opus-5 19,373 40,202,516 90,898 ▒█
anthropic claude-haiku-4-… 8,688 9,569,514 58,976 ▒█
Rejected: dropping cached on narrow terminals saves 15, but cache is 98.9% of tokens, so hiding it hides where the volume goes. Also rejected: compact units (1.2B). Not needed once the two levers above are pulled, and they trade away precision in the block's primary content.
Measurement note
Raised in review of #407 as 101 columns. I first re-measured it as 132 - wrong, because awk counts bytes and the bar glyphs are 3 bytes each. The character width is 95.
The overview block does not read
stdout.columns, so it renders at a fixed width regardless of the terminal. The widest line is 95 characters and 9 of 64 lines exceed 80, so on an 80-column terminal (SSH, a split pane) the models and repos tables wrap and each wrapped fragment reads as a garbage line - at the closing moment ofhyp init.The daily and tools tables already fit. Only models and repos overflow.
Not urgent: the numbers are correct, and this only bites below 96 columns.
Where the width goes
The widest line is a models row, 95 characters:
claude-haiku-4-5-20251001(25)1,169,377,480BAR_WIDTHThe trap: the bar cannot shrink on its own
Shrinking
BAR_WIDTHsaves 3 columns, not 14. A column is never narrower than its own header, and the bar's header isby input+output- 15 characters. Below 15 cells, the header sets the floor and further shrinking buys nothing.An earlier version of this issue claimed the bar alone nearly closed the gap. It does not.
Fix
Two levers, both needed:
MAX_MODEL_WIDTH = 30never fires, soclaude-haiku-4-5-20251001sets the column width for every row. Ellipsize at 16 on a narrow terminal.BAR_WIDTHto ~6 and shorten the header toshare. The caption line beneath the table already spells out what the bar charts, so the header is not carrying that meaning alone.Together: 95 to 74. Measured, not estimated - mockup below.
Plumbing: read
stdout.columnsin both callers (default 100 when absent, so piped output stays stable and tests stay deterministic), thread it intorenderOverview, and giverenderTablea width budget.Every token count stays exact. Only the two columns carrying no information give ground.
Before, at 80 columns
After
Rejected: dropping
cachedon narrow terminals saves 15, but cache is 98.9% of tokens, so hiding it hides where the volume goes. Also rejected: compact units (1.2B). Not needed once the two levers above are pulled, and they trade away precision in the block's primary content.Measurement note
Raised in review of #407 as 101 columns. I first re-measured it as 132 - wrong, because
awkcounts bytes and the bar glyphs are 3 bytes each. The character width is 95.