Add cte-plan-fixture.json, cte-result-fixture.json, and phase-summary-fixture.json — realistic Italian-language payloads for the cardiology DWH replay session, conforming exactly to contracts.md (A/B/C). Add augment-review-gates.mjs (pattern of augment-schema-linking.mjs): finds the F6 cte_plan gate, first CTE 1 cte_result gate, and Fase 5 phase-summary gate by title regex and swaps in the v2 artifact.data, so CtePlanViewer, CteResultViewer, and PhaseSummaryViewer render in the offline replay. Idempotent; exits 1 if an expected gate is missing. Document the augment scripts and re-extract note in tools/replay/README.md.
97 lines
4.8 KiB
JSON
97 lines
4.8 KiB
JSON
{
|
|
"schema_version": 2,
|
|
"question": "Lista dei pazienti che, negli ultimi 15 anni, hanno avuto un'ablazione transcatetere seguita da un impianto di defibrillatore (ICD) entro 10 anni.",
|
|
"strategy": "Catena di 4 CTE: prima isolo le ablazioni transcatetere e gli impianti ICD separatamente (con le rispettive finestre temporali), poi li unisco per paziente mantenendo solo le coppie in cui l'impianto segue l'ablazione entro 10 anni, infine riduco a una riga per paziente scegliendo la prima coppia qualificante.",
|
|
"ctes": [
|
|
{
|
|
"name": "ablazioni_recenti",
|
|
"index": 1,
|
|
"purpose": "Ablazioni transcatetere (ablazione_transcatetere IS TRUE) con data ∈ [2011-07-03, 2026-07-03].",
|
|
"rationale": "Punto di partenza della catena: isola l'evento indice (ablazione) prima di cercare l'impianto conseguente.",
|
|
"depends_on": [],
|
|
"tables": [
|
|
{
|
|
"name": "fact_studio_elettrofisiologico_endocavitario_ablazione",
|
|
"description": "Fatto clinico derivato da cr_seeablazione relativo a eventi, procedure o rilevazioni del paziente. Esclude record riclassificati come cardioversione o chiusura auricola."
|
|
}
|
|
],
|
|
"keys": ["cod_paz", "num"],
|
|
"filters": [
|
|
{
|
|
"column": "fact_studio_elettrofisiologico_endocavitario_ablazione.ablazione_transcatetere",
|
|
"op": "IS",
|
|
"value": "TRUE",
|
|
"description": "Indicazione di ablazione transcatetere derivata dal text analysis sul campo conclusioni (sovrascrive il flag Cardioref).",
|
|
"rationale": "Filtra solo le procedure di ablazione transcatetere richieste dalla domanda, escludendo altre tipologie di intervento."
|
|
},
|
|
{
|
|
"column": "fact_studio_elettrofisiologico_endocavitario_ablazione.data_ablazione",
|
|
"op": "BETWEEN",
|
|
"value": "2011-07-03 AND 2026-07-03",
|
|
"description": "Data di esecuzione della procedura di ablazione.",
|
|
"rationale": "Finestra degli «ultimi 15 anni» calcolata rispetto alla data corrente della domanda."
|
|
}
|
|
],
|
|
"output_columns": ["cod_paz", "num", "data_ablazione"]
|
|
},
|
|
{
|
|
"name": "impianti_icd",
|
|
"index": 2,
|
|
"purpose": "Impianti ICD iniziali con data.",
|
|
"rationale": "Secondo evento della catena: individua gli impianti candidati che potrebbero seguire un'ablazione già isolata in ablazioni_recenti.",
|
|
"depends_on": [],
|
|
"tables": [
|
|
{
|
|
"name": "fact_impianto_defibrillatore_impiantabile",
|
|
"description": "Fact table degli impianti di defibrillatori (ICD). Esclude record riclassificati come CRT-P/CRT-D/S-ICD dal classificatore CIED."
|
|
}
|
|
],
|
|
"keys": ["cod_paz", "num"],
|
|
"filters": [],
|
|
"output_columns": ["cod_paz", "num", "data_impianto"]
|
|
},
|
|
{
|
|
"name": "sequenze_abl_imp",
|
|
"index": 3,
|
|
"purpose": "Join su cod_paz tra ablazioni_recenti e impianti_icd, mantiene le coppie con data_impianto > data_ablazione E <= data_ablazione + 10 anni.",
|
|
"rationale": "Applica il vincolo temporale «entro 10 anni» richiesto dalla domanda, collegando ablazione e impianto per lo stesso paziente.",
|
|
"depends_on": ["ablazioni_recenti", "impianti_icd"],
|
|
"tables": [
|
|
{
|
|
"name": "dim_patient",
|
|
"description": "Dimensione paziente derivata dall'anagrafica Cardioref normalizzata nello schema di integrazione. Popolata solo con pazienti che hanno almeno un record in una tabella flaggata is_activity_table:true in integration-map.yaml (gate di attivita clinica del reparto di aritmologia)."
|
|
}
|
|
],
|
|
"keys": ["cod_paz"],
|
|
"filters": [
|
|
{
|
|
"column": "sequenze_abl_imp.data_impianto",
|
|
"op": ">",
|
|
"value": "data_ablazione",
|
|
"description": "",
|
|
"rationale": "L'impianto deve seguire cronologicamente l'ablazione (non precederla né coincidere)."
|
|
},
|
|
{
|
|
"column": "sequenze_abl_imp.data_impianto",
|
|
"op": "<=",
|
|
"value": "data_ablazione + INTERVAL '10 years'",
|
|
"description": "",
|
|
"rationale": "Vincolo «entro 10 anni» dalla domanda originale."
|
|
}
|
|
],
|
|
"output_columns": ["cod_paz", "num_ablazione", "data_ablazione", "num_impianto", "data_impianto"]
|
|
},
|
|
{
|
|
"name": "pazienti_qualificati",
|
|
"index": 4,
|
|
"purpose": "Una riga per paziente (prima coppia qualificante: ablazione più recente) + gap in anni.",
|
|
"rationale": "Riduce sequenze_abl_imp a una riga per paziente come richiesto dalla «lista dei pazienti», scegliendo la coppia più recente in caso di ablazioni multiple.",
|
|
"depends_on": ["sequenze_abl_imp"],
|
|
"tables": [],
|
|
"keys": ["cod_paz"],
|
|
"filters": [],
|
|
"output_columns": ["cod_paz", "data_ablazione", "data_impianto", "gap_anni"]
|
|
}
|
|
]
|
|
}
|