The re-anchoring only re-dated days[], leaving every other date-bearing
piece stale (day tabs read the original M.days, hotel stays/places kept
September checkIns so the base-chip and covers() logic went wrong, crumb
title and version pill never re-rendered). Now apply_flight_anchors also:
- re-dates stays.checkIn/Out, places.dates and hotel booking strings
from the day segments (redateStaysAndPlaces)
- re-renders day tabs, base chip, crumb and version pill, and reads
tab/trip-rail labels from the live days
- persists immediately (force) — the one edit we must never lose
- stayRange derives the month instead of hardcoding 'Sep'
Plus the .eml fix: mail metadata headers embed field names in their
values (X-Arc: ...content-type:from:subject:...), which the old
unanchored case-insensitive match grabbed — so single-part MIME bodies
were never decoded and raw headers + QP escapes leaked into the model's
context. Header fields are now parsed line-anchored, last occurrence
wins. The user's three real .emls now extract to clean text.
Prompt: when a document shows only one flight leg, the model is told to
search the other attached documents for the missing leg before asking.
E2E: drop the real AA e-mail -> model finds the return leg in the other
attached doc, applies the anchors, and title/tabs/chip/stays all show
7–15 Nov, surviving a hard reload.