Security

“A leak is a critical defect”

That sentence is in the project's constitution, not its marketing. Isolation is not a feature here — it is the condition everything else is built on top of.

Scoping is enforced twice,
on two different paths

Most leaks happen not on the request path — which everyone remembers to guard — but in the background job that runs an hour later and quietly inherits the wrong context.

  • HTTP requests carry their tenant in continuation-local storage, so every query issued during that request is scoped whether or not the caller remembered.
  • Background jobs do not use that mechanism at all. Each job is handed its tenant as an explicit parameter and cannot fall back to an ambient one.
  • Logs are scoped too, so a stack trace from one course cannot surface a filename from another.
isolation boundary

TENANT · DATABASES 301

documents · chunks · vectors
conversations · summaries
queue jobs · logs

— no path between —

TENANT · COMPILERS 340

documents · chunks · vectors
conversations · summaries
queue jobs · logs

What we will put in writing

Your material trains nothing

Uploads are used to answer your students and for nothing else. They are not used to train models, ours or anyone's.

Deletion is real

Removing a document removes its chunks and vectors in the same transaction. Cascade behaviour is tested, including the reversal path.

Migrations are atomic

Schema changes apply completely or not at all. A half-migrated database is the classic way isolation constraints get quietly dropped.

Adversarial review

Changes are reviewed by agents whose only job is to attempt cross-tenant escalation, break grounding, or find an irreversible delete.

Grounding is a test, not a prompt

“Answer only from retrieval” is asserted in the suite. A regression that lets training data through fails the build.

Model calls leave scoped

Requests to model providers carry the passages needed for that answer and no identifying student data beyond the conversation itself.

Coverage targets sit at 60–70% overall, weighted heavily onto the isolation and grounding paths.

data handling
WhatWhere it livesRetainedLeaves the system
Uploaded documentsObject storage, scoped per tenantUntil you delete themNo
Chunks & embeddingsPostgreSQL 15 + VectorChordLifetime of the documentNo
Retrieved passagesIn-flight onlyNot stored beyond the requestTo the chosen model, per answer
ConversationsPostgreSQL, scoped per tenantUntil you delete the courseNo
Topic analyticsRolled up nightlyAggregated, no free textNo
Application logsScoped per tenant30 daysNo

Model calls are sent to the Claude model you selected for that course. Passages leave for the duration of the answer; nothing is retained there on our behalf.

Take control of your course

Upload your material, pick a model, share the link. Most courses are answering questions the same afternoon.