<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Omar Baruzzo</title>
    <description>The latest articles on DEV Community by Omar Baruzzo (@omarbaruzzo).</description>
    <link>https://dev.to/omarbaruzzo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3871271%2F50981d31-31ef-4f39-90a0-68f15adc1f24.png</url>
      <title>DEV Community: Omar Baruzzo</title>
      <link>https://dev.to/omarbaruzzo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omarbaruzzo"/>
    <language>en</language>
    <item>
      <title>Audit je fotografija, test suite je navika</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:19:56 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/audit-je-fotografija-test-suite-je-navika-nc6</link>
      <guid>https://dev.to/omarbaruzzo/audit-je-fotografija-test-suite-je-navika-nc6</guid>
      <description>&lt;p&gt;Ukratko: audit pokriva jedan commit. Unit, fork i invariant testovi u CI-ju drže sljedeći commit pouzdanim.&lt;/p&gt;

&lt;p&gt;Audit smart contracta pregledava jednu verziju koda, u jednom trenutku, a pregledavaju ga ljudi koji ga nisu napisali. To je vrijedan posao i to je ujedno fotografija. Ne govori ništa o sljedećem commitu, a kod će ih imati mnogo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Što audit ne pokriva
&lt;/h2&gt;

&lt;p&gt;Nakon isporuke reporta kod se i dalje mijenja. Digne se dependency, prilagodi se fee parametar, doda se funkcija za jednog klijenta, deployment skripta se izmijeni u zadnji čas. Nijednu od tih promjena ne opisuje dokument star tri mjeseca. Audit ostaje istinit za verziju koju je pregledao, a o verziji koja je stvarno deployana govori sve manje sa svakom promjenom od tada. To je obični život svakog codebasea i zato jedan datiran izvještaj ne može biti jedini dokaz da se ugovor ponaša kako treba. Pitanje koje revizor treba postaviti nije postoji li audit, nego koliki dio deployanog koda on još opisuje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tri vrste testova koje nose audit dalje
&lt;/h2&gt;

&lt;p&gt;Unit testovi provjeravaju svaku funkciju zasebno i čine osnovu. Fork testovi pokreću ugovore nad kopijom stvarnog stanja chaina, pa se integracija s već deployanim protokolima provjerava, a ne pretpostavlja. Invariant testovi izriču svojstva koja moraju vrijediti što god se dogodilo: zbroj balansa jednak je ukupnoj ponudi, nitko ne može podići više nego što je uplatio, pauzirani ugovor ne prima transfere. Fuzzer zatim generira nizove poziva koji ta svojstva pokušavaju slomiti, uključujući nizove na koje nitko iz tima nije pomislio. Alati poput Foundryja i Hardhata podržavaju sva tri stila.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testovi i za ono što nije logika ugovora
&lt;/h2&gt;

&lt;p&gt;Mnogi incidenti u produkciji dolaze iz deploya i upgradea, a ne iz logike koju je audit pročitao. U suite stavite deployment skripte, argumente constructora i initializera te upgrade put. Sve pokrećite u continuous integrationu na svaku promjenu, tako da invariant koji pada zaustavi release jednako kao što bi to učinio neuspjeli unit test u bilo kojem drugom projektu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako iskoristiti auditora
&lt;/h2&gt;

&lt;p&gt;Tražite od auditora da svaki finding preda kao reprodukciju i pretvorite ga u test koji pada prije nego ga popravite. Finding koji postane test ne vraća se neprimijećen. Pitajte i koje je invariante pretpostavio dok je čitao kod te ih zapišite kao testove. Nastaje suite koji bilježi što je audit naučio, pa sljedeći revizor kreće odatle, a ne od nule. Za tvrtke u regiji koje rade za strane klijente i partnere to je i dokaz: partner neće pitati samo imate li audit, nego i što se dogodilo nakon njega.&lt;/p&gt;

&lt;p&gt;Pravilo je kratko. Audit je prekretnica, a test suite je proces. Koji invariant vašeg ugovora danas nije zapisan kao test?&lt;/p&gt;

&lt;p&gt;Cijeli tekst: &lt;a href="https://www.omarbaruzzo.it/hr/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;cijelo obrazloženje na blogu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/hr/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/hr/blog/un-audit-non-e-una-suite-di-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>Un audit è una fotografia, una suite di test è un'abitudine</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:17:48 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/un-audit-e-una-fotografia-una-suite-di-test-e-unabitudine-3jkd</link>
      <guid>https://dev.to/omarbaruzzo/un-audit-e-una-fotografia-una-suite-di-test-e-unabitudine-3jkd</guid>
      <description>&lt;p&gt;In breve: l'audit copre un commit. Unit, fork e invariant test, eseguiti nella CI, tengono onesto il commit successivo.&lt;/p&gt;

&lt;p&gt;L'audit di uno smart contract esamina una versione del codice, in un momento preciso, da persone che non l'hanno scritto. È un lavoro prezioso, ed è anche una fotografia. Non dice nulla sul commit successivo, e di commit il codice ne vedrà molti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa l'audit non copre
&lt;/h2&gt;

&lt;p&gt;Dopo la consegna del report il codice continua a cambiare. Si aggiorna una dipendenza, si ritocca un parametro di commissione, si aggiunge una funzione per un cliente, si modifica all'ultimo minuto uno script di deploy. Nessuna di queste modifiche è descritta da un documento datato tre mesi prima. L'audit resta vero per la versione che ha esaminato, e diventa meno informativo sulla versione effettivamente distribuita a ogni modifica fatta da allora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tre tipi di test che portano avanti l'audit
&lt;/h2&gt;

