## Winning Approach

The promoted approach is a curated, source-aware biomedical news pipeline:

- RSS-first discovery for the six core publishers, with source-specific headline-page fallback.
- Trafilatura-based direct HTTP extraction where article access allows.
- Explicit per-article access/extraction statuses instead of assuming uniform full text.
- Heuristic entity and identifier extraction for MVP: DOI, PMID, NCT ID, genes, drugs, diseases, companies, trial cues, and approval cues.
- BioMCP pivot suggestions attached to news records.
- Transparent keyword/entity profile scoring for the first personalized briefing implementation.

The exploit implementation is a registry-backed Python CLI at `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/scripts/news_pipeline.py`. It reads the six-source registry from `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/source_registry.json` and the sample oncologist profile from `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/profile_oncology_kras_melanoma.json`.

## Full-Scale Results

Full-scale run:

- Command label: `full-scale-live`
- Output: `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/news_pipeline_full_scale.json`
- Parameters: six live sources, `per_source=12`, `max_articles=60`, `max_entity_articles=30`, `pivot_limit=6`, conservative ranking enabled.
- Projection checksum: `94a674dae0333cd03e8a5a780656f4ef49e967d3a99725ad798e09e16ed949c4`

Discovery matrix:

| Source | Mode | Best feed | Entries | Latest age hours | Headline items | Headline date fields | Page status |
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
| `fierce-biotech` | `rss` | `https://www.fiercebiotech.com/rss/xml` | 25 | 37.59 | 12 | 0 | 200 |
| `fierce-pharma` | `rss` | `https://www.fiercepharma.com/rss/xml` | 25 | 50.31 | 12 | 0 | 200 |
| `biopharma-dive` | `rss` | `https://www.biopharmadive.com/feeds/news/` | 10 | 40.61 | 34 | 7 | 200 |
| `stat` | `rss` | `https://www.statnews.com/category/biotech/feed/` | 20 | 4.64 | 50 | 39 | 200 |
| `endpoints` | `rss` | `https://endpoints.news/feed/` | 24 | 13.91 | 39 | 0 | 200 |
| `genomeweb` | `blocked_or_no_discovery` | `https://www.genomeweb.com/feed` | 0 | n/a | 0 | 0 | 403 |

Extraction:

- Candidate articles: 60.
- Attempted article extractions: 60.
- Useful direct extractions: 21.
- Useful direct-extraction sources: 2 (`biopharma-dive`, `stat`).
- Mean quality score: 2.73 / 5.
- `biopharma-dive`: 12/12 useful, HTTP 200, 2318-20037 Trafilatura chars, quality 5.
- `stat`: 9/12 useful, HTTP 200, 453-7358 Trafilatura chars, statuses `extracted`, `partial`, and `auth_required`.
- `endpoints`: 0/12 useful, HTTP 200, partial/unreadable text only, max 414 Trafilatura chars.
- `fierce-biotech`: 0/12 useful, HTTP 403 article fetches.
- `fierce-pharma`: 0/12 useful, HTTP 403 article fetches.

Entities, pivots, and briefing:

- Entity articles analyzed: 30.
- Articles with at least one entity/company/disease/gene/drug signal: 24.
- BioMCP pivot attempts: 6.
- Successful BioMCP pivots: 6.
- Top briefing item: STAT KRAS/pancreatic cancer/daraxonrasib story, score 20.
- Successful pivot examples:
  - `biomcp get drug daraxonrasib`
  - `biomcp get disease "pancreatic cancer"`
  - `biomcp get gene MET`
  - `biomcp get disease melanoma`
  - `biomcp get gene KRAS`
  - `biomcp search trial -i daraxonrasib --limit 1`

Performance:

- Total wall time: 47.5066 s.
- Startup/load time: 0.0003 s.
- Discovery: 8.5098 s for 6 sources, 0.7051 sources/s.
- Article extraction: 22.7071 s for 60 articles, 2.6423 articles/s.
- Entity/briefing stage: 16.2890 s for 30 articles, 1.8417 articles/s.
- Pivot validation: 6.4906 s for 6 pivots, 0.9244 pivots/s.
- HTTP request latency: 112 requests, mean 84.77 ms, p50 57 ms, p95 341 ms, max 615 ms.
- Peak RSS: 115.35 MB.

## Regression Control

Regression control run:

- Command label: `regression-control`
- Output: `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/news_pipeline_regression_control.json`
- Method: replayed the saved explore discovery dataset, then ran the exploit implementation at the exact explore scale: `per_source=4`, `max_articles=20`, `max_entity_articles=10`, `pivot_limit=6`.
- Projection checksum: `6dc0bcad74c64e18d619b054b025ece3acff14ccee9893995c7acacf54fad709`

All measured explore correctness metrics matched or improved:

| Metric | Explore baseline | Exploit control | Rule result |
| --- | ---: | ---: | --- |
| Validation mismatch count | 0 | 0 | Pass, stayed equal |
| Attempted articles | 20 | 20 | Pass, same workload |
| Useful extractions | 8 | 8 | Pass, stayed equal |
| Useful source count | 2 | 2 | Pass, stayed equal |
| Articles analyzed | 10 | 10 | Pass, same workload |
| Articles with any entity | 9 | 9 | Pass, stayed equal |
| Successful pivots | 5 | 5 | Pass, stayed equal |
| Top briefing title | STAT KRAS/pancreatic cancer/daraxonrasib story | same | Pass |

