Predicate-shaped veto. { ok: true } allows the scry to render
via this instrument; { ok: false, reason } declines (out of
range, target obscured, etc.) so the controller can surface a
specific failure or fall through to other instruments.
Subclasses override to gate by zone, target tier, instrument tuning, etc. Default implementation accepts everything.
Bucket-relative media key for this thing's illustration, or null.
The picture is a visual description, so it rides the same Visible
surface as the prose; the client prepends its configured media base
URL. Members fall back to their species' key via Organism's override.
Long description with every contributing mixin's
markupAugmenters applied — detail keys wrapped in <detail>
MML when the host composes Detailed, exit names wrapped in
<exit> when (future) Exitable contributes, language masks
applied when (future) Language contributes, etc. Plain Visible
hosts (no contributors) return getLong() unchanged.
Same affordance-annotated text feeds both the look prose
composer and the longDescription subscription projection, so
the terminal scrollback and the inspection pane see identical
clickable wrappers around the same anchors.
viewer is threaded through to augmenters that need per-recipient
decisions (language gating, spoiler hiding). Augmenters that
don't care just ignore it.
opts is forward-compat per-call options. The senses build
uses opts.filter to pin a sense-channel allowlist (the four
single-sense verbs pass their own channel; look passes
['vision']; sense passes the viewer's full sensorium).
Default-absent opts means each augmenter falls back to its
own default (the senseStripAugmenter falls back to the
viewer's full sensorium — the gestalt rule).
Optionalopts: AugmentOpts
Public shape provided by
ScryableMixin. ExtendsVisiblebecause Scryable always co-composes with VisibleMixin — the prereq is documented at the type level so consumers narrowing viaMixinApi.isScryablealso reach Visible'sgetShort/getLong/ etc.