All notable changes are documented here. The project follows semantic versioning; the dataset schemaVersion (currently 1.0.0) bumps on any breaking change to the output record shape.
Initial release.
- Watchlist of DailyMed SETIDs, NDC codes and RxNorm RxCUIs (bounded, validated, invalid input reported explicitly).
- Identifier → SETID resolution via the official DailyMed Web Services v2
/spls search (ndc= / rxcui=), deterministic newest-first ordering with per-identifier caps and reported truncation.
- Version detection via
/spls/{SETID}/history.json; current label XML via /services/v2/spls/{SETID}.xml; prior versions via the officially documented getFile.cfm ZIP endpoint, extracted binary-safely (largest XML member, NUL guard).
- Conservative text normalization (NFC, zero-width removal, whitespace collapsing only) and LOINC-coded section extraction with nested-subsection folding and duplicate-key merging.
- Bounded line-level LCS diffs (prefix/suffix trimming, cell-budget fallback flagged as
degraded), capped line payloads with exact counts, similarity and signed char delta.
- Conservative, fully auditable severity heuristic (
high/medium/low/unknown) with reasons embedded per record; decision-support disclaimers and NIH/NLM/FDA attribution embedded in provenance.
- Two record types sharing one schema:
label_status heartbeats (non-empty dataset guarantee for scheduled/example runs) and section_diff records with replay-stable IDs.
- Durable per-label snapshot state in a named KV store; write-before-state commit ordering;
maxItems truncation withholds snapshots so truncated labels are re-checked next run (no silent skips); bounded state with rolling prune (2,000 labels).
- Politeness pacing (~1 req/s default), retry/backoff honoring
Retry-After, request timeouts, response byte ceilings, per-label error isolation, all-failed-run hard failure with OUTPUT diagnostics.
- Complete
.actor schemas (input prefill doubles as a bounded real-source Store health smoke), Dockerfile (multi-stage, reproducible npm ci), README, and 66 automated tests (unit, integration, adversarial, schema) plus SMOKE=1 live-source tests.