## 1. Algorithm Changes (gap_filling_service.py)

### 1.1 IoA Implementation
- [x] 1.1.1 Add `_calculate_ioa()` method alongside existing `_calculate_iou()`
- [x] 1.1.2 Modify `_is_region_covered()` to use IoA instead of IoU
- [x] 1.1.3 Update deduplication logic to use IoA

### 1.2 Dynamic Threshold Strategy
- [x] 1.2.1 Add element-type-specific thresholds as class constants
- [x] 1.2.2 Modify `_is_region_covered()` to accept element type parameter
- [x] 1.2.3 Apply different thresholds based on element type (TEXT: 0.6, TABLE: 0.1, FIGURE: 0.8)

### 1.3 Boundary Shrinking
- [x] 1.3.1 Add optional `shrink_pixels` parameter to coverage detection
- [x] 1.3.2 Implement bbox shrinking logic (inward 1-2 px)

## 2. OCR Data Source Changes

### 2.1 Extract overall_ocr_res from PP-StructureV3
- [x] 2.1.1 Modify `pp_structure_enhanced.py` to extract `overall_ocr_res` from result
- [x] 2.1.2 Convert `dt_polys` + `rec_texts` + `rec_scores` to TextRegion format
- [x] 2.1.3 Store extracted OCR in result dict for gap filling

### 2.2 Update Processing Orchestrator
- [x] 2.2.1 Add option to use `overall_ocr_res` as OCR source
- [x] 2.2.2 Skip separate Raw OCR inference when using PP-StructureV3's OCR
- [x] 2.2.3 Maintain backward compatibility with explicit Raw OCR mode

## 3. Configuration Updates

### 3.1 Add Settings (config.py)
- [x] 3.1.1 Add `gap_filling_ioa_threshold_text: float = 0.6`
- [x] 3.1.2 Add `gap_filling_ioa_threshold_table: float = 0.1`
- [x] 3.1.3 Add `gap_filling_ioa_threshold_figure: float = 0.8`
- [x] 3.1.4 Add `gap_filling_use_overall_ocr: bool = True`
- [x] 3.1.5 Add `gap_filling_shrink_pixels: int = 1`

## 4. Testing

### 4.1 Unit Tests
- [ ] 4.1.1 Test IoA calculation with known values
- [ ] 4.1.2 Test dynamic threshold selection by element type
- [ ] 4.1.3 Test boundary shrinking edge cases

### 4.2 Integration Tests
- [ ] 4.2.1 Test with scan.pdf (current problematic file)
- [ ] 4.2.2 Compare results: old IoU vs new IoA approach
- [ ] 4.2.3 Verify no duplicate text rendering in output PDF
- [ ] 4.2.4 Verify table content is not duplicated outside table bounds

## 5. Documentation

- [x] 5.1 Update spec documentation with new algorithm
- [x] 5.2 Add inline code comments explaining IoA vs IoU
