Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
c57720f
perf: automate performance ledger entries
joslat Jul 27, 2026
d41c982
docs(perf): label deterministic retrieval guards
joslat Jul 28, 2026
3deaced
perf: add sampled LongMemEval characterization
joslat Jul 28, 2026
51a81cb
fix: scope message recall before ranking
joslat Jul 28, 2026
031db1f
perf: add concurrent reliability characterization
joslat Jul 28, 2026
982f8c6
perf: mark dirty concurrency artifacts
joslat Jul 28, 2026
0f00837
fix: serialize concurrent fact deduplication
joslat Jul 28, 2026
d5b62b5
docs: publish concurrency characterization
joslat Jul 28, 2026
e4ea6d3
fix: make fail-fast persistence atomic
joslat Jul 28, 2026
12714b9
perf: combine single-message Neo4j writes
joslat Jul 28, 2026
7a05e22
perf: skip redundant provenance writes
joslat Jul 28, 2026
35076cb
docs(perf): record matched feat-01 timings
joslat Jul 28, 2026
03ddd63
perf: add attributable LongMemEval diagnostics
joslat Jul 29, 2026
4aa9a33
perf: batch memory upserts
joslat Jul 29, 2026
725d62a
perf: add prepared LongMemEval pair harness
joslat Jul 29, 2026
ff00ddc
docs: correct fixed-ten extraction accounting
joslat Jul 30, 2026
e4ed2cf
test: fail fast on LongMemEval extraction loss
joslat Jul 30, 2026
19ecc10
test: isolate LongMemEval extraction retries
joslat Jul 30, 2026
bc68336
fix: request JSON for LLM extraction
joslat Jul 30, 2026
8aab20d
perf: isolate raw message storage cost
joslat Jul 30, 2026
ed9860c
perf: batch raw message ingestion
joslat Jul 30, 2026
0a2efd4
perf: isolate extraction model cost
joslat Jul 30, 2026
0d4e867
perf: isolate frozen extraction persistence
joslat Jul 31, 2026
a06d918
perf: unify structured extraction calls
joslat Jul 31, 2026
dea9140
perf: measure bounded cold-build concurrency
joslat Aug 2, 2026
62c2559
perf: batch multi-session structured extraction
joslat Aug 3, 2026
7079ede
perf: optimize structured cold-build pipeline
joslat Aug 4, 2026
86ddeda
perf: fuse structured memory persistence
joslat Aug 4, 2026
a83f699
perf: wire batched LongMemEval preparation
joslat Aug 5, 2026
2567d49
perf: add bounded LongMemEval checkpoint
joslat Aug 5, 2026
945218f
perf: parallelize prepared memory extraction
joslat Aug 5, 2026
f8ea146
perf: read batch aliases in the scripted model stand-in
joslat Aug 6, 2026
1c2add8
perf: measure the integrated cold-build pool curve
joslat Aug 6, 2026
21b0ea8
fix: damp and decay the retention access boost
joslat Aug 6, 2026
ae067c1
fix: stop reporting unobservable gold attribution as a retrieval miss
joslat Aug 6, 2026
7e20e53
feat: allow LongMemEval recall to exclude formatter boilerplate
joslat Aug 6, 2026
d16f139
fix: never persist a message that could never be retrieved
joslat Aug 7, 2026
1c4c786
fix: stop one oversized message blanking an entire embedding batch
joslat Aug 7, 2026
ad21bad
fix: exclude diagnostic judge retries from the base call contract
joslat Aug 7, 2026
52b5425
fix: fail bootstrap when an index is left in the FAILED state
joslat Aug 7, 2026
ce208b0
feat: add no-memory floor and full-history ceiling reference arms
joslat Aug 7, 2026
4f2c92e
docs: document the reference arms and the band a score is read against
joslat Aug 7, 2026
3199179
fix: restore time to the LongMemEval answer context
joslat Aug 7, 2026
1bb918e
feat: add per-session budget cap and chronological answer context
joslat Aug 7, 2026
3f6bfed
fix: keep the no-memory floor to the question alone
joslat Aug 7, 2026
427a206
feat: verify the cold build is adequate, not merely sound
joslat Aug 7, 2026
4957add
fix: date structured memory items, and retain the cold build for anal…
joslat Aug 7, 2026
4ab4a76
fix: give the Structured and Hybrid arms the same corrections as Raw
joslat Aug 7, 2026
0c31673
fix: stop persisting AgentEval's fabricated session-boundary turns
joslat Aug 7, 2026
07cb99d
fix: deduplicate facts on a canonical triple instead of raw strings
joslat Aug 7, 2026
7d224ba
fix: seal the prepared manifest against real conversation, not inject…
joslat Aug 7, 2026
4b37f8e
fix: model AgentEval's internal judge retries in the call contract
joslat Aug 7, 2026
c7cddeb
fix: apply canonical fact identity to the fused write path too
joslat Aug 7, 2026
6b6ee43
feat: retrieve a relation whole via canonical-predicate expansion
joslat Aug 7, 2026
4bc1c84
feat: add a controlled predicate vocabulary for extraction
joslat Aug 7, 2026
bba44b7
feat: offer the established relation vocabulary to extraction
joslat Aug 7, 2026
b920984
feat: wire the predicate vocabulary into the extraction call site
joslat Aug 7, 2026
b23ccdd
feat: expose the predicate vocabulary to the LongMemEval harness
joslat Aug 7, 2026
2c06f84
feat: expose canonical-predicate expansion on the fact repository
joslat Aug 8, 2026
7f5bfae
feat: wire canonical-predicate expansion into fact recall
joslat Aug 8, 2026
5505134
feat: expose predicate expansion to the LongMemEval arms
joslat Aug 8, 2026
fffc2f8
fix: distinguish out-of-window provenance from corruption (G5-BUG1)
joslat Aug 8, 2026
f301041
diag: name the exception behind retrieval-diagnostics-error
joslat Aug 8, 2026
1c543c8
fix: keep predicate expansion inside AgentEval's evidence cap (G5-BUG1)
joslat Aug 8, 2026
176c937
fix: two audit findings - value canonicalization and the second valid…
joslat Aug 8, 2026
c98d2d1
feat: add the canonical-key backfill queries (Phase 1.1)
joslat Aug 8, 2026
046497d
fix: expansion scope semantics (Phase 1.2 and 1.3)
joslat Aug 8, 2026
c88e23a
fix: pin provider concurrency into the checkpoint fingerprint (Phase …
joslat Aug 8, 2026
beb972e
feat: wire the canonical-key backfill into bootstrap (Phase 1.1 compl…
joslat Aug 8, 2026
e6651ea
feat: adopt retained volumes, and fail closed until reuse is finished
joslat Aug 8, 2026
abd4dd0
feat: finish --reuse-prepared-volumes; a retrieval experiment now cos…
joslat Aug 8, 2026
3547753
fix: stop the orphan sweep destroying the only copy of a graph
joslat Aug 8, 2026
39c45b0
feat: report the observed predicate distribution of a prepared volume…
joslat Aug 8, 2026
27e6b68
fix: report predicates per owner, not only globally (J1.2)
joslat Aug 8, 2026
2d1c078
feat: resolve a question's verbs onto stored relations (J2.1)
joslat Aug 8, 2026
99d75d8
feat: fingerprint the extraction vocabulary and query lexicon into ru…
joslat Aug 8, 2026
a1f3d48
feat: expand on the relations a question names, not only those top-K …
joslat Aug 8, 2026
bd2770b
fix: one relation table for both extraction and retrieval
joslat Aug 8, 2026
f06fd80
feat: record the context cost of each arm (J5.1)
joslat Aug 8, 2026
9547d1a
feat: author the relation vocabulary as a licensed JSON artifact (J1.…
joslat Aug 8, 2026
56a24b0
feat: apply the independent vocabulary review (J1.4 round 2)
joslat Aug 8, 2026
ce889b7
fix: correct the family metadata and gate inflection collisions
joslat Aug 8, 2026
c19f31f
feat: apply the round-3 vocabulary review (J1.4 round 4)
joslat Aug 8, 2026
43199e2
feat: suppress assistant boilerplate, and actually merge PARAREL and …
joslat Aug 8, 2026
732846b
fix: make storedOnly survive the stemmer (J1.4 round 6, plateau)
joslat Aug 8, 2026
d9e2d43
feat: reject the imperative-instruction shape (J1.4 structural)
joslat Aug 8, 2026
5e30ddf
fix: let recall filter reasoning traces by outcome (K5)
joslat Aug 8, 2026
82bc81a
fix: un-retire `welcomed`, and declare expansion exemptions (J1.8)
joslat Aug 8, 2026
6043288
fix: align mid-session formatter padding, unblocking samples beyond t…
joslat Aug 8, 2026
a8d4353
feat: add a read-only surface probe for reasoning and GraphRAG (K2)
joslat Aug 8, 2026
0385156
feat: route aggregation questions to relation completeness (J4.1)
joslat Aug 8, 2026
fba4849
feat: keep GraphRAG item identity so it can be attributed (K4)
joslat Aug 8, 2026
c1b5845
test: hold surface budget enforcement with a test, not a comment (K5)
joslat Aug 9, 2026
8b96c1e
test: verify GraphRAG owner isolation on a never-exercised path (K7)
joslat Aug 9, 2026
a390d31
perf: measure GraphRAG at a non-zero budget
joslat Aug 9, 2026
4ace2e8
fix: make the public registration API able to configure the memory sy…
joslat Aug 9, 2026
b522cab
test: re-run J1.5 gate 1 after J1.6, on the real lexicon
joslat Aug 9, 2026
994699e
feat: add four relations and gate the vocabulary across splits
joslat Aug 9, 2026
c82281b
fix: stop a rejected arm discarding its own measurements
joslat Aug 9, 2026
0c332bf
fix: split a multi-session batch only for failures its own shape caused
joslat Aug 9, 2026
e5b20e3
docs: correct a wrong claim about retry policy in the split fix
joslat Aug 9, 2026
85ff7ff
fix: retry transport failures so a long preparation can finish
joslat Aug 9, 2026
db02e5c
docs: state the IOptionsMonitor limitation of the instance overload
joslat Aug 9, 2026
d947270
fix: require batch calls to be accounted for, not to be perfect
joslat Aug 9, 2026
d1c9c48
fix: tell permanent provider failures apart from transient ones
joslat Aug 9, 2026
96aff53
feat: measure whether gold evidence was retrieved, not just learned
joslat Aug 9, 2026
9221ea9
feat: report which relations a question resolved to
joslat Aug 9, 2026
a7eafc4
feat: add the query-side relations the n=50 losses actually needed
joslat Aug 9, 2026
ee9f003
fix: read the judge verdict whatever prefix it uses
joslat Aug 9, 2026
9b40b65
feat: measure relation completeness -- the instrument Phase L is gate…
joslat Aug 9, 2026
193f823
fix: clear the three merge blockers found by pre-merge review
joslat Aug 9, 2026
10be1d6
perf: re-record the hermetic-S baseline for the batching work
joslat Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions AgentMemory.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@
</Folder>
<Folder Name="/tools/">
<Project Path="tools/AgentMemory.Cli/AgentMemory.Cli.csproj" />
<Project Path="tools/AgentMemory.LongMemEval/AgentMemory.LongMemEval.csproj" />
<Project Path="tools/AgentMemory.TckBridge/AgentMemory.TckBridge.csproj" />
<Project Path="tools/AgentMemory.TckBridge.Nams/AgentMemory.TckBridge.Nams.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/AgentMemory.Tests.Integration/AgentMemory.Tests.Integration.csproj" />
<Project Path="tests/AgentMemory.Tests.Performance/AgentMemory.Tests.Performance.csproj" />
<Project Path="tests/AgentMemory.Tests.Unit/AgentMemory.Tests.Unit.csproj" />
<Project Path="tests/AgentMemory.Tests.Unit.LongMemEval/AgentMemory.Tests.Unit.LongMemEval.csproj" />
<Project Path="tests/AgentMemory.Tests.Unit.SemanticKernel/AgentMemory.Tests.Unit.SemanticKernel.csproj" />
</Folder>
</Solution>
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- **Facts are now identified by canonical keys.** `Fact` nodes carry `subject_key`, `predicate_key`,
`object_key` and `owner_key`, and upserts MERGE on those rather than on the raw triple. This is what
makes one relation reachable under all of its stored phrasings.

**Upgrading an existing database:** call `ISchemaBootstrapper.BootstrapAsync()` before writing, as
the getting-started guide and every sample already do. It backfills the keys onto existing facts
idempotently. **If you skip it, an upsert of a fact that already exists will not match it and will
create a duplicate** — the pre-1.4 rows have no keys to match on. `agentmemory schema-check` now
reports this state explicitly so it is visible before it causes damage.

- `INeo4jTransactionRunner` implementations that do not also implement `INeo4jAtomicTransactionRunner`
no longer throw at construction. Persistence degrades to pass-through and reports
`SupportsAtomicRollback = false` instead of refusing to start.


## [1.3.0] - 2026-07-19

### Added
Expand Down
6 changes: 3 additions & 3 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
which builds and runs cleanly under net10.0). net8.0 costs nothing to add and lets consumers on the
still-widely-deployed .NET 8 LTS use the library without adopting a newer runtime; net10.0 keeps
pace with the newest release. Verified with real builds and executed tests on all three TFMs, not
just compiled. Scoped the same way as the packaging metadata below, plus excluding the three
non-packable tools/ console apps (Cli, TckBridge, TckBridge.Nams), which stay single-targeted. -->
<PropertyGroup Condition="$(MSBuildProjectName.StartsWith('AgentMemory')) and !$(MSBuildProjectName.Contains('.Tests')) and !$(MSBuildProjectName.Contains('.Sample')) and '$(MSBuildProjectName)' != 'AgentMemory.Cli' and '$(MSBuildProjectName)' != 'AgentMemory.TckBridge' and '$(MSBuildProjectName)' != 'AgentMemory.TckBridge.Nams'">
just compiled. Scoped the same way as the packaging metadata below, plus excluding the four
non-packable tools/ console apps (Cli, LongMemEval, TckBridge, TckBridge.Nams), which stay single-targeted. -->
<PropertyGroup Condition="$(MSBuildProjectName.StartsWith('AgentMemory')) and !$(MSBuildProjectName.Contains('.Tests')) and !$(MSBuildProjectName.Contains('.Sample')) and '$(MSBuildProjectName)' != 'AgentMemory.Cli' and '$(MSBuildProjectName)' != 'AgentMemory.LongMemEval' and '$(MSBuildProjectName)' != 'AgentMemory.TckBridge' and '$(MSBuildProjectName)' != 'AgentMemory.TckBridge.Nams'">
<TargetFramework></TargetFramework>
<TargetFrameworks>net10.0;net9.0;net8.0</TargetFrameworks>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ graph TD
| **Purpose** | Domain contracts — all models, interfaces, and configuration types shared across the system |
| **Dependencies** | **Microsoft.Extensions.AI.Abstractions** 10.8.0 (approved, D-AR2-1) — .NET BCL otherwise (multi-targets net8.0/net9.0/net10.0) |
| **MUST NOT reference** | Neo4j.Driver, Microsoft.Agents.*, any GraphRAG SDK, any MCP SDK, any NuGet package **except** Microsoft.Extensions.AI.Abstractions |
| **Key types** | 49 domain records (Conversation, Message, Entity, Fact, Preference, Relationship, MemoryHistoryQuery, MemoryHistoryRecord, ReasoningTrace, ReasoningStep, ToolCall, ToolCallStats, IngestionItemOutcome, etc.), 39 service interfaces (incl. `IMemoryIsolationPolicy`, #100), 11 repository interfaces, 16 configuration types (incl. `MemoryRankingOptions`, `MemoryIsolationOptions`), 24 enums (incl. `MemoryProfile`, `RankingIntent`, `DuplicateStatus`, `EntityMatchType`, `MemoryNodeKind`, `MemoryOperationAccess`, `MemoryIsolationMode`, `IngestionStatus`, `IngestionStage`, `IngestionItemStatus`, `MemoryItemKind`, `IngestionFailureMode`, `MemoryTrustLevel`) (see the catalogs in `design.md §5/§6` for the authoritative, per-type list) |
| **Key types** | 51 domain records (Conversation, Message, Entity, Fact, Preference, Relationship, MemoryHistoryQuery, MemoryHistoryRecord, ReasoningTrace, ReasoningStep, ToolCall, ToolCallStats, IngestionItemOutcome, MemoryContextRankedItem, UnifiedExtractionResult, etc.), 41 service interfaces (incl. `IMemoryIsolationPolicy`, `IUnifiedMemoryExtractor`, and `IMultiSessionUnifiedMemoryExtractor`), 11 repository interfaces, 16 configuration types (incl. `MemoryRankingOptions`, `MemoryIsolationOptions`), 24 enums (incl. `MemoryProfile`, `RankingIntent`, `DuplicateStatus`, `EntityMatchType`, `MemoryNodeKind`, `MemoryOperationAccess`, `MemoryIsolationMode`, `IngestionStatus`, `IngestionStage`, `IngestionItemStatus`, `MemoryItemKind`, `IngestionFailureMode`, `MemoryTrustLevel`) |

**Namespace structure:**
```
Expand Down
Loading