Result: three constructed examples recover their exact keys and full plaintext, but the real-text candidates do not yield a coherent continuation. No new verified plaintext. The search scores 5,274,752 parameter settings across the eight substantial unsolved sections. This is a count of settings, not distinct cipher families.
Unlike Sessions 33–34, this is an actual decoding search. The previous decoded plaintext rune carries state forward, so the earlier bounds based only on the previous ciphertext rune do not apply.
The precise rule
Using the conventional zero-based ordering of the 29 Gematria Primus runes:
p[i] = (a*c[i] + b*p[i-1] + k) mod 29
Here c is ciphertext and p is the candidate plaintext. The complete search ranges are:
| Parameter | Range | Role |
|---|---|---|
| a | 1–28 | Ciphertext multiplier |
| b | 1–28 | Previous-plaintext multiplier |
| k | 0–28 | Constant offset |
| Initial plaintext state | 0–28 | Value preceding the first rune of the section |
There are 659,344 settings per target. The initial state is searched, not guessed or supplied to the recovery routine. b = 0 would remove plaintext feedback and return to an affine substitution already covered in earlier sessions, so it is omitted.
The rule stays fixed within a section. Words, punctuation and page breaks neither reset nor advance it. No selective rune skips, arbitrary alphabet permutation, nonlinear state update, longer memory or extra encoding layer is included. Each section may select a different parameter set.
Fit only the opening, then continue unchanged
The fitting window is the first 60% of a target, capped at 256 runes and ending at a complete word. This gives prefixes of 253–256 runes on the real sections.
Every setting is scored on that prefix using the unchanged LP1-trained word-boundary trigram model. The top 20 prefix-ranked candidates are retained for each target. The entire section is then decoded with each retained setting. The plaintext state reached at the cut carries directly into the suffix; there is no restart, refit or new initial-state search.
The scores below are mean natural-log language-model scores per rune plus word-end event. Higher is better. They are heuristic ranking scores, not calibrated probabilities or declarations of meaningful text.
| Section | Prefix runes | Untouched suffix runes | Best prefix score | That candidate's suffix score |
|---|---|---|---|---|
| 0 | 254 | 475 | −4.687 | −5.436 |
| 1 | 256 | 889 | −4.675 | −5.313 |
| 2 | 254 | 1,475 | −4.702 | −5.255 |
| 4 | 256 | 1,638 | −4.607 | −5.255 |
| 5 | 255 | 766 | −4.575 | −5.332 |
| 6 | 253 | 1,271 | −4.657 | −5.292 |
| 7 | 256 | 1,333 | −4.596 | −5.300 |
| 8 | 255 | 3,061 | −4.607 | −5.307 |
All eight prefix winners deteriorate on continuation. Inspection of the retained candidates' openings and continuation excerpts found scattered letter combinations and occasional short words, but no coherent reading. Across all 160 retained real-text candidates, full suffix scores range from approximately −5.587 to −5.151. Full decoded values and texts are saved for inspection.
This does not prove that every lower-ranked setting is meaningless. All specified settings were prefix-scored, but only the top 20 per section received complete continuation scoring and saved texts. The negative finding is bounded by the rule, the ranking model and that retention procedure.
Positive recovery controls
The controls encrypt the solved, 95-rune LP2 page 57, which is absent from the LP1 language-model training set. Three different parameter sets test a general multiplier, subtraction-like feedback and cumulative feedback:
| Control | a | b | k | Initial state | Exact plaintext rank | Full plaintext |
|---|---|---|---|---|---|---|
| General feedback | 5 | 7 | 11 | 13 | 1 | Recovered exactly |
| Negative multiplier, modulo 29 | 17 | 28 | 3 | 22 | 1 | Recovered exactly |
| Cumulative feedback | 1 | 1 | 0 | 9 | 1 | Recovered exactly |
For each control, selection uses only 53 runes; the other 42 remain untouched. All three recover the construction key as well as the full plaintext. Each correct prefix scores −2.567, and its unchanged continuation scores −1.896.
The reference key is used only to report its score and rank. It does not alter the exhaustive search or candidate ordering. These controls demonstrate unknown-key recovery for these three constructions. They reuse one short solved passage, so they are not three independent language samples or proof of recovery for every possible plaintext.
A random comparison
One generated sequence uses the same length and word layout as section 0. At every step it repeats the current rune with probability 86/12939; otherwise it chooses uniformly among the other 28 runes. It has no intentionally encoded message.
The same full search gives its best prefix −4.625, followed by an untouched suffix of −5.528. This illustrates that selecting from many settings can manufacture an apparently improved opening on random input too. It is one descriptive comparison, not a null ensemble, p-value or significance test. It does not preserve every real-text property.
What this mechanism predicts about repetitions
For two identical ciphertext spans decoded under the same a, b and k, their plaintext differences satisfy:
difference[j] = b^(j+1) * entering_state_difference mod 29
Because b is nonzero modulo the prime 29, two copies of the six-rune phrase either match at all six corresponding plaintext positions or none. This differs from the five-rune matching suffix forced by the earlier fixed previous-ciphertext difference model. The statement is conditional on shared parameters; our separately fitted section candidates are not assumed to share them.
For positions with two preceding plaintext runes, identical ciphertext neighbors obey:
c[i] == c[i-1]
exactly when
p[i] - (1+b)*p[i-1] + b*p[i-2] == 0 mod 29
Thus plaintext feedback does not automatically explain the shortage of ciphertext doubles. It requires the corresponding three-rune plaintext relations to be rare. When b = 1, that relation is an arithmetic progression, including constant triples.
The implementation verifies the phrase-difference identity for all 28 nonzero feedback multipliers and the repeat identity on 29 random round trips. C++ prefix scores are independently checked against the Python scorer for every retained candidate. These algebra and scoring checks support implementation correctness; they do not identify Cicada's cipher.
Decision and limits
This pass finds no supported decoding under the stated fixed, one-rune, linear plaintext-feedback rule. Exact recovery of the controls and failed real continuations make the result more informative than a search that cannot recover its own examples.
The wider family remains open: unknown symbol orderings, nonlinear updates, longer state, different resets and additional layers were not tested. The corpus and language model have also been used in earlier sessions, so suffix exclusion describes this fitting procedure rather than a globally blind research program.
This result does not justify adopting a more elaborate cipher solely because it has more adjustable parameters. A further mechanism needs an explicit new constraint and a continuation test, not just a few recognizable words in its best-scoring opening.
Reproduce
Run python -B plaintext_feedback_audit.py beside the existing local corpus and helper scripts. Requires Python, NumPy and a C++17 compiler available as g++. The wrapper compiles the search into a temporary directory, invokes it, verifies scores and writes the results. The executable and temporary input are not published or retained.
The eight real sections account for 5,274,752 settings. Including three recovery controls and the random comparison gives 7,912,128 settings. No network calls occur.