&lt;p&gt;Gli unit test controllano ogni funzione in isolamento e sono la base. I fork test eseguono i contratti su una copia dello stato reale della catena, così l'integrazione con protocolli già distribuiti si verifica e non si dà per scontata. Gli invariant test dichiarano proprietà che devono valere qualunque cosa accada: la somma dei saldi uguale alla fornitura totale, nessuno che prelevi più di quanto ha versato, un contratto in pausa che non accetta trasferimenti. Un fuzzer genera poi sequenze di chiamate che cercano di romperle, comprese sequenze a cui nessuno del team aveva pensato. Strumenti come Foundry e Hardhat supportano tutti e tre gli stili.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test anche per ciò che non è logica del contratto
&lt;/h2&gt;

&lt;p&gt;Molti incidenti in produzione nascono dal deploy e dall'upgrade, non dalla logica letta dall'audit. Mettete nella suite gli script di deploy, gli argomenti del costruttore e dell'inizializzatore, e il percorso di upgrade. Eseguite tutto nella integrazione continua a ogni modifica, in modo che un invariante che fallisce fermi un rilascio come farebbe un unit test in qualsiasi altro progetto .NET.&lt;/p&gt;

&lt;h2&gt;
  
  
  Come usare l'auditor
&lt;/h2&gt;

&lt;p&gt;Chiedete all'auditor di consegnare ogni finding come riproduzione, e trasformatelo in un test che fallisce prima di correggerlo. Un finding diventato test non torna inosservato. Chiedete anche quali invarianti ha dato per assunti leggendo il codice, e scrivetele come test. Ne esce una suite che registra ciò che l'audit ha imparato, così il prossimo revisore parte da lì e non da zero. Per una software house che consegna a una PMI conta anche questo: la suite e gli script fanno parte della consegna, altrimenti il cliente eredita un audit e nessun modo di accorgersi che il codice è cambiato.&lt;/p&gt;

&lt;p&gt;La regola è breve. L'audit è una tappa, la suite di test è il processo. Quale invariante del vostro contratto oggi non è scritta come test?&lt;/p&gt;

&lt;p&gt;Testo completo: &lt;a href="https://www.omarbaruzzo.it/it/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;il ragionamento completo sul blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/it/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/it/blog/un-audit-non-e-una-suite-di-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>An audit is a photograph, a test suite is a habit</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:15:15 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/an-audit-is-a-photograph-a-test-suite-is-a-habit-1f7p</link>
      <guid>https://dev.to/omarbaruzzo/an-audit-is-a-photograph-a-test-suite-is-a-habit-1f7p</guid>
      <description>&lt;p&gt;TL;DR: an audit covers one commit. Unit, fork and invariant tests, run in CI, are what keep the next commit honest.&lt;/p&gt;

&lt;p&gt;A smart contract audit reviews one version of the code, at one moment, by people who did not write it. That is valuable work, and it is also a photograph. It says nothing about the next commit, and the code will have many of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the audit does not cover
&lt;/h2&gt;

&lt;p&gt;After the report is delivered, the code keeps changing. A dependency is updated, a fee parameter is adjusted, a function is added for one customer, a deployment script is edited at the last minute. None of these changes is described by a document dated three months earlier. The audit remains true about the version it examined, and becomes less informative about the version that is actually deployed with every change made since. This is the ordinary life of any codebase, and it is why a single dated report cannot be the only evidence that a contract behaves as intended. The question a reviewer should ask is not whether an audit exists, but how much of the deployed code it still describes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of test that carry the audit forward
&lt;/h2&gt;

&lt;p&gt;Unit tests check each function in isolation and are the baseline. Fork tests run your contracts against a copy of real chain state, so the integration with protocols that are already deployed is exercised rather than assumed. Invariant tests state properties that must hold whatever happens: the sum of balances equals the total supply, nobody can withdraw more than they deposited, a paused contract accepts no transfers. A fuzzer then generates sequences of calls that try to break each property, including sequences nobody on the team thought of. Tools such as Foundry and Hardhat support all three styles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tests for the parts that are not contract logic
&lt;/h2&gt;

&lt;p&gt;Many production incidents come from deployment and upgrade, not from the logic the audit read. Put the deployment scripts, the constructor and initializer arguments, and the upgrade path inside the suite. Run everything in continuous integration on every change, so that a failing invariant stops a release the same way a failing unit test would in any other codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use the auditor
&lt;/h2&gt;

&lt;p&gt;Ask the auditor to hand over each finding as a reproduction, and turn it into a failing test before fixing it. A finding that becomes a test does not come back unnoticed. Ask also which invariants they assumed while reading, and write those down as tests. The result is a suite that records what the audit learned, so the next reviewer starts from it instead of from zero.&lt;/p&gt;

&lt;p&gt;The rule is short. The audit is a milestone and the test suite is the process. Which invariant of your contract is not written down as a test today?&lt;/p&gt;

&lt;p&gt;Full text: &lt;a href="https://www.omarbaruzzo.it/en/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;the full argument on the blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/en/blog/un-audit-non-e-una-suite-di-test" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/en/blog/un-audit-non-e-una-suite-di-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>Kako obrisati ono što ste anchorali?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:14:25 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/kako-obrisati-ono-sto-ste-anchorali-2ppp</link>
      <guid>https://dev.to/omarbaruzzo/kako-obrisati-ono-sto-ste-anchorali-2ppp</guid>
      <description>&lt;p&gt;Ukratko: osobni podaci izvan chaina uz nasumični salt po zapisu; na chain ide samo commitment. Obrišete li podatak i salt, commitment ne pokazuje ni na što.&lt;/p&gt;

