Date: 2026-05-02 Status: Closed. Family demoted to "tested under one specific parameterization, no candidate; broader sweep continues as Phase 2B.1.B."
What was tested
The Weltzeituhr (Berlin Alexanderplatz) keystream attack family, implemented in attacks/strategies/weltzeituhr_keystream.py:
- Cipher: Vigenère decryption against
K4_CIPHERTEXTunder a
24-character keystream derived from a Weltzeituhr city list.
- Keystream-derivation rule: first-letter only. Each city's
initial character. (One of several rules the docstring proposed; the others were not implemented in 2B.1.)
- City list:
1988_best_guessonly. A single hardcoded
ordering documented as "best guess pending primary-source verification" (the verified 1988 engravings remain Source TBD per the 2026-04-29 Synthesis Agent conclusion).
- Sweep: 24 starting offsets × 2 directions × 2 alphabets =
96 candidates per pass.
What actually ran
Per Supabase attack_runs aggregated as of close-out:
- 4 attack_runs rows for
weltzeituhr_keystream(started
2026-04-30 13:40, last last_seen_at 2026-05-02 15:14).
- Cumulative
total_attempts: ~1.26 billion. - Candidates that passed the crib gate: 0.
The four rows reflect runner restarts triggered by code pushes touching attacks/ (each push triggers a systemd reload via the runner's git-rev-watch loop). Per-run cumulative resets to 0 on restart; the 1.26 B is the sum across all four runs.
What that 1.26 billion actually represents
The strategy's iterate() is an infinite generator:
```python while True: pass_idx += 1 for offset in range(24): for reverse in (False, True): for alphabet_name, alphabet in (...): yield {"params": {..., "pass": pass_idx}, ...} ```
The base_keystream, the city list, and the alphabet pair are all fixed. Each "pass" is the same 96 decryptions; pass_idx is the only field in params that changes pass-to-pass, and the region key the distribution observer uses ignores it.
**1.26 billion attempts ÷ 96 candidates per pass ≈ 13.1 million repeats of the same 96 decryptions.**
Not 13.1 million unique candidates. Thirteen-point-one million repeats of the same ninety-six.
Distribution observer evidence
The observer (deployed 2026-05-02 — see experiments/2026-05-02-distribution-tracking/hypothesis.md) was active for a portion of this phase. Within the brief observation window:
- Distinct param regions populated: 96 (matches the cardinality of
the actual search space — confirms the strategy has 96 unique decryptions).
- Highest
ioc_p95observed across all regions and all flushes:
0.0479 (below the warm threshold of 0.05; in the noisy upper tail of random-uniform null whose p95 sits near 0.045).
- No region met the 12 consecutive flushes ≥ 0.05 acceptance
criterion.
Per the hypothesis doc, the kill criterion is "all regions p95 < 0.045 across 7 days." We have not run for 7 days, but we have run long enough to know the search space is exhausted — additional time under the current parameterization just re-tests the same 96 IOC values.
Verdict
Under the (first_letter, 1988_best_guess) parameterization, Phase 2B.1 produces no candidate. No region of the parameter space approaches the warm threshold. The family is **falsified under this single derivation rule + this single city list.**
This is a narrow falsification, not a broad one. The Weltzeituhr- keystream hypothesis as a whole remains live: any of the alternative derivation rules the strategy's docstring named (last-letter, length-modulo, vowel-count) could behave differently, and the verified 1988 city list could differ from the best-guess in ways that affect the keystream non-trivially.
What's left to test
Per the strategy file's own design comment:
1 keystream-derivation rule per pass (start with first-letter;
future passes may explore last-letter, length-modulo, etc.)
The "future passes" never happened. They become Phase 2B.1.B.
Open dimensions:
1. Derivation rules. First-letter is one of many plausible mappings from a city name to a keystream character. Last-letter, length-mod-26, vowel-count, consonant-count, sector-position-mod-26 are all defensible candidates with prior art in pre-computer cipher construction. 2. City list orderings. Beyond the best-guess sector ordering, alternatives include reverse-sector, alphabetical, and documented alternates for ambiguous sectors (e.g. CAIRO vs. ISTANBUL for UTC+2, LONDON vs. PARIS for UTC±0). 3. Verified 1988 engravings. Still Source TBD. Berlin tourism board, DDR Museum, Bundesarchiv photo archives are the live leads. When the verified list lands, every derivation rule should be re-run against it.
Action
- Attack queue position for the Weltzeituhr family: stays at #3
(per the 2026-04-30 priority queue), pending the broader sweep.
- Phase pivot: open **Phase 2B.1.B — Weltzeituhr derivation-rule +
city-list sweep.** See experiments/2026-05-02-phase-2b1b-derivation-and-city-sweep/hypothesis.md.
- The runner's
phasestring changes fromPhase 2B.1to
Phase 2B.1.B on the next push; a fresh attack_runs row gets inserted at restart, starting that phase's cumulative counter.
- The 2B.1 row in
prior_work.mdwill be updated by Codex on the next
digest pass to reflect this conclusion.
Methodology lesson for Tabula
A strategy whose docstring promises N derivation rules but implements 1, while the runner loops it indefinitely under a "visible aliveness" framing, will quietly accumulate enormous-looking attempt counters that exhaust their actual search space in milliseconds. The distribution observer made this visible within hours. Future strategies should:
1. State the per-pass uniqueness budget in the docstring (this strategy: 96 unique decryptions, then loops). 2. Implement all the parameter dimensions the docstring promises, or remove the unimplemented ones from the docstring. 3. When the per-pass budget is exhausted, the runner should either (a) advance to a new strategy or (b) clearly mark subsequent attempts as repetition for liveness-display purposes only — they do not contribute to coverage.