Data Handling
subprocessors · retention · training disclosures
a product of ultisim

Data Handling, Subprocessors & AI Training Disclosures

Effective 2026-04-26 Last updated: 2026-04-26 Owner: UltiSim Inc.

§1 Overview

Ri Koh ("the Service") is an AI-assisted enterprise knowledge platform built and operated by UltiSim Inc. ("UltiSim", "we"). This page is the canonical source of truth for how customer data is handled by the Service, which third-party subprocessors receive that data, what those subprocessors do with it, how long it is retained, and what compliance attestations each one carries.

This document is updated whenever a subprocessor is added, removed, or changes its policies materially. The effective date is shown at the top.

The short version Customer data submitted to Ri Koh is never used to train any AI model. All data is encrypted in transit and at rest. Each tenant's data is logically isolated. We use enterprise-grade subprocessors with current SOC 2 Type II attestations.

§2 Sovereignty & Residency Stance

📄 For a print-friendly handout covering the three-way routing and 🔒 sovereign toggle, see the AI Sovereignty 1-pager.

Ri Koh provides a three-tier sovereignty model. Customers pick the tier that matches their risk profile, per query or per tenant.

  • Default tier — Anthropic API. Standard commercial use; processed in Anthropic-managed AWS in the United States.
  • Sovereignty tier — AWS Bedrock. Customer-pinned AWS region (commercial or GovCloud for FedRAMP-aligned workloads). Same Claude model weights as the default path; the contractual perimeter is the customer's existing AWS account and BAA / DPA.
  • Air-gap tier — local model. Runs entirely inside the customer's network on customer-owned hardware; no inference traffic leaves the perimeter.

The full matrix — region pinning, training opt-outs, attestations, recommended use — lives in §9.6. All three tiers receive identical post-retrieval context: switching tier changes which legal entity and infrastructure runs the inference, not what the model is allowed to see. Ri Koh additionally enforces an automatic, non-overridable rule: any retrieved chunk classified as sensitivity_level='restricted' forces the query to the air-gap tier regardless of user choice.

Standard subscription gives every customer access to all three providers. The Sovereignty (Bedrock) and Air-gap (Local) tiers require customer-side configuration (AWS account or on-premise hardware). Enterprise agreement adds UltiSim-managed setup, BAA / DPA / FedRAMP-aligned attestations, and dedicated support — typically required by federal, defense, and healthcare buyers.

What every tier includes Logical multi-tenant isolation · TLS-1.2+ in transit · AES-256 at rest · contractual no-train clauses with the chosen AI provider · short retention windows · revocable JWT auth · SOC 2 Type II subprocessors · per-tenant database / object store / vector index bindings.

§3 Data Flow

Every customer-data path through the Service. Note the classification gate at ingest — every document gets a sensitivity_level + contains_pii flag the moment it enters the index, and that classification follows it into every downstream context retrieval.

┌─────────────┐ ┌──────────────────┐ │ Browser │ ── HTTPS (TLS 1.2+) ─────────────────────────▶ │ Cloudflare │ │ PWA / web │ ◀── HTTPS responses ── │ Workers / D1 / │ └─────────────┘ │ R2 / Vectorize / │ │ KV │ └────────┬─────────┘ │ ┌─── Upload ──────────────┤ ▼ │ ┌──────────────────────────────┐ │ │ Classification gate │ │ │ (sensitivity_level set, │ │ │ contains_pii flagged, │ │ │ owner_team assigned) │ │ └──────────────┬───────────────┘ │ │ │ ▼ │ ┌──────────────────────────────┐ │ │ Index → D1 + Vectorize │◀───────────┘ │ Files → R2 (per-tenant) │ └──────────────┬───────────────┘ │ ┌──────────────────┴──── Query / RAG ────────────┐ ▼ ▼ ┌──────────────────────┐ ┌─────────────────────────┐ │ Anthropic API │ │ Optional services │ │ (Claude inference) │ │ • Google Drive / Docs │ │ Train opt-out: YES │ │ • Google Vertex AI │ │ Retention: 30 d │ │ • ElevenLabs (TTS) │ └──────────────────────┘ │ • Brave (web search) │ └─────────────────────────┘ External pull-based sources (Google Drive folders, Slack channels, public proposal scanners) are registered in the data_connectors table with a name, scope, and inherited classification default. See §9.5 below.