&lt;p&gt;Decision ledger je koristan jer se njegovi zapisi ne mogu naknadno mijenjati. Isto svojstvo postaje problem prvi put kad zapis sadrži osobne podatke, a netko traži njihovo brisanje. Odgovor se određuje pri projektiranju, prije prvog anchora, a ne nekim trikom na chainu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podijelite zapis na dva dijela
&lt;/h2&gt;

&lt;p&gt;Sadržaj ostaje u običnom storeu pod vašom kontrolom: tablica u bazi, object store, što god koristi ostatak sustava. Tamo žive osobni podaci i tamo se mogu ispraviti ili obrisati kao svi drugi podaci. Chain prima samo commitment na taj sadržaj: hash jednog zapisa ili root Merkle stabla nad više zapisa koji se anchoraju zajedno. Zapis u ledgeru kaže što se dogodilo i upućuje na record preko identifikatora, a proof povezuje to dvoje bez objavljivanja sadržaja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Običan hash nije dovoljan
&lt;/h2&gt;

&lt;p&gt;Hashiranje imena, email adrese ili OIB-a djeluje sigurno, a često nije. Prostor mogućih ulaza je malen: tko može pogoditi kandidate, može izračunati njihove hasheve i usporediti. Dodajte nasumični salt svakom recordu, generiran po zapisu, i čuvajte ga uz podatak u vanjskom storeu, nikada na chainu. Commitment postaje hash od salta i sadržaja. Bez salta se vrijednost na chainu ne može reproducirati iz pretpostavke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Što onda znači brisanje
&lt;/h2&gt;

&lt;p&gt;Kad se zahtjev za brisanje prihvati, iz vanjskog storea brišu se sadržaj i njegov salt. Commitment na chainu ostaje, ali ne ostaje ništa što bi se moglo ponovno izračunati da mu odgovara. To je broj koji ne pokazuje ni na što. Ledger i dalje pokazuje da je zapis postojao na određenoj visini, u određenom slijedu, i da slijed oko njega nije mijenjan. Revizor tako i dalje može provjeriti da povijest nije prepravljena, ali ne može iz chaina saznati što je u tom zapisu pisalo. Za većinu poslovnih slučajeva to je upravo željena granica: integritet ostaje javno provjerljiv, a osobni podaci ostaju tamo gdje se njima može upravljati.&lt;/p&gt;

&lt;h2&gt;
  
  
  Što gubite i što tek treba odlučiti
&lt;/h2&gt;

&lt;p&gt;Dvije posljedice treba zapisati u projekt. Prva: kad sadržaj nestane, nestaje i mogućnost da se dokaže što je pisalo. Brisanje i dokaz vuku u suprotnim smjerovima, a za neke zapise obveze čuvanja će reći što prevladava. Druga: smatra li se hash i dalje osobnim podatkom pravno je pitanje koje ovisi o slučaju, o ulazu i o tome što se još može povezati s njim. Tu procjenu daje službenik za zaštitu podataka (DPO), a ne arhitekt.&lt;/p&gt;

&lt;p&gt;Praktično pravilo je kratko. Prije prvog anchora odlučite koja polja bi se ikada mogla morati brisati, držite ih izvan chaina i zapišite proceduru brisanja uz dizajn ledgera. Poslije je to migracija.&lt;/p&gt;

&lt;p&gt;Koja polja u vašem ledgeru bi vam bilo žao što ste anchorali?&lt;/p&gt;

&lt;p&gt;Cijeli tekst: &lt;a href="https://www.omarbaruzzo.it/hr/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;cijeli obrazac brisanja&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/hr/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/hr/blog/cancellare-un-dato-ancorato&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>auditabilita</category>
    </item>
    <item>
      <title>Come si cancella ciò che si è ancorato?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:13:39 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/come-si-cancella-cio-che-si-e-ancorato-37jk</link>
      <guid>https://dev.to/omarbaruzzo/come-si-cancella-cio-che-si-e-ancorato-37jk</guid>
      <description>&lt;p&gt;In breve: dati personali fuori catena con un salt casuale per record; sulla catena solo l'impegno. Cancellati dato e salt, l'impegno non punta a niente.&lt;/p&gt;

&lt;p&gt;Un registro delle decisioni è utile perché le sue voci non si possono cambiare a posteriori. La stessa proprietà diventa un problema la prima volta che una voce contiene dati personali e qualcuno chiede di cancellarli. La risposta si decide in fase di progetto, prima del primo ancoraggio, e non è un trucco da fare sulla catena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dividere il record in due
&lt;/h2&gt;

&lt;p&gt;Il contenuto resta in un archivio ordinario sotto il vostro controllo: una tabella di database, un object store, quello che usa il resto del sistema. È lì che vivono i dati personali, e lì si possono correggere o cancellare come qualsiasi altro dato. La catena riceve solo un impegno verso quel contenuto: l'hash di una voce, o la radice di un albero di Merkle su molte voci ancorate insieme. La voce del registro dice cosa è successo e rimanda al record tramite identificativo, e la prova collega le due cose senza pubblicare il contenuto.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'hash semplice non basta
&lt;/h2&gt;

