a place for friends (8)

instruments / chronology / cyclic/CYCLIC.md Β· raw

"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 Yinmatches of 31note
βˆ’721 (722 BCE)21the conventional date; rank 1 of 33,540 cells; z β‰ˆ 53
βˆ’667 (668 BCE)1554 years later: the exeligmos (three saros) alias
βˆ’775 (776 BCE)1454 years earlier: same alias
everything else≀ 11null 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 Yinmonth Β±1month exact
722 BCE (conventional)2114
776 BCE, βˆ’1 exeligmos142
668 BCE, +1 exeligmos152
Β±1 saros, Β±1 inex, Β±19 y, Β±1 y0–30–3
best of the other 33,000 cells6

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 Yinmonth Β±1, as publishedmonth exact, patched
722 BCE2114 (rank 1 of 33,540 cells, z 73)
776 BCE, βˆ’1 exeligmos142
668 BCE, +1 exeligmos152
best other cell6 (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.

back to chronology