§4 Data Categories & Classification

Every document that enters the index is classified along two independent axes — access scope (who is allowed to read it) and sensitivity level (how the data should be handled). Both axes are recorded on the document row at ingest and can be edited by an admin at any time.

Data categories we process

  • Identity — email address, display name, profile picture, hashed password (PBKDF2 / 100k iterations), session JWTs.
  • Tenant content — uploaded documents (PDF / DOCX / TXT), Google Drive imports, knowledge entries, capability matrix, contacts, proposals, marketing items.
  • Conversational — chat queries and assistant responses, conversation history (per session), feedback ratings.
  • Telemetry — query intent classification, response time, source citations, audit-log entries for admin actions (db-query, user-create, password-reset, connector-update).
  • Personalization — user_memory entries (durable facts derived from conversations), preferences.
  • Integration tokens — Google OAuth refresh tokens (encrypted), API keys for connected services.

Access-scope axis (who can read)

  • core — visible to every authenticated member of the tenant.
  • restricted — visible only to admins or to specific role-grants in the document_roles table.
  • personal — visible only to the uploader (and admins).

Sensitivity-level axis (how to handle it)

  • public — content already in the public domain (e.g., a posted RFP, a press release). No handling restriction beyond standard care.
  • internal — default for new uploads. Routine business information; not for external publication without review.
  • confidential — competitively sensitive (pricing, win strategy, customer-specific data). Triggers tighter retention and a stronger audit trail.
  • restricted — regulated or privileged (CUI, attorney-client privileged, HIPAA-touching). Should not be sent to a generic AI provider without an enterprise agreement covering it.

PII flag

A separate contains_pii boolean is set per document. The default is false on upload; admins can mark true when a document is known to contain personal information (resumes, contractor lists, customer org charts). Documents flagged contains_pii=true are subject to data-subject deletion requests on a per-document basis.

Classification provenance

Every document also records classification_source (one of auto, manual, inherited) plus classified_by and classified_at so an auditor can reconstruct who set each label and when. Manual reclassification by an admin is logged to admin_audit_log via the admin.connector_update / admin.classification_update action records.

How to classify a document

  • At upload — the system applies sensitivity_level='internal', contains_pii=0, classification_source='auto' by default. The uploader's tenant role is recorded as owner_team.
  • After upload (admin or owner) — open the document in /documents, click the row to expand the detail panel, and use the 🔒 Classification (SOC2) editor to change sensitivity, toggle the PII flag, or set the owner team. Saving flips classification_source to manual and stamps your identity + timestamp.
  • ProgrammaticallyPATCH /api/documents/:id/classification with { sensitivity_level, contains_pii, owner_team } in the body. Same audit treatment as the UI path.
  • Tenant-wide statsGET /api/documents/classification-stats returns by_sensitivity counts, PII total, and by classification_source breakdown.

What is and isn't auto-indexed into the searchable knowledge base

Chat queries, AI responses, and generated artifacts are NEVER auto-indexed. Only content the user explicitly adds becomes searchable. This is a deliberate design choice to keep the knowledge base clean and prevent off-the-cuff conversation from polluting the source-of-truth corpus.

Specifically, content becomes searchable (i.e., goes into chunks + Vectorize and is returned by RAG retrieval) only via these explicit user actions:

  • File upload — the user uploads a PDF / Word / TXT / etc. via /documents or via the chat composer's 📎 button.
  • Google Drive folder sync — an admin connected a specific Drive folder via the Drive connector. Files in that folder are indexed on a schedule.
  • Slack channel sync — an admin enabled syncing for a specific Slack channel. Messages are indexed.
  • Promote to Source of Truth (planned) — an opt-in button on any artifact or chat response that converts that one item into an indexed document. Disabled by default; explicit user action required.

Content that never auto-indexes:

  • Chat queries you type into Ri Koh or Marvin
  • AI responses generated by either persona
  • Artifacts generated via the artifact pipeline (white papers, briefings, slide decks, study guides, etc.) — they live in their own artifacts table and do not leak into RAG search
  • Marvin "Action Plan" deliverables
  • Generated images (saved or unsaved)
  • Conversation history

Each indexed item carries source provenance (upload, gdrive, slack, eventually artifact-promoted or chat-promoted) so an auditor can trace exactly how every searchable record entered the corpus.

§5 Encryption

