TrueNex
TRUENEX
Memory

Truenex Memory · v0.6.2 · diario di sviluppodevelopment journal

Diario di sviluppo

Cosa è consolidato, cosa è in divenire, cosa è solo pensato. Ogni voce porta la misura che la sostiene, così una riga invecchiata si riconosce invece di essere creduta. What is settled, what is still moving, what is only an idea. Every entry carries the measurement behind it, so a line that has gone stale can be recognised rather than believed.

AggiornatoUpdated 2026-08-23 StoreStore 18.426 documentidocuments · 170.285 chunk Test 1.110 passatipassing
ConsolidatoSettled

Misurato, coperto da test, non lo rimettiamo in discussione senza un dato nuovo.Measured, covered by tests, not reopened without new evidence.

In divenireIn progress

Il problema è capito e quantificato, la soluzione no. Non fidarsi come se fosse fatto.The problem is understood and quantified; the fix is not. Do not rely on it as done.

Da implementarePlanned

Deciso o desiderato, non esiste ancora una riga di codice.Decided or wanted; not a line of code exists yet.

ConsolidatoSettled

Ogni voce qui ha un numero dietro. Dove il numero manca, la voce non appartiene a questa sezione. Every entry here has a number behind it. Where the number is missing, the entry does not belong in this section.

La ricerca guardava in tutto il corpusSearch looked at the whole corpus misuratomeasured

Interrogava tutti i 170.285 chunk di tutti i progetti anche lavorando in una cartella precisa: 2.145 rilevanti contro 170.285 interrogati, ottanta volte il pagliaio necessario. Ora scope vive dentro l’SQL di FTS5 — filtrare dopo spenderebbe il bacino dei candidati sul resto del corpus — e corrisponde a segmenti interi del percorso: come sottostringa, truenex-memory prendeva anche truenex-memory-dev, cioè un progetto vicino e sbagliato. È il caso peggiore, perché la risposta è plausibile. It queried all 170,285 chunks across every project even when working inside one folder: 2,145 relevant against 170,285 queried, eighty times the haystack needed. scope now lives inside the FTS5 SQL — filtering afterwards would spend the candidate budget on the rest of the corpus — and matches whole path segments: as a substring, truenex-memory also caught truenex-memory-dev, a neighbouring and wrong project. That is the worst case, because the answer is plausible.

insieme cieco 2/32 → 8/32 · MRR 0,042 → 0,128 · zero regressioni sui 53 committati · scope sbagliato: 0/32, per questo non viene mai dedotto blind set 2/32 → 8/32 · MRR 0.042 → 0.128 · no regression on the 53 committed cases · wrong scope: 0/32, which is why it is never inferred
Il grafo del codice, una porta separataThe code graph, a separate door misuratomeasured

memory_graph risponde a «chi chiama questa funzione», «cosa chiama», «quali test la coprono» leggendo relazioni estratte dal sorgente. È una porta separata dalla classifica, non un contributo ad essa: ogni tentativo di aggiungere candidati alla fusione ha perso casi. Le chiamate a metodo attraverso un ricevitore, che tree-sitter non risolve, vengono dedotte dai tipi che il codice dichiara già — parametri, let x: T, costruttori, campi di struct, contenitori come Mutex<T>. memory_graph answers «who calls this function», «what it calls», «which tests cover it» from relations parsed out of the source. It is a separate door from the ranking, not a contribution to it: every attempt to feed extra candidates into the fusion lost cases. Method calls through a receiver, which tree-sitter does not resolve, are deduced from the types the code already declares — parameters, let x: T, constructors, struct fields, containers such as Mutex<T>.

chiamanti cross-file 4/23 → 18/22 · 323 archi dedotti su 323 superano il controllo di precisione · una risposta costa 1.604 caratteri contro 108.707 leggendo i file cross-file callers 4/23 → 18/22 · 323 of 323 inferred edges pass the precision check · one answer costs 1,604 characters against 108,707 by reading the files
«Quali test coprono questa funzione» su Rust«Which tests cover this» on Rust misuratomeasured

