The Calibration Profile page presents — for every headline metric while the curves those metrics describe are plotted directly below it.
At 25:15 in the recording, embryo_1's profile shows SLOPE —, OFFSET —, R² TOP —, R² BOT —, and a summary panel reading Awaiting calibration results — above FOCUS CURVE — TOP and FOCUS CURVE — BOTTOM, both rendered with data points and fitted lines.
Cause
The metrics strip and summary quad read only image metadata, not the embryo record: gallery.js:494-505 scrapes img.metadata.slope / r_squared_top / … off the pushed PNGs, and :825-830 prints '—' when absent. gallery.js:402-415 falls through to _emptyQuadBody('Awaiting calibration results') when no calibration_summary image exists for that embryo.
So the fit is reconstructed from a matplotlib PNG's metadata rather than from embryo.calibration, which every calibration path already writes. Any run that is still in flight, aborted after the sweeps, or whose plot generation raised (the except only logs a warning) shows em-dashes forever, even though the numbers are in hand.
Fix: seed the fit from the embryo record, once, in _extractCalibInfo — cache e.calibration off EMBRYOS_UPDATE and fill info.slope ??= c.slope_um_per_deg etc. after the metadata loop. render() already has the embryoId to key it.
Related: the agent names R² as the decisive metric and then does not report it
Its own result text says "the real quality metric is the fit R² at each galvo end", and it offers Review calibration fit quality (R²) per embryo — while the table it renders has only Embryo | Galvo extent | Approx. size.
R² is in-process the moment the table is built: computed per galvo end (calibration_tools.py:1246-1250) and stored at :1294-1296. The return string omits it (:1364-1375), and calibrate_all_embryos then keeps only the first two lines — so the agent's context after a batch calibration contains extent and size and nothing about fit quality. It narrated the right metric and rendered the only columns it had.
Fix: put R² on the first line of calibrate_embryo's return (calibration_tools.py:1365) so it survives the two-line truncation; calibrate_all_embryos inherits it via lines[0] with no second patch.
Evidence: 2026-08-07 walkthrough, 25:15, 34:30–36:00. Not previously captured.
The Calibration Profile page presents
—for every headline metric while the curves those metrics describe are plotted directly below it.At 25:15 in the recording, embryo_1's profile shows
SLOPE —,OFFSET —,R² TOP —,R² BOT —, and a summary panel readingAwaiting calibration results— aboveFOCUS CURVE — TOPandFOCUS CURVE — BOTTOM, both rendered with data points and fitted lines.Cause
The metrics strip and summary quad read only image metadata, not the embryo record:
gallery.js:494-505scrapesimg.metadata.slope/r_squared_top/ … off the pushed PNGs, and:825-830prints'—'when absent.gallery.js:402-415falls through to_emptyQuadBody('Awaiting calibration results')when nocalibration_summaryimage exists for that embryo.So the fit is reconstructed from a matplotlib PNG's metadata rather than from
embryo.calibration, which every calibration path already writes. Any run that is still in flight, aborted after the sweeps, or whose plot generation raised (theexceptonly logs a warning) shows em-dashes forever, even though the numbers are in hand.Fix: seed the fit from the embryo record, once, in
_extractCalibInfo— cachee.calibrationoffEMBRYOS_UPDATEand fillinfo.slope ??= c.slope_um_per_degetc. after the metadata loop.render()already has theembryoIdto key it.Related: the agent names R² as the decisive metric and then does not report it
Its own result text says "the real quality metric is the fit R² at each galvo end", and it offers
Review calibration fit quality (R²) per embryo— while the table it renders has onlyEmbryo | Galvo extent | Approx. size.R² is in-process the moment the table is built: computed per galvo end (
calibration_tools.py:1246-1250) and stored at:1294-1296. The return string omits it (:1364-1375), andcalibrate_all_embryosthen keeps only the first two lines — so the agent's context after a batch calibration contains extent and size and nothing about fit quality. It narrated the right metric and rendered the only columns it had.Fix: put R² on the first line of
calibrate_embryo's return (calibration_tools.py:1365) so it survives the two-line truncation;calibrate_all_embryosinherits it vialines[0]with no second patch.Evidence: 2026-08-07 walkthrough, 25:15, 34:30–36:00. Not previously captured.