# Configured shapefile round trips — method The canonical table contains 60 completed observations: the same 20 original synthetic fixtures through three configured pipelines. Forty PyShp/Mapshaper observations are preserved from the P3 run, and 20 GDAL/OGR observations were executed for E1. This is not a new execution of all 60 rows. `observation_runs`, per-row `run_id` and `environments` distinguish the runs. ## Recorded environments - P3 completed at 2026-10-25T00:02:38.465761Z, 24 October local time: macOS 27.0.1 ARM64, Python 3.12.14, PyShp 3.1.6, Node 24.19.0 and Mapshaper 0.7.97. Its 40 semantic results matched the saved prior run, excluding machine-specific paths. - E1 GDAL/OGR completed at 2026-10-25T01:54:04.720272Z, 24 October local time: macOS 27.0.1 ARM64, Python 3.12.15, GDAL 3.11.5 and micromamba 2.9.0. This environment is workspace-local and separate from the P3 interpreters. - The E1 60-row browser viewer was checked separately in Chromium 155.0.8059.80 on macOS 27.0.1. It verifies filtering, not GIS conversion. Its record is `../measurements/shapefile-viewer-e1.json`. ## Fixtures and explicit configurations Every fixture contains two original 2D Point features. The unchanged corpus covers short and colliding long field names, UTF-8 and emoji, nulls, booleans, fractional values, large integers, text identifiers, dates, long text, spaces, nested values, arrays and mixed types. Its specification SHA-256 is `27e310e1f43e5ca70be47bc4f95576eef1eebbbf6c8540621a3f429599341283`. It contains no third-party GIS records or personal data. PyShp receives each fixture's declared DBF schema and writes/reads UTF-8. Mapshaper imports GeoJSON, infers its DBF schema, exports a UTF-8 shapefile and imports it back to GeoJSON. GDAL/OGR runs `ogr2ogr -f "ESRI Shapefile" output.shp input.geojson -lco ENCODING=UTF-8`, then `ogr2ogr -f GeoJSON output.geojson output.shp`. OGR infers the schema; no explicit casts, repair, simplification or reprojection were requested. Original process return codes, warnings, returned properties, schema and coordinates are retained. These are different explicit configurations, not equal defaults or a software ranking. No polygon, curve, multipart geometry, Z/M value, spatial index, invalid-geometry repair, CRS transformation, QGIS GUI or performance benchmark was tested. ## Equality and outcomes Returned property dictionaries and coordinates are compared with the original input. JSON booleans are distinct from numbers; numeric values compare numerically; object keys, strings and arrays compare exactly. The earlier 40 stored equality values are preserved. All three pipelines returned exact coordinates for 20 of 20 fixtures. Exact returned properties occurred in 11 PyShp, 11 Mapshaper and 13 OGR observations. The counts describe this corpus and configuration only. The `what_changed` field is an editorial description of the recorded input/output difference, not another measurement. Each non-equal row names the actual change. F03 requires particular care: PyShp retains both positional values while duplicate truncated field names collide in its dictionary projection. That is not evidence of file-value loss. Mapshaper and OGR retain distinct shortened names. F10 reflects PyShp's explicit six-decimal schema; F11 records Mapshaper's configured JavaScript integer boundary. Neither outcome generalizes to every export route. OGR's seven non-equal fixtures show field-name truncation/disambiguation, empty text becoming null, 300-byte ASCII text shortened to 254 bytes, edge-space trimming, dropped array attributes with generated FID values, and numeric/text coercion. In F17 the nested object returns exactly after the OGR round trip, but the intermediate DBF field is String: this is not native nested-object storage in DBF. Read returned values and schemas together before selecting a mitigation. ## Reproduction and evidence `fixtures.json` preserves the original inputs and declared schemas. `index.json` is canonical; `index.csv` is its flattened export. The previous 40-row asset is retained at `../../review/evidence/D2/earlier-runs/P3/`. Original P3 inputs and outputs are under `../../review/evidence/D2/fixtures/measurement_files/`; new synthetic OGR output files and safe process records are under `../../review/evidence/gdal-e1/ogr-output/` and `../../review/evidence/gdal-e1/gdal-ogr-observations.json`. The original executed OGR runner is `../../harness/shapefile-round-trips/gdal-e1/measure_ogr.py`, SHA-256 `787142923a0a59910be57d7b864b2b79802b697518088a0a624ee535ef50c2cc`. Its environment-variable paths were used during the recorded run; no portability edit is being counted as execution. The harness includes exact conda package URLs/hashes and installation instructions, but no GDAL runtime binaries. The P3 portable runner remains a separately identified, unexecuted derivative of its original executed script. The original corpus and compiled observations are CC BY 4.0. Original runner code is MIT. PyShp is MIT, Mapshaper MPL-2.0 and GDAL uses its own MIT-style licence and bundled third-party notices. These terms do not relicense software, documentation or source data. `source-ledger.json` records inspected primary documentation, and `hashes.txt` covers this asset's delivered files.