Era vuoto sempre: nove interrogazioni su nove. L’euristica guardava il percorso del file, che funziona dove i test stanno in tests/ e non dice niente in Rust, dove vivono accanto al codice. E nemmeno il nome li tradisce: il test che ha fatto scoprire il buco si chiama publisher_requires_a_fully_correlated_receipt. Restava una strada, leggere l’attributo #[test] e i moduli #[cfg(test)] dal sorgente. It was empty always: nine queries out of nine. The heuristic looked at the file path, which works where tests live in tests/ and says nothing in Rust, where they sit beside the code. Nor does the name betray them: the test that exposed the gap is called publisher_requires_a_fully_correlated_receipt. One road was left — read the #[test] attribute and #[cfg(test)] modules from the source.

583 funzioni di test riconosciute · 365 funzioni con almeno un test attribuito, prima zero · effetto secondario: un test non compare più fra i chiamanti di produzione 583 test functions recognised · 365 functions with at least one test attributed, previously zero · side effect: a test no longer appears among production callers
Il profilo agli agenti: una sorgente, N fileThe agent profile: one source, N files misuratomeasured

Un solo testo (adapters/profile.md) verso i file utente degli otto client riconosciuti, gli AGENTS.md di progetto e il campo instructions dell’handshake MCP. Prima c’erano due generatori scritti a mano che avevano già divergito: uno diceva «preferisci i risultati attivi», l’altro «cita i percorsi locali», e nessuno l’aveva deciso. Il client si riconosce da ciò che dichiara e, quando dichiara un nome generico come mcp, risalendo l’albero dei processi. One text (adapters/profile.md) rendered into the user-level files of the eight recognised clients, the project AGENTS.md files, and the MCP handshake’s instructions field. Before there were two hand-written generators that had already drifted: one said «prefer active results», the other «cite local paths», and nobody had decided either. A client is identified by what it declares and, when it declares a generic name such as mcp, by walking the process tree.

verificato sul campo su Claude Code, Codex e Kimi CLI · Kimi si presenta come mcp, Codex come codex-mcp-client, MiniMax come mavis-local-runtime-mcp: nessuno col nome che avevo immaginato verified in the field on Claude Code, Codex and Kimi CLI · Kimi announces itself as mcp, Codex as codex-mcp-client, MiniMax as mavis-local-runtime-mcp: none with the name I had guessed
Lo strumento dichiara i propri limitiThe tool declares its own limits misuratomeasured

Un tetto che non si dichiara cambia il significato della risposta: «chi chiama questa funzione» con 24 chiamanti e 12 mostrati non è parziale, è sbagliata, perché chi legge non ha modo di sapere che manca qualcosa. Ora il numero vero viaggia accanto a quello mostrato, la copertura porta la percentuale misurata di relazioni ancora mancanti, un elenco tests vuoto dice «non lo so» dove non si può sapere, e answered_from dice da quali progetti la risposta viene davvero. A cap that does not declare itself changes the meaning of the answer: «who calls this function» with 24 callers and 12 shown is not partial, it is wrong, because the reader has no way to know something is missing. The real count now travels beside the shown one, coverage carries the measured percentage of relations still missing, an empty tests list says «unknown» where it cannot know, and answered_from says which projects the answer actually came from.

difetti trovati applicando la regola: mtime troncato al secondo, elenco chiuso di estensioni, conteggio degli scartati che diceva 136.817 contando .venv invece di 460, chiave di deduplica tagliata a 80 caratteri defects found by applying the rule: mtime truncated to the second, a closed list of file extensions, a skipped-file count reporting 136,817 by counting .venv instead of 460, a dedup key truncated at 80 characters
Nessun archivio viene aggiornato in silenzioNo store is upgraded silently misuratomeasured

