# Exploit — Collect article fulltext miss fixtures for BioC renderer gate

## Winning Approach

Explore found a negative but actionable winner: keep BioC/PubTator out of the BioMCP article fulltext ladder unless a concrete fixture proves a material win over the existing JATS/XML + PMC HTML ladder. The bounded explore probe found current-ladder misses/degradations, but BioC did not repair them; BioC fulltext appeared only where current structured XML already worked.

## Full-Scale Results

Full-scale target run used the hardened collector with `--search-limit 8`, doubling each Europe PMC search family from 4 to 8 records while retaining the 4 prior controls.

Persistent outputs:
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_full_scale.json`
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_full_scale_matrix.csv`

Measured target-scale numbers:

| Metric | Value |
|---|---:|
| Cases | 28 |
| Material BioC wins | 0 |
| Current best: JATS/XML | 11 |
| Current best: PMC HTML | 13 |
| Current best: miss | 4 |
| NCBI BioC fulltext available | 11 |
| PubTator3 fulltext available | 0 |

By approach:

| Approach | Cases | Current best | BioC fulltext | PubTator fulltext | Material BioC wins |
|---|---:|---|---:|---:|---:|
| Prior-art controls | 3 | 3 JATS/XML | 3 | 0 | 0 |
| PubTator non-PMC control | 1 | 1 miss | 0 | 0 | 0 |
| Non-OA PMC / HTML-only search | 8 | 8 PMC HTML | 0 | 0 | 0 |
| Non-OA MED fulltext search | 8 | 5 PMC HTML, 3 miss | 0 | 0 | 0 |
| OA BioC-equivalence search | 8 | 8 JATS/XML | 8 | 0 | 0 |

The larger bounded harvest preserved the explore conclusion: all observed BioC fulltext cases were coverage-equivalent to current structured XML, and all observed current HTML/miss cases lacked BioC fulltext.

## Regression Control

The exploit implementation replayed the exact 16-case explore dataset via `--cases-from`.

Persistent outputs:
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_regression_control.json`
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_regression_control_matrix.csv`

Regression numbers:

| Metric | Explore | Exploit control | Rule result |
|---|---:|---:|---|
| Cases | 16 | 16 | Pass |
| Material BioC wins | 0 | 0 | Pass |
| Current best: JATS/XML | 7 | 7 | Pass |
| Current best: PMC HTML | 7 | 7 | Pass |
| Current best: miss | 2 | 2 | Pass |
| NCBI BioC fulltext | 7 | 7 | Pass |
| PubTator3 fulltext | 0 | 0 | Pass |
| Matrix checksum | `bb033f79aac4fddcc0ec5b09144b2675dc12ae54f5bc8465d6e3213d9b9dbb06` | same | Pass |

No metric regressed and no carveout was needed. The checksum match confirms the compact projection did not change for the fixed explore case set.

## Validation

Validated:
- Each regression/full-scale JSON case has an ID mapping, sources, source request URLs, source kind, license/reuse fields, and an insufficiency/decision reason.
- `collect_bioc_miss_candidates.py --help` succeeds with the new exploit options.
- `git diff --check` passes.
- No BioMCP runtime source ladder or renderer code was changed.

A broader `uv run pytest tests/test_pre_commit_reject_march_artifacts.py` attempt was stopped after timing out during project build setup; because this ticket changed only inert architecture experiment artifacts and a standalone live-source script, the data validation above is the relevant gate for this spike.

## Produced Artifacts

Source/script:
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/scripts/collect_bioc_miss_candidates.py`

Results:
- Explore baseline: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_probe.json`
- Explore matrix: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_matrix.csv`
- Regression control JSON: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_regression_control.json`
- Regression control matrix: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_regression_control_matrix.csv`
- Full-scale JSON: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_full_scale.json`
- Full-scale matrix: `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/results/bioc_miss_candidate_full_scale_matrix.csv`

Report copy:
- `architecture/experiments/384-collect-article-fulltext-miss-fixtures-for-bioc-renderer-gate/exploit.md`

No `/tmp/` artifacts are required. The committed JSON/CSV files are compact metadata/excerpts only, not full article bodies or binary/generated indexes.

## Contract Numbers

Downstream spikes should rely on exploit-measured values:
- Target-scale workload: 28 bounded live cases.
- Material BioC wins over current XML/HTML ladder: 0/28.
- Current XML/HTML insufficiency cases at target scale: 17/28 (13 PMC HTML, 4 miss).
- BioC repairs of those insufficiency cases: 0/17.
- BioC fulltext availability: 11/28, all already covered by current JATS/XML.
- PubTator3 fulltext availability: 0/28.
- Regression-control projection checksum: `bb033f79aac4fddcc0ec5b09144b2675dc12ae54f5bc8465d6e3213d9b9dbb06`.
- Full-scale matrix checksum: `c4fb68a75b2bd6bbfcd4f1ad08fcba39933669d2ceae4ee8aa999a24be0352b5`.
- Full-scale JSON checksum: `a19cd2c4b0c628155c080e6e450a9c3313cbe31e85ac9c44bc664430afb95951`.

## Conclusions

Recommendation: **NO-GO** for an immediate BioC-to-Markdown renderer or default source-rung ticket.

What this enables:
- Future renderer work has a clear acceptance bar: commit a fixture where current JATS/XML + PMC HTML misses or materially degrades and BioC supplies fulltext with useful structure/license evidence.
- PubTator should remain annotation enrichment unless a documented fixture proves fulltext delivery.
- The default ladder should remain XML/HTML-first, with PDF opt-in, until fixture-backed evidence proves a safer order.

Remaining risks:
- The search is still bounded and live-source behavior can drift.
- PMC HTML degradation is classified by compact source metadata, not by a full Markdown renderer quality score.
- A rare BioC-only win may exist outside these query families; it should be handled as a future targeted fixture, not as a speculative runtime change.
