← italian-investorCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to italian-investor
Snapshot Sep 30, 2026 · 23:15 UTC · version 0.5.1
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "italian-investor",
"description": "Analisi di portafoglio tax-aware per residenti fiscali italiani. Da usare quando si analizza un portafoglio (ETF, azioni, BTP, obbligazioni, certificates), si simula una vendita o un ribilanciamento, si ragiona su minusvalenze/zainetto fiscale, successione o imposte su strumenti finanziari italiani. Impone verifica su fonti primarie invece che memoria del modello.",
"included_files": [
{
"relative_path": "examples/lotti-esempio.csv",
"size_in_bytes": 123
},
{
"relative_path": "examples/lotti-portafoglio-esempio.csv",
"size_in_bytes": 356
},
{
"relative_path": "examples/portafoglio-esempio.csv",
"size_in_bytes": 821
},
{
"relative_path": "examples/strumenti-registry-esempio.csv",
"size_in_bytes": 103
},
{
"relative_path": "examples/zainetto-esempio.csv",
"size_in_bytes": 166
},
{
"relative_path": "references/eventi-fiscali.md",
"size_in_bytes": 5477
},
{
"relative_path": "references/fiscalita.md",
"size_in_bytes": 11702
},
{
"relative_path": "references/fonti.md",
"size_in_bytes": 7817
},
{
"relative_path": "references/regole-correnti.md",
"size_in_bytes": 5712
},
{
"relative_path": "references/strategie-fiscali.md",
"size_in_bytes": 10653
},
{
"relative_path": "scripts/cost_basis.py",
"size_in_bytes": 12556
},
{
"relative_path": "scripts/event_tax.py",
"size_in_bytes": 11227
},
{
"relative_path": "scripts/instrument_resolver.py",
"size_in_bytes": 10340
},
{
"relative_path": "scripts/lot_sale.py",
"size_in_bytes": 6304
},
{
"relative_path": "scripts/portfolio.py",
"size_in_bytes": 31714
},
{
"relative_path": "scripts/portfolio_basis.py",
"size_in_bytes": 5676
},
{
"relative_path": "scripts/portfolio_lots.py",
"size_in_bytes": 5288
},
{
"relative_path": "scripts/portfolio_validator.py",
"size_in_bytes": 7357
},
{
"relative_path": "scripts/successione.py",
"size_in_bytes": 5537
},
{
"relative_path": "scripts/tax_engine.py",
"size_in_bytes": 16664
},
{
"relative_path": "scripts/zainetto.py",
"size_in_bytes": 7134
},
{
"relative_path": "tests/casi_fiscali.json",
"size_in_bytes": 11778
},
{
"relative_path": "tests/casi_successione.json",
"size_in_bytes": 2479
},
{
"relative_path": "tests/run_extended_tests.py",
"size_in_bytes": 12746
},
{
"relative_path": "tests/run_support_tests.py",
"size_in_bytes": 8586
},
{
"relative_path": "tests/run_tests.py",
"size_in_bytes": 3086
}
],
"skill_md_contents": "---\r\nname: italian-investor\r\ndescription: Analisi di portafoglio tax-aware per residenti fiscali italiani. Da usare quando si analizza un portafoglio (ETF, azioni, BTP, obbligazioni, certificates), si simula una vendita o un ribilanciamento, si ragiona su minusvalenze/zainetto fiscale, successione o imposte su strumenti finanziari italiani. Impone verifica su fonti primarie invece che memoria del modello.\r\n---\r\n\r\n# Italian Investor\r\n\r\nAnalisi di portafoglio per un residente fiscale italiano, con la fiscalità\r\ntrattata come **dato da verificare**, non come conoscenza del modello.\r\n\r\nLa skill contiene una procedura anti-allucinazione e motori Python deterministici.\r\nIl modello interpreta e spiega; non deve inventare norme, classificazioni di\r\nstrumenti, basi fiscali o aritmetica.\r\n\r\n## Regola zero\r\n\r\nNon usare mai la memoria interna del modello per:\r\n\r\n- aliquote vigenti e basi imponibili;\r\n- trattamento fiscale di uno strumento o di uno specifico evento;\r\n- compensabilità e scadenza delle minusvalenze;\r\n- criterio di determinazione della base fiscale/ordine dei lotti;\r\n- imposta di successione e costo fiscale dell'erede;\r\n- obblighi dichiarativi, monitoraggio, bollo, IVAFE o imposte di transazione;\r\n- caratteristiche di prodotto (TER, duration, holdings, valuta, ISIN,\r\n percentuale di titoli pubblici agevolati).\r\n\r\nSe non trovi una fonte autorevole: scrivi `NON VERIFICATO` e blocca la\r\nconclusione che ne dipende.\r\n\r\n## Procedura obbligatoria\r\n\r\n1. **Qualità dati.** Esegui `scripts/portfolio_validator.py`. Non correggere\r\n silenziosamente quantità, prezzi, duplicati, unità obbligazionarie o ISIN.\r\n2. **Profilo.** Verifica residenza fiscale, regime (amministrato / dichiarativo /\r\n gestito), broker, anno fiscale e zainetto per anno di realizzo.\r\n3. **Strumento.** Parti da `ISIN → natura giuridica`. Il `tipo` del CSV è una\r\n dichiarazione, non una prova. Usa `instrument_resolver.py` e un registry\r\n verificato su KID/prospetto.\r\n4. **Evento.** Identifica vendita, rimborso, cedola, interesse, dividendo,\r\n distribuzione o successione. Non esiste una sola categoria fiscale per\r\n strumento. Usa `event_tax.py` per i flussi periodici coperti e\r\n `tax_engine.py` per le vendite semplici.\r\n5. **Base fiscale.** Prima di usare `pmc`, determina il criterio applicabile.\r\n Nei casi coperti il lot engine usa CMP in amministrato e LIFO in\r\n dichiarativo. ETF/OICR non vengono assimilati automaticamente.\r\n6. **Lotti di posizione.** Per vendite parziali azionabili usa un dataset\r\n `ISIN + broker + data_acquisto + quantità + costo`. Passalo a\r\n `portfolio.py ribilancia --lotti-posizioni-csv ...`. Il motore verifica che\r\n la somma dei lotti coincida con la quantità del portfolio.\r\n7. **Riconciliazione.** Se hai sia portfolio sia lotti, esegui\r\n `portfolio_basis.py` prima di fidarti del PMC. Una differenza tra costo da\r\n PMC e costo ricostruito dai lotti non va corretta automaticamente: può\r\n dipendere da commissioni, trasferimenti, corporate action, valuta o dati\r\n broker e va spiegata.\r\n8. **Zainetto.** Preferisci il CSV strutturato `broker,regime,anno_realizzo,importo`.\r\n In amministrato usa solo minus compatibili con intermediario/regime/scadenza;\r\n in dichiarativo i lotti dichiarativi possono essere aggregati anche se\r\n originati da intermediari diversi, nei casi previsti.\r\n9. **Valuta e flussi esteri.** Distingui valuta di esposizione da valuta\r\n fiscalmente rilevante. Per redditi esteri verifica Paese, ritenuta,\r\n convenzione, intermediario e doppia imposizione prima del calcolo.\r\n10. **Fonti.** Per ogni conclusione fiscale rilevante recupera una fonte corrente\r\n secondo `references/fonti.md`. Verifica la vigenza per il periodo d'imposta.\r\n11. **Tax drag.** Considera imposta immediata, bollo/IVAFE se applicabili,\r\n ritenute estere non recuperabili, imposte di transazione, commissioni,\r\n spread e cambio.\r\n12. **Separazione.** Distingui sempre `dato → legge → calcolo → opinione`.\r\n13. **Claim audit.** Chiudi ogni analisi con la tabella di audit.\r\n14. **Stop.** Se manca un dato che può cambiare la conclusione, non stimarlo.\r\n\r\n## Riferimenti\r\n\r\n- `references/fonti.md` — gerarchia fonti e controllo di vigenza.\r\n- `references/fiscalita.md` — redditi di capitale/diversi, titoli pubblici,\r\n OICR, zainetto, successione.\r\n- `references/eventi-fiscali.md` — routing per vendita, dividendo, cedola,\r\n interesse e distribuzione OICR.\r\n- `references/strategie-fiscali.md` — base fiscale, multi-ISIN, ordine\r\n operazioni, trasferimenti broker, valuta, redditi esteri, Tobin tax, tax drag.\r\n- `references/regole-correnti.md` — snapshot di valori variabili nel tempo.\r\n\r\n## Flusso operativo consigliato\r\n\r\n```text\r\nportfolio.csv\r\n ↓\r\nportfolio_validator.py\r\n ↓\r\nregistry ISIN verificato + policy freschezza\r\n ↓\r\nevento fiscale\r\n ↓\r\nlotti posizione → riconciliazione PMC/base fiscale\r\n ↓\r\nregime + zainetto\r\n ↓\r\nmotore deterministico\r\n ↓\r\ninterpretazione + claim audit + fonti\r\n```\r\n\r\n## Script principali\r\n\r\nTutti gli script sono stdlib-only e stampano JSON.\r\n\r\n```bash\r\n# Qualità dati\r\npython scripts/portfolio_validator.py valida portafoglio.csv\r\n\r\n# Analisi portfolio\r\npython scripts/portfolio.py analizza portafoglio.csv\r\n\r\n# Registry ISIN con controllo opzionale di freschezza\r\npython scripts/instrument_resolver.py resolve \\\r\n --isin US0378331005 --tipo azione --registry strumenti.csv \\\r\n --max-age-giorni 365 --data-riferimento 2026-08-31\r\n\r\n# Zainetto\r\npython scripts/zainetto.py stato zainetto.csv --anno-fiscale 2026\r\n\r\n# Base fiscale CMP/LIFO e stato residuo\r\npython scripts/cost_basis.py calcola lotti.csv --metodo lifo --quantita 15\r\npython scripts/cost_basis.py consuma lotti.csv --metodo lifo --quantita 15\r\n\r\n# Vendita singola lot-aware\r\npython scripts/lot_sale.py vendita --tipo azione --regime dichiarativo \\\r\n --lotti lotti.csv --prezzo 140 --quantita 15\r\n\r\n# Dataset lotti multi-posizione\r\npython scripts/portfolio_lots.py lotti-portafoglio.csv\r\n\r\n# Riconcilia PMC del portfolio con la base ricostruita dai lotti\r\npython scripts/portfolio_basis.py portafoglio.csv lotti-portafoglio.csv\r\n\r\n# Ribilanciamento con zainetto + lotti reali per ISIN/broker\r\npython scripts/portfolio.py ribilancia portafoglio.csv \\\r\n --target azionario=70,obbligazionario=25,liquidita=5 \\\r\n --zainetto-csv zainetto.csv --anno-fiscale 2026 \\\r\n --regime dichiarativo \\\r\n --lotti-posizioni-csv lotti-portafoglio.csv\r\n\r\n# Evento periodico\r\npython scripts/event_tax.py provento --tipo azione --evento dividendo --lordo 100\r\npython scripts/event_tax.py provento --tipo etf --evento distribuzione \\\r\n --lordo 100 --quota-stato 0.30\r\n\r\n# Successione nei casi coperti\r\npython scripts/successione.py costo --tipo titolo_stato \\\r\n --esente-successione --valore-normale 10250\r\n```\r\n\r\n## Dataset portfolio\r\n\r\nColonne richieste:\r\n\r\n```text\r\nisin,nome,tipo,quantita,pmc,prezzo,asset_class\r\n```\r\n\r\nConsigliate:\r\n\r\n```text\r\nvaluta_esposizione,valuta_quotazione,area,settore,broker,quota_stato\r\n```\r\n\r\nPer obbligazioni `quantita` è il valore nominale; `pmc` e `prezzo` sono in\r\nfrazione (`101,30` → `1.0130`).\r\n\r\nLo stesso ISIN su broker diversi resta separato fiscalmente, ma HHI/top-5 sono\r\naggregati per ISIN per rappresentare la concentrazione economica reale.\r\n\r\n## Dataset lotti di posizione\r\n\r\nPer vendite parziali di azioni, obbligazioni, titoli pubblici e certificates nei\r\ncasi coperti usa:\r\n\r\n```text\r\nisin,broker,data_acquisto,quantita,costo_unitario_eur,costi_acquisto_eur\r\nUS0378331005,BrokerA,2024-01-10,20,130,2\r\nUS0378331005,BrokerA,2026-06-10,20,160,2\r\n```\r\n\r\nRegole operative:\r\n\r\n- `ISIN + broker` identifica la posizione fiscale simulata;\r\n- la somma delle quantità dei lotti deve coincidere con la quantità del portfolio;\r\n- i costi devono essere già convertiti in EUR con il cambio fiscalmente\r\n rilevante verificato;\r\n- ogni strategia di ribilanciamento riparte dagli stessi lotti iniziali;\r\n- all'interno di una strategia i lotti vengono consumati operazione per\r\n operazione e lo stato residuo viene riportato nell'output;\r\n- in CMP il residuo è un pool simulato che mantiene il costo medio: non usarlo\r\n per inferire un successivo LIFO dopo un cambio di regime;\r\n- ETF/OICR restano fuori dal routing automatico CMP/LIFO.\r\n\r\nEsempio: `examples/lotti-portafoglio-esempio.csv`.\r\n\r\n## Riconciliazione PMC / base fiscale\r\n\r\n`scripts/portfolio_basis.py` confronta, per ogni posizione coperta dal lot\r\nengine:\r\n\r\n```text\r\nquantità portfolio vs quantità lotti\r\nPMC dichiarato vs costo medio ricostruito\r\ncosto totale da PMC vs costo totale dei lotti\r\ndifferenza in euro\r\n```\r\n\r\nÈ un controllo, non una correzione automatica. Se i due costi divergono, marca\r\nla posizione `verificare_pmc_e_base_fiscale` e cerca la causa prima di usare il\r\nvalore in una simulazione azionabile. ETF/OICR restano esplicitamente fuori da\r\nquesta riconciliazione automatica.\r\n\r\n## Base fiscale e ribilanciamento\r\n\r\nIl campo `pmc` è un input operativo, **non una prova della base fiscale**.\r\n\r\nNei casi coperti:\r\n\r\n- amministrato → costo medio ponderato;\r\n- dichiarativo → LIFO;\r\n- `lot_sale.py` collega la base da lotti al `tax_engine.py`;\r\n- `portfolio.py` può consumare lotti e zainetto nello stesso scenario;\r\n- la strategia tax-aware ordina le vendite usando la base fiscale dello\r\n scenario, senza mutare i lotti delle strategie alternative.\r\n\r\nSe `--lotti-posizioni-csv` non è fornito, `portfolio.py` mantiene la modalità\r\nlegacy basata sul PMC e lo dichiara esplicitamente. In dichiarativo una vendita\r\nparziale basata solo sul PMC non va presentata come definitiva.\r\n\r\n## Evento fiscale prima della categoria\r\n\r\nEsempi coperti:\r\n\r\n```text\r\nazione + vendita -> reddito diverso\r\nazione + dividendo -> reddito di capitale\r\nobbligazione + vendita -> reddito diverso\r\nobbligazione + cedola -> reddito di capitale\r\ntitolo pubblico + vendita -> reddito diverso con disciplina agevolata\r\ntitolo pubblico + cedola -> reddito di capitale agevolato\r\nETF/OICR + distribuzione -> reddito di capitale\r\n```\r\n\r\nPer una fonte estera `event_tax.py` fa hard-stop anche se l'utente non ha già\r\nindicato una ritenuta: il Paese estero basta a richiedere la verifica della\r\ndoppia imposizione.\r\n\r\n## Registry strumenti e freschezza\r\n\r\nFormato:\r\n\r\n```text\r\nisin,tipo,fonte,verificato_il\r\n```\r\n\r\n`verificato_il` deve essere ISO `YYYY-MM-DD`. `--max-age-giorni` è opzionale e\r\nnon ha un default implicito: quando viene impostato, una voce troppo vecchia o\r\ncon data futura rispetto a `--data-riferimento` diventa non azionabile.\r\n\r\nRiconoscere il tipo non implica che il motore conosca automaticamente la sua\r\nfiscalità: ETC/ETN, OICR non armonizzati, cripto, PIR e previdenza possono essere\r\nidentificati dal resolver e restare in hard-stop fiscale.\r\n\r\n## Zainetto strutturato\r\n\r\nFormato:\r\n\r\n```text\r\nbroker,regime,anno_realizzo,importo\r\nDirecta,amministrato,2022,500\r\nDirecta,amministrato,2024,1200\r\nIBKR,dichiarativo,2023,800\r\n```\r\n\r\nIn amministrato il broker limita i lotti utilizzabili. In dichiarativo il\r\nsimulatore può aggregare i lotti marcati dichiarativo anche se provengono da\r\nintermediari diversi. Il motore consuma prima le scadenze più vicine: è una\r\nstrategia di simulazione, non una regola contabile attribuita al broker.\r\n\r\n## Output incompleto\r\n\r\nQuando manca un dato necessario, il motore preferisce `null`, scenario min/max\r\no hard-stop alla falsa precisione. Esempi:\r\n\r\n- `quota_stato` mancante su OICR;\r\n- lotti mancanti o quantità incoerenti;\r\n- più lotti LIFO nella stessa data con vendita parziale e ordine intraday ignoto;\r\n- ritenute/redditi esteri senza disciplina verificata;\r\n- strumento identificato ma fiscalità prodotto-specifica non verificata.\r\n\r\n## Claim audit obbligatoria\r\n\r\n| Affermazione | Tipo | Fonte | Data fonte | Confidenza |\r\n| --- | --- | --- | --- | --- |\r\n| ... | dato / legge / calcolo / opinione | ... | ... | Alta/Media/Bassa |\r\n\r\nUna riga per ogni affermazione che può influenzare una decisione. Se fonte o\r\nconfidenza non sono adeguate, marca la conclusione come non azionabile.\r\n\r\n## Test\r\n\r\n```bash\r\npython tests/run_tests.py\r\npython tests/run_support_tests.py\r\npython tests/run_extended_tests.py\r\n```\r\n\r\nLa CI esegue anche smoke test del flusso portfolio, compresi ribilanciamento con\r\nzainetto + lotti e riconciliazione PMC/base fiscale, e verifica l'allineamento\r\ndelle versioni dei manifest.\r\n\r\n## Limiti\r\n\r\nQuesta skill produce **analisi e simulazioni**, non consulenza finanziaria né\r\nfiscale. Le imposte effettive in amministrato restano quelle determinate\r\ndall'intermediario. Non suggerire operazioni motivate soltanto dal recupero di\r\nminusvalenze.\r\n"
}SHA-256: 1f617f242a653a0661a79d6409eed7729707eaef10d800186f095d10ffda16e1