"""Where H3 puts the prompt, and how its time axis maps to rows. Three capabilities, so prompt markup never learns H3's layout: * `text_tokenizer(clip)` -- the raw HF tokenizer behind an H3 CLIP, for exact character -> token offsets. Tokenizing is free; re-encoding with Qwen3-VL-32B to find a phrase would cost a 32B forward pass per phrase. * `prompt_rows(meta, cond_len, prompt_tokens)` -- (start, end) of the prompt inside a conditioning. The prompt is the LAST thing H3's tokenizer appends (reference labels and vision blocks come first), and `minimax_token_tags` marks text 1, vision 0, so it is the tail of the final run of 1s. Measured from the END so labels in front of it (an audio reference's "