Files
ThothII/tools/replay/cte-plan-fixture.json
T
marcopan 4042d0b44d feat(replay): fixtures + augment script for v2 artifact-gate viewers
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.
2026-07-07 01:19:44 +02:00

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"]
}
]
}