&lt;p&gt;Calcolare l'hash di un nome, di un indirizzo email o di un codice fiscale sembra sicuro, e spesso non lo è. Lo spazio degli input è piccolo: chi può indovinare dei candidati può calcolarne gli hash e confrontarli. Aggiungete un salt casuale a ogni record, generato per voce, e conservatelo accanto al dato nell'archivio esterno, mai sulla catena. L'impegno diventa l'hash di salt più contenuto. Senza il salt, il valore sulla catena non si riproduce partendo da un'ipotesi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa significa cancellare, allora
&lt;/h2&gt;

&lt;p&gt;Quando una richiesta di cancellazione viene accolta, si eliminano dall'archivio esterno il contenuto e il suo salt. L'impegno sulla catena resta, ma non rimane più nulla che si possa ricalcolare per farlo coincidere. È un numero che non punta a niente. Il registro mostra ancora che una voce esisteva a una certa altezza, in una certa sequenza, e che la sequenza non è stata alterata attorno ad essa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa si perde, e cosa resta da decidere
&lt;/h2&gt;

&lt;p&gt;Due conseguenze vanno scritte nel progetto. La prima: una volta sparito il contenuto, sparisce anche la possibilità di provare cosa diceva. Cancellazione e prova tirano in direzioni opposte, e per alcuni record saranno gli obblighi di conservazione a dire quale prevale. La seconda: se un hash conta ancora come dato personale è una questione giuridica che dipende dal caso, dall'input e da cos'altro vi si può collegare. Quel giudizio spetta al responsabile della protezione dei dati, non a chi disegna l'architettura.&lt;/p&gt;

&lt;p&gt;La regola pratica è breve. Decidete prima del primo ancoraggio quali campi potrebbero dover essere cancellati, teneteli fuori dalla catena e scrivete la procedura di cancellazione insieme al progetto del registro. Dopo, è una migrazione.&lt;/p&gt;

&lt;p&gt;Quali campi del vostro registro vi pentireste di aver ancorato?&lt;/p&gt;

&lt;p&gt;Testo completo: &lt;a href="https://www.omarbaruzzo.it/it/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;lo schema di cancellazione per esteso&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/it/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/it/blog/cancellare-un-dato-ancorato&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>auditabilita</category>
    </item>
    <item>
      <title>How do you delete something you anchored?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:12:24 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/how-do-you-delete-something-you-anchored-2k8</link>
      <guid>https://dev.to/omarbaruzzo/how-do-you-delete-something-you-anchored-2k8</guid>
      <description>&lt;p&gt;TL;DR: personal data off-chain with a per-record random salt; only the commitment goes on-chain. Erase the data and the salt, and the commitment points at nothing.&lt;/p&gt;

&lt;p&gt;A decision ledger is useful because its entries cannot be changed after the fact. The same property becomes a problem the first time an entry contains personal data and someone asks for it to be erased. The answer is decided at design time, before the first anchor, and it is not a clever trick on the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Split the record in two
&lt;/h2&gt;

&lt;p&gt;Keep the content in an ordinary store that you control: a database table, an object store, whatever the rest of the system uses. This is where the personal data lives, and where it can be corrected or deleted like any other data. The chain receives only a commitment to that content: a hash of one entry, or the root of a Merkle tree over many entries anchored together. The ledger entry then says what happened and refers to the record by identifier, and the proof ties the two together without publishing the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  A plain hash is not enough
&lt;/h2&gt;

&lt;p&gt;Hashing a name, an email address or a tax code looks safe, and often is not. The input space is small, so anyone who can guess candidates can compute their hashes and compare. Add a random salt to each record, generated per entry, and store it next to the data in the off-chain store, never on the chain. The commitment becomes the hash of salt plus content. Without the salt, the value on the chain cannot be reproduced from a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  What deletion then means
&lt;/h2&gt;

&lt;p&gt;When an erasure request is accepted, delete the content and its salt from the off-chain store. The commitment on the chain remains, but nothing is left that can be recomputed to match it. It is a number that points at nothing. The ledger still shows that an entry existed at a given height, in a given sequence, and that the sequence was not altered around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you lose, and what you still need to decide
&lt;/h2&gt;

&lt;p&gt;Two consequences should be explicit in the design. First, once the content is gone, so is the ability to prove what it said. Erasure and evidence pull in opposite directions, and for some records the retention rules will say which one wins. Second, whether a hash still counts as personal data is a legal question that depends on the case, on the input and on what else can be linked to it. That judgment belongs to your data protection officer, not to the architect.&lt;/p&gt;

&lt;p&gt;The practical rule is short. Decide which fields may ever need deleting before the first anchor, keep those off the chain, and write down the erasure procedure together with the ledger design. Afterwards it is a migration.&lt;/p&gt;

&lt;p&gt;Which fields in your ledger would you regret having anchored?&lt;/p&gt;

&lt;p&gt;Full text: &lt;a href="https://www.omarbaruzzo.it/en/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;the erasure pattern in full&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/en/blog/cancellare-un-dato-ancorato" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/en/blog/cancellare-un-dato-ancorato&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>enterprise</category>
      <category>auditabilita</category>
    </item>
    <item>
      <title>Tko održava agenta nakon isporuke?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:23:04 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/tko-odrzava-agenta-nakon-isporuke-53d2</link>
      <guid>https://dev.to/omarbaruzzo/tko-odrzava-agenta-nakon-isporuke-53d2</guid>
      <description>&lt;p&gt;Ukratko: isporučite runbook, klijentov eval set, zaključane verzije s rollbackom, imenovanog primatelja alerta i čitljiv decision log.&lt;/p&gt;

