File size: 43,618 Bytes
ab76564
4e6c346
 
 
 
ad746bd
 
4e6c346
 
 
 
 
 
 
 
 
 
 
 
 
 
ad746bd
4e6c346
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad746bd
 
 
 
4e6c346
ad746bd
 
4e6c346
 
 
 
 
ad746bd
 
 
 
 
 
 
 
 
 
ab76564
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>US Core Profile Check — check your fhir files free</title>
<meta name="description" content="Find FHIR R4 files pinned to US Core 3.1.1 or 5.0.1 and the USCDI v3 patient elements they miss.">
<style>
:root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
.wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
.bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
.sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
.note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
</style>
<script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
<!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/uscore-profile-gap-lint"></head>
<body>
<div class="wrap">
<h1>US Core Profile Check — check your fhir files free</h1>
<p class="lede">Finds FHIR R4 resource files still pinned to US Core 3.1.1 or 5.0.1, and the USCDI v3 patient elements they miss. 10 rules, offline, no PHI leaves your machine. Runs entirely in your browser — nothing is uploaded.</p>
<textarea id="src" spellcheck="false">{
  "resourceType": "Bundle",
  "id": "legacy-export-set",
  "type": "collection",
  "meta": {
    "versionId": "3"
  },
  "entry": [
    {
      "resource": {
        "resourceType": "Patient",
        "id": "pt-9001",
        "meta": {
          "profile": [
            "http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient|3.1.1"
          ]
        },
        "identifier": [
          {
            "type": {
              "coding": [
                {
                  "system": "http://hl7.org/fhir/v2/0203",
                  "code": "MR"
                }
              ]
            },
            "system": "http://hospital.example.org/mrn",
            "value": "9001"
          }
        ],
        "name": [{ "family": "Nowak", "given": ["Piotr"] }],
        "gender": "male",
        "birthDate": "1965-11-02"
      }
    },
    {
      "resource": {
        "resourceType": "Condition",
        "id": "cond-9001-a",
        "meta": {
          "profile": [
            "http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition|5.0.1"
          ]
        },
        "subject": { "reference": "Patient/pt-9001" }
      }
    },
    {
      "resource": {
        "resourceType": "Observation",
        "id": "obs-9001-a",
        "meta": {
          "profile": [
            "http://hl7.org/fhir/us/core/StructureDefinition/us-core-observation-lab"
          ]
        },
        "status": "final",
        "subject": { "reference": "Patient/pt-9001" }
      }
    },
    {
      "resource": {
        "resourceType": "CapabilityStatement",
        "id": "cap-legacy",
        "status": "active",
        "kind": "instance",
        "fhirVersion": "3.0.2",
        "format": ["json"],
        "instantiates": [
          "http://hl7.org/fhir/STU3/capabilitystatement.html"
        ]
      }
    }
  ]
}</textarea>
<div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
<div id="out" aria-live="polite"></div>
<div id="paid"><strong>Free here:</strong> Scan every FHIR JSON resource in the workspace and see each US Core profile gap on its own line, with the USCDI version that pin actually meets. <strong>In the editor:</strong> Export the whole workspace as one conformance report file - every resource, its profile pin and the USCDI v3 element it misses - to attach to a certification or customer audit. — that part asks for a licence key.</div>
<p class="note">Same engine as the VS Code extension, byte for byte.</p>
</div>
<script>var USCORE_RULES = [
  {"id": "uscore_v1_pin", "sev": "error", "msg": "Profile pinned to US Core 3.1.1 - that is the USCDI v1 element set. Certified health IT has had to carry USCDI v3 since 2026-01-01."},
  {"id": "uscore_v2_pin", "sev": "error", "msg": "Profile pinned to US Core 5.0.1 - that is the USCDI v2 element set. USCDI v3 needs US Core 6.1.0 or above."},
  {"id": "unpinned_profile", "sev": "warn", "msg": "US Core profile claimed with no |version. Nothing in this file proves which USCDI version you meet at test time."},
  {"id": "no_meta_profile", "sev": "error", "msg": "US Core resource type with no us-core profile in meta.profile. An unlabelled resource is not a conformance claim."},
  {"id": "pre_r4_url", "sev": "error", "msg": "DSTU2 or STU3 artefact in an R4 resource set. US Core 6.1.0 is FHIR R4 (4.0.1) only."},
  {"id": "legacy_terminology_url", "sev": "warn", "msg": "Legacy hl7.org/fhir/v2 or /v3 code system URL. R4 moved these to terminology.hl7.org/CodeSystem."},
  {"id": "missing_race_ethnicity", "sev": "error", "msg": "Patient carries no us-core-race and us-core-ethnicity extension. Race and ethnicity are required USCDI Patient Demographics elements."},
  {"id": "missing_sogi", "sev": "error", "msg": "Patient carries no us-core-genderIdentity extension. Gender identity is one of the elements USCDI v3 added over v2."},
  {"id": "capability_fhir_version", "sev": "error", "msg": "CapabilityStatement.fhirVersion is not 4.0.1, so the server advertises a version US Core 6.1.0 does not profile."},
  {"id": "no_last_updated", "sev": "warn", "msg": "meta block with no lastUpdated. Surveyors cannot date the resource against the 2026-01-01 USCDI v3 line."}
]
;</script>
<script>// US Core Profile Gap Check - one brain, used by the extension and by the web page.
const RULES = (typeof module !== 'undefined' && module.exports)
  ? require('./rules.json')
  : window.USCORE_RULES;

