Skip to content

Commit b30c70f

Browse files
reid-spencerclaude
andcommitted
Record the prettify spacing fix and what it taught
Idempotence cannot catch a formatting defect: when a component defines its own correctness, self-consistency proves nothing. And a test that passes alone but fails in company is worse than no test -- two suites redirecting System.out under parallel execution. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent d4584d5 commit b30c70f

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

NOTEBOOK.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,36 @@ Orientation for a session with no memory of this work. **Open work is in
1010
`BACKLOG.md`**; durable facts are in `CLAUDE.md`; what things TAUGHT us is in this
1111
NOTEBOOK's body. Ask `git` for branch, tree and unpushed span.
1212

13+
**PRETTIFY NOW EMITS ONE SPACE AFTER `is` (2026-08-25), so the whole corpus needs
14+
re-prettifying and `.bast` regeneration.** riddl-models knows and is not blocked. This
15+
is the change with the widest byte-level reach on the branch — every model in the corpus
16+
had drifted (188 of 188).
17+
18+
**Whitespace is load-bearing in this project.** riddl-models diffs 190 checked-in `.bast`
19+
files against source BYTE FOR BYTE, and that can only be exact while the corpus is
20+
precisely what prettify emits. Reid: *"Byte non-identical, especially with mere white
21+
space changes, is a source of frustration at best and a source of errors at worst."*
22+
23+
**Two causes, two sites, and they are NOT one bug**`emitMessageType` added a leading
24+
space its callers had already supplied (hitting all seven aggregate-use-case keywords but
25+
NOT plain `type`), and `add(Seq[LiteralString])` padded its single-string branch (hitting
26+
`term` only, with a trailing space too).
27+
28+
**The durable lesson is about the TEST, not the spacing: idempotence cannot catch a
29+
formatting defect.** `prettify(prettify(x)) == prettify(x)` held the whole time, because
30+
whatever the emitter does is canonical BY CONSTRUCTION — the property is a tautology with
31+
respect to its own output. Only an assertion against a FIXED expectation can contradict
32+
the emitter. Same shape as rc.24-3's stream defect, where nothing asserted which stream a
33+
command wrote to. **When a component defines its own correctness, self-consistency proves
34+
nothing.**
35+
36+
**A test that passes alone and fails in company is worse than no test.** Two suites here
37+
called `System.setOut`, which is process-global, while sbt runs suites in PARALLEL — so
38+
one captured the other's output and failed with a message that read like a code break.
39+
Both now go through `StdStreamCapture`'s JVM-wide lock. **Any suite redirecting a standard
40+
stream must use it**, or the race is back for everyone.
41+
42+
1343
**Constructor arguments are TYPE-CHECKED as of 2026-08-25**, and until then they were
1444
not checked for type AT ALL — only arity, duplication, ordering, name validity and
1545
`empty` cardinality. riddl-generator found it by generating Java that would not compile.

0 commit comments

Comments
 (0)