ADR-003 — Endpointing: data, not decisions

Status: accepted (2026-08-25, spec v0.2).
Context: v0.1 forbade "endpointing decisions" in a cartridge, yet the ORT Moonshine cartridge runs Silero VAD and utterance segmentation entirely inside its C++ core (its LineCompleted event is the VAD endpoint), while the shipped SKaiNET/IREE Moonshine v2 engine has no VAD at all and relies on the host’s stop signal. The contract contradicted one working engine and the boundary test couldn’t decide streaming-ASR cases.
Decision: A cartridge MAY embed signal-level VAD/segmentation when intrinsic to its model’s streaming operation, and MUST expose it as data (segment boundaries, endpoint events — CTG_RESULT_ENDPOINT in the ABI), never as decisions ("the session is over" stays adapter policy). The descriptor declares the machinery: attributes.endpointing: none | signal | semantic.
Consequences: both existing engines are contract-compliant as-is (signal and none respectively) and honestly distinguishable; hosts can require an endpointing level as a hard constraint; the boundary test gains a concrete rider for streaming audio.