Instruction-field applier roster. details is consumed by
applyDetails (Phase 2 of PersistentHydrator). The
declarative YAML shape (a plain object keyed by detail name)
differs from the runtime Map<DetailId, Detail> shape, so
the applier sits between them — it owns the conversion. The
applier runs AFTER the persistent bracket-assign in Phase 1
(which would otherwise leave this.details as a plain object
and break getDetailEntries); the applier resets the Map up
front to undo that.
Markup-augmenter contribution. The wrapper-style augmenter
narrows the host to Detailed at runtime, then runs the
existing wrapDetailKeywords regex pass. Picked up by
VisibleMixin.getMarkupLong(viewer) via the prototype-chain
walker — non-Detailed hosts never see this augmenter; hosts
with Detailed-but-empty detail maps no-op cheaply inside the
helper.
Persistent fields declared by this mixin. Used by PersistApi for automatic synchronization.
Live-query subscribable fields. The descriptor's
dependsOnFields defaults to ['details'] (descriptor name =
source field name), so FieldChangedEvent { field: 'details' }
from setDetail / removeDetail triggers re-projection
automatically. The ShadowChangedEvent entry covers future
visible-detail shadows that override projected entries
without firing a field change.
One descriptor carries both projection layers: read
enumerates the alias-grouped top-level entries (flat mode);
perDetailRead extracts a single entry's slice for focus-
mode subscriptions.
Mixin that adds hierarchical detail system to objects.