From 87e875bc815a48d247d58b0b8ee6fb6e7793bafb Mon Sep 17 00:00:00 2001 From: mptyl Date: Tue, 7 Jul 2026 16:04:00 +0200 Subject: [PATCH] feat(replay): extract reviewer_schema_linking gates + de-slug question fallback extract.mjs now emits a schema-linking ui_request descriptor (columns rendered from the model's suggested_columns, since the live catalog enrichment needs the DWH) and parses the reviewer's "N tabelle" outcome; when neither the manifest nor question.md is reachable, the NL question is approximated by de-slugging the session id. replay.json regenerated from the 2026-07-06-175012 session (18 answered gates, includes the F4 schema-linking gate). Co-Authored-By: Claude Fable 5 --- tools/replay/extract.mjs | 45 +- tools/replay/replay.json | 4553 +++++--------------------------------- 2 files changed, 581 insertions(+), 4017 deletions(-) diff --git a/tools/replay/extract.mjs b/tools/replay/extract.mjs index 708290c1..657c96c8 100644 --- a/tools/replay/extract.mjs +++ b/tools/replay/extract.mjs @@ -215,6 +215,33 @@ function buildDescriptor(name, args, idx) { reserved: RESERVED, }; } + // F4 schema-linking gate (column curation, v2). The model supplies tables with + // kind/rationale/suggested_columns; the live gate enriches columns from the + // catalog via `tht schema columns` (needs DWH), so here we render only what the + // model provided — columns come from suggested_columns as suggested=true. + if (name === "reviewer_schema_linking") { + const tables = parseOptions(args.tables).map((t) => ({ + id: t.id, + name: t.name, + kind: t.kind ?? "promote", + recommended: !!t.recommended, + description: t.description ?? null, + rationale: t.rationale ?? null, + columns: (parseOptions(t.suggested_columns).map((c) => + typeof c === "string" ? { name: c, description: null, suggested: true } : c, + )), + })); + return { + type: "ui_request", + id, + phase, + schema_version: SCHEMA_VERSION, + widget: "schema-linking", + title: args.title, + tables, + reserved: RESERVED, + }; + } return null; } @@ -263,6 +290,11 @@ function parseRealChoice(name, descriptor, resultText) { if (/Rifiutato/i.test(t)) return { labels: ["Rifiuta"], note: t }; return { labels: [], note: t }; } + if (name === "reviewer_schema_linking") { + // "Schema linking registrato dal reviewer (6 tabelle + colonne curate)." + const m = t.match(/registrato dal reviewer \((\d+)\s+tabelle/); + return { labels: m ? [`${m[1]} tabelle`] : [], note: t }; + } return { labels: [], note: t }; } @@ -303,6 +335,17 @@ function readSessionQuestion(sid) { return null; } +// Last-resort fallback when neither the manifest nor question.md can be found +// (e.g. the workspace repo is not checked out here). `tht session new` derives +// the session id slug from the question text, so de-slugging it recovers a +// readable approximation of the original NL question. +function questionFromSessionId(sid) { + if (typeof sid !== "string") return null; + const slug = sid.replace(/^\d{4}-\d{2}-\d{2}-\d{6}-/, ""); + if (!slug) return null; + return slug.replace(/-/g, " "); +} + // Resolve a session id to its on-disk directory. We check every workspace yaml // in harness/workspaces/ for a `paths.sessions` entry (relative OR absolute), // then look for // in each. Workspaces are symlinks to @@ -350,7 +393,7 @@ const replay = { }, session: { id: sessionId, - question: readSessionQuestion(sessionId), + question: readSessionQuestion(sessionId) ?? questionFromSessionId(sessionId), created_at: createdAt, }, stats: { diff --git a/tools/replay/replay.json b/tools/replay/replay.json index b05ece2b..5bcc4f52 100644 --- a/tools/replay/replay.json +++ b/tools/replay/replay.json @@ -1,45 +1,50 @@ { "source": { "transcripts": [ - "/Users/mp/.pi/agent/sessions/--Users-mp-projects-ThothII-harness--/2026-07-03T17-07-32-977Z_019f28f3-2bf1-770f-83e0-87d5e95e45f9.jsonl" + "/Users/mp/.pi/agent/sessions/--Users-mp-projects-ThothII-harness--/2026-07-06T17-50-12-725Z_019f388d-4ef5-7f68-9a62-8de89c03ae19.jsonl" ], - "extractedAt": "2026-07-05T16:30:48.546Z", + "extractedAt": "2026-07-07T10:26:15.283Z", "note": "gates without a reviewer answer (resume re-entries) are dropped" }, "session": { - "id": "2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul", - "question": "fammi la lista dei pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore", - "created_at": "2026-07-03T17:07:32.977Z" + "id": "2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a", + "question": "lista dei pazienti che negli ultimi 15 a", + "created_at": "2026-07-06T17:50:12.725Z" }, "stats": { "transcriptFiles": 1, - "totalReviewerCalls": 20, - "answeredGates": 20, - "droppedUnanswered": 0 + "totalReviewerCalls": 19, + "answeredGates": 18, + "droppedUnanswered": 1 }, "gates": [ { - "callId": "call_c5572b38f6e346429db2ef44", + "callId": "call_aa8f3fa88ed04dcf81b588f0", "toolName": "reviewer_select", - "ts": "2026-07-03T17:12:33.930Z", + "ts": "2026-07-06T17:56:45.040Z", "descriptor": { "type": "ui_request", "id": "u0", "phase": "F1", "schema_version": 1, "widget": "select", - "title": "F1 — Chiarimento 1/3: cosa intendiamo per \"impianto di un defibrillatore\"?", - "intro": "Domanda: «pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione».\n\nDal dominio ICD (evidence «Dominio ICD») il defibrillatore ha 3 famiglie di eventi DISTINTE in fact separate:\n• fact_impianto_defibrillatore_impiantabile → IMPIANTO INIZIALE (prima messa a dimora del dispositivo)\n• fact_sostituzione_impianto_defibrillatore_impiantabile → SOSTITUZIONE/REVISIONE (cambio generatore/elettrocateteri)\n• fact_controllo_defibrillatore_impiantabile → CONTROLLO (visita ambulatoriale di follow-up)\n\nL'espressione «impianto di un defibrillatore» letteralmente indica l'impianto iniziale. Va confermato se contiamo solo quello oppure anche le sostituzioni (un paziente che ha ricevuto il dispositivo in sostituzione). I controlli di follow-up NON sono \"impianto\".", - "recommended": "icd-initial-only", + "title": "F1 — Chiarimento 1/3: a quale evento si ancorano gli \"ultimi 15 anni\"?", + "intro": "**Domanda originale:** \"Lista dei pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione.\"\n\n**Cosa ho verificato nel DWH (PSD, cardiologia):**\n- Ablazione → `fact_studio_elettrofisiologico_endocavitario_ablazione` (granularità `cod_paz + num`, gestisce i redo; colonna `data_time_key`).\n- Impianto ICD → `fact_impianto_defibrillatore_impiantabile` (granularità `cod_paz + num`; colonna `data_time_key`).\n- Dominio ICD: esistono anche `fact_controllo_defibrillatore_impiantabile` (follow-up) e `fact_sostituzione_impianto_defibrillatore_impiantabile` (cambio/revisione) — le useremo nel chiarimento 2/3.\n- La sequenza temporale è **chiara**: ablazione PRIMA → impianto ICD DOPO, entro 10 anni dall'ablazione.\n\n**Ambiguità (1/3) — l'ancora temporale \"ultimi 15 anni\":** la frase \"negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto...\" non dice esplicitamente a quale dei due eventi si applichi la finestra di 15 anni. La scelta cambia la popolazione risultante. Data di riferimento: oggi (2026-07-06).", + "recommended": "anchor-ablazione", "options": [ { - "id": "icd-initial-only", - "label": "Solo impianto iniziale (consigliato)", + "id": "anchor-ablazione", + "label": "Sull'ablazione (evento iniziale) — l'ablazione è avvenuta negli ultimi 15 anni", "recommended": true }, { - "id": "icd-initial-plus-replacement", - "label": "Impianto iniziale + sostituzioni", + "id": "anchor-entrambi", + "label": "Sull'intera sequenza — sia ablazione che impianto ICD negli ultimi 15 anni", + "recommended": false + }, + { + "id": "anchor-impianto", + "label": "Sull'impianto ICD — l'impianto è avvenuto negli ultimi 15 anni", "recommended": false } ], @@ -51,38 +56,33 @@ }, "real": { "labels": [ - "Solo impianto iniziale (consigliato)" + "Sull'ablazione (evento iniziale) — l'ablazione è avvenuta negli ultimi 15 anni" ], - "note": "Decisione registrata (concept_clarified): Solo impianto iniziale (consigliato)." + "note": "Decisione registrata (concept_clarified): Sull'ablazione (evento iniziale) — l'ablazione è avvenuta negli ultimi 15 anni." } }, { - "callId": "call_b26592cf49074d878fdce303", + "callId": "call_ea5188bdfd7a42ccb795f203", "toolName": "reviewer_select", - "ts": "2026-07-03T17:20:48.101Z", + "ts": "2026-07-06T17:57:25.669Z", "descriptor": { "type": "ui_request", "id": "u1", "phase": "F1", "schema_version": 1, "widget": "select", - "title": "F1 — Chiarimento 2/3: a cosa si applica la finestra «ultimi 15 anni»?", - "intro": "Domanda: «pazienti che negli ULTIMI 15 ANNI hanno avuto un'ablazione seguita dall'impianto di un defibrillatore ENTO 10 ANNI dall'ablazione».\n\nDue vincoli temporali, da ancorare:\n• «ultimi 15 anni» → serve un riferimento (oggi 2026-07-03) e serve sapere se vincola solo l'ablazione oppure entrambi gli eventi.\n• «entro 10 anni dall'ablazione» → gap tra ablazione e impianto ≤ 10 anni, con impianto DOPO l'ablazione (questo è chiaro).\n\nData di riferimento = oggi (2026-07-03). 15 anni indietro = 2011-07-03.", - "recommended": "win-ablation-only-rolling", + "title": "F1 — Chiarimento 2/3: \"impianto di un defibrillatore\" = solo impianto iniziale o anche sostituzione?", + "intro": "**Domanda originale:** \"...un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione.\"\n\n**Chiarimento 1/3 registrato:** la finestra \"ultimi 15 anni\" si applica alla data di ABLAZIONE.\n\n**Ambiguità (2/3) — ambito di \"impianto di un defibrillatore\":** nel dominio ICD esistono **tre** fact distinte:\n- `fact_impianto_defibrillatore_impiantabile` → **impianto iniziale** (prima messa a dimora del device).\n- `fact_sostituzione_impianto_defibrillatore_impiantabile` → **sostituzione/revisione** (cambio generatore o elettrocateteri).\n- `fact_controllo_defibrillatore_impiantabile` → **controllo** (visita follow-up) — non è un \"impianto\", sempre escluso.\n\nLa parola \"impianto\" suggerisce la sola messa a dimora iniziale. Ma esiste uno scenario reale: un paziente già portatore di device che, dopo l'ablazione, subisce una **sostituzione** (nuovo generatore impiantato). Decidere se includere o no la sostituzione cambia la popolazione.", + "recommended": "solo-impianto", "options": [ { - "id": "win-ablation-only-rolling", - "label": "15 anni solo sull'ablazione, mobile da oggi (consigliato)", + "id": "solo-impianto", + "label": "Solo impianto iniziale (fact_impianto_defibrillatore_impiantabile)", "recommended": true }, { - "id": "win-both-events-rolling", - "label": "Entrambi gli eventi nei 15 anni", - "recommended": false - }, - { - "id": "win-ablation-calendar-year", - "label": "Solo ablazione, su anni solari", + "id": "impianto-piu-sostituzione", + "label": "Impianto iniziale + sostituzione (entrambe le fact)", "recommended": false } ], @@ -94,38 +94,38 @@ }, "real": { "labels": [ - "15 anni solo sull'ablazione, mobile da oggi (consigliato)" + "Solo impianto iniziale (fact_impianto_defibrillatore_impiantabile)" ], - "note": "Decisione registrata (concept_clarified): 15 anni solo sull'ablazione, mobile da oggi (consigliato)." + "note": "Decisione registrata (concept_clarified): Solo impianto iniziale (fact_impianto_defibrillatore_impiantabile)." } }, { - "callId": "call_1e25e9635c424730bd26e6dd", + "callId": "call_d8a3cf774fdb4e08a5ed8678", "toolName": "reviewer_select", - "ts": "2026-07-03T17:23:52.348Z", + "ts": "2026-07-06T17:58:34.810Z", "descriptor": { "type": "ui_request", "id": "u2", "phase": "F1", "schema_version": 1, "widget": "select", - "title": "F1 — Chiarimento 3/3: cosa deve contenere la «lista dei pazienti»?", - "intro": "Domanda: «fammi la LISTA dei pazienti …».\n\nDevo definire la forma dell'output. Ogni paziente può avere più ablazioni e più impianti: vanno gestite le coppie qualificanti (ablazione nei 15 anni + un impianto successivo entro 10 anni).\n\nAnagrafica disponibile in dim_patient (cod_paz + dati identificativi/demografici).", - "recommended": "out-one-row-with-dates", + "title": "F1 — Chiarimento 3/3: cosa deve contenere la \"lista dei pazienti\"?", + "intro": "**Domanda originale:** \"Lista dei pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione.\"\n\n**Chiarimenti registrati finora:**\n1. La finestra \"ultimi 15 anni\" si applica alla data di **ablazione**.\n2. \"impianto di un defibrillatore\" = **solo impianto iniziale** (`fact_impianto_defibrillatore_impiantabile`).\n\n**Ambiguità (3/3) — contenuto della \"lista dei pazienti\":** la domanda chiede una \"lista\", ma non specifica quali colonne mostrare. Per un'analisi di sequenza temporale (ablazione → ICD), le date di ancoraggio e l'intervallo rendono il risultato verificabile e significativo. La cura dettagliata delle colonne avverrà in Fase 4 (schema linking); qui fisso l'intento di alto livello sull'output.", + "recommended": "paz-date-intervallo", "options": [ { - "id": "out-one-row-with-dates", - "label": "Una riga per paziente + date chiave (consigliato)", + "id": "paz-date-intervallo", + "label": "Paziente + date chiave + intervallo (ablazione, impianto ICD, gap)", "recommended": true }, { - "id": "out-one-row-per-pair", - "label": "Una riga per ogni coppia qualificante", + "id": "paz-solo", + "label": "Solo identificativo paziente (cod_paz) — lista minimale", "recommended": false }, { - "id": "out-minimal-codpaz", - "label": "Solo cod_paz (lista minima)", + "id": "paz-date-demo", + "label": "Paziente + date chiave + dati demografici (dim_patient)", "recommended": false } ], @@ -137,41 +137,48 @@ }, "real": { "labels": [ - "Una riga per paziente + date chiave (consigliato)" + "Paziente + date chiave + dati demografici (dim_patient)" ], - "note": "Decisione registrata (concept_clarified): Una riga per paziente + date chiave (consigliato)." + "note": "Decisione registrata (concept_clarified): Paziente + date chiave + dati demografici (dim_patient)." } }, { - "callId": "call_d224643f60554bfc963033b8", + "callId": "call_c5b30b263a184423a639d06f", "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:24:46.939Z", + "ts": "2026-07-06T17:59:39.643Z", "descriptor": { "type": "ui_request", "id": "u3", "phase": "F1", "schema_version": 1, "widget": "artifact-gate", - "title": "Fase 1 completata — passo alla Fase 2 (Memorie)?", + "title": "F1 — Chiusura fase chiarimento: confermi e passo a F2 (memorie)?", "artifact": { - "kind": "phase1_clarifications_recap", + "kind": "phase1_recap", + "version": 1, "data": { - "domanda": "Lista dei pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione.", - "ancora_ablazione": "fact_studio_elettrofisiologico_endocavitario_ablazione con flag ablazione_transcatetere IS TRUE (ogni tipo di aritmia, nessun tipo specificato)", - "clarifications": [ + "next_phase": "F2 (memorie)", + "question": "Lista dei pazienti che negli ultimi 15 anni hanno avuto un'ablazione seguita dall'impianto di un defibrillatore entro 10 anni dall'ablazione.", + "clarifications_recorded": [ { - "concetto": "impianto_defibrillatore", - "decisione": "Solo impianto iniziale -> fact_impianto_defibrillatore_impiantabile (escluse sostituzioni e controlli)" + "subject": "ancora_temporale_15anni", + "decision": "La finestra 'ultimi 15 anni' (riferimento 2026-07-06) si applica alla data di ABLAZIONE." }, { - "concetto": "finestra_temporale", - "decisione": "15 anni solo sull'ablazione, mobile da oggi 2026-07-03: ablazione in [2011-07-03, 2026-07-03]; impianto dopo l'ablazione e <= ablazione + 10 anni" + "subject": "ambito_impianto_defibrillatore", + "decision": "'impianto di un defibrillatore' = SOLO impianto iniziale (fact_impianto_defibrillatore_impiantabile). Escluse sostituzione/revisione e controllo." }, { - "concetto": "output_lista_pazienti", - "decisione": "Una riga per paziente (DISTINCT cod_paz) + anagrafica dim_patient + data_ablazione + data_impianto + gap in anni; se piu' coppie qualificanti, prima coppia" + "subject": "output_lista_pazienti", + "decision": "Output = paziente (cod_paz) + data ablazione + data impianto ICD + dati demografici da dim_patient." } - ] + ], + "schema_grounding": { + "ablation_fact": "fact_studio_elettrofisiologico_endocavitario_ablazione (cod_paz, num, data_time_key)", + "icd_implant_fact": "fact_impianto_defibrillatore_impiantabile (cod_paz, num, data_time_key)", + "time_dim": "data_time_key -> dim_time.day_key (dt.year, dt.date...)" + }, + "assumption_carried_to_F3": "Semantica di accoppiamento (pazienti con più ablazioni/ICD): lettura esistenziale, una riga per paziente, data ablazione + primo impianto ICD successivo entro 10 anni. Sarà esplicitata come assunzione nella domanda riscritta (F3) e il reviewer potrà correggerla." } }, "action": { @@ -199,20 +206,20 @@ "labels": [ "Salva e procedi" ], - "note": "Fase approvata (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "Fase approvata (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_d20e3abfb6454834996cc206", + "callId": "call_9d67bd53d3f648a98528c709", "toolName": "reviewer_decide", - "ts": "2026-07-03T17:25:32.871Z", + "ts": "2026-07-06T18:00:56.309Z", "descriptor": { "type": "ui_request", "id": "u4", "phase": "F2", "schema_version": 1, "widget": "multiselect", - "title": "F2 — Memorie: nessuna memory riutilizzabile", + "title": "F2 — Memorie riusabili: nessun candidato", "allow_empty": true, "options": [], "selected": [], @@ -229,27 +236,27 @@ } }, { - "callId": "call_34821e6a11374c72bfb7d896", + "callId": "call_c72aebc0ffbe48ee8498e82b", "toolName": "reviewer_decide", - "ts": "2026-07-03T17:26:08.567Z", + "ts": "2026-07-06T18:01:56.673Z", "descriptor": { "type": "ui_request", "id": "u5", "phase": "F3", "schema_version": 1, "widget": "multiselect", - "title": "F3 — Riscrittura della domanda", + "title": "F3 — Riscrittura della domanda: confermi?", "allow_empty": false, "options": [ { - "id": "confirm-rewrite", - "label": "Conferma riscrittura (consigliato)", + "id": "conferma-riscrittura", + "label": "Conferma la riscrittura (passo a question.md e chiudo F3)", "recommended": true, "decision": { - "detail": "Elencare i pazienti che hanno avuto un'ablazione transcatetere di substrato aritmogeno e, successivamente, l'impianto iniziale di un defibrillatore (ICD) entro 10 anni dall'ablazione, dove l'ablazione e' avvenuta negli ultimi 15 anni.\n\nCondizioni:\n1) Popolazione: pazienti distinti in dim_patient (cod_paz).\n2) Ablazione (evento di partenza): riga di fact_studio_elettrofisiologico_endocavitario_ablazione con ablazione_transcatetere IS TRUE (qualsiasi tipo di aritmia; evidence «Dominio Ablazione»), con data_ablazione nella finestra mobile di 15 anni da oggi 2026-07-03, cioe' data_ablazione in [2011-07-03, 2026-07-03].\n3) Impianto ICD (evento successivo): riga di fact_impianto_defibrillatore_impiantabile (solo impianto iniziale; escluse sostituzioni fact_sostituzione_... e controlli fact_controllo_...; evidence «Dominio ICD»).\n4) Sequenza temporale: data_impianto > data_ablazione E data_impianto <= data_ablazione + 10 anni.\n5) Cardinalita' output: una riga per paziente (DISTINCT cod_paz); in caso di piu' coppie qualificanti (ablazione, impianto), la prima coppia qualificante.\n\nOutput atteso: lista con cod_paz + dati anagrafici (dim_patient) + data_ablazione + data_impianto + gap in anni tra i due eventi.", - "rationale": "Riscrittura conforme alle 3 decisioni di chiarimento F1 (impianto = solo iniziale; finestra 15 anni solo sull'ablazione mobile da oggi; output = una riga per paziente con date e gap).", + "type": "question_rewritten", "subject": "domanda", - "type": "question_rewritten" + "detail": "Elencare i pazienti distinti (identificati da cod_paz in dim_patient) che hanno avuto un'ablazione transcatetere di substrato aritmogeno negli ultimi 15 anni e che, a seguito di quell'ablazione, hanno ricevuto l'impianto iniziale di un defibrillatore impiantabile (ICD) entro 10 anni dalla data di ablazione.\n\nCONDIZIONI:\n1) ABLAZIONE (evento iniziale/ancora): almeno un record in fact_studio_elettrofisiologico_endocavitario_ablazione con data di ablazione negli ultimi 15 anni (data >= 2011-07-06, valutata via dim_time su data_time_key).\n2) IMPIANTO ICD INIZIALE (evento successivo): almeno un record in fact_impianto_defibrillatore_impiantabile con data successiva alla data di ablazione.\n3) SEQUENZA E FINESTRA: l'impianto ICD avviene dopo l'ablazione e entro 10 anni da essa (0 < intervallo <= 10 anni).\n4) EVENTI ESCLUSI dal conteggio come 'impianto di un defibrillatore': sostituzione/revisione (fact_sostituzione_impianto_defibrillatore_impiantabile) e controllo dispositivo (fact_controllo_defibrillatore_impiantabile).\n5) ACCOPPIAMENTO (pazienti con piu' eventi): lettura esistenziale, una riga per paziente; se un paziente ha piu' ablazioni/ICD, si riportano l'ablazione (entro i 15 anni) e il primo impianto ICD successivo che cade entro 10 anni da quell'ablazione.\n\nASSUNZIONI: data di riferimento 'ultimi 15 anni' = oggi (2026-07-06); la finestra di 15 anni si applica alla data di ablazione (decisione ancora_temporale_15anni); 'impianto' = solo impianto iniziale (decisione ambito_impianto_defibrillatore); dominio ablazione definito da evidence ev-dom-ablazione; dominio ICD da evidence ev-dom-icd.\n\nOUTPUT ATTESO: lista, una riga per paziente, con cod_paz, data ablazione, data impianto ICD, intervallo tra i due eventi e dati demografici da dim_patient (es. sesso, data di nascita/eta').", + "rationale": "Riscrittura conforme a rewriting.md: popolazione esplicita (pazienti distinti in dim_patient), condizioni numerate, termini ambigui sostituiti con i concetti chiariti in F1 citando le evidence, output esplicito." } } ], @@ -270,21 +277,23 @@ } }, { - "callId": "call_59b07fd003d24f97b25476af", + "callId": "call_6399201c98904911886c3fea", "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:27:16.529Z", + "ts": "2026-07-06T18:03:18.312Z", "descriptor": { "type": "ui_request", "id": "u6", "phase": "F3", "schema_version": 1, "widget": "artifact-gate", - "title": "Fase 3 completata — passo alla Fase 4 (Schema linking)?", + "title": "F3 — Chiusura riscrittura: confermi question.md e passo a F4 (schema linking)?", "artifact": { "data": { - "file": "question.md" + "artifact": "question.md (riscritto)", + "next_phase": "F4 (schema linking)" }, - "kind": "question_md" + "kind": "phase3_recap", + "version": 1 }, "action": { "kind": "approve_reject", @@ -311,3230 +320,138 @@ "labels": [ "Salva e procedi" ], - "note": "Fase approvata (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "Fase approvata (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_1acab58384cb4ed9b642ac13", - "toolName": "reviewer_decide", - "ts": "2026-07-03T17:33:47.338Z", + "callId": "call_914d486977bd4e91b9049263", + "toolName": "reviewer_schema_linking", + "ts": "2026-07-06T18:05:35.938Z", "descriptor": { "type": "ui_request", "id": "u7", "phase": "F4", "schema_version": 1, "widget": "schema-linking", - "title": "F4 — Schema linking: tabelle/colonne/esclusioni", + "title": "F4 — Schema linking: promuovi/escludi tabelle (con colonne)", "tables": [ { - "id": "t-ablazione", - "name": "fact_studio_elettrofisiologico_endocavitario_ablazione", - "kind": "promote", - "recommended": true, - "description": "Fatto clinico derivato da cr_seeablazione relativo a eventi, procedure o rilevazioni del paziente. Esclude record riclassificati come cardioversione o chiusura auricola.", - "rationale": "Ancora dell'ablazione dall'evidence «Dominio Ablazione».", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient).", - "type": "bigint", - "pk": true, - "suggested": true - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente.", - "type": "bigint", - "pk": true, - "suggested": true - }, - { - "name": "data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": true - }, - { - "name": "provenienza", - "description": "Provenienza del paziente rispetto all'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "indicazione", - "description": "Indicazione clinica codificata della procedura o dello studio.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "indicazione_testo", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "basale", - "description": "Condizione basale o riferimento clinico/strumentale pre-procedurale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "basaletxt", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "etl_last_update", - "description": "Timestamp dell'ultimo aggiornamento ETL.", - "type": "timestamp with time zone", - "pk": false, - "suggested": false - }, - { - "name": "modello", - "description": "Modello del dispositivo o del componente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "identificativo_intestazione", - "description": "Flag booleano.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "anamnesi_stampa", - "description": "Anamnesi del paziente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ncol", - "description": "Numero di colonne o blocchi di dati registrati nel referto specialistico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "ciclosin", - "description": "Ciclo sinusale basale registrato durante lo studio elettrofisiologico.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "qrs", - "description": "Durata del QRS registrata durante lo studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "pa", - "description": "Pressione arteriosa registrata durante la procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "ah", - "description": "Intervallo AH rilevato nello studio elettrofisiologico.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "hv", - "description": "Intervallo HV rilevato nello studio elettrofisiologico.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "trns", - "description": "Tempo di recupero del nodo del seno rilevato nello studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "trnsc", - "description": "Tempo di recupero corretto del nodo del seno rilevato nello studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "msc", - "description": "Indicazione di malattia del nodo del seno o parametro correlato.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_nodo_sinusale", - "description": "Note relative alla funzione del nodo del seno.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_pre_procedura", - "description": "Parametro di conduzione anterograda della via accessoria rilevato prima della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_atriale_pre_procedura", - "description": "Parametro atriale della conduzione anterograda della via accessoria rilevato prima della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_iso_pre_procedura", - "description": "Parametro di conduzione anterograda della via accessoria dopo isoproterenolo, in fase pre-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_pre_procedura", - "description": "Parametro di conduzione retrograda della via accessoria rilevato prima della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_atriale_pre_procedura", - "description": "Parametro atriale della conduzione retrograda della via accessoria rilevato prima della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_iso_pre_procedura", - "description": "Parametro di conduzione retrograda della via accessoria dopo isoproterenolo, in fase pre-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_refrattarieta_atriale_fase_pre_procedura", - "description": "Parametro di conduzione o refrattarieta atriale rilevato in fase pre-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_nodo_atrioventricolare_fase_pre_procedura", - "description": "Parametro di conduzione nodo atrioventricolare rilevato in fase pre-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "jump", - "description": "Presenza del fenomeno di jump nella conduzione atrioventricolare.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "tipovia", - "description": "Tipo di via accessoria o di conduzione documentata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "conduzione", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "localizzazione", - "description": "Localizzazione anatomica o elettrofisiologica documentata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "prant", - "description": "Intervallo PR o parametro di conduzione anterograda rilevato durante lo studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "prret", - "description": "Intervallo PR o parametro di conduzione retrograda rilevato durante lo studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "note_pre_procedura", - "description": "Note relative alla valutazione elettrofisiologica pre-ablazione.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "indsee", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ncolonne", - "description": "Numero complessivo di colonne o blocchi di dati registrati nel referto specialistico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "tollerata", - "description": "Indicazione della tollerabilità clinica dell'aritmia o della procedura.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_aritmie", - "description": "Note sulle aritmie indotte o documentate durante lo studio.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "procedura", - "description": "Tipologia di procedura ablativa o elettrofisiologica eseguita.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "vianlenta", - "description": "Indicazione di trattamento o presenza della via lenta.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "battitirf", - "description": "Numero di battiti o applicazioni registrati durante radiofrequenza.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria", - "description": "Indicazione della presenza o del trattamento di una via accessoria.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_descrizione", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_occulta", - "description": "Indicazione della presenza di via accessoria occulta.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "flutter_comune", - "description": "Indicazione di flutter atriale comune.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "flutter_non_comune", - "description": "Indicazione di flutter atriale non comune.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "flutter_origine", - "description": "Origine del flutter atriale documentata.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "flutter_origine_descrizione", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "blocco_istmico", - "description": "Indicazione del raggiungimento o della presenza di blocco istmico.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ta", - "description": "Indicazione di tachicardia atriale.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "taorig", - "description": "Origine della tachicardia atriale documentata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "tamap", - "description": "Informazioni di mappaggio relative alla tachicardia atriale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "tachicardia_ventricolare", - "description": "Indicazione di tachicardia ventricolare.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "tvorig", - "description": "Origine della tachicardia ventricolare documentata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "fibrillazione_atriale", - "description": "Indicazione di fibrillazione atriale.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "famap", - "description": "Informazioni di mappaggio relative alla fibrillazione atriale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "mappaatt", - "description": "Informazioni sulla mappa di attivazione ottenuta durante la procedura.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "remote", - "description": "Indicazione dell'uso di sistemi remoti o navigazione remota.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "sintarf", - "description": "Sintomi correlati alle applicazioni di radiofrequenza.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardioversione_elettrica", - "description": "Cardioversione elettrica eseguita o documentata durante la procedura.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "disseno", - "description": "Dissincronia o dissociazione del nodo del seno documentata.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "abnodoav", - "description": "Indicazione di ablazione del nodo atrioventricolare.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_sinusale_durante_radiofrequenza", - "description": "Ritmo sinusale o comportamento elettrico osservato durante radiofrequenza.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "farmaci", - "description": "Farmaci somministrati o rilevanti per la procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_post_procedura", - "description": "Parametro di conduzione anterograda della via accessoria rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_atriale_post_procedura", - "description": "Parametro atriale della conduzione anterograda della via accessoria rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_anterograda_iso_post_procedura", - "description": "Parametro di conduzione anterograda della via accessoria dopo isoproterenolo, al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_post_procedura", - "description": "Parametro di conduzione retrograda della via accessoria rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_atriale_post_procedura", - "description": "Parametro atriale della conduzione retrograda della via accessoria rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "via_accessoria_conduzione_retrograda_iso_post_procedura", - "description": "Parametro di conduzione retrograda della via accessoria dopo isoproterenolo, al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_refrattarieta_atriale_post_procedura", - "description": "Parametro di conduzione o refrattarieta atriale rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_refrattarieta_atriale_isoprenalina_post_procedura", - "description": "Parametro di conduzione o refrattarieta atriale dopo isoproterenolo, al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_nodo_atrioventricolare_post_procedura", - "description": "Parametro di conduzione nodo atrioventricolare rilevato al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "conduzione_nodo_atrioventricolare_isoprenalina_post_procedura", - "description": "Parametro di conduzione nodo atrioventricolare dopo isoproterenolo, al termine della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "indicazione_aritmie", - "description": "Inducibilità delle aritmie valutata al termine della procedura.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "dissociazione_ventricolo_atrio", - "description": "Presenza di dissociazione ventricolo-atriale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocardiogramma", - "description": "Tracciato o riferimento ECG associato alla procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ecg_basale", - "description": "Tracciato ECG basale del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "fleca", - "description": "Somministrazione o utilizzo di flecainide durante lo studio.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "ecg_finale", - "description": "Tracciato ECG finale al termine della procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "complicanze", - "description": "Complicanze cliniche o procedurali osservate durante o dopo l'episodio.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni", - "description": "Conclusioni cliniche finali dell'episodio o della procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ablazione_transcatetere", - "description": "Indicazione di ablazione transcatetere derivata dal text analysis sul campo conclusioni (sovrascrive il flag Cardioref).", - "type": "boolean", - "pk": false, - "suggested": true - }, - { - "name": "studio_elettrofisiologico", - "description": "Indicazione di studio elettrofisiologico derivata dal text analysis sul campo conclusioni (sovrascrive il flag Cardioref).", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "risultato", - "description": "Codifica dell'esito clinico o procedurale registrato.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "sintomi_1", - "description": "Sintomo registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "trattamento_1", - "description": "Trattamento numero 1 registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_1", - "description": "Aritmia numero 1 registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "diagnosi_1", - "description": "Diagnosi numero 1 registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "conseguenze_1", - "description": "Conseguenza numero 1 registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "stress_test", - "description": "Stress test eseguito o considerato nel contesto dell'episodio.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "scintigrafia", - "description": "Esame scintigrafico eseguito o considerato nel contesto dell'episodio.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "ora_inizio_ablazione", - "description": "Ora di inizio dell'ablazione.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "orablocco", - "description": "Ora di ottenimento del blocco o del risultato atteso.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "tempo_totale_scopia", - "description": "Tempo totale di fluoroscopia impiegato durante la procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "numero_erogazioni_radiofrequenza", - "description": "Numero di erogazioni di radiofrequenza effettuate.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "durata_erogazione_radiofrequenza", - "description": "Durata complessiva delle erogazioni di radiofrequenza.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "energia_erogazione_radiofrequenza", - "description": "Energia complessiva o media erogata in radiofrequenza.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "flusso_irrigazione_radiofrequenza", - "description": "Flusso di irrigazione utilizzato durante radiofrequenza.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "temperatura", - "description": "Temperatura registrata durante la procedura o l'erogazione.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "successo", - "description": "Valutazione del successo clinico o tecnico della procedura.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "data_ecg_time_key", - "description": "Chiave giorno del tracciato ECG registrato nel contesto dell'episodio.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "ora_ecg", - "description": "Ora del tracciato ECG registrato nel contesto dell'episodio.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_cardiaca", - "description": "Frequenza cardiaca base programmata (bpm).", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ritmo", - "description": "Ritmo cardiaco documentato.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "intervallo_pr", - "description": "Intervallo PR misurato sul tracciato ECG.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "durataqrs", - "description": "Durata del complesso QRS sul tracciato ECG.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "durataqt", - "description": "Durata dell'intervallo QT sul tracciato ECG.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "pk", - "description": "Identificativo univoco della scheda anagrafica Cardioref derivato da cr_anagrafica.", - "type": "bigint", - "pk": false, - "suggested": false - }, - { - "name": "esito_test_brugada", - "description": "Esito complessivo del test provocativo per Brugada (flecainide/ajmalina) nel referto. Valori 'positivo' | 'negativo' | NULL. Popolato da apply_test_provocativo_outcome sulla base di cr_see_ablazione_test_provocativo. NULL = nessun test Brugada riconosciuto nelle conclusioni.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "esito_post_ablazione_brugada", - "description": "Esito del test provocativo Brugada eseguito post-ablazione, indicatore di efficacia dell'ablazione (positivo=ablazione fallita, negativo=ablazione efficace). NULL se nessun test post-ablazione.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "esito_test_qt_lungo", - "description": "Esito complessivo del test provocativo per QT lungo (adrenalina/isoprenalina). Valori 'positivo' | 'negativo' | NULL.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "esito_post_ablazione_qt_lungo", - "description": "Esito del test provocativo QT lungo eseguito post-ablazione. Valori 'positivo' | 'negativo' | NULL.", - "type": "text", - "pk": false, - "suggested": false - } - ] - }, - { - "id": "t-impianto", - "name": "fact_impianto_defibrillatore_impiantabile", - "kind": "promote", - "recommended": true, - "description": "Fact table degli impianti di defibrillatori (ICD). Esclude record riclassificati come CRT-P/CRT-D/S-ICD dal classificatore CIED.", - "rationale": "«impianto di un defibrillatore» = solo impianto iniziale (decisione F1).", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient).", - "type": "bigint", - "pk": true, - "suggested": true - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente.", - "type": "bigint", - "pk": true, - "suggested": true - }, - { - "name": "data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": true - }, - { - "name": "nostro_ospedale", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "centro_impianto", - "description": "Centro in cui è stato eseguito l'impianto o la procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "provenienza", - "description": "Provenienza del paziente rispetto all'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_ischemica", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_pregresso_infarto_miocardico_acuto", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_valvolare", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_congenita", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_dilatativa", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_ipertrofica", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_displasia", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "cardiopatia_altro", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "classe", - "description": "Classe clinica o funzionale registrata per il paziente.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "frazione", - "description": "Frazione di eiezione o parametro funzionale ventricolare riportato.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "profilassi_antibiotica", - "description": "Profilassi antibiotica somministrata o indicata.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_fibrillazione_ventricolare", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_tachicardia_ventricolare_sostenuta_monomorfa", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_tachicardia_ventricolare_sostenuta_monomorfa", - "description": "Frequenza cardiaca registrata durante episodi di tachicardia ventricolare sostenuta monomorfa.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_tachicardia_ventricolare_sostenuta_polimorfa", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_tachicardia_ventricolare_sostenuta_polimorfa", - "description": "Frequenza cardiaca registrata durante episodi di tachicardia ventricolare sostenuta polimorfa.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_tachicardia_ventricolare_non_sostenuta", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_tachicardia_ventricolare_non_sostenuta", - "description": "Frequenza cardiaca registrata durante episodi di tachicardia ventricolare non sostenuta.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "aritmia_altro", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "sintomi_1", - "description": "Sintomo registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "ecg_1", - "description": "Codice lookup. Valori comuni: 0, 271, 272, 273.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_marca", - "description": "Marca del generatore o defibrillatore ICD impiantato.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_modello", - "description": "Modello del generatore o defibrillatore ICD impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_numero_serie", - "description": "Numero di serie del generatore o defibrillatore ICD impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_sede", - "description": "Sede anatomica della tasca o del posizionamento del generatore ICD.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro", - "description": "Identificativo o presenza dell'elettrocatetere 2.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_marca", - "description": "Marca dell'elettrocatetere 2.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_modello", - "description": "Modello dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_numero_serie", - "description": "Numero di serie dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_tipo", - "description": "Tipologia dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_accesso", - "description": "Via o accesso di impianto dell'elettrocatetere 2.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_numero_coil", - "description": "Numero di coil defibrillanti presenti sull'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_innesto", - "description": "Sede o modalità di innesto dell'elettrocatetere 2.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro", - "description": "Identificativo o presenza dell'elettrocatetere 3.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_marca", - "description": "Marca dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_modello", - "description": "Modello dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_numero_serie", - "description": "Numero di serie dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_tipo", - "description": "Tipologia dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_sede", - "description": "Sede anatomica dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_accesso", - "description": "Via o accesso di impianto dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_innesto", - "description": "Sede o modalità di innesto dell'elettrocatetere 3.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "induzione_fibrillazione_ventricolare", - "description": "Indicazione o risultato dell'induzione di fibrillazione ventricolare durante il test intra-procedurale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "sedazione_fibrillazione_ventricolare", - "description": "Tipo o livello di sedazione adottato durante il test di induzione o terminazione della fibrillazione ventricolare.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_segnale_bipolare", - "description": "Ampiezza del segnale in configurazione B dell'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_bipolare", - "description": "Ampiezza del segnale in configurazione B dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "modalita", - "description": "Modalità di programmazione o funzionamento del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_cardiaca", - "description": "Frequenza cardiaca base programmata (bpm).", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "isteresi", - "description": "Valore di isteresi programmato sul dispositivo.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "rate_responsive", - "description": "Stato della funzione rate responsive.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia", - "description": "Note relative alla programmazione o alla risposta antitachicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "relazione", - "description": "Dettagli procedurali o narrativi del ricovero.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni", - "description": "Conclusioni cliniche finali dell'episodio o della procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "etl_last_update", - "description": "Timestamp dell'ultimo aggiornamento ETL.", - "type": "timestamp with time zone", - "pk": false, - "suggested": false - }, - { - "name": "modello", - "description": "Modello del dispositivo o del componente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "identificativo_intestazione", - "description": "Flag booleano.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "medico_referente", - "description": "Identificativo del medico referente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_sopra_sotto_muscolo", - "description": "Indicazione della posizione sopra o sotto muscolare del generatore ICD.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "singolo_catetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_connettore", - "description": "Tipo di connettore dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_note", - "description": "Note cliniche o tecniche dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_note_flag", - "description": "Flag che indica la presenza di note dell'elettrocatetere 3.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "sedazione_fibrillazione_ventricolare_mg", - "description": "Dosaggio del farmaco sedativo utilizzato durante il test di fibrillazione ventricolare, espresso in mg.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "interruzione_fibrillazione_ventricolare", - "description": "Tempo o parametro relativo all'interruzione della fibrillazione ventricolare durante il test.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "tentativi_interruzione_fibrillazione_ventricolare", - "description": "Numero di tentativi necessari per interrompere la fibrillazione ventricolare al test intra-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "totale_shock", - "description": "Numero totale di shock erogati durante il test o nel corso della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "numero_fibrillazioni_ventricolari", - "description": "Numero di episodi o induzioni di fibrillazione ventricolare eseguiti durante il test.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_segnale_monopolare", - "description": "Ampiezza del segnale in configurazione M dell'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_monopolare", - "description": "Ampiezza del segnale in configurazione M dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "isteresi_descrizione", - "description": "Descrizione della modalità di isteresi impostata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia", - "description": "Note relative alla programmazione antibradicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia_flag", - "description": "Note relative a antibradysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia_flag", - "description": "Note relative a antitachysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "tempo_scopia_minuti", - "description": "Valore numerico decimale (misura o quantità).", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "tempo_scopia_secondi", - "description": "Valore numerico decimale (misura o quantità).", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "durata_procedura", - "description": "Valore numerico decimale (misura o quantità).", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "anamnesi_stampa", - "description": "Anamnesi del paziente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "non_disponibile", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "pk", - "description": "Identificativo univoco della scheda anagrafica Cardioref derivato da cr_anagrafica.", - "type": "bigint", - "pk": false, - "suggested": false - } - ] - }, - { - "id": "t-patient", + "id": "t-dim-patient", "name": "dim_patient", "kind": "promote", "recommended": true, - "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).", - "rationale": "Output = cod_paz + dati anagrafici (decisione F1).", + "description": null, + "rationale": "Output: identificativo paziente + dati demografici (decisione output_lista_pazienti). Join key cod_paz verso entrambe le fact.", "columns": [ { "name": "cod_paz", - "description": "Codice identificativo del paziente nel sistema sorgente Cardioref.", - "type": "bigint", - "pk": true, + "description": null, "suggested": true }, { - "name": "cognome", - "description": "Cognome del paziente.", - "type": "text", - "pk": false, - "suggested": true - }, - { - "name": "nome", - "description": "Nome del paziente.", - "type": "text", - "pk": false, + "name": "sesso", + "description": null, "suggested": true }, { "name": "data_nascita_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, + "description": null, "suggested": true - }, - { - "name": "luogo_nascita", - "description": "Luogo di nascita del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "sesso", - "description": "Sesso del paziente.", - "type": "text", - "pk": false, - "suggested": true - }, - { - "name": "citta", - "description": "Citta di residenza del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "provincia", - "description": "Provincia di residenza del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "nazione", - "description": "Nazione di residenza del paziente, normalizzata da regole metadata in chirone_meta; valori non nazionali (es. CAP) diventano NULL e sono tracciati in quality.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "codice_fiscale", - "description": "Codice fiscale del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "pk", - "description": "Identificativo univoco della scheda anagrafica nel sistema sorgente.", - "type": "bigint", - "pk": false, - "suggested": false - }, - { - "name": "data_inserimento_record_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "data_ultimo_aggiornamento", - "description": "Timestamp dell'ultimo aggiornamento del record anagrafico nel sistema sorgente.", - "type": "timestamp without time zone", - "pk": false, - "suggested": false - }, - { - "name": "eliminato", - "description": "Flag che indica se il record è eliminato nel sistema sorgente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ultimo_aggiornamento", - "description": "Valore di ultimo aggiornamento del record cosi come ricevuto dal flusso sorgente, mantenuto in formato testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "etl_last_update", - "description": "Timestamp dell'ultimo aggiornamento ETL del record nella dimensione paziente.", - "type": "timestamp with time zone", - "pk": false, - "suggested": false - }, - { - "name": "codice_comune", - "description": "Codice del comune associato all'anagrafica del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "indirizzo", - "description": "Indirizzo di residenza o domicilio del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "email", - "description": "Indirizzo email principale del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "codice_sanitario", - "description": "Codice sanitario associato al paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note", - "description": "Note libere anagrafiche o clinico-organizzative associate al paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "data_inserimento_anagrafica_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "cardiotelefono_flag", - "description": "Flag associazione al servizio CardioTelefono.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "email_caregiver", - "description": "Indirizzo email del caregiver o referente del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "biomonitor", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "numero_biomonitor", - "description": "Numero o codice associato al servizio Biomonitor del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "monitoraggio_remoto", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "numero_homemonitor", - "description": "Numero o codice associato al servizio HomeMonitor del paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "nanostim", - "description": "Flag associazione a NanoStim.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "studio_flessibile", - "description": "Flag associazione a StudioFlex.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "dataconssflex_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "solvente", - "description": "Flag solvente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "codice_paziente_merge", - "description": "Codice paziente utilizzato come riferimento di merge o deduplicazione anagrafica.", - "type": "bigint", - "pk": false, - "suggested": false - }, - { - "name": "eta_ingresso", - "description": "Età del paziente al primo contatto col reparto, in anni interi. Calcolata come AGE(ref_date, datan) dove ref_date = COALESCE(datainsert, MIN(data) di tutte le attività cliniche del paziente). Congelata, NON rolling.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "fascia_eta_ingresso", - "description": "Fascia d'età al primo contatto col reparto. Bande granulari sui giovani e middle-age (< 20, 20-40, 40-50, 50-60, 60-65, 65-70, 70-75, > 75, Sconosciuta). Congelata - non rolling.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "altezza_cm", - "description": "", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "peso_kg", - "description": "", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "regione", - "description": "", - "type": "text", - "pk": false, - "suggested": false } ] }, { - "id": "t-time", + "id": "t-fact-ablazione", + "name": "fact_studio_elettrofisiologico_endocavitario_ablazione", + "kind": "promote", + "recommended": true, + "description": null, + "rationale": "Evento ABLAZIONE (ancora temporale dei '15 anni' e inizio della sequenza). Granularita' cod_paz + num. Definita dal dominio evidence ev-dom-ablazione.", + "columns": [ + { + "name": "cod_paz", + "description": null, + "suggested": true + }, + { + "name": "num", + "description": null, + "suggested": true + }, + { + "name": "data_time_key", + "description": null, + "suggested": true + } + ] + }, + { + "id": "t-fact-icd", + "name": "fact_impianto_defibrillatore_impiantabile", + "kind": "promote", + "recommended": true, + "description": null, + "rationale": "Evento IMPIANTO ICD INIZIALE (evento successivo della sequenza). Granularita' cod_paz + num. Definita dal dominio evidence ev-dom-icd; e' la fact dell'impianto iniziale per la decisione ambito_impianto_defibrillatore.", + "columns": [ + { + "name": "cod_paz", + "description": null, + "suggested": true + }, + { + "name": "num", + "description": null, + "suggested": true + }, + { + "name": "data_time_key", + "description": null, + "suggested": true + } + ] + }, + { + "id": "t-dim-time", "name": "dim_time", "kind": "promote", "recommended": true, - "description": "Dimensione temporale, usata con due alias (dt_abl per l'ablazione, dt_imp per l'impianto). Colonne: day_key, full_date (DATE), year. full_date serve per i calcoli di finestra (>= '2011-07-03') e di gap (impianto entro ablazione+10 anni).", - "rationale": "data_time_key e' la FK a dim_time.day_key (non dichiarata, da aggiungere a mano nel join).", + "description": null, + "rationale": "Dimensione temporale: serve per la finestra 'ultimi 15 anni' (dt.full_date/year sulla data di ablazione), per le date di output e per il calcolo dell'intervallo 'entro 10 anni' tra ablazione e impianto. data_time_key e' la FK a dim_time.day_key (non dichiarata, da aggiungere a mano nel join).", "columns": [ { "name": "day_key", - "description": "", - "type": "integer", - "pk": true, + "description": null, "suggested": true }, { "name": "full_date", - "description": "", - "type": "date", - "pk": false, + "description": null, "suggested": true }, { "name": "year", - "description": "", - "type": "smallint", - "pk": false, + "description": null, "suggested": true - }, - { - "name": "quarter", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "month", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "day", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "semester", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "week", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "day_of_week", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "day_of_year", - "description": "", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "day_name", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "day_name_it", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "month_name", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "month_name_it", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "month_short", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "month_short_it", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "year_month", - "description": "", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "is_weekend", - "description": "", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "is_leap_year", - "description": "", - "type": "boolean", - "pk": false, - "suggested": false } ] }, { - "id": "x-sostituzione", + "id": "x-fact-sostituzione", "name": "fact_sostituzione_impianto_defibrillatore_impiantabile", "kind": "exclude", "recommended": true, - "description": "Fact table delle sostituzioni/revisioni ICD. Esclude record riclassificati come CRT-P/CRT-D/S-ICD dal classificatore CIED.", - "rationale": "Decisione F1: «impianto» = solo impianto iniziale.", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient).", - "type": "bigint", - "pk": true, - "suggested": false - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente.", - "type": "bigint", - "pk": true, - "suggested": false - }, - { - "name": "data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "sostituzione_defibrillatore", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "sostituzione_elettrocatetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "revisione", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "riparazione_elettrocatetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "riposizionamento_elettrocatetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "aggiunta_elettrocatetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "revisione_tasca", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "controllo_tasca", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "espianto", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "causa_defibrillatore", - "description": "Motivazione della sostituzione del generatore/defibrillatore.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_elettrocatetere", - "description": "Motivazione della sostituzione o revisione dell'elettrocatetere.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_revisione", - "description": "Motivazione della revisione del sistema impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_riparazione_elettrocatetere", - "description": "Motivazione della riparazione dell'elettrocatetere o del sistema.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_riposizionamento_elettrocatetere", - "description": "Motivazione del riposizionamento dell'elettrocatetere.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_aggiunta_elettrocatetere", - "description": "Motivazione dell'aggiunta di un nuovo elettrocatetere.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_revisione_tasca", - "description": "Motivazione della revisione della tasca del dispositivo.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_controllo_tasca", - "description": "Motivazione del controllo della tasca del dispositivo.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "causa_espianto", - "description": "Motivazione dell'espianto del dispositivo o del materiale impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "provenienza", - "description": "Provenienza del paziente rispetto all'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "profilassi_antibiotica", - "description": "Profilassi antibiotica somministrata o indicata.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "sintomi_1", - "description": "Sintomo registrato o programmato nell'episodio clinico.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "ecg_1", - "description": "Codice lookup. Valori comuni: 0, 271, 272, 273.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "classe", - "description": "Classe clinica o funzionale registrata per il paziente.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "frazione", - "description": "Frazione di eiezione o parametro funzionale ventricolare riportato.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_marca", - "description": "Marca del generatore o defibrillatore ICD sostituito o impiantato.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_modello", - "description": "Modello del generatore o defibrillatore ICD sostituito o impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_numero_serie", - "description": "Numero di serie del generatore o defibrillatore ICD sostituito o impiantato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_sede", - "description": "Sede anatomica della tasca o del posizionamento del generatore ICD.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro", - "description": "Identificativo o presenza dell'elettrocatetere 2.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_marca", - "description": "Marca dell'elettrocatetere 2.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_modello", - "description": "Modello dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_numero_serie", - "description": "Numero di serie dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_tipo", - "description": "Tipologia dell'elettrocatetere 2.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_accesso", - "description": "Via o accesso di impianto dell'elettrocatetere 2.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_numero_coil", - "description": "Numero di coil defibrillanti presenti sull'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_innesto", - "description": "Sede o modalità di innesto dell'elettrocatetere 2.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro", - "description": "Identificativo o presenza dell'elettrocatetere 3.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_marca", - "description": "Marca dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_modello", - "description": "Modello dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_numero_serie", - "description": "Numero di serie dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_tipo", - "description": "Tipologia dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_sede", - "description": "Sede anatomica dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_accesso", - "description": "Via o accesso di impianto dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_innesto", - "description": "Sede o modalità di innesto dell'elettrocatetere 3.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "induzione_fibrillazione_ventricolare", - "description": "Indicazione o risultato dell'induzione di fibrillazione ventricolare durante il test intra-procedurale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "sedazione_fibrillazione_ventricolare", - "description": "Tipo o livello di sedazione adottato durante il test di induzione o terminazione della fibrillazione ventricolare.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_segnale_bipolare", - "description": "Ampiezza del segnale in configurazione B dell'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_bipolare", - "description": "Ampiezza del segnale in configurazione B dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "modalita", - "description": "Modalità di programmazione o funzionamento del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_cardiaca", - "description": "Frequenza cardiaca base programmata (bpm).", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "isteresi", - "description": "Valore di isteresi programmato sul dispositivo.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "rate_responsive", - "description": "Stato della funzione rate responsive.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia", - "description": "Note relative alla programmazione o alla risposta antitachicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "relazione", - "description": "Dettagli procedurali o narrativi del ricovero.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni", - "description": "Conclusioni cliniche finali dell'episodio o della procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "etl_last_update", - "description": "Timestamp dell'ultimo aggiornamento ETL.", - "type": "timestamp with time zone", - "pk": false, - "suggested": false - }, - { - "name": "modello", - "description": "Modello del dispositivo o del componente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "identificativo_intestazione", - "description": "Flag booleano.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "causa_defibrillatore_altro", - "description": "Motivazione alternativa relativa al generatore o sistema ICD.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "causa_elettrocatetere_altro", - "description": "Motivazione alternativa relativa all'elettrocatetere.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "nostro_ospedale", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "centro_impianto", - "description": "Centro in cui è stato eseguito l'impianto o la procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "medico_referente", - "description": "Identificativo del medico referente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_sopra_sotto_muscolo", - "description": "Indicazione della posizione sopra o sotto muscolare del generatore ICD.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "singolo_catetere", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_connettore", - "description": "Tipo di connettore dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_note", - "description": "Note cliniche o tecniche dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_note_flag", - "description": "Flag che indica la presenza di note dell'elettrocatetere 3.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "sedazione_fibrillazione_ventricolare_mg", - "description": "Dosaggio del farmaco sedativo utilizzato durante il test di fibrillazione ventricolare, espresso in mg.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "interruzione_fibrillazione_ventricolare", - "description": "Tempo o parametro relativo all'interruzione della fibrillazione ventricolare durante il test.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "tentativi_interruzione_fibrillazione_ventricolare", - "description": "Numero di tentativi necessari per interrompere la fibrillazione ventricolare al test intra-procedurale.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "totale_shock", - "description": "Numero totale di shock erogati durante il test o nel corso della procedura.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "numero_fibrillazioni_ventricolari", - "description": "Numero di episodi o induzioni di fibrillazione ventricolare eseguiti durante il test.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_destro_segnale_monopolare", - "description": "Ampiezza del segnale in configurazione M dell'elettrocatetere 2.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_monopolare", - "description": "Ampiezza del segnale in configurazione M dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "isteresi_descrizione", - "description": "Descrizione della modalità di isteresi impostata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia", - "description": "Note relative alla programmazione antibradicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia_flag", - "description": "Note relative a antibradysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia_flag", - "description": "Note relative a antitachysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "modprog", - "description": "Codice del modulo o della sezione di programmazione del dispositivo.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "modifica_programmazione_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "tempo_scopia_minuti", - "description": "Flag booleano.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "tempo_scopia_secondi", - "description": "Valore numerico decimale (misura o quantità).", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "durata_procedura", - "description": "Codice lookup. Valori comuni: 60.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "anamnesi_stampa", - "description": "Anamnesi del paziente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "pk", - "description": "Identificativo univoco della scheda anagrafica Cardioref derivato da cr_anagrafica.", - "type": "bigint", - "pk": false, - "suggested": false - } - ] + "description": null, + "rationale": "Sostituzione/revisione del device: NON conta come 'impianto di un defibrillatore' per la decisione F1 ambito_impianto_defibrillatore (solo impianto iniziale).", + "columns": [] }, { - "id": "x-controllo", + "id": "x-fact-controllo", "name": "fact_controllo_defibrillatore_impiantabile", "kind": "exclude", "recommended": true, - "description": "Fact table dei controlli periodici dei dispositivi ICD.", - "rationale": "Decisione F1: controlli non sono «impianto».", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient).", - "type": "bigint", - "pk": true, - "suggested": false - }, - { - "name": "data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_marca", - "description": "Marca del generatore ICD.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "defibrillatore_modello", - "description": "Modello del generatore ICD.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ultimo", - "description": "Data e ora registrate per ultimo.", - "type": "timestamp without time zone", - "pk": false, - "suggested": false - }, - { - "name": "interventi_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_appropriati_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_inappropriati_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "numero_interventi_appropriati", - "description": "Numero di interventi appropriati registrati dal dispositivo nel periodo osservato.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_primo_time_key", - "description": "Chiave giorno del primo intervento appropriato registrato dal dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_ultimo_time_key", - "description": "Chiave giorno dell'ultimo intervento appropriato registrato dal dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_frequenza_cardiaca_minima", - "description": "Frequenza cardiaca minima registrata negli episodi con intervento appropriato del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_frequenza_cardiaca_minima_time_key", - "description": "Chiave giorno dell'episodio con frequenza cardiaca minima tra gli interventi appropriati.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_frequenza_cardiaca_massima", - "description": "Frequenza cardiaca massima registrata negli episodi con intervento appropriato del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_frequenza_cardiaca_massima_time_key", - "description": "Chiave giorno dell'episodio con frequenza cardiaca massima tra gli interventi appropriati.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_atp_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_atp_numero", - "description": "Numero di sequenze ATP erogate negli interventi appropriati del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_shock_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_shock_numero", - "description": "Numero di shock erogati negli interventi appropriati del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "numero_interventi_inappropriati", - "description": "Numero di interventi inappropriati registrati dal dispositivo nel periodo osservato.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_primo_inappropriato_time_key", - "description": "Chiave giorno del primo intervento inappropriato registrato dal dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_data_ultimo_inappropriato_time_key", - "description": "Chiave giorno dell'ultimo intervento inappropriato registrato dal dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_tachicardia_ventricolare_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_fibrillazione_atriale_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_malfunzionamento_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_interferenza_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_altro_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_appropriati_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_inappropriati_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "numero_interventi_precedenti_appropriati", - "description": "Numero di interventi appropriati registrati nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_data_primo_time_key", - "description": "Chiave giorno del primo intervento appropriato nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_data_ultimo_time_key", - "description": "Chiave giorno dell'ultimo intervento appropriato nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_frequenza_cardiaca_minima", - "description": "Frequenza cardiaca minima registrata negli interventi appropriati del periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_frequenza_cardiaca_massima", - "description": "Frequenza cardiaca massima registrata negli interventi appropriati del periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_atp_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_atp_numero", - "description": "Numero di sequenze ATP erogate nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_shock_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_shock_numero", - "description": "Numero di shock erogati nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "numero_interventi_precedenti_inappropriati", - "description": "Numero di interventi inappropriati registrati nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_data_primo_inappropriato_time_key", - "description": "Chiave giorno del primo intervento inappropriato nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_data_ultimo_inappropriato_time_key", - "description": "Chiave giorno dell'ultimo intervento inappropriato nel periodo precedente al controllo corrente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_tachicardia_ventricolare_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_fibrillazione_atriale_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_malfunzionamento_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_interferenza_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "interventi_precedenti_altro_presenti", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "batteria", - "description": "Stato o valutazione sintetica della batteria del dispositivo.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "tensione", - "description": "Valore di tensione della batteria o del dispositivo.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "tempo_carica", - "description": "Tempo di carica del condensatore del dispositivo.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "modalita", - "description": "Modalità di programmazione o funzionamento del dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "frequenza_cardiaca", - "description": "Frequenza cardiaca base programmata (bpm).", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "isteresi", - "description": "Valore di isteresi programmato sul dispositivo.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "rate_responsive", - "description": "Stato della funzione rate responsive.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia", - "description": "Note relative alla programmazione o alla risposta antitachicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_ecg", - "description": "Annotazioni relative al tracciato ECG registrato.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_spontaneo_non_valutabile", - "description": "Ritmo spontaneo rilevato in assenza di stimolazione ventricolare.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_spontaneo_presente", - "description": "Ritmo spontaneo sinusale o sopraventricolare documentato.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_spontaneo_si_descrizione", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_spontaneo_assente", - "description": "Ritmo spontaneo non sinusale documentato.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "ritmo_spontaneo_no_descrizione", - "description": "Valore testuale.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_cliniche", - "description": "Annotazioni cliniche aggiuntive raccolte durante il follow-up o la procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "terapia", - "description": "Terapia farmacologica o indicazione terapeutica registrata per il paziente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "terapia_anticoagulante", - "description": "Terapia anticoagulante in corso o indicata per il paziente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "conclusioni", - "description": "Conclusioni cliniche finali dell'episodio o della procedura.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "etl_last_update", - "description": "Timestamp dell'ultimo aggiornamento ETL.", - "type": "timestamp with time zone", - "pk": false, - "suggested": false - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente.", - "type": "bigint", - "pk": true, - "suggested": false - }, - { - "name": "modello", - "description": "Modello del dispositivo o del componente.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "identificativo_intestazione", - "description": "Flag booleano.", - "type": "smallint", - "pk": false, - "suggested": false - }, - { - "name": "medico_referente", - "description": "Identificativo del medico referente.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro", - "description": "Identificativo o presenza dell'elettrocatetere 3.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_data_time_key", - "description": "Chiave giorno (YYYYMMDD) per l'analisi temporale.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_marca", - "description": "Marca dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_modello", - "description": "Modello dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_tipo", - "description": "Tipologia dell'elettrocatetere 3.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_sede", - "description": "Sede anatomica dell'elettrocatetere 3.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_connettore", - "description": "Tipo di connettore dell'elettrocatetere 3, normalizzato su codici standard (es. DF-4, IS-1, IS-4).", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "intnote", - "description": "Testo descrittivo libero.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "interventi_note_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_monopolare", - "description": "Ampiezza del segnale in configurazione M dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "elettrocatetere_ventricolo_sinistro_segnale_bipolare", - "description": "Ampiezza del segnale in configurazione B dell'elettrocatetere 3.", - "type": "real", - "pk": false, - "suggested": false - }, - { - "name": "note_dati_misurati", - "description": "Note relative ai parametri tecnici o clinici misurati.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_dati_misurati_flag", - "description": "Note relative a datimisuratisn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "isteresi_descrizione", - "description": "Descrizione della modalità di isteresi impostata.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia", - "description": "Note relative alla programmazione antibradicardica.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "note_antibradicardia_flag", - "description": "Note relative a antibradysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_antitachicardia_flag", - "description": "Note relative a antitachysn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "modprog", - "description": "Codice del modulo o della sezione di programmazione del dispositivo.", - "type": "text", - "pk": false, - "suggested": false - }, - { - "name": "modifica_programmazione_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_ecg_flag", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "note_cliniche_flag", - "description": "Note relative a clinichesn.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "terapiasn", - "description": "Flag booleano.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "tecnico", - "description": "Identificativo del tecnico coinvolto nella procedura o nel controllo dispositivo.", - "type": "integer", - "pk": false, - "suggested": false - }, - { - "name": "anamnesi_stampa", - "description": "Anamnesi del paziente.", - "type": "boolean", - "pk": false, - "suggested": false - }, - { - "name": "pk", - "description": "Identificativo univoco della scheda anagrafica Cardioref derivato da cr_anagrafica.", - "type": "bigint", - "pk": false, - "suggested": false - } - ] + "description": null, + "rationale": "Controllo dispositivo (visita di follow-up): NON e' un impianto. Sempre escluso per la decisione F1 ambito_impianto_defibrillatore.", + "columns": [] } ], "reserved": [ @@ -3544,75 +461,34 @@ ] }, "real": { - "labels": [], - "decisionTypes": [ - "table_promoted", - "table_promoted", - "table_promoted", - "table_promoted", - "table_excluded", - "table_excluded", - "column_corrected", - "column_corrected" + "labels": [ + "6 tabelle" ], - "note": "Registrate 8 decisioni: table_promoted, table_promoted, table_promoted, table_promoted, table_excluded, table_excluded, column_corrected, column_corrected." + "note": "Schema linking registrato dal reviewer (6 tabelle + colonne curate)." } }, { - "callId": "call_0c6a563792f543f486bde30b", + "callId": "call_7bfd13fcd1e84b7b85aacf16", "toolName": "reviewer_decide", - "ts": "2026-07-03T17:34:42.520Z", + "ts": "2026-07-06T18:08:24.850Z", "descriptor": { "type": "ui_request", "id": "u8", "phase": "F4", "schema_version": 1, "widget": "multiselect", - "title": "F4 — Schema linking: join proposte", - "allow_empty": true, + "title": "F4 — Piano di join: confermi le 5 relazioni?", + "allow_empty": false, "options": [ { - "id": "j-abl-time", - "label": "JOIN ablazione → dim_time (dt_abl)", + "id": "conferma-join", + "label": "Conferma il piano di join (5 relazioni)", "recommended": true, "decision": { - "detail": "JOIN dim_time dt_abl ON dt_abl.day_key = ablazione.data_time_key — per la data dell'ablazione (finestra 15 anni e sequenza temporale). FK non dichiarata nello schema, aggiunta a mano.", - "rationale": "Ogni fact temporale si appoggia a dim_time tramite data_time_key (convenzione DWH).", - "subject": "join ablazione.data_time_key = dt_abl.day_key", - "type": "join_modified" - } - }, - { - "id": "j-imp-time", - "label": "JOIN impianto → dim_time (dt_imp)", - "recommended": true, - "decision": { - "detail": "JOIN dim_time dt_imp ON dt_imp.day_key = impianto.data_time_key — per la data dell'impianto.", - "rationale": "Idem, FK manuale.", - "subject": "join impianto.data_time_key = dt_imp.day_key", - "type": "join_modified" - } - }, - { - "id": "j-crossfact", - "label": "JOIN cross-fact ablazione.cod_paz = impianto.cod_paz", - "recommended": true, - "decision": { - "detail": "JOIN impianto ON impianto.cod_paz = ablazione.cod_paz — collega i due eventi sul paziente. E' la join centrale per la sequenza ablazione→impianto; il vincolo temporale (impianto dopo ablazione e entro 10 anni) si esprime sulle date tramite dt_abl/dt_imp.", - "rationale": "I due fact condividono cod_paz (FK a dim_patient); non esiste FK diretta tra i due fact.", - "subject": "join impianto.cod_paz = ablazione.cod_paz (cross-fact)", - "type": "join_modified" - } - }, - { - "id": "j-patient", - "label": "JOIN dim_patient (anagrafica)", - "recommended": true, - "decision": { - "detail": "JOIN dim_patient p ON p.cod_paz = ablazione.cod_paz — per i dati anagrafici in output.", - "rationale": "Anagrafica del paziente (dim_patient).", - "subject": "join dim_patient.cod_paz = ablazione.cod_paz", - "type": "join_modified" + "type": "join_modified", + "subject": "piano_join", + "detail": "JOIN proposti:\n1) dim_patient.cod_paz = fact_studio_elettrofisiologico_endocavitario_ablazione.cod_paz (paziente -> ablazione)\n2) dim_patient.cod_paz = fact_impianto_defibrillatore_impiantabile.cod_paz (paziente -> impianto ICD)\n3) fact_studio_elettrofisiologico_endocavitario_ablazione.data_time_key = dim_time.day_key (data ablazione, alias dt_abl)\n4) fact_impianto_defibrillatore_impiantabile.data_time_key = dim_time.day_key (data impianto ICD, alias dt_icd)\n5) dim_patient.data_nascita_time_key = dim_time.day_key (data nascita, alias dt_nasc)\nNota cross-dominio: le due fact si collegano tramite cod_paz (stesso paziente); la sequenza temporale (ablazione PRIMA, impianto entro 10 anni) e' una condizione di confronto date, non un join. dim_time sara' aliasato 3 volte (dt_abl/dt_icd/dt_nasc).", + "rationale": "Join standard a stella: entrambe le fact al paziente via cod_paz, ogni data_time_key a dim_time via day_key (FK non dichiarata, da aggiungere a mano). La data di nascita richiede dim_time per evitare aritmetica sulla chiave." } } ], @@ -3627,40 +503,49 @@ "real": { "labels": [], "decisionTypes": [ - "join_modified", - "join_modified", - "join_modified", "join_modified" ], - "note": "Registrate 4 decisioni: join_modified, join_modified, join_modified, join_modified." + "note": "Registrate 1 decisioni: join_modified." } }, { - "callId": "call_987e3022f77340b0ba0ff3e8", + "callId": "call_d342285ef2f9448b979147d4", "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:36:01.889Z", + "ts": "2026-07-06T18:10:41.542Z", "descriptor": { "type": "ui_request", "id": "u9", "phase": "F4", "schema_version": 1, "widget": "artifact-gate", - "title": "Fase 4 completata — passo alla Fase 5 (Sintesi)?", + "title": "F4 — Chiusura schema linking: confermi e passo a F5 (sintesi)?", "artifact": { "data": { - "file": "schema_linking.json", - "promoted": [ - "fact_studio_elettrofisiologico_endocavitario_ablazione", - "fact_impianto_defibrillatore_impiantabile", - "dim_patient", - "dim_time" - ], + "artifact": "schema_linking.json (4 tabelle promosse, 2 escluse, 5 join)", "excluded": [ "fact_sostituzione_impianto_defibrillatore_impiantabile", - "fact_controllo_defibrillatore_impiantabile" + "fact_controllo_defibrillatore_impiantabile", + "dim_patient.sesso" + ], + "joins_count": 5, + "next_phase": "F5 (sintesi)", + "promoted_columns": [ + "dim_patient.cod_paz", + "dim_patient.cognome", + "dim_patient.data_nascita_time_key", + "ablazione.cod_paz/num/data_time_key", + "icd.cod_paz/num/data_time_key", + "dim_time.day_key/full_date/year" + ], + "promoted_tables": [ + "dim_patient", + "fact_studio_elettrofisiologico_endocavitario_ablazione", + "fact_impianto_defibrillatore_impiantabile", + "dim_time" ] }, - "kind": "schema_linking_json" + "kind": "phase4_recap", + "version": 1 }, "action": { "kind": "approve_reject", @@ -3687,159 +572,37 @@ "labels": [ "Salva e procedi" ], - "note": "Fase approvata (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "Fase approvata (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_a50d394d2c754dfd8ecd1a80", + "callId": "call_02f5b332d526441e897ac8ff", "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:36:42.445Z", + "ts": "2026-07-06T18:19:25.785Z", "descriptor": { "type": "ui_request", "id": "u10", "phase": "F5", "schema_version": 1, "widget": "artifact-gate", - "title": "Fase 5 completata — passo alla Fase 6 (Piano CTE)?", + "title": "F5 — Sintesi: confermi e passo a F6 (piano CTE)?", "artifact": { - "kind": "phase", "data": { - "schema_version": 2, - "phase": { - "id": "F5", - "num": 5, - "name": "sintesi" - }, - "summary": "Sintesi completa per il Blocco 3: ablazione transcatetere e impianto ICD sono ancorati rispettivamente a `fact_studio_elettrofisiologico_endocavitario_ablazione` e `fact_impianto_defibrillatore_impiantabile`, incrociati su `cod_paz` (entrambe FK a `dim_patient`). Escluse sostituzioni e controlli, fuori perimetro della domanda.", - "checks": [ - { - "label": "Copertura tabelle promosse", - "status": "ok", - "detail": "Tutte le tabelle usate sono nel perimetro promosso in F4." - }, - { - "label": "Finestre temporali coerenti", - "status": "ok", - "detail": "Ablazione in [2011-07-03, 2026-07-03]; impianto dopo l'ablazione e <= ablazione + 10 anni." - }, - { - "label": "Chiavi di join verificate", - "status": "ok", - "detail": "cod_paz presente e non nullo in entrambe le fact table candidate." - }, - { - "label": "Ambiguità residue", - "status": "warn", - "detail": "Pazienti con più ablazioni: da chiarire in F6 se contare la prima o l'ultima coppia qualificante." - } + "check": "tht session check -> OK (decisioni presenti + schema_linking valido)", + "concept": "Sequenza temporale cross-dominio: ablazione (fact_studio_elettrofisiologico_endocavitario_ablazione) -> impianto ICD iniziale (fact_impianto_defibrillatore_impiantabile), stesso paziente via cod_paz.", + "next_phase": "F6 (piano CTE)", + "output_columns_to_project": "dim_patient.cod_paz, cognome, data_nascita (dt_nasc); data ablazione (dt_abl); data impianto ICD (dt_icd); intervallo", + "rules": [ + "Ablazione negli ultimi 15 anni (dt_abl.full_date >= 2011-07-06)", + "Impianto ICD successivo all'ablazione", + "Intervallo ablazione->ICD <= 10 anni", + "Escluse sostituzione e controllo ICD", + "Una riga per paziente (esistenziale)" ], - "sections": [ - { - "title": "Criteri di selezione", - "items": [ - { - "label": "Ablazione transcatetere", - "table": "fact_studio_elettrofisiologico_endocavitario_ablazione", - "column": "ablazione_transcatetere", - "value": "IS TRUE", - "kind": "filter", - "description": "Indicazione di ablazione transcatetere derivata dal text analysis sul campo conclusioni (sovrascrive il flag Cardioref).", - "rationale": "Isola le sole procedure transcatetere richieste dalla domanda." - }, - { - "label": "Finestra ablazione", - "table": "fact_studio_elettrofisiologico_endocavitario_ablazione", - "column": "data_ablazione", - "value": "[2011-07-03, 2026-07-03]", - "kind": "filter", - "description": "Data di esecuzione della procedura di ablazione.", - "rationale": "Finestra degli «ultimi 15 anni» calcolata rispetto alla data corrente della domanda." - }, - { - "label": "Impianto successivo all'ablazione", - "table": "fact_impianto_defibrillatore_impiantabile", - "column": "data_impianto", - "value": "> data_ablazione E <= data_ablazione + 10 anni", - "kind": "filter", - "description": "Data di esecuzione dell'impianto del defibrillatore.", - "rationale": "Vincolo «entro 10 anni» richiesto dalla domanda." - }, - { - "label": "Join paziente", - "table": "dim_patient", - "column": "cod_paz", - "value": "cross-fact join", - "kind": "join", - "description": "Codice identificativo del paziente nel sistema sorgente Cardioref.", - "rationale": "Chiave comune tra le due fact table (entrambe FK a dim_patient)." - } - ] - } - ], - "tables": [ - { - "name": "fact_studio_elettrofisiologico_endocavitario_ablazione", - "role": "promoted", - "description": "Fatto clinico derivato da cr_seeablazione relativo a eventi, procedure o rilevazioni del paziente. Esclude record riclassificati come cardioversione o chiusura auricola.", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient)." - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente." - }, - { - "name": "ablazione_transcatetere", - "description": "Indicazione di ablazione transcatetere derivata dal text analysis sul campo conclusioni.", - "value_filter": "IS TRUE" - } - ] - }, - { - "name": "fact_impianto_defibrillatore_impiantabile", - "role": "promoted", - "description": "Fact table degli impianti di defibrillatori (ICD). Esclude record riclassificati come CRT-P/CRT-D/S-ICD dal classificatore CIED.", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient)." - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente." - } - ] - }, - { - "name": "dim_patient", - "role": "promoted", - "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).", - "columns": [ - { - "name": "cod_paz", - "description": "Codice identificativo del paziente nel sistema sorgente Cardioref." - } - ] - }, - { - "name": "fact_sostituzione_impianto_defibrillatore_impiantabile", - "role": "excluded", - "description": "Fact table delle sostituzioni/revisioni ICD. Esclude record riclassificati come CRT-P/CRT-D/S-ICD dal classificatore CIED.", - "columns": [] - }, - { - "name": "fact_controllo_defibrillatore_impiantabile", - "role": "excluded", - "description": "Fact table dei controlli periodici dei dispositivi ICD.", - "columns": [] - } - ], - "open_questions": [ - "Se un paziente ha più ablazioni transcatetere seguite da impianto, contare la prima o l'ultima coppia qualificante?" - ] - } + "schema_linking": "4 tabelle promosse + 2 escluse + 5 join (dim_time aliasato dt_abl/dt_icd/dt_nasc)" + }, + "kind": "phase5_recap", + "version": 1 }, "action": { "kind": "approve_reject", @@ -3866,65 +629,78 @@ "labels": [ "Salva e procedi" ], - "note": "Fase approvata (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "Fase approvata (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_50df4a4b460447ee96a4627a", - "toolName": "reviewer_decide", - "ts": "2026-07-03T17:38:48.818Z", + "callId": "call_2e4430394118418d923c6e9b", + "toolName": "reviewer_confirm", + "ts": "2026-07-06T18:23:54.406Z", "descriptor": { "type": "ui_request", "id": "u11", "phase": "F6", "schema_version": 1, - "widget": "multiselect", - "title": "F6 — Piano CTE (4 CTE in catena)", - "allow_empty": true, + "widget": "artifact-gate", + "title": "F6 — Piano CTE (4 CTE in ordine): confermi?", + "artifact": { + "data": { + "ctes": [ + { + "columns": "cod_paz, num, data_ablazione (dt_abl.full_date)", + "name": "ablazioni_recenti", + "purpose": "Ablazioni negli ultimi 15 anni (finestra ancorata sull'ablazione) con data risolta", + "tables": "fact_studio_elettrofisiologico_endocavitario_ablazione, dim_time AS dt_abl", + "where": "dt_abl.full_date >= DATE '2011-07-06' (ultimi 15 anni dal 2026-07-06)" + }, + { + "columns": "cod_paz, num, data_icd (dt_icd.full_date)", + "name": "impianti_icd", + "purpose": "Impianti ICD iniziali con data risolta", + "tables": "fact_impianto_defibrillatore_impiantabile, dim_time AS dt_icd", + "where": "nessuno (tutti gli impianti iniziali)" + }, + { + "columns": "cod_paz, num_ablazione, data_ablazione, num_icd, data_icd, intervallo (anni decimali)", + "name": "sequenze_ablazione_icd", + "purpose": "Coppie ablazione->ICD: stesso paziente, ICD DOPO ablazione e ENTRO 10 anni", + "tables": "ablazioni_recenti, impianti_icd (join su cod_paz)", + "where": "i.data_icd > a.data_ablazione AND i.data_icd <= a.data_ablazione + INTERVAL '10 years'" + }, + { + "columns": "cod_paz, data_ablazione, data_icd, intervallo", + "name": "pazienti_qualificati", + "purpose": "Una riga per paziente: ablazione + primo ICD successivo (DISTINCT ON cod_paz, per data_ablazione e data_icd crescenti)", + "tables": "sequenze_ablazione_icd", + "where": "deduplicazione esistenziale (assunzione 'una riga per paziente')" + } + ], + "note": "Ogni file sara' cumulativo/auto-contenuto (WITH con tutti i CTE fino al corrente); la demographics (cognome, data_nascita via dim_patient+dim_time) si aggiunge nel SELECT finale (F7). Validazione: solo tabelle promosse.", + "order": [ + "ablazioni_recenti", + "impianti_icd", + "sequenze_ablazione_icd", + "pazienti_qualificati" + ] + }, + "kind": "cte_plan", + "version": 1 + }, + "action": { + "kind": "approve_reject", + "prompt": "Approvi o rifiuti?" + }, "options": [ { - "id": "cte-1-ablazioni", - "label": "CTE 1: ablazioni_recenti", - "recommended": true, - "decision": { - "detail": "Tutte le ablazioni transcatetere (flag ablazione_transcatetere IS TRUE) con data nel range [2011-07-03, 2026-07-03]. Mantiene chiavi cod_paz, num e data_ablazione (dt_abl.full_date). Tabelle: fact_studio_elettrofisiologico_endocavitario_ablazione JOIN dim_time dt_abl.", - "subject": "cte: ablazioni_recenti", - "type": "cte_plan" - } + "id": "approve", + "label": "Salva e procedi", + "recommended": true }, { - "id": "cte-2-impianti", - "label": "CTE 2: impianti_icd", - "recommended": true, - "decision": { - "detail": "Tutti gli impianti iniziali ICD con data. Mantiene chiavi cod_paz, num e data_impianto (dt_imp.full_date). Tabelle: fact_impianto_defibrillatore_impiantabile JOIN dim_time dt_imp.", - "subject": "cte: impianti_icd", - "type": "cte_plan" - } - }, - { - "id": "cte-3-sequenze", - "label": "CTE 3: sequenze_abl_imp (coppie qualificanti)", - "recommended": true, - "decision": { - "detail": "Join tra ablazioni_recenti e impianti_icd su cod_paz; mantiene solo le coppie con data_impianto > data_ablazione E data_impianto <= data_ablazione + 10 anni. Mantiene entrambe le chiavi e le date.", - "subject": "cte: sequenze_abl_imp", - "type": "cte_plan" - } - }, - { - "id": "cte-4-pazienti", - "label": "CTE 4: pazienti_qualificati (una riga/paziente + gap)", - "recommended": true, - "decision": { - "detail": "Una riga per paziente (DISTINCT cod_paz): dalla sequenze_abl_imp sceglie la prima coppia qualificante (ablazione piu' recente nel range) e calcola il gap in anni. Pronto per l'arricchimento anagrafico in F7.", - "subject": "cte: pazienti_qualificati", - "type": "cte_plan" - } + "id": "reject", + "label": "Rifiuta" } ], - "selected": [], - "content": null, "reserved": [ "back", "exit", @@ -3932,32 +708,233 @@ ] }, "real": { - "labels": [], - "note": "ERRORE: tipo 'cte_plan' non valido. Tipi: concept_clarified, question_rewritten, table_promoted, table_excluded, column_corrected, join_modified, evidence_accepted, evidence_rejected, ambiguity_open, memory_rejected, cte_approved, cte_corrected, cte_rejected, sql_revised, sql_approved, sql_rejected, phase_approved, phase_auto_approved, phase_reopened, phase_skipped, datamart_requested, datamart_declined, decision_retracted, value_grounded, concept_formula_approved, concept_formula_rejected" + "labels": [ + "Salva e procedi" + ], + "note": "CTE plan approvato (4 CTE, sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_fedc3508e0b0472f8126882e", - "toolName": "reviewer_select", - "ts": "2026-07-03T17:40:02.196Z", + "callId": "call_1fd6670535864d32b6c0ba30", + "toolName": "reviewer_confirm", + "ts": "2026-07-06T18:24:49.496Z", "descriptor": { "type": "ui_request", "id": "u12", "phase": "F6", "schema_version": 1, - "widget": "select", - "title": "F6 — Piano CTE: conferma il piano prima dei test", - "intro": "Piano CTE (4 CTE in catena, ognuno cattura un sottoinsieme informativo). L'approvazione vera e propria sara' per-CTE nei gate kind:\"cte_result\" dopo tht cte test. Qui chiedo solo il via libera al piano prima di iniziare a testare.\n\nCTE 1 — ablazioni_recenti: ablazioni transcatetere (ablazione_transcatetere IS TRUE) con data ∈ [2011-07-03, 2026-07-03]; chiavi cod_paz, num, data_ablazione.\nCTE 2 — impianti_icd: impianti ICD iniziali con data; chiavi cod_paz, num, data_impianto.\nCTE 3 — sequenze_abl_imp: join su cod_paz, mantiene coppie con data_impianto > data_ablazione E <= data_ablazione + 10 anni.\nCTE 4 — pazienti_qualificati: una riga per paziente (prima coppia qualificante: ablazione piu' recente) + gap in anni.\n\nTutte le tabelle usate sono nel perimetro promosso (F4). I nomi di tabelle/colonne sono copiati esattamente dal contesto di schema.", - "recommended": "plan-ok", + "widget": "artifact-gate", + "title": "F6 — CTE 1/4 ablazioni_recenti: OK (145 ms). Approvi?", + "artifact": { + "data": { + "columns": [ + "cod_paz", + "num_ablazione", + "data_ablazione" + ], + "execution_ms": 145, + "name": "ablazioni_recenti", + "row_sample": "10 (preview troncata — più righe totali)", + "sample": [ + "44039 | 1 | 2016-02-29", + "48715 | 1 | 2017-08-28", + "61661 | 1 | 2023-05-15", + "93339 | 1 | 2019-06-17", + "89286 | 3 | 2016-09-14", + "106805 | 3 | 2015-11-23" + ], + "status": "ok", + "warnings": [ + "righe = limit: risultato troncato dalla preview" + ], + "where": "dt_abl.full_date >= DATE '2011-07-06' (ultimi 15 anni)" + }, + "kind": "cte", + "version": 1 + }, + "action": { + "kind": "approve_reject", + "prompt": "Approvi o rifiuti?" + }, "options": [ { - "id": "plan-ok", - "label": "Approva il piano, procedi con i test CTE (consigliato)", + "id": "approve", + "label": "Salva e procedi", "recommended": true }, { - "id": "plan-revise", - "label": "Rivedi il piano (specifico con Altro)", + "id": "reject", + "label": "Rifiuta" + } + ], + "reserved": [ + "back", + "exit", + "other" + ] + }, + "real": { + "labels": [ + "Salva e procedi" + ], + "note": "CTE 'ablazioni_recenti' approvato (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." + } + }, + { + "callId": "call_d809156479d546e18d32c6c8", + "toolName": "reviewer_confirm", + "ts": "2026-07-06T18:25:47.072Z", + "descriptor": { + "type": "ui_request", + "id": "u13", + "phase": "F6", + "schema_version": 1, + "widget": "artifact-gate", + "title": "F6 — CTE 2/4 impianti_icd: OK (78 ms). Approvi?", + "artifact": { + "data": { + "columns": [ + "cod_paz", + "num_icd", + "data_icd" + ], + "execution_ms": 78, + "name": "impianti_icd", + "note": "num_icd progressivo gestisce più impianti per paziente (es. num=65, 12). Nessun filtro: tutti gli impianti iniziali; la sequenza si applica nel CTE 3.", + "row_sample": "10 (preview troncata)", + "sample": [ + "20930 | 3 | 2011-11-16", + "547500 | 1 | 2026-06-03", + "21920 | 65 | 2023-07-12", + "22135 | 2 | 2012-04-23" + ], + "status": "ok", + "warnings": [ + "righe = limit: risultato troncato dalla preview" + ] + }, + "kind": "cte", + "version": 1 + }, + "action": { + "kind": "approve_reject", + "prompt": "Approvi o rifiuti?" + }, + "options": [ + { + "id": "approve", + "label": "Salva e procedi", + "recommended": true + }, + { + "id": "reject", + "label": "Rifiuta" + } + ], + "reserved": [ + "back", + "exit", + "other" + ] + }, + "real": { + "labels": [ + "Salva e procedi" + ], + "note": "CTE 'impianti_icd' approvato (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." + } + }, + { + "callId": "call_f3e57fddfba946f28b4f3482", + "toolName": "reviewer_confirm", + "ts": "2026-07-06T18:28:41.850Z", + "descriptor": { + "type": "ui_request", + "id": "u14", + "phase": "F6", + "schema_version": 1, + "widget": "artifact-gate", + "title": "F6 — CTE 3/4 sequenze_ablazione_icd: OK (110 ms). Approvi?", + "artifact": { + "data": { + "columns": [ + "cod_paz", + "num_ablazione", + "data_ablazione", + "num_icd", + "data_icd", + "intervallo_anni" + ], + "execution_ms": 110, + "fix_applied": "Alias collisione nel validatore statico: in CTE3 referenziavo i CTE con alias a/i (già usati per le tabelle fisiche in CTE1/2). Corretto referenziando i CTE per nome (ablazioni_recenti./impianti_icd.).", + "logic": "JOIN su cod_paz, ICD DOPO ablazione (data_icd > data_ablazione) e ENTRO 10 anni (data_icd <= data_ablazione + INTERVAL '10 years')", + "name": "sequenze_ablazione_icd", + "note": "Una riga per ogni coppia (ablazione, ICD) qualificante; un paziente può comparire più volte se ha più coppie valide — la deduplicazione 'una riga per paziente' avviene nel CTE 4. Intervallo 0.0 = impianto il giorno dopo (procedura combinata).", + "row_sample": "10 (preview troncata)", + "sample": [ + "88537 | abl 1 (2016-04-21) | icd 9 (2024-05-23) | 8.09 anni", + "71229 | abl 1 (2013-01-09) | icd 4 (2013-04-22) | 0.28", + "324943 | abl 1 (2011-07-19) | icd 3 (2015-01-01) | 3.46", + "497104 | abl 5 (2022-11-15) | icd 1 (2022-11-16) | 0.0" + ], + "status": "ok", + "warnings": [ + "righe = limit: risultato troncato dalla preview" + ] + }, + "kind": "cte", + "version": 1 + }, + "action": { + "kind": "approve_reject", + "prompt": "Approvi o rifiuti?" + }, + "options": [ + { + "id": "approve", + "label": "Salva e procedi", + "recommended": true + }, + { + "id": "reject", + "label": "Rifiuta" + } + ], + "reserved": [ + "back", + "exit", + "other" + ] + }, + "real": { + "labels": [ + "Salva e procedi" + ], + "note": "CTE 'sequenze_ablazione_icd' approvato (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." + } + }, + { + "callId": "call_1678291b46e64b0cb058f601", + "toolName": "reviewer_select", + "ts": "2026-07-06T18:33:13.886Z", + "descriptor": { + "type": "ui_request", + "id": "u15", + "phase": "F6", + "schema_version": 1, + "widget": "select", + "title": "F6 — VPN caduta: come procedo con il test del CTE 4?", + "intro": "**Blocco ambientale — VPN disconnessa.**\n\nStato F6: CTE 1–3 (`ablazioni_recenti`, `impianti_icd`, `sequenze_ablazione_icd`) **testati a runtime e approvati** ✓.\n\nIl **CTE 4 `pazienti_qualificati`** (l'ultimo: `DISTINCT ON (cod_paz) ... ORDER BY cod_paz, data_ablazione, data_icd` — una riga per paziente, ablazione più recente + primo ICD successivo) è **validato staticamente** (nessun errore SQL), MA il test runtime fallisce perché:\n\n```\nDWH REST non raggiungibile: Failed to resolve 'supabase-aritmolab.policlinicosandonato.it' (NXDOMAIN)\n```\n\nCausa: la **VPN FortiClient è disconnessa** (`scutil --nc list` → Disconnected). L'host del DWH è interno/VPN-only. La VPN era attiva per i CTE 1–3 ed è caduta a metà sessione.\n\nNon approvo il CTE 4 senza un test runtime positivo (disciplina: nessun successo simulato). Come procediamo?", + "recommended": "riprova-dopo-vpn", + "options": [ + { + "id": "riprova-dopo-vpn", + "label": "Ricollego la VPN, poi riprovo il test del CTE 4", + "recommended": true + }, + { + "id": "approva-statico", + "label": "Approva il CTE 4 solo su validazione statica (senza test runtime)", "recommended": false } ], @@ -3969,394 +946,49 @@ }, "real": { "labels": [], - "note": "Scelta del reviewer: Approva il piano, procedi con i test CTE (consigliato)" + "note": "Scelta del reviewer: Ricollego la VPN, poi riprovo il test del CTE 4" } }, { - "callId": "call_da9d097835fc4a7da5123199", + "callId": "call_11a2e9000e354837887ef0ca", "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:41:40.163Z", - "descriptor": { - "type": "ui_request", - "id": "u13", - "phase": "F6", - "schema_version": 1, - "widget": "artifact-gate", - "title": "F6 — CTE 1 approvato: ablazioni_recenti?", - "artifact": { - "kind": "cte_result", - "data": { - "schema_version": 2, - "name": "ablazioni_recenti", - "index": 1, - "total": 4, - "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": [], - "sql": "WITH ablazioni_recenti AS (\n SELECT\n cod_paz,\n num,\n data_ablazione\n FROM fact_studio_elettrofisiologico_endocavitario_ablazione\n WHERE ablazione_transcatetere IS TRUE\n AND data_ablazione BETWEEN DATE '2011-07-03' AND DATE '2026-07-03'\n)\nSELECT * FROM ablazioni_recenti\nLIMIT 10;", - "status": "ok", - "execution_ms": 184, - "row_sample": 10, - "warnings": [ - "righe = limit: risultato troncato dalla preview" - ], - "sql_hash": "a3f6c9d1e8b2047f", - "columns": [ - { - "name": "cod_paz", - "description": "Codice paziente (FK a dim_patient)." - }, - { - "name": "num", - "description": "Numero progressivo dell'episodio clinico per il paziente." - }, - { - "name": "data_ablazione", - "description": "Data di esecuzione della procedura di ablazione." - } - ], - "preview": { - "columns": [ - "cod_paz", - "num", - "data_ablazione" - ], - "rows": [ - [ - 3758, - 5, - "2018-09-24" - ], - [ - 8175, - 473, - "2025-05-19" - ], - [ - 152185, - 3, - "2026-05-28" - ], - [ - 20446, - 61, - "2018-05-14" - ], - [ - 25492, - 3, - "2013-11-28" - ], - [ - 4664, - 94, - "2016-05-31" - ], - [ - 39149, - 2, - "2018-04-05" - ], - [ - 7243, - 38, - "2012-12-12" - ], - [ - 22310, - 9, - "2013-07-15" - ], - [ - 4848, - 408, - "2011-10-05" - ] - ] - }, - "note": "Tutte le data_ablazione ricadono nel range [2011-07-03, 2026-07-03]; preview troncata a 10 righe. Mantiene le chiavi cod_paz e num." - } - }, - "action": { - "kind": "approve_reject", - "prompt": "Approvi o rifiuti?" - }, - "options": [ - { - "id": "approve", - "label": "Salva e procedi", - "recommended": true - }, - { - "id": "reject", - "label": "Rifiuta" - } - ], - "reserved": [ - "back", - "exit", - "other" - ] - }, - "real": { - "labels": [], - "note": "Nessun CTE in attesa di approvazione (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul).", - "failed": true - } - }, - { - "callId": "call_689b08ba5bc7457a8f831211", - "toolName": "reviewer_confirm", - "ts": "2026-07-03T17:47:16.945Z", - "descriptor": { - "type": "ui_request", - "id": "u14", - "phase": "F6", - "schema_version": 1, - "widget": "artifact-gate", - "title": "F6 — Piano CTE (persisti cte_plan.json)", - "artifact": { - "kind": "cte_plan", - "data": { - "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" - ] - } - ] - } - }, - "action": { - "kind": "approve_reject", - "prompt": "Approvi o rifiuti?" - }, - "options": [ - { - "id": "approve", - "label": "Salva e procedi", - "recommended": true - }, - { - "id": "reject", - "label": "Rifiuta" - } - ], - "reserved": [ - "back", - "exit", - "other" - ] - }, - "real": { - "labels": [ - "Salva e procedi" - ], - "note": "CTE plan approvato (4 CTE, sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." - } - }, - { - "callId": "call_757bf476b6814668a36834fe", - "toolName": "reviewer_confirm", - "ts": "2026-07-03T18:06:22.894Z", - "descriptor": { - "type": "ui_request", - "id": "u15", - "phase": "F6", - "schema_version": 1, - "widget": "artifact-gate", - "title": "F6 — CTE 1 approvato: ablazioni_recenti?", - "artifact": { - "data": { - "colonne": [ - "cod_paz", - "num", - "data_ablazione" - ], - "file": "ctes/ablazioni_recenti.sql", - "latenza_ms": 184, - "note": "Tutte le data_ablazione ricadono nel range [2011-07-03, 2026-07-03]. Mantiene le chiavi cod_paz e num.", - "preview": "cod_paz | num | data_ablazione\n3758 | 5 | 2018-09-24\n8175 | 473 | 2025-05-19\n152185 | 3 | 2026-05-28\n20446 | 61 | 2018-05-14\n25492 | 3 | 2013-11-28\n4664 | 94 | 2016-05-31\n39149 | 2 | 2018-04-05\n7243 | 38 | 2012-12-12\n22310 | 9 | 2013-07-15\n4848 | 408 | 2011-10-05", - "scopo": "Ablazioni transcatetere (ablazione_transcatetere IS TRUE) con data ∈ [2011-07-03, 2026-07-03]", - "warning": "preview troncata a 10 righe" - }, - "kind": "cte" - }, - "action": { - "kind": "approve_reject", - "prompt": "Approvi o rifiuti?" - }, - "options": [ - { - "id": "approve", - "label": "Salva e procedi", - "recommended": true - }, - { - "id": "reject", - "label": "Rifiuta" - } - ], - "reserved": [ - "back", - "exit", - "other" - ] - }, - "real": { - "labels": [ - "Salva e procedi" - ], - "note": "CTE 'ablazioni_recenti' approvato (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." - } - }, - { - "callId": "call_25fb74e9370442f99381bd6c", - "toolName": "reviewer_confirm", - "ts": "2026-07-03T18:08:26.667Z", + "ts": "2026-07-06T18:35:55.156Z", "descriptor": { "type": "ui_request", "id": "u16", "phase": "F6", "schema_version": 1, "widget": "artifact-gate", - "title": "F6 — CTE 2 approvato: impianti_icd?", + "title": "F6 — CTE 4/4 pazienti_qualificati: OK (136 ms, una riga per paziente). Approvi?", "artifact": { "data": { - "colonne": [ + "columns": [ "cod_paz", - "num", - "data_impianto" + "num_ablazione", + "data_ablazione", + "num_icd", + "data_icd", + "intervallo_anni" ], - "file": "ctes/impianti_icd.sql", - "latenza_ms": 150, - "note": "Tutti gli impianti ICD iniziali (fact_impianto_defibrillatore_impiantabile) con data. Nessun filtro temporale qui: la finestra si applica all'ablazione (CTE3 applichera' i vincoli di sequenza).", - "preview": "cod_paz | num | data_impianto\n20930 | 3 | 2011-11-16\n20999 | 12 | 2012-08-31\n21245 | 2 | 2011-11-14\n21336 | 3 | 2011-11-23\n547500 | 1 | 2026-06-03\n21350 | 1 | 2011-11-21\n21356 | 2 | 2011-11-25\n21920 | 65 | 2023-07-12\n21980 | 2 | 2012-04-03\n22135 | 2 | 2012-04-23", - "scopo": "Impianti ICD iniziali con data", - "warning": "preview troncata a 10 righe" + "execution_ms": 136, + "logic": "DISTINCT ON (cod_paz) ORDER BY cod_paz, data_ablazione ASC, data_icd ASC -> una riga per paziente: prima ablazione qualificata + suo primo ICD successivo entro 10 anni (assunzione 'una riga per paziente')", + "name": "pazienti_qualificati", + "note": "cod_paz unici nell'output (deduplicazione OK). Demographics (cognome, data_nascita) si aggiungono nel SELECT finale (F7) via dim_patient + dim_time.", + "row_sample": "10 (preview troncata)", + "sample": [ + "1423 | abl 2 (2013-10-30) | icd 15 (2015-04-29) | 1.49 anni", + "2054 | abl 5 (2011-12-06) | icd 47 (2017-12-18) | 6.03", + "5659 | abl 113 (2013-11-25) | icd 148 (2023-10-05) | 9.86", + "9234 | abl 340 (2014-02-19) | icd 396 (2014-04-16) | 0.15" + ], + "status": "ok", + "vpn_note": "Test riuscito dopo riconnessione VPN (era caduta a metà sessione).", + "warnings": [ + "righe = limit: risultato troncato dalla preview" + ] }, - "kind": "cte" + "kind": "cte", + "version": 1 }, "action": { "kind": "approve_reject", @@ -4383,37 +1015,36 @@ "labels": [ "Salva e procedi" ], - "note": "CTE 'impianti_icd' approvato (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "CTE 'pazienti_qualificati' approvato (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } }, { - "callId": "call_63bceb9c3a274d90a3de9b6c", + "callId": "call_25e5ad6bfeee477a8be90409", "toolName": "reviewer_confirm", - "ts": "2026-07-03T18:09:45.451Z", + "ts": "2026-07-06T18:36:42.431Z", "descriptor": { "type": "ui_request", "id": "u17", "phase": "F6", "schema_version": 1, "widget": "artifact-gate", - "title": "F6 — CTE 3 approvato: sequenze_abl_imp?", + "title": "F6 — Chiusura CTE: 4/4 approvati. Confermi e passo a F7 (SQL finale)?", "artifact": { "data": { - "colonne": [ - "cod_paz", - "num_ablazione", - "data_ablazione", - "num_impianto", - "data_impianto" + "artifacts": [ + "cte_plan.json (4 CTE)", + "ctes/ablazioni_recenti.sql", + "ctes/impianti_icd.sql", + "ctes/sequenze_ablazione_icd.sql", + "ctes/pazienti_qualificati.sql", + "cte_tests.json" ], - "file": "ctes/sequenze_abl_imp.sql", - "latenza_ms": 119, - "note": "Tutte le coppie soddisfano impianto > ablazione e <= ablazione+10 anni; tutte le data_ablazione nel range. Il paziente 17445 compare due volte (2 ablazioni 670/675 -> stesso impianto 681): la deduplicazione e' demandata al CTE 4.", - "preview": "cod_paz | num_abl | data_ablazione | num_imp | data_impianto\n9234 | 340 | 2014-02-19 | 396 | 2014-04-16\n10775 | 6 | 2014-01-21 | 47 | 2014-07-08\n1423 | 2 | 2013-10-30 | 15 | 2015-04-29\n177191 | 3 | 2020-08-04 | 5 | 2020-09-23\n384737 | 1 | 2022-02-22 | 2 | 2022-02-23\n17445 | 675 | 2014-10-14 | 681 | 2017-01-26\n21060 | 3 | 2011-10-10 | 8 | 2012-03-22\n48477 | 2 | 2018-10-30 | 7 | 2019-04-03\n25198 | 2 | 2013-09-30 | 12 | 2014-03-08\n17445 | 670 | 2013-11-18 | 681 | 2017-01-26", - "scopo": "Coppie qualificanti ablazione -> impianto (su cod_paz, impianto dopo e <= 10 anni)", - "warning": "preview troncata a 10 righe" + "cte_chain": "ablazioni_recenti -> impianti_icd -> sequenze_ablazione_icd (join cod_paz, ICD dopo ablazione entro 10 anni) -> pazienti_qualificati (DISTINCT ON, una riga per paziente)", + "next_phase": "F7 (SQL finale)", + "tested": "4/4 CTE approvati a runtime (CTE 4 dopo riconnessione VPN)" }, - "kind": "cte" + "kind": "phase6_recap", + "version": 1 }, "action": { "kind": "approve_reject", @@ -4440,117 +1071,7 @@ "labels": [ "Salva e procedi" ], - "note": "CTE 'sequenze_abl_imp' approvato (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." - } - }, - { - "callId": "call_8ca58e2bd26a42b9bd46ff95", - "toolName": "reviewer_confirm", - "ts": "2026-07-03T18:13:28.565Z", - "descriptor": { - "type": "ui_request", - "id": "u18", - "phase": "F6", - "schema_version": 1, - "widget": "artifact-gate", - "title": "F6 — CTE 4 approvato: pazienti_qualificati?", - "artifact": { - "data": { - "colonne": [ - "cod_paz", - "num_ablazione", - "data_ablazione", - "num_impianto", - "data_impianto", - "gap_anni" - ], - "file": "ctes/pazienti_qualificati.sql", - "latenza_ms": 137, - "note": "Verifica aggiuntiva con COUNT: 352 pazienti qualificati = 352 cod_paz DISTINCT (deduplicazione OK, una riga per paziente). gap_anni = DATE_PART('year', AGE(data_impianto, data_ablazione)); tutte le coppie con gap <= 10 anni e ablazione nel range.", - "preview": "cod_paz | num_abl | data_ablazione | num_imp | data_impianto | gap_anni\n1423 | 17 | 2015-04-23 | 15 | 2015-04-29 | 0\n1465 | 4 | 2012-03-05 | 162 | 2013-07-29 | 1\n1900 | 8 | 2013-06-19 | 333 | 2018-01-25 | 4\n2054 | 5 | 2011-12-06 | 47 | 2017-12-18 | 6\n5185 | 41 | 2016-04-05 | 58 | 2022-10-13 | 6\n5325 | 16 | 2013-05-21 | 36 | 2017-03-01 | 3\n5556 | 5 | 2011-07-04 | 8 | 2011-10-27 | 0\n5659 | 139 | 2017-12-04 | 148 | 2023-10-05 | 5\n8104 | 22 | 2011-11-21 | 25 | 2012-02-27 | 0\n9234 | 340 | 2014-02-19 | 396 | 2014-04-16 | 0", - "scopo": "Una riga per paziente (DISTINCT cod_paz, ablazione piu' recente) + gap in anni", - "totale_pazienti": 352, - "warning": "preview troncata a 10 righe su 352" - }, - "kind": "cte" - }, - "action": { - "kind": "approve_reject", - "prompt": "Approvi o rifiuti?" - }, - "options": [ - { - "id": "approve", - "label": "Salva e procedi", - "recommended": true - }, - { - "id": "reject", - "label": "Rifiuta" - } - ], - "reserved": [ - "back", - "exit", - "other" - ] - }, - "real": { - "labels": [ - "Salva e procedi" - ], - "note": "CTE 'pazienti_qualificati' approvato (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." - } - }, - { - "callId": "call_914b32b53159407db91f8f27", - "toolName": "reviewer_confirm", - "ts": "2026-07-03T18:14:05.032Z", - "descriptor": { - "type": "ui_request", - "id": "u19", - "phase": "F6", - "schema_version": 1, - "widget": "artifact-gate", - "title": "Fase 6 completata — passo alla Fase 7 (SQL finale)?", - "artifact": { - "data": { - "ctes_approvati": [ - "ablazioni_recenti", - "impianti_icd", - "sequenze_abl_imp", - "pazienti_qualificati" - ], - "totale_pazienti_qualificati": 352 - }, - "kind": "cte_plan_done" - }, - "action": { - "kind": "approve_reject", - "prompt": "Approvi o rifiuti?" - }, - "options": [ - { - "id": "approve", - "label": "Salva e procedi", - "recommended": true - }, - { - "id": "reject", - "label": "Rifiuta" - } - ], - "reserved": [ - "back", - "exit", - "other" - ] - }, - "real": { - "labels": [ - "Salva e procedi" - ], - "note": "Fase approvata (sessione 2026-07-03-170732-fammi-la-lista-dei-pazienti-che-negli-ul)." + "note": "Fase approvata (sessione 2026-07-06-175012-lista-dei-pazienti-che-negli-ultimi-15-a)." } } ]