Bring the state files up to date so a cold session can resume

Rule 2 of the workflow is that state lives in the repo rather than the
chat, and a long session had put most of the current position only in
the chat. This writes it down.

TODO.md gains a RESUME HERE block at the top, because the useful
question for the next session is not what has been done but what to do
next and what is blocking it. It names the three live strands, the three
decisions waiting on the user, and the one thing that will break the
batch run if it is forgotten: NGC 6744 mixes bin1 luminance at 4096x4096
with bin2 colour at 2048x2048, so registration has to resample onto a
common grid. Nothing else in the archive does that, which is exactly why
it will be forgotten. It also drops three duplicate "Done (recent)"
headings that had accumulated, and tabulates what the five archived
sessions actually contain.

NOTES.md gains the gotchas, all of which produced plausible wrong
answers rather than errors: every frame is delivered twice as calibrated
and raw, so extracting both silently doubles the stack; an interrupted
segmented download leaves DIRECTORIES named like files, which defeats
anything that trusts an extension; a re-mirror duplicates rather than
replaces; two T20 archives are genuinely corrupt; extraction triples the
disk footprint and filled the drive. Alongside them the analysis lessons
from NGC 5128, kept for the same reason - each is a way to be confidently
wrong.

DECISIONS.md records why the pipeline reads headers rather than
filenames, and why imaging is being made push-button while the science
stays hand-driven.

ARCHITECTURE.md described a documentation-only repository with no code,
which stopped being true when the pipeline merged in. It now covers all
three parts, the code-and-data separation the pipeline is built around,
and the on-disk session layout.

Both of this session's own errors are recorded in TODO.md as things not
to repeat: measuring a foreground star instead of the galaxy nucleus and
booking telescope time to fix it, and telling the user NGC 6744 had not
been processed when it had.
This commit is contained in:
laurence 2026-07-21 17:32:00 +01:00
parent 015bff47fc
commit 3f785136ed
4 changed files with 303 additions and 106 deletions

View file

@ -78,3 +78,72 @@ Paid imaging needs no reservation when a scope is idle: same walk-in ACP flow
as the free scopes, points just deduct. Reservations (to guarantee a slot) go
through lookup.itelescope.online, which is Cloudflare-protected: Playwright
needed.
## Processing the downloaded archive (2026-07-21)
Gotchas found by running code against the real archive rather than reasoning
about it. Each one produced a plausible-looking wrong answer, not an error.
- **Every frame is delivered twice.** iTelescope ships `calibrated-*` (bias,
dark and flat applied) and `raw-*` (not). Extracting both puts two copies of
every frame into the stack, and the counts look merely generous rather than
wrong: NGC 5128 scanned as 24 luminance frames when it has 12. `CALSTAT` in
the header is the reliable discriminator - calibrated frames carry it, raw
frames do not. Only the calibrated archives are extracted; the raw archives
stay zipped as the untouched originals.
- **An interrupted segmented download leaves DIRECTORIES named like files.**
Cyberduck creates a directory called `something.fit` while fetching, with
`.cyberducksegment` parts inside. Anything that trusts a file extension will
try to open a directory as a frame. After a re-mirror over an already
organised tree there were 28 of them. Discovery, ingest and scan all skip
them explicitly.
- **A re-mirror duplicates rather than replaces.** Mirroring on top of an
organised tree restored ~1 GB of files to session roots that had already been
filed into `raw/`. Ingest now removes byte-identical copies as it refiles.
- **Two T20 archives are genuinely corrupt** and cannot be extracted
(`ic1805-...-Ha-...-015` and `-016`). That is real data loss, not a bug: the
session has 14 of 16 frames. The warning is printed rather than swallowed.
- **Extraction triples the disk footprint.** The archive went from 6.1 GB of
zips to 14 GB extracted, which filled the drive. The TIFFs are 1.69 GB of
that and the pipeline never reads them - it only uses the FITS.
- **Channels do not always share a pixel grid.** NGC 6744 was shot with
luminance at bin1 (4096x4096) and colour at bin2 (2048x2048). Registration
has to resample onto a common grid; code that assumes a single frame shape
will fail on this session and only this session.
## Processing lessons from NGC 5128 (2026-07-21)
Kept because each is a way to get a confident wrong answer:
- **Measure a core with the stars filtered out.** Taking the maximum pixel in a
box around the frame centre found a foreground star, not the galaxy, and led
to booking telescope time to fix a saturation problem that did not exist.
- **Registration makes sensor defects look like perfect asteroids.** Holding
the sky still drags anything detector-fixed across the frame on a dead
straight, constant-rate, constant-brightness track. Hot pixels pass every
standard quality cut. Requiring the motion to be real in DETECTOR coordinates
took 141 confident detections to zero.
- **Never compare an aperture magnitude to a point-source catalogue without
checking the source is a point.** A resolved object looks exactly like a
2.8 magnitude outburst. Carry r50/psf through to the cross-match.
- **Never fit a sky background to a field the target fills.** A plane fitted
around a large galaxy absorbs its halo, measured at -17.9 ADU/px. Fit the
background and a source model together.
- **"No Gaia counterpart" is not a star-rejection test** at extragalactic
distances: half of Centaurus A's catalogued globular clusters have a Gaia
source, because a cluster at 3.8 Mpc is a point source. Reject on parallax
and proper motion instead.
- **A coarse background mesh fails in the direction that flatters you.** It
destroys detection near a bright galaxy while leaving the outer field intact,
manufacturing a falsely flat radial profile.