Regression-control performance:

- Total wall time: 19.1365 s.
- Startup/load time: 0.0016 s.
- Discovery replay: 0.0000 s for 6 sources.
- Article extraction: 8.2931 s for 20 articles, 2.4116 articles/s.
- Entity/briefing stage: 10.8416 s for 10 articles, 0.9224 articles/s.
- Pivot validation: 7.4878 s for 5 pivots, 0.6678 pivots/s.
- HTTP request latency: 30 requests, mean 104.30 ms, p50 57 ms, p95 507 ms, max 565 ms.
- Peak RSS: 94.98 MB.

Checksum note:

- Explore did not record a projection checksum during the explore phase.
- The exploit computed a post-hoc baseline checksum from the saved explore JSON and the control checksum matched exactly: `6dc0bcad74c64e18d619b054b025ece3acff14ccee9893995c7acacf54fad709`.

Timing/RSS note:

- Explore did not record throughput, latency, peak RSS, or build/load time.
- No timing/RSS regression rule could be applied against explore baselines for those dimensions; the exploit control values above establish the first contract values.

No regression carveout was needed for correctness. The only validation warning is the known publisher-access constraint: useful direct full-text extraction currently comes from two sources, while quality-scored extraction/access samples exist across five article-fetch sources.

## Validation

Automated validation in `news_pipeline.py` produced:

- Full-scale mismatch count: 0.
- Full-scale warning count: 1.
- Regression-control mismatch count: 0.
- Regression-control warning count: 1.

Validated criteria:

- Source discovery matrix exists for all six core sources.
- Every source records an explicit discovery mode.
- Content extraction/access samples with quality scores exist from at least three sources.
- Entity extraction ran on more than five articles.
- Precision-assessment notes are attached to analyzed entity records.
- At least three BioMCP pivots succeeded; full-scale had 6/6 successes.
- A personalized oncologist/KRAS/melanoma briefing was generated.
- The top briefing result retained the expected KRAS/pancreatic cancer/daraxonrasib relevance signal.

Remaining validation gap:

- Useful direct article text is reliable for BioPharma Dive and partly reliable for STAT only. Fierce article pages still return HTTP 403, Endpoints remains partial/unreadable by direct HTTP, and GenomeWeb remains blocked without browser/auth. This is a source-access limitation, not a regression from explore.

## Produced Artifacts

Persistent source and configuration artifacts:

- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/scripts/news_pipeline.py`
- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/source_registry.json`
- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/profile_oncology_kras_melanoma.json`

Persistent result artifacts:

- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/news_pipeline_regression_control.json`
- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/news_pipeline_full_scale.json`
- Existing explore baselines remain in:
  - `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/discovery_results.json`
  - `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/article_extraction_results.json`
  - `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/results/entity_briefing_results.json`

Persistent documentation artifacts:

- `.march/exploit.md`
- `architecture/experiments/245-biomedical-news-discovery-and-personalized-briefing/exploit.md`

No downstream artifact was written to `/tmp/`. No binary index, compiled binary, or raw working cache is required for the downstream contract.

## Contract Numbers

Downstream spikes should use the exploit-measured values, not explore estimates:

- Default source pack: six sources.
- Default live discovery result: five RSS sources plus GenomeWeb blocked/unauthenticated at HTTP 403.
- Full-scale workload: `per_source=12`, `max_articles=60`, `max_entity_articles=30`, `pivot_limit=6`.
- Full-scale useful direct extractions: 21/60.
- Full-scale useful direct-extraction sources: 2 (`biopharma-dive`, `stat`).
- Full-scale entity hit rate: 24/30 analyzed articles.
- Full-scale BioMCP pivot success: 6/6.
- Full-scale validation mismatches: 0.
- Full-scale validation warnings: 1, useful direct full text from only two sources.
- Full-scale total runtime: 47.5066 s.
- Full-scale article extraction throughput: 2.6423 articles/s.
- Full-scale entity/briefing throughput: 1.8417 articles/s.
- Full-scale HTTP latency: p50 57 ms, p95 341 ms.
- Full-scale peak RSS: 115.35 MB.
- Full-scale projection checksum: `94a674dae0333cd03e8a5a780656f4ef49e967d3a99725ad798e09e16ed949c4`.
- Regression-control checksum: `6dc0bcad74c64e18d619b054b025ece3acff14ccee9893995c7acacf54fad709`.

## Conclusions

The MVP is feasible as a curated publisher-monitoring subsystem, not as a uniform full-text crawler.

RSS-first discovery is build-ready for Fierce Biotech, Fierce Pharma, BioPharma Dive, STAT, and Endpoints. GenomeWeb should stay disabled or auth/browser-gated until a registered-access flow is built.

Trafilatura is build-ready for BioPharma Dive and useful for STAT with conservative rights/access handling. Direct HTTP extraction should be treated as discovery-only or partial for Fierce, Endpoints, and GenomeWeb until browser/auth and source-specific extraction are validated.

Heuristic entity extraction plus BioMCP pivots is enough for an MVP because it produced 24 entity-bearing articles at full scale and 6/6 successful BioMCP pivots. Embeddings and broad NER can be deferred.

Personalized briefing via transparent keyword/entity scoring is sufficient for the initial oncologist profile. The conservative scorer reduces generic oncology/cancer/phase inflation, but ranking should keep exposing reasons and entity matches so users can audit why a story was selected.
