Skip to content

32 Slice Endpoint Adverse Event Identity

Pipeline Slice: Endpoint / Adverse-Event Identity Spine

Section titled “Pipeline Slice: Endpoint / Adverse-Event Identity Spine”

Status: SHARP CORE VERTICAL. Versioned endpoint and NCI CTCAE capture now runs source -> normalized -> evidence -> canonical -> four provenance-backed q_* models. The remaining work is coverage expansion and downstream mention resolution, not an unowned source population gap. Denoising state: sharp (noise -> rough -> sharp -> converged) Updated: 2026-07-23

This spine owns the shared identities for:

  • what was measured: clinical endpoints such as OS, PFS, ORR, and DoR;
  • what harm was observed: standardized adverse-event terms such as anemia or pneumonitis;
  • how aggregate severity was reported: explicit CTCAE grade bands.

Trials, publications, and standard-of-care evidence resolve into these identities. They continue to own their result values, groups, denominators, seriousness fields, and source text.

Legacy Data Gov established the useful product intent through endpoints, endpoint_groups, and adverse_events. Greenfield preserves that intent while correcting two legacy accidents:

  1. an adverse-event term does not inherently belong to one endpoint;
  2. regulatory seriousness is not a CTCAE severity grade.

The second distinction is explicit in FDA/ICH safety guidance: severe describes intensity, while serious is determined by outcomes or required action. CTCAE independently defines Grades 1-5 as term-specific severity. Sources: FDA serious adverse events, ICH E2A guidance, and NCI CTCAE v6.

flowchart LR
  EndpointSource["Versioned internal endpoint catalog"]
  CtcaeSource["Official NCI CTCAE v6 workbook"]
  Artifacts["Immutable source artifacts + active capture pointers"]
  Normalized["Typed source-faithful records"]
  Evidence["Endpoint identity + AE term claims"]
  Canonical["Endpoints + groups + AE terms + grade bands"]
  Names["Shared exact-name projection"]
  Query["q_endpoints / q_endpoint_groups / q_adverse_event_terms / q_ae_grade_vocabulary"]
  Demand["Trial / publication / SOC mentions"]
  Review["Verifier or reviewed curation"]

  EndpointSource --> Artifacts
  CtcaeSource --> Artifacts
  Artifacts --> Normalized --> Evidence --> Canonical --> Names
  Canonical --> Query
  Demand --> Names
  Names --> Review
  Review --> Canonical

Authoritative catalog rows do not need an artificial fuzzy-resolution asset before publication. They create source-grounded identity claims directly. Fuzzy downstream mentions remain reviewable signals and never auto-link.

SourceCaptured artifactCompletenessRole
Bioloupe endpoint catalogchecked-in versioned JSON with definitions, synonyms, taxonomy, and referencescomplete for its declared release; currently 15 common oncology endpointsauthoritative initial endpoint identity catalog
NCI CTCAE v6.0 / MedDRA 28.0exact official XLSX bytes plus parsed clean-copy rowslive mode captures the full workbook unless max_live_records explicitly requests a bounded smokeauthoritative CTCAE term names, LLT codes, SOCs, definitions, and five term-specific grade slots
CTCAE fixturechecked-in representative JSON subsetdeliberately incomplete; 9 rowsdeterministic offline development and CI
Result-bearing slicessource endpoint/AE phrasessource-specificidentity demand only; they do not mint endpoint or AE identity
Independent MedDRA productnot capturedlicensing decision pendingoptional future PT/hierarchy enrichment; CTCAE-carried LLT fields remain source-faithful

The official CTCAE download is owned by NCI: CTCAE and AE reporting.

ClinicalVocabularySourceResource owns:

  • mode = fixture | live;
  • the official CTCAE workbook URL;
  • max_live_records, which applies only to bounded live smoke;
  • the nested shared source_http resource.

The Dagster source asset never branches on an environment flag. Default definitions stay offline. Live mode is launch-time run configuration.

sources_clinical_vocabulary.catalog_artifacts stores content-addressed exact bytes and never updates them. active_capture_artifacts is a small operational pointer to the exact endpoint and CTCAE artifacts selected by the latest successful capture.

This separation is intentional:

  • artifact history is immutable and replayable;
  • switching fixture -> live -> fixture changes current selection correctly;
  • a bounded smoke cannot become current merely because its artifact timestamp is newest;
  • downstream canonical publication never guesses current state from fetched_at.
