Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
# Changelog

## v0.38.0 — 2026-09-01 — the future has a shape

**The fold's own argument expired.** "History is information; the future
is one fact — the count" was true while every hollow cell was identical.
v0.36.0 taught the cells when you sleep, and a live frame made the cost
concrete: `▮▯▯...×(✕6)` spends a nine-column token to hide five cells
that would have said more drawn out. So the fold keeps only the job it
still does — column economy on the long early-week run — and the rule is
now break-even: a future of `WEEK_FUTURE_UNFOLD_MAX` (10) cells or fewer
draws in full, which is the last ~2 days of every week. Above that,
nothing changes: two kept cells, the counted token, the same number the
budget line prices. The old measurement stands where it was made — 30
hollow cells do read as "too much future".

**A cell you sleep through draws dim.** With the learned shape (same
read validation and 14-day gate as the walk), a future `▯` whose 5h slot
has fewer than `REST_SLOT_AWAKE_MIN_SECS` (9000) awake seconds — under
half the cell — dims: capacity on the grid that is not really available.
The 5h strip applies the same half-the-cell rule to its 1h cells, so
`▃▮▯▯` with the last two dim says the window outlives your evening. `×`
outranks the tint (a cell the pool cannot cover is unusable for a
stronger reason), `▮` and history are untouched, and unlearned every `▯`
stays plain — the render is byte-identical to v0.37.0 apart from the
unfold rule. The tint is the one refinement this row carries by color
alone, and the one place that is honest about it: a dim `▯` is still a
window ahead, so a reader without the tint loses nothing actionable. The
dim count may sit one off the budget's `~N awake` — cells are grid
slots, the sentence is clocks, the same one-cell tolerance the fold
count has always carried.

