# Extraction model Extraction nodes contain actual engine match/capture values and ranges. The syntax tree supplies capture names and parent relationships; engine results supply participation, value and offsets. Statuses distinguish: - participated with non-empty text; - participated and matched empty; - did not participate; - unavailable range; - preview-truncated value. Exact match and capture ranges are retained even when a displayed value exceeds the 64 Ki UTF-16 per-value preview limit or the shared 8 Mi-unit preview budget. Consumers must inspect the preview status rather than treating a preview as complete. In particular, list export is disabled if its template would consume an incomplete value. Repeated captures expose only the final retained value in all twelve v0.4.0 profiles. This includes .NET even though its native API can retain capture history: the current adapter deliberately normalizes only the final record and reports `captureHistory: false`. The UI labels the limitation and does not invent or silently discard advertised history. The partial syntactic hierarchy remains useful when the active provider found capture relationships, even if actual spans overlap or fall outside a parent's geometry. For C++ alternate grammars or suppressed submatches, capture discovery can be explicitly unavailable. Runtime records remain authoritative. Native and normalized ranges are preserved rather than “fixed”: - JavaScript, Java, Scala compatibility and .NET use UTF-16 code units; - standalone PCRE2, PHP, Go and Rust use UTF-8 bytes; and - Python, Ruby, C++ and legacy Perl use Unicode code points. All editor ranges are normalized to UTF-16 only after the adapter verifies valid boundaries. The native unit and original range remain available.