&lt;p&gt;AI agent radi na dan isporuke. Hoće li raditi i nakon šest mjeseci ovisi o tome tko za njega odgovara i što ima u rukama. Handover je dio projekta, a ne sastanak na kraju.&lt;/p&gt;

&lt;h2&gt;
  
  
  Što se promijeni kad ga nitko ne dira
&lt;/h2&gt;

&lt;p&gt;Agenti se kvare i bez ikakvih izmjena. Provider modela ukine verziju, a alias na koji ste se oslanjali sada pokazuje na nešto drugo. Upstream API preimenuje ili makne polje. Dokumenti koje agent čita udalje se od onih na kojima je testiran: novi predlošci, nove šifre artikala, drugačiji način pisanja iste stvari. Ništa od toga ne vidi se na code reviewu jer se kod nije mijenjao. Vidi se kao greška pred klijentom, a prvi je obično primijeti netko tko ne zna zašto se dogodila.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pet stvari koje izlaze sa sustavom
&lt;/h2&gt;

&lt;p&gt;Prva je runbook. Kaže što agent smije raditi, što nikada ne smije, u koje sustave smije pisati i što učiniti kad se čudno ponaša. Pisan je za dežurnu osobu, a ne za programera koji ga je izgradio.&lt;/p&gt;

&lt;p&gt;Druga je eval set u vlasništvu klijenta. Ako pitanja i očekivani odgovori postoje samo na laptopu isporučitelja, klijent nakon promjene ne može ništa provjeriti. S setom u rukama može ga ponovno pokrenuti nakon ažuriranja modela, izmjene prompta ili nove serije dokumenata i usporediti s prošlim rezultatom.&lt;/p&gt;

&lt;p&gt;Treća su zaključane verzije uz zapisan rollback. Model, prompt i indeks bilježe se kao točne verzije, a put natrag na prethodnu kombinaciju je dokumentiran korak, a ne sjećanje.&lt;/p&gt;

&lt;p&gt;Četvrta je imenovana osoba za alerte koja nije autor sustava. Alert koji stigne u sandučić koji nitko ne čita jednak je kao da alerta nema.&lt;/p&gt;

&lt;p&gt;Peta je decision log, s načinom čitanja koji ne ovisi o isporučitelju. Kad netko pita zašto je agent nešto napravio u ožujku, odgovor ne smije tražiti telefonski poziv vama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kome stiže prva poruka
&lt;/h2&gt;

&lt;p&gt;Zamislite prvu obavijest o ukidanju verzije modela. Ako su eval set i zaključane verzije u rukama klijenta, to je stavka u kalendaru: zakaže se test, usporedi se i prijeđe na novu verziju. Ako nisu, to je hitnja koja pada na onoga tko je izgradio sustav, u trenutku koji nije birao. Za tvrtke koje rade za klijente u regiji i inozemstvu to je i pitanje marže, jer neograničena neformalna podrška rijetko je u cijeni. A revizor ili strani partner pitat će tko nadzire sustav nakon isporuke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Održavanje je projektno ograničenje
&lt;/h2&gt;

&lt;p&gt;Ugovor o podršci dodan nakon isporuke ne popravlja sustav izgrađen tako da ga razumiju samo njegovi autori. Ograničenje treba postaviti od prvog sprinta: što će klijent moći pokrenuti, provjeriti i promijeniti bez nas? Takav dizajn izgradnju čini malo sporijom, a sljedeće godine puno mirnijima.&lt;/p&gt;

&lt;p&gt;Kad agent za godinu dana pogriješi, kome stiže prva poruka?&lt;/p&gt;

&lt;p&gt;Cijeli tekst: &lt;a href="https://www.omarbaruzzo.it/hr/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;cijela handover lista&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/hr/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/hr/blog/agente-ai-dopo-la-consegna&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>aiagents</category>
      <category>enterprise</category>
    </item>
    <item>
      <title>Chi mantiene l'agente dopo la consegna?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:20:33 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/chi-mantiene-lagente-dopo-la-consegna-11b0</link>
      <guid>https://dev.to/omarbaruzzo/chi-mantiene-lagente-dopo-la-consegna-11b0</guid>
      <description>&lt;p&gt;In breve: consegnate un runbook, un set di valutazione del cliente, versioni fissate con rollback, un responsabile degli avvisi e un registro leggibile.&lt;/p&gt;

&lt;p&gt;Un agente AI funziona il giorno della consegna. Che funzioni ancora dopo sei mesi dipende da chi ne risponde e da cosa ha in mano. Il passaggio di consegne fa parte del progetto, non è una riunione finale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosa cambia quando nessuno lo tocca
&lt;/h2&gt;

&lt;p&gt;Gli agenti peggiorano anche senza che nessuno li modifichi. Il fornitore del modello ritira una versione, e l'alias su cui contavate ora punta a qualcos'altro. Un'API a monte rinomina o toglie un campo. I documenti che l'agente legge si allontanano da quelli su cui è stato provato: modelli nuovi, codici articolo nuovi, un modo diverso di scrivere la stessa cosa. Niente di tutto questo compare in una revisione del codice, perché il codice non è cambiato. Compare come un errore davanti a un cliente, di solito notato da qualcuno che non sa perché sia successo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cinque cose che escono insieme al sistema
&lt;/h2&gt;