Ships with [ccpace](https://github.com/thevibeworks/ccpace) v0.6.0 ("the
night on the ledger"), which dims the same cells by the same rule;
`REST_SLOT_AWAKE_MIN_SECS` joins the shared reading rules in
`docs/api/state-dir.md`. No `forecast.cache` change of any kind.

## v0.37.0 — 2026-09-01 — what a point buys

**Two pools drain toward one wall and nothing said which one binds.** The
Expand Down
19 changes: 13 additions & 6 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,15 @@ the badge states the end (`5h[38%@23:00]`) and the notice names the wall
(`5h caps ~14:20`). Cells carry the shape, badges carry state, notices do
the warning. History draws in full; the live row folds the 7d future
after two kept cells into `...▯(x14)` — the 5h windows *after* the one
you are in, all alike, `×` red when the tail projects dry (the `week`
you are in, `×` red when the tail projects dry (the `week`
report still draws every slot). The count is the budget line's own,
priced from the same instant, and it folds as soon as folding hides two
cells: the future is one fact, and the ink belongs to history. Each strip
ends
priced from the same instant. The fold pays only while the tail is wider
than its own token: ten cells or fewer draw in full, because the future
stopped being one fact the day the cells learned your rhythm — a hollow
cell you sleep through most of draws *dim*, so the drawn tail is a shape
(tonight, the night, tomorrow morning), not a run of identical slots.
Unlearned, every `▯` stays plain and only the fold rule changes. Each
strip ends
with its pace (used ÷ elapsed; dim <1x, pressure ≥1x, hidden until 5% of the
window has run) and the reset its right edge is — axis labels, not restated
badges.
Expand All @@ -113,8 +117,11 @@ badges.
▁ baseline: ran, negligible — the shortest bar of the same block
░ unknown — no sample; never drawn as idle
▮ now
▯ ahead — the hollow of ▮; on 5h, the hours left in the window
...▯(x14) the folded future: 14 more 5h windows after this one (live 7d row)
▯ ahead — the hollow of ▮; on 5h, the hours left in the window;
dim when your learned hours say you sleep through most of it
(× outranks it: unreachable beats asleep)
...▯(x14) the folded future: 14 more 5h windows after this one (live 7d
row, only while the tail is wider than this token)
× pace won't cover it (7d only: learned forecast, linear when cold)
```

Expand Down
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,22 +318,24 @@ fire.
left, the last a 3h stub), height = the 7d points that window burned,
with a thin gap at each local midnight so days read as clusters — and a
day that held five windows shows it — without a ruler. History draws in
full; the future folds as soon as folding hides two cells: two hollow
cells after `▮`, then `...▯(✕28)` — 28 more 5h windows **after the one
you are in**, all alike (`×` red when the tail projects dry). That count
is the budget line's own `~28✕5h left`, priced from the same instant:
one row, one arithmetic. The future is one fact and the strip's ink belongs to
history; a closing week needs no help to draw to its edge, since four
cells or fewer leave nothing worth folding. The `week` subcommand's wide
ledger still draws every slot.
full; the future folds only while folding pays: with more than ten cells
ahead, two hollow cells after `▮`, then `...▯(✕28)` — 28 more 5h windows
**after the one you are in** (`×` red when the tail projects dry). That
count is the budget line's own `~28✕5h left`, priced from the same
instant: one row, one arithmetic. Ten cells or fewer — the last ~2 days
of every week — draw in full, because the cells stopped being all alike:
once the learned rest model knows your hours, a hollow cell you
sleep through most of draws **dim**, so the drawn tail is a shape
(tonight, the night, tomorrow morning), not a count. The `week`
subcommand's wide ledger still draws every slot.

| Cell | Meaning |
|------|---------|
| `▂▃▄▅▆▇█` | a cell that ran; height is the points it burned (`▂` <= 2, `▅` <= 11, `█` > 20) — the same scale in both strips, so a full window and a full week read the same height |
| `▁` | the baseline: ran and cost under a point, or ran idle inside the log's coverage. The shortest bar of the same Block Elements run as `▂▃▄`, so the zero line shares their font, width and height — it used to be `ˍ` (U+02CD), a modifier *letter*, which terminals resolve through the text face and which broke the strip's metrics mid-row. Override with `LEDGER_BASE_GLYPH` |
| `░` | unknown: the log has no sample for that cell (never drawn as idle — a gap in the record is not a quiet session) |
| `▮` | the cell you are in now |
| `▯` | a cell still ahead of you — the hollow of `▮`, an empty slot waiting. On the 5h strip the run of them is the hours left in the window |
| `▯` | a cell still ahead of you — the hollow of `▮`, an empty slot waiting. On the 5h strip the run of them is the hours left in the window. **Dim** when your learned hours say you sleep through most of it (under half the cell awake): capacity on the grid that is not really available. `×` outranks it — unreachable beats asleep — and a reader who cannot see the tint loses nothing actionable: a dim `▯` is still a window ahead |
| `×` | a cell the pool will not cover at the current pace — **7d only**: the learned forecast's dry point, linear when untrained. The 5h window's wall belongs to the `5h caps ~14:20` notice, which states the time instead of shading cells |
| `...▯(✕28)` | the folded 7d future: 28 more 5h windows after the one you are in, one token instead of a run of hollow cells (`×` red when the tail ends dry). The count is what the budget line prices — not the number of cells the fold happened to hide |
| `✕` | not a cell — the multiplication sign, the row's one operator (`...▯(✕28)`, `0.7✕`, `19✕5h left`). Deliberately not `×` (U+00D7), which is already a reading: cells are the ink, the operator is punctuation, and `...×(×28)` has to say both at once. One terminal column and no emoji fallback, so the row still meets line 1's edge; override with `MULT_GLYPH` (`╳` and `✖` look stronger but are ambiguous-width and emoji-presentation respectively) |
Expand Down
12 changes: 11 additions & 1 deletion docs/api/state-dir.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ read concurrently.

- Contract version: **2** (bump on any breaking layout/field change; this
file is the changelog)
- Synced with: statusline.sh v0.37.0
- Synced with: statusline.sh v0.38.0
- Permissions: the script runs under `umask 077` — files are owner-only.
Caches hold account PII (email, uuid, org names).

Expand Down Expand Up @@ -251,6 +251,16 @@ equal count would spend a clause to say nothing. At `awake == 0` both the
awake clause and the ration that would divide by it go away; the landing
still speaks.

A REST SLOT is a ledger cell you sleep through: fewer than
`REST_SLOT_AWAKE_MIN_SECS = 9000` awake seconds in its 5h span — under
half the cell, the break-even a reader can hold in their head. Both
ledgers (this statusline's week strip, ccpace's block) draw such a future
cell as a dim `▯`; the general rule is half the cell, which is how the 5h
strip applies it to 1h cells (1800). `×` outranks the tint — a cell the
pool cannot cover is unusable for a stronger reason — and the dim count
may sit one off the sentence's `~N awake`: cells are grid slots, the
sentence is clocks, the same one-cell tolerance the fold count carries.

`scoped_*` mirror the all-model fields for the `weekly_scoped` limit —
the per-model weekly cap, `Fable` at time of writing. `scoped_name` is
the scope the profile is ABOUT (`null` while unobserved); burn is
Expand Down
Loading
Loading