feat(reports): read the critiques back - #12
Merged
Conversation
The critics wrote and nothing read. One repository reached 21 reviews in 357
lines of .aether/out/TEMPER.md, at which point seeing the latest meant
`awk '/^# Review/{n++} n==21'`, and `aether review --help` answered
`Unknown: aether review --help`.
whetstone already had the right shape: an `<!-- aether:critique … -->` block
inside the plan, addressable and carrying its own metadata. temper had only a
`# Review — <target> — <date>` heading, no delimiter, date as the only field —
so two reviews in a day are indistinguishable. Not hypothetical: the oldest two
entries in that file are byte-identical headings.
aether review list the table, with severity counts
aether review show [N] one report; --raw for glow
aether plan critique whetstone's, from inside the plan
aether plan critique --history
temper's reports now carry the same marker, with a timestamp rather than a
date. The reader accepts both shapes: entries written before it are still
listed and shown from their heading, with no scope and no time of day, and the
table says so. A reader that only understood the marker would make every
existing report invisible, which is worse than the awk.
Three things the real file taught, none of which a fixture would have:
The counts format is not stable, because a model wrote it. Across one history
the same three numbers appear as `**Blockers:** 0`, as
`**Blockers:** 0 | **Significant:** 3 | **Minor:** 4`, and as
`**Blockers:** 0 — … — Good to ship`. Stripping non-digits from the line turned
2 | 3 | 4 into 234. The parse now reads the number following each label.
flush() ended entries at NR-1, right when a new heading closes the previous one
and wrong at end of file, which silently truncated the newest report — the one
you actually read.
`body=$(...); rc=$?` aborted the function under `set -e` before the case could
run, so an out-of-range index printed nothing. cmd_check hit this exact trap
before; the fix is the same `&& rc=0 || rc=$?`.
Also fixes --help on review, plan and config, which all answered `Unknown:`.
41 new assertions; 852 across 14 files; acceptance 46/46. Verified against the
real 21-entry file: all parsed, and `show --raw` is byte-identical to the awk
one-liner it replaces.
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.
The critics wrote and nothing read them.
.aether/out/TEMPER.mdin one real repository reached 21 reviews across 357 lines, at which point seeing the latest meant:awk '/^# Review/{n++} n==21' .aether/out/TEMPER.mdAnd
aether review --helpansweredUnknown: aether review --help.The asymmetry that explains it
whetstone already solved this. It wraps each critique in an
<!-- aether:critique sha=… date=… blockers=N -->block inside the plan — addressable, carrying its own metadata, and the copy the gate hashes.temper never did. It wrote a
# Review — <target> — <date>heading into an append-only log: no delimiter, no end marker, the date as the only field. So two reviews on the same day are indistinguishable — and that is not hypothetical. The oldest two entries in that file are byte-identical:What this adds
That is the view
catcannot give: have any of my recent reviews had blockers. Plusreview show [N],--rawfor piping toglow, andaether plan critiquedoing the same for whetstone — reading the block inside the plan, which is authoritative, and saying so when the plan has changed since.temper's reports now carry the same marker, with a timestamp rather than a date. The reader accepts both shapes, which is load-bearing rather than polite: entries written before it are still listed and shown from their heading, with no scope and no time of day, and the table says so. A reader that only understood the marker would make every report already on disk invisible — worse than the awk it replaces.
Three bugs the real file taught, that a fixture would not have
The counts format is not stable, because a model wrote it. Across one history the same three numbers appear three ways:
Stripping non-digits from the line turned
2 | 3 | 4into 234 blockers. The parse now reads only the number following each label. This is also the argument for the marker: the list view should not have to parse prose at all.flush()ended entries atNR - 1— correct when a new heading closes the previous entry, wrong at end of file, whereNRis already the last line. It silently truncated the closing lines of the newest report, which is the one you actually read.body=$(...); rc=$?aborted underset -ebefore thecasecould run, so an out-of-range index printed nothing at all.cmd_checkhit this exact trap before; the fix is the same&& rc=0 || rc=$?the repo already documents.A fourth was self-inflicted and worth the note: an apostrophe in a code comment (
the entry's final line) closed the single-quoted awk program and handed the rest to bash — the trapenforce-cairn.shalready carries a comment about.Also
aether review --help,aether plan --helpandaether config --helpall answeredUnknown: …— on exactly the commands whose subcommands you are most likely to be hunting for.Verification
Against the real file first, since it is what prompted this:
Then
tests/test_reports.sh(41 assertions): mixed marked and unmarked in one file, byte-identical same-day headings staying addressable, a# Reviewline inside a fenced block not splitting the entry, counts read per label, an empty file and a missing file and a report with no counts each saying which, the pre-1.1.claude/plans/TEMPER.mdlocation being read and then abandoned once.aether/exists — mirroring the writer's rule rather than inventing one — andplan critiqueagainst critiqued, uncritiqued and stale plans.852 assertions across 14 files;
acceptance.sh --full46/46;aether docsandaether config doctorclean.