Skip to content

tx.fhir.org serves status=active for VSAC value sets VSAC has retired (mirror missing in-place retirements) #238

@jmandel

Description

@jmandel

Summary

tx.fhir.org serves status=active for VSAC value-set versions that the authoritative VSAC FHIR API (cts.nlm.nih.gov) reports as retired — including the widely-used clinical sets Smoking Status and Tobacco Use and the US-Realm core Detailed Ethnicity set. For each, the same revision (identical meta.versionId) is active on tx but retired on VSAC, so this is not "tx holds an older revision" — it is the mirror not observing VSAC's in-place retirements.

Independently verified live (2026-06-06)

Each row: identical OID + version + meta.versionId on both servers; only status differs.

OID version versionId tx.fhir.org VSAC (cts.nlm.nih.gov) — authoritative
2.16.840.1.114222.4.11.877 — Detailed Ethnicity 20251123 22 active retired (lastUpdated 2026-04-13)
2.16.840.1.113883.11.20.9.38 — Smoking Status 20240606 25 active retired (2026-04-29)
2.16.840.1.113883.11.20.9.41 — Tobacco Use 20240606 36 active retired (2026-04-29)
2.16.840.1.113762.1.4.1170.58 — Goals/preferences for medical treatment 20250403 5 active retired (2026-05-29)

Repro

# tx (no auth) -> status=active
curl -s -G -H 'Accept: application/fhir+json' \
  --data-urlencode 'url=http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.877' \
  --data-urlencode 'version=20251123' \
  'https://tx.fhir.org/r4/ValueSet' \
 | jq '.entry[0].resource | {version, status, vId: .meta.versionId, lastUpdated: .meta.lastUpdated}'
# => {"version":"20251123","status":"active","vId":"22","lastUpdated":"2025-11-23T18:00:57.000-05:00"}

# authoritative VSAC (Basic auth: username "apikey", password = your UMLS/VSAC API key) -> status=retired
curl -s -G -H 'Accept: application/fhir+json' -u "apikey:$VSAC_API_KEY" \
  --data-urlencode 'url=http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.877' \
  --data-urlencode 'version=20251123' \
  'https://cts.nlm.nih.gov/fhir/ValueSet' \
 | jq '.entry[0].resource | {version, status, vId: .meta.versionId, lastUpdated: .meta.lastUpdated}'
# => {"version":"20251123","status":"retired","vId":"22","lastUpdated":"2026-04-13T20:10:21.000-04:00"}

Expected vs actual

  • Expected: the mirror reflects the authoritative source's current status. Because meta.versionId is identical on both sides (22, 25, 36, 5), tx is holding the same revision VSAC has since retired in place, so tx should report retired.
  • Actual: tx reports active, between ~1 month (Goals/preferences) and ~7 weeks (Detailed Ethnicity) after VSAC's retirement.

Why it differs (source + lag mechanism)

  • Source citation (not an assumption): the authoritative source itself — VSAC's own FHIR API at cts.nlm.nih.gov — returns retired for these exact revisions (verified above, same versionId).
  • VSAC frequently retires a version in place: it flips status: active → retired on the same version. For OID 877 it also bumped meta.lastUpdated (2025-11-23 → 2026-04-13), so even a timestamp-aware mirror should have caught it — yet tx has not, ~7 weeks later. tx even ingested OID 877's successor 20260410 (so it touched this OID after the retirement), but left 20251123 flagged active.
  • Per FHIR PublicationStatus, retired means the resource "should no longer be used" — serving such a value set as active misrepresents its lifecycle to consumers (https://hl7.org/fhir/valueset-publication-status.html).

Scope / honesty

This is a data-freshness / mirror-sync observation (FHIR does not mandate a refresh interval), filed because the affected sets are high-traffic. The 4 rows above were independently re-verified today against both servers with a live VSAC API key. (An earlier 5th candidate, OID 2.16.840.1.113762.1.4.1260.427, was dropped: tx serves it at a different versionId than VSAC's retired revision, so it is not a clean same-revision discrepancy.)


Re-confirmed live against https://tx.fhir.org on 2026-06-06; server self-reports FHIRsmith 0.9.6.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions