Repository navigation
Releases: calionauta/bb-plugin-stelow
Release list
v0.78.1
v0.78.0
v0.77.0
v0.76.0
What changed
A worker reporting "The question could not be recorded" used to stop with the card idle,
no pending question, and nothing on the card to say why. The README carried a runbook telling
people where to look — in a file that opens by declaring the manual lives on the Stelow site,
not there.
The gap
The card is marked awaiting-answer before the blocking wait and set back to running when
the call ends, which happens before the persist is attempted. So a failed write left a
card that was idle, had no question waiting, and carried no trace of what happened. The only
evidence was a plugin-log line nobody reads — a phantom wait by this project's own rule:
any user-facing wait needs a live question behind it.
The fix
The failure now records itself, on the card's trail and in Needs attention, naming the
cause, the fact that nothing was lost, and the one action that resumes it. The inbox entry
dedupes per card rather than per error, because the same broken handle fails on every
ask and a reader wants one entry whose count grows rather than a row per attempt.
The line names which worker thread to message: a card with restarts has more than one in
its history, so "the worker thread" was a place a reader could not find.
Documentation
The README section is removed, and its content moved to
Board and inbox — which
the README already links. There it can say what six compressed lines could not: that this is
an interrupted write rather than lost work, why the card looks idle, what a single
SQLITE_BUSY means versus repeated non-busy errors, and what to do about each.
The page explains it. The product now shows it.
v0.75.0
What changed
The board stops pretending to be a tool you drive by hand, and the phone layout stops being
a narrower version of the desktop one.
Breaking
- A card is no longer moved by hand. Dragging a card between columns and clicking a
stage chip to change stage are both gone. The workflow is the agent's to drive, and a
person asks it in the conversation instead — the board reads as a status report rather
than as a manual tool. Nothing else about a card changed: the stage timeline still shows
where the card is, what each stage produced, and why a stage was skipped. - A column's delete-all moved into its column header. It used to render in the flow
between the header and the cards, which pushed the Archived column's cards out of line
with every other column.
Features
- The phone board is a second layout, not a narrower first one. Below
mdthe board is
a snap-scrolling rail of near-full-width columns with the next column's edge peeking in,
so a thumb moves one column at a time and the reader can see there is another. The 2026
consensus names the horizontally-scrolling desktop grid on a phone as the failure mode
rather than the fallback; this is the pattern that shipped instead.
Bug Fixes
- The disclosure chevron now rotates.
DisclosureSectiontracked its open state but
never passed it to the chevron, so 20 of its 23 callers relied on a CSSgroup-open:
variant that this very file had already abandoned once — "never CSS group-open hope,
which froze arrows in place before". The Machine receipts toggle was one of the 20. A
second instance rendered<details>with nogroupclass at all, so its arrow could not
move under any circumstances. - The lint gate now exists. The pre-commit hook has said "lint for dead code" since it
was written, andoxlintexits 0 with warnings — so it passed while the tree carried 45
of them. Findings present today are recorded inscripts/lint-baseline.jsonand the gate
fails only when the set grows, wired intoquality:shapeso both the hook and CI enforce
it. Six of the 45 were this branch's own, created when it moved code between files. - No RPC result carries a key holding
undefined, and the delete-all no longer leaves a
column's cards misaligned.
Deliberately not here
No spend ceiling, and no flow drawer yet. A budget module was written, tested and
removed earlier because nothing called it; the gap is stated in FEATURES.md instead.
The metrics drawer is the next piece of this work.
v0.74.0
What changed
Nine changes from asking what a Stelow worker actually costs to start, and whether the
prompt machinery was telling the truth about it. Two findings came from the live database
and one of them contradicted what the code looked like it did.
The prompt's shared prefix, measured on live workers
Provider caching is prefix matching, so the reusable region ends at the first byte that
differs. The state dir sat at character ~106, ahead of the entire 10 KB clause block every
build path renders identically — so every new thread re-paid nearly its whole prompt, and
so did every band-boundary handoff, which starts a new thread by design.
| before | after | |
|---|---|---|
| shared prefix of the prompt, two cards | 0.6% | 90.5% |
| first snapshot served from cache, three live workers | — | 99.3% / 99.1% / 89.3% |
Fleet-wide across 74 threads the cache read 60,386,501 tokens against 54,840,152 fresh.
Features
- A worker's orientation cost is measured and shown on the card. A skill load is a
toolCallnaming aSKILL.md, so reads before the firstbb stelow advanceare
orientation spent before work. Reported, never blocked. - A worker's token figure is shown for nearly every worker, and says what it is.
acp-opencode— which 8 of 10 workers run on — emits no usage event at all and reports a
context-window reading instead. Both families are read now, and an estimate is labelled
(est.)rather than presented as a measurement. 1 of 10 workers reporting a figure
before, 10 of 10 after. - A refused retry records why and names an exit. Five real runs hit the auto-retry's
stage guard with the card already advanced and every one parked silently — which is why
auto_retry_countread 0 across the fleet.
Bug Fixes
- Every prompt resolves its reading list from
bb stelow playbook. All six spawn paths
told the worker to load thestelow-workflow-*glob — seventeen skills, 215,756 bytes of
entry documents — while theCLI_EQUIVALENTSclause in the same prompt said to run the
playbook and never discover skills that way. - One ask contract, rendered by every spawn path. The structured-ask block was pasted
into five builders and had already drifted: two lacked the "never write waiting text"
guard and the restart path lacked the timeout rule. - A provider rate limit and an unowned card no longer advise "Answering below resumes the
worker". False for both — nothing is pending, and the reader was pointed at a box whose
answer goes nowhere. - No RPC result carries a key holding
undefined. The board failed outright on any
board whose stored defaults predate red-first. - The run bundle's token evidence reads both families and states its provenance, and the
history row shows a dash rather than nothing when a provider reports no usage. - A clause that renders the literal word
undefinednow fails a test, and the
owed-clause list is derived from the clause bag so a new clause is covered at once.
Deliberately not here
No spend ceiling. A budget module was written, tested with eight sections, and
removed — nothing called it: no UI set a limit, no column stored one, no pass checked
one. A tested module with no consumer reads as a shipped feature. The gap is stated in
FEATURES.md instead: 87,296 to 477,684 tokens per worker thread, with nothing comparing
that to a limit.