@@ -11,84 +11,124 @@ to the task file and note completion in this notebook.
1111
1212---
1313
14- ## HANDOFF — as of 2026-08-10
14+ ## HANDOFF — as of 2026-08-10 (late)
1515
1616** All figures below were run in this session, not recalled.**
1717
18- ** State:** branch ` main ` , tree clean, ** 0 commits ahead of ` origin/main ` ** ,
19- HEAD ` e446a20 ` . Everything is pushed; CI has deployed from it .
18+ ** State:** branch ` main ` , tree clean, ** 2 commits ahead of ` origin/main ` ** —
19+ ` c52287c ` (validator fixes) and ` faa4cbe ` (the page). Not yet pushed .
2020
2121** Compiler:** ` ../bin/riddlc ` is ** ` 2.0.0-rc.10-57-e012ebb9 ` ** and ` build.sbt ` 's
22- ` With.Riddl.library ` pin matches exactly. The Homebrew ` riddlc ` on PATH is
23- ** 2.0.0-rc.5 ** and is the WRONG compiler for the 2.0 docs. riddlc is restaged
24- often — re-check the binary against the pin at session start .
22+ pin matches exactly. The Homebrew ` riddlc ` on PATH is ** 2.0.0-rc.5 ** and is the
23+ WRONG compiler for the 2.0 docs. Re-check the binary against the pin at session
24+ start; it is restaged often .
2525
26- ** Gates:** 2.0 — ** 171 validated / 55 skipped / 0 failed, exit 0** ; 1.31 —
27- 6/0/0. ` mkdocs build --strict ` on ` sites/riddl ` clean.
26+ ** Gates:** 2.0 — ** 183 validated / 43 skipped / 0 failed, exit 0** (was
27+ 171/55); 1.31 — 6/0/0. ` mkdocs build --strict ` on ` sites/riddl ` clean.
2828
2929** ` task/ ` holds only ` done/ ` .** Nothing awaits triage.
3030
31- ### In flight — BACKLOG 1a
31+ ### BACKLOG 1a is DONE
3232
33- Retiring the blanket ` "illustrative fragment" ` skips. ** 49 remain** , from 118
34- at session start. ` concepts/ ` and ` introduction/ ` are ** finished** .
33+ ** Not one blanket ` "illustrative fragment" ` skip remains in
34+ ` sites/riddl/docs ` ** — 118 at the start of the work, 0 now. The 20 skips left
35+ on ` language-reference.md ` each state their own reason.
3536
36- ` references/language-reference.md ` is ** half-done and is where to resume** : 12
37- of its 44 retired (page 23/52 → 35/40), and ** the other 32 were restored
38- verbatim** so the page is green. That restore is deliberate, not abandoned
39- work — the gate must never be left red.
37+ ** Next is BACKLOG 1a-followup** , which is the subset of those reasons that mean
38+ * the example is wrong* : ` OrderPlaced ` shown with two different field sets on
39+ one page, epic steps whose paths contradict the page's own application fence,
40+ an adaptor that crosses its isolation seam, a projector with no record. All
41+ were read off real riddlc diagnostics — do not re-derive them.
4042
41- ** BACKLOG 1a carries the measured analysis of those 32** — which want
42- ` in-handler ` , which want ` in-domain ` plus a domain prelude the page still
43- lacks, which are genuinely unskippable, and which hide known content bugs.
44- Read it first; it cost a full pass to derive.
45-
46- The other 17 sit in ` migration/ ` and ` guides/ ` , ** outside the gate scope** ,
47- in trees carrying 4 pre-existing failures. Starting them starts BACKLOG 1b.
43+ The remaining 17 blanket skips site-wide are in ` migration/ ` and ` guides/ ` ,
44+ outside the gate, and are now folded into BACKLOG 1b.
4845
4946### Traps
5047
5148- ** The gate's scope is a FILE LIST, not a directory** — exact command in
5249 CLAUDE.md § "Compiling RIDDL examples". A figure is only comparable within
53- one scope; if one fails to reproduce, re-measure against the parent commit
54- rather than trusting it. That is why the inherited "108/107" was discarded.
50+ one scope.
5551- ** The gate truncates diagnostics** to a position. For the real message,
56- import the script as a module, re-wrap with ` wrap() ` (mirroring any
57- ` no-prelude ` ), and run ` ../bin/riddlc validate <file> ` — a bare path, there
58- is no ` --input-file ` flag.
59- - ** Re-run the FULL gate after any wrapper or script edit.** Wrapper changes
60- have regressed unrelated pages four times.
61- - ** ` annotate-riddl-examples.py ` places a fence against the prelude AS IT
62- WAS.** Extending the prelude afterwards silently invalidated 8 placements.
52+ import the script as a module, re-wrap with ` wrap() ` , and run
53+ ` ../bin/riddlc validate <file> ` — a bare path, there is no ` --input-file ` .
54+ - ** A diagnostic filter that watches only ` [error] ` /` [severe] ` will lie to
55+ you.** The gate also fails on ` [deprecated] ` , so a hand-rolled probe called
56+ a fence clean that the gate then rejected. Filter exactly as the gate does.
57+ - ** Re-run the FULL gate after any wrapper or script edit** , and the 1.31 gate
58+ too — a script change is not scoped to one tree. Wrapper changes have
59+ regressed unrelated pages five times now.
60+ - ** Extending a prelude regresses fences that were already green.** Adding
61+ ` currency ` to ` OrderPlaced ` broke a fence in a different section; adding a
62+ domain-level ` Storefront ` broke two more. Re-run the whole page after every
63+ prelude edit, not just the fence in hand.
6364- ** Prelude/wrapper name collisions run both ways.** Wrapper names keep an
64- ` Example ` prefix; equally, a prelude must not take a name a wrapper supplies
65- — ` function Tax ` broke every in-function fence on its own page.
66- - ** Annotate fences by LINE NUMBER** , never by matching a fence's first line.
65+ ` Example ` prefix; equally a prelude must not take a name a wrapper supplies.
66+ - ** Annotate fences by LINE NUMBER** , never by matching a fence's first line —
67+ and check the match is unique before writing, since several fences on this
68+ page share an opening line.
6769
6870### Certainty
6971
7072** Verified by command this session:** git state, both compiler versions, the
71- pin, both gates, the strict build, that ` task/ ` is empty, and that no
72- unexecuted plan in ` ~/.claude/plans/ ` holds open work for this repo .
73+ pin, both gates, the strict build, that ` task/ ` is empty, and that zero blanket
74+ skips remain .
7375
74- ** Verified by compiling:** every example on the 25 pages changed, plus the
75- rules recorded in BACKLOG 1a and in the pass entries below .
76+ ** Verified by compiling:** every fence on ` language-reference.md ` , and every
77+ claim in BACKLOG 1a-followup .
7678
77- ** Assumed, not re-verified:** BACKLOG item 5's 18 site items were carried over
78- as written and none was re-checked against the current site. The gh-pages
79- deploy triggered by the last push was not inspected.
79+ ** Assumed, not re-verified:** BACKLOG item 5's 18 site items. The gh-pages
80+ deploy state — nothing has been pushed this session.
8081
8182### Pointers
8283
83- Open work is ** BACKLOG.md** — 1a is live. Durable facts are ** CLAUDE.md** ,
84- notably § "Things that will bite" and § "Compiling RIDDL examples".
84+ Open work is ** BACKLOG.md** — 1a-followup is live. Durable facts are
85+ ** CLAUDE.md** , notably § "Things that will bite" and § "Compiling RIDDL
86+ examples".
8587
8688** Run ` /ossuminc-skills:check-tasks ` in the new session.**
8789
8890The sections below are kept as the record of how the current state was reached.
8991
9092---
9193
94+ ### BACKLOG 1a, final pass: language-reference.md done ✅ ** 2026-08-10**
95+
96+ The last 32 blanket skips retired; page 35/40 → 47/28, gate 171/55 → 183/43.
97+ 1a is complete.
98+
99+ ** The harness was hiding work behind "no wrapper fits" — four separate ways.**
100+ The pattern from pass 4 (annotate kept a stale copy of the wrapper list)
101+ turned out not to be a one-off:
102+
103+ - ` no-prelude ` reached only the page prelude, so a whole-context fence could
104+ never use a domain prelude — the single biggest lever on the page was
105+ unreachable, not absent.
106+ - ` PRELUDE_ENTRY ` did not match an intention prefix, so
107+ ` application context Storefront ` was invisible to ` no-prelude ` .
108+ - ** ` DIRECTIVE ` used ` [^>]* ` , so a skip reason containing ` >= ` ended the match
109+ early and the fence silently became ` standalone ` .** This one fails toward
110+ false confidence: a deliberate skip quietly turns into a validated fence.
111+ It cost three mystery failures that looked like lost directives.
112+
113+ ** A domain prelude works because bare names resolve across sibling contexts.**
114+ That was worth proving rather than assuming, so it was checked in both
115+ directions — a bare ` outlet Pings ` in another context resolved, and a bogus
116+ name failed. A domain body may hold type definitions, which is what makes the
117+ stream events placeable.
118+
119+ ** Some fences cannot be made green without lying.** The adaptor example emits
120+ a message belonging to neither its parent nor its referent context. A prelude
121+ * can* silence that by hiding the event in the referent — and doing so would
122+ defeat exactly the check that makes the gate worth running. Those fences got
123+ an honest skip and a BACKLOG entry instead.
124+
125+ ** Two examples on one page can be mutually exclusive.** ` match order.status `
126+ needs ` status ` to be an enumerated type; ` set field status to "Active" ` needs
127+ it to be a String. No prelude satisfies both, and that is a content decision,
128+ not a harness gap.
129+
130+ ---
131+
92132### BACKLOG 1a, pass 4: language-reference.md, first slice ✅ ** 2026-08-10**
93133
9413412 of its 44 blanket skips retired (page 23/52 → 35/40); the other 32 restored
0 commit comments