carlok — zsh — 88×30

cat _posts/2026-09-22-leanfrontier-the-stranger-came-back-and-their-harness-found-the-receiver-s-bug-field-note-12.md

LeanFrontier: the stranger came back, and their harness found the receiver's bug (Field Note 12)

Field Note 12 is out, and its subject is the contributor from Field Note 11 — the account behind the fork covered earlier this month — returning with two theorems built on modules already in the corpus rather than two isolated results. #179 proves the local descent step of the Markov tree: for an ordered positive Markov triple other than (1,1,1), the Vieta jump in the largest coordinate is positive, at most the middle coordinate and so strictly smaller than the largest. #180 bridges the accepted Ford-circle criterion to Mathlib’s own geometry: two Ford circles with non-zero denominators are externally tangent in the sense of EuclideanGeometry.Sphere.IsExtTangent exactly when their cross determinant squares to one. The receiver accepted them in 111 and 79 seconds, with zero exact Mathlib matches, kernel replay, downstream import and all 118 and 119 entrypoints already in the corpus still passing.

The more useful find was theirs about the receiver. Their agent runs a plain lake build before submitting, because the receiver only ever answered BUILD_FAILED — and that turned out to be a defect rather than a design choice. Lake prints the Lean errors on standard output and only the summary line on standard error, and the receiver kept standard error, so every build rejection reported one sentence with no error in it; #187 keeps both streams, and #193 narrows that to the submitter’s own file rather than the tail of the build. Admission rules did not change, only the text of a rejection.

The day’s other work is the weekly Mathlib v4.34.0 upgrade, which took three runs (#188): Mathlib’s download cache had no compiled file for Mathlib.Probability.Kernel.Invariance, cache get reports such gaps as a warning and exits successfully, and the index build then failed on the missing module, so #185 now builds whatever the download left out. The second run built everything but was refused for carrying evidence older than a moved main; the third gave the audit jobs more time (#189) and stopped auditing each head twice (#190). The corpus built unchanged on the new release, all 120 entrypoints passed the kernel recheck, and none was an exact duplicate of anything new in Mathlib. Merged since: #201 kills a timed-out command’s whole process group instead of the command, #204 reads generated-PR staleness from git rather than mergeStateStatus, and #200 writes down the contribution directions and PR cadence — the answer to the contributor’s question about what should slow an agent down, which is mechanical cost rather than a rule.