Lo schema si applicava a ogni apertura del database — una ricerca, un handshake MCP — senza backup: chi installava una versione nuova si trovava il proprio archivio cambiato e nessun punto di ripristino. Prendere un backup lì non era praticabile: su 3,47 GB sarebbe una copia di secondi dentro un handshake. Ora un archivio con contenuto e schema più vecchio viene rifiutato, col comando da eseguire; truenex-mem upgrade migra col backup, ricostruisce i grafi e scrive il profilo in un colpo. The schema was applied on every database open — a search, an MCP handshake — with no backup: whoever installed a new version found their store changed and no restore point. Taking a backup there was not viable: on 3.47 GB it is a seconds-long copy inside a handshake. Now a populated store with an older schema is refused, with the command to run; truenex-mem upgrade migrates with a backup, rebuilds the graphs and writes the profile in one go.

trovato provandolo: il guardiano rifiutava anche migrate, cioè il comando indicato per aggiornare · e il backup finiva nella cartella del progetto corrente invece che accanto al database migrato found by trying it: the guard also refused migrate, the very command pointed at for upgrading · and the backup landed in the current project’s folder instead of beside the migrated database
Il costo di una rispostaThe cost of an answer misuratomeasured

memory_search restituisce excerpt da 320 caratteri più un id per il drill-down, invece dei corpi verbatim. Il contesto di progetto limita l'array ledger, che prima era illimitato e occupava l'80% del payload. memory_search returns 320-character excerpts plus an id for drill-down, instead of verbatim bodies. Project context bounds the ledger array, previously unbounded and 80% of the payload.

query pesante 19.779 → 4.107 caratteri (−80%) · contesto progetto 162.003 → 13.050 (−92%) · latenza media 1,374 s → 0,866 s heavy query 19,779 → 4,107 characters (−80%) · project context 162,003 → 13,050 (−92%) · mean latency 1.374 s → 0.866 s
Le memorie non schiacciano più i documentiMemories no longer bury documents misuratomeasured

Il peso delle memorie nella fusione è passato da 1,5 a 1,0. Con RRF_K = 60 quel 1,5 significava che le prime 31 memorie battevano qualunque chunk del corpus, per costruzione: 1.5/(60+r) ≥ 1/61 per r ≤ 31. The memory weight in fusion went from 1.5 to 1.0. With RRF_K = 60, that 1.5 meant the first 31 memories outranked any chunk in the corpus by construction: 1.5/(60+r) ≥ 1/61 for r ≤ 31.

domande senza alcun documento in risposta: 11/14 → 0/14 · chunk di documento nei primi 5: 5 → 33 questions returning no document at all: 11/14 → 0/14 · document chunks in the top 5: 5 → 33
Le parole vuote fuori dalla ricercaFunction words out of search misuratomeasured

L'overlap delle memorie e la query dei chunk ignorano le parole funzionali. Prima, su "cos'è il source ledger e a cosa serve", cinque token su otto erano parole vuote: 60 dei 100 posti candidati andavano a quattro file, ventiquattro a un solo file che agganciava COSA ed E nel proprio titolo — e BM25 pesa il titolo il doppio. Memory overlap and the chunk query both ignore function words. Previously, for "cos'è il source ledger e a cosa serve", five of eight tokens were function words: 60 of the 100 candidate slots went to four files, twenty-four to a single file matching COSA and E in its own title — and BM25 weights the title twice.

il file che risponde passa da assente fra i 100 candidati a posizione 4 the answering file moved from absent among the 100 candidates to position 4
Il divario fra italiano e inglese è chiusoThe Italian/English gap is closed misuratomeasured

Un glossario italiano→inglese si applica solo al ramo dei chunk. Non alla tokenizzazione della query: il punteggio delle memorie è un rapporto di sovrapposizione, quindi allargare la query sposterebbe il denominatore e muoverebbe di nascosto il loro gate. Poiché i ranghi delle memorie restano intatti, il memory-recall non può regredire. An Italian→English glossary applies to the chunk branch only. Not to query tokenization: the memory score is an overlap ratio, so widening the query would move its denominator and silently shift their gate. Because memory ranks are untouched, memory recall cannot regress.

