SESSION 12 · 09/26 · PARTLY WORKED

Still not a complete Moon, and I said it was

Best image yet and still 11.8% of the sunlit disc missing. Three launches, a plate scale that had been 15% wrong all along, and a centring error of 8'.

Targets
Moon
Gear
SVBONY SV205, 102 mm f/12.7 Maksutov, AZ-GTe goto mount, SVBONY SV165
Outcome
Partly worked
Chapter
First Moon

moon-2026-09-22_moon_full.png, 6979 x 6093, eleven registered panels. No seams, no level steps, no rectangles, the best photometry of any run — and 11.8% of the sunlit disc is missing.

I looked at it and called it a complete Moon. Brendan looked at it and said bits were missing. He was right, and the measurement is not close:

OF THE SUNLIT DISC:   captured 88.2%   MISSING 11.8%  (65 sq arcmin)
  30.5 sq arcmin  bottom
  17.2 sq arcmin  top-right
  17.1 sq arcmin  top-left

Measure it, do not look at it. A 6979 x 6093 image viewed at 14% hides a 17-square-arcminute bite. The check that works: fit the limb, model the terminator from the phase, and ask what fraction of the sunlit disc is actually lit in the canvas. Eyeballing a downscaled render is how this got called complete twice in two nights.

Nothing is recoverable. Every panel on disk outside the 5x3 set is from an older run and reads 0.0% lit at peak 1-2. The surface was never photographed.

tonight 21 September
gain pairs dropped 0 0
gain range 0.985 - 1.020 0.988 - 1.036
median CP residual 6.6 px (1.46") 2.8 px (0.62")
sunlit disc captured 88.2% missing the western wedge

The residual is worse and the reason is altitude: this was shot at 73 deg, where a 7-minute run rotates the field by about 2.5 deg, against 58-61 deg last night. Shooting high was a deliberate trade for a clear sky that the forecast said would close by 22:00, and it did.

SCALE was 15% wrong, and had been all along

The measurement that mattered, made in daylight from the 21/09/2026 mosaic. Two independent methods, agreeing to 0.3%:

RANSAC circle fit to the LIMB of v3, 4089 inliers, rms 5.2 px
  radius 3545 px against a true 15.114'          ->  0.2558"/px
Hugin's measured positions vs COMMANDED motion, ALTITUDE axis
  1308.4 px for a commanded 5.594'               ->  0.2566"/px
lunar-mosaic.py said                                 0.2220"/px

The azimuth axis reads 0.2660, about 4% high, because step_az carries a 1/cos(alt) that is recomputed per panel while the altitude changes across a run — so the altitude axis is the one to trust.

The true frame is 13.93' x 9.22', not 12.08' x 7.99'. Two things were built on the bad number. mosaic-hugin's "deviation from commanded" converts degrees to pixels with it, so a 15% error shows up as deviation growing with distance from the grid centre — the 1.97' that was read as mount scatter on two separate nights is mostly this. And find-centre.py takes its half-frame from FRAME_W and FRAME_H, so the expected-span check that is supposed to reject a terminator hit was 1.8' off in azimuth, eating 60% of its own +-3' tolerance.

Three launches

One: a 27-step goto hung the mount. axis2: +0.0047 deg (+27 steps, ramp 2) was accepted, never cleared its running bit, and aborted the run after three panels with "goto did not finish in 30 s". Tiny moves are not an edge case in a mosaic — they appear whenever the per-panel target is close to where tracking has already carried the axis, which at high altitude is most of the altitude steps. synscan-goto.py now refuses anything below MIN_STEPS (50 steps, 31"), and the guard fired four more times in the runs that followed.

Two: a 6x4 grid overshoots a 30.5' Moon at the corrected frame size. Row 0 sits 2.5 steps below centre — 2.5 x 6.45' = 16.1' — against a disc radius of 15.26'. The entire outer row is centred off the disc, and the corners worse. Half the grid photographed nothing, which is exactly the failure the lit-panel gate on its branch exists to prevent.

Three: 5x3 at 30%, which shot cleanly and was still the wrong grid.

        c0    c1    c2
   r4    255   255   255
   r3    255   255   247
   r2    255   255   216
   r1    255   255   196
   r0    255   237     3

Fourteen of fifteen usable. The one dead panel is the r0c2 corner, genuinely off the disc at sqrt(12.9^2 + 9.75^2) = 16.2'. Corners always stick out on a rectangular grid over a circle; that is normal and Hugin drops them.

The grid rule, corrected after seeing what 5x3 actually produced. It covers 33.4' x 35.0' against a 30.5' disc - margins of 1.5' and 2.25', which any centring error beyond a couple of arcminutes overflows. That is what happened:

lit fraction   r0:  19.4%   1.0%   0.0%
               r4:  97.9%  99.9%  40.4%

Symmetric rows would mean a centred grid. These are not remotely symmetric - the disc sits about 8' toward r4, so r0 photographed sky while the Moon spilled past r4. Same root cause as 21 September (5.6' then), and it is THE CENTRING, not the grid size.

So 6x4 was right and I rejected it for the wrong reason. Its margins are 6.4' and 5.5'. The dark outer rows and corners I used to condemn it are exactly what a rectangular grid over a circle must produce, and mosaic-hugin drops them for free. Use 6x4 at 30%, accept that eight or nine panels are dark corners, and let the lit-panel gate make that cheap.

Altitude backlash, about 1.5'

Found by accident while calibrating the new centring tool. Bracketing a test move by returning to the start cancels drift but walks the axis into its own slack: altitude read 2.26' for a commanded 3.0' while azimuth, which carries no weight reversal, read 2.96'. Removing the reversal took altitude to 3.71'.

This affects the mosaic runner too. The serpentine reverses altitude between rows, so every row change eats that slack, and it may be part of the deviation-from-commanded that has been blamed on scale.

The centring tool is not finished

centre-on-limb.py finds the disc centre from one frame by fitting the limb with a known radius, and measures the image-to-mount transform itself rather than assuming it — two 4' test moves, solve the 2x2, cache it. That measurement found the camera sitting at -164.9 deg in the focuser, nowhere near the compositor convention, which is why reasoning about the sign failed twice.

The pieces work: 884 votes, 1582 inliers and a 0.87% validation ring on real sky, and 14 synthetic geometries recovered to 0.3-2.8 px. What does not yet work is the end-to-end accuracy — the calibration's implied scales come out 7% and 23% high, and a 23% error on an 18' correction leaves 4'. Remaining causes: drift during each ~20 s measurement, and backlash on the returns between axes. Next: correct each measurement to a common instant from the ephemeris, and approach every test move from the same direction.

And the trap that cost most of the evening: goto_offset sends :K, which stops tracking, and the new tool never restarted it. So from its first move the Moon drifted at 13"/s through an eight-step walk and several multi-second solves, frames went black at positions that had been lit two minutes earlier, and hours went into chasing pointing errors that were really drift. lunar-mosaic.py documents this trap and restarts tracking before every exposure. The new file simply did not.

Why: the first clear hour of the night went into that, and the sky closed at 22:00. The mosaic that worked was shot at 73 deg under a gap, not in the 45-60 band, and the field rotation shows in the residual. How to apply: measure SCALE again if the optical train changes — one mosaic and a limb fit. Size the grid from the real frame, not the assumed one. And restart tracking after every single move, in anything that moves the mount.