const RULE_COUNT = RULES.length;

// Resource types US Core 6.1.0 profiles and USCDI v3 expects to be labelled.
const US_CORE_TYPES = [
  'Patient', 'Encounter', 'Condition', 'Observation', 'AllergyIntolerance',
  'MedicationRequest', 'Immunization', 'Procedure', 'DiagnosticReport',
  'DocumentReference', 'CarePlan', 'CareTeam', 'Goal', 'Location',
  'Organization', 'Practitioner', 'Device', 'Coverage', 'ServiceRequest',
  'QuestionnaireResponse', 'RelatedPerson', 'Specimen', 'Provenance'
];

const USCDI_V3_FLOOR = '6.1.0';
const DEADLINE = '2026-01-01';

function msgOf(id) {
  const r = RULES.find(function (x) { return x.id === id; });
  return r ? r.msg : id;
}
function sevOf(id) {
  const r = RULES.find(function (x) { return x.id === id; });
  return r ? r.sev : 'warn';
}

function daysSince(from, today) {
  if (!today) return null;
  const a = Date.parse(from + 'T00:00:00Z');
  const b = Date.parse(today + 'T00:00:00Z');
  if (isNaN(a) || isNaN(b)) return null;
  return Math.round((b - a) / 86400000);
}

function check(text, opts) {
  opts = opts || {};
  const src = String(text == null ? '' : text);
  const lines = src.split(/\r?\n/);
  // Flattened copy: JSON is hard-wrapped by every formatter, so every
  // whole-document test runs against one space-normalised string.
  const flat = src.replace(/\s+/g, ' ');
  const findings = [];

  function lineOf(re) {
    for (let i = 0; i < lines.length; i++) {
      if (re.test(lines[i])) return i + 1;
    }
    return 1;
  }
  function push(id, line, extra) {
    findings.push({
      check: id,
      sev: sevOf(id),
      msg: extra ? msgOf(id) + ' ' + extra : msgOf(id),
      line: line || 1
    });
  }

  // 1 + 2 + 3: what version does each us-core profile claim actually pin?
  // Only meta.profile is a conformance claim - the same StructureDefinition URL
  // under an extension "url" is a definition reference and carries no version.
  const claimRe = /"profile"\s*:\s*(\[[\s\S]*?\]|"[^"]*")/g;
  const profileRe = /https?:\/\/hl7\.org\/fhir\/us\/core\/StructureDefinition\/([A-Za-z0-9-]+)(\|([0-9][0-9A-Za-z.\-]*))?/g;
  let m, sawProfile = false;
  while ((m = claimRe.exec(src)) !== null) {
    const block = m[1];
    const base = m.index + m[0].indexOf(block);
    let p;
    profileRe.lastIndex = 0;
    while ((p = profileRe.exec(block)) !== null) {
      sawProfile = true;
      const name = p[1];
      const ver = p[3];
      const at = src.slice(0, base + p.index).split(/\r?\n/).length;
      if (!ver) {
        push('unpinned_profile', at, '(' + name + ')');
      } else if (/^3\./.test(ver)) {
        push('uscore_v1_pin', at, '(' + name + '|' + ver + ' -> needs ' + USCDI_V3_FLOOR + ')');
      } else if (/^[45]\./.test(ver)) {
        push('uscore_v2_pin', at, '(' + name + '|' + ver + ' -> needs ' + USCDI_V3_FLOOR + ')');
      }
    }
  }

  // 4: a US Core resource type that never claims a us-core profile at all.
  const typeRe = /"resourceType"\s*:\s*"([A-Za-z]+)"/g;
  const seenTypes = [];
  while ((m = typeRe.exec(src)) !== null) {
    if (US_CORE_TYPES.indexOf(m[1]) !== -1 && seenTypes.indexOf(m[1]) === -1) {
      seenTypes.push(m[1]);
    }
  }
  if (seenTypes.length && !sawProfile) {
    push('no_meta_profile', lineOf(/"resourceType"/), '(' + seenTypes.join(', ') + ')');
  }

  // 5: pre-R4 artefacts.
  if (/hl7\.org\/fhir\/(STU3|DSTU2)\//.test(flat) || /"fhirVersion"\s*:\s*"[123]\./.test(flat)) {
    push('pre_r4_url', lineOf(/(STU3|DSTU2)|"fhirVersion"\s*:\s*"[123]\./));
  }

  // 6: terminology URLs R4 retired.
  if (/hl7\.org\/fhir\/v[23]\//.test(flat)) {
    push('legacy_terminology_url', lineOf(/hl7\.org\/fhir\/v[23]\//));
  }

  // 7 + 8: USCDI Patient Demographics, including the elements v3 added over v2.
  const hasPatient = /"resourceType"\s*:\s*"Patient"/.test(flat);
  if (hasPatient) {
    if (!/us-core-race/.test(flat) || !/us-core-ethnicity/.test(flat)) {
      push('missing_race_ethnicity', lineOf(/"resourceType"\s*:\s*"Patient"/));
    }
    if (!/us-core-genderIdentity/.test(flat)) {
      push('missing_sogi', lineOf(/"resourceType"\s*:\s*"Patient"/));
    }
  }

  // 9: the version the server advertises.
  if (/"resourceType"\s*:\s*"CapabilityStatement"/.test(flat)) {
    const fv = flat.match(/"fhirVersion"\s*:\s*"([^"]+)"/);
    if (!fv || fv[1] !== '4.0.1') {
      push('capability_fhir_version', lineOf(/"fhirVersion"/), '(found ' + (fv ? fv[1] : 'nothing') + ')');
    }
  }

  // 10: can a surveyor date this resource against the line?
  if (/"meta"\s*:/.test(flat) && !/"lastUpdated"\s*:/.test(flat)) {
    push('no_last_updated', lineOf(/"meta"\s*:/));
  }

  const since = daysSince(DEADLINE, opts.today);
  if (since !== null && findings.length) {
    findings.forEach(function (f) {
      if (f.sev === 'error' && !/day/.test(f.msg)) {
        f.msg = f.msg + ' USCDI v3 line passed ' + since + ' days ago.';
      }
    });
  }

  return { findings: findings };
}

const engine = { check: check };

if (typeof module !== 'undefined' && module.exports) {
  module.exports = { engine: engine, RULES: RULES, RULE_COUNT: RULE_COUNT };
}
if (typeof window !== 'undefined') {
  window.USCOREENGINE = { engine: engine, RULES: RULES, RULE_COUNT: RULE_COUNT };
}
</script>
<script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
'use strict';
function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); }
function summaryLine(res) {
  const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
  return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
}
function toText(res, label) {
  const f = (res && res.findings) || [];
  const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
  f.forEach(function (x) { lines.push('  ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + '  ' + (x.line ? 'L' + x.line + '  ' : '') + (x.check || x.id || '') + '  ' + (x.msg || x.message || '')); });
  return lines.join('\n');
}
function toHtml(res) {
  const f = (res && res.findings) || [];
  if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
  const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
  return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
}
var USCOREREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
if (typeof module !== 'undefined' && module.exports) module.exports = USCOREREPORT;
else window.USCOREREPORT = USCOREREPORT;
</script>
<script>
(function(){
  var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
  today.value=new Date().toISOString().slice(0,10);
  function run(){ try { var res=window.USCOREENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.USCOREREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
  go.onclick=run; if (src.value.trim()) run();
})();
</script>


<section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/uscore-profile-gap-lint" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'uscore-profile-gap-lint',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><a href="https://www.npmjs.com/package/@readystack/uscore-profile-gap-lint" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'uscore-profile-gap-lint',src:'npm',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://www.npmjs.com/package/@readystack/uscore-profile-gap-lint" rel="noopener" data-yj-install-door="mcp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'uscore-profile-gap-lint',src:'mcp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">MCP server (npx)</a><a href="https://hub.docker.com/r/getreadystack/uscore-profile-gap-lint" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'uscore-profile-gap-lint',src:'docker',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">npx @readystack/uscore-profile-gap-lint &lt;file&gt;
npx @readystack/uscore-profile-gap-lint --mcp
docker run --rm -v &quot;$PWD:/w&quot; getreadystack/uscore-profile-gap-lint /w</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/cl/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
<section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get the full rule table as a PDF</b><div style="opacity:.78;margin:.35rem 0 .8rem">All 10 rules US Core Profile Gap Check (USCDI v3) checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Email me the PDF</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">Sent. It arrives within the hour - check spam too.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"uscore-profile-gap-lint",lang:"en",source:"rule_table"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);})();</script></section>

<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">Finds the FHIR R4 resources still pinned to US Core 3.1.1 or 5.0.1, and the USCDI v3 Patient elements they never carried.</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">A US FHIR consultant averages $49.72/hour (ZipRecruiter, 31 July 2026); reading a resource set by hand takes hours.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_hiGlxcgqsijQYOSCbWd96m5roAeXS4jd5pGkt0elCAc" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
<!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script>

<div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div>
<script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>

<script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script>
<section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-18">Updated 2026-09-18</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-18","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku117700_result_card.jpg" alt="US Core Profile Gap Check (USCDI v3)" loading="lazy" style="max-width:100%;border-radius:6px"></p>
<p>A US Core Patient resource pinned to 3.1.1 is 260 days past the line, and the health IT developers shipping it in Boston, Nashville and Madison mostly do not know, because it validates clean.</p>
<p>That is the whole trap. Hand the official HL7 validator a resource whose meta.profile says us-core-patient|3.1.1 and it will tell you it is valid. It is - a valid USCDI v1 resource. Nobody asked it whether that profile is still the floor.</p>
<p>Since 2026-01-01 it is not. USCDI v3, at 45 CFR 170.213, is the data set certified health IT has to carry, and Health IT Modules seeking certification to criteria referencing that section had to be capable of exchanging it by 2025-12-31. USCDI v3 is not a cosmetic bump over v2 either: it brought in elements the earlier versions never had, among them gender identity and social determinants of health. A 3.1.1 pin is not one version behind. It is the USCDI v1 element set, two whole data sets back.</p>
<p>Stale pins keep appearing in new code for a reason. US Core 3.1.1 is the version most public FHIR examples on the internet were written against, so ask an assistant for a US Core Patient and 3.1.1 is what comes back: right shape, wrong version string. The one part nobody re-reads on review is the URL after the pipe.</p>
<p>US Core Profile Gap Check is a VS Code extension that reads the FHIR R4 JSON in your workspace and answers what the validator will not. It carries 10 rules. Two are the version pins: 3.1.1 as USCDI v1, 5.0.1 as USCDI v2, both resolved against a US Core 6.1.0 floor. One catches a US Core profile claimed with no version at all - the quieter failure, because nothing in the file then proves which USCDI version you meet on test day. One catches a US Core resource type with no us-core profile anywhere in it. Two catch pre-R4 wreckage: STU3 and DSTU2 artefacts, and retired v2 and v3 terminology URLs. Two read Patient demographics, looking for us-core-race with us-core-ethnicity, and for us-core-genderIdentity. One reads CapabilityStatement.fhirVersion and expects 4.0.1. The last flags a meta block with no lastUpdated, which a surveyor cannot date.</p>
<p>The numbers here are measured, not estimated. Two fixtures ship with the extension. The clean one holds a US Core 6.1.0 Patient with race, ethnicity and gender identity, a 6.1.0 Condition and a 4.0.1 CapabilityStatement: 0 findings. The dirty one is a Bundle of 4 resources exported from an older stack: 9 findings, 6 errors and 3 warnings, hitting 9 of the 10 rules. Both were scanned at today = 2026-09-18, which is how the report knows the line is 260 days back.</p>
<p>Getting the clean fixture to 0 took one real fix. A first pass treated every us-core StructureDefinition URL as a conformance claim, so the three extension URLs on a correct Patient - race, ethnicity, gender identity - came back as three unpinned profiles. Only meta.profile is a claim; a StructureDefinition URL under an extension url is a definition reference and carries no version. The scan now reads only the profile arrays, and the clean Bundle returns 0 instead of 3.</p>
<p>It recognises 23 US Core resource types, runs offline, and no PHI leaves the machine. The free tier finishes the job on screen: every gap, every resource, its own line, the USCDI version that pin actually meets. No key, no file cap, no watermark.</p>
<p>What a person costs for the same pass: a US FHIR consultant averages $49.72 an hour, with most between $24.28 and $62.50, on ZipRecruiter figures published 31 July 2026. Opening each resource and checking its pin against the US Core 6.1.0 element list is an afternoon on any repository a few years old.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku117700_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku117700_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does US Core Profile Gap Check actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads the FHIR R4 JSON files in your workspace and applies 10 rules. It flags meta.profile pins on US Core 3.1.1 (USCDI v1) and 5.0.1 (USCDI v2), profiles claimed with no version at all, pre-R4 STU3 and DSTU2 artefacts, retired v2 and v3 terminology URLs, Patient resources missing race, ethnicity or gender identity, and a CapabilityStatement whose fhirVersion is not 4.0.1.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is this for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Health IT developers and FHIR integration engineers at US EHR vendors, payers and digital health companies. If your product carries an ONC certification, or you are preparing a Health IT Module for testing, you are the reader. It recognises 23 US Core resource types, so it fits a working repository rather than a single sample file.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why will a free FHIR validator not catch this?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">The official HL7 validator checks a resource against whichever profile you hand it. Pin us-core-patient 3.1.1 and it will happily tell you the resource is valid, because it is valid against USCDI v1. Nothing in that run says the version you pinned stopped being the certification floor on 2026-01-01.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs the full version?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free finishes the job on screen: every gap in every resource, on its own line, with the USCDI version that pin meets. On the dirty sample shipped with the extension that is 9 findings, 6 of them errors. The full version exports the same scan as one conformance report file you can attach to a certification or a customer audit.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does it cost to do this by hand?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A US FHIR consultant averages $49.72 an hour and most earn between $24.28 and $62.50, according to ZipRecruiter figures published on 31 July 2026. Opening each resource, reading the profile pin and checking it against the US Core 6.1.0 element list is an afternoon on any real repository. The full version is $29 once.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask ChatGPT or another AI chat?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. US Core Profile Gap Check (USCDI v3) checks the file you open against 10 rules from a rule set dated 2026-09-20, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does US Core Profile Gap Check actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads the FHIR R4 JSON files in your workspace and applies 10 rules. It flags meta.profile pins on US Core 3.1.1 (USCDI v1) and 5.0.1 (USCDI v2), profiles claimed with no version at all, pre-R4 STU3 and DSTU2 artefacts, retired v2 and v3 terminology URLs, Patient resources missing race, ethnicity or gender identity, and a CapabilityStatement whose fhirVersion is not 4.0.1."}}, {"@type": "Question", "name": "Who is this for?", "acceptedAnswer": {"@type": "Answer", "text": "Health IT developers and FHIR integration engineers at US EHR vendors, payers and digital health companies. If your product carries an ONC certification, or you are preparing a Health IT Module for testing, you are the reader. It recognises 23 US Core resource types, so it fits a working repository rather than a single sample file."}}, {"@type": "Question", "name": "Why will a free FHIR validator not catch this?", "acceptedAnswer": {"@type": "Answer", "text": "The official HL7 validator checks a resource against whichever profile you hand it. Pin us-core-patient 3.1.1 and it will happily tell you the resource is valid, because it is valid against USCDI v1. Nothing in that run says the version you pinned stopped being the certification floor on 2026-01-01."}}, {"@type": "Question", "name": "What is free and what needs the full version?", "acceptedAnswer": {"@type": "Answer", "text": "Free finishes the job on screen: every gap in every resource, on its own line, with the USCDI version that pin meets. On the dirty sample shipped with the extension that is 9 findings, 6 of them errors. The full version exports the same scan as one conformance report file you can attach to a certification or a customer audit."}}, {"@type": "Question", "name": "What does it cost to do this by hand?", "acceptedAnswer": {"@type": "Answer", "text": "A US FHIR consultant averages $49.72 an hour and most earn between $24.28 and $62.50, according to ZipRecruiter figures published on 31 July 2026. Opening each resource, reading the profile pin and checking it against the US Core 6.1.0 element list is an afternoon on any real repository. The full version is $29 once."}}, {"@type": "Question", "name": "Why not just ask ChatGPT or another AI chat?", "acceptedAnswer": {"@type": "Answer", "text": "A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. US Core Profile Gap Check (USCDI v3) checks the file you open against 10 rules from a rule set dated 2026-09-20, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:117700,slug:"uscore-profile-gap-lint",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/cms-0057-api-gate"><span class="yj-rel-t">CMS-0057 API Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/dsa-terms-lint"><span class="yj-rel-t">DSA Terms Lint - EU Digital Services Act</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/eu-health-claim-lint"><span class="yj-rel-t">EU Health Claim Lint — Food &amp; Supplement Pages</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/hmrc-fraud-prevention-header-lint"><span class="yj-rel-t">HMRC Fraud Prevention Header Lint for Making Tax Digital (VAT and Income Tax)</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/play-declaration-gap-lint"><span class="yj-rel-t">Play Declaration Gap Lint (AndroidManifest)</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/crypto-1099da-basis-gap"><span class="yj-rel-t">1099-DA Basis Gap Checker (2026)</span><span class="yj-rel-p">$60</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body>
</html>