A person is not a thirty-day window
Profiles get recomputed from recent activity, so everything a person actually told you — a suppression, a preference, a withdrawn consent — decays out of the model that is supposed to respect it.
Recomputed profiles forget the things people said
Behavioural signal is rebuilt continuously and stated signal is not, so the two decay at completely different rates and only one of them is legally binding.
A suppression is behaviour-shaped, so it fades
Someone asks not to be shown a category. That is stored as a flag on a profile that gets rebuilt from a rolling window, and the flag survives exactly as long as whatever process remembers to reapply it.
Consent state has a history and the profile has none
Consent was given, narrowed, then withdrawn. The profile holds the current answer and cannot say what was permitted at the moment a given impression was served — which is the only version a regulator asks about.
Frequency capping across surfaces is a memory problem
Each surface counts its own impressions. Nothing holds the person-level count, so the cap is enforced per channel and violated in aggregate.
Mostly persistent. Then three others.
Every application built on CortexDB is a different mixture of the same five memory jobs. That mixture is what makes this a different piece of software from the one next to it, even though the infrastructure underneath is identical.
Preferences and corrections survive the session and the handoff
What someone stated is stored as durable and revisable, separately from what was inferred about them. It does not decay because a window rolled, and a later correction is recorded as replacing the earlier state rather than sitting beside it.
- Stated in January, still in force in December.
- A withdrawal replaces what it withdrew.
- No rebuild can quietly drop it.
What was permitted then
Consent has an effective date. An impression is judged against the state in force when it was served.
Not everything known belongs in this bid
Selection narrows a long history to the part this decision is actually about.
What was shown, and what happened
Creative, surface, moment and outcome held together instead of counted separately.
That is four of the five. The fifth — shared memory, one store a whole fleet reads and writes — leads for sales and customer success instead. Same engine, different mixture.
Stated signal arrives through the channels, not the pipeline
Stated signal arrives through preference centres, support conversations and replies — and reaches the decisioning pipeline, if at all, through whatever automation someone wired up between them.
01 Wire the sources
Vendor connectors ship as extras on the connector package.
pip install 'cortexdb-connectors[slack,salesforce]'
02 Write the stated thing, separately from the inferred one
Behavioural inference can be rebuilt whenever you like. This cannot — which is exactly why it belongs somewhere durable.
curl -X POST http://localhost:3141/v1/experience \
-H 'Content-Type: application/json' \
-d '{
"scope": "ws:audience/person-4471",
"modality": "observation",
"content": {
"kind": "text",
"text": "Asked not to be shown finance-category creative on any surface. Consent for cross-site measurement withdrawn at the same time."
},
"context": { "observed_at": "2026-08-27T09:14:00Z" },
"idempotency_key": "prefcentre:person-4471:2026-08-14"
}'
03 Recall before deciding
One assembled pack holding the stated state and its history, so the decision can respect it and the record can prove it did.
from cortexdb.v1 import V1Client
client = V1Client(api_url="http://localhost:3141", actor="agent:audience")
pack = client.recall(
scope="ws:audience/person-4471",
query=decision_context,
view="holistic",
include=["facts", "beliefs"],
budgets={"max_tokens": 500},
)
reply = llm.respond(decision_context, context=pack["context_block"])
pip install cortexdbai
or npm i cortexdbai — both ship the same client.
Full endpoint reference in the
docs.
This is the corpus regulators actually inspect
A durable person-level memory is, definitionally, the thing consent law is about. Where it lives, how it is deleted, and who can read it are product decisions, not deployment details.
CortexDB is a single container. It runs on your own hardware, inside your VPC, or air-gapped — with the embedding and generation calls pointed at a local model if nothing may leave at all.
docker run -d --name cortexdb -p 3141:3141 -v cortexdb-data:/data cortexdb/cortexdb:latest
Deployment options, model routing and the enterprise notes are on the download page.
The same infrastructure, a different mixture
Each of these leads with a different memory job, pulls from a different set of sources, and needs a different call. All of them, by job.
Bring the workflow that gets it wrong.
Not the demo. The one that answered from the wrong version, or asked a question it had already been told the answer to.