{"record":{"id":"bf4b6e589994b1b2","repo":"aaif-goose/goose","slug":"column-must-be-between-1-and-max-excel-columns","errorCode":null,"errorMessage":"Column must be between 1 and {MAX_EXCEL_COLUMNS}","messagePattern":"Column must be between 1 and (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-mcp/src/computercontroller/xlsx_tool.rs","lineNumber":236,"sourceCode":"\n    let start = parse_cell_reference(parts[0])?;\n    let end = parse_cell_reference(parts[1])?;\n\n    // parse_cell_reference returns (row, col), so start.0 is row, start.1 is col\n    Ok((start.0, start.1, end.0, end.1))\n}\n\nfn validate_range_bounds(\n    start_row: u32,\n    start_col: u32,\n    end_row: u32,\n    end_col: u32,\n) -> Result<(u32, u32)> {\n    anyhow::ensure!(\n        (1..=MAX_EXCEL_ROWS).contains(&start_row) && (1..=MAX_EXCEL_ROWS).contains(&end_row),\n        \"Row must be between 1 and {MAX_EXCEL_ROWS}\"\n    );\n    anyhow::ensure!(\n        (1..=MAX_EXCEL_COLUMNS).contains(&start_col) && (1..=MAX_EXCEL_COLUMNS).contains(&end_col),\n        \"Column must be between 1 and {MAX_EXCEL_COLUMNS}\"\n    );\n    anyhow::ensure!(\n        start_row <= end_row && start_col <= end_col,\n        \"Range start must not follow range end\"\n    );\n\n    let row_count = end_row\n        .checked_sub(start_row)\n        .and_then(|span| span.checked_add(1))\n        .context(\"Row span overflow\")?;\n    let column_count = end_col\n        .checked_sub(start_col)\n        .and_then(|span| span.checked_add(1))\n        .context(\"Column span overflow\")?;\n    let cell_count = u64::from(row_count)\n        .checked_mul(u64::from(column_count))","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-mcp/src/computercontroller/xlsx_tool.rs#L218-L254","documentation":"validate_range_bounds() requires both column numbers within 1..=MAX_EXCEL_COLUMNS (16_384, i.e. column 'XFD', defined at xlsx_tool.rs:7). Columns beyond XFD — 'XFE', 'ZZZ', 'AAAA' — parse to numbers over the cap and trigger this bail. Excel itself has the same limit, so such ranges cannot exist in a valid workbook.","triggerScenarios":"Ranges like 'XFE1:XFE10' (16385), 'ZZZ1:ZZZ1', or agents inventing wide-column addresses. Column letters are parsed case-insensitively, so case is not the issue — only the magnitude.","commonSituations":"LLM-generated ranges hallucinating far-right columns; converting numeric column indices (e.g. 20000) to letters without bounds awareness; spreadsheets migrated from other tools claiming wider grids.","solutions":["Keep columns within A..XFD (1..=16384).","Validate/convert numeric column indices with a cap of 16384 before building the range string.","If the data really needs more columns, it exceeds xlsx format limits — restructure the data.","Check the worksheet's highest_column() and clamp the range to actual used columns."],"exampleFix":"// before\nlet range = \"A1:ZZZ1\"; // 702 > 16384? no — ZZZ=18278 -> column bound error\n\n// after\nlet range = \"A1:XFD1\"; // 16384 = last valid column","handlingStrategy":"validation","validationCode":"fn col_to_index(letters: &str) -> u32 {\n    letters.bytes().fold(0u32, |acc, b| acc * 26 + u32::from(b - b'A' + 1))\n}\nfn cols_in_bounds(range: &str) -> bool {\n    range.split(':').all(|cell| {\n        let letters: String = cell.chars().take_while(|c| c.is_ascii_alphabetic()).collect();\n        (1..=16_384).contains(&col_to_index(&letters.to_uppercase()))\n    })\n}\nassert!(cols_in_bounds(range), \"columns must be within A..XFD\");","typeGuard":"fn has_valid_columns(range: &str) -> bool {\n    let val = |cell: &str| -> u32 {\n        cell.chars().take_while(|c| c.is_ascii_alphabetic())\n            .fold(0, |acc, c| acc * 26 + (c.to_ascii_uppercase() as u32 - 'A' as u32 + 1))\n    };\n    range.split(':').all(|cell| (1..=16_384).contains(&val(cell)))\n}","tryCatchPattern":null,"preventionTips":["Cap converted numeric column indices at 16_384 ('XFD') before formatting a range string.","Do not invent column addresses beyond XFD — no valid xlsx workbook has them.","Bound reads to the worksheet's highest_column() where possible."],"tags":["rust","excel","validation","bounds","columns","range","xlsx"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}