Use case AdTech

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.

01 What breaks

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.

01

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.

02

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.

03

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.

02 What it’s made of

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.

Dominant · Persistent memory

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.
Valid time

What was permitted then

Consent has an effective date. An impression is judged against the state in force when it was served.

Decision context

Not everything known belongs in this bid

Selection narrows a long history to the part this decision is actually about.

Episodic memory

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.

03 What feeds it

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.

Install
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.

Store an experience
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.

Recall it
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.

04 Where it runs

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.

Run it
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.

05 The rest

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.