risposta da un documento: italiano 5/14 → 9/14, inglese 9/14 — divario da +3 a 0 answered by a document: Italian 5/14 → 9/14, English 9/14 — gap from +3 to 0
Le memorie di un progetto sono le sueA project's memories are its own misuratomeasured

global_project_context filtrava con project_id = 'default', valore identico per ogni memoria dello store: restituiva le stesse tre note per qualunque progetto. Ora seleziona per appartenenza, e gli alias si ricavano dalle note che citano il path del progetto — nessuno configura nulla. global_project_context filtered on project_id = 'default', the same value for every memory in the store: it returned the same three notes for every project. It now selects by belonging, and aliases are derived from the notes that cite the project's path — nothing to configure.

alias ricavato per truenex-local-QVAC_MedPsy: meddesk · sovrapposizione fra progetti: 0 su 5 alias derived for truenex-local-QVAC_MedPsy: meddesk · overlap between projects: 0 of 5
Una nota può dichiarare quale sostituisceA note can declare which one it replaces misuratomeasured

add --supersedes <id>: la nuova nasce e la vecchia passa a superseded in una sola transazione, con superseded_by che punta avanti. Lo stato esisteva già ma non diceva da chi, quindi una nota ritirata era un vicolo cieco. add --supersedes <id>: the new note is written and the old one becomes superseded in a single transaction, with superseded_by pointing forward. The status already existed but never said by what, so a retired note was a dead end.

Il legame sta nel comando, non in un passaggio successivo opzionale: un meccanismo che nessuno usa è peggio di nessun meccanismo, perché promette che il recupero restituisce solo fatti correnti. The link lives in the command, not in an optional follow-up step: a mechanism nobody uses is worse than none, because it promises that retrieval only returns current facts.

verificato end-to-end: l'allarme falso esce dalla ricerca, resta leggibile con --include-inactive verified end to end: the false alarm leaves search, stays readable with --include-inactive
Il banco di misura funziona davveroThe measurement bench actually runs misuratomeasured

scripts/eval_retrieval.py istanziava un HashingEmbedder hardcodato, quindi _dense_ranker_enabled() era sempre falso e tutto il ramo denso — gate compreso — era codice morto durante la valutazione. Ora legge TRUENEX_EMBEDDER. Accanto c'è un battery di 14 domande reali che riporta quante trovano risposta in un documento. scripts/eval_retrieval.py instantiated a hardcoded HashingEmbedder, so _dense_ranker_enabled() was always false and the whole dense branch — gate included — was dead code during evaluation. It now reads TRUENEX_EMBEDDER. Beside it sits a battery of 14 real questions reporting how many are answered by a document.

i baseline e5 committati erano stati prodotti con una modifica locale mai committata: non riproducibili da HEAD the committed e5 baselines came from an uncommitted local edit: not reproducible from HEAD
Quello che NON va toccatoWhat must NOT be touched verificato due volteverified twice

DENSE_FUSION_MIN_COSINE = 0.90 resta. Abbassarlo peggiora tutto in modo monotono: a 0,86 il memory-recall crolla a 0/14, e abbassare insieme il peso del denso non salva niente. L'aritmetica dice perché: un hit corroborato da entrambi i ranker somma i contributi, quindi tenerlo sotto una memoria di rango 1 richiederebbe un peso negativo. E un hit solo-denso non può entrare nei primi cinque per nessun peso sotto 0,9385, mentre proteggere il memory-recall richiede meno di 0,3. Requisiti disgiunti. DENSE_FUSION_MIN_COSINE = 0.90 stays. Lowering it degrades everything monotonically: at 0.86 memory recall collapses to 0/14, and lowering the dense weight alongside rescues nothing. The arithmetic says why: a hit corroborated by both rankers sums its contributions, so keeping it below a rank-1 memory would need a negative weight. And a dense-only hit cannot reach the top five at any weight below 0.9385, while protecting memory recall needs below 0.3. Disjoint requirements.

