Simplify marker rendering logic with upfront normalization
Major refactoring to make marker rendering clearer and more maintainable:
**Key improvements:**
1. Normalize end_column upfront (before rendering loop)
- Single-line without end_column: defaults to start_column + 1
- Multiline without end_column: error (ambiguous)
- This eliminates many conditional branches later
2. Unified range calculation for all marker types
- Single-line: (start_column, end_column)
- First line of multiline: (start_column, line_end)
- Last line of multiline: (1, end_column)
- All use same truncation and clamping logic
3. Cleaner clamping strategy
- Allow end to extend 1 char past line (handles off-by-one)
- Prevents excessive spans from invalid input
- Consistent behavior across all cases
**Results:**
- 41 fewer lines of code (-19%)
- Eliminated complex nested conditionals
- All 20 tests passing
- Same behavior, clearer intent
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>