Repository navigation
Releases
v2.3.0, the Pablo Piovano release 2
The Pablo Piovano release 2: a fix and some improvements
"Your agent doesn't forget with an error. It forgets with a tidy answer."
— Pablo Piovano, on LinkedIn, 3 November 2026
2.2.0, the Pablo Piovano release, was out for a day. Here is the story so far, and why 2.3.0 follows so soon.
Pablo's experiment gave three months of Bruna's chat to a notes file, a vector store and AgentMemory, then asked three
questions. Its first finding, that recall never looked at the calendar, was fixed in 2.1.0. Running it again found a
second, quieter problem: AgentMemory decided identity by name, so two different colleagues called Alex Kim became one,
silently and for good, and events weren't recorded at all. 2.2.0 fixed that with evidence-based identity.
2.2.0 also listed its own limits. Recall still found people by similarity, export and import carried the current state
but not identity's history, and hosts running GLM-5.3-Flash through AgentMemory.Inference ran it at maximum reasoning
effort. Those were meant for 2.2 and missed it. 2.3.0 brings all three.
Checking the release found two critical bugs as well, both in how the database schema reaches an application, and a
review of this release found a third, in 2.2.0 too, in owner import. All three are fixed here. If you run 2.2.0,
upgrade.
Thank you again, Pablo. Your scenario is now the benchmark every identity change is measured against, this release
included (three-memories-one-question, MIT).
Before it shipped, this release went through three Copilot reviews and five independent review rounds; every finding
was fixed with a test that failed first, or is listed under known limits below.
Three critical fixes
- The migration scripts didn't reach applications that install the
AgentMemorypackage. 2.2.0 copied them next to
an application that referencesAgentMemory.Neo4jdirectly, but NuGet doesn't pass a dependency's files on, so the
README's install path got none of the 18 scripts. They now ship inside the library, and the release pipeline installs
the package into a clean application and fails unless all of them are there. - Nothing ran the migration scripts at startup. Applications call
ISchemaBootstrapper.BootstrapAsync(), which
created the base indexes itself but never ran the scripts; only this repository's command-line tool and tests did. So
identity, on by default since 2.2.0, has run without its unique constraints and lookup indexes: two writes at the same
moment could duplicate an identity record, and lookups slow down as a store grows. Bootstrap now applies the scripts,
each once per database. - Owner import trusted the file it was given. It made links to whatever entity ids a file named, so a crafted export
could link imported memories to another owner's entities, or create bare nodes. Import now links only to the
entities it brings and to shared ones the store holds; a link to anything else (another owner's entity, a missing one,
or an id that isn't an entity) is left out and counted, the same either way. It writes only what each record's schema
declares, always for the importing owner. Source message ids that aren't the importing owner's own messages become
markers, so recall never quotes another owner's messages from an imported fact, and no message can be written at a
marker's id later.
Also fixed
- Reviewing an identity decision works after its fact is said again. A fact keeps only its latest source message,
and review failed when that was no longer one of the decision's own. - Event and person details no longer bring back a replaced value, such as the old city after a move has begun. Event
details had this since 2.2.0. - Import leaves the facts the owner already holds as they are (since 2.0). It used to land on them: the file's sources
replaced the owner's, a retracted fact came back, or a live one was closed. A replaced value also comes back as a
closed period, so the same value said again is its own fact, and importing the same file twice adds no second history. - A failed import removes what it wrote before reporting the failure, so a retry starts from the store as it was.
What missed 2.2
- Recall for people. A question that names a confirmed person ("my mentoring session with Valentina") brings up to 8
facts bound to that person, newest first, not only the ones whose words resemble the question. A name counts only when
one person in the store has it: a name two people share expands nothing, never a guess. Two bounded reads, no model
call (RecallOptions.PersonDetails,MaxPersonDetailFacts). Opt-in for now: each recall that uses it reads the
owner's people and the names their facts were bound with, which grows with the owner, until that read is indexed. - Export and import carry identity whole (
agentmemory-export/2): decisions with their evidence and quotes, review
history, open proposals, the links from facts to people, and the retired entities those records point at. Each import
is a copy of its own, every reference rewritten, so a moved or restored store behaves like the original: imported
proposals can be reviewed, even in the same database as the source. Messages stay out; decisions keep their quotes. - A reasoning effort in
AgentMemory.Inference(AI_REASONING_EFFORT). GLM-5.3-Flash on Bitdeer now runs at low
effort, as every measurement did; at maximum it could think through its whole reply and answer nothing.
From 2.2.0, in case you missed it
- Evidence-based identity, on by default where the store-aware writer runs on Neo4j. The writer names the stored
entity a mention refers to and quotes the words that show it; the quote is checked; an uncertain match gets a bounded
second opinion; and when it's still uncertain, nothing is merged and a proposal waits for review (ListPendingAsync,
ReviewAsync,GetHistoryAsync). - A confirmed event brings its details to recall, whatever their words (
RecallOptions.EventDetails). - The memory tiers line says which resolver runs, and why:
identity: evidence-based, or the previous resolver with
its reason. - Measured on Pablo's scenario: on its busier history the previous resolver answered 2 of 3 questions in both runs
and evidence-based identity 3 of 3; no measured run made a wrong merge; and on news articles labelled by others
(ECB+) it kept the 81st and 86th Oscars apart in every run.
Measured in this release
Recall for people ran on Pablo's scenario with a second Alex Kim added (two runs each, GLM-5.3-Flash). It worked and
made no guesses, but it didn't change the scores: every fact about the person asked for names her, so similarity found
them all anyway. The runs found two write-time gaps instead, listed under known limits. Details:
tools/AgentMemory.Scenarios/README.md.
Upgrading
- The first start applies the scripts your database is missing, identity's among them; later starts only check. If
the log shows an error about a constraint, the store holds duplicates written without it: it keeps running as before,
and the next start adds the constraint once they are removed. - If an operator owns your schema, set
Neo4jOptions.ApplyMigrationsOnBootstrap = falseand apply the scripts with
IMigrationRunner. - Owner exports that carry identity records are now format 2; an owner without any still exports format 1, which 2.2.0
reads. 2.3.0 imports both; 2.2.0 and earlier refuse format 2 rather than drop its identity state. - Import leaves out links to entities it doesn't bring and the store doesn't share, and facts the owner already holds,
and says so in its result (skipped:*,facts:already-held,facts:history-left-out). - Message ids starting with
imported-message-are reserved for import; the store refuses to write one. - Recall for people is off unless you set
RecallOptions.PersonDetails = true. AgentMemory.Inferenceon GLM-5.3-Flash now asks for low reasoning effort;AI_REASONING_EFFORTchanges it.
Known limits
- Recall for people is opt-in until its read of the owner's people is indexed.
- Every import gets new identity keys, a restore into the same owner included, so a restored message ingested again
makes a second identity decision rather than replaying the first. - Recall for people needs a confirmed identity and a name only one person has. A person named only inside facts gets no
identity of their own yet, so the two Alex Kims in the benchmark still met in one prompt through similarity. - The identity writer sometimes stores a request about a person ("asked me to mentor Valentina on system design") as a
link to a garbled name instead of a fact. - Mentions written in one batch aren't checked against each other, so a bulk write can split one identity in two
(never merge two). - Identity was measured with one model, GLM-5.3-Flash.
Full list: CHANGELOG.md.
v2.2.0, the Pablo Piovano release
Memory that knows who is who: the Pablo Piovano release
"Your agent doesn't forget with an error. It forgets with a tidy answer."
— Pablo Piovano, on LinkedIn, 3 November 2026
Pablo's experiment gave three months of Bruna's chat to a notes file, a vector store and AgentMemory, then asked three
questions. Its first finding, that recall never looked at the calendar, was fixed in 2.1.0.
Running his scenario again found a second, quieter problem. To decide whether a mention is something already stored,
AgentMemory matched names. A matching name meant the same entity: right most of the time, and wrong, silently and for
good, when two people share a name. In my tests two different colleagues called Alex Kim became one. Events weren't
recorded at all, so Bruna's go-live in September and "the cutover" in November could never be followed as one thing.
None of this raised an error. The answers just got quietly worse.
Thank you, Pablo, for building the test I should have written myself, for publishing everything it produced,
and for letting me run it again (three-memories-one-question,
MIT). Both of the things it found are fixed, and this release carries your name.
What's new
- Evidence-based identity, on by default where the store-aware writer runs on Neo4j (the Recommended preset, or
UseMemoryWriter).- The writer names the stored entity a mention refers to and quotes the words that show it; the quote is checked.
- The last few turns are read for context, and an uncertain match gets a bounded second opinion from the extraction
model (AddIdentityAdjudicationgives it a dedicated model instead). - When it's still uncertain, nothing is merged: both are kept, and a proposal waits in a review queue
(ListPendingAsync,ReviewAsync,GetHistoryAsync). - A confirmed event brings its details to recall, whatever their words (
RecallOptions.EventDetails).
- The memory tiers line says which resolver runs, and why, logged once on the first write:
identity: evidence-based, oridentity: previous resolver (the store-aware writer is off; it can merge different things that share a name). - Owner export and import work with identity. Import brings each confirmed identity back as one entity and never
joins imported entities to what the destination already holds.
Measured
Pablo's scenario is now a standing benchmark: the previous resolver against evidence-based identity, the same model
(GLM-5.3-Flash), two runs for every change.
| Previous resolver | Evidence-based identity | |
|---|---|---|
| Two colleagues called Alex Kim | stored as one | kept apart; the second left for review |
| Bruna's go-live | not recorded as an event | one event; its details reach the prompt |
| Busier history (130 statements), 3 questions, no retrieval judge | 2 of 3 in both runs | 3 of 3 in both runs |
| Wrong merges | 1 | 0 in every run |
| News articles labelled by others (ECB+) | stored no entities | 0 wrong merges in 4 runs; the 81st and 86th Oscars kept apart |
| Model calls | the baseline | 5–12% more |
Details and limits: docs/evidence-based-identity-evaluation-results.md.
Upgrading
- Identity changes only where the store-aware writer runs on Neo4j. To keep the previous resolver:
services.Configure<IdentityResolutionOptions>(o => o.Enabled = false);. The Conversational preset is unchanged. - NuGet consumers of 2.1.0: apply migrations after upgrading. The 2.1.0 package left its Cypher migrations out of a
consumer's build, so every migration was skipped. 2.2.0 copies them; runIMigrationRunneras usual. LlmExtractionOptions.MemoryWriterEventIdentitiesandRecallOptions.EventDetailsare nowbool?: null follows
identity, and an explicit value wins.
Also in this release
- The identity writer retries an empty strict-format reply without the strict format.
- With identity on, within-extraction deduplication merges exact fact copies only, so each original phrasing is kept.
- The Aspire demo moves to Aspire 13.6.5 for two new advisories against 9.5.2 (the demo isn't shipped).
Known limits
- Identity was measured with one model, GLM-5.3-Flash. Hosts that run that model through
AgentMemory.Inferencerun it
at maximum reasoning effort, where it can spend its whole reply thinking; the benchmarks set it low. - Mentions written in one batch aren't checked against each other, so a bulk write can split one identity in two (never
merge two). - Recall uses identity for events so far. For people it still finds facts by similarity.
- Export and import carry the current state, not identity's history (decisions, reviews, open proposals). A full round
trip is the next item. - NAMS resolves entities on its own servers and is not affected.
Full list: CHANGELOG.md.
What's Changed
- Threat model TT-14: the Trusted Publishing policy and environment, not a key to rotate by @joslat in #257
- Evidence-based identity, on by default where the store-aware writer runs by @joslat in #259
Full Changelog: v2.1.0...v2.2.0
v2.1.0
Memory that looks at the calendar
"Your agent doesn't forget with an error. It forgets with a tidy answer."
— Pablo Piovano, on LinkedIn, 3 November 2026
Pablo gave three months of one person's chat to a notes file, a vector store and AgentMemory 1.9.0. Then he asked three
questions. Bruna's go-live is on Friday 11 December in Córdoba, and in November she had mentioned her sister's wedding in
Bariloche, where she'd be from the 9th to the 13th. When she asked "plan my prep for go-live week", all three memories
missed the clash, and none of them said so.
The graph had stored the go-live's date. But recall chose facts by how much their words resemble the question, and a trip
to Bariloche resembles nothing in "plan my prep". 2.1.0 adds recall that reads by date.
Thank you, Pablo, for the experiment, for publishing every prompt it produced, and for letting us bring your scenario
into this repository (three-memories-one-question, MIT).
What's new
- Look-ahead recall. Three reads by date, each in its own section with its own budget. The retrieval judge doesn't
filter them.RecallOptions.Upcoming: for a question that looks ahead, the facts that start in the next 14 days.RecallOptions.TimeWindows: the facts dated inside a period the question names ("between December 7 and 13", "next
week") or anchors on an event ("go-live week" → the Monday-to-Sunday week of the go-live).RecallOptions.OverlapExpansion: the facts that overlap in time with the dated facts recalled.
- Dates read into date fields.
LlmExtractionOptions.DatesFromTextreads the dates a store-aware writer fact states
("on Friday, December 11", "from December 9 to December 13") into its date fields as well. The words stay as written.
It's deterministic and makes no model call. - Recommended is the default.
AgentMemoryPresets.Choose(configuration)readsAgentMemory:Preset, with Recommended when it's absent.- Without a retrieval judge it runs the Conversational preset, and the memory tiers line says why.
- The Recommended preset now includes look-ahead recall and date reading.
- Existing registrations and the Conversational preset are unchanged.
tools/AgentMemory.Scenarios. Scripted scenarios, live and fully traced: every model call, span and log line.- It checks deterministically that each needed fact is in one item of the prompt, and that the store holds it with
the right date. - Answers are logged and never graded.
- It ships Bruna's go-live, and a busier variant with 81 more ordinary statements.
- It checks deterministically that each needed fact is in one item of the prompt, and that the store holds it with
Also fixed
- The store-aware writer checks each quote (#249).
An operation whose quote isn't in the message isn't stored, and a found quote keeps its offsets in the memory's
metadata. On Bruna's history, 166 of 166 quotes were found exactly. - The writer records what it drops (#250), with a
reason code, on the write span and in the debug log. - Hybrid retrieval fuses by node (#248), so two nodes
with the same text stay two results. - Ambiguous names resolve to nothing (#251). When two
live entities match a name at the same rank, a fact or edge isn't attached to either: before, the more-mentioned one
got it. - Time comes from .NET's
TimeProvider(#164).
Register one, for exampleFakeTimeProvider, and every component follows it. A host's ownIClockregistration
still works, andIClockstays for the public constructors that take it until 3.0.
What it measured
This is Bruna's busier history: 130 statements and 119 stored facts, one run per setup, with GLM-5.3-Flash writing and
answering, the JEV judge, and bge-m3 embeddings. ✓ means every needed fact reached the prompt.
| When and where is the go-live? | What's on between 7 and 13 December? | Plan my prep for go-live week | |
|---|---|---|---|
| Vector store | ✓ | ✓ | ✗ |
| Recommended, without look-ahead | ✓ | ✓ | ✗ |
| Recommended, 2.1.0 | ✓ | ✓ | ✓ |
Without look-ahead, the trip wasn't among the 50 candidates the judge sees. With it, "go-live week" resolved to 7–13
December and the trip arrived because it's dated inside that week. This is one scenario, not a benchmark.
Upgrading
- Hosts on the Conversational preset or the low-level defaults: nothing changes. Every new capability is off there,
and off is byte-identical. - Hosts on Recommended: look-ahead recall and date reading are now on. To turn them off, set them to
falseafter
applying the preset. - New APIs:
MemoryPreset,MemoryPresetChoice,AgentMemoryPresets;AddNeo4jAgentMemory(MemoryPresetChoice, …),AddAgentMemoryGate(MemoryPresetChoice, IConfiguration);LlmExtractionOptions.ApplyPreset,AgentFrameworkOptions.ApplyPreset;- four date reads on
ILongTermMemoryServiceandIFactRepository, each returning empty by default.
TimeProvider: the library reads time from it. A registeredIClockis still honoured;TimeProviderClockand
IClock.ToTimeProvider()bridge the two.IClockgoes in 3.0.- Name resolution:
FindLiveByNameAsyncreturns null for a name two live entities share at the same rank. - No schema change.
Packages
The 2.0.0 tag's packages never reached nuget.org: the publishing key had expired. 2.1.0 is the first NuGet release
since 1.9.0, and it includes all of 2.0.0: ampack memory packs, the Extensibility module SDK, the store-aware writer
and the judged retrieval gate behind the Recommended preset, and a trust boundary on every MCP surface. See the
CHANGELOG for both sections.
The paper behind 2.0.0
The ampack format and its trial-gated activation are described in a preprint: José Luis Latorre Millas, ampack: signed, declaratively traversable memory packs for AI agents, with trial-gated activation, 2026, doi:10.5281/zenodo.24012989 (CC BY 4.0). The evidence behind it, with the means to check it, is attached to the 2.0.0 release.
v2.0.0: memory you can check before you trust it
Packages: the 2.0.0 packages did not reach NuGet, because the publishing key had expired. Install 2.1.0, which contains everything below plus look-ahead recall. This page keeps the 2.0.0 notes and the evidence behind the preprint.
Most agent memory asks you to take it on faith: plug it in, hope it helps, find out in production. 2.0.0 is built on the
opposite idea. A memory component earns its place. It is verified, walked within declared budgets, trialled on the
host's own work, and switched on only if it measurably helps. Then the decision is signed, kept, and revocable.
That idea now has a format, a procedure, three independent readers and a preprint behind it.
José Luis Latorre Millas. ampack: signed, declaratively traversable memory packs for AI agents, with trial-gated
activation. Preprint v0.10, 5 November 2026. doi:10.5281/zenodo.24012989
The preprint lives on Zenodo at that DOI. This release is its code and evidence: the tag v2.0.0 is the exact source
snapshot, and the evidence bundle below holds every signed decision the paper reports, with the means to check it.
The three big things
1. Memory packs (ampack). A pack is a signed bundle of memory a host can verify byte for byte: a canonical file list
gives every pack one SHA-256 identity, signatures are checked against the receiver's own trust policy, and declared
relations tell the host how to walk it, within budgets the host sets. Then comes the part nobody else does: the pack is
installed switched off, trialled against the host's own retrieval on the host's own history, and switched on only if it
meets its targets. The decision is a signed in-toto statement bound to the exact content. Readers in .NET, Python and Rust
agree on every one of 514 conformance vectors.
2. A memory that writes better and recalls smarter (the Recommended preset). One opt-in line,
MemoryOptions.CreateRecommended(), switches on what our storage and retrieval research measured as better:
| What | With Recommended | Before |
|---|---|---|
| Stored memories that were right (store-aware writer, two fresh worlds) | 90.8% and 87.8% | 42.3% and 39.1% |
| Turns where every needed memory reached the prompt (judge at the fan-in) | 96.1% and 96.5% | 67.6% and 76.8% (similarity floor) |
| Knowledge-update questions answered (of 78) | 72 and 71 | 63 |
The judge is a blend of two models behind the System One protocol; if one is down the other carries on, and if neither
answers, recall falls back to the similarity floor and says so. Low-level and Conversational defaults stay compatible:
nothing changes unless you choose Recommended.
3. A trust boundary on every MCP surface. Recalled memory can hold text someone else wrote. Every MCP tool and
resource that returns memory now marks each item with its trustLevel and an instructionLike flag, escapes it so it
cannot forge a tag in the client's prompt, tells the client it is data and never instructions, and can withhold
instruction-like text from untrusted sources (RecallSecurityMode = Strict). One shared detector serves the in-process
adapters, the MCP server and the NAMS MCP server.
Also in 2.0.0
- The Extensibility module SDK 0.1.1: composable memory modules with declared traversal, snapshots, confidence
floors and signed activation, in this source release; its NuGet preview packages follow on their own preview tag. - Coding memory (experimental): decisions, repository experience and a code map read from Roslyn or any SCIP index,
walked from the files and symbols a coding agent is touching. - Bitemporal by default in Recommended: a change ends the old value's valid time and keeps it believed, so "where did
I live in March?" still has an answer. - Honest numbers: the LongMemEval token comparison in the docs is corrected (an answer prompt about 300 times smaller
than the full history, estimated; the memory itself about 170 tokens by exact count). - Fixes found by a full roadmap audit: the telemetry owner-id opt-in now reaches the service, the documented
latencyBudgetExceededkey is written, and the conformance harness counts a missing input as a harness failure, never
as a passing refusal.
The evidence, attached
| Asset | What it is |
|---|---|
ampack-evidence-2.0.0.zip |
The curated evidence: 63 distinct signed trial decisions with their public keys and a portable verifier, the decision register, the four-repository logs, the conformance runs, the statistics checks, and the final-review follow-up |
ampack-evidence-2.0.0.zip.sha256 |
The archive's SHA-256; inside, SHA256SUMS covers every file |
Check it in two commands: sha256sum -c SHA256SUMS, then, in files/,
python -I tools/verify_json.py verify-config.json recheck.json recheck.log (63 of 63 verify). Reproduce the conformance
result from this tag with python conformance/pack-v1.1/run_vectors.py <path to the built Ampack>: on 6 November a
fresh 514-vector corpus agreed on all 514 vectors in all three readers. The preprint's measurements were made on earlier
commits, listed apart from this release commit in the bundle's MEASUREMENT-COMMITS.md. The PDF is not attached;
it is on Zenodo.
Licensing, plainly
From 2.0.0 the projects that implement the ampack format and its host procedure are Apache-2.0 (with its patent grant);
everything else stays MIT; the specification is CC BY 4.0. PATENTS.md holds a proposed royalty-free pledge for
conforming implementations, published as a draft. The full map is in LICENSING.md.
Upgrading
- MCP clients: recall results gain
trustLevel,instructionLike,withheldanduntrustedContent, and angle
brackets in recalled text arrive escaped. - Presets: Conversational is unchanged. Recommended is new and opt-in; pair it with
LlmExtractionOptions.ApplyRecommended()and, with a judge endpoint,MemoryGateOptions.ApplyRecommended(). - Read the CHANGELOG section for 2.0.0 for every
change.
Thank you
To everyone who opened an issue, tried a preview, or argued with a design: this release is better for it. Built on
Neo4j, the Microsoft Agent Framework and Semantic Kernel, and verified against the upstream Neo4j Agent Memory
compatibility kit.
v1.9.0
What's Changed
- Release 1.9.0: time that answers the past, owner data, integrity, a dark router, and the memory judges by @joslat in #244
Full Changelog: v1.8.0...v1.9.0
v1.8.0
What's Changed
Full Changelog: v1.7.0...v1.8.0
v1.7.0
What's Changed
- LongMemEval harness: reference arms on the same draw, question-id filter, judge stamp, extraction reasoning effort by @joslat in #240
- Release 1.7.0: the Conversational preset, and changes of mind that close everything they replace by @joslat in #241
Full Changelog: v1.6.1...v1.7.0
v1.6.1
What's Changed
- Microsoft Agent Framework 1.22, Microsoft.Extensions.AI 10.10 by @joslat in #234
- Release install check: Microsoft.Extensions.Logging 10.0.12 by @joslat in #236
Full Changelog: v1.6.0...v1.6.1
v1.6.0
What's Changed
- Measurement instruments: store probes, judge-only re-grade, a render gate, and the guards that came from getting it wrong by @joslat in #209
- Say something when SupersedeReplacedFacts is on and inert by @joslat in #210
- Give the typedmemeval verb a real stage-1 dry run by @joslat in #211
- Feed the runner's evidence options, and add the caller-feeds standing check by @joslat in #212
- Gate the re-grade on corpus identity: ids and text cannot detect a redraw by @joslat in #213
- Bump the actions group across 1 directory with 2 updates by @dependabot[bot] in #179
- Close the id-keying audit: make the corpus-identity gate a tested unit by @joslat in #214
- Wire the composition levers into the benchmark harness, and measure what they move by @joslat in #215
- Read the reachable ceiling, wire 0.35's chance-floor calculus, make legible forgetting observable by @joslat in #216
- Assemble the ten-vertical scoreboard, and refuse the cells that cannot carry a number by @joslat in #217
- Wire three levers no harness could set, and fix the commit provenance records by @joslat in #218
- Demote the dense flag from a filter to a three-class read by @joslat in #219
- Measurement instrument: published retriever verdict, banding, firing-on-as-of, anchored validity by @joslat in #222
- Wave E-1: cross a declared identity at retrieval by @joslat in #223
- Record what a number was measured WITH, and compute the statistic it is judged BY by @joslat in #224
- Say when supersession actually fires, because the README implied always by @joslat in #225
- Phase 33 Slice A: the module SDK, and it composes without moving anything by @joslat in #226
- Phase 35: inference providers — Bitdeer first, any OpenAI-compatible host after by @joslat in #227
- Extraction keeps what the model wrote, the agent answers the new message, local embeddings, and a turn is one readable trace by @joslat in #229
- What an agent sees, and whether it is still true: dates, changes of mind, shared knowledge, relationships by @joslat in #230
- What the agent is told by default: dates, shared knowledge, held questions, recent topics by @joslat in #231
- A corrected name renames what it named; relationships through recalled facts; held turns say so by @joslat in #232
- Second periods, plans that begin, dates at their precision; filtered vector indexes on Neo4j 2026.x; event companions; retrim by @joslat in #233
Full Changelog: v1.5.0...v1.6.0
v1.5.0
What's Changed
- Bump Microsoft.Extensions.AI.Abstractions and Microsoft.Extensions.AI.OpenAI by @dependabot[bot] in #175
- Post-1.4.1: recall cost, query deadlines, retrieval diagnostics, and telemetry privacy by @joslat in #181
- Phases 4, 7-9, 11-12: procedural falsifiers, per-message trust, per-item provenance, write-time resolution, the sufficiency AUC, and a runnable MCP server by @joslat in #182
- Frozen-corpus registry, drift-refusing reuse, and the AUC on the path runs actually take by @joslat in #183
- Phase 10 complete, Phase 2 tail, and the AUC that opened the gate by @joslat in #184
- Copilot Studio connector, 5.8 closed upstream, 2.1 unblocked by @joslat in #185
- Recall payload projection (2.1): stop shipping the vector back by @joslat in #186
- Escalation ladder: measure it, then skip only the futile case (2.13) by @joslat in #187
- Wire the B3 token breakdown into the runner (12.3) by @joslat in #188
- B3: measure and publish the token breakdown (12.3) by @joslat in #189
- Record why a StructuredJson run is rejected (3.7) by @joslat in #190
- Trace the StructuredJson rejection to one root cause (3.7) by @joslat in #191
- Teach the validator the StructuredJson protocol (3.7) by @joslat in #192
- Build the MAF runner the procedural harness needs (7.6) by @joslat in #193
- Build the task procedural memory is measured against (7.6) by @joslat in #194
- 7.6's run has one prerequisite left, and it is a wiring gap by @joslat in #195
- Promote successful attempts so 7.6 can measure anything by @joslat in #196
- Run the procedural-benefit measurement; the result indicts the task (7.6) by @joslat in #197
- Close the benchmark's description leak, and record what it did not fix by @joslat in #198
- Add the arbitrary dependency; find the real obstacle is the action space (7.6) by @joslat in #199
- Expensive action space; the obstacle turns out to be the task class (7.6) by @joslat in #200
- Cost 8.3b by preflight instead of guessing at it by @joslat in #201
- Attempt five: add the failure-discoverable convention, and void the run by @joslat in #202
- Fix the shared task; find the procedural arm never had memory at all by @joslat in #203
- Phase 30: eight memory capabilities shipped dark, the extension system that carries them, and the reviews that kept them honest by @joslat in #204
- TypedMemEval prerequisites: a timestamped history channel, an embedded-corpus evidence index, and a verb to run them by @joslat in #205
- Merging entities rebuilds the working-memory block (30.4b, seam 1 of 5) by @joslat in #206
- Make Wave C measurable, and close the last unhooked working-memory write by @joslat in #207
Full Changelog: v1.4.1...v1.5.0