feat(rows): five slots, and a window you are in is not one you have left - #31
Merged
Conversation
The 5h strip is five cells again — but the future in them is empty, not judged. v0.33.0 was right that `5h ▮▯×××` was unreadable and wrong about which half to cut. The `×` was the problem: a linear projection dressed as ink, saying a third time what the badge (`5h[38%@23:00]`) and the notice (`5h caps ~14:20`) already say with better gates and an exact time. The hollow cells were never the problem — they were the axis. Ending the strip at `▮` took the ruler away with the forecast and left a bar that grew an hour at a time and answered "how long have I got" with nothing. So: five slots, always, one per hour, no dry cell in any of them. `5h ▃▃▮▯▯` is two whole hours after this one, read off the row without arithmetic. Fixed width is the other half of it — the row holds its shape for the life of the window instead of reflowing every hour. `▮` rides the real clock rather than the grid. five_period_start rounds to five minutes so week_scan's cache key holds still across renders (a resets_at that jitters by a second would re-run a whole-log jq pass every render), and that rounding offsets every hour boundary by up to 2½ minutes — invisible in a bar height, wrong exactly where this strip is read. With the marker at 4 - floor(left / 1h) the hollow count is the whole hours remaining to the second: at the 119-minute mark, three hours and one minute left drew as two, and now does not. `N✕5h left` no longer counts the window you are standing in. The row draws it as `▮` and line 1 prices it as `5h[38%]`, so counting it again made `▮ + 11` read as twelve. "Left" now means still to come: (7d left - 5h left), divided into windows, rounding up because a stub at the end of the week is still a window you can spend. The arithmetic has a property the old one did not — both clocks tick down together, so the difference does not move: the count holds steady for the life of a window and steps down by exactly one at each rollover. It was a reading that drifted; it is a countdown now. windows_ahead is that definition in one place, and the folded `...▯(✕N)` prints what the budget line computed instead of re-deriving it off a 34-cell grid that spans 170h against a 168h period. `last window` now means the week ends inside the one you are in. It used to fire at one window ahead too, to skip a `/win` clause that would just restate the headroom; calling two windows the last one to save a redundant clause is the wrong trade. make install. The one-liner installed from GitHub and there was no way to install the tree in front of you, so a working copy got there by hand — and a stale hand-copy is how v0.28.0 once faked a red "7d dry" at 2%. `make install` runs the same install.sh with STATUSLINE_SRC set: one installer, two entrypoints, no drift. It refuses a statusline.sh that does not parse — a broken statusline is not a worse render, it is no statusline. Three things the installer should have been doing all along, now on both paths: it keeps the flags already on statusLine.command (rewriting the whole command silently reverted --order and --debug on every update), it writes through a temp file and renames (the script runs on every render; a half-written one is a broken prompt), and it installs the usage-insight skill beside it (STATUSLINE_SKILL=0 opts out). make status reports installed-vs-tree drift, settings command and skill state; make check is shellcheck + bats, and CI now runs it. 435 tests (was 427). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
The 5h strip is five cells again — but the future in them is empty, not
judged. v0.33.0 was right that
5h ▮▯×××was unreadable and wrong aboutwhich half to cut. The
×was the problem: a linear projection dressed asink, saying a third time what the badge (
5h[38%@23:00]) and the notice(
5h caps ~14:20) already say with better gates and an exact time. Thehollow cells were never the problem — they were the axis. Ending the strip
at
▮took the ruler away with the forecast, and left a bar that grew anhour at a time and answered "how long have I got" with nothing.
So: five slots, always, one per hour, no dry cell in any of them.
5h ▃▃▮▯▯is two whole hours after this one, read off the row withoutarithmetic and without a second glance at the clock. Fixed width is the
other half of it — the row holds its shape for the life of the window
instead of reflowing every hour, which is the difference between an axis
and a bar that grows at you. An empty cell is a fact; a
×is a guess, andonly one of those belongs in a ledger.
▮now rides the real clock rather than the grid.five_period_startrounds to five minutes so
week_scan's cache key holds still across renders— a
resets_atthat jitters by a second would re-run a whole-logjqpassevery render — and that rounding offsets every hour boundary by up to 2½
minutes. Invisible in a bar height; wrong exactly where this strip is read.
With the marker at
4 - floor(left / 1h)the hollow count is the whole hoursremaining to the second: at the 119-minute mark, three hours and one minute
left drew as two, and now does not.
N✕5h leftno longer counts the window you are standing in. The rowdraws it as
▮and line 1 prices it as5h[38%], so counting it againmade
▮ + 11read as twelve, and the budget sentence beside it agreed withthe miscount. "Left" now means still to come: what remains after this
window closes,
(7d left - 5h left), divided into windows — a stub at theend of the week is still a window you can spend, so that rounds up.
The arithmetic has a property the old one did not: both clocks tick down
together, so the difference does not move. The count holds steady for the
life of a window and steps down by exactly one at each rollover. It was a
reading that drifted; it is a countdown now.
windows_aheadis thatdefinition in one place, and the folded
...▯(✕N)prints what the budgetline computed rather than re-deriving it off a 34-cell grid that spans 170h
against a 168h period.
last windownow means the week ends inside the one you are in — nothingahead of it, nothing to divide the surplus across. It used to fire at one
window ahead too, to skip a
/winclause that would just restate theheadroom; calling two windows the last one to save a redundant clause is the
wrong trade. At one ahead the line keeps the grammar:
1✕5h left · 25.0%/win.make install. The one-liner installed from GitHub and there was noway to install the tree in front of you, so a working copy got there by
hand — and a stale hand-copy is how v0.28.0 once faked a red "7d dry" at
2%.
make installruns the sameinstall.shwithSTATUSLINE_SRCset:one installer, two entrypoints, no drift. It also refuses a
statusline.shthat does not parse — a broken statusline is not a worserender, it is no statusline.
Three things the installer should have been doing all along, now on both
paths: it keeps the flags already on
statusLine.command(rewritingthe whole command silently reverted
--orderand--debugon everyupdate), it writes through a temp file and renames (the script runs on
every render; a half-written one is a broken prompt), and it installs the
usage-insightskill beside it (STATUSLINE_SKILL=0opts out).make statusreports installed-vs-tree drift, settings command and skillstate;
make checkis shellcheck + bats;make install-checkgates theinstall on both.
make helplists the rest.435 tests (was 427).