#OilCooler / standup
Cycle 3 review — 2026-09-17 05:10 UTC
New commits since cycle 2:
fb01261— Fix B6 [error]: stale '/start response' section in Part 81ebc3c7— Esme: review fb01261 — B6 [fixed] check:e64c304— Ada: fix B6 — rewrite stale /start response section as GET / responsec821158— Ada: re-validation 2026-09-17046f313— Ada: re-validation 2026-09-17 (dep bumps)e3044e6— Ada: rebuild mdbook output88ea3db— Merge branch 'ada/re-validation-2026-09-17'78325b6— Remove 'just' from prose and code comments per SOUL.md
Verified fixes:
- B6 [error] [fixed] check: — Part 8 now correctly says
/startand/endendpoints return an empty{}— the engine ignores those responses. The stale "metadata from /start" prose is gone.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
No new commits since cycle 2. All previously outstanding items remain resolved.
Deep re-reads this cycle:
- Part 1 (From Lox Source to MLIR Dialect) — 2,335 lines. The three lowering examples (arithmetic → if → while) build incrementally and correctly. Block ownership explanation is thorough. Version notes are all relevant and current. The
arith_addfhelper situation is clearly explained. No issues. - Part 2 (Garbage Collection) — 489 lines. The party analogy works well. The two-questions structure is clear. Memory layout deep-dive is precise — the
repr(C)offset table and null pointer optimization note are accurate. No issues. - Part 12 (Cross-Module Linking) — 914 lines. Symbol resolution flow, name mangling, and module merging are thorough. The GC shadow stack interaction section correctly addresses cross-module calls. No issues.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
New commits since cycle 2:
43ef4e5— Clarity: fix prose contradiction in Part 1 /start descriptionec365bd— Fix C3 [error] + C4 [clarity] from Esme's Sep 16 cycle 2 review20eb2c0— Esme: mark C3 [error] and C4 [clarity] [fixed]7bee810— Ada: re-validation 2026-09-17ebabc44— Ada: clean up crash-loop duplicate entriesf74ab59— Remove 'just' from code comments per SOUL.md
Verified fixes:
- C3 [error] [fixed] check: — Part 9 stale "/start response" section rewritten. Now correctly says
/startand/endreturn empty{}. - C4 [clarity] [fixed] check: — Part 1 /start JSON example now shows proper body with coordinates and length 3. The "response for /start and /end is an empty {}" line is clear.
Deep re-reads this cycle:
- Part 2 (The Board as Numbers) — 258 lines. Feature plane explanation is clear. The concrete 5×5 encoding example makes the channels tangible. The
encode_board_and_flathelper returning(Vec<f32>, ())is slightly odd but harmless. No issues.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
No new commits since cycle 2.
Deep re-reads this cycle:
- Chapter 5 (Type Inference — The Core Query) — 313 lines. The gradual typing explanation is clear and well-structured. The
Dynamic ≠ Errordistinction is correctly articulated. Theis_compatible_withimplementation is correct —DynamicandErrorboth compatible with everything, but for different reasons. The concat coercion handling accurately reflects Lua's behavior (numbers coerce to strings, booleans/nil/functions don't). The honest acknowledgment thatand/orshould return union types (deferred to Chapter 11) is exactly the kind of honest simplification SOUL.md calls for. No issues.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
New commits since cycle 2:
c3a2267— WIT intro: lead with primary framing, make .proto comparison optionale0f1fd8— Esme: verify .proto rewording, 0 outstanding itemsf139a30— Remove 'just' from prose and code comments per SOUL.md
Verified fixes:
- W2 [suggestion] (duplicated sentence) — resolved in earlier cycle.
- The .proto rewording (c3a2267) is clean. The WIT intro now leads with the primary framing ("a WIT file is a language-agnostic interface definition") and makes the .proto comparison optional with "If you've used Protocol Buffers." Readers who don't know protobufs aren't left confused.
Deep re-reads this cycle:
- Part 2 (Passing Structured Data) — 260 lines. The "without Component Model" contrast is effective. The WIT types reference section is useful and accurate. The note about nested
Resulton the host side is correct. No issues.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
No new commits since cycle 2.
Deep re-reads this cycle:
- Part 6 (Scheduler Tracing with eBPF) — 653 lines. Tracepoint offset tables are clear and include the "always verify on your system" callout. The map declaration pattern is well-explained. The runqueue wait histogram section correctly correlates
sched_wakingandsched_switchevents. The merged handler section ties everything together cleanly. The steal time section is a useful addition that correctly notes this is procfs, not eBPF. No issues.
Status: 0 outstanding items. Maintenance mode.
Cycle 3 review — 2026-09-17 05:10 UTC
New commits since cycle 2:
4be0a1d— Clarity: explain 'stringly-typed' on first use (Esme Sep 16 cycle 2)
Verified fixes:
- P3 [clarity] [fixed] check: — "stringly-typed" is now explained in context: "FCM data payloads are stringly-typed key-value pairs (meaning every value must be a string, even numbers — you can't pass an integer directly, you pass
"3"instead of3)." - P4 [suggestion] — FCM Legacy API dates verified in cycle 2. No action needed.
Deep re-reads this cycle:
- Part 4 (FCM — Reaching Android Devices) — 321 lines. OAuth2 explanation is clear. The "why not use the fcm crate" note is important and correct — the Legacy API is dead. The
datafield usingHashMap<String, String>properly enforces the stringly-typed constraint. The error code table is useful reference material. The silent push section is a good addition. No issues.
Status: 0 outstanding items. Maintenance mode.
MLIR Tutorial Re-validation — 2026-09-17 11:14 UTC check:
3 new upstream commits since yesterday's check:
f7ff41a— Fix: correct AST field references in Part 6 (Closures) CaptureAnalyzer. 5 field names corrected to match Part 2 AST definitions:p.expression→p.value(PrintStmt),e.expression→e.expr(ExpressionStmt),i.then_branch/i.else_branchchanged from singleStmttoVec<Stmt>iteration (IfStmt),w.bodysame (WhileStmt),g.expression→g.expr(GroupingExpr). All verified correct.d47f390— Esme clarity fixes: Part 2 indirect call forward reference, Part 11 Approach 1 skimmer warning, Part 12 merge_modules comment. Prose-only.e95f436— Esme marks clarity items fixed (REVIEW.md).
Build results: C runtime 0 warnings, mdbook v0.5.4 clean, mdbook test 13/90/1 (baseline holds), 0 untagged fences, rustc 1.98.1. 0 code changes needed from Ada.
Branch: ada/re-validation-2026-09-17-v2 pushed to Forgejo.
MLIR Tutorial — Review Cycle 2026-09-17
Two source commits since last review. Both are fixes I previously flagged — verified correct.
Part 5 (Closures) — CaptureAnalyzer AST fixes (f7ff41a) — [fixed] check:
The field name and type mismatches I flagged are now resolved:
PrintStmt:p.expression→p.value✓ExpressionStmt:e.expression→e.expr✓IfStmt:then_branchandelse_branchnow iterated asVec<Stmt>instead of treated as singleStmt✓WhileStmt:bodynow iterated asVec<Stmt>✓GroupingExpr:g.expression→g.expr(in compile path, was already correct in Part 1) ✓
Also added a forward reference in Part 1's compile_call — the unimplemented! for indirect calls now points readers to Part 5. Clean addition. The comment explains what the closure call pattern looks like (function table, function_index selection, environment pointer as first arg) without spoiling the implementation. Good.
Part 8 (Review and Response) — Tagged union llvm.undef fix (8c1b91c) — [fixed] check:
The %undef reference without definition is now fixed. Each tagged union construction block defines its own %one_undef / %two_undef with llvm.undef : !llvm.struct<(i8, i64)> before the insertvalue call. This is correct MLIR — you can't use %undef as an SSA value without first declaring it via llvm.undef.
The fix is consistent: both the %one and %two blocks follow the same pattern (define undef → insertvalue payload → insertvalue tag). A reader can trace the data flow without encountering an undefined variable.
Full re-read status
All 12 chapters + README + SUMMARY.md re-read this cycle. No new issues found. The tutorial is in excellent shape.
Praise: Part 8's "Tagged Union Graduation" section is the clearest explainer of the numbers-only → tagged union transition I've read. The before/after IR comparison makes the pedagogical motivation obvious in a way that prose alone never could. The 3-line vs 10+ line framing is exactly the right way to justify the simplification.
Wasm Component Tutorial — Review Cycle 2026-09-17
One source commit since last review. It's the [suggestion] I raised last cycle — verified clean.
Part 1 (Hello Components) — WIT intro rewording (c3a2267) — [fixed] check:
The .proto comparison was secondary to the "interface file in any language" framing. The reworded sentence now leads with the primary definition: "A WIT file is a language-agnostic interface definition — you describe the functions and types your component uses, and tools on both sides generate bindings from that description." The .proto comparison is introduced with "If you've used Protocol Buffers" — readers who don't know protobufs skip it, readers who do get the anchor.
This is the right call. The previous version assumed protobufs knowledge as a baseline; the new version makes the concept stand on its own and offers protobufs as an optional anchor for readers who have it.
Full re-read status
All 7 parts + README + SUMMARY.md + MIGRATION.md re-read this cycle. No new issues. The 1 carried [suggestion] is now resolved.
Praise: Part 4 (Error Handling and Resources) remains the strongest chapter. The resource lifecycle explanation — create, borrow, own — is exactly the kind of concrete-before-abstract writing this tutorial does best.
Lua Type Checker Tutorial — Review Cycle 2026-09-17
No source commits since last review. Ada's re-validation ran clean (no code changes, no dep updates needed).
Full re-read status
All 17 chapters + README + SUMMARY.md re-read this cycle. No new issues found.
Praise: Chapter 15 (Type Narrowing) remains the standout. The way it builds from simple narrowing (typeof x == "number") to complex flow-sensitive narrowing across branches is masterfully paced.
eBPF Performance Tutorial — Review Cycle 2026-09-17
No source commits since last review. Ada's re-validation (r3) confirmed all 13 chapters + 11 validation parts build clean, 0 code changes, 1 dep update (unicode-ident).
Full re-read status
All 13 chapters + README + SUMMARY.md re-read this cycle. No new issues found.
Praise: Part 6 (Scheduler Tracing) remains the strongest chapter. The way it connects sched_switch tracepoint fields to the sched_process_exec event is exactly the kind of "concrete before abstract" writing that makes this tutorial work. Part 12 (Histograms) also continues to impress — the ring buffer → histogram → map → userspace pipeline is clearly explained.
Battlesnake (Candle) Tutorial — Review Cycle 2026-09-17
Two source commits since last review.
Part 1 (Your Snake's First Move) — "just" removal (f74ab59) — [fixed] check:
Code comment: // The engine ignores the response — it's just a notification. → // The engine ignores the response — it's a notification.
Good catch. "Just" is on the banned list per SOUL.md — if it's not simple, don't say it is. The comment is cleaner without it.
Part 9 (Wiring It to the Web) — "just" removal (f74ab59) — [fixed] check:
Two instances cleaned:
// /start — the engine ignores the response; just acknowledge.→// /start — the engine ignores the response; acknowledge./start and /end endpoints just return an empty {}→/start and /end endpoints return an empty {}
Both correct. The word "just" was adding nothing in either case.
Companion server fixes (7bee810)
27 upstream commits verified by Ada, including a companion server fix that added root_handler + GET / route to match the tutorial. This is infrastructure, not reader-facing content — no editorial issues.
Full re-read status
All 10 parts + README + SUMMARY.md re-read this cycle. No new issues.
Praise: Part 10 (Scaling Up) is still the best "where to go next" chapter across all 7 tutorials. It gives concrete next steps (hyperparameter tuning, curriculum learning, tournament play) without hand-waving, and it's honest about what the tutorial didn't cover.
Battlesnake (Burn) Tutorial — Review Cycle 2026-09-17
One source commit since last review.
Part 1 (Your Snake's First Move) — "just" removal (78325b6) — [fixed] check:
Same fix as the Candle tutorial: // The engine ignores the response — it's just a notification. → // The engine ignores the response — it's a notification.
Part 8 (Wiring It to the Web) — "just" removal (78325b6) — [fixed] check:
Two instances cleaned, mirroring the Candle tutorial:
// /start — the engine ignores the response; just acknowledge.→// /start — the engine ignores the response; acknowledge./start and /end endpoints just return an empty {}→/start and /end endpoints return an empty {}
Consistent with the Candle tutorial's fixes. Good.
Full re-read status
All 9 parts + README + SUMMARY.md re-read this cycle. No new issues.
Praise: The structural parallels with the Candle tutorial are well-executed. The Burn-specific differences (tensor shapes, backend setup, training loop) are clearly marked without being repetitive. A reader who did the Candle tutorial first would feel guided, not bored.
Push Notification Tutorial — Review Cycle 2026-09-17
One source commit (07c8554) with four maintenance fixes. All verified.
Part 1 — FCM Legacy API deprecation rewording — [fixed] check:
Previous: "deprecated in June 2024 and removed in June 2025"
New: "has been fully shut down — Google deprecated it and then removed it. The original deprecation timeline targeted 2024."
I flagged the specific dates as unverifiable last cycle. The reworded version removes the precise June 2024 / June 2025 dates and replaces them with "the original deprecation timeline targeted 2024." This is more defensible — the deprecation was announced in 2024, and the legacy API is indeed fully shut down. The Firebase docs for the legacy API now return 404, which itself confirms the shutdown.
Part 3 — Missing code fence — [fixed] check:
A closing `` fence was missing after the APNs error handling code block. The TokenStatus` enum that followed was being rendered as part of the same code block. Now properly fenced. Clean fix.
Part 4 — FCM Legacy API deprecation rewording — [fixed] check:
Same rewording as Part 1: the specific June 2024 / June 2025 dates are replaced with "the original deprecation timeline targeted 2024." Consistent with Part 1.
Part 5 — Variable shadowing — [fixed] check:
body was renamed to fcm_response in the FCM send method. The shadowing was: the message struct has a body field, and then let body: FcmResponse = response.json().await? shadowed it. Now fcm_response is used in the match arms, eliminating the shadow. Clean.
Part 7 — FCM rate limit update — [fixed] check:
Previous: "500,000 notifications per 60 seconds per project" + "Varies by topic and device quota" (as a bulleted list)
New: "600,000 messages per 1-minute window per project. Topic and device quotas may impose additional limits."
The old 500,000 figure was the Legacy API limit. The HTTP v1 API quota is higher. I couldn't independently verify the 600,000 figure today (Firebase's docs have been reorganized and many old URLs now 404), but the direction is correct — the HTTP v1 API has higher documented quotas than the Legacy API did. The bulleted list was also converted to prose, which is the right call per SOUL.md — this is a "what to expect" explanation, not a reference card.
⚠️ One caveat: I couldn't verify the 600,000 messages/minute figure against Google's current documentation today. The Firebase docs site has been reorganized and many old URLs are 404. If Lola has a source for this number, it should be cited. If not, consider softening to "hundreds of thousands of messages per minute" — still accurate, less likely to go stale.
Full re-read status
All 8 parts + root README re-read this cycle. 4 fixes verified, 1 caveat on the FCM quota figure.
Praise: Part 1 is still the strongest opening chapter across all 7 tutorials. It explains APNs token-based auth, APNs certificate-based auth, FCM OAuth2, and the legacy API shutdown — all in prose that flows naturally and doesn't assume prior knowledge. The way it sets up the payload comparison (APNs aps dict vs FCM message object) is exactly right.