Changes from the source
~ 139 min reading
This web edition transcribes Dr Neave’s prose verbatim. Typography, whitespace, and punctuation have been normalised for the web, scanned figures have been re-extracted, and internal cross-references have been turned into hyperlinks — but his words, examples, and sequencing are intact.
There are two areas where the adaptation to the web has made material changes to the source. They are listed below, in plain terms, so readers cross-referencing the original PDF know up-front what’s different.
The printed Workbook
Dr Neave’s original course came as two documents: the day chapters (what you’re reading now) and a Workbook — a printable second document with blank writing surfaces for the exercises and activities. The two cross-referenced each other throughout: every Day-chapter page cited a matching Workbook page, and the Workbook provided the space to capture the reader’s responses.
This web edition replaces the Workbook with in-page interactive elements: text boxes for activity responses, a per-page notes-download button that collects your answers into a single file, and interactive widgets for the experiments on Days 2, 3, and 6. As a result, the Workbook no longer exists as a separate artefact.
That change cascaded into several small edits:
- Inline “see Workbook p. N” call-outs throughout the days have been removed, because they pointed at a document that is no longer part of the delivery.
- Workbook page-number suffixes (the
[WB 123]markers paired with Day-chapter references) have been stripped. The Day-chapter page numbers carry the full navigation intent on their own. - Appendix return-navigation parentheticals (“Return to Workbook page X / Day Y page Z”) have been shortened to just the Day-chapter half.
- The front-matter printing and binding guidance — covering how to print the PDF double-sided, which ring-binders to use, and how to interleave the day chapters with the Workbook — has been removed. None of it applies to a Quarto HTML rendering.
Where a reader response originally prompted “write your answer in the Workbook on page N”, it now prompts “write your answer below” and the site captures the response on the page.
Dead external links
The course text links out to several external sites. One domain that Dr Neave’s materials treat as a live resource is no longer online:
deming.org.uk— the UK Deming Transformation Forum’s Learning Store, which sold books and course materials. The domain no longer resolves; the Forum appears to have wound down. Links to this domain now point at the 2012 Wayback Machine snapshot with an inline note that the live site is offline. One book-ordering footnote was de-linked entirely, because pointing readers at a 2012 snapshot to “order the book” would be actively misleading.
A second domain was listed here in error until 2026-09-12. Neave names the New Zealand Organisation for Quality (nzoq.org.nz) as one of four sites hosting the course PDFs, and this edition had transcribed that address as rqoq.org.nz. A dead-link audit then checked the mistranscribed domain, found nothing — because it had never existed — and recorded the mirror as gone, with an editorial note on the Welcome page and an entry here that explained the unfamiliar acronym by naming an organisation that does not exist. www.nzoq.org.nz is live and still hosts the material. The address, the note and this entry were all corrected in the Welcome page’s transcription pass.
All other external links in the course — to Deming-related organisations, YouTube videos, books, and academic resources — were verified and remain live at the time of writing.
The full technical log
Every material departure from the source is recorded below, with PR and commit references, newest first. The log is intended for contributors and for readers cross-referencing the source PDFs who want to know exactly where and when each change landed. The per-entry source files live in docs/deviations/ in the repository.
If you spot something that you think is a material departure and isn’t documented here, please open an issue. Invisible changes are the failure mode this page is here to prevent.
2026-09-25 — Day 8 “Joy in Word”/“Joy in Work” typo corrected
- What —
content/days/day-08/06-major-activity.qmd:171now reads “But does not every extra + allocated to an area contribute to enhanced Joy in Work in that area?” Neave’s PDF prints “Joy in Word”. That is his slip: the same paragraph names “Joy in Work” as the New Climate component in question, and DemDim Chapter 13 is titled “Joy in Work”. No[sic]marker, since the site does not reproduce the error. - Where —
content/days/day-08/06-major-activity.qmd:171. - Source reference —
K.Day.8.11Jan20.pdf, printed page 28 (PDF page 32). - Why — Found during epic #848’s Day 8 emphasis pass (#871). Neave’s intent is unambiguous, so under the deviations-log README this is a mechanical correction. Per #831, a typo fix is kept without
[sic]and always logged. - Decided in — Lee’s review of PR #872 (2026-09-25): “should be corrected, with a deviations log”.
- Landed in — PR #872.
2026-09-25 — Day 3’s “over to you” paragraph restored in adapted form
- What — Neave’s paragraph handing Rule 2 over to the reader was missing from the site. It is restored without the parts the interactive has made untrue. The source reads: “OK, over to you—throw your own dice from now on! Continue the experiment through a total of up to 40 stages. Have patience—as mentioned earlier, this is by far the trickiest of all the four strategies to carry out: you’ll be able to work through the other three much more quickly. (Keep an eye on my timings though: if you get short of time then be content with fewer stages.)” The site now reads: “OK, over to you—continue the experiment through a total of up to 40 stages. (Keep an eye on my timings though: if you get short of time then be content with fewer stages.)”
- Where —
content/days/day-03/11-the-first-two-rules-of-the-funnel.qmd, below the instruction that introduces the Rule 2 interactive. - Source reference —
F.Day.3.13Jan20.pdf, printed page 42 (PDF page 46). - Why — The interactive generates the reader’s dice from Stage 6 onward, and it makes all four Rules equally quick to work through. “Throw your own dice” and “by far the trickiest of all the four strategies” would both be false on the site. The rest of the paragraph still holds, and without it the page never hands the experiment over to the reader.
- Decided in — #831 (2026-09-25), which settles Wave 2 Day 3 finding
D3-45from #830. - Landed in — PR #868.
2026-09-22 — Three Optional Extras source slips sanctioned
- What — Wave 2’s Optional Extras pass confirmed three places where the site departs from Neave’s printed words because the printed words are wrong. All three corrections are kept, not reverted, and no
[sic]marker is added:1.28→1.128, four times on one page. Printed page 62 gives the conversion factor h for n = 2 as1.28in four separate sentences. The constant is1.128, and Neave himself prints1.128elsewhere in this same appendix (printed pages 57 and 65), so page 62 carries a repeated slip rather than a different claim. The site has always shown1.128.- “guides you to start looking”. Printed page 72 reads “is a signal that guides you start looking for a special cause”, dropping the infinitive to. The site supplies it.
- “but becomes increasingly unsymmetric”. Printed page 92 reads “but become increasingly unsymmetric” against the singular subject The binomial distribution. The site agrees the verb.
- Where —
content/appendix/optional-extras/05-part-e-normality.qmd(item 1, at every occurrence in that chapter);content/appendix/optional-extras/06-part-f-technical.qmd(items 2 and 3). No file was changed by this entry — all three corrections were already present on the site and simply unlogged. - Source reference —
S.Optional.Extras.09Jul21.pdf, printed pages 62, 72 and 92 (PDF pages 68, 78 and 98). Page 62 was read as a page image during adjudication, which is how the four1.28occurrences were confirmed againstpdftotextoutput. - Why — Each slip has one plausible intended reading, and item 1 is a numerical constant a reader might otherwise carry into their own arithmetic. Under the rule settled in #831, every typo correction gets an entry even when it is obvious, so that anyone checking the site against the PDF finds each changed character accounted for.
- Decided in — Wave 2 Optional Extras adjudication (#843, 2026-09-22), findings
OE-102,OE-06andOE-87.OE-06andOE-87were decided leave as-is, log it;OE-102was decided agree, raise separately with no content change. - Landed in — PR #844.
2026-09-22 — Three Day 3 emphasis differences checked and kept
- What — Day 3’s emphasis pass restored 188 of Neave’s emphasis runs. Three differences were read against the page images and deliberately left as the site has them:
- “Variation is indeed the enemy of quality.” The site sets the whole closing line bold-italic. The source sets it bold-italic except for the word “of”, which is bold upright — almost certainly a slip in the typesetting rather than a distinction Neave intended. Reproducing it would print
***Variation is indeed the enemy*** **of** ***quality***. - “all your Rule 4 outcomes” in the Rules 3 and 4 Major Activity. The source sets “outcome” in bold red, where every other occurrence of the word in that activity is plain red — so the bold is carrying a distinction the colour is not. The site reproduces none of Neave’s funnel/marble/outcome colour-coding, so the bold would arrive without the red around it, and the word stays plain until that question is settled.
- Deming’s heading “Faulty inspection caused by fear” is bold blue and upright in the source; the site sets it bold italic. This is the site-wide convention of italicising Deming’s blue text, not a Day 3 decision — it is recorded here because it is the third of the three emphasis differences a reader comparing Day 3 against the PDF will find.
- “Variation is indeed the enemy of quality.” The site sets the whole closing line bold-italic. The source sets it bold-italic except for the word “of”, which is bold upright — almost certainly a slip in the typesetting rather than a distinction Neave intended. Reproducing it would print
- Where —
content/days/day-03/01-variation-the-enemy-of-quality.qmd(item 1);content/days/day-03/12-rules-3-and-4-of-the-funnel.qmd(item 2);content/days/day-03/07-a-favourite-example.qmd(item 3). - Source reference —
F.Day.3.13Jan20.pdf, printed pages 1, 53 and 25 (PDF pages 5, 57 and 29). - Why —
pdftotextdiscards emphasis, so these are claims only the page image can settle, and #831’s rule applies for the same reason it applies to typo corrections: a reader checking the site against the PDF should find every difference accounted for rather than have to guess whether it was noticed. Item 2 is the one lost runworkflow/validation/emphasis/day-03.ymlstill reports, and items 1 and 3 are the two swapped runs; the record is what says they are decisions rather than misses. - Decided in — #849, cards
E3-C01,E3-F19andE3-C02inworkflow/validation/adjudications/day-03-emphasis.json. Colour-only emphasis is out of scope per #846. - Landed in — PR #851.
2026-09-19 — Four Day 3 typos sanctioned retroactively
- What — At some undetermined point the site silently corrected four one-word typos in Neave’s Day 3 text, and none of the corrections was logged. All four are kept, not reverted, and no
[sic]marker is added:- “measures variation in a completely different way”. The PDF prints “measures variation is a completely different way”.
- “there’s a lot of it!”. The PDF prints “there’s a lot if it!” in bold italic (confirmed on the page image).
- “to put it mildly”. The PDF prints “to put in mildly”.
- “Just in case you really cannot find any dice”. The PDF prints a stray capital: “Just In case”.
- Where —
content/days/day-03/05-how-do-we-compute-control-limits.qmd(items 1 and 2);content/days/day-03/10-introduction-to-the-funnel-experiment.qmd(items 3 and 4). - Source reference —
F.Day.3.13Jan20.pdf, printed pages 14, 16, 35 and 37 (PDF pages 18, 20, 39 and 41). - Why — Each slip has only one plausible intended reading. Earlier versions of this log’s rules called corrections like these mechanical and exempted them, but in practice the typo corrections found since Day 7 were logged anyway. #831 makes that practice the rule: every typo correction gets an entry, so that anyone checking the site against the PDF finds each changed word accounted for. These four were first adjudicated before that decision (three were rejected for logging and one was left for discussion), so they are logged here under the settled rule.
- Decided in — #831 (2026-09-19), which settles Wave 2 Day 3 findings
D3-11,D3-12,D3-27andD3-28from #830. - Landed in — PR #838.
2026-09-19 — Balaji Reddie appendix “needed to regulated” typo sanctioned retroactively
- What — The site reads “the low-density lipoprotein needed to be regulated, not destroyed”. The source drops a word and prints “needed to regulated”. At some undetermined point the site silently added “be”, and the change was never logged. The correction is kept, with no
[sic]marker. - Where —
content/appendix/contributions-balaji-reddie/01-prelude-a-system.qmd, Prelude A. - Source reference —
Q.Contributions.from.Balaji.Reddie.11Sep21.pdf, printed page 6 (PDF page 10). - Why — The intended reading is unambiguous. The text is Balaji Reddie’s contribution, not Neave’s prose, so reproducing the slip would put a transcription error in a named contributor’s mouth. Under the rule settled in #831, every typo correction gets an entry even when it is obvious. It is logged on the same basis as the four Day 3 typos.
- Decided in — #831 (2026-09-19), which settles Wave 2 Balaji Reddie finding
S-02from #833. That finding was waiting on this policy. - Landed in — PR #838.
2026-09-19 — Five main-Appendix typos sanctioned retroactively
- What — At some undetermined point the site silently corrected five slips in Neave’s main Appendix, and none of the corrections was logged. All five are kept, not reverted, and no
[sic]marker is added:- Day 2: “Have you forgotten?””. The PDF never closes the quotation.
- Day 2: “focusing action on “getting the best people”;”. The PDF never closes the quotation.
- Day 4: “(Return to Day 4 page 5.))”. The PDF opens the pointer with a parenthesis and closes it with a square bracket.
- Optional Extras: “if a process having “six-sigma” quality is properly centred”. The PDF repeats a word: “quality process is properly centred”.
- Optional Extras: “from whom I’ve learned so much”. The PDF prints “I’ve have learned”.
- Where —
content/appendix/02-day-2.qmd(items 1 and 2);content/appendix/04-day-4.qmd(item 3);content/appendix/10-optional-extras.qmd(items 4 and 5). - Source reference —
P.Appendix.09Feb22.pdf, printed pages 8, 13, 22, 47 and 48 (PDF pages 12, 17, 26, 51 and 52). - Why — Each slip has only one plausible intended reading. Under the rule settled in #831, every typo correction gets an entry even when it is obvious, so that anyone checking the site against the PDF finds each changed character accounted for. Logged on the same basis as the four Day 3 typos.
- Decided in — #831 (2026-09-19), applied to Wave 2 main-Appendix findings
S-03,S-04,S-07,S-12andS-13from #839. - Landed in — PR #841.
2026-09-18 — Restore Day 3’s Rule 2 walkthrough with R-generated track diagrams
- What — Restored the four paragraphs of printed pages 39–40 that the site had dropped between “…putting the funnel at what would appear to be the ‘obvious’ position, i.e. 30” and the
Rule 2 of the Funnel (Ford's First Strategy)heading, and drew the four accompanying track diagrams withfunnel_track_plot()rather than reproducing Neave’s bitmaps: funnel at 30 with no marble; funnel at 30 with the marble under it (dice-score 7); funnel at 30 with the marble at 33 (dice-score 10); and the marble still at 33 with the funnel moved left to 27. - Where —
content/days/day-03/11-the-first-two-rules-of-the-funnel.qmd(four new R chunksfunnel-rule2-start,funnel-rule2-on-target,funnel-rule2-off-targetandfunnel-rule2-funnel-moved, each with a<details>long description). - Source reference — Neave Day 3 pages 39–40: the dice-score/marble-position table, the colour key, and the Rule 2 walkthrough from the first throw through the first compensating move of the funnel.
- Why — This is the passage that explains what Rule 2 actually does, and without it the chapter jumps from “put the funnel at 30” straight to a heading, leaving a dangling colon and no account of why the funnel then moves to 27. The 2026-05-27 entry that restored two of this chapter’s figures explicitly set aside Neave’s “static intermediate snapshots” on the grounds that the OJS interactive already walks the reader through all 40 stages. That reasoning holds for the book-keeping stages — and those stay omitted, cleared as
N-06in the Day 3 adjudication — but not for these four, which the prose being restored describes sentence by sentence. Drawing them with the existing helper rather than cropping the source keeps them consistent with the chapter’s other figures and with the dark-mode pipeline; Neave’s own versions show a narrower 25–35 slice of the track, and the site’s shorthand is the full 20–40 track throughout. - Implementation note — Neave colours the funnel blue, the dice-score brown and the marble red throughout pages 39 onward, and the colour key that says so is restored in the same pass (finding
D3-43). Carrying that colour-coding through the rest of the chapter’s prose is not done here: emphasis and typography for Day 3 are held back for their own record, per #825. The CSS gained a.fe-diceclass for the brown, and.fe-marblewas repointed from brown to the outcome red so that the restored key does not contradict itself. - Decided in — Finding
D3-38inworkflow/validation/adjudications/day-03.json, issue #830 under epic #734. - Landed in — PR #832.
2026-09-17 — Day 2’s reference to the note on the reverse of its ID page has nothing to point at
- What — Neave’s small-print note in “A brief overview” opens “Referring back to my comment on the reverse of today’s ID page, the distortion was particularly bad on this recruitment advertisement.” The note is kept word for word, but the page it refers back to is not on the site: Day 2’s ID page and the NB on its reverse (about older scanned images looking distorted on some screens) are PDF front matter, which the web edition does not reproduce. A reader therefore meets a reference to a comment they have not seen. No editorial bracket is added.
- Where —
content/days/day-02/03-a-brief-overview.qmd:30(A Brief Overview, below the recruitment advertisement). - Source reference —
E.Day.2.12Oct21.pdf: the note is on printed page 9 (PDF page 13); the comment it refers to is on the reverse of the ID page (PDF page 2, unnumbered). - Why — The NB is about viewing PDF scans in Adobe Acrobat Reader, which does not apply to the site’s re-created and re-extracted images, so reproducing it would add a page of advice about a problem the reader does not have. Rewording Neave’s note to remove the reference would be a larger departure than recording the gap.
- Decided in — Wave 2 Day 2 adjudication, #822 (2026-09-17): Lee’s note on
S-02inworkflow/validation/adjudications/day-02.jsonwas “a deviation entry recording that the ID-page note is omitted”. - Landed in — PR #828.
2026-09-13 — Day 12 “temporally”/“temporarily” typo sanctioned retroactively
- What —
content/days/day-12/02-your-radar-diagram.qmd:19reads “it will make life easier if you temporarily detach that page”. Neave’s own PDF prints “temporally” (relating to time), where the sense is plainly “temporarily”. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “temporarily” rather than reverting to the literal source typo. No[sic]marker, since the site is not reproducing the original error. - Where —
content/days/day-12/02-your-radar-diagram.qmd:19(Activity 12–a, Part 1). - Source reference —
O.Day.12.16Feb22.pdf, printed page 2 (PDF page 6). - Why — Epic #734’s Wave 2 pass over Day 12 (#817) surfaced this as a flagged sentence (
D12-03). Neave’s intent is unambiguous, so it is the kind of correction the log classifies as mechanical — but it predates any record of the decision, and the epic’s convention since Day 7 is to log such corrections retroactively rather than leave them unrecorded (Day 7 “religious”, Day 8 “echos”/“innovaton”, Day 9 “Zeebruge”, Day 11 “syppose”/“Mazlow’s”). - Decided in — Wave 2 Day 12 adjudication, #817 (2026-09-13): Lee’s note on
D12-03was “keep the correction and log it retroactively”. - Landed in — PR #820.
2026-09-13 — Day 12 “all of fourth section” corrected to “all of the fourth section”
- What —
content/days/day-12/04-but-what-can-i-do.qmd:72now reads “I shall ask you first to read through both the rest of this section and all of the fourth section since these levels do not have strict boundaries.” Neave’s PDF prints “all of fourth section”, dropping the article; the site had reproduced the slip. The missing “the” is supplied, with no[sic]or bracket marker. - Where —
content/days/day-12/04-but-what-can-i-do.qmd:72(Section 3, “But what can I do?”). - Source reference —
O.Day.12.16Feb22.pdf, printed page 12 (PDF page 16). - Why — Epic #734’s convention, settled in the
indexpass (#811), is that an unambiguous mechanical slip in Neave’s text is corrected and logged rather than preserved. This one is a missing word rather than a misspelling, so it was raised for a decision instead of being assumed (D12-22inworkflow/validation/adjudications/day-12.json). - Decided in — Wave 2 Day 12 adjudication, #817 (2026-09-13): Lee’s note on
D12-22was “correct it and log”. - Landed in — PR #820.
2026-09-12 — Two Welcome-page typos in Neave’s endorsements sanctioned retroactively
- What — Two words in the ENDORSEMENTS section had already been silently corrected against the source at some undetermined point, with no deviations-log entry recording either. Both corrections are kept rather than reverted:
welcome.qmd— Mitch Beedie’s endorsement reads “as well as many others”. Neave’s PDF prints “as well as many other.”welcome.qmd— Fiona Wilkie’s attribution reads “formerly of the Symphony Housing Group”. Neave’s PDF prints “formally of the Symphony Housing Group”.
- Where —
welcome.qmd, ENDORSEMENTS section. - Source reference —
WELCOME-BOOKLET-(Aug21b).pdf, printed pages 7 and 8, both confirmed against the page images. - Why — Both are unambiguous slips in the printed text with a single obviously intended reading, which the deviations-log README classifies as mechanical. Neither is Neave’s own prose: they sit inside endorsements written by named third parties, where reproducing a typesetting slip serves nobody and risks reading as a quotation error attributable to the endorser. No
[sic]marker was added, since the site is not reproducing the original error verbatim. Logged retroactively rather than left unrecorded a second time, following Day 7’s “religious”/“religiously”, Day 8’s “echos”/“innovaton”, Day 9’s “Zeebruge” and Day 11’s “syppose”/“Mazlow’s” precedents. - Decided in — Wave 2 Welcome adjudication pass, #809 (2026-09-12): Lee accepted
W-26. The second correction (W-33) was identified after the decision round and is logged on the same basis, having changed no course text. - Landed in — PR #810.
2026-09-12 — A live PDF host was reported as dead, and its acronym explained by an invented organisation
- What — Neave’s Welcome booklet (printed p6) names four sites hosting the 12 Days to Deming PDFs, the last being
www.nzoq.org.nz— the New Zealand Organisation for Quality, the expansion he gives in the same parenthesis. This edition had transcribed that address aswww.rqoq.org.nz. Three consequences followed, all now corrected:welcome.qmdcarried the wrong address, de-linked, with an editorial note reading “this domain is no longer online and no archived snapshot is available”. The address is restored, linked, and the note removed.- The public Changes from the source page listed
rqoq.org.nzamong the dead external links and glossed it as “the Royal Quality Organisation of Queensland” — an organisation that does not exist, invented to rationalise the unfamiliar acronym. That bullet is withdrawn and replaced with an account of what actually happened. 2026-04-23-dead-external-links-to-deming-org-uk-and-rqoq-org-nz.mdrecorded the de-linking as a deliberate editorial decision. It is renamed and amended; itsdeming.org.ukhalf is unaffected and stands.
- Where —
welcome.qmd,changes-from-source.qmd,docs/deviations/2026-04-23-dead-external-links-to-deming-org-uk.md. - Source reference —
WELCOME-BOOKLET-(Aug21b).pdf, printed p6, “12 Days to Deming ‘HOSTS’”: “All of the 12 Days to Deming PDF files as listed above may be viewed at, and downloaded from, any of the websites www.spcpress.com, www.theuic.com/deming, www.sergentresults.com/12-days-to-deming and, most recently, www.nzoq.org.nz (the New Zealand Organisation for Quality).” - Why — This is logged as a material departure rather than a silent typo fix because the mistranscription did not stay a typo. A dead-link audit (#239, PR #242) checked the transcribed domain, found it unresolvable with zero Wayback captures — because it had never existed — and reasonably concluded the mirror had died. For five months the site therefore told readers that one of Neave’s four official hosts was gone, and the deviations log documented that as an intentional decision.
https://www.nzoq.org.nzreturns HTTP 200 andhttps://www.nzoq.org.nz/12-days-to-demingstill serves the PDFs; the repo’s ownREADME.mdandabout-this-edition.qmdhad the correct URL throughout, describing NZOQ as “the upstream source of record”, so the site contradicted itself. Recording the withdrawal matters as much as the fix: a reader who saw the old page was told something false about where to obtain Neave’s material. - Decided in — #809 adjudication findings
W-01,W-18andW-32(2026-09-12), all accepted. - Landed in — PR #810.
2026-09-12 — Restore Neave’s guidance on the timing indications, adapted to the web edition
- What — Restored two of the three sentences that
2026-04-28-remove-decorative-clock-icons-and-the-welcome-page-paragraph.mdremoved fromindex.qmd, and replaced the third with a web-native equivalent written in Neave’s own first person. The paragraph on printed Welcome page 4 now reads “… a red, white and blue box that you will not be able to miss! Each chapter opens with an indication of the time I have allowed for it. Again, treat these indications as rough guides rather than instructions. I believe they will help you to pace yourself appropriately through the reading and particularly when carrying out the activities. As indicated above, Day 1 is a little different …” The source’s first sentence — “Little clock icons such as those I’m showing you against this paragraph will appear both on the opening page for each day …” — stays removed, since the icons it points at do not exist in this edition. - Where —
index.qmd:132(“Time management” → “Detailed guidance”). - Source reference —
A.PLEASE.START.HERE.08Feb22.pdf, PDF page 12 (printed Welcome page 4). Confirmed on the page image, which shows the four clock faces in the margins beside this paragraph. - Why — Epic #734’s Wave 2 pass over
index.qmd(#811, findingI-08) found that the 2026-04-28 excision over-removed against its own stated rationale. Only the first of the three sentences depends on the clock icons; the other two describe how to treat the timings. That entry’s own reasoning was that “the chapter-top reading-time indicator (filters/reading-time.lua) already conveys actionable pacing” — and it does, rendering~ N min reading · ~ M min at Neave's pace, whereMis thesession_minutesfront-matter field carried on 44 chapters and derived from the very clocks that were removed. So the mechanism survived the removal and only Neave’s guidance on how to read it was lost, leaving the site’s timing indications explained nowhere at all. Restoring the guidance closes that gap without reintroducing the icons. - Decided in — Wave 2
indexadjudication pass, #811 (2026-09-12): Lee acceptedI-08, with the note that the substituted sentence “should be written in the first [person] (i.e. as if from Neave), or else formatted as an editorial note” — hence “the time I have allowed for it” rather than the third-person phrasing originally proposed. - Landed in — PR #814.
- Related — Amends
2026-04-28-remove-decorative-clock-icons-and-the-welcome-page-paragraph.md(#286 / PR #288), which stands as the record for the icons themselves. The stalecreate_clockpattern that entry left inworkflow/PATTERNS.mdis #812.
2026-09-12 — Revert the Preface and “Active learning” to Neave’s own punctuation
- What — Reverted 16 punctuation changes in
index.qmdthat departed from the source, all confined to the Preface and the “Active learning” section:- Punctuation moved back outside the closing quotation mark (3):
“distance-learning.”→“distance-learning”.,“prep,”→“prep”,,“active learning.”→“active learning”. - Abbreviations re-pointed as Neave writes them (5):
etc.→etc,i.e.,→i.e.,e.g.,→e.g.,homework, etc.,→homework etc,,it—i.e.,→it—i.e. - Six inserted commas removed:
Instead,→Instead,By the end of 2012,→2012,eight years,→years,Engineering,→Engineering(an Oxford comma inside Neave’s own list),in active learning,→learning,On other occasions,→occasions,most of the time,→time - A hyphen restored:
subject matter→subject-matterAlso restored two lost italic runs on the course title (*12 Days to Deming*,index.qmd:29and:37) and two commas dropped from a parenthetical (“will grow to value, and gain from, that same wisdom”,:37).
- Punctuation moved back outside the closing quotation mark (3):
- Where —
index.qmd:19,:27,:29,:33,:37,:43,:45,:47,:49,:51. - Source reference —
A.PLEASE.START.HERE.08Feb22.pdf, PDF pages 7–10 (printed Preface pp. 1–2 and Welcome pp. 1–2). Every change confirmed on the page images. - Why — Epic #734’s Wave 2 pass over
index.qmd(#811, findingsI-01,I-03toI-07,I-09,I-10) found that this file’s first two sections had been copy-edited and the other seven had not. A word-level diff of Time management, Self-study, the “Overture”, the Technophobes section, “Out-of-hours” work, Twelve Days? and The prescribed text against the source returns nothing but correct italics.AGENTS.mdrequires exact transcription, and the site’s own corpus already follows Neave:i.e.appears 200 times againsti.e.,5, ande.g.72 times againste.g.,2 — four of those seven corpus-wide outliers were in this one section. So the re-punctuation departed from the source and from the site’s practice everywhere else. This entry records the reversion because the changes were themselves an unlogged departure; it introduces no new deviation. - Decided in — Wave 2
indexadjudication pass, #811 (2026-09-12): Lee accepted all eight findings. - Landed in — PR #814.
- Related — One further reversion of the same kind, outside these two sections, landed in the same pass:
index.qmd:302had “inserted a couple of words into a statement from the narrator, Lloyd Dobyns, in the historically important TV documentary” where the source has “the statement” and punctuates the title with a colon (findingI-23, PDF page 19 / printed Welcome page 11). It is recorded here rather than as its own entry because it is the same act — restoring Neave’s wording — and, like the changes above, it corrects an unlogged departure rather than creating one. It is worth noting how it was found: it sits inside the “Page references and call-outs” section, whose rewrite is documented by #212 / PR #245, and the pass initially cleared the whole section on that basis. The rewrite had in fact preserved this sentence verbatim, so the clear was drawn too wide; the post-fix validator re-run caught it at 98%, the highest-scoring flag left on the pass.
2026-09-12 — index.qmd “justify”/“justifies” typo sanctioned retroactively
- What —
index.qmd:37reads “I hope so much that the context in which I have used his words there and throughout the course justifies the extraordinary confidence and trust that he showed in me.” Neave’s own PDF prints “justify” — a subject–verb disagreement, singular subject (the context) with a plural verb. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “justifies” rather than reverting to the literal source error. No[sic]marker was added, since the site is not reproducing the original error verbatim. - Where —
index.qmd:37(Preface, final paragraph). - Source reference —
A.PLEASE.START.HERE.08Feb22.pdf, PDF page 8 (printed Preface page 2). Confirmed on the page image, not frompdftotextalone. - Why — Epic #734’s Wave 2 pass over
index.qmd(#811) surfaced this as findingI-02. A grammatical slip with one unambiguous correction is the kind the deviations-log README classifies as mechanical, but it predates the log with no record of the decision anywhere, so it is logged retroactively rather than left unrecorded a second time — same as Day 7’s “religious”/“religiously”, Day 8’s “echos”/“innovaton”, Day 9’s “Zeebruge”/“compliment” and Day 11’s “syppose”/“Mazlow’s” precedents. - Decided in — Wave 2
indexadjudication pass, #811 (2026-09-12): Lee acceptedI-02, “keep the correction and log it”. - Landed in — PR #814.
2026-09-12 — index.qmd “Immediately” capitalisation typo sanctioned
- What —
index.qmd:219now reads “This outline has already been mentioned immediately beneath The”Overture” on the previous page.” Neave’s own PDF prints “Immediately” with a stray mid-sentence capital. The site had transcribed the capital faithfully. Decision: correct it to lower case. No[sic]marker was added. - Where —
index.qmd:219(“The”Overture”” section, under Outline of the course). - Source reference —
A.PLEASE.START.HERE.08Feb22.pdf, PDF page 14 (printed Welcome page 6). Confirmed on the page image. - Why — Epic #734’s Wave 2 pass over
index.qmd(#811) originally adjudicated this asI-15, confirmed non-defect — correctly transcribed, and deliberately not corrected, on the reasoning that preserving Neave’s own capitalisation is the safer default. Lee overturned that verdict, noting that fix-and-log is the established convention elsewhere in this epic. That is right: a stray capital with one unambiguous correction is the same mechanical class as Day 7’s “religious”, Day 8’s “echos”/“innovaton”, Day 9’s “Zeebruge”/“compliment” and Day 11’s “syppose”/“Mazlow’s”, each of which was corrected and logged rather than preserved. Preserving it here would have made this file the inconsistent one. - Decided in — Wave 2
indexadjudication pass, #811 (2026-09-12): Lee rejected the confirmed non-defect verdict onI-15— “Fix and log - isn’t that the convention elsewhere?” - Landed in — PR #814.
2026-09-12 — Day 9 “Zeebruge”/“Zeebrugge” typo sanctioned retroactively
- What —
content/days/day-09/03-activity-9c-and-organisation-charts.qmd:95reads “(I am reminded of the Zeebrugge Herald of Free Enterprise ferry disaster in 1987, apparently the result of the assistant boatswain being asleep when he should have been closing the bow-door.)” Neave’s own PDF prints “Zeebruge” — a misspelling of the Belgian port. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “Zeebrugge” rather than reverting to the literal source typo. No[sic]marker was added, since the site is not reproducing the original error verbatim. - Where —
content/days/day-09/03-activity-9c-and-organisation-charts.qmd:95. - Source reference —
L.Day.9.15Feb22.pdf, printed page 10 (PDF page 14). - Why — Epic #734’s Wave 2 pass over Day 9 (#795) surfaced this as finding D9-36. A proper noun with an unambiguous correct spelling is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, so it is logged retroactively rather than left unrecorded a second time, same as Day 7’s “religious”/“religiously”, Day 8’s “echos”/“innovaton” and Day 11’s “syppose”/“Mazlow’s” precedents.
- Decided in — Wave 2 Day 9 adjudication pass, #795 (2026-09-11): Lee accepted D9-36, “keep the correction and log it retroactively as a sanctioned typo fix”.
- Landed in — PR #800.
2026-09-12 — Day 9 “compliment”/“complement” typo sanctioned retroactively
- What —
content/days/day-09/05-of-profound-knowledge.qmd:66reads “the danger that you would largely miss the way that the four parts are interdependent and complement each other.” Neave’s own PDF prints “compliment” — the wrong word, not merely a spelling slip, and plainly not what he meant: the sentence is about the four parts of the System of Profound Knowledge completing one another. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “complement” rather than reverting to the literal source word. No[sic]marker was added, since the site is not reproducing the original error verbatim. - Where —
content/days/day-09/05-of-profound-knowledge.qmd:66. - Source reference —
L.Day.9.15Feb22.pdf, printed page 18 (PDF page 22). - Why — Epic #734’s Wave 2 pass over Day 9 (#795) surfaced this as finding D9-37, alongside D9-17 which corrected the italic run in the same sentence. Neave’s intent is unambiguous, so this is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, so it is logged retroactively rather than left unrecorded a second time.
- Decided in — Wave 2 Day 9 adjudication pass, #795 (2026-09-11): Lee accepted D9-37, “keep the correction and log it retroactively as a sanctioned typo fix”.
- Landed in — PR #800.
2026-09-12 — References appendix “(Note that and 0 and 1…)” typo sanctioned retroactively
- What —
content/appendix/11-references-and-sources.qmd:132reads “(Note that 0 and 1 are digits and O and I are capital letters.)” Neave’s own PDF prints “(Note that and 0 and 1 are digits and O and I are capital letters.)” — a stray “and”, almost certainly a half-finished edit. The site had already silently dropped it at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected reading rather than reproducing the literal source slip. No[sic]marker was added, since the site is not reproducing the original error verbatim. - Where —
content/appendix/11-references-and-sources.qmd:132. - Source reference —
R.References.and.Sources.09Feb22.pdf, printed page 4 (PDF page 8). - Why — Epic #734’s Wave 2 pass over the References and Sources appendix (#804) surfaced this as finding R-02, and it was first adjudicated the other way: restore the stray “and” and reproduce the page exactly. That was reversed on review. The sentence is Neave’s own warning that “0 and 1 are digits and O and I are capital letters” — a note about reading his glyphs correctly — and a stray conjunction inside it makes the one sentence on the page whose whole job is precision read as though the site had fumbled it. Reproducing it verbatim buys fidelity at the cost of the sentence’s function. This also keeps the appendix consistent with Day 7’s “religious”/“religiously”, Day 8’s “echos”/“innovaton”, Day 9’s “Zeebruge”/“Zeebrugge” and Day 11’s “syppose”/“Mazlow’s” precedents, all of which kept the correction and logged it retroactively rather than reverting it.
- Decided in — Wave 2 References appendix adjudication pass, #804 (2026-09-12): Lee initially accepted R-02 as “restore Neave’s wording”, then reversed it on review — “keep the correction, log it retroactively as a sanctioned typo”.
- Landed in — PR #806.
2026-09-02 — Day 8 “innovaton”/“innovation” typo sanctioned retroactively
- What —
content/days/day-08/03-innovation.qmd:44reads “What kind of things could be done in your organisation to encourage and enable more innovation?” Neave’s own PDF prints “innovaton” (missing the second “i”) in this one occurrence of the question — the equivalent Joy in Work and Cooperation questions elsewhere in Day 8 don’t drop a letter. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “innovation” rather than reverting to the literal source typo. No[sic]marker was added, since the site is not reproducing the original error verbatim —[sic]denotes “thus in the original” and only applies when quoting the literal (erroneous) source text. - Where —
content/days/day-08/03-innovation.qmd:44. - Source reference —
K.Day.8.11Jan20.pdf, printed page 7 (PDF page 11). - Why — Epic #734’s Wave 2 pass over Day 8 (#783) surfaced this as a flagged sentence. Neave’s intent is unambiguous, so this is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, and Lee asked for it to be logged retroactively rather than left unrecorded a second time, same as Day 7’s “religious”/“religiously” and Day 11’s “syppose”/“Mazlow’s” precedents.
- Decided in — Wave 2 Day 8 adjudication pass, #783 (2026-09-02): Lee’s decision was “keep the correction and log it retroactively.”
- Landed in — PR #785.
2026-09-02 — Day 8 “echos”/“echoes” typo sanctioned retroactively
- What —
content/days/day-08/05-introduction-to-the-major-activity.qmd:43reads “I think you may already have realised how this description contains clear echoes of Gallery Furniture as it was during the 1980s!” Neave’s own PDF prints “echos” — almost certainly his own slip. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “echoes” rather than reverting to the literal source typo. No[sic]marker was added, since the site is not reproducing the original error verbatim —[sic]denotes “thus in the original” and only applies when quoting the literal (erroneous) source text. - Where —
content/days/day-08/05-introduction-to-the-major-activity.qmd:43. - Source reference —
K.Day.8.11Jan20.pdf, printed page 11 (PDF page 15). - Why — Epic #734’s Wave 2 pass over Day 8 (#783) surfaced this as a flagged sentence. Neave’s intent is unambiguous, so this is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, and Lee asked for it to be logged retroactively rather than left unrecorded a second time, same as Day 7’s “religious”/“religiously” and Day 11’s “syppose”/“Mazlow’s” precedents.
- Decided in — Wave 2 Day 8 adjudication pass, #783 (2026-09-02): Lee’s decision was “keep the correction and log it retroactively as a sanctioned typo fix.”
- Landed in — PR #785.
2026-09-01 — Day 7 “religious”/“religiously” typo sanctioned retroactively
- What —
content/days/day-07/04-many-more-true-stories.qmd:40reads “…submit my report as usual (religiously), but the lady was not there.” Neave’s own PDF prints “(religious)” — almost certainly his own slip, since the storyteller uses the correct adverb two sentences earlier (“I religiously submitted this report”). The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “(religiously)” rather than reverting to the literal source typo. No[sic]marker was added, since the site is not reproducing the original error verbatim —[sic]denotes “thus in the original” and only applies when quoting the literal (erroneous) source text. - Where —
content/days/day-07/04-many-more-true-stories.qmd:40. - Source reference —
J.Day.7.14Feb22.pdf, printed page 10 (PDF page 14). - Why — Epic #734’s Wave 2 pass over Day 7 (#778) surfaced this as a flagged sentence. Neave’s intent is unambiguous from the surrounding text, so this is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, and Lee asked for it to be logged retroactively rather than left unrecorded a second time.
- Decided in — Wave 2 Day 7 adjudication pass, #778 (2026-09-01): Lee’s decision was “keep the correction and log it retroactively as a sanctioned typo fix.”
- Landed in — PR #779 (commit
0182bc0).
2026-09-01 — Day 11 “syppose”/“suppose” typo sanctioned retroactively
- What —
content/days/day-11/06-knowledge-of-psychology.qmd:32reads “I suppose it could be for some who do have serious psychological problems.” Neave’s own PDF prints “syppose” — almost certainly his own slip. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “suppose” rather than reverting to the literal source typo. No[sic]marker was added, since the site is not reproducing the original error verbatim —[sic]denotes “thus in the original” and only applies when quoting the literal (erroneous) source text. - Where —
content/days/day-11/06-knowledge-of-psychology.qmd:32. - Source reference —
N.Day.11.18Jan20.pdf, printed page 22 (PDF page 26). - Why — Epic #734’s Wave 2 pass over Day 11 (#780) surfaced this as a flagged sentence. Neave’s intent is unambiguous, so this is the kind of correction the deviations-log README classifies as mechanical — but it predates the log’s existence with no record of the decision anywhere, and Lee asked for it to be logged retroactively rather than left unrecorded a second time, same as Day 7’s “religious”/“religiously” precedent.
- Decided in — Wave 2 Day 11 adjudication pass, #780 (2026-09-01): Lee’s decision was “keep the correction and log it retroactively as a sanctioned typo fix.”
- Landed in — PR #781.
2026-09-01 — Day 11 “Mazlow’s”/“Maslow’s” typo sanctioned retroactively
- What —
content/days/day-11/06-knowledge-of-psychology.qmd:185reads “Some appreciation of Maslow’s well-known Hierarchy of Needs is helpful for understanding this matter.” Neave’s own PDF prints “Mazlow’s” — a misspelling of the psychologist Abraham Maslow. The site had already silently corrected this at some undetermined point, with no deviations-log entry recording it. Decision: keep the corrected “Maslow’s” rather than reverting to the literal source misspelling. No[sic]marker was added, since the site is not reproducing the original error verbatim —[sic]denotes “thus in the original” and only applies when quoting the literal (erroneous) source text. - Where —
content/days/day-11/06-knowledge-of-psychology.qmd:185. - Source reference —
N.Day.11.18Jan20.pdf, printed page 28 (PDF page 32). - Why — Epic #734’s Wave 2 pass over Day 11 (#780) surfaced this as a flagged sentence. Neave’s intent is unambiguous — Abraham Maslow’s Hierarchy of Needs is a well-established reference elsewhere in the course — so this is the kind of correction the deviations-log README classifies as mechanical, but it predates the log’s existence with no record of the decision anywhere. Lee asked for it to be logged retroactively rather than left unrecorded a second time, same as Day 7’s “religious”/“religiously” precedent.
- Decided in — Wave 2 Day 11 adjudication pass, #780 (2026-09-01): Lee’s decision was “keep the correction and log it retroactively as a sanctioned typo fix.”
- Landed in — PR #781.
2026-09-01 — Day 6 Major Activity 6-b: print-layout pointers re-aimed, one sentence dropped
- What — The Major Activity 6-b paragraph restored from Neave’s printed page 18 keeps only its first sentence. Its second sentence — “You will also find it particularly convenient to be able to refer to this table directly (without having to keep turning back) while completing this Major Activity—see page 20.” — is omitted, because “without having to keep turning back” and the pointer to page 20 describe a physical page-turn with no counterpart on a scrolling page. In the same section, Neave’s “the table on the next page” reads “the table on page 19”, linked to that page’s anchor, and his “the single table opposite” reads “the single table below”.
- Where — Major Activity 6-b, the three paragraphs between the Activity’s opening and the scoring table.
- Source reference —
I.Day.6.19Feb22.pdfprinted page 18 (PDF page 22). - Why — The paragraph’s first half is live advice that the following paragraph already depends on: it refers back to “that ‘out-of-hours’ note” with nothing else on the page having introduced it, so dropping the paragraph wholesale left a dangling reference. Its second half is purely about handling paper. Restoring the advice and dropping the page-turn instruction keeps the pedagogy and discards only what the web layout makes untrue. The directional pointers are re-aimed rather than deleted for the same reason: on the site the table genuinely is below, and genuinely is on page 19, so leaving “the table” unqualified made it ambiguous in a paragraph that had just been discussing Mack’s account.
- Decided in — Issue #775, findings D6-20 and D6-21, adjudicated in
workflow/validation/adjudications/day-06.jsonunder epic #734. - Landed in — PR #776.
2026-08-15 — Add a Rule 2 vs Rule 3 “measured from where” comparison figure on Day 3 page 47
- What — Added one new R-generated figure to
content/days/day-03/12-rules-3-and-4-of-the-funnel.qmd, immediately after the<details>block for Rule 3’s move to 32 (Stage 2). It stacks three funnel-track rows — the shared starting state (funnel 27, marble 28), Rule 2’s move to 29 measured from the funnel’s own prior position, and Rule 3’s move to 32 measured from the target — with labelled arrows and a dotted drop-line from the target square on the Rule 3 row. A one-line editorial lead-in in an.aside_calloutdiv introduces the figure; Neave’s transcribed prose is unchanged. - Where —
content/days/day-03/12-rules-3-and-4-of-the-funnel.qmd(new figure between the Rule 3 Stage 2 walkthrough and the Stage 3 paragraph);R/functions/main-functions.R(funnel_track_plot()gained an optionaldrop_lineparameter, andfunnel_rule_comparison_plot()now passes it for its Rule 3 row);tests/testthat/test-funnel-rules.R(new regression coverage fordrop_line). - Source reference — No counterpart in Neave’s PDF. Uses only numbers already stated in the source: the Stage 2 dice-score-8 worked example on Day 3 page 47, where the funnel is at 27, the marble lands at 28, and Rule 3 places the funnel at 32 (
content/days/day-03/12-rules-3-and-4-of-the-funnel.qmd:53-77). - Why — Every existing worked illustration of Rule 2 in the course is the Stage 1 case, where the funnel starts at the target — the one case where Rules 2 and 3 happen to agree (
11-the-first-two-rules-of-the-funnel.qmd:41-43; Neave notes the coincidence himself at12-rules-3-and-4-of-the-funnel.qmd:53). A reader reported being unable to tell the two rules apart as a result. The existing comparison surfaces (13-summary.qmd’s outcome grid, the Optional Extras control charts) compare outcomes, never the mechanism — where the correction is measured from, which is the entire difference between the rules. This figure fills that specific gap using the first stage where the rules diverge (Stage 2), introducing no numbers beyond what Neave already gives. - Decided in — Issue #647, building on the R-side groundwork in issue #646.
- Landed in — PR #651 (commit
f3d04f1).
2026-08-11 — Fix Day 3 Process C seed so Charts C2/C3 actually show out-of-control
- What — Changed the random seed for Process C (Red Beads) in
R/data/day-03-six-processes.Rfromset.seed(88)toset.seed(1170). No other Process C code changed: still 24 paddles for C1, then 18 normal paddles followed by 6 “doubled inspector count” paddles for C2. - Where —
R/data/day-03-six-processes.R(seed only, plus an expanded comment recording the sweep). No.qmdchanges were needed — the prose incontent/days/day-03/09-the-six-processes-revisited.qmdalready stated the exact numeric claim (“the first actual count of red beads when I started doing this happened to be only 4, so Point 43 is at 8”) that the old seed contradicted and the new seed now satisfies. - Source reference — Neave Day 3 pages 19 and 30 (Charts C2 and C3). The prose makes specific, checkable claims about this chart: Chart C2 is one of six charts on page 19 meant to visibly demonstrate an out-of-control process; Chart C3’s caption and body text state “the final five points jump well above the UCL” and that Point 43 “hides” the special cause because its doubled value (8, from a raw count of 4) still falls under the UCL.
- Why — A course participant (Viraj) reported that Charts C2 and C3 didn’t seem to match the surrounding reading material. Reproducing
R/data/day-03-six-processes.Runder the old seed (88) confirmed the report: the UCL computed from Chart C1 was 20.85, and the six doubled points (43–48) were16, 20, 16, 18, 14, 20— none breached it. Chart C2’s own self-computed UCL (20.53) was also never breached (max value 20). Worse, the qmd’s literal “Point 43 is at 8” claim didn’t hold either — under seed 88, Point 43’s raw count was 8 (doubled: 16), not 4/8. The deviations-log entry that introduced seed 88 (2026-05-26-replace-day-3-six-processes-6-2-panel-png-with-an-r-generate.md) asserted the seed was “chosen so each panel reproduces the visual pattern Neave’s prose identifies,” but — unlike Process A’s seed (274), which has a documented sweep against explicit numeric targets — that claim for Process C was never actually verified against the rendered numbers. - Fix method — Swept seeds 1–20000, replaying the exact
set.seed(s); process_C1 <- draw_red_beads(24); process_C2 <- c(draw_red_beads(18), 2L * draw_red_beads(6))sequence for each, filtering for: Point 43’s doubled value stays under the C1-derived UCL (hides, per the prose); Points 44–48 all clearly exceed the C1-derived UCL with a margin (reads as “well above” rather than a marginal breach); all values stay inside the chart’sy_limitsof 0–30. Seed1170was the first candidate that also happened to match the prose’s literal numbers exactly (raw count 4 → doubled 8 at Point 43) and additionally breaches Chart C2’s own self-computed UCL at Points 44–48 (21.59) — a bonus not required by any specific textual claim, but it means the page-19 panel now shows a visible signal too, not just the page-30 extended chart. - Verification — Rendered the C1/C2 panel and the C3 individual chart directly via
ggsave()(bypassing a fullquarto render) and visually confirmed: C1 is flat/stable throughout; C2 stays flat for 18 points then jumps clearly above its own UCL for the final 6; C3 shows the familiar pattern through Point 42, a dip at Point 43 (value 8, just below the centre line), then Points 44–48 well above the UCL — matching the prose word-for-word. - Decided in — #603.
- Landed in — PR #604 (commit
3ff60cb).
2026-08-09 — Add a “What This Course Covers” page, adapted from README.md
- What — A new root page,
what-this-course-covers.qmd, gives readers a scannable audience breakdown (“who this course is for”), a day-by-day structure summary, and a key-topics list. The prose is adapted fromREADME.md’s “Who This Course Is For”, “Course Structure”, and “Key Topics Covered” sections, rewritten for a site reader rather than a GitHub browser — no emoji headings, no repo-oriented “Getting Started”/prerequisites framing, nothing aboutrenvor building locally.README.mditself was trimmed to link to the live page instead of duplicating the copy, so the two can’t drift. - Where — New file
what-this-course-covers.qmdat the project root, added tobook.chaptersin_quarto-en.ymlimmediately afterabout-this-edition.qmd, and enumerated in.pa11yci.json.README.md’s “Who This Course Is For” and “Course Structure” sections were replaced with a link to the page; its separate “Key Topics Covered” list (under “Course Content”) was likewise replaced with a link, since it duplicated the same content. - Source reference — n/a. This content never existed in Neave’s PDFs; it originates entirely in
README.md, itself written for this project’s GitHub audience rather than transcribed from Neave’s source. - Why — Part of the SEO/GEO epic #497:
README.mdcarried the clearest, most keyword-dense positioning copy in the project, but it reached only GitHub visitors — the audience least in need of convincing. The site’s own front matter (welcome.qmd,index.qmd) is Neave’s own preface, kept verbatim, and isn’t the place for this kind of scannable, audience-matching summary. A dedicated page keeps that distinction clean: Neave’s narrative prefaces stay untouched, and the new page is unambiguously Lee’s editorial voice, likeabout-this-edition.qmd. - Decided in — #510, part of epic #497.
- Landed in — PR #574.
2026-08-09 — Add an FAQ page with FAQPage structured data
- What — A new root page,
faq.qmd, answers twelve common reader questions (what the course is, who Deming and Neave were, cost, time commitment, statistics prerequisites, study groups, the Red Bead and funnel experiments, the 14 Points, the System of Profound Knowledge, and the relationship to the printed Workbook) as one H2 per question with a self-contained 2-4 sentence answer. It’s paired withFAQPageJSON-LD (assets/schema/faq-jsonld.html, wired in viainclude-in-header) so the question/answer structure is machine-readable to answer engines, not just visually scannable. - Where — New file
faq.qmdat the project root, added tobook.chaptersin_quarto-en.ymlimmediately afterchanges-from-source.qmd, and enumerated in.pa11yci.json. New fileassets/schema/faq-jsonld.htmlholds the JSON-LD, following the sameinclude-in-headermechanism already used byindex.qmdandassets/schema/course-jsonld.html. The page links into the course proper wherever an existing{#sec-pageN}anchor covers the topic (Day 2’s Red Bead walkthrough, Day 3’s funnel experiment, Days 4-5’s 14 Points, Day 9’s System of Profound Knowledge), and cross-links the existing glossary entry for System of Profound Knowledge. The reciprocal cross-link to the concepts index page (a separate page tracked in #509) is deliberately not added here — that page didn’t exist onmainat the time this PR was built, since it was being developed concurrently in a sibling branch. It’s deferred to a small fast-follow PR once #509 lands, following the precedent set by #510’s implementation PR #574 and its tiny follow-up PR #575. - Source reference — n/a. This content never existed in Neave’s PDFs; the questions and answers originate from the course’s existing site content (
welcome.qmd,index.qmd,about-this-edition.qmd,what-this-course-covers.qmd, and the relevant day chapters), rewritten and condensed for direct extraction rather than transcribed. - Why — Part of the SEO/GEO discoverability epic #497: answer engines cite self-contained, question-shaped statements, but the site’s 658 headings are only ~5% question-shaped, and most of those are
PAUSE FOR THOUGHT/ACTIVITYheadings that pose a question to the reader with no answer on the page — the exact inverse of what an answer engine extracts. Neave’s prose can’t and shouldn’t be reshaped to fix this, but the site already has an established category of Lee-authored editorial pages (about-this-edition.qmd,accessibility.qmd,privacy.qmd,changes-from-source.qmd,what-this-course-covers.qmd) that carry no transcription constraint, and an FAQ page is a natural extension of that category. - Decided in — #508, part of epic #497.
- Landed in — PR #576 (commit
c1636fd).
2026-08-09 — Add a Concepts Index page with DefinedTermSet markup
- What — A new root page,
concepts.qmd, gives readers a navigation aid across 23 Deming concepts (the Funnel Experiment, the 14 Points, tampering, the System of Profound Knowledge, and so on). Each entry is a one-line orientation — deliberately not a full definition — plus a deep link to the chapter where the course actually teaches it, using the existing{#sec-pageN}anchor convention. The page is marked up asDefinedTermSet/DefinedTermJSON-LD via a newassets/schema/concepts-jsonld.html, included only byconcepts.qmd, following the sameinclude-in-headermechanism asassets/schema/course-jsonld.htmlonindex.qmd. - Where — New file
concepts.qmdat the project root, added tobook.chaptersin_quarto-en.ymlimmediately afterprivacy.qmd, and enumerated in.pa11yci.jsonimmediately afterwhat-this-course-covers.html. New schema fileassets/schema/concepts-jsonld.html.content/appendix/glossary.qmdgained a short cross-link sentence pointing to this page, anddocs/glossary-audit.mdgained a note under “Headroom” pointing at it too, so a future reader of the audit understands why the ~10-term cap still stands alongside a much larger page. - Source reference — n/a. This page never existed in Neave’s PDFs; the one-line orientations are Lee’s own editorial summaries, written to point rather than to teach, and the deep links reuse existing course anchors and the seven
<dfn>anchors already present incontent/appendix/glossary.qmd— no new<dfn>markup was added anywhere. - Why — Part of the SEO/GEO epic #497, decided as a follow-on once
docs/glossary-audit.mdconfirmed the appendix glossary’s ~10-term cap should hold: several high-search-volume Deming terms (the funnel experiment, the Joiner Triangle, appreciation for a system) were explicitly rejected from the glossary because a glossary entry for every term Neave introduces “invites readers to look up rather than read.” That pedagogical objection doesn’t apply to a page framed purely as a map: the glossary defines the handful of terms a reader must hold in mind to follow Neave’s argument at the point they first meet them; this index answers “does this course cover X, and where?” for a reader arriving from a search engine who doesn’t yet know the course exists. Different job, different failure mode — so it lives on a separate page rather than expanding the glossary’s cap. - Decided in — #497 (epic), issue #509.
- Landed in — PR #577 (commit
2169ea1).
2026-08-01 — Reword the reading-time indicator to name Neave; surface Day 2’s second clock column only where it changes the number
- What — Two changes to the chapter-top reading-time indicator. (1) The second figure is no longer labelled “recommended”:
~ 7 min reading · ~ 35 min recommendedbecomes~ 7 min reading · ~ 35 min at Neave's pace, with thearia-label/titletooltip expanded from “Estimated reading time and the author’s recommended time…” to “About 7 minutes to read the text. Dr Neave’s course allows about 35 minutes for this section, including reflection and activities.” (2) Added an optionalsession_minutes_stats0:front-matter field, rendering as a parenthetical —~ 12 min reading · ~ 45 min at Neave's pace (~ 30 min on Stats-level 0)— set on exactly two Day 2 chapters. The single-number collapse form (values within ±1 min) and the no-clock-data fallback (~ N min reading [+ activities]) are unchanged, so Days 3–12 render byte-identically to before. - Where —
filters/reading-time.lua(indicator_block();read_session_minutes()generalised toread_minutes_field(meta, key));content/days/day-02/05-the-truth-the-whole-truth-and-nothing-but.qmd(session_minutes_stats0: 30) andcontent/days/day-02/07-some-recollections.qmd(session_minutes_stats0: 90);about-this-edition.qmd(“Reading-time indicator” section rewritten);assets/styles/main.css(text-wrap: prettyon.reading-time, since the longest form now runs ~70 characters);workflow/PATTERNS.mdandassets/templates/chapter-template.qmd(docs);workflow/briefs/day-02-brief.yml(Stats-level 0 computation table added alongside the existing Stats-level 1–3 one);workflow/inter-day-refs.csv(regenerated — front-matter additions shifted line numbers in the Day 2 chapters). - Source reference — Day 2’s pages carry two columns of clock faces, not one: the left column paces readers who self-classified as Stats-level 0 in Neave’s Welcome (point 9), the right column paces Stats-levels 1–3. Both columns were dictated in full from the original book and are recorded under
clock_reads:inworkflow/briefs/day-02-brief.yml— 26 checkpoints for Stats-level 0 (9:15am–4:45pm) and 27 for Stats-level 1–3 (9:00am–5:00pm). Running thesession_minutescomputation over each track separately shows the two agree on 6 of the 8 settable chapters; the entire 30-minute day-length difference sits in05-the-truth-the-whole-truth-and-nothing-but(45 vs 30 min — Stats-level 0 is told to skip the three Technical Aids, page 21: “please now move straight on to page 22”) and07-some-recollections(105 vs 90 min — Stats-level 0 looks the control limits up on Appendix page 8 rather than computing them). - Why — On the wording: a participant in the live cohort asked what the second number meant. “Recommended” names neither who recommends nor why the two figures differ, and the explanation only existed on the About page. Naming Neave puts it in the indicator itself. On Day 2: Neave printed two full pacing tracks and we are surfacing the second one only on the two chapters where it changes the number — that partial representation is the deviation being logged. Rendering both figures on all nine chapters would put a second number on seven pages where it is identical to the first, which is noise rather than fidelity; rendering neither would silently drop one of Neave’s two published tracks, which is what the site did until now. The fixed label “Stats-level 0” is used rather than a per-chapter explanation because the two chapters diverge for genuinely different reasons — one skips content, one does not — so any specific phrasing (“if you skip the Technical Aids”) would be false on the other. Supersedes the wording described in the 2026-04-28
session_minutesentry; that entry’s set/unset reasoning still stands. - Decided in — Issue #471.
- Landed in — PR #473 (commit
95b9bb3).
2026-05-29 — Verified Quarto built-in chrome localizes to French via lang: fr; logged reading-time filter as a remaining i18n gap
- What — Built the FR target locally (
quarto render --profile fr) and inspected the rendered_book/fr/content-fr/welcome.htmlHTML directly. Confirmed thatlang: fr(set by_quarto-fr.yml, landed in PR #399) drives Quarto’s bundled French translations for the entirety of the page chrome:<html lang="fr">, the page<title>(“Bienvenue – 12 Days to Deming”), the sidebar toggle aria-labels (“Basculer la barre latérale”, “Basculer la section”), the search button aria-label (“Recherche”), and every search-result string ("search-no-results-text": "Pas de résultats","search-copy-link-title": "Copier le lien vers la recherche", etc.). No_language-fr.ymloverride was needed for any of these — the gaps listed in #395’s acceptance criteria as candidates for an override file were all already covered by Quarto’s bundled localization at the version pin in CI (Quarto 1.9.37). - Where — No code changes. This file (
docs/deviations/2026-05-29-fr-built-in-chrome-verification-and-i18n-gaps.md) is the only artifact from #395. - Source reference — n/a. Infrastructure verification; nothing in Neave’s source materials is affected.
- Why — #395 was scoped as a verification PR to confirm an architectural assumption from the multilingual ADR (#320): that
lang: frwould do the heavy lifting for chrome localization and any project-specific override file would be small or empty. Confirming this lets downstream work (the switcher #322, pa11y parity #334) treat French chrome as “free” rather than budgeting for translation engineering. - Implementation note — reading-time filter is not localized —
filters/reading-time.luaemits hardcoded English strings (“min reading”, “min recommended”, “+ activities”) and English aria-labels (“Estimated reading time”, “Estimated reading time and the author’s recommended time including reflection and activities”, etc.). The filter does not currently consult document or projectlangmetadata. This is not a Quarto-localizable gap (a Lua filter, not a built-in template), so no_language-fr.ymloverride applies. The gap is invisible on the current FR stub because the stub page is under the filter’sMIN_WORDS = 50threshold — the indicator block isn’t emitted, so no English strings reach the page. Future FR pages with ≥50 words of prose will render the English strings until the filter is taught aboutlang. - Implementation note — chapter-list concatenation discovered, filed as follow-up — During the verification render,
QUARTO_PROFILE=fr quarto inspectshowed that the resolvedproject.renderlist contains all 122 EN pages plus the one FR stub appended at position 94. Quarto’s profile YAML merge does deep-merge with list concatenation onbook.chaptersandbook.appendices, not replacement, which contradicts the design assumption in_quarto-fr.yml(#393) and the architectural decision (#320). The FR build is therefore currently producing a_book/fr/populated with EN content. This does not affect chrome verification — the FR-specific pagecontent-fr/welcome.htmlstill renders with French chrome — but it blocks #396’s CI wiring. Filed as #401 to land before #396. - Implementation note — search aria-label JS patch in
_quarto.ymlis dormant under current Quarto pin —_quarto.yml:218-222contains a JS workaround that forcesaria-label="Search"on.quarto-search-buttonwhen Quarto emits an emptyaria-label="". Inspection of the rendered FR HTML confirms Quarto 1.9.37 already emitsaria-label="Recherche"server-side, so the!s.getAttribute("aria-label")guard fails and the English fallback never fires. The patch can be removed in a future cleanup PR once we’re confident the pin won’t regress, but it is not an active i18n gap today. - Decided in — Issue #395.
- Landed in — PR #402 (commit
9a51ab4).
2026-05-29 — Translation pipeline extracts user-facing R-chunk/helper string literals as a distinct r-string segment kind
- What — Extended the #323 prose extractor so user-facing string LITERALS in R code (chart titles, axis/legend labels, on-canvas annotations, and the default-label arguments of the chart helpers) are extracted as a new, distinct segment kind
r-string, separate fromprose. R code logic is never altered — only the bytes INSIDE a whitelisted label literal become translatable. The identity round-trip remains byte-identical with R strings included, across both the.qmdcorpus and a new.Rhelper corpus (R/functions/). A deliberately TIGHT whitelist is used:ggtitle(<first positional>);labs(title/subtitle/caption/x/y/fill/colour/color = ...);annotate("text", label = ...)(the"text"geom only —annotate("segment"/"point", …)is excluded); and the default values of the helper argumentslsl_label,usl_label,x_title,y_label,x_label,legend_title,percent_label,caption,subtitle,titleinside afunction(...)parameter list. Everything else (file paths, hex colours, factor levels, gt column keys, theme tokens,geom_*aesthetics,tab_optionsstyling values) is left untouched. - Where — Tooling only:
R/translation/code-string-extract.R(new reusable sub-line scanner + intra-line reinjector),R/translation/prose-extract.R(in-chunkr-stringextraction,extract_r_file(),r_corpus(), sub-line-awarereinject_qmd()),R/translation/roundtrip.R(gate now covers the.Rcorpus). No course content, no rendered output, and noR/functions/main-functions.Rsource bytes change. - Source reference — n/a. Translation-infrastructure work; nothing in Neave’s source materials is affected. The literals extracted are the same chart/axis labels Neave’s figures already display.
- Why — Issue #324: the French edition must be able to translate the words shown ON charts/tables, not just prose. Those words live in R code, so the extractor had to learn to reach into R chunks (and the helper defaults) without ever rewriting code logic. The whitelist is conservative by design — a false positive that rewrote a data key or colour would corrupt logic, which is far worse than a missed label (addable in a follow-up). The new sub-line (character-offset) addressing and generalized intra-line reinjection are factored so issue #325 can reuse them for OJS/JS chunks.
- Decided in — Issue #324.
- Landed in — PR #410 (commit
0c4f016).
2026-05-29 — Translation pipeline extracts user-facing UI/ARIA strings from OJS, JS and raw-HTML as distinct ui-string / aria-label segment kinds
- What — Extended the #323 prose + #324 r-string extractor so user-facing INTERFACE strings on three new surfaces become translatable, as two new distinct segment kinds:
ui-string(visible UI text) andaria-label(assistive-technology text). JS/HTML logic and element structure are never altered — only string-literal/attribute-value bytes are touched — and the identity round-trip stays byte-identical across the.qmd,.R, and a NEW.jscorpus (129/129 files). The backtick template-literal tokenizer and a${…}interpolation mask were added so JS interpolations never reach a translator and round-trip exactly. - Whitelist (deliberately tight) —
- OJS chunks (
```{ojs}/```{ojs <name>}): thelabel:andplaceholder:property values ofInputs.textarea/Inputs.text/Inputs.button→ui-string. ThecreateDownloadButton([...], "file.txt")filename argument is NOT extracted (it is a filename, not a label);rows:/numeric properties carry no string literal. - JS files (
assets/scripts/*.js): RHS string literal ofX.textContent = "…"andX.placeholder = "…"→ui-string; the VALUE argument ofsetAttribute("aria-label"|"placeholder"|"title", <literal>)→aria-label/ui-string(gated on the attribute-NAME argument); the first string-literal argument of the live-region announcerannounceFunnelStatus(…)(including the common multi-line-call form, via a cross-line announce-call tracker) →aria-label. - Raw-HTML attributes in
.qmd(structural tag lines that are otherwise skipped): the values ofaria-label→aria-labelandtitle/alt/placeholder→ui-string, scanned BEFORE the line is skipped as structural.
- OJS chunks (
- Deliberately EXCLUDED —
role=,class=,id=,data-*=,aria-controls=,aria-live=,aria-atomic=,aria-expanded=,aria-pressed=,tabindex=,headers=and similar structural/ARIA-token attributes; ARIA role/live token VALUES ("status","polite","true","button"); element-id templates (`track-title-${id}`); CSS class lists ("fe-sr-live visually-hidden"); CSS selectors and event names (querySelector(".fe-status"),addEventListener("click", …)); file paths/filenames; non-literal RHS values (a variable, a call likeformatNet(net)/buildCellLabel(cell), a concatenation — the matcher only fires when a quote/backtick sits flush after the position); equality tests (=== "empty", excluded by an assignment lookbehind); and EMPTY string literals (e.g.cell.textContent = ""to clear a greyed-out cell).<summary>/<button>INNER label text is already captured by #323’s prose path and is not double-handled here. - Backtick +
${…}handling —.tokenize_string_literals()now recognises the JS backtick delimiter (its\-escape scan already closes backtick literals correctly)..mask_code_string()gained ajs_interppattern (\$\{[^}]*\}) ordered BEFORE the existing glue{…}pattern so a${…}is masked as one PUA-sentinel placeholder (never leaving a stray$or exposing live code). The raw segmenttextkeeps the exact interpolation bytes for byte-identical reinjection; themaskedtranslator surface shows only opaque tokens. - SCOPE DECISION — SVG
<title>/<desc>inner text NOT extracted (deliberate) —funnel-experiment.jsbuilds its SVG accessibility text by string concatenation:svg += `<title id="${titleId}">Funnel Experiment Track</title>`;andsvg += `<desc id="${descId}">Track showing positions ${min} to ${max}. ${funnelLabel}</desc>`;. The translatable words sit INSIDE a larger template literal that also contains SVG markup, an interpolatedid, and (for<desc>) further interpolations — there is no clean call/assignment POSITION to whitelist, and the only robust handle would be parsing the SVG markup inside the literal, which is exactly the kind of structural rewriting this pipeline avoids. Extracting the whole literal would put<title id="…">markup on the translator surface and risk corrupting the SVG. These two strings (“Funnel Experiment Track” and “Track showing positions … . …”) are therefore scoped OUT of this pass and remain English. They are decorative/illustrative accessibility text on an interactive funnel widget; a follow-up can add them via a targeted rule or by refactoring the JS to hoist the human text into asetAttribute/textContentposition the existing whitelist already covers. (Two further JS strings — the ternary-branch consts"No stage active."/"Funnel always at"/etc. and thethemeState.textContent = on ? "Dark" : "Light"toggle states — are likewise excluded: they live at ternary positions, not at a whitelistable assignment/call position. Same rationale; same follow-up path.) - Where — Tooling only:
R/translation/code-string-extract.R(backtick tokenizing;${…}mask; OJS/JS/HTML whitelist tables + matcher.ojs_js_literal_kind();.scan_ojs_js_line_literals();.scan_html_attr_values()/.one_literal_at(); cross-line.update_announce_call_context()),R/translation/prose-extract.R(OJS chunk detection + dispatch; raw-HTML attribute scan before the structural skip;extract_js_file();js_corpus(); optionalcontexthint on sub-line segments),R/translation/roundtrip.R(gate now covers the.jscorpus). New test filetests/testthat/test-ui-string-extract.R. No course content, no rendered output, and noassets/scripts/*.jssource bytes change. - Source reference — n/a. Translation-infrastructure work; nothing in Neave’s source materials is affected. The strings extracted are the same input labels, button captions, and accessibility text the interactive widgets already display.
- Why — Issue #325: the French edition must be able to translate the interface (input labels, button text, screen-reader announcements, ARIA labels), not just prose and chart labels. Those strings live in OJS chunks, JS assets, and raw-HTML attributes. The whitelist is conservative by design — a false positive that rewrote an element id, a CSS class, an ARIA role token, or a selector would corrupt the UI, which is far worse than a missed label (addable in a follow-up). The new kinds plus the optional
contexthint give a translator the interface context required by the issue’s AC #1. - Decided in — Issue #325.
- Landed in — PR #411 (commit
6e4153e).
2026-05-28 — Render deviations log inline at site-build time instead of committing a stitched artifact
- What — Removed the committed
docs/deviations-from-source.mdbuild artifact and thescripts/build-deviations-log.Rscript that produced it. The full deviations log is now rendered intochanges-from-source.qmdat site-build time by an R chunk that calls a newdeviations_log_emit()helper. Per-entry source files indocs/deviations/remain the only source of truth, unchanged. - Where — Added
R/functions/deviations-log.R(deviations_log_assemble()+deviations_log_emit()), sourced fromR/setup.R. Added aresults: asisR chunk tochanges-from-source.qmdand rewrote the prose around it (the GitHub-URL link to the old stitched file is gone; readers now see the full log inline on the same page). Deleteddocs/deviations-from-source.mdandscripts/build-deviations-log.R. Addeddocs/deviations-from-source.mdto.gitignoreso a stale local build can’t sneak it back. Updateddocs/deviations/README.mdto describe the new flow. Updated three rationale-pointing comments inR/data/day-03-six-processes.Rand one bullet indocs/glossary-audit.mdto point atdocs/deviations/rather than the removed file. - Source reference — n/a. This change is internal to the project’s contribution workflow; nothing in Neave’s source materials is affected.
- Why — The per-entry split in PR #372 eliminated editorial conflicts on the deviations log but left a textual conflict on the regenerated stitched file. The Wave 1 concurrent-PR fleet (#378–#383) made the cost visible: 4 of 5 PRs paid the mechanical-regen tax on rebase, each forcing a CI re-run (~5 min pa11y long pole). Inlining the render eliminates both the build artifact and the regen step. Tracked in #384.
- Implementation note — chunk uses
results: asis— Quarto’s R chunks default to wrapping printed output in a code block.results: asistells knitr to emitcat()output as raw markdown that Quarto then processes — so per-entry headings, links, and bullets render as themselves rather than as a verbatim block. - Implementation note — heading downshift —
deviations_log_emit()downshifts per-entry##headings to###so they nest under the page’s existing## The full technical logsection instead of colliding with it. The per-entry files on disk are unchanged; the downshift happens in memory at render time. - Implementation note — script removed, not preserved as a thin wrapper — The previous
scripts/build-deviations-log.Rexisted only to write the now-removed stitched artifact. Maintainers who want to inspect the raw stitched markdown cansource("R/functions/deviations-log.R")and calldeviations_log_assemble(downshift_headings = FALSE)from an R session, as documented in the updateddocs/deviations/README.md. - Decided in — Issue #384.
- Landed in — PR #386.
2026-05-28 — Replace Optional Extras Part D CLT-demo exponential PNGs with R-generated figures
- What — Replaced five cropped-PNG figures on Optional Extras Part D pages 53–54 with R/ggplot2 chunks: the exponential parent-distribution PDF (
part-d-p53-exp-pdf.png) and four histograms of the standardised sample mean Z = (X̄ − μ) / (σ / √n) at n = 2, 4, 10 (page 53) and n = 100 (page 54). Completes the Part D CLT-demo conversion started for the uniform and triangular parents in PR #380 under issue #356. - Where —
content/appendix/optional-extras/04-part-d-crash-course.qmd(five inline-image references replaced by R chunks; the orphan PNGs inassets/images/optional-extras/remain on disk per the epic-#309 policy and will be removed in a follow-up PR after production verification). - Source reference — Neave Optional Extras Part D pages 53–54. The page-51 prose introduces the simulation context (“samples were generated 10,000,000 times”) and pages 53–54 contain the five figure captions verbatim reproduced as
fig-capstrings in the new chunks. Neave’s exponential parametrisation is not stated numerically — the figure is a shape illustration — so the choice below derives from the σ = 1 constraint his prose specifies (and which Part E pages 65–67 then explicitly reuse “for ease of comparison with the initial normal version”). - Why — Inherits the rationale of epic #309 and the Optional Extras sub-epic #315. SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the simulation is now reproducible from a fixed seed.
- Parametrisation (σ = 1) — Exponential: rate 1 (
rexp(n, rate = 1)), giving mean μ = 1 and standard deviation σ = 1. This matches the σ = 1 family-wide convention established for the uniform and triangular parents in PR #380. - Simulation parameters —
n_samples = 100000standardised X̄ values per histogram (helper default), withset.seed(357)at the top of each random-draw chunk (one seed per sampling chunk; the PDF chunk is deterministic and carries no seed). Neave used 10,000,000; 100,000 is comfortably enough to make the CLT shape claims visually obvious on a printed/screen page and keeps per-chunk render time well under a second. Larger N produces visually indistinguishable histograms at the printed resolution. - Helper reuse —
clt_demo_plot()— No new helper added. The four sampling-distribution chunks callclt_demo_plot()(added toR/functions/main-functions.Rin PR #379 and landed alongside PR #380) withparent_dist = function(n) rexp(n, rate = 1)andmu = 1,sigma = 1. This is the exact reuse path the helper was designed for and called out in its roxygen docs. - PDF (decorative) chunk — The exponential parent-distribution PDF is drawn as a bespoke shape illustration in the chunk (not via
pdf_family_plot()), matching the structure of the page-52fig-uniform-pdfandfig-tri-pdfchunks introduced in PR #380. The decreasing-exponentialdexp(x, rate = 1)curve is evaluated on a fixed grid and rendered as a thin black outline over a horizontal baseline with no axis ink — Neave’s printed page has no axes. The chunk is deterministic and carries noset.seed()call. - Reviewer-feedback compliance (PRs #377/#378/#379) — PDF chunk is fully deterministic and carries no seed; the four sampling chunks each seed once via
set.seed(357). All random-draw and density calls (rexp,dexp) appear without thestats::prefix to match the rest ofR/functions/main-functions.R. Noapply()introduced — the helper handles the vectorised standardisation internally. - Colour deviations — None. Histogram bars use
CHART_LINE_COLOUR(red) and the N(0, 1) overlay usesCONTROL_LIMIT_COLOUR(blue), both already documented dark-mode-safe tokens. No new colour tokens introduced. - Decided in — Issue #357 under the #315 sub-epic / #309 epic.
- Landed in — PR #383.
2026-05-27 — Replace Day 3 Funnel track PNGs (basic + with-icons) with R-generated figures
- What — Replaced the two cropped-PNG figures
assets/images/day-03/funnel-track-basic.pngandassets/images/day-03/funnel-track-with-icons.pngon Day 3 page 35–36 (Neave’s one-dimensional Funnel Experiment track running 20–40 with target square 30, shown first as an empty track and then with the funnel and marble markers in the worked example) with two R/ggplot2 chunks driven by a singlefunnel_track_plot(funnel_pos, marble_pos)helper. - Where —
R/functions/main-functions.R(addedfunnel_track_plot()immediately afterindividual_process_chart());content/days/day-03/10-introduction-to-the-funnel-experiment.qmd; two PNGs deleted fromassets/images/day-03/;workflow/validation/day-03-manifest.ymlupdated to remove the two figure entries. - Source reference — Neave Day 3 pages 35–36. The page-35 prose introduces the track (“the funnel can be placed at any position on the higher track … the marble can then be dropped through it onto the lower track where it will briefly bounce around and then finish up in one of its squares”) and the page-36 prose explains the icon shorthand (“if the funnel is at position 31 and … the marble bounces around and finishes up at position 33 then I shall show this as …”).
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the same
funnel_track_plot()helper is anticipated to feed the Optional Extras “Rule 1 long/short” track variants under #314f — one helper, multiple call sites. - Implementation note — simplified marker glyphs — Neave’s original PNGs draw a stylised funnel (broad mouth tapering to a stem) and a striped sphere for the marble. The R helper substitutes a blue downward triangle on a short stick (for the funnel) and a small yellow filled circle (for the marble). The pedagogical content — where the funnel was placed and where the marble came to rest — is preserved; the visual quotation of Neave’s particular illustration style is not. The marker glyphs avoid font/icon-package dependencies and render cleanly through svglite without external assets. Track colours (alternating green/yellow with red borders, dark bullseye on square 30) match Neave’s published colourway.
- Decided in — Issue #347 under the #314 parent / #309 epic.
- Landed in — PR #367 (commit
4b82705).
2026-05-27 — Replace Day 3 Funnel dice-sequences PNG with an R-generated figure
- What — Replaced the cropped-PNG figure
assets/images/day-03/funnel-dice-sequences.pngon Day 3 page 37 (Neave’s two pre-recorded dice-throw sequences provided as a fallback for any reader without physical dice) with an R/ggplot2 chunk driven by a newfunnel_dice_sequences_plot()helper. The 35 stages (6–40) are rendered in two horizontal blocks (Stages 6–23 above, Stages 24–40 below), matching Neave’s printed two-block layout. - Where —
R/functions/main-functions.R(addedfunnel_dice_sequences_plot()immediately afterfunnel_track_plot());content/days/day-03/10-introduction-to-the-funnel-experiment.qmd; one PNG deleted fromassets/images/day-03/;workflow/validation/day-03-manifest.ymlupdated to remove the figure entry from chapter 10’s figure list (thefunnel-track-colourful.pngentry stays — that PNG is covered separately by #349). - Source reference — Neave Day 3 page 37. The figure caption in the source reads “Just in case you really cannot find any dice to use then I have provided below a couple of sample sequences of dice-throws for you to choose between and use instead. Note that both of these sequences begin at Stage 6: I’ll be providing the first five stages for you this afternoon when I shall use them for demonstration purposes.” The 70 dice-pair values (35 stages × two sequences) were transcribed directly from the printed table.
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the dice-pair values now live in code where any future correction is a one-line edit rather than a re-crop.
- Implementation note — pair representation chose numeric pairs over Unicode dice glyphs — Issue #348 asked for an initial pass at Unicode dice glyphs (U+2680..U+2685, ⚀⚁⚂⚃⚄⚅) so the table would read as a glyph grid. Those glyphs only ship in specialty symbol fonts (Apple Symbols on macOS, DejaVu Sans on some Linux distros) and rendered as tofu boxes through svglite on the CI Ubuntu image without the right font installed. Adding a font-loading dependency (
showtext/ggimage) for what is fundamentally a fallback figure that the reader can ignore if they have physical dice did not carry its own weight. The helper therefore renders the pairs as comma-separated numeric strings (e.g. “6,4”), which is also Neave’s own choice in the printed PDF — so the alternative is both portable across CI and source-faithful. - Implementation note — chunk uses
fig.width=14(double the project default) — The figure is intentionally wider than the codebase’sfig.width=7full-width convention (documented inR/functions/main-functions.R, lines 16–17) because each block lays out 18 stage-columns of comma-separated dice pairs side-by-side; atfig.width=7the cells become too narrow for the pair text to render legibly without overlap. The wide layout matches Neave’s printed two-block presentation. Recorded here so a future editor doesn’t treat the deviation from the default as an oversight. - Decided in — Issue #348 under the #314 parent / #309 epic.
- Landed in — #369 (commit
5deb899).
2026-05-27 — Replace Optional Extras Part E subgroup illustrations (12 and 40 subgroups) with R-generated figures
- What — Replaced the two cropped-PNG figures on Part E pages 69–70 with R/ggplot2 chunks:
part-e-p69-12-subgroups.png(three stacked histograms of the simulated false-signal probability on an X̄-chart constructed from 12 subgroups of size 2, 4 and 6 respectively, with the textbook target 0.0027 marked in red on each axis) andpart-e-p70-40-subgroups.png(the same three histograms but with 40 subgroups instead of 12). Both chunks are built on a newxbar_false_signal_probs()simulation helper and a siblingxbar_false_signal_panel()plot helper. - Where —
content/appendix/optional-extras/05-part-e-normality.qmd(the two PNG references replaced withfig-part-e-12-subgroupsandfig-part-e-40-subgroupsR chunks);R/functions/main-functions.R(newxbar_false_signal_probs()andxbar_false_signal_panel());tests/testthat/test-distribution-helpers.R(new test cases). The orphan PNGs inassets/images/optional-extras/part-e-p69-12-subgroups.pngandassets/images/optional-extras/part-e-p70-40-subgroups.pngare intentionally left in place per the epic-#309 policy (delete only after the conversion has been verified in production). - Source reference — Neave Optional Extras Part E pages 69 (12-subgroup figure) and 70 (40-subgroup figure). The intro on pages 63–64 (“the second computer simulation”) describes the construction: simulate subgroups from a normal distribution; for each replication, build a standard X̄-chart from the simulated baseline using the conversion factors from Part B (pages 21–22); compute the probability that a subsequent value of X̄ falls outside those limits; collect all probabilities into a histogram. Page 69 prose specifies “12 subgroups of size 4” (extended here to subgroup sizes 2 and 6 as on page 69’s figure), one million replications, x-axis “from zero probability right up to 0.025”; page 70 prose specifies “40 subgroups instead”. Both pages mark 0.0027 in red on each axis.
- Why — Inherits the rationale of epic #309 and the Optional Extras sub-epic #315. SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the simulation is now reproducible from a fixed seed rather than a one-off PDF crop.
- Helper-reuse vs new-design call — Adopted a new pair of helpers rather than reusing the page-66/67 (
pdf_family_plot()and the inline patchwork code from #358) work. The page-67 simulation produces MR̄ ÷ 1.128 estimates of σ from one-at-a-time data (a univariate simulation with a closed-form estimator); pages 69/70 produce X-bar-chart false-signal probabilities from subgrouped data (which require computing X̿ ± A₂ · R̄ and then a normal-tail probability per replication). The two simulations share no compute primitives. The page-67 histograms also share a fixed x-axis from 0 to 2.5 and a subtitle-style label above each panel; the page-69/70 histograms differ on every front (varying x-axis upper bound between 0.020 and 0.025, x-axis tick labels at every 0.005, a red 0.0027 tick below the baseline, a caption-style label under each panel). Forcing those two layouts behind a shared helper would have widened it on every dimension while sharing none of the underlying computation. Two narrow helpers each does one thing. - Parametrisations — Standard X-bar chart construction: with and for respectively (the standard Part B page 20 values). Subgroups drawn from N(0, 1). For each replication the false-signal probability is computed via the closed-form normal-tail formula where the future subgroup mean is N(0, 1/√n).
- Simulation parameters — N = 200,000 replications per
(n, m_subgroups)combination (six simulations in total, three per page), withset.seed(359)(page 69) andset.seed(360)(page 70) before the per-page bundle of three draws. Neave used 1,000,000. 200,000 is enough to make the visual claims of the two pages read obviously — that the page-69 histograms spread well past 0.0027 even at the highest subgroup size, and that the page-70 histograms tighten dramatically when the baseline grows from 12 to 40 — and avoids dragging down per-render Quarto times. Larger N produces visually indistinguishable histograms on a printed page. - Layout deviations from the printed page — Two cosmetic differences:
- The printed figure on page 69 places
0.000to0.020on the axis but extends slightly past0.020(the rightmost label is0.02on the page). The R chunk uses a hard limit ofx_max = 0.020so the axis ends cleanly at 0.020; the long right tails (visible in the printed page as occasional bars past 0.020 on the n = 2 panel) are clipped onto the rightmost bin so the histogram does not under-count the tail. - The 0.0027 red tick on the printed page is a short tick with no surrounding axis ticks. The R chunk includes 0.005-spaced axis ticks (black) underneath the histogram for readability, with the 0.0027 tick rendered in red just below the baseline (linewidth 1.2 to stand out from the slimmer regular ticks).
- The printed figure on page 69 places
- Colour deviations — None new: black axes and white-filled / black-outlined bars matching Neave’s printed page, and
CHART_LINE_COLOUR(the existing project red) for the 0.0027 tick and label. - Decided in — Issue #359 under the #315 sub-epic / #309 epic.
- Landed in — PR #382.
2026-05-27 — Replace Optional Extras Part E PDF panel and MR̄ ÷ 1.128 histograms with R-generated figures
- What — Replaced two cropped-PNG figures on Part E pages 66–67 with R/ggplot2 chunks:
part-e-p66-pdfs.png(the four σ = 1 parent distributions arranged in a 2×2 grid) andpart-e-p67-xbar-histograms.png(four histograms of the estimator MR̄ ÷ 1.128 from simulated baselines of length 12). Both chunks are composed inline withpatchworkrather than via the existingpdf_family_plot()helper because Neave’s printed layout for both pages is a hand-arranged 2×2 with corner labels — not a regular comparable-scale family. - Where —
content/appendix/optional-extras/05-part-e-normality.qmdlines 137 and 145 (PNG references replaced with R chunks);assets/images/optional-extras/part-e-p66-pdfs.pngandassets/images/optional-extras/part-e-p67-xbar-histograms.pngdeleted. - Source reference — Neave Optional Extras Part E pages 66–67. The page-65 prose specifies “each being in a version with σ = 1 for ease of comparison with the initial normal version” for the parent distributions. The page-67 figure caption identifies the estimator as “MR̄ ÷ 1.128” and notes the comparison axes “from 0.0 to 2.5 in every panel”. Neave’s printed page 66 shows the four PDFs in a 2×2 grid where each panel auto-scales to its own peak so the shape diversity is the point; the page-67 histograms are framed by a shared 0.0–2.5 x axis so the spread similarity is the point.
- Why — Inherits the rationale of epic #309 and the Optional Extras sub-epic #315. SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the simulation is now reproducible from a fixed seed rather than a one-off PDF crop. Layout faithfulness took priority over consolidating the work behind a new helper:
pdf_family_plot()’s overlay/stack layouts both assume comparable scales across panels, which is the opposite of what Neave does on page 66. - Parametrisations (all σ = 1) —
- Normal:
dnorm(x, mean = 0, sd = 1). - Uniform: half-width √3 around zero, so
dunif(x, min = -√3, max = √3)— variance is(2 √3)² / 12 = 1. - Triangular (unsymmetric): a right-triangle PDF with mode at the left edge. On
[a, b]with mode ata, variance is(b − a)² / 18; setting variance = 1 givesb − a = 3 √2. Witha = 0,b = 3 √2 ≈ 4.243, mean= √2 ≈ 1.414. The PDF readsf(x) = 2 (b − x) / (b − a)²on[0, b]. Neave does not give numeric(min, mode, max)for this distribution anywhere in the text — only a shape illustration on Part D page 52 — so the shape (right-triangle peaking on the left) is the load-bearing source-fidelity constraint; the specific endpoints are chosen so σ = 1 as the page-65 prose requires. - Exponential:
dexp(x, rate = 1), which automatically has σ = 1.
- Normal:
- Simulation parameters (page-67 chunk) — N = 200,000 baselines of length 12 per distribution, with
set.seed(358)per chunk. Neave used 10,000,000. 200,000 is enough for the “strikingly similar” visual claim of page 67 to read obviously (peaks near 1.0 for the first three families; visibly wider with a small right shift for the exponential), runs in well under a second per family, and avoids dragging down per-render Quarto times. Larger N produces visually indistinguishable histograms on a printed page. - Implementation note — layout vs helper widening — The task brief offered two options: widen
pdf_family_plot()to support a 2×2 grid layout, or compose withpatchworkdirectly in the chunk. Chose the patchwork-in-chunk route because (a) the helper is built around comparable scales across panels, but Neave’s page-66 figure deliberately un-scales each panel so the shape — not the density value — is what stands out; (b) the page-66 corner labels (NORMAL top-left, UNIFORM top-right, TRIANGULAR bottom-left, EXPONENTIAL bottom-right) form a diagonal layout that is unique to this figure and would have added a wide surface area to a helper used elsewhere only in two stack/overlay contexts; (c) the histograms chunk has its own bespoke (auto-scaled y per panel, fixed x = 0–2.5, subtitle labels) — different enough from the page-66 PDFs chunk that no shared abstraction was justified. - Colour deviations — None for the page-66 PDFs: curves render in
CHART_FG(black) matching Neave’s printed page. The page-67 histograms also use black outlines on a white fill — again matching Neave’s printed page (he draws unfilled bars there, not the project’s usual red fill). No new colour tokens introduced. - Decided in — Issue #358 under the #315 sub-epic / #309 epic.
- Landed in — PR #377 (commit
3eb6676).
2026-05-27 — Replace eight Optional Extras Part D body-temperature histogram PNGs with R-generated figures
- What — Replaced the eight cropped-PNG body-temperature histograms on printed pages 44–46 with R/ggplot2 chunks generated inline by a new
histogram_with_pdf()helper. Each chunk draws a histogram ofnsimulated body-temperature readings from N(36.8, 0.35²) (Neave’s stated parameters), rounded to the printed precision, with a smooth normal density overlaid in blue. The eight chunks cover the same(n, precision)ladder Neave printed: 1k integer, 10k integer, 1k 1-dp, 10k 1-dp, 10k 2-dp, 100k 2-dp, 1m 2-dp, 10m 2-dp — the convergence sequence that climaxes in the recognisable bell shape. - Where —
R/functions/main-functions.R(addedhistogram_with_pdf());content/appendix/optional-extras/04-part-d-crash-course.qmd(eight{.lightbox}references replaced with R chunks carryingfig-cap/fig-alt). The orphan PNGs inassets/images/optional-extras/part-d-p44-temps-*.png,part-d-p45-temps-*.png, andpart-d-p46-temps-10m-2dp.pngare intentionally left in place per the epic-#309 policy (delete only after the conversion has been verified in production). - Source reference — Neave Optional Extras printed pages 44–46 (PDF pages 50–52), section “Linking it all together” (continued from page 43). The accompanying prose on page 46 ends “I was in fact generating data from N(36.8, 0.35²)” — the figures here are reproduced from those same parameters.
- Why — Inherits the rationale of epic #309 (SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits into one-line code changes). This is the first ticket in the Optional Extras sub-epic #315 and introduces the
histogram_with_pdf()helper that #354 (normal-family + area-percentages diagrams) and #358 (Part E PDFs + x-bar histograms) will reuse. - Reproducibility — seeds and parameters — Every chunk calls
set.seed(353)immediately before its singlernorm()draw, so each figure is independently reproducible regardless of chunk evaluation order. The seed value353is the GitHub issue number, chosen so future maintainers can rederive it without consulting this log. All eight chunks draw fromrnorm(n, mean = 36.8, sd = 0.35)(Neave’s stated parameters from the next page of prose); the precision per chunk follows Neave’sdigitsladder (0, 0, 1, 1, 2, 2, 2, 2). - What is NOT being claimed — The simulated samples here are not the same samples Neave generated for the original PDF. Neave does not publish his seed or his RNG implementation, so the per-bin counts will not match his figures exactly (e.g. with
set.seed(353)the 1,000-integer sample yields counts of 196/785/19 across 36/37/38, whereas Neave’s printed proportions of 0.176/0.801/0.023 imply counts of 176/801/23 from his sample). Neave’s pedagogical claim is about the limiting shape, not the per-bin counts — the convergence to the smooth bell curve asngrows and precision tightens is what these figures illustrate, and that claim is preserved exactly by drawing independently from the same N(36.8, 0.35²) population. - Decided in — Issue #353 under the #315 (Optional Extras) sub-epic of #309.
- Landed in — PR #375 (commit
32037df).
2026-05-27 — Replace Optional Extras Part D normal-family and area-percentages PNGs with R-generated figures
- What — Replaced the two cropped-PNG illustrations on Optional Extras printed pages 47 and 49 with R/ggplot2 chunks. The page-47 figure (three normals with the same μ and increasing σ) is rendered by a new reusable
pdf_family_plot()helper using itslayout = "stack"mode, with σ values fixed at 1, 2 and 3 (the prose only contrasts σ qualitatively as “Smallish σ / Larger σ / Still larger σ”, so any monotonic triple in roughly 1:2:3 ratio carries the same pedagogical point). The page-49 figure (the same three curves annotated with the standard 68/95/99.7 area percentages) is rendered as three stacked patchwork panels, each carrying the same percentage shading and labels in σ-units on its own curve. - Where —
R/functions/main-functions.R(addedpdf_family_plot()directly afterhistogram_with_pdf(), with both"overlay"and"stack"layouts);content/appendix/optional-extras/04-part-d-crash-course.qmd(two{.lightbox}references replaced with R chunks carryingfig-cap/fig-alt). The orphan PNGsassets/images/optional-extras/part-d-p47-normal-family.pngandassets/images/optional-extras/part-d-p49-area-percentages.pngare intentionally left in place per the epic-#309 policy (delete only after the conversion has been verified in production). - Source reference — Neave Optional Extras printed pages 47 and 49 (PDF pages 53 and 55), section “Continuous probability distributions, particularly the normal distribution”. The accompanying prose on page 46 introduces the family-of-normals idea (“if σ is small then the distribution is tall and thin … if σ is large then the distribution is wider and flatter”) and the page-49 figure is introduced on page 48 (“on the next page there are the same three ‘graphs of the normal curve’ as above but now with some ‘proportions of area thereunder’ inserted”).
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits into one-line code changes. This is the second ticket in the Optional Extras sub-epic #315 and introduces the
pdf_family_plot()helper that #358 (Part E PDFs + x-bar histograms) will reuse to compare four different distribution families (normal / uniform / triangular / exponential). - σ values (page 47) — Neave’s prose is qualitative-only (“Smallish σ / Larger σ / Still larger σ”, page 46) with no specific numeric values. The R replacement uses σ = 1, 2 and 3 — a natural monotonic triple in 1:2:3 ratio that makes the height-and-width progression visible at a glance on a shared (−10, +10) x range. The pedagogical claim — same μ, varying σ shape only — is unchanged.
- Colour palette deviation (page 49) — Neave’s printed shaded regions use a yellow / magenta / green / red palette (centre / next band / next band / tails). The R replacement uses tints drawn from the existing project tokens — blue centre, red middle bands, mid-grey outer bands, darker red tails — to honour the epic-#309 “no new colour constants” rule and the dark-mode-safe palette contract documented at the top of
R/functions/main-functions.R. The four bands are still visually distinct and each remains paired with its labelled percentage; reading the figure is unchanged. - No randomness — These are analytic curves (
stats::dnorm), so neither chunk needsset.seed(). The issue brief’s suggestedset.seed(354)is intentionally not used: there is nornorm()call in either chunk. - Decided in — Issue #354 under the #315 (Optional Extras) sub-epic of #309.
- Landed in — PR #376 (commit
55f001a).
2026-05-27 — Replace Optional Extras Part D confidence-interval PNGs with R-generated figures
- What — Replaced the two cropped-PNG illustrations on Optional Extras printed page 50 (the 95% and 99% confidence-region “yellow centre / red tails” bell-curve diagrams) with R/ggplot2 chunks. Both figures are rendered by a new reusable
conf_interval_plot(level, z, …)helper that draws a standard-normal pdf, shades the centrallevel-fraction yellow and the two tails red, drops vertical line markers at the boundaries, and labels the boundaries below the baseline in σ-units (e.g.μ−1.96σ/μ+1.96σfor the 95% figure,μ−2.58σ/μ+2.58σfor the 99% figure). - Where —
R/functions/main-functions.R(addedconf_interval_plot()directly afterpdf_family_plot()— these are the same Optional Extras family of helpers and the file is grouped by topic, not by issue ticket);content/appendix/optional-extras/04-part-d-crash-course.qmd(two{.lightbox}references replaced with R chunks carryingfig-cap/fig-alt,fig-width: 7,fig-height: 4, and#| lightbox: true). The orphan PNGsassets/images/optional-extras/part-d-p50-conf-95.pngand…/part-d-p50-conf-99.pngare intentionally left in place per the epic-#309 policy (delete only after the conversion has been verified in production — a follow-up PR removes them in batch). - Source reference — Neave Optional Extras printed page 50 (PDF page 56), section “Continuous probability distributions, particularly the normal distribution”. The two figures sit under the prose that introduces 1.96σ and 2.58σ as the “particular probabilities that are frequently used in applications of the normal distribution to popular techniques of so-called ‘statistical inference’” and are referenced again on pages 54–55 in the discussion of confidence intervals and hypothesis tests.
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits into one-line code changes. This is the next ticket in the Optional Extras sub-epic #315 after #354 (normal-family + area-percentages), and the new
conf_interval_plot()helper is parameterised onlevelso the same helper would serve any future centre-shaded confidence-region illustration (e.g. the 99.8% / “3.09σ” remark Neave makes immediately after the page-50 figures). - Standalone helper rather than extending area-percentages — Issue #355’s brief noted the page-50 figures “likely share structure” with the page-49 area-percentages helper from #354 and asked whether the existing helper could be extended. The page-49 figure is structurally different: it carries four pairs of band-percentages (34.1 / 13.6 / 2.15 / 0.135) annotated on each curve, expects three stacked panels at varying σ, and has bands drawn in σ-units from the project’s existing palette tokens. The page-50 figure is a single panel showing a single central confidence region in yellow with red tails, no band-by-band percentages, and a boundary-label idiom (
μ ± kσ) that the page-49 helper does not produce. Extending the page-49 helper to subsume both call-sites would have made it a wide-surface-area conditional function with several mutually exclusive parameter branches; a standalone helper with its own focused parameter list reads more clearly at the call-sites and at the function signature, so the two helpers stay separate. - Colour palette deviation — Unlike the page-49 figure, where the band-tints were drawn from the project’s dark-mode-safe palette tokens, here the central “yellow” (
#fff176) and the tail “red” (#ed0000, the project’s existing data-ink red) are pedagogically load-bearing: Neave’s prose on page 50 introduces these specific colours by name (“a random variable has a 95% probability (coloured yellow) of lying within … 2.5% probability (left-hand tail coloured red)”). The figure’s chromatic identity reads as a single coherent illustration only when those two colours are used. The yellow and red are non-trivial under dark mode: yellow round-trips to a dim blue-grey under the invert+hue-rotate filter, which is then re-shaded toward yellow again by the chart’s existing colour-token treatment to a workable mid-tone. This is the same dark-mode pattern already accepted on the page-49 figure (red bands among the otherwise-grey/blue palette there). - No randomness, no
set.seed()— Both chunks are fully deterministic: the curve isdnormover a 801-pointseq()grid, the boundaries are passed explicitly asz = 1.96/z = 2.58, andqnorm()is only consulted when the caller omitsz. Noset.seed()is used or needed; this is consistent with the PR-#377 reviewer feedback that no-op seed calls should not appear in deterministic chunks. - Boundary
zvalues — The chunks passz = 1.96andz = 2.58explicitly, matching the rounded values Neave uses verbatim in his prose (“1.96 standard deviations of its mean μ” and “2.58 standard deviations of its mean μ”). The helper’s default (z = qnorm((1 + level) / 2)) produces 1.959964 and 2.575829 respectively — which round to Neave’s printed values but differ in the third decimal. For source-fidelity the explicit override is preferred so the boundary tick labels read exactly as the surrounding prose does; the defaultzexists only for callers who do not need to align with Neave’s printed rounding. - Decided in — Issue #355 under the #315 (Optional Extras) sub-epic of #309.
- Landed in — PR #378 (commit
8326985).
2026-05-27 — Replace Optional Extras Part D CLT-demo triangular and uniform PNGs with R-generated figures
- What — Replaced eight cropped-PNG figures on Optional Extras Part D pages 52–53 with R/ggplot2 chunks: the triangular and uniform parent-distribution PDFs, and six histograms of the standardised sample mean Z = (X̄ − μ) / (σ / √n) at n = 2, 4, and 10 for each parent. The exponential family on pages 53–54 (
part-d-p53-exp-pdf.png,part-d-p53-exp-n2.png,part-d-p53-exp-n4.png,part-d-p53-exp-n10.png,part-d-p54-exp-n100.png) is out of scope for this PR — it is tracked under issue #357 and will reuse the sameclt_demo_plot()helper introduced here. - Where —
content/appendix/optional-extras/04-part-d-crash-course.qmd(eight inline-image references replaced by R chunks; the orphan PNGs inassets/images/optional-extras/remain on disk per the epic-#309 policy and will be removed in a follow-up PR after production verification). - Source reference — Neave Optional Extras Part D pages 52–53. The page-51 prose introduces the simulation context (“samples were generated 10,000,000 times”); pages 52–53 show eight figure captions verbatim reproduced as
fig-capstrings in the new chunks. Neave’s parametrisations of the parent distributions are not stated numerically — the figures are shape illustrations — so the choices below derive from the σ = 1 constraint his prose specifies (and which Part E pages 65–67 then explicitly reuse “for ease of comparison with the initial normal version”). - Why — Inherits the rationale of epic #309 and the Optional Extras sub-epic #315. SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the simulation is now reproducible from a fixed seed.
- Parametrisations (all σ = 1) —
- Uniform: half-width √3 around zero, so
runif(n, min = -√3, max = √3). Variance is(2 √3)² / 12 = 1. Same parametrisation as PR #377 Part E page 66. - Triangular (unsymmetric, right-triangle decreasing from left peak): on
[0, b]with mode ata = 0, variance is(b − a)² / 18; setting variance = 1 givesb = 3 √2 ≈ 4.243, mean= b / 3 = √2 ≈ 1.414. The PDF readsf(x) = 2 (b − x) / b²on[0, b]. Inverse-CDF sampling:x = b * (1 - sqrt(1 - U))forU ~ Uniform(0, 1). Same parametrisation as PR #377.
- Uniform: half-width √3 around zero, so
- Simulation parameters —
n_samples = 100000standardised X̄ values per histogram (helper default), withset.seed(356)at the top of each random-draw chunk. Neave used 10,000,000; 100,000 is comfortably enough to make the CLT shape claims visually obvious on a printed/screen page and keeps per-chunk render time well under a second. Larger N produces visually indistinguishable histograms at the printed resolution. - New helper —
clt_demo_plot(parent_dist, n, …)— Added toR/functions/main-functions.Rnext tohistogram_with_pdf(). Takes a parent-distribution sampler (afunction(n) numeric) plus a sample size, simulates the standardised sample mean Z, and returns a histogram with the standard normal N(0, 1) density overlaid. Designed deliberately to accept any sampler so issue #357 can reuse it viafunction(n) rexp(n, rate = 1)for the exponential family on pages 53–54. The helper uses the project’s existing red-bar + blue-curve visual idiom fromhistogram_with_pdf(), draws the histogram on the density scale so the unit-area N(0, 1) overlay sits naturally on top with no further rescaling, and appliesrun_chart_theme()for axis treatment and dark-mode parity.mudefaults to NULL with pilot-sample estimation as a fallback, but the chunks here all pass the closed-formmufor reproducibility. - PDF (decorative) chunks — The two parent-distribution PDFs are drawn as bespoke shape illustrations in the chunks (not via
pdf_family_plot()), matching the structure of the Part E page-66 mini-panels in PR #377. They render as thin black outlines over a horizontal baseline with no axis ink — Neave’s printed page has no axes — and are deterministic, so they carry noset.seed()call. - Reviewer-feedback compliance (PR #377) — The PDF chunks are fully deterministic and carry no seed. Random-draw chunks use
runif,rnorm,rexpwithout thestats::prefix to match the rest ofR/functions/main-functions.R. Noapply()in the helper —rowMeans()is used for the row-wise mean, the only reduction needed. - Colour deviations — None. Histogram bars use
CHART_LINE_COLOUR(red) and the N(0, 1) overlay usesCONTROL_LIMIT_COLOUR(blue), both already documented dark-mode-safe tokens in the conventions block at the top ofR/functions/main-functions.R. No new colour tokens introduced. - Decided in — Issue #356 under the #315 sub-epic / #309 epic.
- Landed in — PR #379 (commit
e4345de).
2026-05-27 — Keep Optional Extras Rule 1 short/long control charts as PNGs (no R regeneration)
- What — Retain
assets/images/optional-extras/rule-1-short.pngandassets/images/optional-extras/rule-1-long.pngas cropped source-PDF images rather than regenerating them via R/ggplot2 alongside the #347 Day 3 Funnel-track work and the broader #314 PNG→R port programme. - Where —
content/appendix/optional-extras/01-part-a-funnel-charts.qmd(Part A §4 “Control charts for the computer-generated data” → “Rule 1” subsection, ~lines 71 and 75) and the two assets atassets/images/optional-extras/rule-1-short.pngandassets/images/optional-extras/rule-1-long.png. - Source reference — Neave Optional Extras Part A, printed pages 9–10 (PDF 15–16) — the side-by-side short/long XmR control charts of his two computer-simulated Rule 1 Funnel-Experiment runs. The text on those pages and into page 11 discusses these specific charts (Central Lines, control-limit positions, baseline-vs-extension behaviour) by their visual features.
- Why — Issue #352 proposed “Direct reuse of
funnel_track_plot()”, but that helper renders the 20–40 marble-track strip (a position diagram), not an XmR control chart, so it does not apply to these figures. Re-plotting them in R faithfully would require Neave’s original simulation values, which are not in the repo or the source PDF — Neave only prints the resulting charts, not the underlying 50-value sequences from the two simulation runs. Synthesising plausible-looking series would diverge from Neave’s actual simulations and break the visual claims his prose makes (e.g. “Central Line around 30 and control limits spanning roughly 20 to 40”; “the second simulation’s Central Line is closer to 29”; “the long version’s green extension stays comfortably inside the limits throughout”). The Optional Extras structural brief (workflow/briefs/appendix-optional-extras-brief.yml, Part Afiguresblock) anticipated exactly this case and set the policy: “Most are line/control charts — crop from source PNGs rather than re-plotting in R (the Funnel data lives on Day 3 pp.44 & 47; re-plotting here duplicates effort and risks numeric drift). Re-plotting in R is reserved for figures that need interactivity.” These two charts are static illustrations of a closed historical simulation and need no interactivity. The same precedent was applied in #349 / #368 for the Day 3 funnel-track cutting-out PNG, where the analysis showed regeneration would harm fidelity with no upside. - Implementation note — Both PNGs retained at their current cropped dimensions (rule-1-short.png: 1080×360; rule-1-long.png: 1440×670). Existing alt-text on both call sites already describes the charts in prose for screen readers (“Two short Rule 1 control charts: both baselines show a stable process with Central Line around 30 and control limits spanning roughly 20 to 40…” and “Two long Rule 1 control charts, each continuing the baseline (red) with a green extension to 50 points; both remain comfortably inside the control limits throughout…”) and both carry
{.lightbox}so the alt attribute survives Quarto’s image rendering. No.qmdor R changes; the only artefact of this decision is this log entry. The other Optional Extras Part A control-chart PNGs (rule-2-short, rule-2-long-a, rule-2-long-b, rule-3-short, rule-3-long, rule-4-short, rule-4-long) sit on the same footing and will follow the same precedent if their parallel issues (#353–#355 in the same series) come up for implementation. - Decided in — Issue #352 under the #314 parent / #309 epic.
- Landed in — #373 (closes #352).
2026-05-27 — Keep Day 3 Funnel cutting-out track as a printable PNG (no R regeneration)
- What — Retain
assets/images/day-03/funnel-track-colourful.pngas a high-DPI printable PNG rather than regenerate it via R/ggplot2 alongside the basic and with-icons funnel-track figures handled under #347. - Where —
content/days/day-03/10-introduction-to-the-funnel-experiment.qmd(~line 85) and the asset atassets/images/day-03/funnel-track-colourful.png. - Source reference — Neave Day 3 page 59 — the larger printable copy of the 20–40 track laid out in two halves so the reader can copy/paste it onto card, cut it out, and join the halves at square 30 for the Funnel Experiment.
- Why — This asset is a learner activity, not a chart. Readers print it, cut it out, and physically assemble the funnel track for the experiment, so it needs print resolution and Neave’s exact colour scheme and layout — the visual quotation matters because it is the artefact the reader handles, not an illustration of one. Regenerating via R would either lose fidelity (svglite + the dark-mode CSS-filter pipeline from #310 optimises for on-screen rendering, not paper output at a fixed paste-onto-card size) or duplicate Neave’s existing print-ready layout with no upside. The R-generated funnel-track figures under #347 serve a different purpose — they illustrate the apparatus in the prose, not the cut-out kit.
- Implementation note — PNG retained at current high DPI; alt text (“Colourful track for cutting out”) and the
.lightboxmarkup on the figure call site are unchanged. No.qmdor R changes; the only artefact of this decision is this log entry. - Amended 2026-09-18 — The reasoning above stands; the file it was written about did not contain the artefact.
funnel-track-colourful.pngwas 2000×100 pixels and 602 bytes — a red bar containing a white bar containing a blue bar, with no numbers, no squares, no green, no funnel and no marble — and it had been that since the file was created, which means this entry was written without opening it. It is now the real printed-page-59 artwork, cropped at source resolution fromF.Day.3.13Jan20_page_063.png: the two vertical strips (20–30 and 30–40, alternating green and yellow with red borders and a bullseye on each 30), together with the three funnel icons and three marble images that the prose promises on the same page and that the site did not carry at all. A second asset,funnel-track-extensions.png, carries printed page 61’s four extension strips (0–10, 10–20, 40–50, 50–60) under a new[]{#sec-page61}; the prose pointed at “page 60” and linked to the 20–40 track instead. The figure captions and<details>long descriptions are rewritten to describe what is actually in each image. The decision not to regenerate either via R is unchanged and is now made on the artefact rather than on a placeholder. Amended in PR #832 under issue #830. - Decided in — Issue #349 under the #314 parent / #309 epic.
- Landed in — PR #368 (commit
717ff13).
2026-05-27 — Funnel-rule simulation helpers + chart wrapper (infrastructure)
- What — Added four R simulation helpers (
funnel_rule_1_sim()…funnel_rule_4_sim()) that generate marble-resting-position sequences under Deming’s four Funnel-Experiment rules, plus afunnel_simulation_chart_plot()wrapper that pipes a sequence throughrun_chart_plot()with MR-based control limits derived from a configurable baseline. Also added a scratch developer-facing demo qmd atinst/demo/funnel-rules-demo.qmd(not linked from_quarto.yml; will be deleted by the consumer PR). - Where —
R/functions/funnel-rules.R(new), sourced fromR/setup.R;tests/testthat/test-funnel-rules.R(new — 22 test cases);inst/demo/funnel-rules-demo.qmd(new — scratch);.gitignore(ignoresinst/**/*_files/andinst/demo/*.htmlso demo renders never enter the tree). - Source reference — Neave Day 3: “Rule 1 of the Funnel (Ford’s Second Strategy)” and “Rule 2 of the Funnel (Ford’s First Strategy)” in
content/days/day-03/11-the-first-two-rules-of-the-funnel.qmd; “Rules 3 and 4 of the Funnel” incontent/days/day-03/12-rules-3-and-4-of-the-funnel.qmd. The four rules are also discussed in Neave’s The Deming Dimension Chapter 5 and (with control-chart treatment) on Optional Extras Part A pages 9–14 (content/appendix/optional-extras/01-part-a-funnel-charts.qmd). - Why — This is pure infrastructure. No learner-facing qmd page is modified in this PR. Issue #352 was closed in #373 as keep-as-PNG because re-plotting
assets/images/optional-extras/rule-1-short.pngandrule-1-long.pngfaithfully would require Neave’s original Monte Carlo sequences (which are not in the repo or the source PDF), and the existingfunnel_track_plot()helper draws the 20–40 marble-track strip, not an XmR control chart. That blocker had two halves: missing simulation generators for each rule, and a missing chart wrapper to pipe the resulting sequences throughrun_chart_plot(). This PR ships both halves so a follow-up consumer PR can swap the rule-1 (and, if the same precedent is reopened, rule-2/3/4) control-chart PNGs for R-generated SVGs that re-skin under dark mode via the #310 CSS-filter mechanism. The resulting sequences are illustrative, not Neave’s exact simulations — the deviations-log entry recording the eventual PNG→R swap will need to document that consciously (similar in shape to the page-15 dice-data “Data decision A” in the 2026-05-26 charts-a1-a2-purple-limits entry). - Implementation note — Seed defaults. Each helper takes a
seedargument (noset.seedat file scope; reproducibility is per-call). Defaults were picked by sweeping seeds 1–300 against the characteristic-behaviour assertions intests/testthat/test-funnel-rules.Rand visually previewing the resulting 50-drop control charts atsd = 5, target = 30(the Optional Extras Part A scale). Choices: Rule 1 = 7 (stable around target), Rule 2 = 2 (lag-1 autocorrelation ≈ −0.58, clean zig-zag), Rule 3 = 1 (second-half amplitude ≈ 2.7× first-half), Rule 4 = 42 (clear drift away from target with comparable first/second-half spreads). Callers can overrideseedto explore alternative runs. - Implementation note — Chart wrapper vs direct
run_chart_plot()call. Chose to ship thefunnel_simulation_chart_plot()wrapper in addition to documenting that callers may pipe simulation output straight intorun_chart_plot(). The wrapper bundles the MR-baseline-then-extend recipe that the Optional Extras Part A figures all share, which keeps the consumer call site to one line per chart and makes the baseline policy uniform across all four rules. Tests cover both the wrapper path and the direct-call path; both return ggplot objects. - Implementation note — Loop vs vectorisation. Rules 1 and 4 are fully vectorisable (Rule 1 is plain
rnorm; Rule 4 istarget + cumsum(noise)) so they ship without a loop. Rule 2 also has a clean closed form — substitutingrest[i] = aim[i] + noise[i]into the recurrence collapses torest[i] = target + noise[i] − noise[i−1]for i ≥ 2 — but is implemented with aforloop here for parity with Rule 3 (whose alternating-cumulative-sum closed form reads less clearly than its recurrence) and because the chart consumer uses n ≤ 50, where no measurable benefit accrues. The doc-comment on each helper makes the loop-vs-closed-form choice explicit. This is consistent with PR #377’s reviewer feedback (“prefer vectorised forms overapply(); loops are fine when sequential dependencies make vectorisation impossible”). - Implementation note — File organisation. Put the four sim helpers in a new file
R/functions/funnel-rules.Rrather than appending toR/functions/main-functions.R(which is already ~1500 lines). Sourced fromR/setup.Ralongside the main file. - Decided in — Issue #374 under the #314 parent / #309 epic.
- Landed in — PR #380 (commit
0b1594a).
2026-05-27 — Day 12 radar diagram rendered from R; small/key-table kept as PNG
- What — Replaced the cropped-PNG figure
assets/images/day-12/radar-diagram-large.pngon Day 12 page 3 (Neave’s blank four-arm “kite” diagram for Activity 12–a Part 3) with an R/ggplot2 chunk driven by a newradar_diagram_plot()helper. The companion assetsradar-diagram-small.png(printable worked-example template) andradar-diagram-key-table.png(the 14 Points + 5 Deadly Diseases KEY table) stay as PNGs in this PR — see Why below for the keep-as-PNG rationale on each. - Where —
R/functions/main-functions.R(addedradar_diagram_plot()immediately afterspecification_limits_diagram());content/days/day-12/02-your-radar-diagram.qmd(theradar-diagram-large.pngMarkdown image reference replaced by an R chunk);tests/testthat/test-radar-diagram.R(three new tests);workflow/validation/day-12-manifest.yml(figure list trimmed to drop the large-radar entry). - Source reference — Neave Day 12 page 3 (“This diagram is used in Activity 12–a, Part 3 and is also on Workbook page 217”). The reference layout has four labelled arms meeting at a common origin: PSYCHOLOGY (top), SYSTEM (right), KNOWLEDGE (bottom), VARIATION (left). Each arm carries six labels reading “0” at the outermost tip down to “5” closest to the origin, with five tick marks dividing the arm into evenly-spaced intervals.
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the radar’s geometry now lives in code where any future correction (an axis label, an arm direction) is a one-line edit rather than a re-crop.
- Implementation note — hand-rolled
coord_fixed(), notggradar— Theggradarpackage renders closed-ring polygon radars with concentric circles and arms equally spaced around 360°. Neave’s “radar” is in fact a Cartesian crosshair with four orthogonal arms and a 0-to-5 linear scale on each — closer to a pair of axes than to a polygon radar. Forcingggradarwould have required overriding most of its defaults (gridlines, ring fills, axis-label rotations) and would still leave the inner-most “5” labels misplaced relative to Neave’s printed convention. A 100-linecoord_fixed()helper usingannotate("segment", ...)andgeom_text()was both more faithful to the source layout and zero-dependency-cost (the project already importsggplot2). Decision made during the 30-minute spike called for in #360. - Implementation note — keep
radar-diagram-small.pngas PNG — The small radar is a worked-example illustration showing Neave’s Point 1 plotted with broken-green-dashes (4 plotted points + the polygon connecting them + a KEY-style dashed line specimen). Reproducing that in R would require additional helper plumbing for the legend-style dashed-line specimen and the example-score annotations, all to render a figure that is essentially explanatory rather than data-driven. The PNG is high-resolution and accessible (alt-text covered by{.lightbox}); converting it carries no editorial upside over keeping the source as-is. Recorded here so this PNG isn’t flagged as an oversight in future audits. Per epic #309 the file is not deleted. - Implementation note — keep
radar-diagram-key-table.pngas PNG (for now) — The 14 Points + 5 Deadly Diseases KEY table is fundamentally a table with a 19-row layout, a wide “KEY” column where learners record their colour/line-style choices, and a fixed font. The right tool for that conversion isgt(which the project already uses for the Red Beads tables) rather than ggplot2 — and thegtwork is sized differently from the R-figures epic. Tracking thegtconversion as a separate effort keeps this PR scoped to the radar chart itself. Recorded here so the keep-as-PNG decision isn’t mistaken for inaction. - Decided in — Issues #360 and #361 under the #316 parent / #309 epic.
- Landed in — PR #381 (commit
8d58224).
2026-05-27 — Add Rule 1 & Rule 2 illustrative funnel-track figures on Day 3 page 40 / page 46
- What — Added two R/ggplot2 illustrations to
content/days/day-03/11-the-first-two-rules-of-the-funnel.qmdthat had been omitted when the chapter was first converted: a Rule 2 thought-experiment diagram (funnel at 27, marble at 30) underneath the paragraph that introduces Ford’s First Strategy, and a Rule 1 Stage-1 diagram (funnel pinned at 30, marble at 33) underneath the paragraph that introduces Ford’s Second Strategy. - Where —
content/days/day-03/11-the-first-two-rules-of-the-funnel.qmd(two new R chunksfunnel-rule2-illustrationandfunnel-rule1-illustration, each with a<details>long-description block);workflow/inter-day-refs.csvregenerated because the Day 5 page 8 reference on Day 3 page 48 shifted from line 247 to line 269. - Source reference — Neave Day 3 page 40 (the Rule 2 “if only the funnel had been at 27” illustration showing funnel above 27 and marble on 30) and Day 3 page 46 (the Rule 1 Stage 1 illustration showing funnel pinned at 30 and marble at 33 after the dice-score-10 throw). Both diagrams sit directly underneath the prose paragraphs they illustrate in Neave’s PDF.
- Why — These two static illustrations are part of the explanatory prose itself: they show why Rule 2 moves the funnel to where it “would have needed to be” and what Rule 1 looks like at the very first stage before the interactive 40-stage walkthrough takes over. Reinstating them brings the chapter back into alignment with Neave’s pedagogical flow without disturbing the OJS interactive that follows.
- Implementation note — reuse of
funnel_track_plot()helper — Both figures call the existing scalarfunnel_track_plot(funnel_pos, marble_pos)helper added under #347 (PR #367, commit4b82705). Neave’s source shows several adjacent step-by-step diagrams across pages 40–42 (Stages 1–5 with intermediate “funnel-only-after-move” snapshots), but the OJS interactive on this chapter already drives the reader through all 40 stages with the same dice-scores. Adding all of Neave’s static intermediate snapshots would duplicate the interactive; we therefore keep only the two diagrams that the prose explicitly describes (Rule 2 thought-experiment, Rule 1 Stage 1). Marker glyphs (blue triangle / yellow circle) inherit the #347 simplification. - Decided in — Issue #350 under the #314 parent / #309 epic.
- Landed in — #370 (commit
7881e9f).
2026-05-27 — Add Day 3 Funnel Rules 3 & 4 illustrations (R-generated) and restore Rule 3 walkthrough prose
- What — Added ten R/ggplot2 figures (five for Rule 3, five for Rule 4) to the Day 3 chapter on Rules 3 & 4 of the Funnel. Each figure is a single
funnel_track_plot(funnel_pos, marble_pos)call placed at the worked-example anchors in Neave’s prose. Also restored the missing Rule 3 Stage 2 walkthrough sentences (“Now (checking if necessary…) … you move the funnel to … 27 (3 left of ◎)”; “The second dice-score was 8 … the next position of the marble is 28”; “Since the marble is now at 28 … Rule 3 moves the funnel to 32”) that were silently elided in the existing transcription, so each figure has its introducing prose. - Where —
content/days/day-03/12-rules-3-and-4-of-the-funnel.qmd. No helper changes (the existing scalarfunnel_track_plot()signature from #347 suffices because every Neave illustration on pages 49 and 52–53 shows one funnel marker and one marble marker per diagram). Each figure is followed by a<details><summary>Describe this diagram</summary>…</details>accessibility block, matching the pattern established in #347 for chapter 10. - Source reference — Neave Day 3 page 49 (Rule 3, five illustrations: funnel/marble at 30/33, 27/33, 27/28, 32/28, 29/31) and pages 52–53 (Rule 4, five illustrations: 30/33, 33/33, 33/34, 34/34, 33/33). The page-49 prose drives the symmetric placement of the funnel either side of the target; the page-52 prose drives the “funnel follows the marble” behaviour of Rule 4. The Rule 3 prose restoration mirrors Neave verbatim.
- Why — Inherits the rationale of epic #309 and parent #314: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and reuses the
funnel_track_plot()helper introduced in #347. The earlier transcription had dropped two of Neave’s worked-example diagrams (and the linking prose) for Rule 3, leaving a half-step walkthrough — the figures and the restored sentences make the Rule 3 walkthrough match Neave’s intent end-to-end. - Implementation note — simplified marker glyphs — The R helper (already in use on Day 3 chapter 10 since #347) substitutes a blue downward triangle on a short stick (funnel) and a small yellow filled circle (marble) for Neave’s stylised funnel and striped marble glyphs. Pedagogical content — where the funnel was placed and where the marble came to rest — is preserved; the visual quotation of Neave’s particular illustration style is not.
- Implementation note — manifest —
workflow/validation/day-03-manifest.ymlchapter 12figuresstays[]because the figures-check only inventories static-PNG references; R-generated chunks are intentionally excluded (see #347)../scripts/check-structure.sh 3continues to PASS on chapter 12 (viewof: 0, figures: none expected, headings: 2 match, download button: none expected). - Decided in — Issue #351 under the #314 parent / #309 epic.
- Landed in — #371 (commit
d74fff4).
2026-05-26 — Replace three Day 3 histogram PNGs with R-generated figures
- What — Replaced three cropped-PNG figures with R/ggplot2 code rendered inline:
- Day 3 page 5 —
ford-histogram-with-compensation.png(49 shaft-diameter bars across a wide LSL/USL frame, reaching both extremes) - Day 3 page 5 —
ford-histogram-without-compensation.png(50 shafts forming a narrow central cluster comfortably inside the same LSL/USL frame, plus 2 right-hand outliers) - Day 3 page 7 —
two-histograms-24-values.png(the same 24-value sequence drawn as stacked unit boxes on the left and as a conventional bar histogram on the right, framed aspatchwork::wrap_plots()so both panels share one figure caption)
- Day 3 page 5 —
- Where —
R/functions/main-functions.R(addedstacked_boxes_plot()andford_histogram_plot());R/data/day-03-ford-with-compensation.csvandR/data/day-03-ford-without-compensation.csv(new);content/days/day-03/02-at-the-ford-motor-company.qmdandcontent/days/day-03/03-the-importance-of-time.qmd; three PNGs deleted fromassets/images/day-03/;patchworkadded torenv.lock. - Source reference — Neave Day 3 pages 5 (Ford histograms, attributed to Bill Scherkenbach’s The Deming Route to Quality and Productivity around page 30) and 7 (two-histograms-24-values comparison; the underlying 24-value sequence was already transcribed verbatim in
R/data/day-03-first-process.csvduring issue #311 for the page 7 / page 11 / page 18 run charts). - Why — Inherits the rationale of epic #309 and child #312: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits into one-line code changes rather than new crop passes. Two data decisions are recorded below.
- Data decision A — Ford bin-count digitisation — Neave’s two Ford histograms have no numeric x- or y-axes — they are qualitative shape illustrations meant only to convey “broad distribution reaching both specification limits” vs. “narrow distribution sitting comfortably inside the limits.” The original 50 raw shaft diameters are attributed to Scherkenbach’s The Deming Route to Quality and Productivity; Neave does not reproduce them. The
(position, count)pairs inR/data/day-03-ford-with-compensation.csv(sum = 49, matching Neave’s wry observation on Day 3 page 9 that the printed chart contains only 49 boxes, not 50) andR/data/day-03-ford-without-compensation.csv(sum = 50) are a visual digitisation of the printed bars, not a transcription. Binpositionvalues carry no physical meaning beyond their left-to-right ordering; both files use the same LSL = 0 / USL = 30 framing chosen so the two charts sit at the same chart width when laid out vertically in the prose and the shape contrast (broad vs. narrow) is directly comparable bar-for-bar. - Data decision B — Two-histograms-24-values caption “five” not “four” — The original PNG’s caption and accompanying describe-block stated that both panels “peak at value 13 (four occurrences)”. The verbatim 24-value sequence in
R/data/day-03-first-process.csv(transcribed from Neave’s printed list on page 7) actually contains five 13s — at positions 7, 8, 10, 12, and 13 — and the left panel of the source PNG does in fact show five stacked boxes at column 13 when counted carefully. The new caption and describe-block say “five occurrences” to align with the data Neave printed. This is a small alt-text correction, not a content departure, but is logged here because it is the kind of detail a future contributor cross-referencing source-PDF screenshots could otherwise relitigate. - Decided in — Issue #312 under the #309 epic.
- Landed in — PR #342 (commit
754066b).
2026-05-26 — Replace seven Day 3 / Day 7 chart PNGs with R-generated figures
- What — Replaced seven cropped-PNG figures with R/ggplot2 code rendered inline:
- Day 3 page 7 —
run-chart-first-process.png(first-process 24-value run chart) - Day 3 page 11 —
sales-control-chart.png(10-value sales data with control limits and Central Line) - Day 3 page 18 —
technical-aid-8-control-chart.png(24-value chart with first-12 baseline limits) - Day 3 page 21 —
favourite-example-run-chart.png(proportion-defective run chart, no limits) - Day 3 page 21 —
favourite-example-control-chart.png(same data with LCL=3.1%, UCL=14.4%, CL=8.75% and “hugging the Central Line”) - Day 7 page 19 —
specification-limits.png(LSL/USL number-line with b, a, c, d knife-edge points) - Day 7 page 22 —
taguchi-loss-function.png(split into the abstract parabola and Neave’s personal temperature/loss graph as two separate figures)
- Day 3 page 7 —
- Where —
R/functions/main-functions.R(extendedrun_chart_plot()andrun_chart_theme(), addedtaguchi_loss_abstract(),taguchi_loss_personal(),specification_limits_diagram());R/data/day-03-first-process.csv,R/data/day-03-favourite-example.csv(new); five chapters undercontent/days/day-03/andcontent/days/day-07/; seven PNGs deleted fromassets/images/day-03/andassets/images/day-07/. - Source reference — Neave Day 3 pages 7, 11, 18, 21 (the favourite-example data is Neave’s own redrawing of Deming’s “Faulty inspection caused by fear” story from Out of the Crisis pp. 227–228[264–266]); Neave Day 7 pages 19 and 22.
- Why — Inherits the rationale of epic #309: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism introduced in #310, is screen-reader inspectable in ways bitmap alt text is not, and turns label typos into one-line code edits rather than new crop passes. Two non-trivial data decisions are recorded below.
- Data decision A — favourite-example daily proportions — Neave does not print the underlying daily proportions; he himself redrew the run chart from Deming’s account. The 31 values in
R/data/day-03-favourite-example.csvare a visual digitisation of Neave’s printed chart on Day 3 page 21, not a transcription. The digitisation preserves the storytelling signal (every point clustered in a tight 8.0%–9.6% band around CL=8.75%, well inside the very wide LCL/UCL=3.1%/14.4% limits) without claiming to be the original numbers. The control limits and Central Line are carried through verbatim from Neave (the limits derive from the binomial p-chart formula with implied daily sample size n ≈ 225, not the moving-range method introduced earlier on the same day; this is why they are so wide despite the tight observed spread). - Data decision B — Taguchi loss-function abstract parabola — Neave’s top-panel parabola has no numeric scales (it presents the shape, not a scaled function). The R version uses arbitrary x ∈ [-1, 1] and y = x², with the curve, floating axis-cross labels (“loss” / “measurement”), and the word “nominal” placed by eye to match the visual proportions of Figure 34 on DemDim page 173. The choice of k = 1 over [-1, 1] is documented here so a future contributor doesn’t relitigate why the parabola isn’t fitted to Neave’s own seven temperature/loss readings — that is precisely the point Neave is making with the two-panel layout. The bottom panel (Neave’s personal temperature/loss graph) is data-faithful: the seven (temp, loss) readings printed on Day 7 page 21 are passed verbatim to
taguchi_loss_personal(), with astats::loesssmoother (span 0.9) drawing the curve through them — so any asymmetry in Neave’s own readings (he notes that he loses efficiency faster when cold than when hot) comes through. - Decided in — Issue #311 under the #309 epic.
- Landed in — PR #341 (commit
cc2130c).
2026-05-26 — Replace Day 3 Six-Processes extended A3–F3 panel PNG with an R-generated figure
- What — Replaced the cropped-PNG figure
assets/images/day-03/six-processes-extended-charts.pngon Day 3 page 23 (Neave’s vertical stack of six 48-point charts A3–F3, each showing both halves of the corresponding process with the page-19 control limits extended unchanged) with an R/ggplot2 chunk that composes the stack via a newsix_processes_extended_panel()helper. - Where —
R/functions/main-functions.R(addedsix_processes_extended_panel()immediately aftersix_processes_panel(), reusingmr_limits()andrun_chart_plot()withgridlines = "none"for the clean-axis look Neave’s printed page 23 uses);content/days/day-03/06-six-processes.qmd; one PNG deleted fromassets/images/day-03/. No new data — the helper reads the samesix_processeslist laid down under #344. - Source reference — Neave Day 3 page 23. The pedagogical point at the foot of page 22 governs the construction: “it saves you time and effort by not recomputing the control limits when there is no need to do so. Second, if a future recomputation of control limits is being carried out while the process is becoming unstable, you’ll obviously be spoiling the control chart’s chance of warning you about that particular problem … So the clear ‘no-brainer’ message is to leave the control limits alone if you have no good reason for changing them!”
- Why — Inherits the rationale of epic #309 and parent #313: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the live-computed limits stay in lockstep with the page-19 limits (since both derive from the same
process_X1data throughmr_limits()). The page-19 ↔︎ page-23 internal consistency Neave’s prose relies on holds by construction rather than by manual coordination of two cropped PNGs. - Implementation note — limits from first half only — The helper concatenates
process_X1(the in-control 24 points) withprocess_X2(the contaminated 24 points), then computes MR-based limits fromprocess_X1alone and draws those limits across all 48 points. This is the geometric expression of Neave’s “no recomputation” rule: the limits sit where the stable-period data put them and let the second-half points breach them where the special cause appears. - Decided in — Issue #345 under the #313 parent / #309 epic.
- Landed in — #364 (commit
3f46262).
2026-05-26 — Replace Day 3 Six-Processes 6×2 panel PNG with an R-generated figure
- What — Replaced the cropped-PNG figure
assets/images/day-03/six-processes-12-charts.pngon Day 3 page 19 (Neave’s twelve small control charts arranged as six pairs A1/A2 … F1/F2) with an R/ggplot2 chunk that composes the panel via a newsix_processes_panel()helper. The same call extendsR/data/day-03-six-processes.Rfrom process-A-only (laid down under #343) to the full A–F dataset. - Where —
R/data/day-03-six-processes.R(extended — addsprocess_B1/B2,process_C1/C2,process_D1/D2,process_E1/E2,process_F1/F2plus asix_processesnamed list that drives the panel);R/functions/main-functions.R(addedmr_limits()andsix_processes_panel());content/days/day-03/06-six-processes.qmd; one PNG deleted fromassets/images/day-03/. - Source reference — Neave Day 3 page 19. Process recipes are described in the page-19 prose: A = total of four dice; B = number of heads when 25 coins are tossed; C = number of red beads in the paddle; D = breakfast-time pulse-rate over 24 consecutive days; E = average measurements on 24 small samples of manufactured cigarette-lighter sockets (Japanese case study); F = monthly United States trade deficit in billions of dollars (Chart F1: 2006–07; Chart F2: 2008–09). The A2/B2/C2 special-cause recipes are also given in the same prose.
- Why — Inherits the rationale of epic #309 and parent #313: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits into one-line code changes rather than new crop passes. The panel helper also unlocks Day 3.09’s extended A3–F3 grid (#345) and individual-chart variants (#346) by reusing the same composition pattern. Two data-tier decisions are recorded below.
- Data decision A — Simulated trio (A, B, C) uses fixed seeds — Neave does not print the throw-by-throw / toss-by-toss / paddle-by-paddle values for the three “All-Knowing” processes. The R file simulates them under fixed seeds so the resulting chart shapes match Neave’s published image:
set.seed(274)for A (inherited from #343),set.seed(151)for B,set.seed(88)for C. Process B usesrbinom(24, size = 25, prob = 0.5)for B1 and a 14-toss steady-state followed by 10 tosses with coin counts 27, 29, …, 45 for B2 — the special-cause recipe Neave describes. Process C usesrbinom(24, size = 50, prob = 0.20)for C1 (Neave’s nominally 20%-red urn) and the same for the first 18 paddles of C2, with the final 6 paddles modelled as2 * rbinom(6, size = 50, prob = 0.20)to mimic “summing the two junior inspectors’ counts.” Seeds were chosen so each panel reproduces the visual pattern Neave’s prose identifies — A2’s step shift, B2’s climb to the upper limit, C2’s late spike. The same dataset feeds #345 (the extended A3–F3 panel) so the page-19 ↔︎ page-23 internal consistency Neave’s prose relies on holds across both pages. - Data decision B — Digitised trio (D, E, F) is visual digitisation, not historical truth — The “serious” processes are real-world series whose raw values Neave does not reproduce: D is personal pulse data, E is a confidential Japanese case study, F is monthly BEA trade-deficit data Neave rounded for the chart. The 48 values for each of D, E, F in
R/data/day-03-six-processes.Rare digitisations of the printed chart on page 19 — they reproduce the visual shape (D1 baseline + D2’s beta-blocker drop in the final four days; E1’s tight 15.91 baseline + E2’s transient fault around points 10–12; F1’s 2006–07 stability + F2’s 2008–09 financial-crisis trough and partial recovery) without claiming to be the original BEA / case-study / personal values. The pedagogical signal — that all six stable charts look broadly alike and all six unstable charts differ wildly — is preserved either way. - Decided in — Issue #344 under the #313 parent / #309 epic.
- Landed in — #363 (commit
f7c4a95).
2026-05-26 — Replace Day 3 individual A3–F3 chart PNGs with R-generated figures
- What — Replaced the six cropped-PNG figures
assets/images/day-03/chart-{A,B,C,D,E,F}3-individual.pngon Day 3 page 30 (Neave reproduces each of A3–F3 larger and individually, with the points numbered along the horizontal axis to support the prose discussion) with six R/ggplot2 chunks. The shared layout is encapsulated in a newindividual_process_chart(processes, letter)helper that consumes the samesix_processesnamed list laid down under #344 and reuses the limits-extension logic from #345. - Where —
R/functions/main-functions.R(addedindividual_process_chart()immediately aftersix_processes_extended_panel(); added a small additivex_breaksparameter torun_chart_plot()so the page 30 charts can label every third point instead of all 48);content/days/day-03/09-the-six-processes-revisited.qmd; six PNGs deleted fromassets/images/day-03/. - Source reference — Neave Day 3 page 30. The page-30 prose explicitly motivates the larger format: “I’ll reproduce Charts A3–F3 but now with the points numbered along the horizontal axis in order to aid the discussion.” The point-specific references in the prose (e.g. “Point 31 drops onto the LCL”, “Point 35 (November 2008)”) drive the choice to show x-axis labels here whereas they were suppressed in the stacked panel on page 23.
- Why — Inherits the rationale of epic #309 and parent #313: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and the limits-extension geometry remains in lockstep across page 19 (recomputed limits, #344), page 23 (extended-stack panel, #345), and page 30 (these individual variants) by sharing one helper stack and one dataset.
- Implementation note — same pedagogy, larger frame — Each individual chart concatenates
process_X1(24 in-control points) withprocess_X2(24 contaminated points), computes MR-based limits fromprocess_X1alone, and draws those limits across all 48 points — identical to the page-23 stacked panel. The two differences are visible: the figure is rendered larger (≈9×3.5 inches versus ≈7×2 per row in the stack), and x-axis labels are turned on with ticks spaced every third point (3, 6, 9, …, 48) so the prose can refer to specific point numbers without the labels becoming unreadable. No data changes — the samesix_processeslist feeds all three pages. - Decided in — Issue #346 under the #313 parent / #309 epic.
- Landed in — #365 (commit
4a1b7d0).
2026-05-26 — Replace Day 3 Charts A1 / A2 (purple-limits) PNG with an R-generated figure
- What — Replaced the cropped-PNG figure
assets/images/day-03/charts-a1-a2-purple-limits.pngon Day 3 page 15 (the two control charts showing standard-deviation-based limits in magenta, the first half of Neave’s six-processes / page-19 contrast) with an R/ggplot2 chunk that simulates Neave’s dice recipe and computes the limits live. - Where —
R/data/day-03-six-processes.R(new — definesprocess_A1,process_A2);R/functions/main-functions.R(addedhline_colourparameter torun_chart_plot(), defaulting to blue so every existing call site is unchanged);content/days/day-03/05-how-do-we-compute-control-limits.qmd; one PNG deleted fromassets/images/day-03/. - Source reference — Neave Day 3 page 15 (single figure) and page 19 (the full six-processes panel from which it is excerpted). Process A is described in the page-19 prose as “the total ‘spots’ showing when four dice are thrown” (24 throws); the A2 special-cause recipe is “four dice were used in the first six throws … but only two dice were used in the next six throws and then six dice for the rest of the time.”
- Why — Inherits the rationale of epic #309 and child #313: SVG output is crisp at any zoom, adapts to dark mode via the CSS-filter mechanism from #310, and turns chart edits (or the swap from purple-limits to blue-limits across pages 15 ↔︎ 19 — to be carried out under #344) into one-line code changes rather than new crop passes. Two non-trivial data decisions are recorded below.
- Data decision A — Process A dice data is simulated, not transcribed — Neave does not print the original throw-by-throw dice totals; he simulated them himself when preparing the source material in the 1980s and reproduced the resulting charts. The 48 values in
R/data/day-03-six-processes.Rare re-simulated underset.seed(274)so the visual shape of A1 (24 four-dice totals fluctuating around ≈14) and the special-cause shape of A2 (six four-dice totals around ≈14, then six two-dice totals around ≈7, then twelve six-dice totals around ≈21) both reproduce Neave’s published charts. The seed is not arbitrary: it was chosen by a sweep over seeds 1–300 that minimised the gap between the two pedagogical claims Neave’s prose makes about page 15: “those purple limits on this Chart A1 (computed using standard deviations) are virtually the same as the blue ones (computed using moving ranges)” (under seed 274, A1’s 3σ ≈ 8.72 vs. 2.66·MR̄ ≈ 8.56 — agreement to within 2%) and the page-19 limits on A2 “are approximately twice as far apart” (under seed 274, A2’s 3σ ≈ 22.52 vs. 2.66·MR̄ ≈ 11.22 — ratio 2.01). The blue (“page 19”) limits will be computed from the same dataset when the six-processes panel chart is implemented under #344, so the page-15 ↔︎ page-19 internal consistency Neave’s prose relies on continues to hold across the two pages. - Data decision B — “purple” rendered as magenta — Neave prints the contrasting limits in a saturated pink-purple. The R chunk uses pure magenta (
#ff00ff), which is the colour-wheel point that survives the dark-modeinvert + hue-rotate(180deg)filter from #310 cleanly (invert flips magenta to green; the 180° hue-rotate sends green back to magenta). The qmd prose, the figure caption, and the describe-block were updated to read “magenta” rather than “purple” so the alt-text matches what the reader sees in either mode. Neave’s contrast with the blue moving-range limits on page 19 is unchanged. - Decided in — Issue #343 under the #313 parent / #309 epic.
- Landed in — PR #362 (commit
8eebec7).
2026-04-28 — Remove decorative clock icons and the welcome-page paragraph that introduces them
- What — Removed all 38 chapter-level
create_clock(HH, MM)decorative SVGs across 15 day chapter files (Day 1, Day 5, Day 8), plus the 4 illustrative clocks on the welcome page (index.qmd) — 42 call sites in total. On the welcome page, the three sentences that introduced the clock icons to the reader were also removed: “Little clock icons such as those I’m showing you against this paragraph will appear both on the opening page for each day against a description of the day’s contents and also at various places within the text. Again, treat these indications as rough guides rather than instructions. I believe they will help you to pace yourself appropriately through the reading and particularly when carrying out the activities.” The surrounding paragraph (start/end times, lunch-break box, Day 1 differing length) remains intact. Each clock site was wrapped in a:::: {.columns}85%/15% layout that existed only to position the clock; the wrapper was lifted so prose flows full-width. Thecreate_clock()function andCLOCKlayout-constants block were deleted fromR/functions/main-functions.R, andtests/testthat/test-create-clock.Rwas removed. - Where —
index.qmd(welcome page, ~3-sentence prose excision); 15 chapter QMDs acrosscontent/days/day-01/,content/days/day-05/, andcontent/days/day-08/01-introduction.qmd;R/functions/main-functions.R;assets/templates/chapter-template.qmd;tests/testthat/test-create-clock.R(deleted). - Source reference — Neave’s printed source uses small clock-face icons in the page margins to anchor each section to a wall-clock time in the original 9 am–5 pm workshop schedule (e.g. “9.30”, “10.25”, “12.00”). The welcome paragraph that introduces those icons is in the Welcome section of the printed book.
- Why — Three reasons. (1) Accessibility: the ggplot SVG clocks had no
aria-label, no text alternative, no dark-mode variant, and rendered too small to read on most viewports. (2) No semantic value for self-paced web readers: the wall-clock times only made sense in the original workshop schedule the icons anchor to, which does not exist on the web; the chapter-top reading-time indicator (filters/reading-time.lua) already conveys actionable pacing. (3) Broken transcription on Day 5: all 13 clock calls in02-points-7-to-14.qmdand03-the-deadly-diseases.qmdwere stamped to12:00, almost certainly a transcription artefact. The welcome-page sentences that introduce the icons were removed because, with the icons gone, “Little clock icons such as those I’m showing you against this paragraph” no longer has a referent — leaving the prose would mislead the reader. - Decided in — Issue #286. The issue body excluded
index.qmdfrom its file list, butindex.qmdwas a hidden caller ofcreate_clock()whose meta-commentary paragraph was load-bearing on the icons; the welcome-page excision was made in the same change to keepquarto rendergreen and the remaining prose internally consistent. - Landed in — PR #288 (commit
6d8b87e).
2026-04-28 — Encode session_minutes per chapter from Neave’s clock budgets; leave Days 5 and 8 unset
- What — Added an optional
session_minutes:front-matter field surfaced byfilters/reading-time.luaas a second number alongside the reading-time estimate (~ N min reading · ~ M min recommended). The two numbers are framed as independent measures: the reading metric is a literal 200-wpm text-throughput floor;session_minutesis the author’s editorial allocation including reflection and activities. Encoded the field on Day 1’s clean-clock chapters (10 of 13 chapters) using the gap between consecutive clock anchors as the budget. The filter collapses to the single-number reading form when the two values are within ±1 min (combined rounding noise ofceilon one side and Neave’s 5-min clock granularity on the other) — currently affects04-resources,06-outline, and09-different. Leftsession_minutesunset on Day 5 and Day 8 despite Neave’s source having clock data on those days, because the data is editorially unreliable. - Where —
filters/reading-time.lua(filter);assets/templates/chapter-template.qmdandworkflow/PATTERNS.md(docs);content/days/day-01/{01,02,03,04,05,06,07,08,09,11}-*.qmd(10 chapters set). Day 1’s10-relief.qmd(gap spans the lunch break — would conflate eating with reading),12-intro-activity.qmd(last clocked chapter — no next anchor to measure to), and13-major-activity.qmd(no source clocks) deliberately left unset. All Day 5 and Day 8 chapters left unset. - Source reference — Neave’s printed source uses clock-face icons at the start of each section to anchor it to a wall-clock time in the original 9 am–5 pm workshop schedule. The gap between consecutive icons gives the editorially-intended time budget for the section. On Day 5 (chapters
02-points-7-to-14.qmdand03-the-deadly-diseases.qmd), all 13 clock calls are stamped to12:00, almost certainly a transcription artefact rather than Neave’s intent. On Day 8, only one clock anchor exists (9:00, at the start of01-introduction.qmd). - Why — Encoding clock budgets where they are reliable surfaces Neave’s own pacing signal alongside the reading-time floor; the implied wpm rate across Day 1 ranges from ~35 wpm to ~240 wpm depending on chapter, so the two numbers measure genuinely different things. The decision to omit the field on Days 5 and 8 — rather than emit a calculated number from the broken/insufficient source — is the deviation: we are silently dropping Neave’s published clocks where the underlying data does not justify carrying them through. The dual-number indicator only renders when
session_minutesis set and differs materially from the reading estimate, so Days 2–12 fall back to the existing~ N min reading [+ activities]output unchanged. - Decided in — Issue #287.
- Landed in — PR #289 (commit
7eea220); rendering rules subsequently refined.
2026-04-26 — Glossary discoverability cue; restyle <dfn> to non-italic + amber underline
- What — Two changes that together close the discoverability gap left by the appendix-glossary entry below. (1) Added a new paragraph to
index.qmd’s “Page references and call-outs” section listing the seven glossary-marked terms by name and pointing first-time readers at the Glossary appendix. (2) Replaced the user-agent default<dfn>rendering (italic) with an upright face plus a 2px solid amber underline, so the marker no longer collides visually with Neave’s own use of italics for emphasis. Updated the corresponding paragraph inaccessibility.qmd(which previously still described the removed tooltip behaviour) to describe the new visual treatment and its WCAG 1.4.1 status. - Where —
index.qmd(one new paragraph in the front-matter “Page references and call-outs” section),assets/styles/main.css(newdfnrule in light-mode + dark-mode underline-colour override; removed leftover.dfn-tooltipdark-mode rule),accessibility.qmd(rewrote the “Glossary tooltips” paragraph that #265’s PR had left stale). - Source reference — Not a textual deviation from Neave; the new index.qmd paragraph is editor-voice site scaffolding (parallel to the green-callout and italic-bracket convention paragraphs already in that section), and the CSS change is a presentation choice. Neave’s seven term wordings and their in-prose locations are unchanged.
- Why — After #265 stripped the inline tooltip layer, an in-prose
<dfn>marker rendered as plain browser-default italic with no visual or textual cue that an appendix lookup existed; a linear first-time Day 1 reader had no obvious path to discover the glossary. A single discoverability paragraph in the preface closes that gap without reintroducing tooltip complexity. The italic default also collided with Neave’s own emphasis use (e.g.<dfn id="operational-definition">*operational* definition</dfn>rendered with italic stacking on italic), so a non-italic visual treatment was needed regardless. A 2px solid amber underline keeps the cue non-colour-alone (WCAG 1.4.1) and visually distinct from the 1px blue link underline. - Decided in — #268 (the preface-cue proposal from PR #267 review) plus a follow-up design conversation on the dfn-vs-italic collision.
- Landed in — PR #269 (commit
69520ab). - Related — Builds on the 2026-04-26 entry below (glossary appendix + tooltip removal). The optional follow-up phase noted there — linking the first per-Day recurrence of each term to the glossary anchor — remains out of scope and tracked separately.
2026-04-26 — Appendix glossary page; strip inline tooltip layer
- What — Added a new appendix glossary page at
content/appendix/glossary.qmdlisting the seven audit-approved course-defining terms (alphabetical, with stable anchor slugs and per-term backlinks to the chapter where each is first defined in context). Stripped the inline-tooltip layer that previously rendered the same definitions on hover/focus: removed thedata-definition="…"attribute from each of the seven<dfn>markers (retaining the<dfn>element and adding anid="anchor-slug"matching the appendix entry), deletedassets/scripts/dfn-tooltip.js, dropped its<script>registration in_quarto.yml, and removed the dotted-underline / popup CSS block inassets/styles/main.css. Plain<dfn>now renders in browser-default italic. Removed the two pa11y URL entries added in PR #263 specifically to test tooltip-focus accessibility (Day 11 ch 4, Day 12 ch 4) and added the new glossary page in their place. - Where — New:
content/appendix/glossary.qmd,workflow/PATTERNS.md(renamed fromCONVERSION_GUIDE.mdand pruned of conversion-mechanics sections),workflow/archive/CONVERSION_PROCESS.md(the conversion-only sections moved here for traceability). Modified:_quarto.yml(appendices list + script-tag removal),content/days/day-01/11-deming-story.qmd(5 dfn sites),content/days/day-11/04-theory-of-knowledge-operational-definitions.qmd(1),content/days/day-12/04-but-what-can-i-do.qmd(1),assets/styles/main.css(CSS block removed),.pa11yci.json,docs/glossary-audit.md, plus reference updates inREADME.md,.claude/agents/codebase-evaluator.md,scripts/build-interday-audit.R,scripts/archive/README.md, andworkflow/briefs/appendix-optional-extras-brief.yml. Deleted:assets/scripts/dfn-tooltip.js. - Source reference — The seven definitions are unchanged; same Neave-and-Deming sources cited in the 2026-04-25 audit entry below.
- Why — The audit’s stated audience is non-linear and returning readers (e.g. someone on Day 7 who’s forgotten what “special cause” means a week after Day 3). The first-defining-instance rule placed the tooltip exactly where Neave’s surrounding prose was already doing the defining work, and left every subsequent occurrence unmarked — so a returning reader on Day 7 got nothing. An appendix page is a better-shaped affordance for that audience: a single predictable destination, reachable from any chapter, with stable anchors. Once the appendix exists, the inline tooltip is a worse-placed duplicate and the dotted-underline / tab-stop / focus-popup machinery becomes pure cost. Keeping the
<dfn>element (without the tooltip plumbing) costs nothing and preserves the screen-reader signal at the right place; addingidattributes makes the appendix able to deep-link back into context. - Decided in — #265, which captured the audience-mismatch concern that closure of #168 had left unaddressed.
- Landed in — PR #267.
- Related — Supersedes the inline-tooltip framing in the 2026-04-25 entry below (the seven terms and their wordings remain; only the delivery vehicle changes). Out of scope for this PR but flagged in #265 as an optional follow-up phase: linking the first recurrence of each term within each subsequent Day to the glossary anchor.
2026-04-25 — Split info_callout into principle_callout and aside_callout
- What — The single
info_calloutclass was carrying two semantically distinct jobs: (a) presenting Deming’s quoted principles (the 14 Points and the 5 Deadly Diseases — 19 instances) and (b) carrying instructor-voice asides to the reader (drawing-activity instructions and Neave’s “NB” study-strategy advisory — 3 instances). Split into.principle_callout(19) and.aside_callout(3). Each typed callout now pairs a visible CSS::beforeicon withrole="note" aria-label="…"for screen-reader announcement:principle_callout→ ◆ + “Principle”;aside_callout→ ✎ + “Author’s note”;return_callout→ ▶ + “Study resource”;callout-emphasis→ ★ + “Key insight”. Visual styling (background, border, padding) is unchanged from the priorinfo_calloutdefinition; the two new classes share those declarations via a comma-list selector. The singlearrival_calloutinstance already hadrole="note" aria-label="Navigation note"and was left untouched. - Where —
assets/styles/main.css(callout component definitions, dark-mode overrides, mobile and dyslexic-font media queries). Content sites:content/days/day-03/03-the-importance-of-time.qmd(2 aside, 1 emphasis),content/days/day-03/04-more-on-the-sales-data.qmd(1 aside, the NB),content/days/day-04/01-introduction.qmd(1 return),content/days/day-04/04-points-1-to-6.qmd(6 principle),content/days/day-05/02-points-7-to-14.qmd(8 principle),content/days/day-05/03-the-deadly-diseases.qmd(5 principle, 1 return). Pattern documentation inworkflow/PATTERNS.md. - Source reference — Not a textual deviation from Neave; this is a presentation/markup change made in service of WCAG 1.4.1 (Use of Color).
- Why — WCAG 1.4.1 prohibits using colour as the sole means of conveying information. The former
info_calloutandreturn_calloutwere styled almost identically except for hue (yellow-green vs blue), so a colourblind reader could not distinguish them; screen-reader users had no audible cue at all. The icon adds a non-colour visual cue;role="note" aria-label="…"adds the screen-reader announcement. Splittinginfo_calloutwas incidental to compliance but warranted on its own merits — the two roles needed different labels (a “Deming principle” label is wrong for a drawing-activity note, and vice versa). - Decided in — Conversation on #163 (2026-04-25): user picked icons over text-only cues and approved the principle/aside split when surfaced.
- Landed in — PR #266.
2026-04-25 — Glossary tooltips on seven course-defining terms
- What — Wrapped seven specialised terms in
<dfn data-definition="…">markup at their first defining instance in Neave’s prose. Three were landed in PR #262 (#167): “common” causes of variation, “special” causes, and PDSA cycle (all incontent/days/day-01/11-deming-story.qmd). Four are added in this audit: “in statistical control” (Day 1 ch 11, line 154), System of Profound Knowledge (Day 1 ch 11, line 504), operational definition (Day 11 ch 4, line 21), and transformation in Deming’s sense (Day 12 ch 4, line 14). Three further candidates were considered and rejected: the Joiner triangle (definition is carried by an adjacent diagram, not a sentence), the funnel experiment (Neave describes the apparatus but the conceptual takeaway is taught experientially), and “appreciation for a system” (Neave never tightly defines the phrase as a unit — only Deming’s own definition of “system” appears in the chapter). Eachdata-definitionvalue is sourced from Neave’s prose (or a Deming quote Neave reproduces verbatim); none is synthesised from general knowledge. Full audit trail indocs/glossary-audit.md. - Where —
content/days/day-01/11-deming-story.qmd,content/days/day-11/04-theory-of-knowledge-operational-definitions.qmd,content/days/day-12/04-but-what-can-i-do.qmd. Audit document atdocs/glossary-audit.md. - Source reference — Neave’s prose at each first-defining-instance location, cited line-by-line in the audit document. The Deming quote inside the
operational definitiontooltip is from Out of the Crisis page 231[276] (which Neave already reproduces inline in the chapter); the Deming-tone phrasing inside thetransformationtooltip paraphrases Neave’s own blockquote of The New Economics Chapter 4. - Why — Tooltips help non-linear and returning readers (e.g. a Day 7 reader who has forgotten what “special cause” means a week after Day 3). The cap of ~10 terms is the discipline that keeps the feature from drifting into visual noise, tab-stop pollution, or pedagogical short-circuiting. The “reject rather than synthesise” rule keeps tooltip wording faithful to Neave; the rejected three are documented so future contributors don’t relitigate the same questions.
- Decided in — #261 (the cap of ~10 was baked into the issue’s acceptance criteria as the explicit thing to push back against; the audit ratified 7 marked / 3 rejected).
- Landed in — PR #263.
- Related — Companion to PR #262 (#167), which introduced the
<dfn>mechanism with three proof-of-concept terms. Superseded in part by the 2026-04-26 entry below: the seven terms remain, but the inline-tooltip layer was replaced by an appendix glossary page.
2026-04-23 — Strip inline [WB NNN] cross-reference suffixes
- What — Removed all 47 inline Workbook-page cross-references from day chapters and the appendix. The bulk (44) were the italic
*[WB NNN]*and plain[WB NNN]suffixes paired with a Day-chapter ref; the remaining 3 were prose-embedded shapes missed by the primary regex sweep —page 29 [also on WB 151](day-09),(or on WB 123)(day-08), and*(WB 56–67)*(day-05) — all rewritten by hand to strip just the Workbook pointer. A further paired alternative incontent/days/day-12/04-but-what-can-i-do.qmd:74—**(pages 14--29** *[or WB 220--234 along with today's page 23]***)**— was rewritten to**(pages 14--29, along with today's page 23)**, preserving the non-Workbook half of the original construct. Every WB ref was paired with an unambiguous Day-chapter pointer, so no navigational information was lost. Non-WB italic-bracketed paginations (e.g.*Out of the Crisis* page 120 *[141]*and*The New Economics* page 58[83], which point at parallel editions of Neave’s source books rather than the Workbook) were deliberately preserved. - Where — 29 files across
content/days/andcontent/appendix/. - Source reference — Throughout Neave’s original day chapters and appendix, which use a dual page-referencing system giving both the Day-chapter page and the corresponding printable-Workbook page.
- Why — Completes the Workbook-removal arc (#185 / #195 / #196 / #202 / #210 / #212). The printed Workbook no longer exists as a separate artefact in this delivery, so the WB page numbers had nothing on the site they could resolve to. Leaving them in place would have kept the codebase half-Workbook, half-not, and would have left a pattern for future per-day PRs to accidentally copy forward. The cross-reference utility they offered to PDF-edition readers is marginal — Day-chapter page headings still preserve structure, so a PDF-edition reader can correlate by heading.
- Decided in — Conversation on #213 (2026-04-23): user approved strip after audit confirmed all 44 regex-matched occurrences were safely mechanical; the remaining 3 prose-embedded shapes were identified during rendered-output verification and handled by hand.
- Landed in — PR #246 (commit
09afc70). - Correction (2026-09-13) — The Day 12 construct described above was misread. In Neave’s source (printed p13) the whole bracket
[or WB 220–234 along with today's page 22]is set in the small italic he uses for Workbook pointers, so “along with today’s page 22” belongs to the Workbook alternative — the Workbook copy of pages 14–29 omits page 22 — and was never a non-Workbook half. The kept clause also carried an older 22→23 slip. Wave 2’s Day 12 pass (#817, findingD12-25) removed it, so the sentence now reads “(i.e. pages 14–29)”, consistent with how this entry treated every other Workbook pointer.
2026-04-23 — Rewrite index.qmd front-matter Workbook prose
- What — Stripped or rewrote the three Workbook-scaffolded sections in the front-matter
index.qmd:- “To print or not to print…” — compressed to three paragraphs and reframed around the site’s digital-first active-learning model. Dropped the 2020 sponsor/“hosts” history, the “A. PLEASE START HERE” file pointer, the B1–B4 Workbook instalment definition, the Adobe Acrobat two-page-mode instructions, the gutter-margin explanation, and the back-to-back / non-duplex print procedures. Retained a single paragraph acknowledging that readers who prefer paper can use their browser’s Print / Save-as-PDF.
- “Information boxes, etc” → renamed “Page references and call-outs” and compressed to three paragraphs. Removed the yellow/blue
.workbook_calloutround-trip demonstration (including the embedded example divs), the “moving to and from the Workbook” framing, and the[WB NNN]notation paragraphs. Preserved the Appendix/Day page-reference disambiguation convention, the description of green.info_calloutboxes (swapping Neave’s Workbook-page example for a site-native one on Day 4 page 16), and the in-quote[italics in square brackets]clarification convention. - “Guidance on printing and binding” — deleted entirely, including the Neave author’s note about Adobe Acrobat rendering, the ring-binder recommendation, the gutter explanation, the duplex-on-non-duplex print procedure, and Neave’s own three-ring-binder setup with the “C. Front covers for binders” pointer.
- Where —
index.qmdfront matter. - Source reference — Neave’s “A. PLEASE START HERE” file, pp. 8–13.
- Why — Same rationale as #196, #202, and #214: the printed Workbook no longer exists as a separate artefact in this delivery, the “A. PLEASE START HERE” / B1–B4 file-structure vocabulary doesn’t correspond to anything on the site, and Adobe Acrobat / duplex-printer guidance doesn’t apply to the Quarto HTML rendering. The site captures reader responses through embedded text inputs and a per-activity notes-download button, so the printed writing-surface framing was actively misleading.
- Decided in — Conversation on #212 (2026-04-23): user approved the three-decision set (compress ¶1, rename Section B, delete Section C entirely, combined deviations-log entry).
- Landed in — PR #245 (commit
b2a86f2). - Related — #213 still tracks the pending decision on inline
[WB NNN]cross-reference suffixes; that question is deferred out of this PR.
2026-04-23 — Dead external links to deming.org.uk
- What — Five external hyperlinks to
deming.org.ukretired because the domain no longer resolves. Two treatments were applied:- Wayback substitution (4 sites) — references in
content/days/day-01/02-rediscovered.qmd,content/days/day-01/06-outline.qmd,content/appendix/11-references-and-sources.qmd, andindex.qmdnow link to the 2012-01-05 archived snapshot (web.archive.org/web/20120105232234/…) with an inline annotation that the live site is no longer online. The Feb 2022 “being upgraded” note in11-references-and-sources.qmdwas rewritten accordingly. - De-linked with editorial note (1 site) —
welcome.qmd’s book-ordering footnote de-linked and annotated “no longer trading”.
- Wayback substitution (4 sites) — references in
- Where —
welcome.qmd,index.qmd,content/days/day-01/02-rediscovered.qmd,content/days/day-01/06-outline.qmd,content/appendix/11-references-and-sources.qmd. - Source reference — Neave’s text treats the domain as a live resource: the UK Deming Transformation Forum’s Learning Store (bookshop/materials).
- Why —
deming.org.ukno longer resolves and has only one Wayback capture (2012); the Forum appears to have wound down. The two book-ordering footnote contexts were split:welcome.qmd’s was fully de-linked because pointing readers at a 2012 snapshot to “order the book” is actively misleading;index.qmd’s retained the Wayback link with a clear archival note because its surrounding prose is informational rather than transactional. - Decided in — Conversation on #239 (2026-04-23): user approved Wayback-where-available / editorial-note-where-not, with the welcome.qmd ordering footnote treated as “no longer trading”.
- Landed in — PR #242 (commit
53bc003). - Amended — This entry originally covered a sixth link,
rqoq.org.nz, described as a dead PDF-hosting mirror. That domain never existed: it was a mistranscription of Neave’snzoq.org.nz, which is live. The claim and its editorial note were withdrawn on 2026-09-12 — see2026-09-12-nzoq-host-url-mistranscribed.md. Thedeming.org.uktreatment recorded above is unaffected and still stands.
2026-04-21 — Rewrite or remove Workbook references from prose and front matter
- What — Drop or rewrite surviving references to “the Workbook” as a companion artefact, so readers are no longer pointed at a printed object that the site has replaced with in-page text inputs. Four distinct surfaces:
- Six prose sentences in day chapters (day-01, day-02, day-03, day-08, day-09, day-12) rewritten to drop the Workbook alternative while preserving the surrounding pedagogical point.
- Appendix return-navigation parentheticals of the form
(Return to Workbook page X / Day Y page Z.)— ~40 instances acrosscontent/appendix/*.qmdreduced to(Return to Day Y page Z.). - Appendix section-heading cross-references (
## Point 7. … *(Workbook pages 70–71 / Day 5 pages 2–3)*) reduced to just the Day-chapter half. welcome.qmd:111footnote rewritten to describe the site’s in-page text-input model rather than the printed Workbook B1–B4.
- Where — See above. One sweep landing across day chapters, appendix, and the front-matter welcome page.
- Source reference — Neave’s original course materials treat the Workbook as the reader’s writing surface and use Workbook page numbers as a parallel reference system alongside Day-chapter page numbers.
- Why — The printed Workbook no longer exists as a separate artefact in this delivery; leaving the cross-references in place would send readers looking for something that isn’t there. The Day-chapter page numbers carry the full navigation intent on their own.
- Decided in — #185 decision comment (D1/D2).
- Landed in — PR #214 (closes #209, #210).
- Related — #213 tracks the still-pending decision on inline
[WB NNN]cross-reference suffixes; #212 covers theindex.qmdfront-matter Workbook prose still to be addressed.
2026-04-21 — Remove inline “see Workbook p. N” page-reference call-outs
- What — Delete the
.workbook_calloutdivs and their inline “see Workbook p. N” page-reference anchors throughout day chapters. Remove the associated CSS class and any manifest fields that validated their presence. - Where — All
content/days/day-*/chapters that previously carried.workbook_calloutdivs. - Source reference — Neave’s original materials include inline cross-references pointing readers at specific pages of the printed Workbook for response-capture (writing answers, notes, reflections).
- Why — The site captures reader responses through embedded text inputs and a notes-download feature, so page references to a printed Workbook were dead links in the new delivery model. The class name and manifest field were coupled to the div and removed alongside it.
- Decided in — #185 decision comment (D1/D3).
- Landed in — PRs #196, #197, #202; commits
2198ed3,0cba98d,1b6ea4a,6375e17.