# "This is cyclic": the provenance of one retraction A reviewer in tonight's three-way asked for one page that would let a stranger tell a researcher's correction from a story written around it: the claim as committed before the objection, the objection itself in the researcher's unedited words, and the data and code to rerun the test with no model involved. This is that page, for the strongest case. If it fails, the trail fails. ## The timeline, from git ``` 3b49e554fbe034cfc0af42e9ad2bb71c67cfa828 2026-09-08 13:40:55 -0700 Chronology: cycle-proof tests after the objection f166f57867d1f77f22df34d6f1c06a1982d1111a 2026-09-08 13:26:24 -0700 Chronology: three chains pinned to the computed sky, each from its own count 5d1184b0346d90275c5ad672e12010f4572f4082 2026-09-08 13:14:06 -0700 The evidence room: connectors, claims, dates as claims, quantities, the rooms, and the first eclipse alignment ``` Two commits, fourteen minutes apart, on 2026-09-08. The first contains the alignment write-up that explained its misses. The second is titled "cycle-proof tests after the objection" and contains the word "Retracted." The diff is in `retraction-commit-3b49e55.diff` beside this page. ## The exchange The raw session log of 2026-09-08 no longer exists on the machine (Claude Code deletes transcripts after thirty days). What survives is a copy made on 2026-09-28, when a batch of model-and-reply pairs was assembled from the logs for a separate test; it quoted the seat's last words and Kieran's reply. Reproduced from that batch, unedited: > **MODEL:** […] Your bet, straight: on these three, they line up. Not because anyone was trusted, but because each one, read in its own terms, lands on the same sky. What the tests do not touch is anything between the chains that no eclipse records: dynasties, buildings, the century a wall was raised. Those still need the ledger standard. And the hour readings for Ptolemy are mine, kept in their own file, for you or anyone to redo. > > **KIERAN:** no, you completely misread the assignment. this is cyclic. if you miss years they can be "matched" later. the fact that you're making excuses in your initial response for the oddities is also... odd. like ... take any of those and shift left or right. like you already found. The mechanism is in his message: a cyclic sky lets missed years be matched later, so shifting the alignment left or right by a cycle reproduces the fit. The seat's reply, the redesign (exact months, which the exeligmos cannot pass; the cycle-free solstices), was written in the fourteen minutes that followed and is the second commit. ## Before From the first commit (`README-before-the-objection.md`, the whole section is beside this page). The paragraph the objection was about: **Result** (`pipeline/align.py --local --slack 0`, `derived/align_chunqiu_local.json`): | first year of Duke Yin | matches of 31 | note | |---|---|---| | −721 (722 BCE) | 21 | the conventional date; rank 1 of 33,540 cells; z ≈ 53 | | −667 (668 BCE) | 15 | 54 years later: the exeligmos (three saros) alias | | −775 (776 BCE) | 14 | 54 years earlier: same alias | | everything else | ≤ 11 | null mean 0.05 | The ten misses at −721: seven have no eclipse visible at Lu in the window (either an error in the annal, an eclipse reported from elsewhere, or the visibility model's ΔT at the horizon); three are cycle-day mismatches, two of them the known duplicate entries where the annal records eclipses in consecutive months (襄公 21 months 9 and 10; 襄公 24 months 7 and 8), which the sky cannot do. Nobody was assumed error-free; the errors are the minority and the alignment holds without them. ## After As the notebook stands today (the live README on this site): > **Result, first pass**: with a month of slack, 722 BCE scores 21 of 31, but the sky is cyclic and the slack lets the cycles through: 54 years either way (three saros, the exeligmos) scores 15 and 14. Kieran's objection, verbatim: "this is cyclic. if you miss years they can be 'matched' later... take any of those and shift left or right." He was right, and the first write-up of this section explained the misses instead of counting them. Retracted. | first year of Duke Yin | month ±1 | month exact | |---|---|---| | 722 BCE (conventional) | 21 | 14 | | 776 BCE, −1 exeligmos | 14 | 2 | | 668 BCE, +1 exeligmos | 15 | 2 | | ±1 saros, ±1 inex, ±19 y, ±1 y | 0–3 | 0–3 | | best of the other 33,000 cells | | 6 | ## Reproduce it Everything needed is beside this page. No model is involved from the records to the grids. - `chunqiu_eclipses.json`: the 37 eclipse entries of the 春秋 jing as parsed (31 with a sixty-day cycle day), with the reign-year arithmetic the text itself supplies. - `manifest-wikisource-chunqiu.jsonl`: the fourteen zh.wikisource pages the records came from, with their revision ids and content hashes, so the same text can be fetched again. `src_wikisource.py` is the fetcher (its contact address replaced). - `align.py` and `paths.py`: the search. Flags: "--records", required=True; "--from", dest="y0", type=int, default=-1000; "--to", dest="y1", type=int, default=-200; "--out", default=None; "--local", action="store_true", help="only eclipses visible at the annal's site"; "--slack", type=int, default=0, help="days of slack on the cycle day (0 = exact; "--check", type=int, default=None, help="also report this first-year's best cell (e.g. the conventional one; - `requirements-venv.txt`: the pinned environment; the sky is `astronomy-engine==2.1.19` (VSOP87/ELP), no calendar assumed. - `align_chunqiu_local.json`, `align_chunqiu_local.txt`, `align_combined.json`: the outputs as they were written on 2026-09-08, to compare against. Expected: the table above. A rerun that does not reproduce it is a finding, and belongs on this page. ## Rerun, 2026-10-15 Done the same night the page went up, from this bundle alone, on the research machine, with no model in the chain. Astra (a Codex instance reading the public pages) had pointed out that `align.py` as published matches the Zhou month with one month of slack, hardcoded, so the exact-month column could not be produced from it. True. `align_exact.py` beside this page is the published script with that one line changed (`return diff == 0`), and both outputs are saved beside it. ``` python align.py --records chunqiu_eclipses.json --local --check -721 --out rerun-2026-10-15-month-slack.json python align_exact.py --records chunqiu_eclipses.json --local --check -721 --out rerun-2026-10-15-exact-month.json ``` | first year of Duke Yin | month ±1, as published | month exact, patched | |---|---|---| | 722 BCE | 21 | 14 (rank 1 of 33,540 cells, z 73) | | 776 BCE, −1 exeligmos | 14 | 2 | | 668 BCE, +1 exeligmos | 15 | 2 | | best other cell | | 6 (852 BCE) | Nine seconds per run with astronomy-engine 2.1.19. The table above the fold reproduces. What this rerun does not add: an outside witness (it was run by the seat's successor on the same machine, from the same files) and an independently chosen cycle-free criterion; both are still open, below. ## What this page cannot show The raw log is gone, so the seat's full reply between the objection and the second commit is not here, only its result. The parse from wikisource text to `chunqiu_eclipses.json` (the pipeline's `extract.py`) is not in this bundle; the parsed file is, and the 37 entries can be checked by eye against the fetched pages (search for 日有食之). The hour readings and ΔT discussion in the rest of the notebook are the seat's and are labelled so there. Two more limits, stated by the seat when asked to count what a stranger could check. The "exact month" criterion was chosen after the aliases had been seen, so an outsider reproducing this should fix their own cycle-free criterion before looking at the grid, and report whether it agrees. And the visibility test assumes the observer at Qufu (35.6 N, 117.0 E); that is a parameter of the run, not a fact of the text, and a rerun should declare it. As of 2026-10-15 nobody but the seat has run this bundle; the first outside rerun, reproduced or not, belongs on this page.