In transit
TLS 1.2+ on every external hop. Worker-to-subprocessor calls are HTTPS only. Cloudflare's edge enforces modern cipher suites; fallback to older protocols is disabled.
At rest — D1
AES-256 by Cloudflare; per-tenant database isolation.
At rest — R2
AES-256 by Cloudflare; per-tenant bucket bindings.
At rest — Vectorize
AES-256 by Cloudflare; per-tenant index bindings.
At rest — KV (denylist)
AES-256 by Cloudflare. Used only for revoked-JWT identifiers.
Secrets
Stored as Cloudflare Worker Secrets (encrypted at rest, never logged).
Passwords
PBKDF2-HMAC-SHA-256, 100,000 iterations, per-user 16-byte random salt.
JWTs
HS256 with 256-bit secret. Includes jti; checked against KV denylist on every request; revoked on logout and password change.

§6 Retention

  • Tenant content (D1, R2, Vectorize) — retained for the duration of the customer's active subscription. On termination, deleted within 30 days unless the customer requests export first.
  • Chat queries and responses (D1 query_log) — retained for the customer's active subscription; powers Query Insights.
  • User_memory entries — retained for the active session of the user; deletable on request.
  • Audit log (admin_audit_log) — retained 13 months for SOC 2 evidence purposes.
  • Anthropic API inputs / outputs — retained up to 30 days by Anthropic for trust & safety abuse detection, then deleted (Anthropic Commercial Terms). Zero Data Retention available on enterprise agreement.
  • Anthropic prompt cache5 minutes default, 1 hour maximum. Auto-purged. Used to reduce inference cost on repeated non-customer prompt prefixes (persona instructions, brand voice, style guidance). Customer data — retrieved RAG chunks, conversation history, user queries — is never placed inside the cache boundary. Same Anthropic Commercial Terms apply: cached content is not used to train models. Bedrock cache layer follows the same posture in the customer-pinned region.
  • Cloudflare logs — request metadata retained per Cloudflare's standard policy (typically 7 days for non-enterprise plans).
  • Google OAuth tokens — refresh tokens stored until the user disconnects Google or is deactivated.

§7 Access Controls

  • Authentication — JWT cookie or Bearer token, validated on every API request via unifiedAuthMiddleware. Revocation via KV denylist (jti) on logout and password change.
  • Authorization — per-tenant DB/R2/Vectorize bindings; non-admin users post-filtered against document scopes (core / restricted / personal) and document_roles.
  • Multi-tenant isolation — each tenant has its own D1 database, R2 bucket, and Vectorize index; routing is enforced by tenantMiddleware before any handler runs.
  • Rate limiting — 5/min on login endpoints, 3/hour on registration and password reset (Cloudflare ratelimit bindings).
  • Registration gate — limited to @ultisim.com email domain or one-time invite code; open self-registration is disabled.
  • Admin audit log — admin user-create, user-update, password-reset, db-query actions are logged with user identity, IP, and full payload to admin_audit_log.

§8 AI Training Opt-Outs

