Skip to content

feat(rows): say it once, and only when you know it - #28

Merged
lroolle merged 1 commit into
mainfrom
feat/rows-say-it-once
Aug 24, 2026
Merged

feat(rows): say it once, and only when you know it#28
lroolle merged 1 commit into
mainfrom
feat/rows-say-it-once

Conversation

@lroolle

@lroolle lroolle commented Aug 24, 2026

Copy link
Copy Markdown
Member

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_line assigned pin_key from 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:

- 12✕5h left · 5.8%/win   <ledgers>
- budget ~12✕5h left · even 5.8%/win · heading ~85%

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_24h 40):

gate seven_day_forecast week_dry_slot seven_day_pace 8
off red 95 slot 14 yellow 5 1
on (silent) -1 green -1 0

Every input for those verdicts predates the reset — including the L1 recent_24h blend, which describes a trailing day lying on the far side of it.

New SEVEN_DAY_YOUNG_SECS=86400 gates three sites: _profile_walk (exits like a cold start, which silences the forecast notices, the × cells, the budget heading, the accuracy logger, --check and week in one edit), seven_day_pace (falls to the percent-threshold branch), and week_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=900 is 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 rendered 3.0✕ in red. strip_tail now gates on length / 20: 5h stays exactly 900s, 7d becomes ~8.4h, the fraction seven_day_elapsed has 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 as 12✕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_strip takes 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 reads 12✕5h left · 5.8%/win; --check and week still label the long form with the word budget.

Verification

  • 423 bats tests (was 418), shellcheck -S error clean
  • both repo fixtures rendered: fold (✕12) matches the budget's 12✕5h left on the same render, two rows not three
  • synthetic rollover fixture rendered hermetically: silent at 2.4h old, projections return at 25h

🤖 Generated with Claude Code

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>
@lroolle
lroolle merged commit bbf91f3 into main Aug 24, 2026
1 check passed
@lroolle
lroolle deleted the feat/rows-say-it-once branch August 24, 2026 05:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant