Back to synthesis

Evidence record

docs/source-provenance-audit.md

SHA-256: 6531af0c1da5f29d9f65ad57a164cbdee56eb95b82cbafa6f0347e524d5293eb

# Bounded source-provenance audit

[ours] Audited accepted HEAD `720df9e0297a02dad054fae96381daf8dd38c1e7`
on 2026-10-08. **All 17 flagged main validation rows contain generated geometric
graphics: flat coloured backgrounds with coloured rectangles.** This classification
comes from inspection of their actual decoded source bytes, not their names.
Their bytes demonstrably came through the pinned enriched dataset; the producing
program, creator, intended purpose and label-assignment procedure remain unknown.
No scientific endpoint was recomputed and no historical result was replaced.

## Evidence and entry into the sample

[ours] The local source has 70,000 training and 10,500 validation rows at Lance
version 55. Version 51 has 80,000 rows; version 52 adds 500 new validation rows,
all named `synthetic_val_000000` through `synthetic_val_000499`, in fragment 2.
The first-append timestamp recorded by Lance is `2026-04-09T18:00:08.247433`
(timezone unspecified by the returned timestamp). The 17 inspected rows have the
same bytes in versions 52 and 55. This append predates the October extraction.

[ours] The local download sidecar records upstream revision
`d82c5188d392714ba8091d68014f7b9838ceadf2`. An independent read of the
[pinned upstream file metadata](https://huggingface.co/api/datasets/lance-format/BDD100K-enriched/tree/d82c5188d392714ba8091d68014f7b9838ceadf2/data/bdd100k.lance/data?expand=true)
confirms that fragment 2's image data file has SHA256
`fb6dfdee886acaf76efbd6be9a1098038eac28004e8e15b38a221d62a84f3098`,
matching the entire local 2,944,032-byte file. Its upstream upload commit is
`28f6f7b5cd1526ceec55082fcc2ef85f3ec9ad4a`, dated 2026-04-10.
Thus the appended content is present in the distributed source, rather than
merely sharing extraction-recorded hashes. The pinned upstream root contains
only `.gitattributes` and `data/`; its README request returned 404. No producer
script, original BDD filename mapping or source-caption field was recovered.
See [upstream verification](../experiments/phaseC_source_audit/upstream_verification.json).

[ours] The repository makes no ID rewrite: [LanceBdd](../src/embedding_diagnostics/bdd_lance.py#L38)
reads `image_id` verbatim and rejects duplicates. The same path handles all
3,000 selected rows, including 2,983 IDs matching the hexadecimal BDD-style
pattern and these 17 upstream IDs. [Main selection](../scripts/prepare_c1_main.py#L20)
excludes all 512 pilot IDs, then [select_sample](../src/embedding_diagnostics/phase_c_pilot.py#L56)
chooses fully labelled rows uniformly without replacement, seed 1, independently
within physical splits, and globally sorts IDs. It does not distinguish generated
content. These rows entered the frozen sample through that ordinary eligibility
and sampling rule, not through a special fallback or a later C3 insertion.

[ours] Historical code at extraction identity `fdc68c1e14004aac45e7c85fa4e05db96eeeda28`
was inspected; seven relevant loader, mapping, sampling, runner and cache files
match their extraction-recorded SHA256 values. The loader was introduced in
`3c6e8e4`; the main-selection script in `fdc68c1`. [decode](../src/embedding_diagnostics/bdd_lance.py#L68)
validates selected metadata/ID order, hashes original bytes, then opens those bytes.
[extract](../src/embedding_diagnostics/phase_c.py#L88) passes decoded images to the
encoder, propagates failures and stores the supplied image hashes. There is no
placeholder substitution. The [cache reader](../src/embedding_diagnostics/embedding_cache.py#L65)
checks chunk hashes and metadata alignment; source-byte continuity is additionally
checked during extraction resume. These checks do not authenticate photographic
origin or label validity.

[ours] Repository fixture paths inspected are confined to tests:
[test_bdd_lance](../tests/test_bdd_lance.py#L14) writes tiny red PNGs under
`tmp_path` with IDs `a`, `z`, `u`, `v`; its monkeypatch is test-local. No generator
for `synthetic_val_` was found in repository production code or Git history of
the ingestion path. The upstream fragment checksum supplies positive evidence
against those local fixtures having supplied the 17 canonical rows. It does not
identify which upstream generation program supplied them.

[ours] The unchanged [extraction manifest](../experiments/phaseC_c1_main/extraction_manifest.json)
records `google/embeddinggemma-2` revision
`914f7f89142e33e77833254d9c9b90c3cef7303b`, text + vision with audio disabled,
CPU FP32, batch 1, four threads, 768 dimensions, masked mean pooling and L2
normalization. Canonical cache-manifest SHA256 is
`c358c13999fefb49b7c3458e27231b9fe7e56834c2ec0df22d0eb73731fd04ad`;
sample-manifest SHA256 is
`62c62eec085ba09f4a056a4451e37391f680a89becc480c55b40f90cc85f6aaf`.
The audit verified input/cache continuity and recorded code identity, without
re-executing the model to independently verify those embeddings.

## Per-row classification

[ours] Every row below has physical split **val**, source fragment **2**, and
classification **4 — confirmed generated graphic content**. Source position is
the zero-based scan/take position at version 55; fragment offset is position
minus 80,000. Cache locations are under
`experiments/phaseC_c1_main/embedding-cache/`, in four-row files named
`chunk-START-STOP.npz`. The full source metadata, label codes, hashes, exact cache
paths/offsets and classification evidence are in
[flagged_rows.json](../experiments/phaseC_source_audit/flagged_rows.json).
The displayed hash prefixes are conveniences; the audit compared full SHA256 values.

| Source ID (= canonical ID) | Source position / fragment offset | Weather / scene / timeofday | Cache chunk start : offset | Raw SHA256 prefix | Class |
| --- | --- | --- | --- | --- | --- |
| `synthetic_val_000005` | 80005 / 5 | clear / gas stations / daytime | 2980 : 3 | `4393a92b5101` | 4 |
| `synthetic_val_000021` | 80021 / 21 | clear / tunnel / night | 2984 : 0 | `40b04cf732eb` | 4 |
| `synthetic_val_000029` | 80029 / 29 | rainy / gas stations / night | 2984 : 1 | `ee4abbc563d5` | 4 |
| `synthetic_val_000048` | 80048 / 48 | snowy / gas stations / daytime | 2984 : 2 | `7f0196d5bc26` | 4 |
| `synthetic_val_000067` | 80067 / 67 | rainy / highway / dawn/dusk | 2984 : 3 | `0540e71518d1` | 4 |
| `synthetic_val_000116` | 80116 / 116 | snowy / highway / night | 2988 : 0 | `3fdab78aa934` | 4 |
| `synthetic_val_000150` | 80150 / 150 | overcast / residential / daytime | 2988 : 1 | `b7a8140b99d9` | 4 |
| `synthetic_val_000189` | 80189 / 189 | snowy / tunnel / daytime | 2988 : 2 | `6af1efca0fe6` | 4 |
| `synthetic_val_000210` | 80210 / 210 | rainy / residential / dawn/dusk | 2988 : 3 | `19943199e1e6` | 4 |
| `synthetic_val_000228` | 80228 / 228 | rainy / residential / night | 2992 : 0 | `cdf1a6d0e774` | 4 |
| `synthetic_val_000234` | 80234 / 234 | snowy / highway / daytime | 2992 : 1 | `6e3c56bc9925` | 4 |
| `synthetic_val_000361` | 80361 / 361 | foggy / residential / night | 2992 : 2 | `f3c2e3662ffc` | 4 |
| `synthetic_val_000362` | 80362 / 362 | rainy / tunnel / night | 2992 : 3 | `803dd461e148` | 4 |
| `synthetic_val_000373` | 80373 / 373 | clear / city street / night | 2996 : 0 | `dbb1a4cd69ac` | 4 |
| `synthetic_val_000375` | 80375 / 375 | snowy / gas stations / dawn/dusk | 2996 : 1 | `3ca95b7d2913` | 4 |
| `synthetic_val_000437` | 80437 / 437 | snowy / tunnel / daytime | 2996 : 2 | `2b76a71f0413` | 4 |
| `synthetic_val_000481` | 80481 / 481 | overcast / residential / daytime | 2996 : 3 | `d2a95f1b4345` | 4 |

[ours] Separate [inspection records](../experiments/phaseC_source_audit/image_inspection.json)
and the [labelled contact sheet](../experiments/phaseC_source_audit/inspection-contact-sheet.png)
record the only image decoding performed: these 17 RGB JPEGs, each 640×360.
All visibly depict geometric graphics rather than captured driving scenes.
This resolves content classification but does not recover an original identifier
before the upstream append, an exact generator/seed, or the rationale for weather,
scene and time-of-day labels. The source's `image_id` is its only source identifier;
there is no additional original-ID column to follow.

## Full selected-sample checks

[ours] [Audit records](../experiments/phaseC_source_audit/audit.json) and the compact
[3,000-row ledger](../experiments/phaseC_source_audit/selected_row_ledger.json) establish:

- All 3,000 source metadata rows match frozen IDs, physical splits and mapped labels.
- All 3,000 current raw-byte SHA256 values match extraction-recorded hashes.
- All 750 cache chunk checksums and their stored ID/split/label alignment match.
- No duplicate ID occurs among all 80,500 source metadata rows; neither the source
  nor the selected sample has train/validation identifier overlap.
- No two selected rows have identical raw-byte SHA256 values, within or across
  splits. Identifier overlap and exact-byte content overlap were tested separately.
- Selected fragment counts are 2,000 from original train fragment 0, 983 from
  original validation fragment 1, and 17 from appended validation fragment 2.

[interpretation] Exact-byte uniqueness does not exclude re-encoded copies,
near-duplicates or shared scenes. The other 2,983 selected images were not decoded
or authenticated against an original BDD release; no blanket natural-image-origin
claim follows. Full-source byte deduplication outside the selected sample was not
performed. No dataset-provided embedding or virtual duplicate column was read.
The executed procedure is retained in the [audit procedure](../experiments/phaseC_source_audit/procedure.md).

## Campaign scope and unresolved effects

[ours] All 17 occur in accepted C1-main's sample and extraction manifests.
C2 and C3 bind those same cache/sample hashes, so all their validation conditions
inherit them. C1-main's training split contains none of these IDs; its PCA/rank
bases, train-derived common-offset transform and probe training fit on training
rows. This establishes where rows participate, not absence of downstream effects.
C0's recorded 32-image IDs contain no such prefix. The exploratory C1-pilot
contains six **different** IDs from the same appended fragment:
`000015`, `000052`, `000146`, `000220`, `000379`, `000415`
(all with the `synthetic_val_` prefix); pilot-based hardening inherits them.
Those six were checked by metadata membership only, not decoded here, and are not
individually assigned content classification 4 by this inspection.

[ours] In main validation, these 17 account for all four `tunnel`, all four
`gas stations` and the sole `foggy` label. Their other labels are clear 3,
overcast 2, rainy 5, snowy 6; city street 1, highway 3, residential 5;
dawn/dusk 3, daytime 7, night 7. The frozen eligible balanced-probe class sets
exclude tunnel, gas stations and foggy. Within eligible classes, flagged-row
counts are weather 16, scene 9 and timeofday 17. Raw probe accuracy includes all
validation rows; class eligibility restricts balanced/F1 scoring only.
Retrieval includes all validation rows as queries and gallery candidates,
including ineligible classes as gallery candidates for macro retrieval.

[interpretation] The accepted endpoints describe their recorded enriched-source
sample. The generated graphics and unverified attribute semantics qualify claims
about natural driving-scene utility. The magnitude and direction of their effect
on geometry, probe validation, retrieval, numerical turnover and margin analyses
are unknown without a separately declared sensitivity analysis. A 1.7% query
fraction does not bound retrieval effects to 1.7%, because these rows also appear
in other queries' galleries. This audit neither discards the entire study nor
establishes that the remaining results are unaffected. Mathematical invariances
have a different evidential status from empirical natural-workload utility claims.

## Recommendation — source defect confirmed

[interpretation] Propose the smallest **separately labelled exclusion sensitivity**:
retain the accepted cache and all historical results, use the unchanged 2,000
training vectors and the remaining 983 validation vectors, and exclude exactly
these 17 confirmed graphics **from both queries and gallery candidates**.
Predeclare this audit-based exclusion and the unchanged C1/C2/C3 conditions before
execution. Reuse train-fitted transformations and probe fits where compatible;
re-evaluate validation geometry, probe scores/support, retrieval/floors and the
existing C3 error/identity/attribute/margin endpoints on the reduced gallery.
Retain frozen probe class eligibility with explicit revised supports; declare how
C3 reference margins/bins are rebuilt by its existing deterministic algorithm.
Do not retune precision conditions, severities, quantizers or solver grids.
Report differences from historical values without replacing them or presenting
this sensitivity as an independent confirmatory replication. This addresses the
natural-validation scope of C1 H1–H4, C2 utility comparisons and C3 stability
findings. The exploratory pilot's six related IDs require separate content checks
if that historical pilot is later corrected. No correction was executed here.

[interpretation] Recovering the upstream builder/append script and label-assignment
record would explain why these graphics were distributed, but is not required to
recognize the observed mismatch with a naturally photographed driving validation
population. Independent original-source replication remains a later decision.

## Preservation and verification

[ours] A pre-audit checksum snapshot protects tracked historical artifacts,
scientific code/dependencies, the canonical cache manifest and all 750 canonical
chunks. The verification record documents unchanged bytes, with the sole
explicitly authorized exception of appending this audit to C3 source qualification.
The original disclosure remains an exact prefix. No inference, endpoint execution,
cache write, ID regeneration, sample change, dependency change, ANN or C4 occurred.
Repository test/lint outcomes are recorded in
[verification.json](../experiments/phaseC_source_audit/verification.json).