The authoritative reference for every historical claim in this module. Unit materials cite this page rather than restating history in their own words, so that a correction here propagates instead of leaving stale copies behind.
Each claim carries a verification status: established, contested, or
unsourced. The labels are defined in course/references.md. Reference labels
in square brackets — [P2], [S1] — resolve there.
A warning that is also the lesson: this is the part of the module where confident, fluent, wrong text is easiest to produce and hardest to notice. That applies to AI-generated drafts of this page, and it applied to the nineteenth-century printers too.
1. The people and the machine
Established. Charles Babbage designed the Analytical Engine, a general-purpose mechanical computing machine, from the 1830s onwards. It was never completed in his lifetime. Its architecture separated a "store" (memory) from a "mill" (processing), and it was to be programmed with punched cards adapted from the Jacquard loom. [S1], [S4]
Established. In 1840 Babbage lectured on the Engine in Turin. Luigi Federico Menabrea wrote up an account in French, published in 1842. [P1]
Established. Augusta Ada King, Countess of Lovelace, translated Menabrea's article into English and appended seven Notes, A to G, of her own. The translation with Notes appeared in 1843 in Taylor's Scientific Memoirs, volume 3. Her Notes run to roughly three times the length of the article she was translating (a commonly repeated characterisation of the 1843 text, not a figure the text itself states). [P2]
Established. Note G contains a table setting out, operation by operation, how the Engine would compute a Bernoulli number. [P2]
2. "The first program"
Contested — and the contest is the teaching point.
The claim "Note G contains the first computer program" is useful shorthand and a poor historical statement. What is actually disputed, and by whom:
- What Note G contains is not in dispute: an explicit, ordered, operation-by- operation specification of a computation, including working variables and a repeated group of operations, intended for a general-purpose machine. [P2]
- Whether that constitutes "the first program" depends on a definition nobody agreed in advance. Babbage had written sequences of operations for the Engine earlier, in unpublished notebooks. [S1], [S4]
- How much of the Notes was Lovelace's own work is genuinely disputed. Stein [S2] argues for a substantially smaller contribution than the popular account; Toole [S3] argues for a larger one; Hollings, Martin and Rice [S5] work through the surviving correspondence in detail. Babbage's own account [P3] is a primary source written by an interested party decades later.
How the module handles this. Unit 2 states only the checkable core: Note G was published in 1843 and contains an ordered operation table intended for the Analytical Engine. It reports “first program” as a common, contested retrospective description rather than claiming priority. It does not adjudicate the authorship question or pretend the question is settled in either direction.
A claim being contested does not make it unknowable or make all positions equal. It means the honest statement is "sources disagree, here is the disagreement", which is a different skill from repeating whichever version you met first.
3. The indexing convention in Note G
Established, and verified computationally.
Lovelace numbers only the Bernoulli numbers that are not zero. The odd-index Bernoulli numbers above the first are all zero, and in her scheme they simply do not receive labels. Her label numbers are therefore one smaller than the modern indices — her Bk is the modern Bk+1:
| Lovelace's label | modern index | value |
|---|---|---|
| B₁ | B₂ | 1/6 |
| B₃ | B₄ | -1/30 |
| B₅ | B₆ | 1/42 |
| B₇ | B₈ | -1/30 |
Note G's worked example computes her B₇, which is the modern B₈ = -1/30.
This mapping is implemented and tested in
course/lab/reference_bernoulli.py (ada_to_modern_index,
ADA_NOTE_G_INDEX_MAP) and covered by tests/test_reference_bernoulli.py.
Why the module makes so much of this. It is a specification hazard of exactly
the kind that still causes defects: two systems, the same symbol, different
meanings, and no error message when they meet. A learner who asks an AI to
"reproduce Ada's Bernoulli calculation" and compares the result against a modern
table will see a mismatch that is nobody's arithmetic error. The checker reports
it as ada-indexing.
4. The error in the published table
Established: the table printed in Note G contains an error, and it is in operation 4.
Established (facsimile [P2a], accessed 2026-07-23): operation 4 acts on the variables
²V₅ and ²V₄, in that order, and its stated result is (2n−1)/(2n+1). Since
V₄ holds 2n−1 and V₅ holds 2n+1, producing that result requires dividing
V₄ by V₅. The table prints the operands the other way round. See the facsimile
recorded at [P2a]; the diagram is headed "Diagram for the computation by the
Engine of the Numbers of Bernoulli. See Note G (page 722 et seq.)", which is
also the source for the page number now given in [P2].
Established (facsimile plus correction of record): the correct ordering is
V₄ ÷ V₅; the published V₅ ÷ V₄ inverts the division. The location and the
inversion are established by the facsimile [P2a] and the archival correction of
record [S8], and corroborated by [S7], a detailed independent reconstruction,
self-published. The corrected table computes −1/30 —
Ada's B₇, the modern B₈.
Established (facsimile plus [S7] §5.2): operation 4 is not the only printed fault. Glaschick's errata list for the same table also records operation 24: "In line 24 the negative value of V₁₃ must be transferred to V₂₄, i.e. V₂₄ − V₁₃ must be calculated. Also, in the 6th column it must read = − B₇." As printed, operation 24 transfers the value without that sign inversion. Operation 21 carries further printed defects of the same kind. So "the table as printed" is not one faulty object with one result.
Established (recomputed in this module): the result depends on which question is
asked, and there are at least four. course/lab/noteg.py reconstructs the 25
operations and runs them with exact arithmetic. The run that repairs both faults
reproduces the documented −1/30, which is what earns trust in the
reconstruction. The others then answer different questions:
| What is executed | Operation 4 | Operation 24 | Earlier B values | Result |
|---|---|---|---|---|
| The intended computation | repaired | repaired | supplied | −1/30 |
| One printed fault, in operation 4 | as printed | repaired | supplied | 139/630 |
| The literal single table | as printed | as printed | supplied | −139/630 |
| One printed fault, in operation 24 | repaired | as printed | supplied | 1/30 |
| The faulty routine run from the start | as printed | repaired | generated by itself | −25621/630 |
Withdrawn: an earlier version of this module stated that "the as-printed table
computes 139/630" and that the widely repeated −25621/630 "does not survive
recomputation". Both statements were wrong, in the same way and for the same
reason: they did not say which object was being executed. The 139/630 run
repairs operation 24 without saying so, and −25621/630 reproduces exactly under
the reading where the faulty routine generates the earlier Bernoulli numbers it
then consumes — a reading Note G's operation 25 invites, since it increments n
so the Engine can go round again. Those accounts do not state their
interpretation; neither did this module. The error is retained here rather than
quietly repaired, because it is the module's own instance of the failure it
teaches.
Still contested: how it got there. The common description is a typesetting error rather than a mistake in the procedure Lovelace devised — Babbage's 1864 memoir records that she caught an error for him, and this one is often read as introduced in printing. But that attribution is an inference, not something the table itself can settle, and whether Babbage prepared or checked the table bears on the unsettled authorship question in section 2. Do not state the printer, or any individual, as the cause.
A caveat that is itself the lesson. The facsimile consulted is a single
compressed web image [P2a]. From it, the operand order (V₅ before V₄) and the
location (operation 4) are legible and match the secondary account; the division
operator is small enough at that resolution to be easy to misread — on a first
pass it can look like a plus sign. The value chain has now been recomputed from the
operation sequence (course/lab/noteg.py), so each result rests on the module's
own tested code rather than on repetition; a higher-resolution facsimile or the
physical page in Scientific Memoirs vol. 3 would still settle the fine typography
beyond doubt, and is needed before the operation-24 reading is treated as anything
more than Glaschick's. What is settled now is the location of the operation-4
inversion, the operand order, and — by computation, under stated interpretations —
what each reading of the table produces.
Why this restraint is the lesson, not a limitation. Unit 16's teaching point is not "here is an amusing bug in a famous document". It is that a published, respected, widely-cited table carried an error for a long time because readers trusted it instead of checking it, and that the specific story now attached to that error has itself propagated by repetition. A fluent AI system will produce a confident, detailed account of the Note G error on request. So will many websites. Being able to say "that is the common claim, here is what is actually established, here is what would settle it" is the transferable skill — and it is one this module has to model rather than only describe, which section 4 records it failing to do and then repairing.
5. The "originate anything" passage
Established that the passage appears in Note G [P2]. Lovelace writes that the Analytical Engine "has no pretensions whatever to originate anything", and that it can do "whatever we know how to order it to perform".
Contested what it implies for modern systems. Unit 17 asks learners to compare the claim with what a language model does, and is written to leave the question open rather than resolve it. Both of the easy readings are available and neither is obviously right:
- A language model produces text no human wrote, so in some sense it originates.
- A language model produces statistically likely continuations of its training data given a prompt, and "we ordered it to perform" exactly that.
The honest position is that Lovelace was writing about a specific machine she understood in detail, that the passage is being applied well outside its original context, and that the argument turns on what "originate" means — which is a philosophical question the module does not settle. Present it as a live question. Quote briefly; the source is public domain, so the limit is pedagogical rather than legal.
6. Claim register
Every historical claim the module makes should appear here, with its status split into the three things "established" used to run together: how well it is supported, whether anyone disagrees, and whether this module has actually read the source. Those are independent — a claim can be well supported and disputed, or uncontested and known only through somebody else's citation — and collapsing them is how "established" came to mean both "we checked it" and "nobody argues with it".
scripts/check_claims.py validates this table: ids unique, every status drawn
from the closed vocabulary below, and every source key resolving to
course/references.md.
There is no "cited but not read" status, and that is deliberate. A source is
either checked or the claim does not go in. Naming a source you have not opened
tells a reader that the claim rests on something, while leaving unexamined the
only question that matters about it — and it is the same move as a generated
citation that points at a real work saying something else. The vocabulary
therefore records which kind of source was checked, primary or secondary, and
none for a claim with no source at all. none is honest; it means unknown.
| dimension | values |
|---|---|
| support | verified (checked against the source, or recomputed here) · supported (a source states it) · inferred (follows from the sources without being stated by them) · unverified (no check yet) · refuted |
| disagreement | uncontested · disputed (sources disagree) · unresolved (the record cannot settle it) |
| source | primary-checked (the original examined) · secondary-checked (a later work reporting it, read and located) · none (no source; the claim is unknown) |
| id | claim | support | disagreement | source | sources |
|---|---|---|---|---|---|
| H1 | Babbage designed the Analytical Engine; never completed in his lifetime | supported | uncontested | secondary-checked | [S1], [S4] |
| H2 | Store and mill architecture, punched-card input | supported | uncontested | secondary-checked | [S1] |
| H3 | Menabrea published a French account in 1842 | supported | uncontested | primary-checked | [P1] |
| H4 | Lovelace translated it and added Notes A to G, published 1843 | supported | uncontested | primary-checked | [P2] |
| H5 | The Notes are about three times the length of the article | inferred | uncontested | primary-checked | [P2] |
| H6 | Note G contains an operation-by-operation Bernoulli computation | verified | uncontested | primary-checked | [P2] |
| H7 | Note G's example computes Ada's B7 = modern B8 = -1/30 | verified | uncontested | primary-checked | [P2] |
| H8 | Ada's B1, B3, B5, B7 are the modern B2, B4, B6, B8 | verified | uncontested | primary-checked | [P2] |
| H9 | "The first program ever written" | inferred | disputed | secondary-checked | [S2], [S3], [S5] |
| H10 | Extent of Lovelace's own contribution to the Notes | unverified | disputed | secondary-checked | [S2], [S3], [S5] |
| H11 | The published table contains an error, in operation 4 | verified | uncontested | primary-checked | [P2a] |
| H12 | The error is an inverted division, V5 divided by V4 where V4 divided by V5 is correct | verified | uncontested | primary-checked | [P2a], [S7] |
| H13 | Operation 24 is also printed in a form the intended computation does not use | supported | uncontested | secondary-checked | [S7] |
| H14 | With operation 4 as printed, operation 24 repaired and earlier values supplied, the table computes 139/630 | verified | uncontested | primary-checked | [S7] |
| H15 | Taking both printed faults literally gives -139/630; repairing only operation 4 gives 1/30 | verified | uncontested | primary-checked | [S7] |
| H16 | The repeated -25621/630 reproduces when the faulty routine generates its own earlier values | verified | uncontested | primary-checked | [S6], [S7] |
| H17 | Which of those readings a given published account means | unverified | unresolved | none | |
| H18 | The error was a typesetting slip rather than authorial | inferred | disputed | secondary-checked | [S8] |
| H19 | "No pretensions whatever to originate anything" appears in Note G | verified | uncontested | primary-checked | [P2] |
| H20 | What that passage implies about language models | unverified | disputed | none |
H14, H15 and H16 are recomputed by course/lab/noteg.py, whose tests assert each
value; [S7] is cited for the operation sequence they run, and the arithmetic is
this module's own. H13 rests on [S7] alone, which is why TODO.md Stage 6
carries a task for confirming operation 24 against a high-resolution facsimile.