UltiSim does not use customer data to train any model. Our default AI provider (Anthropic) does not use API inputs or outputs to train its models, per their published Commercial Terms. The same opt-out applies to the AWS Bedrock alternative path (per AWS Bedrock service terms) and trivially to the local LM Studio path (data never leaves the customer's network). Image-generation traffic via Google Vertex AI is also not used for model training under Google Cloud's standard terms. See §9.6 for the full provider matrix.
One conditional: ElevenLabs (text-to-speech, used for the artifact-audio feature) may use audio inputs to improve their models on standard subscription tiers. The opt-out requires an Enterprise tier with explicit DPA. UltiSim is verifying current subscription tier; if you have a sensitivity concern with TTS specifically, request a confirmation from us.

§9 Subprocessor List

We engage the following subprocessors to provide the Service. Each processes customer data only as needed to deliver its function and is bound by a written agreement that includes confidentiality, security, and use-restriction obligations.

Vendor Data received Region Train opt-out Retention Attestations DPA / Terms
Cloudflare, Inc.Application infrastructure (Workers / D1 / R2 / Vectorize / KV / Pages) All customer content + identity + telemetry. Primary host for the Service. Global edge; can be regionally pinned via Enterprise. N/A — not an AI provider Per service: D1/R2/Vectorize for subscription duration; logs ~7d standard. SOC 2 Type II · ISO 27001 · ISO 27018 · PCI DSS · HIPAA available · FedRAMP Moderate (select services).
trust hub →
Cloudflare DPA
Anthropic, PBCAI inference (Claude API) Assembled prompts (system prompt + retrieved context + user query + conversation history); model responses returned. United States (Anthropic-managed AWS). YES — per Commercial Terms, API data not used to train models. Up to 30 days for trust & safety; ZDR available on enterprise agreement. SOC 2 Type II · ISO 27001 · ISO 42001.
trust.anthropic.com →
Commercial Terms · DPA on request
Google LLCDrive / Docs / OAuth / Vertex AI image generation OAuth-scoped Drive file metadata + content the user explicitly imports; Doc creation/edit when user invokes "Draft to Doc"; image-generation prompts via Vertex AI. Global; Vertex AI region currently us-central1. YES — Workspace and Vertex AI prompts not used to train models per Cloud Data Processing Addendum. Per Google's standard policies; tokens until user disconnects. SOC 2 Type II · ISO 27001/27017/27018 · FedRAMP High (Workspace/Cloud) · HIPAA BAA available.
cloud.google.com/security/compliance →
Cloud DPA · Workspace DPA
ElevenLabs Inc.Text-to-speech (artifact audio overviews) Text content of the script the user generates audio for; resulting MP3 returned and cached in tenant R2. United States. CONDITIONAL — opt-out requires Enterprise tier + explicit DPA. Verify current tier. Per ElevenLabs policy; UltiSim deletes generated audio on artifact deletion. SOC 2 Type II · GDPR-aligned.
elevenlabs.io/security →
ElevenLabs DPA
Brave Software, Inc.Web search (Brave Search API), optional Query string only when user enables web-search toggle. No customer documents or PII sent. United States. YES — Brave does not use API queries to train models per their developer terms. Brave standard query log retention. Privacy-focused vendor; Search API privacy → Brave API Terms
Slack Technologies (Salesforce)Optional outbound digest delivery (#sbirs-of-interest) Daily SBIR digest content posted to a single configured channel. Inbound webhooks signed and verified (HMAC). Per Slack workspace region. N/A — Slack does not use customer messages to train AI by default; covered by Salesforce trust commitments. Per Slack workspace retention setting. SOC 2 Type II · ISO 27001 · FedRAMP Moderate.
slack.com/trust →
Slack MSA
How to subscribe to subprocessor changes Email linda.bernard@ultisim.com with subject line "Subscribe to subprocessor changes" and we'll notify you at least 30 days before any new subprocessor is added or an existing one is replaced.

§9.5 Internal Data Connectors

In addition to subprocessors (which receive data from us), Ri Koh pulls data from several customer-controlled sources to feed the index. Each pull-based source is registered in the data_connectors table with an explicit name, type, scope, credential reference, and classification default. This gives an auditor a single query to answer "every external source that feeds your index, the credential that pulls from it, and the classification its items inherit."

Connector types currently supported:

  • gdrive — Google Drive folder sync. Credential: per-user OAuth refresh token (gdrive_oauth_token_user_<id>). Scope: a specific folder path. Read-only access at the OAuth-scope level.
  • slack — Slack channel sync. Credential: workspace bot token (slack_bot_token). Scope: a single channel name. Read-only at the bot-scope level (channels:history, channels:read).
  • sbir-grants-gov / sam-gov / dod-sbir / nasa-sbir-portal — public-data scanners feeding the proposal pipeline. No credential required (public APIs); scope is the search-keyword set.

Items pulled by a connector inherit the connector's classification_default (typically internal for Drive/Slack, public for the proposal scanners). Admins can override per-document via the classification edit endpoint.

Connector creation, updates, and deactivation are logged to admin_audit_log as admin.connector_update entries.

§9.6 AI Provider Sovereignty Matrix

Ri Koh routes Claude inference through one of three providers selectable per-query from the chat composer. The default is Anthropic's commercial API; customers with regional residency, FedRAMP, or air-gap requirements can override to AWS Bedrock or to a local model. All three paths run the same Anthropic Claude model weights; what differs is the contractual and infrastructural envelope that surrounds them.

Provider Region pinning Train opt-out Attestations Recommended use
Anthropic API default United States (Anthropic-managed AWS); not customer-pinnable on standard tier. YES — Commercial Terms (API data not used for training). SOC 2 Type II · ISO 27001 · ISO 42001. Standard commercial workloads. Lowest latency, highest throughput, simplest billing.
AWS Bedrock sovereignty tier Customer-pinned AWS region. Commercial: us-east-1 · us-west-2. GovCloud: us-gov-west-1 for FedRAMP-aligned workloads. YES — AWS Bedrock service terms (prompts and completions not used to train Anthropic models). SOC 2 Type II · ISO 27001 · FedRAMP High (GovCloud) · HIPAA-eligible. Federal customers, regulated industries, customers requiring an explicit US-region commitment, or any workload covered by an existing AWS BAA / DPA.
Local LM Studio air-gap tier On-premise — runs entirely inside the customer's network. Reached via the customer's own Cloudflare Tunnel; no model traffic leaves customer infrastructure. YES — model and weights are local; data never leaves the customer environment. Inherits the customer's own controls. Suitable for environments where third-party AI processing is prohibited. Restricted-sensitivity content (CUI, attorney-client privileged, regulated PII). Auto-engaged when retrieved chunks carry sensitivity_level='restricted'.

How a provider is selected

The provider for a given query is chosen by precedence (highest wins):

  1. Sensitivity override (non-overridable security control) — if any retrieved RAG chunk carries sensitivity_level='restricted', the query is automatically routed to the local provider. The user cannot bypass this; the response is tagged with a SOVEREIGNTY FORCED badge for audit visibility.
  2. Per-query manual override — the chat composer exposes a provider dropdown and a 🔒 toggle. The dropdown selects Anthropic / Bedrock / Local for that single query; the 🔒 toggle pins all subsequent queries to local until cleared.
  3. Tenant default — each tenant has a default provider field; absent that,
  4. Worker default — the DEFAULT_AI_PROVIDER environment variable (currently anthropic).

What gets sent to each provider

Identical request shape across all three: the assembled system prompt, the retrieved RAG context, the user query, and the recent conversation history (max 10 turns). No identity tokens, no JWTs, no cross-tenant data — the post-retrieval context is already filtered to the requesting user's access scope before the provider is invoked. The provider that answered each query, the model ID, and the sovereignty-forced flag are surfaced on every response and recorded in query_log for auditability.

§10 DPAs & Customer Agreements

UltiSim will execute a Data Processing Agreement (DPA) with any customer that requests one. Our standard DPA covers:

  • Roles & responsibilities of UltiSim as Processor and customer as Controller (GDPR Article 28 framework).
  • Subprocessor list (this document) and 30-day notification of changes.
  • Security measures: TLS, AES-256, access controls, multi-tenant isolation, incident response.
  • Standard Contractual Clauses (EU-to-US transfers) where applicable.
  • Data subject request handling (access, rectification, deletion, portability, restriction, objection).
  • Breach notification within 72 hours of UltiSim becoming aware.
  • Audit rights (subject to confidentiality).

Email linda.bernard@ultisim.com with "Request DPA" in the subject line to receive a copy. Custom redlines accepted.

§11 User Rights

  • Access & export — users can export their tenant's data (documents, knowledge entries, proposals, contacts) on request. Format: structured JSON + original file binaries.
  • Rectification — users can edit any of their content directly via the app; admins can correct any tenant-wide content.
  • Deletion — account and tenant deletion handled within 30 days of written request; cascade deletes propagate to D1, R2, Vectorize, and revoke JWTs via the denylist. Anthropic-side retention follows §6.
  • Portability — exports are in open formats (JSON, original PDF/DOCX) with no proprietary lock-in.
  • Objection / restriction — request to linda.bernard@ultisim.com.

§12 Incident Response

  • UltiSim monitors Cloudflare and Anthropic security advisories continuously.
  • Suspected security incidents are triaged within 4 hours of detection.
  • If a confirmed incident affects customer data, UltiSim will notify the affected customer's designated security contact within 72 hours of becoming aware, including: nature of the incident, data categories impacted, mitigation taken, and recommended customer actions.
  • Post-incident: written root-cause analysis shared with the affected customer.

§13 Contact

Security & privacy
DPA requests
linda.bernard@ultisim.com · subject "Request DPA"
Subprocessor change notifications
linda.bernard@ultisim.com · subject "Subscribe to subprocessor changes"
Data subject requests
Mail
UltiSim Inc. — address on request