At a glanceNot solved · text not obtained
- The document
- A pigeon dispatch from Steenackers (director general of telegraphs and posts, Tours) to Mercadier (director of telegraphs, Paris), 2 November 1870, headed “chiffre des inspecteurs”: 736 four-digit coded groups (343 distinct) mixed with 437 clear words.
- Where
- Alexandre Pillon’s private collection of siege telegrams and pigeongrammes, item “Dépêches officielles, 2me série n 1”. His scan and transcription are not published here.
- The cipher
- A four-digit code whose table is an alphabetical lexicon laid out over 0000–9999, with beacon groups (0101, 0201, 0301, 0102) around words spelled in syllable groups.
- How it was tried
- Crib on the names in the clear heading, an alphabetical-position test, a spelled-run solver, a joint decoder and an acceptance engine, each with controls. Two readings Pillon suggested fail the alphabetical rule.
- What it says
- The last paragraph passes family news to generals’ wives at Nantes and Rennes, and an earlier part concerns pigeon fanciers; only isolated words and names are deciphered.
- Still open
- Nearly all of the coded text. The beacons’ meaning, the Nantes and Rennes names and the other recipient are unknown, and no second text in this code exists in the collection to test against.
- Credit
- Alexandre Pillon owns the material, transcribed it, and supplied the beacon idea and the alphabetical hint.
01 The telegram
The item is one of the pigeon dispatches of the siege of Paris, kept in Alexandre Pillon’s collection. Its printed heading reads Steenackers to Mercadier, “2me Série n 1”, Tours, 2 November 1870, with the words “chiffre des inspecteurs” in brackets. Steenackers directed the telegraphs and posts from Tours; Mercadier directed the telegraphs in Paris, at the central post in the rue de Grenelle. Pillon’s film print also carries a printed proclamation of Gambetta to the army and a stamp of the director general’s office.
The telegram is mixed. Its 1,173 tokens are 736 four-digit coded groups (343 distinct) and 437 clear words: names and addresses, and ordinary words between the coded runs. Pillon confirms that the clear words are in the original, so they are fixed context. The commonest groups are 0101 (49 times), 0201 (31) and 0301 (28), then 4914, 2119 and 8328. No plaintext of the telegram is known. It was not found by phrase search in Steenackers’ 1883 memoir (HathiTrust copy), in the parliamentary inquiry’s volumes of telegrams, in Favre’s book, in Dagron or in the 1872 article on the pigeon post; that is not proof that it was never printed.
No image is shown on this page. The scan and the transcription belong to Pillon and are unpublished; permission to republish them has not been given. The digit strings of the key runs used below were checked against his scan, and match his transcription digit for digit.
02 An alphabetical lexicon
Pillon’s own table for the prefects’ code, which he calls R1, is a 4-digit alphabetical word list with grammatical beacons (for instance 0136 and 0137, paired around a stretch of text). The inspectors’ code is not that table: only 18% of this telegram’s groups occur in R1’s table, against 10% by chance, and the values make no sense in context. Pillon’s remark that the inspectors’ code is “almost alphabetical”, with 83xx for S and 92xx for T, is what the project then tested.
Test: take the groups whose syllable values are fixed by the names below and place each value in an alphabetical French word list built from Favre’s books, the inquiry volumes and the 1872 article. The fractional position of the syllable predicts the number divided by 9999. For 13 syllable values the mean error is between 0.012 and 0.016; a random mapping gives about 0.33. Seven whole words fit the same way. So the table is an alphabetical lexicon laid out over 0000–9999, with words and syllables as entries. A group therefore predicts the initial letters of what it stands for, within a few percent of the alphabet. Pillon’s word “almost” stands: exceptions are possible and none has been identified.
Two side results follow. The group 4906 is a K-initial syllable and 0218 an A-initial one, so Steenackers is spelled S-TEEN-A-K-ER-S, phonetically, and no reversal is needed. And the Favre code of the Chaudordy letter (section 09) is not alphabetical at all.
03 Names spelled between beacons
The groups 0101, 0201, 0301 and 0102 come in pairs around a run of groups, and the repeated runs between them give words spelled syllable by syllable. The clear heading supplies the names, so the first cribs are checkable.
| groups | reading | evidence |
|---|---|---|
| 8328 9214 0218 4906 3316 8328 | S-TEEN-A-K-ER-S, Steenackers | opens and closes the telegram, first and last group equal; the heading names the sender |
| 5504 1122 2514 3316 | MER-CA-DI-ER, Mercadier | four pieces within 0.02 of their positions, mean error 0.010; rank 30 of about 30,000 strings by position alone |
| 6816 4001 6129 8328 | PI-GE-ON-S, pigeons | three identical occurrences; the topic is pigeon fanciers |
| 9113 8317 1504 | T-RO-CHU, Trochu | one of 28,897 candidate strings fits as closely; about a 0.15% chance that some of 51 names would, by luck |
Three groups recur in two words and agree: 8328 is S (initial in Steenackers, final in pigeons), 3316 is ER (final in both Steenackers and Mercadier), and 6129 is ON (in pigeons, and probably in ballon). The first guess for the heading, Ernest Mercadier spelled ER-NEST-MER-CA-DI-ER, did not survive: the alphabetical rule puts the first-name run 6819 3412 near P (Pierre, or another P-E word), not near E. Pillon then wrote that a different recipient stands before Mercadier, so the run is not a first name. For the groups before Mercadier the page keeps only that 5511 fits the abbreviation “M.” (error −0.007), and that 6819 3412 is a surname beginning P-E; 18 of 3,644 capitalised names fit within 0.005, so this is not specific. The other recipient stays unidentified.
The spelled-run solver (spell_solver.py) splits candidate strings so each piece fits its position. On the known runs the correct string is always in the top 0.5% of 24,000 to 31,000 candidates (pigeons rank 8, Mercadier 30, ballon 145, Steenackers 6 to 8). It shortlists; it does not decode.
04 Family news for generals
The last paragraph is made of short messages: tell a general that his wife is well, at an address at Nantes; tell the same of another family at an address at Rennes, in the quai de l’Université. That genre is typical of pigeon dispatches, and it was predicted before the computation: the prediction named the words est, bien portante and en bonne santé, and then the groups were scored.
| groups | word | position error |
|---|---|---|
| 3407 | est | 0.000 |
| 7027 0312 | PORT-ANTE (portante) | −0.010, +0.004 |
| 1026 8416 | bonne santé (three occurrences) | −0.004, −0.009 |
| 4007 | général | +0.011 |
| 5218 | madame (weaker: leur or lettre fit at +0.005) | +0.023 |
A random word pair fits two random groups within 0.01 each in 0.05% of trials. These words were not used to calibrate the rule, so the whole-word alphabetical rule holds outside its calibration set. The groups 9113 8317 1504 follow the word for general in the Rennes message, and spell Trochu. The Nantes name 9802 6124 fits Vinoy (error 0.012), but 0.7% of strings fit as closely, so Vinoy is not supported and is dropped. The Rennes name 1114 5911 0131 fits no siege-era name well (best 0.022). Pillon does not know who stood at either address; the quai de la Fosse was a commercial area. Who the families were is open.
05 What the decoders did
The project then asked how far position, word frequency and context carry. Each step was a test with a number, and a hypothesis was kept only if it improved the score by a rule fixed in advance.
- Benchmark loop (
bench_loop.py), 10 items with independent support, scored by the rank of the correct word among about 29,000 candidates (mean reciprocal rank, MRR). Position alone: 0.190. With a word-frequency prior: 0.565. With the bigram context of the clear neighbours: 0.615. Calibrating positions on R1’s numbering lowered it to 0.523 (R1 has no syllable entries) and two more ideas were rejected. At 0.615, six of the ten are first (general, est, Trochu, Mercadier, pigeons, Steenackers); the weak ones are bonne (rank 18), santé (87), portante (468) and ballon (13). The ten items were chosen because they were recognised, the easiest cases. - Joint decoder (
joint_loop.py), a search over the whole telegram that scores every way of cutting it into words, scored on 20 word occurrences. Whole-word groups only: 3 of 20. Letting a beacon-bracketed run be one spelled word: 11 of 20. The hits are general (twice), est, Trochu, Mercadier (twice), pigeons (three times) and Steenackers (twice). Free segmentation, one-meaning-per-group voting and neighbour bounds added nothing. The misses are bonne santé, portante and ballon; ordinary words still lose to function words on frequency. - Topic prior. Adding vocabulary from two pigeon-post texts (Dagron 1871 and the 1872 article, 23,433 words) raises the benchmark from 0.615 to 0.707 and moves ballon from rank 13 to rank 1, which neither position nor the fixed pieces could do (bal-l-on, with 6129 as ON, is still a hypothesis). Words absent from that corpus drop slightly (santé from 87 to 117, portante from 468 to 488).
- Piece consistency. Fixing the groups known from other words (6129 = on, 3316 = er, 8328 = s) does not by itself recover the other spelled runs: pigeons, Mercadier and Steenackers come out right but fail their null tests, and ballon is tied with bataillon by position.
The conclusion from these steps: the spelled-name mechanism is the big lever, and names and spelled words decode reliably; ordinary words need context the telegram does not supply by itself.
06 The engine, and what it refused
The work was then rebuilt as a wiki-driven loop with a calibrated acceptance gate (wiki/tools/engine.py): propose a reading for each group, run a battery of tests, accept only what passes, and re-validate earlier acceptances. The gate was calibrated by blinding the 22 supported groups and running it on the 10 gold units. At the loosest threshold it makes one correct acceptance (pigeons) and none wrong; at any stricter threshold it accepts nothing, right or wrong. Blind, the best proposal for a spelled run of three or more groups was right 4 of 4 (Trochu, Mercadier, pigeons, Steenackers), with small margins of 0.2 to 2.7 nats; for single words it was right 1 of 4.
Run on the telegram, the engine produced false acceptances, found on review and rolled back. The log records three:
- The first run accepted six units, the words de, vous, et, la and le and the nonsense spelling insurrection: frequent function words chosen by prior and position with almost no contextual evidence.
- With a context-margin rule added, the next run still accepted 5021 2704 as le, spelled in two pieces from a single occurrence.
- With piece-level consistency switched on, a third run accepted picard for 6816 1216 2112, overwrote two supported entries and then oscillated, accepting and demoting seven or eight units per loop. About 40 spelled units each tested at a 5% null give about two false accepts by chance.
Each rollback left a rule in the engine: a context margin of at least 3 nats, spelled units only for beacon-bounded runs, spelled words of at least four letters, and no overwriting of accepted entries. After the fixes the gate proposed 355 units and accepted none, and the loop stopped after three loops. The best near-misses are recorded as hypotheses, with the evidence each would need. So from this one telegram, with what is known, the engine cannot safely add a reading. The coverage figure used on this page, 20 supported entries and 12.5% of 608 coded (non-beacon) group occurrences, comes entirely from entries assigned by hand from the printed heading, the blind genre check and the name tests.
07 Pillon’s suggestions
Pillon’s contribution shaped the work. He sent the telegram and its scan, confirmed that the clear words are original, saw the beacon groups as brackets (as in R1, where paired beacons enclose a stretch of text), and said the table was almost alphabetical. The alphabetical hint is the one that was confirmed. His tentative readings (offered as guesses, “here probably…”) were tested against it:
- 5926 as reçu (“j’ai reçu votre dépêche”): the number sits at 0.593, where recevoir would be near 0.77.
- 0603 as dépêche: the number sits at 0.060, where the word would be near 0.25.
- 2215 as capitale: the number sits at 0.22, the word near 0.14.
Each is about 0.18 off, ten times the typical error, so none is supported; 5926 is an M or N word (mourir, mouvement, militaire, moyen), and 0603 an A word such as appui. His decomposition of the heading name as MER = 5511 followed by 6819 3412 as CAD and IER, scored 0.23 against 0.010 for MER-CA-DI-ER, and he withdrew it himself, writing that another recipient stands before Mercadier. Both outcomes are listed because the test is the point: the rule he suggested is the one that rejected these guesses, and he withdrew the decomposition himself.
08 What is not known
- Coverage. 20 supported entries; 12.5% of 608 coded non-beacon group occurrences have an accepted reading. The text is not read, and no sentence of the coded text is built from groups alone.
- Cross-validation. The second text for cross-validation does not exist in the collection: the best overlap of any other piece with the telegram’s 343 distinct groups is 6.2%, against 3.4% by chance. The Algeria volume of the parliamentary inquiry prints December 1870 telegrams headed “Chiffre des inspecteurs”, but in plain text only; their ciphertexts, in the Archives nationales or the foreign ministry archives, would be the test set.
- Beacons. What the different pairs (0101…0201, 0201…0101, 0301…0301, 0101…0102, 0102…0102) mean is unknown. Pillon warns against reading much into the first digit.
- Names. The Nantes and Rennes correspondents, and the other recipient before Mercadier, are unidentified.
- Ordinary words. They need a language model of the telegraph administration’s own text; Steenackers’ 1883 memoir is the candidate and its full text was not yet usable (Gallica asks for a human check, HathiTrust search found no passage).
- Small numbers. Everything rests on one document and on 20 hand-assigned entries; bias and tolerance for the position fit were set from the early anchors and not retuned.
09 A different cipher: the Favre code
Pillon’s collection also holds pigeon dispatches to Jules Favre, and a long letter of 18 December 1870 from Favre to Chaudordy, in a different numeric code. It is a different cipher and has no page of its own yet; the work on it is in progress, and it is mentioned here only so the two are not confused. Its table is not alphabetical, and for the Chaudordy letter the plaintext is printed in Favre’s book. The cipher follows that print for about its first 330 groups, then departs from it, and only vocabulary tied to the date and topic is firm (1792 for conférence, absent in October and mid-November, present from 28 November). It is not the inspectors’ code, and nothing above depends on it.
10 Code and wiki
The scripts, the notes and the lexicons are on GitHub: targets/pigeongrammes1870. The working knowledge base, built on the pattern of Karpathy’s LLM-wiki (raw sources, a wiki of claims, tests and questions, a schema and a log), is in targets/pigeongrammes1870/wiki: read SCHEMA.md, PROCESS.md, index.md and syntheses/Z01.md first. The log of the wiki includes the rollbacks described in section 06.
Pillon’s transcriptions and scans are not published here. The scripts read files that belong to him and will not run until those are put back next to them; DATA_NOT_INCLUDED.md in the folder lists them. The analysis, lexicons and results are in the folder without them.
11 Sources
- Alexandre Pillon, collection of siege telegrams and pigeongrammes (private), including the telegram of 2 November 1870 and his reconstructed tables R1, R2 and R3; his emails of 7 November 2026. Pillon and Bruno Debove, “Le pigeongramme chiffré de 1871”, Le Lien philatélique no. 144, September 2025 (cited as a related publication of the collection; its contents are not used here).
- Jules Favre, Le Gouvernement de la Défense nationale, vol. 2 (1871), on the Internet Archive: gouvernementdela02favr. Used for the word list and for the Chaudordy letter.
- “La poste par pigeons voyageurs”, Bulletin de la Société d’acclimatation, 2nd series, vol. IX (October 1872), pp. 624–664, on the Internet Archive: bulletindelasoci0209soci.
- F.-F. Steenackers, Les télégraphes et les postes pendant la guerre de 1870-1871 (Charpentier, 1883): Gallica ark:/12148/bpt6k220903s; HathiTrust hvd.hn6bui (searched, the telegram not found).
- Dagron, La poste par pigeons voyageurs (Project Gutenberg no. 19588); the parliamentary inquiry’s volumes of official telegrams (1875), including the Algeria report.
- Andrej Karpathy, the LLM-wiki pattern: gist 442a6bf5….
The scripts, notes and wiki are in targets/pigeongrammes1870/ in the project repository (code and notes, wiki); NOTES.md holds the chronological record. Pillon’s scans and transcriptions are his and are not published here.
Cite this page
Daniel Bourdeau, “The inspectors’ code of the Paris siege: Steenackers to Mercadier, 2 November 1870”, Cyphersolver, posted 7 November 2026, https://cyphersolver.com/pigeongrammes1870.html.