&lt;p&gt;La prima è un runbook. Dice cosa l'agente può fare, cosa non deve mai fare, su quali sistemi può scrivere e cosa fare quando si comporta in modo strano. Scritto per chi è reperibile, non per lo sviluppatore che l'ha costruito.&lt;/p&gt;

&lt;p&gt;La seconda è il set di valutazione, di proprietà del cliente. Se le domande e le risposte attese esistono solo sul portatile del fornitore, il cliente non può verificare nulla dopo una modifica. Con il set in mano può rilanciarlo dopo un aggiornamento del modello, una modifica al prompt o un nuovo lotto di documenti, e confrontare con l'ultimo risultato.&lt;/p&gt;

&lt;p&gt;La terza sono le versioni fissate, con un rollback scritto. Modello, prompt e indice sono registrati come versioni esatte, e la strada per tornare alla combinazione precedente è un passaggio documentato, non un ricordo.&lt;/p&gt;

&lt;p&gt;La quarta è una persona indicata a ricevere gli avvisi, che non sia chi ha costruito il sistema. Un avviso che arriva in una casella che nessuno legge equivale a nessun avviso.&lt;/p&gt;

&lt;p&gt;La quinta è il registro delle decisioni, con un modo di leggerlo che non dipenda dal fornitore. Quando qualcuno chiede perché l'agente ha fatto una certa cosa a marzo, la risposta non deve richiedere una telefonata a voi.&lt;/p&gt;

&lt;h2&gt;
  
  
  A chi arriva il primo messaggio
&lt;/h2&gt;

&lt;p&gt;Pensate al primo avviso di ritiro di un modello. Se set di valutazione e versioni fissate sono in mano al cliente, è una voce di calendario: si pianifica una prova, si confronta, si passa alla nuova versione. Se non lo sono, è un'emergenza che cade su chi ha costruito il sistema, in un momento che non ha scelto. Per una software house è anche un problema di margine, perché l'assistenza informale illimitata raramente è nel prezzo. E se il sistema rientra tra quelli ad alto rischio dell'AI Act, chi lo impiega ha obblighi di sorveglianza sul suo funzionamento: dovrà poterli esercitare senza passare da voi.&lt;/p&gt;

&lt;h2&gt;
  
  
  La manutenzione è un vincolo di progetto
&lt;/h2&gt;

&lt;p&gt;Un contratto di assistenza aggiunto dopo la consegna non rimedia a un sistema costruito per essere capito solo dai suoi autori. Il vincolo va posto dal primo sprint: cosa potrà far funzionare, controllare e cambiare il cliente senza di noi? Progettare così rende la costruzione un po' più lenta e gli anni successivi molto più tranquilli.&lt;/p&gt;

&lt;p&gt;Tra un anno, quando l'agente sbaglia, a chi arriva il primo messaggio?&lt;/p&gt;

&lt;p&gt;Testo completo: &lt;a href="https://www.omarbaruzzo.it/it/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;la checklist completa del passaggio di consegne&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/it/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/it/blog/agente-ai-dopo-la-consegna&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>aiagents</category>
      <category>enterprise</category>
    </item>
    <item>
      <title>Who maintains the agent after you hand it over?</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:16:55 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/who-maintains-the-agent-after-you-hand-it-over-40dg</link>
      <guid>https://dev.to/omarbaruzzo/who-maintains-the-agent-after-you-hand-it-over-40dg</guid>
      <description>&lt;p&gt;TL;DR: ship a runbook, a client-owned eval set, pinned versions with a rollback, a named alert owner and a readable decision log.&lt;/p&gt;

&lt;p&gt;An AI agent works on delivery day. What decides whether it still works six months later is who owns it afterwards, and whether that person has what they need. Handover is part of the build, not a meeting at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes when nobody touches it
&lt;/h2&gt;

&lt;p&gt;Agents decay without anyone editing them. The model provider retires a version, and the alias you relied on now points at something else. An upstream API renames or drops a field. The documents the agent reads drift away from the ones it was tested on: new templates, new product codes, a different way of writing the same thing. None of this shows up in a code review, because no code changed. It shows up as a mistake in front of a customer, usually noticed first by someone who does not know why it happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five things that leave with the system
&lt;/h2&gt;

&lt;p&gt;The first is a runbook. It says what the agent is allowed to do, what it must never do, which systems it can write to, and what to do when it behaves strangely. It is written for the person on call, not for the developer who built it.&lt;/p&gt;

&lt;p&gt;The second is the evaluation set, owned by the client. If the questions and the expected answers live only on the vendor's laptop, the client cannot check anything after a change. With the set in their hands, they can re-run it after a model update, a prompt edit or a new batch of documents, and compare with the last result.&lt;/p&gt;

&lt;p&gt;The third is pinned versions with a written rollback. Model, prompt and index are recorded as exact versions, and the way back to the previous combination is a documented step, not a memory.&lt;/p&gt;

&lt;p&gt;The fourth is a named recipient for alerts, and it is not the person who built the system. An alert that goes to a mailbox nobody reads is the same as no alert.&lt;/p&gt;

&lt;p&gt;The fifth is the decision log, with a way to read it that does not depend on the supplier. When someone asks why the agent did something in March, the answer should not require a phone call to the vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who gets the first message
&lt;/h2&gt;

&lt;p&gt;Consider the first model deprecation notice. If the eval set and the pinned versions are in the client's hands, it is a calendar item: schedule a test, compare, switch. If they are not, it is an emergency that lands on whoever built the system, at a time they did not choose. That is also a cost problem for the supplier, because unlimited informal support is rarely in the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintenance is a design constraint
&lt;/h2&gt;

