feat(rows): say it once, and only when you know it - #28
Merged
Conversation
Four reports, one failure mode: the block under line 1 saying more than it knows. Row 3 restated row 2. notice_flash_line carried the pin's key and never compared against it, so a lone notice flashed its own long form under its own short one. It now starts at record two: row 3 is for what the pin is not carrying. A 7d projection needs a day of this window's evidence. Minutes after a rollover the learned walk projected last week onto a 2%-spent pool — measured: red, dry in 95h, x cells from slot 14, heading ~100%, all of it from samples predating the reset (the trailing-24h blend literally describes the previous window). SEVEN_DAY_YOUNG_SECS gates the walk, the linear at-risk pace and the dry-cell fallback; one gate, so every surface that reads them goes quiet together. Badges and the 85% red still speak: the guard mutes pace, never facts. Pace waits for a fraction of its window. 900s is 5% of 5h and 0.15% of a week — an hour into a fresh window, 2% used rendered 3.0x red. The gate is length/20 now: 5h unchanged, 7d ~8.4h, the fraction seven_day_elapsed already called the noise floor. The fold counts windows, not cells: ...▯(✕12). The 34-cell grid spans 170h against a 168h period, so the old ...▯5h✕10 disagreed with the budget's 12✕5h left on the same row. One instant, one arithmetic. The budget voice drops its sigil. ! and + mark a notice that interrupts; the week's resting reading does not, and a leading - on a dim line read as a bullet in a list of one. 423 tests (was 418). Co-Authored-By: Claude Fable 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.
Four live reports against v0.31.0, one failure mode: the block under line 1 saying more than it knows.
Row 3 was restating row 2
notice_flash_lineassignedpin_keyfrom the first record and never compared anything to it — dead code under a comment promising it "never echoes the pin's own sentence". With one notice collected, the loop's first iteration is the pin, so session start printed:Row 3 now starts at record two: it carries the highest-ranked notice the pin is not already saying, or nothing. A calm start is two rows.
A 7d projection needs a day of this window's evidence
Right after a weekly rollover, the learned walk projected the previous window's weekday profile onto a pool 2% spent. Measured on a synthetic 2.4h-old window (21 days history, 30%/day,
recent_24h40):seven_day_forecastweek_dry_slotseven_day_pace 8red 95yellow 5 1-1green -1 0Every input for those verdicts predates the reset — including the L1
recent_24hblend, which describes a trailing day lying on the far side of it.New
SEVEN_DAY_YOUNG_SECS=86400gates three sites:_profile_walk(exits like a cold start, which silences the forecast notices, the×cells, the budgetheading, the accuracy logger,--checkandweekin one edit),seven_day_pace(falls to the percent-threshold branch), andweek_dry_slot's linear fallback. Badges still report real percentages and a genuinely spent young window still goes red on its own 85%+: the guard mutes pace, never facts. The 5h window is untouched.Pace waits for a fraction of its window
ADVISOR_PACE_MIN_ELAPSED=900is 5% of a 5h window and 0.15% of a week — an hour into a fresh 7d window, 2% of the pool over 0.6% of the time rendered3.0✕in red.strip_tailnow gates onlength / 20: 5h stays exactly 900s, 7d becomes ~8.4h, the fractionseven_day_elapsedhas always called the noise floor. The constant stays for the 5h cap projection, which is what its comment always said it was for.The fold token counts windows, not cells
The 34-cell grid spans 170h against a 168h period, so
...▯5h✕10(cells the fold hid) sat on the same row as12✕5h left(windows to the reset) and the reader had to arbitrate. The token is now...▯(✕12)— parenthesized, no redundant unit, counting the 5h windows remaining to the true reset from the same instant the budget line prices. Dry tails read...×(✕12):×the cell,✕the operator, one column apart and never the same mark.build_ledger_striptakes the period length instead of a unit label.The budget voice drops its sigil
!and+mark a notice that interrupts. The week's resting reading interrupts nothing, and a leading-on a dim line reads as a bullet — which is what made rows 2+3 look like a two-item list. The pin reads12✕5h left · 5.8%/win;--checkandweekstill label the long form with the wordbudget.Verification
-S errorclean(✕12)matches the budget's12✕5h lefton the same render, two rows not three🤖 Generated with Claude Code