@@ -120,3 +120,46 @@ S6 `_docs/53-coroutines.md` · S7 2 diagrams + catalogue · S8 gate matrix · S9
120120` verify.lua ` PASS/FAIL 0 with C and F running for real; runner 1 passed; ` validate.py ` OK;
121121every chapter code block verbatim; footer states GCC 16.1.1 / clang 22.1.8, the frame
122122sizes, and the HALO split as measured.
123+
124+ ## Outcome (2026-08-19)
125+
126+ All steps complete. ` verify.lua ` → ** PASS 32 / FAIL 0** with gate F (clang parity + the
127+ HALO contrast) running for real. Runner → 1 passed. ` validate.py ` → OK. Banned-words
128+ clean after one fix. ** 22/22 chapter code blocks verbatim.**
129+
130+ ### The overlap check worked
131+
132+ Checking ch27 * before* planning (rather than mid-draft, as happened in r20) is what
133+ produced this chapter's angle. ch27 owns the mechanism; ch53 owns the cost. No epoll, no
134+ reactor, no awaitable-protocol tutorial anywhere in ch53, and the opening cites ch27
135+ explicitly.
136+
137+ ### Deltas
138+
139+ - ** ` lifetime ` had to be re-instrumented.** The first version counted ` operator new ` and
140+ reported ` leaked_frames=1 owned_frames=1 ` — identical numbers that demonstrated
141+ nothing, since both halves allocate one frame. Switched to counting ` operator delete ` ,
142+ which runs only on ` destroy() ` : now ` abandoned alloc=1 free=0 ` vs
143+ ` owned alloc=1 free=1 ` . The chapter states why that is the right counter.
144+ - ** Two promise types, deliberately.** ` Counted ` uses ` suspend_always ` at initial suspend
145+ so the frame provably outlives the call and nothing is elidable — that is what ` frames `
146+ needs. ` Eager ` uses ` suspend_never ` at both ends so elision is * permitted* — that is
147+ what ` halo ` needs. A ` halo ` case built on ` Counted ` would have reported 1000
148+ allocations under both compilers and supported the wrong conclusion entirely.
149+ - ** One banned word** ("two honest qualifications") caught by the check and removed.
150+
151+ ### Measured, and worth keeping
152+
153+ Frame sizes: trivial ** 32** , four ints + ` char[256] ` ** 304** , ` char[4096] ` ** 4128** .
154+ Against ch50's measured 8388608-byte thread stack: ** 262144x** , computed in the program.
155+
156+ HALO across the shipped source, 1000 calls:
157+
158+ | compiler | -O0 | -O1 | -O2 | -O3 |
159+ | --- | --- | --- | --- | --- |
160+ | g++ 16.1.1 | 1000 | 1000 | 1000 | 1000 |
161+ | clang++ 22.1.8 | 1000 | ** 0** | ** 0** | — |
162+
163+ Gate C asserts only internal consistency, never that elision does or does not happen — a
164+ future GCC that starts eliding must not fail a test for improving. Gate F asserts the
165+ relationship (clang <= GCC), which stays true whichever way either compiler moves.
0 commit comments