0.8.2 — the ruler, and the three readings taken under it
The ruler first, then the three readings taken under it. docs/flow.md set
that order and said why: the first item is what measures the other three, so
anything built beside it is built without it.
A run's report carries one comparison table (#170)
session-cost prints a token line — turns, output, cache write, cache read
— summed over a run's main transcript and every segment beside it, in one
command:
tokens 18 transcripts, 1,617 turns
output 792,908
cache write 7,688,414
cache read 480,245,207
Every way it degrades prints a smaller number rather than raising, so the
line also says how many transcripts it covered — that count is what a reader
holds it against.
skills/verify/SKILL.md now states the nine-row table a run's report carries
and where each row comes from. The two documents that carry it point at the
owner instead of copying the rows, because two copies are two things to keep in
step.
The repository ships a command for its own suite (#156)
bin/test builds a virtualenv on first use and reuses it: 5.24 s cold,
0.60 s warm. The claim is not that the first call is cheap — it is that the
expensive call is only the first.
CONTRIBUTING.md names it first. The old uvx --with pytest form stays as a
labelled no-write fallback, carrying the 55–58 s per call that demoted it,
because a fallback named without its cost gets promoted back. agents/smith.md
and agents/warden.md now tell a spawned segment to look for a runner the
repository ships instead of assembling one — in language that names no
repository's own command, since those files ship to every install.
The flow log's roll fires when a version has shipped (#155)
It guessed the next version by bumping a minor. At 0.8.1 that closed a log
opened for 0.9.0 that nothing had used, and opened a second issue with the same
title.
Now a log is titled by the version it rolls from — chore: flow measurement — after 0.8.2 — which is a fact at the moment it is written rather than a
prediction, and a roll happens only when a new version has shipped. This
release is the migration: the old-convention log read as naming no version,
rolled, and the first log under the new convention is open.
A fence may not close past a section the record needs (#169)
round_record.py new accepted a fenced block that closed after a later
heading, and wrote a record with that section silently gone. The rule is one
sentence — a fence must close, and its span must not cross a line the generator
reads out of the report — and the guard derives that line list from two
constants the module already used to declare what it looks up.
Upgrading
Nothing to do. bin/test is new and optional; every other change is in the
skills, agents and documents the plugin ships, and takes effect at your next
plugin update.
One thing to know if you write review records by hand: round_record.py
now refuses a report whose fenced block, or whose HTML comment, would take a
section out of the record. The refusal names the heading it would have lost and
what to do about it.
Known, and scheduled
Four issues came out of this release's own runs and are on 0.8.3 and 0.9.0:
- #177 — an unwritable
.venvturnsbin/test's refusal sentence into a
traceback. - #179 — a loaded file naming a real version is a timer: green today, red
at the release that ships it. - #182 — the fence guard's enumeration names three copies where the
property is every copy taken out ofraw, and there are four. - #180 — three rules that were already written down were each re-broken
inside one run. Written down and arriving at the moment of the act are
different states, and a fourth copy of the rule is the failure mode rather
than the fix.
Full changelog: https://github.com/MichaelYcJo/SpecSeal/blob/v0.8.2/CHANGELOG.md