One row in a document's Legend.
entry_class / subtype are the canonical pair the entry maps
to — same vocabulary the registry uses for nodes and annotations, so
a display-layer lookup can match by equality without a second
translation step.
source_bbox and source_node_id are optional provenance: when
set, they record the symbol the user picked when creating the entry
(so the UI can render a thumbnail and re-focus on the seeding
detection). Entries built from an uploaded legend image or from a
template library leave source_node_id empty.
The cfihos_* fields link the entry to CFIHOS reference data.
All are optional — a legend works without them — but when set they
drive the Semantic Object modal, the enriched Excel export columns,
and downstream interop exports (ISO 15926, POSC CAESAR equivalents
via the catalog mapping).
source_crop_url is the renderable URL for the entry's
representative crop, for entries that have no page-image
coordinate frame to crop in — i.e. those built from an uploaded
legend image. The remap pipeline's build_templates prefers
this when set, since source_bbox indexes into the page image
(the wrong coordinate system for an uploaded crop).
Pick-from-drawing entries leave it unset and rely on
source_bbox instead.
The field holds either a data:image/png;base64,... URL
(produced by the pure extractor for use in tests / scripts) or
an http(s)://... storage URL (produced by the Hyrex task
after it uploads the crop to users/{user}/{doc}/legend_crops/ {entry_id}.png). Both render in <img src> and both decode
cleanly in build_templates; the task swaps from data URL to
storage URL before persisting so grounding_data stays lean.