Docs

Classify your data

Data classification sorts every field your product stores or sends into a class, and the class decides whether it may leave the customer's environment. In a control plane ⇄ data plane design, it decides what each plane holds.

Draw the line per field, not per service: moving whole services is expensive, and one column can decide a security review. You fill the worksheet from your code; the buyer's security review has the final say.

Say "customer data" or "content", not "PII". In a database product, the rows are the content.

Classes

Most fields fall into a class with an obvious answer:

ClassWhat it isTypical fieldsWhere it goes
ContentWhat the product exists to store or processMessage bodies, documents, files, code, records, prompts, attachmentsData plane
Outputs and derived dataAnything computed from contentModel answers, summaries, reports, search indexes, embeddings, caches, extracted textData plane
Text that describes contentShort text that reveals contentSubjects, titles, previews, filenames, URLs, query text, custom instructions, error messages with excerptsData plane by default
Identifiers of outside peoplePeople who aren't users of your productEmail addresses, names, phone numbers, IP addressesJudgment call
CredentialsAccess to the customer's systemsOAuth tokens, database passwords, API keys, signed URLsData plane, or the customer's own secret store
Activity and metadataRunning, securing, and billing the productOrganizations, users, roles, plans, random IDs, timestamps, status, counts, sizes, durations, versions, error categoriesControl plane

Derived data is content. A search index or an embedding can rebuild much of what it was made from.

Judgment calls

Some fields have no default answer. Decide them with the buyer, and write the answer down:

FieldWhy it's hardUsual answer
Email addresses, participant namesNeeded for routing and limits, but often personal dataAsk. Either answer works once it's written down.
Filenames, document titles, repository namesThey look like labels but describe contentData plane
Query textCan reveal what the customer is working onData plane when it touches customer data
Hashes of sensitive valuesA hash of a short or predictable value can be reversed by guessingEquality lookups only, and only if the buyer agrees
AggregatesCounts over small groups can identify peopleControl plane; ask when groups are small
Schedules and activity timingThey show how and when the customer worksControl plane, stated in the security review
Logs and error reportsFree text can carry contentSend categories and IDs; keep messages in the data plane
Training and evaluation dataNeeded to improve the productCompute metrics in the data plane and send numbers

Tests for each field

Check every field you keep in your cloud for breach, reconstruction, and need:

  • Breach. If this table leaked, would the customer's security team call it a breach of their data?
  • Reconstruction. Could someone recover or guess the content from it?
  • Need. Do sign-in, billing, authorization, scheduling, or operating the deployment need it? If not, don't send it, even when it's allowed.

Then trace every path that crosses between the planes: API responses, events, webhooks, logs, error reports, analytics, and support tools. See Paths that leak.

Worked example

A contract review product stores a customer's contracts, extracts clauses, and flags risky terms with a model. The buyer says "our contracts can't leave our account":

Field or pathClassPlaneCrosses as
contracts.file, extracted textContentData planeNever
contracts.title, counterparty nameText that describes contentData planeNever
Clause index, risk flags, summariesOutputs and derived dataData planeNever
Reviewer email addressesIdentifier of an outside personControl plane for nowMetadata report; buyer to confirm
Document storage credentialsCredentialCustomer's secret storeNever
contracts.id, uploaded_at, page count, review statusActivity and metadataControl planeMetadata report
Reviews per monthActivity and metadataControl planeUsage report
review.completed webhookPathIDs only; the consumer fetches from the data plane
Model provider error logsPathError category only; provider errors can echo the prompt

The data plane ends up small: the routes that upload, read, and review contracts, their storage, the clause index, and the model calls. Sign-in, billing, review assignments by ID, and status stay hosted.

Write it down

Keep the result as a table in your design record, one row per field: where it is in the code, its class, its plane, how it crosses, and the reason.

Send the open questions to the buyer. "For this phase" is a valid answer when it's written down, and the next customer will ask the same questions.

Next

On this page