ConceptGrainStable key / fieldsOwnership
Endpointone canonical clinical endpointcanonical_endpoint_key, name, abbreviation, definition, referencesthis spine
Endpoint groupone taxonomy root or subgroupcanonical_group_key, parent groupthis spine
Endpoint aliasone phrase resolving to one endpointnormalized phrase + alias kindthis spine
Adverse-event termone CTCAE-compatible term identityresolved_ae_term_key, CTCAE release, MedDRA LLT code/SOC, definitionthis spine
Term-specific grade definitionsfive nullable CTCAE descriptions on one AE termgrade 1 through 5 arraythis spine
Aggregate grade bandone closed range over CTCAE grades 1-5category + inclusive minimum/maximumthis spine
Seriousnesssource/regulatory classification of an observed eventserious/non-serious and outcome criteriaowning result slice, not this vocabulary
Safety observationone source result group + AE term + count/denominatortrial/publication-specific keytrials/publications, not this spine
CategoryMinimumMaximum
all_grade15
grade_1_212
grade_3_434
grade_gte335
grade_5_fatal55

sae is intentionally absent. Unknown grade phrases remain null. A caller must model seriousness separately rather than coercing serious into a grade.

  • endpoint identity is separate from endpoint result values;
  • adverse-event term identity is separate from endpoint identity, observation grade, and seriousness;
  • every published endpoint and AE term traces to the active immutable source artifact and its deterministic extraction claim;
  • CTCAE grade definitions remain term-specific; unavailable grades remain null array elements;
  • every grade band has 1 <= minimum_grade <= maximum_grade <= 5;
  • exact names and aliases may auto-link; fuzzy matches route to review;
  • generic descriptors such as primary endpoint are rejected as identities;
  • ambiguous OR never silently becomes ORR;
  • retired catalog rows become deprecated instead of leaking into current q_* views;
  • source history remains append-only even when current canonical publication changes.
SubjectAccepted automatic basisOtherwise
endpoint_linkexact canonical name, abbreviation, or synonymverifier/review; ambiguous and fuzzy mentions do not auto-link
adverse_event_term_linkexact standardized name, source code, or reviewed synonymverifier/review
ae_grade_assignmentdeterministic phrase mapping to one closed grade bandnull plus review when material
ae_seriousness_assignmentexplicit source seriousness field or outcome criteriaremains in the owning observation slice

Useful reviewed curation subjects are endpoint remap/merge/split, AE-term remap, and grade-band correction. Curation is an append-only overlay; it does not mutate source artifacts or hide inside catalog extraction.

LayerAssetDurable output
sourcessources/clinical_vocabulary/catalog_snapshotsexact artifact bytes, typed rows, active capture pointers, source-artifact receipts
normalizednormalized/clinical_vocabulary_recordsendpoint and CTCAE source-faithful records
evidenceevidence/clinical_vocabulary_claimsdeterministic endpoint identity and AE-term claims plus extraction runs
canonicalcanonical/endpoint_adverse_event_tablescanonical DDL and five grade bands
canonicalcanonical/clinical_vocabulary_catalogselected endpoints, groups, aliases, AE terms, provenance links
canonicalcanonical/endpoint_adverse_event_entity_namesthis spine’s exact-name/alias projection
queryfour q_* assetsstable SQL-only consumer surface

The old resolution/endpoint_adverse_event_candidates definition was deleted because it only created an empty buffer and performed no resolution. The remaining resolution module contains tested policy functions; a Dagster asset should return only when real downstream mention demand exists.

ModelGrainKeyPurpose
q_endpointsone published endpointcanonical_endpoint_keynames, definitions, aliases, taxonomy, references
q_endpoint_groupsone published taxonomy nodecanonical_group_keyhierarchical endpoint navigation
q_adverse_event_termsone published AE termresolved_ae_term_keyCTCAE/MedDRA-carried term identity and term-specific grade definitions
q_ae_grade_vocabularyone aggregate grade bandgrade_categoryclosed min/max grade ranges; no seriousness conflation

All four contracts require schema_contract, provenance_coverage, and positive-row checks. Published rows carry a provenance_key that resolves through the shared provenance ledger.

The slice’s deterministic suite proves:

  • fixture and mocked-live resource behavior without external calls;
  • exact workbook parsing and preservation of five grade slots;
  • explicit fixture incompleteness versus complete live semantics;
  • all source/normalized/evidence/canonical/query asset keys;
  • absence of the deleted no-op resolution asset;
  • contract vocabulary and grade bounds;
  • idempotent DDL upgrades from an older local schema;
  • real Postgres source-to-query materialization;
  • a second identical materialization preserves row and provenance counts.

No paid LLM call is required to build or test this spine.

  1. Expand the reviewed endpoint catalog beyond the initial high-value set while keeping each definition and synonym source-referenced.
  2. Add demand-driven trial/publication/SOC endpoint and AE-term link assets when those slices publish real unresolved mention queues.
  3. Decide whether licensed MedDRA PT/hierarchy enrichment adds enough value beyond CTCAE-carried LLT identity.
  4. Add corpus-level referential checks once downstream slices emit resolved_ae_term_key.

These are explicit coverage/integration frontiers. The core vocabulary capture and publication path is implemented.