# Changelog

> **This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.**

## Score

- CAI 65 → 48 (-16.8)
- Rubric changed (rubric-2026.08.18 → rubric-2026.08.15) — scores are not directly comparable.

## Lenses

- Code Health 64 → 84 (+20.7)
- Architecture 97 → 96 (-1.3)
- Maturity 76 → 73 (-2.1)
- Readiness 60 → 27 (-32.6)
- Security 68 → 53 (-15.1)

## Resolved (432)

- ApiVlmModel.__call__ (cognitive 16) (docling/models/vlm_pipeline_models/api_vlm_model.py)
- AsciiDocBackend._parse (cognitive 45) (docling/backend/asciidoc_backend.py)
- AsciiDocBackend._parse (cyclomatic 42) (docling/backend/asciidoc_backend.py)
- AutoInlineVlmEngine._select_engine (cognitive 21) (docling/models/inference_engines/vlm/auto_inline_engine.py)
- BaseOcrModel._merge_ocr_and_pdf_cells (cognitive 17) (docling/models/base_ocr_model.py)
- BoxNoteDocumentBackend._add_table (cognitive 24) (docling/backend/boxnote_backend.py)
- Change coupling: abstract_backend.py ↔ pypdfium2_backend.py (docling/backend/abstract_backend.py)
- Change coupling: api_vlm_model.py ↔ mlx_model.py (docling/models/vlm_pipeline_models/api_vlm_model.py)
- Change coupling: docling_parse_backend.py ↔ pypdfium2_backend.py (docling/backend/docling_parse_backend.py)
- Change coupling: layout_model.py ↔ page_preprocessing_model.py (docling/models/stages/layout/layout_model.py)
- ChartExtractionModelGraniteVisionV4.__call__ (cognitive 28) (docling/models/stages/chart_extraction/granite_vision.py)
- ChartExtractionModelGraniteVisionV4.__call__ (cyclomatic 19) (docling/models/stages/chart_extraction/granite_vision.py)
- ConversionAssets.load (cognitive 20) (docling/datamodel/document.py)
- ConversionAssets.load (cyclomatic 18) (docling/datamodel/document.py)
- Coverage not included — suite not readable by the collector
- CsvDocumentBackend.convert (cognitive 20) (docling/backend/csv_backend.py)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (docling/backend/html_backend.py)
- Duplicated block (10 lines × 2) (docling/backend/xml/uspto_backend.py)
- Duplicated block (10 lines × 2) (docling/models/stages/reading_order/readingorder_model.py)
- …and 412 more

## New (23)

- Coverage not measured — test suite did not build
- Dimension evaluation failed
- Duplicated block (12 lines × 3) (docling/models/stages/reading_order/readingorder_model.py)
- Duplicated block (13 lines × 2) (docling/pipeline/asr_transcriber.py)
- Duplicated block (14 lines × 2) (docling/pipeline/standard_pdf_pipeline.py)
- Duplicated block (14 lines × 2) (docling/service_client/client.py)
- Duplicated block (15 lines × 2) (docling/models/stages/ocr/tesseract_ocr_cli_model.py)
- Duplicated block (15 lines × 2) (tests/test_asr_whisper_s2t.py)
- Duplicated block (16 lines × 2) (docling/models/stages/table_structure/table_structure_model_v2.py)
- Duplicated block (17 lines × 2) (docling/backend/msword_backend.py)
- Duplicated block (19 lines × 2) (tests/test_asr_mlx_whisper.py)
- Duplicated block (19 lines × 3) (docling/backend/xml/uspto_backend.py)
- Low IaC: DS-0026 (Dockerfile)
- Medium: security finding (details withheld)
- No artifact signing
- No build provenance
- No tests found
- Secret: private-key (docling/datamodel/service/sources.py)
- The body is a table of 311 service request rows with columns like 'service_request_id', 'status_notes', and row data (address, long, lat, media_url), giving no context or decision about the schema; it is an empty ADR (tests/data/ebcdic/groundtruth/311_calls_for_service.ebc.md)
- main.convert (cognitive 104) (main)
- …and 3 more

## Changes since last survey

- 21 commits — 8 feature/other, 13 fixes

## By area

- tests/data — 8 commits
- docling/backend — 3 commits
- (root) — 2 commits
- docling/datamodel — 2 commits
- docling/models — 2 commits
- docling/utils — 1 commit
- docs/concepts — 1 commit
- docs/examples — 1 commit
- tests/test_backend_msexcel.py — 1 commit

## Notable commits

- fix: fix(docx): keep body text after a blank spacer inside a list (#3898) (#3902)
- fix: fix(docx): resume ordered-list numbering after an intervening list (#3896) (#3897)
- fix: fix(docx): stop dropping section header/footer content in Docx (#3843)
- fix: fix(ocr): make the OCR render scale configurable instead of hardcoded (#3877)
- fix: fix(odf): preserve text after inline elements (#3850)
- fix: fix(pdf): preserve pictures inside table cells (#3906)
- fix: fix(pdf): rewind stream inputs in docling-parse (#3895)
- fix: fix(pdf-outline): use iterative walk to avoid RecursionError on deep outlines (#3855)
- fix: fix(pptx): process slide shapes in visual reading order (#3393)
- fix: fix(reading-order): dehyphenate hard continuations (#3888)
- fix: fix(tests): increase tolerance for fuzzy test on bbox (#3912)
- fix: fix: Fixed HTML render to stop implicit file requests. (#3948)
- fix: fix: make sure the shapes are rendered in the threaded docling-parse (#3947)
- change: chore: bump version to 2.117.0 [skip ci]
- change: chore: bump version to 2.118.0 [skip ci]
- change: feat(service datamodel): expose PDF heading-level inference in the service API (#3874)
- change: feat(service datamodels): chunking options and targets (#3857)
- change: feat(skills): add agent skills for using docling (#3913)
- change: feat: Refactor RapidOcrModel to support all PP-OCR languages via version/backbone resolution (#3863)
- change: feat: add the ebcdic backend (#3926)
- …and 1 more
