How I Passed All Three CIBD Diploma in Distilling Modules in One Sitting, on a Homelab and a Go Pipeline
Disclosure: The previous two posts were drafted by the local Qwen model they describe. This one was drafted with Claude Code, then checked against the repos, the drill log, and the CIBD’s published examiner reports. The opinions are mine. So are the grades.
I’m a software engineer. I make whisky in my basement on Prince Edward Island, with an excise licence and three stills. In June I sat all three modules of the Chartered Institute of Brewers and Distillers’ Diploma in Distilling, and this morning the results page looked like this:
Two Bs and a C, first attempt, all three in one sitting. Almost everyone who has written about this qualification publicly does it one module a year. The CIBD says to budget 120 hours minimum per module. I had a day job, a homelab, a local language model, and a start date in May.
This post is for two audiences who don’t usually read the same blog: distillers who might sit the Diploma, and engineers who want to know what one GPU and a Go pipeline can do with 800,000 words of course material.
What the Diploma Is
The CIBD is the UK professional body for brewing and distilling. It was the IBD until a Royal Charter in 2023 and a rename on 1 January 2025. The qualification ladder runs Foundation, General Certificate, Diploma, Master Distiller. The Diploma is pitched at technical distillers and distillery managers, and Scotch producers like Edrington put their graduate trainees through it. Pass it and you get the post-nominal Dipl. Distil.
Three modules:
- Module 1, Materials, Wort and Fermentation. Cereals and other extract sources, water, wort production, yeast biochemistry, fermentation.
- Module 2, Distillation and Maturation. Distillation theory, batch and continuous stills, non-matured spirits, maturation, pre-packaging, quality and sensory.
- Module 3, Process and Packaging Technology. Resource management, fluid mechanics, heat transfer, steam and refrigeration, water and effluent, process control, materials of construction. The CIBD calls it “the widest-ranging module”. Candidates call it the maths one.
The exams run once a year, in June, each module on its own day, online and remotely invigilated: webcam, photo ID, a camera sweep of the room. Each paper is 195 minutes, and the CIBD recommends spending the first fifteen reading. Section A is 30 short-answer questions worth 40 marks. Section B is six essay questions of which you answer four, worth 80. No multiple choice anywhere. You get two sheets of blank A4 and a non-programmable calculator. A through D are passing grades. There are no resits: fail a module and you’re back next June with the full fee.
Pass rates from the CIBD’s own examiner reports:
| Sitting | Module 1 | Module 2 | Module 3 |
|---|---|---|---|
| June 2024 | 65% | 62% | 90% |
| June 2025 | 59% | 88% | 86% |
On sitting all three at once, the regulations permit it, with a raised eyebrow: candidates “may choose to sit any number of modules at each sitting, ensuring they take careful note of the level of work required to complete each module successfully.” At 120 hours a module that’s 360 hours. The best first-hand account out there, Kristine Hui’s Miss Brewbird videos, covers one module a year over three years, and if you’re considering the Diploma you should watch all three before you do anything else. On the forums, someone who sat all three Diploma in Brewing modules in three days got told “that’s quite hardcore … I’ve been advised to take one a year!”
Nobody I read recommended it. I registered for all three.
The Material
The CIBD’s learning material lives on a Moodle instance. There is no textbook, no PDF, no download. It’s a good course: clear text, a lot of diagrams, and alongside the teaching lessons, self-assessment question sets with full model answers, tagged with one to three asterisks for difficulty. Those model answers turn out to be the most valuable thing in the whole course, but I didn’t know that in May.
What I had after scraping it into markdown:
| Module 1 | Module 2 | Module 3 | |
|---|---|---|---|
| Lessons | 64 | 54 | 71 |
| Self-assessment questions | 144 | 121 | 187 |
| Words of lesson markdown | 238k | 254k | 339k |
Plus roughly 1,400 figures, 1,159 rendered equations, and 411 model answers across 452 questions. The CIBD’s own pacing note allows up to two hours per lesson, which puts the material at up to 380 hours of reading. Module 1 was on June 3 and I had the scrape on May 11.
The scraper itself was a throwaway on a Mac that never made it into a repo. The material is CIBD copyright and stays on my disk for personal study. The lesson text and answers stay out of every public repo, which is why the open-source tool at the end of this post ships with an original demo course instead.
The Timeline
| Date | What happened |
|---|---|
| May 11 | Scrape done. Claude Code plugin with study guides, an equation reference, and a quiz skill. |
| May 15 | vibe scaffolded: a Go daemon that supervises local model backends. |
| May 19–22 | Audiobook pipeline built and run. All three M4Bs finished May 22. |
| May 22 | Pipeline lifted into a generic Go binary, later renamed etude. |
| May 25 | First RAG server over the course, Qdrant plus BGE-M3. |
| June 3 | Module 1 exam. No drill yet. |
| June 3 | RAG corpus swapped from generated scripts to the verbatim lessons. |
| June 6 | Drill live. Session 1: 101 graded answers. |
| June 7 | Coverage-first scheduler. Session 2: 168 answers. |
| June 9 | Session 3: 50 answers, ending 21:30. |
| June 10 | Module 2 exam. |
| June 11 | Module 3 exam. |
| July 31 | Drill excised from the private repo into etude. |
| September 16 | Results. |
The whole study system was built in the gaps of a month, all of it on one GPU.
Generation One: A Frontier Model as Examiner
The first study tool was a Claude Code plugin. The scrape went in, and out came 22 per-unit study guides, three module summaries, and a quiz skill in which Claude composed a question, wrote an ideal answer and a marking scheme in its head, and graded me against them.
It was a good tutor and a bad examiner. The problem is in the phrase “in its head”. The examiner was authoring the questions and the marking scheme from its own understanding, and the exam doesn’t test what a language model thinks about copper; it tests what the CIBD’s material says about copper. Every grade from that quiz was the model’s opinion of my answer against the model’s opinion of the right answer. That’s fine until it isn’t, and you can’t tell which is which.
The second generation was built around one rule: the model relays and grades, it never authors. That needed a corpus with its own questions and answers, and that’s what the self-assessment questions were.
Textbook to Audiobook
It was obvious I wasn’t going to read 800,000 words at a desk before June. So the first big build was turning the course into lectures I could listen to on my phone.
The engine is vamp, the pipeline runtime inside vibe. It’s Go, about 26,000 lines of it before tests inside an 89,000-line project, and it runs a directed acyclic graph of stages defined in YAML, routing each stage to whichever local backend has the capability it declares. The module pipeline is 552 lines of YAML:
- List lessons and dedupe images by SHA-256. The lessons reuse figures heavily; Module 3 came down to 513 unique images.
- Describe every unique diagram with Gemma 3 27B and its vision projector. Phase diagrams, still schematics, vapour-liquid equilibrium curves, each rasterized and described as structured JSON with labels, values, and flow directions. 1,049 images described across the three modules.
- Process each lesson with Qwen 3.6 27B, folding the diagram descriptions into the prose and extracting key numbers, processes, definitions, and common mistakes. Temperature 0.3.
- Extract units and topics, then enrich each topic with a SearXNG search for real-world practice, compacted from around 200 KB of raw JSON per module down to between 22 and 104 KB of usable context.
- Write the lecture script for each unit as a senior lecturer recording one lecture. Temperature 0.7, up to 49,152 output tokens per unit.
- Chunk for text-to-speech, one to three sentences at a natural pause.
- Synthesize with Kokoro, voice af_bella. The TTS container comes up for this stage and goes away after it, so it isn’t holding 2 to 3 GB of VRAM during the text stages.
- Assemble with ffmpeg into per-unit MP3s and a chaptered M4B with an SDXL-Turbo cover, plus a pandoc EPUB of the study guide.
Output, measured with ffprobe:
| Duration | Chapters | |
|---|---|---|
| Module 1 | 6 h 32 m | 8 |
| Module 2 | 8 h 46 m | 7 |
| Module 3 | 10 h 41 m | 11 |
Just under 26 hours of lectures from 4,000 TTS chunks, five to ten hours of GPU time per module on an RTX 5090. The M4Bs went into a self-hosted Audiobookshelf instance, which syncs to its phone app like any other audiobook, and from May 22 the course went everywhere I did.
The same pipeline produced the study guides: 26,000, 39,000 and 41,000 words for the three modules, as markdown, EPUB, and print PDFs. The first version generated each guide in one call and always undershot, silently dropping the later lessons. The fix was a section per unit and a merge step, which is the kind of thing you learn once. It landed on the afternoon of June 3, a few hours after the Module 1 exam, so what I had going into that paper were the truncated May versions and the plugin’s per-unit guides.
Two failures from the overnight Module 3 runs are worth recording because they’re the texture of running this stuff locally. The vision backend crashed with SIGABRT every one to four minutes on NVIDIA driver 595.71.05 with the 5090, so the daemon’s respawn budget went from 3 to 60 and the pipeline just kept going. And a single empty response from Kokoro during a warm-up killed a 1,500-chunk foreach and threw away four hours of upstream work, which is how the retry policy got written. Piper was the TTS engine for exactly one day before Kokoro replaced it.
Module 1: June 3
I sat Module 1 on the audiobooks, the early study guides, and the Claude quizzes. No spaced repetition, no official grading key, no drill. It was a B.
I don’t want to overclaim from one data point, but it tells you something: the lectures carry a lot of weight on their own. The CIBD’s June 2025 examiner report puts the Module 1 pass rate at 59% and complains that candidates don’t read questions carefully enough, “watching for details like barley vs malted barley”. Twenty-six hours of a lecturer explaining exactly that distinction, on a phone, wherever I happened to be, is a decent preparation.
Three Days to Build a Drill
Modules 2 and 3 were a week out, and I knew where the gap was. Listening is passive. I could recognize the material and I could not reproduce it. The learning principle that fixes that is retrieval practice: struggle to produce the answer from memory before you see it, get graded honestly, and have the misses come back. The July post on this blog describes the resulting system in detail. Here’s what it took to make it work between June 3 and June 6.
The corpus was wrong first. The May 25 RAG server had ingested the podcast scripts, because they were the nicely chunked output I had. That’s an LLM paraphrase three lossy hops from the source. It failed on a retrieval about the four parameters of must, the answer was in the original lesson and not in any script, and on June 3 the corpus was rebuilt from the verbatim lesson markdown: about 5,150 chunks, BGE-M3 embeddings, Qdrant.
The question bank came from the course. A parser walks the self-assessment lessons, pairs each question with its official response, keeps the asterisk difficulty, and gives each item an ID like module_2.lesson-5-distillation-theory-saq.q3. 452 questions. No generated questions, by design. The model found a way around that once, which I’ll get to.
The model can’t see the answer until you’ve answered. The drill started in Open WebUI and ended up in qwen-code, an agentic terminal, with the coach exposed as MCP tools. One tool returns the next question without its answer. A second returns the grading key, and the model is only allowed to call it after I’ve typed an answer and a confidence from 0 to 3. A third records the grade. The system prompt is 255 lines, and the parts that earned their place are the ones written after a failure:
You are a relay and a grader, not an author. The questions and the answers are not yours to invent — they come from the tools, and your job is to deliver them faithfully and mark against them. This is non-negotiable: breaking it means drilling Kyle on confident fiction, which is worse than not drilling at all.
If you’re about to type a question no tool handed you, stop: that’s a hallucination.
Your own distilling knowledge is not a source — only the CIBD material is. If the key doesn’t mention it, it isn’t part of the answer.
The grade is the product. Everything downstream rides on it: grade generously and a blindspot gets marked mastered and silently drops out of rotation — the one way this system fails its job. Grade like an examiner, not a friend.
The first rule exists because Qwen invented an entire question about a “thale machine”, which does not exist in distilling or anywhere else, and then cited a lesson subsection for it that also did not exist. The citation rule exists because it would also append section names no tool had given it, and a fabricated citation sends you to a page that isn’t there.
The model changed on day one. Gemma 4 31B was the first backend for the drill and lasted a day; it emitted tool calls as raw text blobs the harness couldn’t parse. Qwen 3.6 27B at Q6_K replaced it, with reasoning turned off. That last flag matters. With the reasoning channel on, Qwen buried the tool calls in hidden reasoning about 63% of the time and emitted empty-content tool calls that broke the loop; about two thirds of turns showed me no feedback at all. With no hidden channel, the answer and the tool calls have to land in visible content, and grading stayed accurate, because the key is provided and no chain of thought is needed to compare an answer against it.
The frontend leaked the answers. Twice. Open WebUI’s autocomplete suggestions rendered the answer to the current question as a suggested reply; I watched it offer “Agave tequilana, confidence 3”. That feature got disabled in the compose file. Then qwen-code, which prints every MCP result verbatim, printed the grading key in the tool panel alongside the question. No prompt wording fixes a rendering choice, so on June 9 the reveal became a separate tool call that doesn’t happen until the answer is in.
The scheduler is not SM-2. Calendar-based spaced repetition is built for months. This was days. The store is tuned for a short, high-stakes run-up: mastery means two consecutive answers at quality 4 or better, the latest with confidence 2 or better. A miss comes back in 7 minutes, an unsure-but-correct in 20 or 40, and mastered items get re-verified at 1, 2 and 4 days, where a miss un-masters them. A blindspot is any answer with quality below 3 and confidence of 2 or more, and it jumps the queue. The whole state is one JSON file, because a database would have been infrastructure for its own sake.
Numbers got their own drill. 120 cloze cards auto-extracted from the Module 2 model answers (Module 2 only; Module 3 never got cards), plus a maths mode that generates fresh values for each equation on every call, with the arithmetic done by a real calculator in Go rather than the model.
What 275 Graded Answers Look Like
The drill log from the three sessions, June 6, 7 and 9, holds 319 graded answers. Forty-four of them don’t count. On the morning of June 7, still in Open WebUI, the model recorded 28 questions under lesson IDs that don’t exist in the bank, with invented lesson names, and graded me on them anyway. That’s the relay-not-author rule failing in the one place the prompt couldn’t reach: the record tool accepted any topic string, so the model made some up. The numbers below are the 275 answers graded against real questions with official keys.
| Graded answers against the bank | 275 |
| Session time, summed across the three sessions | about 16.5 hours |
| Distinct questions touched | 193 |
| Answers graded 4 or 5 | 74 (27%) |
| Answers graded 2 or below | 132 (48%) |
| Confidence stated as 0 or 1 | 177 (64%) |
| Confident-but-wrong blindspots | 20, none outstanding at the end |
| Questions reaching mastery | 7 |
Read that table honestly and it says the drill is mostly a machine for discovering what you don’t know, fast. Nearly half the answers were poor. Only seven questions ever got mastered by the drill’s own criterion. The value wasn’t in the mastery count; it was in the 132 misses, each one graded against the official key with a note about the gap and a short re-teach from the source material. Some of the notes, excerpted from the log:
Critical error: London Dry ABV rule reversed (said ‘above 70%’, actually distilled TO no more than 70%).
Made up “MMFDS” term.
Gave strategic/business answer instead of the operational workflow.
Regression from 2→1. Only recalled “wood variability” headline. Missed all 7 specific factors: […]
qwen-code had auto-extracted a protocol skill from the transcripts after the second session. In the last minutes of the third, it added the line that mattered most for the essays:
“you gave the philosophy but the question wants the method.” This is the single most common failure mode across QM, sensory, and process questions.
That’s the difference between knowing why copper matters and being able to write down what it does to which sulphur compounds, in order, for twenty marks.
The last session ended at 21:30 on June 9. Module 2 was at 11:00 the next morning.
Modules 2 and 3: June 10 and 11
Module 2 was a B. Module 3 was a C, and it’s the module where the drill covered the least ground: about two to three questions per lesson against four to five for Module 2, no numbers cards, and examiners’ reports from the last two Junes that flag process control as “generally not well answered” and warn that “missing calculation steps often led to lost marks”. Miss Brewbird’s description of that paper in her Module 3 video, dozens of equations to memorize and no formula sheet, matches mine. I’ll take the C.
A Fair Criticism
Having passed, I’ll say the thing candidates don’t say before results come out. All three papers lean heavily on memorization, and Module 3 is the sharpest case: dozens of equations, no formula sheet, and the marks are in recalling them rather than in choosing and applying them. As an engineer I find that backwards. In a working distillery the formula is on the wall or in the spreadsheet; the skill is knowing which one applies, what the inputs mean, and whether the answer is plausible. The same goes for the essays, where the model answers reward reproducing a list in the course’s order more than reasoning about a plant.
The blunt version: an exam that becomes trivial with a search engine open is measuring recall, not competence. That’s a fair thing to test some of, but it’s most of what the Diploma tests, and it’s the reason a drill built on retrieval practice moved my grades more than any amount of understanding would have. Take that as a study strategy and as a criticism, both.
If You’re Sitting the Diploma
For the distillers, the parts that carried the most weight, in order:
- The self-assessment questions are the exam. Not literally, the CIBD says they weren’t written with the exam in mind, but they’re the only place the course tells you what a full-marks answer looks like. Drill them from memory before you look. Rate your confidence first. The ones you’re sure about and wrong are the ones that cost you in June.
- Method over philosophy. Every essay is asking for a procedure, a list of factors, a mechanism with steps. Practice producing the list.
- Read the examiner reports. They’re free, they’re recent, and they say the same things every year: answer exactly four essays, don’t spend Section B’s time in Section A, when it says “list” then list, and show every calculation step.
- Listen if you can’t read. Twenty-six hours of lectures fit into a month in a way 800,000 words never would have.
- Module 3 needs the numbers. It’s the one module where the maths will make or break you, and the one where my drill was thinnest. Build the equation sheet you won’t be allowed to bring and learn it.
What Generalizes
The audiobook pipeline, the study guides, and the drill are open source as etude, MIT licensed, under the gallowaysoftware org. It’s a single Go binary with the prompts and workflows embedded, so go install is enough to run it against a directory of lessons. The curriculum-specific surface is a config struct behind CLI flags: subject, program, persona, assessment label, cover prompt, voice. The drill, the grader, and the grading evaluation need only an OpenAI-compatible endpoint; the audio and vision legs still need the local stack under vibe.
The honest caveat is in the repo’s own plan: the full loop has run end to end for one real corpus, and that’s an existence proof, not a testimonial base. The drill’s edge came from grading against the CIBD’s own model answers, and the tool never writes questions or grades from the model’s opinion. If your corpus has no answer keys, you’re back to generation one. That doesn’t make it useless. A textbook with worked answers works. Your own graded homework and notes work, and the quizmaster can iterate on those. The CIBD material was simply the best possible case: a professional body’s curriculum with hundreds of official questions and full model responses attached.
One more measurement, because grading is the one place a model decides a fact about you. The repo ships a golden-set harness for the grader, and on it a 35B Qwen at Q4 passes with thinking enabled (91.3% of grades within one point of the human grade) and fails with thinking disabled (82.6%). A mildly strict grader is safe, because a miss just gets re-drilled. A lenient one is the failure to rule out, because blindspots silently graduate. Qualify your grader before you trust it with weeks of study.
TL;DR
On one RTX 5090, a local Gemma 3 described 1,049 diagrams and a local Qwen 3.6 27B wrote 26 hours of lectures, built 106,000 words of study guides, and coached the drill that graded 275 of my answers against the CIBD’s own keys, with a Go pipeline sequencing all of it and a 255-line system prompt keeping the model honest. Module 1 was passed on the lectures and the early guides, before the drill existed. The drill was built in the three days after it and used for the four days before Modules 2 and 3. The standing advice is one module a year. B, B, C, in one June, from a basement on Prince Edward Island. The certificate arrives in a few weeks. The tools are on GitHub.