zed-industries/zed · error

start marker must come before end marker

Error message

start marker must come before end marker

What it means

The model's marker-tag output referenced a start marker number greater than the end marker number, so the computed replacement span would be reversed (end byte before start byte) in apply_marker_span. It fires when the parsed tag pair from the model output is internally inconsistent with the marker numbering of the old editable region.

Source

Thrown at crates/zeta_prompt/src/multi_region.rs:401

pub fn apply_marker_span(old_editable: &str, output: &str) -> Result<String> {
    let (start_num, end_num, raw_new_span) = extract_marker_span(output)?;
    let marker_offsets = compute_marker_offsets(old_editable);

    let start_idx = start_num
        .checked_sub(1)
        .context("marker numbers are 1-indexed")?;
    let end_idx = end_num
        .checked_sub(1)
        .context("marker numbers are 1-indexed")?;
    let start_byte = *marker_offsets
        .get(start_idx)
        .context("start marker number out of range")?;
    let end_byte = *marker_offsets
        .get(end_idx)
        .context("end marker number out of range")?;

    if start_byte > end_byte {
        return Err(anyhow!("start marker must come before end marker"));
    }

    let old_span = &old_editable[start_byte..end_byte];
    let mut new_span = raw_new_span;
    if old_span.ends_with('\n') && !new_span.ends_with('\n') && !new_span.is_empty() {
        new_span.push('\n');
    }
    if !old_span.ends_with('\n') && new_span.ends_with('\n') {
        new_span.pop();
    }

    let mut result = String::new();
    result.push_str(&old_editable[..start_byte]);
    result.push_str(&new_span);
    result.push_str(&old_editable[end_byte..]);

    Ok(result)
}

View on GitHub (pinned to f4178619ac)

Solutions

  1. Reject the model output and re-request the edit so the model emits a valid ordered marker pair
  2. Validate marker ordering before applying and surface the rejection to the retry/feedback loop
  3. Log the raw output to diagnose systematic marker-ordering mistakes from the model
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/zeta_prompt/src/multi_region.rs:401 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20). Data as JSON: /api/errors/1a9438c0d7d996fa. Report an issue: GitHub.