What AgentCore Memory is
AgentCore Memory has two tiers, and the whole confusion comes from not knowing which one a given call touches. Short-term memory is raw events, written with CreateEvent, scoped to an actor and a session: this is conversation history, and you do not semantically search it. Long-term memory is extracted records organised into namespaces, normally produced asynchronously by a background memory strategy that reads short-term events and extracts records into a namespace.
BatchCreateMemoryRecords is the other door into long-term memory: for a fact you've already structured yourself, it writes directly into a namespace, skipping the extraction strategy entirely. That's the one with a gotcha the docs don't state.
The write-then-read sequence
Step 1 of 4
1. Write
BatchCreateMemoryRecords returns 201 Created with a memoryRecordId. That means accepted, not yet proven queryable.
2. Get by id
GetMemoryRecord with that id succeeds immediately. The record exists and is addressable, right away.
3. Read by namespace
RetrieveMemoryRecords or ListMemoryRecords against the namespace returns zero records. Same record, same moment, a different answer.
4. Poll until visible
Measured 15 to 30 seconds later across three runs (16s, 27s, 15s for the semantic read), the record appears. Eventually consistent, not a bug.
Two tiers, one API each
Writing to the wrong tier, or reading it the wrong way, is a quiet failure: the call succeeds and the data just isn't where you're looking for it.
Raw events, written with CreateEvent, one per turn or in batches, scoped to an actor and a session. This is conversation history. You do not semantically search it.
Extracted records organised into namespaces. Normally produced asynchronously: a memory strategy runs in the background, reads short-term events, and extracts records into a namespace. Read with RetrieveMemoryRecords, a semantic search scoped to a namespace. BatchCreateMemoryRecords is the other door in: for a fact you've already structured yourself, it writes directly into the namespace, skipping the extraction strategy entirely.
Three ways to read it back, three different guarantees
AgentCore's own docs say long-term generation from events is asynchronous. They don't say a direct BatchCreateMemoryRecords write also indexes asynchronously. You'd reasonably assume the direct door skips the wait, because you did the extraction yourself. It doesn't skip the indexing.
Immediate. Read by id, and the record you just wrote is there right away. This is the only read that isn't eventually consistent, so it's the one to use when you need certainty a specific record landed and you already hold its memoryRecordId.
Eventually consistent. A plain namespace listing. Across three measured runs it took 16, 23 and 15 seconds after the write for a newly-created record to appear.
Eventually consistent, same order of magnitude. The semantic search scoped to a namespace, and the read path a real agent actually uses to recall a fact. Took 16, 27 and 15 seconds after the write across three runs before the record showed up.
Full write-up
The measured runs, the tenant-isolation IAM detail, and the CI check that catches a hallucinated SDK method before a human does: The AgentCore Memory write that returns success and reads back empty.