&lt;p&gt;A support contract added after delivery cannot fix a system that was built to be understood only by its authors. The constraint has to be there from the first sprint: what will the client be able to run, check and change without us? Designing for that makes the build slightly slower and the following years considerably calmer.&lt;/p&gt;

&lt;p&gt;When your agent breaks in a year, who gets the first message?&lt;/p&gt;

&lt;p&gt;Full text: &lt;a href="https://www.omarbaruzzo.it/en/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;the full handover checklist&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/en/blog/agente-ai-dopo-la-consegna" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/en/blog/agente-ai-dopo-la-consegna&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>aiagents</category>
      <category>enterprise</category>
    </item>
    <item>
      <title>Ne počinjite s vektorskom bazom</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:23:32 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/ne-pocinjite-s-vektorskom-bazom-18e8</link>
      <guid>https://dev.to/omarbaruzzo/ne-pocinjite-s-vektorskom-bazom-18e8</guid>
      <description>&lt;p&gt;Ukratko: izgradite baseline s pretragom koju već imate, ocijenite je na stvarnim pitanjima i dodajte embeddinge samo tamo gdje eval set pokaže razliku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pogledajte pitanja koja ljudi postavljaju
&lt;/h2&gt;

&lt;p&gt;Prikupite stvarna pitanja od ljudi koji će koristiti asistenta, a ne izmišljena. Razvrstajte ih. Velik dio obično su lookup pitanja: broj ugovora, ime klijenta, raspon datuma, šifra artikla, osoba. Vector search uspoređuje značenje približno, i upravo zato je slab kod točnih podudaranja. Pretraga po ključnim riječima i SQL filter su suprotni: precizni na identifikatorima, slabi kad pitanje koristi drugačije riječi od dokumenta. Oboje je već u vašem stacku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prvo izgradite baseline
&lt;/h2&gt;

&lt;p&gt;Zapišite kako izgleda točan odgovor za skup od pedesetak pitanja. Provedite ih kroz full-text pretragu i strukturirane filtere i zabilježite koliko ih se vrati točno. Taj rezultat je baseline i sve što se kasnije doda mora ga nadmašiti. Bez njega dodavanje vektora ne možete nazvati poboljšanjem. Možete ga nazvati samo promjenom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vektore dodajte tamo gdje baseline zakaže
&lt;/h2&gt;

&lt;p&gt;Embeddinzi zaslužuju svoje mjesto kad je problem rječnik: korisnik pita kako prije roka prekinuti najam, a dokument govori o prijevremenom raskidu zakupa. Kad eval set pokaže tu klasu pogrešaka, hybrid retrieval je opravdan: ključne riječi plus vektori, rezultati spojeni. Tada se dobitak može izmjeriti i odlučiti vrijedi li onoliko koliko košta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cijena još jednog storea
&lt;/h2&gt;

&lt;p&gt;Vektorski indeks je kopija vaših dokumenata. Mora ostati usklađen s izvorom, ponovno se graditi kad se promijeni embedding model i provoditi ista prava pristupa kao sustav koji kopira. Tko ne može otvoriti dokument u originalnoj aplikaciji, ne smije ga moći dohvatiti ni preko asistenta. Greške u pravima na kopiji su tihe i teško se nalaze, a kad su u pitanju osobni podaci, to je i problem usklađenosti.&lt;/p&gt;

&lt;p&gt;Ništa od ovoga nije argument protiv vektorske pretrage. To je argument o redoslijedu posla. Tim s izmjerenim baselineom može reći što su embeddinzi dodali. Tim bez njega može reći samo da asistent sada djeluje bolje. Kad stigne sljedeća verzija modela ili indeksa, prvi tim ponovno pokrene skup pitanja i zna isplati li se prijeći. Embeddinzi su koristan alat, samo ne prvi.&lt;/p&gt;

&lt;p&gt;Krenite od dosadne pretrage, izmjerite je i pustite da vam pogreške kažu što dodati.&lt;/p&gt;

&lt;p&gt;Koja su pitanja u vašem asistentu zapravo lookupi u prerušavanju?&lt;/p&gt;

&lt;p&gt;Cijeli tekst: &lt;a href="https://www.omarbaruzzo.it/hr/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;izvorni članak s cjelovitim obrazloženjem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/hr/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/hr/blog/ricerca-classica-prima-dei-vettori&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>llm</category>
      <category>rag</category>
      <category>search</category>
    </item>
    <item>
      <title>Non partire dal database vettoriale</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:22:51 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/non-partire-dal-database-vettoriale-i4i</link>
      <guid>https://dev.to/omarbaruzzo/non-partire-dal-database-vettoriale-i4i</guid>
      <description>&lt;p&gt;In breve: costruite una base con la ricerca che avete già, valutatela su domande reali e aggiungete gli embedding solo dove il set di valutazione mostra il divario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardate le domande che le persone fanno
&lt;/h2&gt;

&lt;p&gt;Raccogliete domande reali da chi userà l'assistente, non inventate. Ordinatele. Una quota grande è di solito ricerca puntuale: un numero di contratto, il nome di un cliente, un intervallo di date, un codice articolo, una persona. La ricerca vettoriale confronta il significato in modo approssimato, ed è proprio per questo che è debole sulle corrispondenze esatte. La ricerca per parole chiave e un filtro SQL sono l'opposto: precisi sugli identificativi, scarsi quando la domanda usa parole diverse dal documento. Entrambi sono già nel vostro stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Costruite prima la base di confronto
&lt;/h2&gt;