sweep a due dimensioni, gate × peso, 5 combinazioni · nessun punto soddisfa entrambi two-dimensional sweep, gate × weight, 5 combinations · no point satisfies both

In divenireIn progress

Problemi capiti e quantificati, soluzione non ancora trovata. Da non citare come se fossero risolti. Problems understood and quantified, solutions not yet found. Do not cite these as resolved.

Il profilo arriva, l’obbedienza noThe profile arrives, obedience does not apertoopen

Su tre client il testo arriva, verificato con una domanda la cui risposta esiste solo nel profilo. Ma arrivare e seguire sono due cose: nella misura del comportamento, un client usa il grafo 26 volte su 29 chiamate e non cerca mai, un altro cerca senza scope, e le registrazioni con task_step_add sono zero su tutti e otto. L’unica leva che ha funzionato in modo dimostrabile è un messaggio diretto dell’utente, salvato nella memoria interna del client. On three clients the text arrives, verified with a question whose answer exists only in the profile. But arriving and following are two different things: in the behaviour measurement one client uses the graph 26 times out of 29 calls and never searches, another searches without scope, and recordings via task_step_add are zero across all eight. The only lever that demonstrably worked is a direct message from the user, saved into the client’s own memory.

profile check misura il comportamento invece di fidarsi del fatto che il testo sia arrivato · MiniMax non legge alcun file di istruzioni: per lui restano l’AGENTS.md di progetto e la sua memoria interna profile check measures behaviour instead of trusting that the text arrived · MiniMax reads no instruction file: for it only the project AGENTS.md and its own memory remain
Il 18% dei chiamanti cross-file resta fuori18% of cross-file callers stay out apertoopen

Il buco è passato dall’83% al 18%, e le forme che restano sono note, non profonde: catene su più righe con un accessore in mezzo, binding da match (Some(x) => x.metodo()), ricevitori che nascono da una chiamata senza tipo scritto da nessuna parte. Sono due espressioni regolari, non un progetto — valgono due casi su ventidue, e per questo non sono state fatte. The gap went from 83% to 18%, and the remaining shapes are known rather than deep: chains spanning several lines with an accessor in the middle, match bindings (Some(x) => x.method()), receivers born from a call with no type written anywhere. Two regular expressions, not a project — worth two cases out of twenty-two, which is why they were left.

un revisore esterno aveva attribuito il residuo ai parametri generici: falso, quelli si risolvono · e uno dei cinque «mancanti» era un artefatto della misura, una riga di commento contata come chiamata an external reviewer attributed the residue to generic parameters: false, those do resolve · and one of the five «missing» cases was a measurement artefact, a comment line counted as a call
Ventiquattro domande su trentadue mancano il documentoTwenty-four of thirty-two questions miss the document apertoopen

La causa principale è stata trovata — la ricerca interrogava tutto il corpus invece del progetto — e l’insieme di misura è cambiato: oggi sono 32 domande scritte da un altro modello con il vincolo di evitare le parole del documento bersaglio, e ne troviamo 8. Le 24 che restano non sono un problema di lingua: sono domande il cui concetto il documento spiega con parole diverse, e il reranker cross-encoder provato su di esse ha dato zero sull’insieme cieco. The main cause was found — search queried the whole corpus instead of the project — and the measurement set changed: today it is 32 questions written by another model under the constraint of avoiding the target document’s own words, and we find 8. The 24 that remain are not a language problem: they are questions whose concept the document explains in different words, and the cross-encoder reranker tried on them scored zero on the blind set.

