fix(notice): one projection, one floor - #29
Merged
Conversation
Row 3's gate measured the wrong thing. It required the flash to beat the pin by NOTICE_FLASH_MIN_GAIN columns — right in v0.31.0, when row 3 restated row 2 and the only question was whether truncation left anything extra. Since v0.32.0 the flash is a DIFFERENT notice, so that subtraction compared two unrelated sentences: at 30 columns `! 5h caps ~23:54` (16) beside `! 7d caps ~Tue 07:22` (20) is a gain of 4, and the second window lost its row for no reason a reader could name. The rule is now an absolute floor on the compacted flash itself (NOTICE_FLASH_MIN_CHARS=16, in notice_flash_worth_row): did truncation leave a sentence, or a stub? A ten-minute-old 5h window drew ▮▯×××. One big prompt front-loads burn — 7% in ten minutes — and five_dry_cell read that as a rate and walled off the window, while on the same render the pace suffix hid itself and the "5h caps" notice stayed silent. Three surfaces, one linear projection, only the loudest one speaking. window_evidence_floor is that rule in one place — 5% of a window's own length — and now backs the 5h dry cells, the pace suffix and the caps notice alike. ADVISOR_PACE_MIN_ELAPSED is retired into it: a constant beside a formula is drift waiting to happen. week_dry_slot keeps its own day-long floor on purpose — a pace reading summarises what happened, a multi-day projection needs a day. 426 tests (was 423). 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.
Patch on v0.32.0, from two live observations. Both are the same shape: a surface projecting from evidence it does not have, or judging a row by a measure that no longer means anything.
Row 3's gate was measuring the wrong thing
It required the flash to beat the pin by
NOTICE_FLASH_MIN_GAINcolumns. That was the right question in v0.31.0, when row 3 restated row 2 and the only issue was whether truncation had left anything extra to say. Since #28 the flash is a different notice, so the subtraction compares two unrelated sentences — and drops a short one whenever the pin happens to be long.Measured at
COLUMNS=30on a 5h-85% / 7d-75% fixture:The second window lost its row for no reason a reader could name. The gate is now an absolute floor on the compacted flash itself —
NOTICE_FLASH_MIN_CHARS=16in a named, testablenotice_flash_worth_row: did truncation leave a sentence, or a stub?7d dry ~Wedsays nothing actionable;7d dry ~Wed 19:50still carries the number.Extracting the predicate was deliberate: enumerating the leading fact of every long form
notice_collectcan emit shows the shortest one reachable as a flash isbudget last window(18) — the 9-charfb cappedis rank 100 and therefore always the pin. So the floor cannot bite through the CLI today; it is a guard rail. An inline gate with no reachable failing case is one no test can pin down, which is exactly how it silently rotted.A ten-minute-old 5h window drew
▮▯×××One big prompt front-loads burn — 7% in ten minutes — and
five_dry_cell(gated only onelapsed > 0) read that as a rate and walled off the rest of the window. On the same render the pace suffix hid itself (too young to judge) and the "5h caps" notice stayed silent (it waits 15 minutes). Three surfaces, one linear projection, only the loudest one speaking — the same phantom class as the 7d rollover guard in v0.32.0.window_evidence_floor <length>is that rule in one place (5% of the window's own length) and now backs all three: the 5h trio agrees at 15 minutes, the 7d pace suffix keeps its ~8.4h.ADVISOR_PACE_MIN_ELAPSED=900is retired into it — it was the same number as18000/20written a second way, which is drift waiting to happen.week_dry_slotdeliberately keepsSEVEN_DAY_YOUNG_SECS(a day) rather thanlength/20: a pace reading summarises what happened, a multi-day projection needs a day of evidence. Different questions, different floors, both now stated in the source.Verification
-S errorcleannotice_flash_worth_rowboundary pair, the narrow-width integration case the old rule dropped, and the young-5h pair (no×at 10 minutes,×returns past 900s)COLUMNS=30on purpose — at 40 the assertion flipped depending on whether the reset gap rendered40hor39h59mKnown, not in this PR
The Pages demo still animates a pin and its own long form as rows 2+3 (
docs/index.html, thePIN, FLASHandPIN_DRY, FLASH_DRYframes) — behaviour #28 removed. Two string constants plus their captions; rewriting that narrative mid-patch is how a demo starts lying differently, so it wants its own change.🤖 Generated with Claude Code