Skip to content
Contextely

Access control

Turn AI on for everyone, not for one team

Most companies pilot AI in one department because the alternative is every agent reading everything. Contextely decides who may read what per person, per team and per memory.

The failure mode

Redaction is not access control

The usual design fetches broadly, hands everything to a model, and asks it to leave out what the reader should not see.

Why that fails

A model that has read a salary can allude to it, summarise around it, or be talked into it. And afterwards there is no artefact proving it did not: the record says the model was shown the row and chose well.

What happens here instead

Entitlement is a multiplicative factor inside the ranking function. An object the asker may not see scores exactly zero and leaves with the irrelevant ones, so nothing downstream ever holds it.

nothing to redactnothing to leak

Two questions, not one

Sharing and clearance are different, and both are checked

Collapsing them into one list is how a share dialog quietly reaches nobody, or everybody.

Sharing

Who was it given to?

Private to you, shared with a team, or shared with the whole company. Being on any one of those lists is enough, and teams nest, so sharing with Finance reaches Payroll inside it and not the other way round.

Clearance

What must a reader hold?

A memory can additionally require grants like finance. This one is a conjunction: every requirement must be satisfied. A memory shared with everybody and requiring finance reaches only the finance holders.

src/lib/retrieval/score.ts
const scopeFactor = isEntitled(asker, candidate.requiredScopes) ? 1 : 0;
const shareFactor = mayShare(asker, sharedWith, asker.principals) ? 1 : 0;
const entitlementFactor = scopeFactor * shareFactor;

const score = relevance * freshness * usefulness * entitlementFactor;

Both factors are 1 or 0, so their product is 1 or 0. Neither axis can widen the other by accident, which is the property that makes them safe to reason about separately.

What an administrator sees

A page that answers what Sam’s agent can read

Not a policy document. A count, per person, produced by the same two functions the ranking runs.

Where it goes furthest

Two people open the graph and see different graphs

Every relationship is an assertion made by one memory object, so a graph is exactly the set of assertions its viewer was allowed to have read.

The edge carries it

An entity existing is not a disclosure. The assertion about it is. So entitlement lives on the relationship, and a thing is visible exactly when some relationship you may read touches it.

The budget is yours alone

A walk follows a fixed number of relationships from each thing. That cut is taken from the ones you may see, so you never get fewer results because of neighbours you may not.

And it says what is missing

The graph tells you how many things and relationships are not yours to see. Drawing a smaller picture and letting you believe it is the whole one is the alternative.

Share one memory with one team. Two calls.

No sales call, no pilot, no seat minimum. Seats are free on every tier.