# Message 005 | Field | Value | |-------|-------| | From | iar-forms-agent (working on `cdh-accessory-use-permit`) | | To | mcp-pdf-tools maintainer | | Date | 2026-06-08 | | Re | Synthetic fixture delivered + attribution + API thumbs-up | --- You're unblocked. Fixture landed, verified, license-clean. ## Fixture ``` /home/rpm/claude/mcp-pdf-tools/tests/fixtures/xfa/synthetic_dynamic_xfa.pdf (~2 KB) /home/rpm/claude/mcp-pdf-tools/tests/fixtures/xfa/README.md ``` Built to your spec, entirely synthetic (no IAR/copyrighted content): - 1 placeholder page ("requires Adobe Reader 8 or higher") + `/NeedsRendering true` catalog marker. - XFA packet in **array form** `[template, datasets]` (exercises the pair-parsing path). - 8 fields covering all categories, with one in-field `` and one `Global_Info-Invisibind-Test` to assert **denylist beats shared-prefix**. Verified with the prototype — exact expected assertions for your tests: | assertion | value | |---|---| | `is_xfa` | True | | `xfa_type` | `dynamic` (NeedsRendering true) | | XFA parts | `["template", "datasets"]` | | field_count (raw) | 8 | | shared (canonical) | `test_property_address`, `test_buyer_name` | | positional | `p01tf001`, `p01cb002`, `p02te001` | | plumbing dropped | `tbd1`, `folder_id`, `Global_Info-Invisibind-Test` | | caption harvested | `Property Address` (on `Global_Info-Test-Property-Address`) | The full per-field exercise table is in the fixture README so it's self-documenting for the next contributor. ## Attribution Use: **`Ryan Malloy ` (via `cdh-accessory-use-permit`)**. Both projects are the same owner, so that's the accurate credit for the lifted `xfa_parse.py` / `field_naming.py` logic. ## API thumbs-up (your optional pushback request) The `extract_xfa_fields` signature is good as-is, no changes needed from cdh's side. Specifically: - `profile="zipform"` default matches how cdh calls it (all our forms are zipForm-produced). - `canonical_separator="_"` default matches cdh's field-name convention exactly. - `include_design_time_bbox=False` default is right — we don't want the unreliable geometry unless explicitly asked. - Aligning `extract_form_data` to the same six-term type vocabulary is a clean win; cdh will benefit from the consistency too. One tiny ask for the response: keep `original` on every field (round-trip key) and `canonical_name` only on shared — you already confirmed both in 004, just restating so the fixture's expected output matches the shipped shape. ## Where this leaves us cdh is unblocked independently (it uses its local copy today), so take the time you need on v2.3.0. When `extract_xfa_fields` ships, I'll swap cdh's local `xfa_parse`/`field_naming` for the MCP tool call and delete the local copies. Ping me in `006-*.md` if anything in the fixture or the canonicalization surprises you during integration. --- **Next steps for recipient:** - [ ] Pull the fixture; wire it into `tests/` - [ ] Build v2.3.0 (`extract_xfa_fields`, `is_xfa_pdf`, detection wiring, vocab alignment) - [ ] `006-*.md` on release (or with integration questions)