&lt;p&gt;Scrivete com'è una risposta corretta per un insieme di una cinquantina di domande. Provatele con la ricerca full-text e con i filtri strutturati, e annotate quante tornano giuste. Quel risultato è la base di confronto, ed è ciò che ogni aggiunta successiva deve battere. Senza, aggiungere i vettori non si può chiamare un miglioramento. Si può chiamare solo un cambiamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggiungete i vettori dove la base fallisce
&lt;/h2&gt;

&lt;p&gt;Gli embedding si guadagnano il posto quando il problema è il vocabolario: l'utente chiede come chiudere un affitto in anticipo e il documento parla di recesso anticipato dalla locazione. Quando il set di valutazione mostra quella classe di errori, la ricerca ibrida è giustificata: parole chiave più vettori, risultati uniti. A quel punto il guadagno si misura e si decide se vale quanto costa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il costo di un archivio in più
&lt;/h2&gt;

&lt;p&gt;Un indice vettoriale è una copia dei vostri documenti. Va tenuto allineato alla fonte, ricostruito quando cambia il modello di embedding, e deve far rispettare gli stessi diritti di accesso del sistema che copia. Chi non può aprire un documento nell'applicazione originale non deve poterlo recuperare tramite l'assistente. Gli errori di permessi in una copia sono silenziosi e difficili da trovare, e quando ci sono dati personali sono anche un problema di conformità.&lt;/p&gt;

&lt;p&gt;Niente di tutto questo è un argomento contro la ricerca vettoriale. È un argomento sull'ordine del lavoro. Un team con una base misurata può dire cosa hanno aggiunto gli embedding. Un team senza può dire solo che l'assistente adesso sembra migliore. Quando arriva la versione successiva del modello o dell'indice, il primo team rilancia il set di domande e sa se conviene cambiare.&lt;/p&gt;

&lt;p&gt;Partite dalla ricerca noiosa, misuratela, e lasciate che siano gli errori a dirvi cosa aggiungere.&lt;/p&gt;

&lt;p&gt;Quali domande del vostro assistente sono ricerche puntuali travestite?&lt;/p&gt;

&lt;p&gt;Testo completo: &lt;a href="https://www.omarbaruzzo.it/it/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;la versione originale con il ragionamento completo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/it/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/it/blog/ricerca-classica-prima-dei-vettori&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>llm</category>
      <category>rag</category>
    </item>
    <item>
      <title>Do not start with a vector database</title>
      <dc:creator>Omar Baruzzo</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:21:17 +0000</pubDate>
      <link>https://dev.to/omarbaruzzo/do-not-start-with-a-vector-database-73o</link>
      <guid>https://dev.to/omarbaruzzo/do-not-start-with-a-vector-database-73o</guid>
      <description>&lt;p&gt;TL;DR: build a baseline with the search you already have, score it on real questions, and add embeddings only where the eval set shows the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look at the questions people ask
&lt;/h2&gt;

&lt;p&gt;Collect real questions from the people who will use the assistant, not invented ones. Sort them. A large share is usually lookup: a contract number, a customer name, a date range, a product code, a person. Vector search matches meaning approximately, which is exactly what makes it weak at exact matches. Keyword search and a SQL filter are the opposite: precise on identifiers, poor when the question uses different words from the document. Both are in your stack already.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the baseline first
&lt;/h2&gt;

&lt;p&gt;Write down what a correct answer looks like for a set of fifty or so questions. Run them against full-text search and structured filters, and record how many come back right. That result is the baseline, and it is what every later addition has to beat. Without it, adding vectors cannot be called an improvement. It can only be called a change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add vectors where the baseline fails
&lt;/h2&gt;

&lt;p&gt;Embeddings earn their place when the failure is vocabulary: the user asks about ending a rental early, and the document says early termination of the lease. When the eval set shows that class of failure, hybrid retrieval is justified: keyword plus vector, results merged. You can then measure the gain it brings, and decide whether it is worth what it costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of one more store
&lt;/h2&gt;

&lt;p&gt;A vector index is a copy of your documents. It has to be kept in sync with the source, rebuilt when the embedding model changes, and it has to enforce the same access rights as the system it copies. A user who cannot open a document in the original application must not be able to retrieve it through the assistant. Permission mistakes in a copy are quiet and hard to find, and when personal data is involved they are also a compliance problem.&lt;/p&gt;

&lt;p&gt;None of this argues against vector search. It argues for an order of work. A team with a scored baseline can say what embeddings added. A team without one can only say the assistant now feels better. When the next model or index version arrives, the first team re-runs the question set and knows whether to switch.&lt;/p&gt;

&lt;p&gt;Start with the boring retrieval, measure it, and let the failures tell you what to add.&lt;/p&gt;

&lt;p&gt;Which questions in your assistant are lookups in disguise?&lt;/p&gt;

&lt;p&gt;Full text: &lt;a href="https://www.omarbaruzzo.it/en/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;the original write-up with the full reasoning&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Articolo originale: &lt;a href="https://www.omarbaruzzo.it/en/blog/ricerca-classica-prima-dei-vettori" rel="noopener noreferrer"&gt;https://www.omarbaruzzo.it/en/blog/ricerca-classica-prima-dei-vettori&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>enterprise</category>
    </item>
  </channel>
</rss>
