Spaces:
Sleeping
Sleeping
Commit History
-
0.7.9: Fix 7 bugs from adversarial test bench
Ran ~10 realistic notes through the live Space and read the outputs critically (not just the preloaded gallery). Found seven concrete bugs: 1. NEGATION SCOPE LEAKS ACROSS PERIODS "Sleep improved. No SI/HI.\n\nA/P:\n1. Major depressive disorder, ..." got filtered as negated because the 40-char prefix window swept in "No SI/HI." from the PRIOR sentence. Fix: NegationTemporalityClassifier._prefix_context() now stops at the last sentence-boundary character (. ! ? \n) before the span. 2. "OPIOID USE DISORDER" DROPPED AS HISTORICAL "history of opioid use disorder, in MAT for 18 months, stable" — active chronic management, should code. The whitelist had "opioid dependence" (old DSM-IV term) but not the current DSM-5 "use disorder" phrasing. Fix: add "alcohol use disorder", "opioid use disorder", "aud", "oud", plain "depression", and "depressive disorder" to the chronic historical whitelist. 3. HFrEF NOT RECOGNIZED "HFrEF EF 28%" in J_abbreviations test p…a1fe0a5 -
0.7.8: Revert to Qwen2.5-3B — 1.5B paraphrases too aggressively
1.5B on the same tightened prompt dropped 3-4 of 4 quotes as paraphrased (not byte-exact) vs 1 drop on 3B. Substring faithfulness is the invariant we cannot trade off — the 3-4x smaller latency isn't worth the MEAT coverage crater. Keep max_new_tokens=200 so the 3B doesn't ramble past the JSON close-brace. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1c6e396 -
0.7.7: Prompt — add null-Assess anti-example to prevent LLM inventing qualifiers
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>533e30b -
0.7.6: Qwen2.5-1.5B + shorter max_new_tokens + single-pass debug
Live T4 first-call latency was 55s on Qwen2.5-3B, which kills the demo. Switch to Qwen2.5-1.5B-Instruct (half the params, ~3x faster) and drop max_new_tokens from 384 to 200 — the MEAT JSON is ~80 tokens so 200 leaves comfortable headroom without letting the model ramble. Also fixed the /api/debug/pipeline endpoint: it was invoking the LLM TWICE per candidate (once for raw trace, once via pipeline.meat_extractor). On a slow first-call that meant >2min response. Now one LLM pass, and the debug response shows both the raw LLM output (with is_substring flag so we can see exactly which quotes got paraphrased) and the kept-after- substring-filter list. Dockerfile ENV updated to match. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>6008810 -
0.7.5: Debug endpoint shows raw LLM quotes + is_substring flag
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>207c2bb -
0.7.4: Crosswalk 16→55 HCCs + broadened NER/aliases + tightened LLM prompt
Crosswalk (data/reference/) - hcc_v28_labels.csv: 16 → 55 HCCs across Cancer (8/9/10/11/12), Metabolic (21/22/23), Mental (54–58), Neuro (70–79), Infection (1/2/6), Skin (157/158), Acute cardio/pulmonary (82/86/87), Status (176/189), Hematology (46/47), GI (33/34), Liver (36 added as separate from 35), Kidney (135 acute added). All RAF weights marked PLACEHOLDER. - hcc_v28_crosswalk.csv: 51 → 220 ICD-10 rows covering the new HCCs. - hcc_v28_hierarchy.csv: 11 → 38 trumping edges (cancer, liver, hematology, mental, spinal, ischemic-heart, skin, infection, metabolic, GI). - icd10_cm_descriptions.csv: 54 → 220 descriptions. Integrity: crosswalk HCCs all have labels; every ICD-10 has a description; hierarchy references only known HCCs. Verified via one-off Python check. NER vocab (DictionaryNER) - Added ~50 new surface-form groups: cancer (colon, lung, breast, prostate, melanoma, leukemia, lymphoma, myeloma, metastatic), malnutrition, morbid obesity, alcohol/opioid dependenc…79938b6 -
0.7.3: Smarter empty-state copy for No-HCCs-suggested
Charles tested four real-ish notes; three of four produced no HCCs (fracture, AFib captured HCC-96 correctly, GI bleed, COPD captured HCC-111 correctly). The prior "check filtered-mentions below" copy was unhelpful when there were no filtered mentions either — the note simply had no HCC-codable diagnoses. New empty state branches on result.filtered_mentions: * Non-empty → "conditions were filtered; expand the panel below" (old behavior). * Empty → "this note has no diagnoses in the CMS-HCC v28 payment model (acute fractures / acute bleeds / many surgical scenarios are not HCC-codable), or the NER missed a surface form. v28 covers ~115 chronic-condition HCCs — it is not a general clinical coder." This is the line a recruiter or clinician reads when they throw their first "realistic" note at the demo and are surprised to see zero captures. Framing it as model-scope rather than pipeline-failure matches the actual cod…5278b6c -
0.7.2: Debug endpoint reports extractor chain + LLM try_extract result
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>d252dab -
0.7.1: Add missing try_extract on LLMMEATExtractor
Live-Space debugging revealed the LLM path was never running — every /api/code call took ~10ms (rule-based speed) even with meat_llm_ready=true. Root cause: CompositeMEATExtractor uses getattr(self.primary, "try_extract", None) to pick between "LLM unavailable → fall back" (None) and "LLM ran, honor result" (list, possibly empty). The previous LLMMEATExtractor had only a __call__ that returned [] in both cases — indistinguishable to the Composite — so getattr returned None and the Composite always fell through to the rule-based path. Fix: split the logic into: * try_extract(note, cand) -> list | None : None ⇒ fall back, list ⇒ honor. * __call__(note, cand) -> list : thin wrapper for callers that don't care about the distinction. Also added INFO-level logging around the LLM invocation so the HF run logs now show: * try_extract: invoking LLM for HCC-X (label) * try_extract: LLM returned in NNNms for HCC-X * try_extract…7a451d2 -
Milestone 0.7.0: LLM MEAT extractor (Qwen/Qwen2.5-3B-Instruct + T4)
Replaces the rule-based MEAT matcher (which couldn't follow implicit references like "Continue metformin" → TREAT-for-DM) with a small instruction-tuned LLM producing structured JSON. Component I's byte-exact substring guarantee still enforces faithfulness downstream. New - app/pipeline/components/f_meat_llm.py::LLMMEATExtractor * Lazy transformers import; CPU-only installs unaffected. * Chat-formatted prompt asking for {"M","E","A","T"} with verbatim quotes or null. * Balanced-JSON parser over the model output. * try_extract() returns None when unavailable / empty list when the LLM saw no MEAT — Composite uses the distinction. Changed - f_meat.py adds CompositeMEATExtractor and a HCC_MEAT_EXTRACTOR_BACKEND env selector. CompositeMEATExtractor only falls back to rule-based when the primary (LLM) is genuinely unavailable; empty LLM output is trusted ("LLM saw no MEAT") to avoid rule-based false positives. - app/api/server.py lifespan spawns a background thread fo…5eed8db -
0.6.8: /api/debug/pipeline for live MEAT-coverage diagnosis
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>42e3031 -
0.6.7: Fix MEAT fallback for inline-header notes
Live Space smoke test revealed HCC-18 coming back with MEAT coverage = 0 and risk HIGH on a simple note: "A/P: Type 2 diabetes mellitus with diabetic polyneuropathy. ..." Root cause: the segmenter places the A/P section body at offset 5 (after "A/P: "), but the sole sentence that mentions the condition starts at offset 0. The MEAT ASSESS fallback rejected the sentence with `start < section.start or end > section.end` — i.e., it required full containment. Switch the containment check to an overlap check: skip only sentences with ZERO overlap with the section. Inline-header sentences now fall through the fallback and get a (weak) ASSESS evidence item, which is the behavior the CHF-insufficient-MEAT fixture also depends on implicitly. Risk score for the live DM2 case moves from 0.4185 (HIGH) to ~0.52 (MEDIUM), matching coder intuition that a note with treatment + a labeled diagnosis isn't outright audit-risk — it's "needs query" at worst. Added tests/test_clinical_outputs.py::tes…16d1f7c -
0.6.6: Dockerfile — install git + ca-certificates
HF Space build log after UI succeeded: --> RUN git config --global user.email "charlesyapai@users.noreply.huggingface.co" /bin/sh: 1: git: not found ERROR: exit code: 127 HF wraps user Dockerfiles with a `git config` step (for attribution / Space-studio integration) that presumes git is present. python:3.11-slim doesn't include it. Add git + ca-certificates to the apt-get install. libgomp1 stays for sklearn. ~15 MB added to the image; worth it for not failing on a layer we don't control. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>09e122a -
0.6.5: Fault-tolerant startup + route guards + /api/status errors
If reference CSVs are missing, the pipeline fails to import, or gallery prewarm raises, the prior lifespan would crash uvicorn and HF would return a 502 with no diagnostic path. Now each of the three startup steps (pipeline build, gallery prime, metrics snapshot) is wrapped independently — failures are logged with full tracebacks and recorded to app.state.startup_errors. /api/status surfaces the error dict so the UI banner can show exactly which facet failed. Route guards: POST /api/code and POST /api/benchmark return 503 with a pointer to /api/status when the pipeline is None, instead of crashing on AttributeError. UI: ServerStatus interface gains optional startup_errors: Record<string, string>. Tests: test_api.py adds a positive assertion that /api/status reports "ok" with the local reference data. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>14a3550 -
0.6.4: /api/status diagnostic + StatusBanner + remove unused NotePanel prop
Runtime diagnostic - GET /api/status returns pipeline_ready, reference_counts (hcc_labels + hcc_crosswalk_icd10), gallery_size, metrics_available. Status is "ok" if everything loaded, else "degraded" with the failing facets exposed. - ui/src/components/StatusBanner.tsx renders ONLY on degraded state — rose-colored, calls out which facet is missing, points at the HF build logs. Normal OK status stays silent to avoid banner competition with the amber research-demo disclaimer. - App.tsx fetches /api/status on load alongside gallery + metrics. Cleanup - NotePanel.Props no longer declares a `result: CodingResult | null` prop it never read. App stops passing it. Strict TS stays clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>d0ec498 -
0.6.3: CI ui-build — npm install instead of npm ci
The CI workflow's ui-build job used `npm ci` with a `cache-dependency-path: ui/package-lock.json`, but we don't ship a lock file (matching the HF Docker build, which also uses `npm install`). The job would fail on every push until a lock was committed. Switch to `npm install --no-audit --no-fund` to match the Docker stage's install step. This trades reproducibility (same versions on every run) for parity with the HF build — the Docker image is what actually deploys, so CI should validate the same install path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>37d7dce -
0.6.2: Switch build script from tsc -b to tsc
With project references removed in 0.6.1, tsc -b can emit TS6305-style "output not built" errors on some toolchains because the composite-build state machine expects tsbuildinfo / output files. Plain tsc just type-checks against tsconfig.json (noEmit: true) and moves on. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>245eb98 -
0.6.1: Fix HF Docker build — TypeScript config
The HF Space Docker build failed during `npm run build` with three TS errors (TS2307 node:path, TS2304 __dirname, TS6310 referenced project may not disable emit). Root cause: tsconfig.json referenced tsconfig.node.json as a project, but the node config had noEmit: true — composite projects must emit. And vite.config.ts used Node APIs without @types/node. Fix: - Remove the project reference from ui/tsconfig.json. Vite loads vite.config.ts at runtime via esbuild; it doesn't need to be part of the tsc -b build graph. - Keep tsconfig.node.json as a standalone config (no longer referenced) with noEmit: true + types: ["node"] so future type-checking of the vite config works if re-enabled. - Add @types/node to devDependencies so Node globals resolve when vite.config.ts is type-checked. Verified locally: `tsc -b` now only processes src/ (24 TS files); vite build runs on the untyped config via esbuild. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>00094a7 -
0.6.0: Dark mode
Foundation - tailwind.config.ts: darkMode: "class". - ui/src/lib/useTheme.ts: class-strategy toggle with localStorage persistence, prefers-color-scheme fallback on first load, cross-tab sync via storage events. - ui/src/components/ThemeToggle.tsx: header toggle button (Sun/Moon icon). UI sweep — every rendered surface now has a dark: variant: - App shell: header, footer, main background, kbd hints. - TabBar, DisclaimerBanner. - NotePanel (including textarea + highlight preview + gallery select). - HCCList (rows, skeleton, copy/query pills, MEAT dots). - DrillIn (MEAT rows with category bars, risk reasons + component weights, supporting-ICD list, copyable codes). - RAFSummary (three tinted cards + totals footer). - FilteredMentionsPanel (collapsible; struck-through spans retain contrast). - SpecificityHints (amber callout + hint rows). - QueryModal (backdrop, headers, markdown pre block, Copy button). - WelcomeModal (gradient header, body bullets, amber disclaimer, footer kbd…9ce893e -
0.5.4: End-to-end smoke test script
scripts/smoke_test.py runs against a live API, walks every gallery note through POST /api/code, checks: * S1 (faithfulness): every MEAT quote is a byte-exact substring of the input note. Any fabrication fails the script. * S2 (latency): p95 API latency against the 8s target. Also cross-checks /api/benchmark against the per-note pass. Prints a per-case table + latency rollup + a pass/fail report card. Exits non-zero on any invariant violation — suitable as a pre-push gate. Makefile: `make smoke` target. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>e8bfb8b -
0.5.3: Print stylesheet + Print button
CSS @media print strips interactive chrome (tabs, footer, buttons, keyboard-shortcut cheatsheet) and lays out the coding view as a clean audit-summary paper output. Textareas and highlighted spans retain their color via print-color-adjust so MEAT highlights survive black-and-white mental models. UI additions: - .no-print / .print-only utility classes for selective visibility. - print-container class marks the root for print-specific padding. - Printer button next to CSV in the RAFSummary header invokes window.print(); users save as PDF via browser dialog. - print-only header under the page header shows note_id + timestamp so paper copies are dated and traceable. - Tab bar + footer kept for screen, replaced with a compact print-only footer (pipeline version + verifier drops). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>17c1232 -
0.5.2: Specificity hints
Pipeline: new components/specificity.py emits SpecificityHint objects when the note contains a keyword pointing to a higher-specificity HCC that the pipeline didn't capture. Conservative rule set: diabetic complication keywords (neuropathy / nephropathy / retinopathy / polyneuropathy / ketoacidosis / hyperosmolarity), dialysis/hemodialysis, cirrhosis, and pulmonary-fibrosis signals. Rules: * Fires only when the less-specific HCC is ACCEPTED (not trumped). * Never fires if the suggested HCC is already anywhere in the candidate list — trumping already communicates that case. * Advisory only: the coder owns the upgrade decision. The suspect list is not modified. Types: SpecificityHint added to pydantic types and TS types. CodingResult now carries specificity_hints: list[SpecificityHint]. UI: SpecificityHintsPanel renders below the suspect list when hints are present — amber callout with one row per hint showing current → suggested with a lucide arrow, trigger keyword, and…9caee33 -
0.5.1: Submit-list CSV export
Client-side Blob download of the current result as a CSV a coder's scrubber can consume. Fields: status, hcc, label, icd10_codes, raf_weight, confidence, risk_level, query_needed, meat_M/E/A/T, risk_reasons, trumped_by. Trumped candidates are included with status="trumped" so the full reasoning chain is auditable downstream. Download button lives next to the RAFSummary header where the coder already reads the summary. Filename stamps the note_id + ISO timestamp. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>35a7f1a -
Milestone 0.5.0: clinical UX pass (chart-query, RAF summary, filtered mentions, glossary)
Pipeline - Chart-query generator: every HCCCandidate gets query_draft (markdown the coder pastes into their provider-query tool) when any MEAT category is insufficient. None when MEAT is complete. - CodingResult.filtered_mentions: expose every span the pipeline saw but did not attribute, with a FilterReason (negated / family_history / historical_non_chronic / hypothetical). Gives the coder a reassurance surface that the filter didn't overreach. - New helper functions: CodingResult.captured_raf / low_risk_raf / audit_exposure_raf for the RAF summary card. UI - RAFSummary hero card: three tiles (Submit as-is / After query / Audit exposure) with RAF sums + candidate counts. Externalizes the coder's mental model into a single-screen glance. - FilteredMentionsPanel: collapsible, groups dropped spans by reason, shows surface text + section kind + plain-English explanation per bucket. - RiskBadge: color-coded with lucide icons (CheckCircle2 / AlertTriangle / AlertOctagon …af68ac3 -
HF Space: fix frontmatter (colorTo=green, short_description <= 60 chars)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>6b288d5 -
Merge HF Space init commit (preserves .gitattributes)
# Conflicts: # README.md8b15da7 -
HF Space: add README frontmatter + token-safe push helpers
- README.md: add the HF Docker Space frontmatter block (title, colors, SDK, app_port, license) required for the Space to render correctly. - scripts/_hf_askpass.sh: GIT_ASKPASS helper that answers git credential prompts by reading .hf_access_token (gitignored). The token never lands in a command-line argument, a remote URL, or a config file. - scripts/push_to_hf.sh: wrapper around git push that wires the askpass helper, disables interactive prompts, and accepts --force for one-off overwrites. Refuses to run if the token file is missing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>23f3028 -
Milestone 0.4.0: narrative + polish (blog, demo script, keybinds, calibrator fit)
Narrative - docs/BLOG_DRAFT.md — clinical-workflow framing first, ML second. Opens on RADV audits; pitches calibrated + auditable over SOTA F1. - docs/DEMO_SCRIPT.md — 75-second shot-by-shot demo video script with narration, UI actions, and recording hygiene notes. UI polish - ui/src/lib/useKeybinds.ts + App.tsx wiring: ⌘/Ctrl + Enter codes the note; j / ↓ and k / ↑ navigate the HCC suspect list. Disabled while focus is in an editable control. - HCCList now shows a three-row animated pulse skeleton while loading, an informative empty-state explaining negation/family-history/historical filtering, and a pre-run state pointing at the keyboard shortcut. - Footer surfaces verifier_drops alongside latency — S1 is visible per run. - Header shows the keybinding cheatsheet on md+ screens. Calibrator - g_calibrator.default_calibrator() now loads data/models/calibrator.pkl if present (overridable via HCC_MEAT_CALIBRATOR_PATH). Identity fallback unchanged. - scripts/fit_calibrato…6fc49c1 -
Milestone 0.3.0: coder-voiced README, benchmark button, NER feature flag, CMS fetcher
README - Opening rewritten in coder vocabulary (suspect list / capture / MEAT / RADV risk / hierarchy trumping). Targets the S4 30-second recruiter skim. Benchmark endpoint + UI - POST /api/benchmark re-runs every gallery item live and returns min/median/p95/max/mean ms + per-case timings. Surfaces the S2 target (8000 ms p95 on CPU free tier) explicitly. - MetricsTab now has a "Run gallery benchmark" button with a red/green p95 card and a collapsible per-case breakdown. NER backend feature flag - New TransformersNER wrapper around the HF token-classification pipeline with lazy import + label normalization onto SpanType. - default_ner() reads HCC_MEAT_NER_BACKEND (dictionary|transformers) and HCC_MEAT_NER_MODEL (default blaze999/Medical-NER). - test_ner_backend_selection.py asserts selector behavior without importing transformers when the env var is unset — keeps CI lean. CMS fetcher - scripts/fetch_cms_hcc_v28.py now has two subcommands: inspect — download the CMS …e43bca6 -
Milestone 0.2.1: API + linker tests, real eval subcommands, SOAP headers
- tests/test_api.py — FastAPI integration tests via Starlette TestClient covering /api/healthz, /api/code, /api/gallery, /api/metrics, /api/reference/hcc, and input validation on empty notes. - tests/test_linker.py — coverage for ExactMatchLinker (aliases, exact descriptions, misses) and TFIDFLinker (alias preference, paraphrase retrieval, span-type filter). - eval_harness/cli.py subgroups + calibration: replace stubs with real implementations that reuse app.api.metrics.snapshot() so the CLI and the UI report from the same source. - Segmenter: accept SOAP-style single-letter headers (S / O / A / P). The existing multi-letter patterns take precedence when both would match. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>867a3e1 -
Milestone 0.2.0: metrics tabs, TF-IDF linker, 25-case fixture, Synthea scaffold
UI - Add Metrics / Calibration / Subgroups / About tabs alongside the existing three-panel Coding view. - Wire a TabBar so switching tabs doesn't rerun the pipeline. API - New GET /api/metrics returning a snapshot computed against the regression fixture at startup. Shape is frozen for the UI contract. Pipeline - New TFIDFLinker — sklearn char-ngram TF-IDF over ICD-10 descriptions with an alias fast-path and exact-description shortcut. Now the default; the prior ExactMatchLinker stays available for lean runs. - Introduce a Linker Protocol in d_linker and drop the concrete dep on ExactMatchLinker from the orchestrator. Fixtures - Expand regression_suite.json from 10 → 25 cases: paroxysmal AF, unstable angina, hepatitis-C + cirrhosis trumping, PVD, COPD exacerbation, lowercase + typo'd notes, resolved acute, three-level kidney hierarchy, rare HCC-48, systolic-CHF specificity, pulmonary fibrosis, hypothetical workup, long multi-specialty prose, and an empty-note edge c…cd5b31c -
Tighten MEAT extractor candidate-mention matcher
The prior _mentions_candidate fired on any label token with len > 3, which includes function words like "with" that appear in many HCC labels — giving false-positive MEAT matches on unrelated sentences. New matcher: 1. Primary: the NER-grounded condition surface text (so "DM2" matches). 2. Fallback: distinctive label tokens (len >= 5, stoplist-filtered). 3. Final: distinctive tokens from supporting ICD-10 descriptions (len >= 6). Also log the HF Space remote URL (charlesyapai/hcc-meat-coder) in the BUILD_LOG backlog and add repository_git_clone.txt to .gitignore as local scratch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>78549ab -
Review pass: fix imports, broaden NER vocab, segmenter inline headers
- Segmenter now accepts inline content after a header (e.g., "HPI: 67yo..."). The previous regex required headers to be on their own line, which broke several fixture notes. - Expand DictionaryNER vocabulary so the Week-1 baseline recognizes "DM2", "diabetic polyneuropathy", "CKD stage 4 (severe)", "hemodialysis", "end stage renal disease", etc. Regex still word-boundary-bounded. - Add alias entries in ExactMatchLinker for hemodialysis, renal dialysis, and "dependence on renal dialysis" (all → Z99.2). Makes the dialysis-trumping fixture resolvable without the embedding linker. - Move fixture schema + loader from tests/fixtures/schema.py to eval_harness/fixtures.py (canonical location). Tests re-export from the old path for backwards compatibility. Eval CLI no longer depends on tests/ being on sys.path. - Add root conftest.py so pytest resolves app/eval_harness/tests regardless of invocation cwd. - Replace the `raise typer.Exit(1)` stub in scripts/fetch_cms_hcc_v28.p…4855547 -
Initial scaffold: HCC-MEAT Coder v0.1.0
End-to-end runnable pipeline with rule-based baselines in place of ML components, a FastAPI backend serving a React three-panel UI, and a 10-case regression suite guarding the invariants from AGENT_BRIEF.md §3 (faithfulness, negation/family-history filtering, hierarchy trumping, transparent risk). Deterministic components (real, tested): - E — HCC crosswalk + trumping over CMS-HCC v28 seed tables - H — over-coding (RADV) risk heuristic with named components + reasons - I — faithfulness verifier (substring guarantee + NLI hook) Baseline / swappable components: - A segmenter, B dictionary NER, C negation, D exact/alias linker, F rule-based MEAT extractor, G identity calibrator Infra: uv-driven pyproject, ruff + pytest + pre-commit, GH Actions CI for Python and UI, multi-stage Dockerfile for the HF Docker Space, typer CLIs for pipeline (`hcc-meat`) and evaluation (`hcc-meat-eval`). Reference data in data/reference/ uses PLACEHOLDER RAF weights; hydrate via scripts/fetch_cms_hcc_v28.…c6cfe5f -
initial commit
Verified signaturea6f6337