ipotesi non ancora verificata: chunk da 1.200 caratteri con sovrapposizione zero deprimono il cosine — verificarlo richiede re-incorporare ~500k chunk untested hypothesis: 1,200-character chunks with zero overlap depress the cosine — testing it means re-embedding ~500k chunks
Una radice indicizzata per errore, e nessun elenco di quelle giusteA root indexed by mistake, and no list of the right ones apertoopen

Solo il 21,6% dell'indice sono i progetti dell'utente. Il 31,5% è Program Files — localizzazioni di Steam, documentazione di vim, note di licenza — e il 22,5% cache di applicazioni. Only 21.6% of the index is the user's own projects. 31.5% is Program Files — Steam localisations, vim documentation, third-party notices — and 22.5% application caches.

La pulizia è stata fatta il 2026-08-21, limitandola a ciò che le regole di esclusione già escludevano: da 201.282 a 170.285 chunk, da 4,05 a 3,47 GB. Effetto sul recupero: nullo, come la misura precedente aveva previsto. I trascritti sono stati conservati per decisione condivisa. Resta aperta la radice D: indicizzata per errore, che contiene anche documenti veri. The cleanup was done on 2026-08-21, limited to what the exclusion rules already excluded: from 201,282 to 170,285 chunks, from 4.05 to 3.47 GB. Effect on retrieval: none, exactly as the earlier measurement predicted. Transcripts were kept by shared decision. The D: root indexed by mistake remains open, since it also holds real documents.

291.808 chunk (58,7%) sarebbero rimovibili · 46,4% dell'indice è contenuto duplicato 291,808 chunks (58.7%) would be removable · 46.4% of the index is duplicate content
Una nota su cinque afferma uno stato che invecchiaOne note in five asserts a state that ages apertoopen

56 delle 271 note curate contengono allarmi, task aperti o punti di ripresa. La supersessione ora esiste come meccanismo, ma quali note siano già superate non si determina automaticamente: raggruppare per titolo spezza lo stesso progetto in soggetti diversi, e il caso verificato a mano non compariva nei risultati. 56 of the 271 curated notes contain alarms, open tasks, or resume points. Supersession now exists as a mechanism, but which notes are already stale cannot be determined automatically: grouping by title splits one project across several subjects, and the case verified by hand did not appear in the results.

4 nodi su 682 portano lo stato superseded: il meccanismo esiste, l'adozione no 4 nodes of 682 carry the superseded status: the mechanism exists, adoption does not
L'eval set misura il caso sbagliatoThe eval set measures the wrong case apertoopen

Corretto in parte: esistono ora due insiemi da 32 casi scritti da altri modelli, uno tenuto cieco, con il vincolo di evitare le parole del documento. Ma l’insieme cieco è stato speso in un confronto a tre vie sul reranker, quindi per la prossima decisione serve un insieme nuovo. E i 53 casi storici restano quello che erano: 14 dei 25 originali sono memory-recall, dove la query è quasi una citazione della memoria da trovare. Solo 5 riguardano il recupero documentale, che è il caso di prodotto, e stanno a 1/5. Quindi la taratura storica ha ottimizzato contro l'obiettivo: a soglia 0,86 il recupero documentale saliva e il memory-recall crollava, e vinse il secondo perché è il 56% dell'aggregato. 14 of 25 cases are memory-recall, where the query nearly quotes the memory it must find. Only 5 concern document retrieval — the product case — and they sit at 1/5. So the historical tuning optimised against the goal: at threshold 0.86 document retrieval rose and memory recall collapsed, and the latter won because it is 56% of the pooled aggregate.

solo 3 casi su 25 verificano una precisione (expected_absent) only 3 of 25 cases check precision at all (expected_absent)
La coda dell'auto-memory cresce senza governoThe auto-memory queue grows ungoverned apertoopen

Un refresh con --auto-memory ha prodotto 300 nodi unverified su 182.529 candidati: il resto è stato scartato dal tetto per-run. Ogni esecuzione ne aggiunge altri 300 dal residuo, e senza una politica di review la coda cresce indefinitamente. One refresh with --auto-memory produced 300 unverified nodes out of 182,529 candidates; the rest were dropped by the per-run cap. Each run adds another 300 from the remainder, and without a review policy the queue grows without end.

7,9% dei chunk contiene il preambolo TRUENEX_INGESTION_METADATA indicizzato come contenuto; alcuni sono preambolo al 100% 7.9% of chunks carry the TRUENEX_INGESTION_METADATA preamble indexed as content; some are 100% preamble

Da implementarePlanned

Deciso o desiderato. Nessuna riga di codice esiste: se una di queste viene citata come disponibile, la citazione è sbagliata. Decided or wanted. No code exists: if one of these is cited as available, the citation is wrong.

Un contratto compatto per aprire un taskA compact contract for starting a task ideaidea

Una sola chiamata che restituisce contesto sintetico, decisioni rilevanti, componenti probabili e un elenco di file da aprire — invece di una ricerca che restituisce testo. È la differenza fra sostituire una lettura del filesystem e spostarla dentro il protocollo. A single call returning a brief context, the relevant decisions, likely components, and a list of files to open — instead of a search that returns text. That is the difference between replacing a filesystem read and relocating it inside the protocol.

Telemetria dei tokenToken telemetry ideaidea

Il risparmio oggi si misura a mano: 24.065 caratteri consumati contro 906.152 per leggere la documentazione di un progetto, un fattore 38. Registrarlo per ogni task trasforma un aneddoto in una metrica di prodotto. The saving is measured by hand today: 24,065 characters consumed against 906,152 to read a project's documentation, a factor of 38. Recording it per task turns an anecdote into a product metric.

Classificazione della validità, oltre al binarioValidity classification, beyond binary ideaidea

Quattro stati invece di due: current applicabile ora, historical vero nel passato, superseded sostituito da una nota identificata, conflicting da non trattare come verità. Più un recupero a due livelli: risposta normale con lo stato corrente, modalità storia per la catena completa. Four states instead of two: current applicable now, historical true in the past, superseded replaced by an identified note, conflicting not to be treated as truth. Plus two-level retrieval: a normal answer with current state, a history mode for the full chain.

La recenza da sola non basta, e questo è il punto che serve ricordare: una nota recente può descrivere un incidente temporaneo, una prova fallita o un ramo diverso. La recenza non dimostra la sostituzione semantica, e una decisione architetturale valida non deve perdere priorità solo perché è vecchia. Recency alone is not enough, and this is the point worth remembering: a recent note may describe a temporary incident, a failed experiment, or a different branch. Recency does not prove semantic substitution, and a valid architectural decision must not lose priority merely for being old.

Come si tiene aggiornatoHow this stays current

Un diario aggiornato a mano invecchia esattamente come le note che dovrebbe sorvegliare. A journal updated by hand ages exactly like the notes it is meant to police.

SezioneSection Come si verificaHow it is checked
ConsolidatoSettled Ogni voce cita una misura riproducibile. Se il numero non si riproduce, la voce scende in "in divenire".Every entry cites a reproducible measurement. If the number stops reproducing, the entry drops to "in progress".
In divenireIn progress Il battery e l'harness girano su richiesta e dicono se qualcosa è cambiato: battery.py per il recupero documentale, eval_retrieval.py per le regressioni.The battery and the harness run on demand and say whether anything moved: battery.py for document retrieval, eval_retrieval.py for regressions.
Da implementarePlanned Si svuota solo verso l'alto. Una voce che diventa codice si sposta, non si duplica.It empties upward only. An entry that becomes code moves, it is not duplicated.
py C:\Users\marco\.truenex-memory\battery.py --verbose
truenex-mem global status

Diario di sviluppo Truenex Memory · aggiornato 2026-08-23 · 1.110 test passati · ogni voce consolidata cita la propria misuraTruenex Memory development journal · updated 2026-08-23 · 1,110 tests passing · every settled entry cites its own measurement