Trust center
The status of every claim, with a date on each and the command that re-checks it. Claims stay conservative until third-party review is complete, and the ones ControlFrame does not make are listed at the same weight as the ones it does.
This page carries its own re-checkable artifact: the terminal SHA-256 chain digest of the eight-envelope reference trace, recomputed from the compiled contract at render time — not quoted from a report.
The demo-tenant sealing key shown across the sealed demo surfaces. No customer key appears on a public page.
SHA-256 across all eight ordered envelopes; the terminal event still records the package release as held for human authorization.
curl -sI https://controlframe.ai/api/reference-proof/trace | grep -i x-controlframe-event-chain-digestThe live endpoint answers with the same chain digest — compare it with the value shown here. The proof room replays the full envelope-by-envelope recompute in your browser.
Where the platform stands, with every target named
Measured 2026-08-24 against all repository migrations applied to an empty PostgreSQL database. The command seeds probe tenants and creates a role, so it runs against a disposable database with migrations applied — it refuses a remote one unless explicitly overridden.
psql "$DATABASE_URL" -Atc "select count(*) filter (where c.relrowsecurity) || ' shielded of ' || count(*) || ' tables' from pg_class c join pg_namespace n on n.oid = c.relnamespace where n.nspname = 'public' and c.relkind = 'r'"
A read-only catalog query. Running it against production would produce a fresh production census; the published figures above remain labeled as migration-chain results.
CONTROLFRAME_TEST_DATABASE_URL="$DISPOSABLE_DATABASE_URL" npm run security:tenant-shield:verify
This check creates probe roles and tenants, so it belongs on a disposable database with every migration applied—not on production.
| Observation | Value | Measured | Target |
|---|---|---|---|
| Application database role | controlframe_app; no superuser or BYPASSRLS | 2026-08-17 | the production database |
| Break-glass role holders | 0 | 2026-08-17 | the production database |
psql "$DATABASE_URL" -Atc "select current_user, rolsuper, rolbypassrls from pg_roles where rolname = current_user"
Run as the application connection. The answer is about the role serving requests, not an administrator.
Every claim, its status, and the date it was established
| Claim | Status | As of | What backs it, or what is missing |
|---|---|---|---|
| The repository migration chain constructs forced row-level security on 53 of 81 public tables | verified | 2026-08-24 | Measured by applying every repository migration to an empty PostgreSQL database. This is not presented as a current production census; the published command can be run read-only against production for a fresh comparison. psql "$DATABASE_URL" -Atc "select count(*) filter (where c.relrowsecurity) || ' shielded of ' || count(*) || ' tables' from pg_class c join pg_namespace n on n.oid = c.relnamespace where n.nspname = 'public' and c.relkind = 'r'" |
| The application connects as controlframe_app, which is neither a superuser nor BYPASSRLS | verified | 2026-08-17 | The fact that makes the shield real rather than decorative. It became true on 17 August 2026, and this page says what it was before. psql "$DATABASE_URL" -Atc "select current_user, rolsuper, rolbypassrls from pg_roles where rolname = current_user" |
| The migration-chain inventory is closed-world: 18 by-design exceptions, 10 explicit tenancy gaps, 0 unaccounted tables | verified | 2026-08-24 | Run on a disposable database built from every migration. The check fails if a table is neither shielded nor explicitly classified, if an unshielded table is granted to a web role, or if an inventory entry outlives its table. CONTROLFRAME_TEST_DATABASE_URL="$DISPOSABLE_DATABASE_URL" npm run security:tenant-shield:verify |
| The platform holds no super-admin accounts: 0 holders of the break-glass role | verified | 2026-08-17 | The verifier is read-only by construction and may be pointed at production. CONTROLFRAME_VERIFY_DATABASE_URL="$DATABASE_URL" npm run security:super-admin:verify |
| The measured posture is published as a signed, offline-verifiable receipt | verified | 2026-08-24 | Ed25519 over canonical JSON. The signed body identifies each measurement target, keeping migration-chain results separate from production observations, and is verifiable without a ControlFrame server in the trust path. |
| Findings against our own controls are published with the date found and the date fixed | operating | 2026-08-17 | Two findings are published with containment and remediation details, including a tenant-isolation defect corrected on the date reported. |
| Tenant access is recorded in a hash-chained log | operating | 2026-08-18 | audit_access_logs carries prev_sha256 and row_sha256 per row, so a removed or edited entry breaks the chain. |
| Where inference happens is published as the enum values the router itself returns, rendered live | operating | 2026-08-18 | inferenceBoundary, costBoundary and rawDataPolicy travel on every route and every run trace. The residency page renders them from the router at request time rather than describing them. |
| Runner data movement is protocol-specific and published without a local-only overclaim | operating | 2026-08-28 | Credentials and signing private keys remain runner-side. Legacy collection may submit bounded raw artifact bytes for custody, scanning, redaction, and review. Runner v2 is verify-only and grants no target, credential, artifact, evidence, or execution authority. |
| Restricted evidence is denied to external model endpoints by default, and the decision is recorded | operating | 2026-08-18 | The gate is fail-closed per deployment; a blocked call raises a typed error so the block itself is sealed as an auditable event. |
| The migration chain closes the database REST surface and revokes web-role grants | verified | 2026-08-24 | The disposable-database verifier proves anon and authenticated grants are revoked, including default privileges for future tables, and fails if an unshielded table is granted to either. This is a migration-chain result, not a production grant census. CONTROLFRAME_TEST_DATABASE_URL="$DISPOSABLE_DATABASE_URL" npm run security:tenant-shield:verify |
| The subprocessor list is published with purpose, data categories, and region | operating | 2026-08-28 | Derived from the dependency manifest, the host configuration, and the modules that open outbound connections — each row names the file it was derived from. |
| A vulnerability disclosure path is published | operating | 2026-08-28 | Scope, safe-reporting guidance, triage, and out-of-scope categories are published. |
| SOC 2 | not available | 2026-08-28 | No independent SOC 2 report is available or claimed. Readiness work does not constitute an examination or attestation. |
| HIPAA | not available | 2026-08-28 | Business Associate Agreement readiness is under legal and security review. HIPAA has no product certification to hold, and ControlFrame does not claim platform-wide HIPAA compliance. |
| ISO 27001 | not claimed | 2026-08-28 | Not held, not in progress, and not claimed anywhere on this site. |
| Third-party penetration test with a published summary letter | not available | 2026-08-28 | Internal adversarial testing covered privileged access and evidence-sharing surfaces on 17 August 2026. No independent penetration-test report or summary letter is available. |
| Signable DPA and BAA | not available | 2026-08-28 | Both remain templates pending counsel review. The effective privacy notice describes the implemented public lead-data path. |
| Pre-filled CAIQ v4 and SIG Lite | not available | 2026-08-28 | No pre-filled questionnaire is currently available. Buyers may provide their standard questionnaire for a scoped response. |
| EU data residency | not available | 2026-08-28 | The platform runs in AWS us-east-2 today. EU residency is a build, not a configuration setting, and no date is committed here yet. |
| Customer-managed encryption keys | not claimed | 2026-08-28 | Not available. ControlFrame will not claim customer-managed encryption keys until a customer-held key wraps the credential root and the boundary can be verified. |
| Per-organization bring-your-own-key inference | not available | 2026-08-28 | A deployment can be pointed at a customer-controlled model endpoint today. Per-organization keys are not shipped, and the platform-key fallback is a deployment setting rather than a tenant one. |
| Execution-capable enterprise runner appliance | not available | 2026-08-28 | A release-bound Runner v2 verify-only package and root-owned installation contract are available for signed binding verification. They grant no browser, target, credential, artifact, evidence, or CMS execution authority. The separate execution-capable appliance and custody contract are not released. |
| Single-tenant application deployment | not claimed | 2026-08-28 | No customer-dedicated application stack is currently offered. The shared topology relies on forced row-level security, a dated non-bypass production runtime-role observation, migration-chain closed-world verification, and production-safe adversarial probes. |
Status words, in full: verified means reperformed against the target named in the evidence with the command published; operating means implemented and running but not reducible to a single number; in progress means under way with nothing claimed until it completes; not claimed and not available both mean it is not true today, and the evidence column says what stands in its place.
Tenant isolation
The migration chain constructs forced row-level security on 53 of 81 tables and names 18 by-design exceptions plus every pending tenancy gap. Separately dated production checks cover the runtime role and an adversarial cross-tenant read.
Read the isolation mechanismPosture receipt
Named-target measurements sealed as an Ed25519 governed receipt, keeping migration-chain results distinct from production observations. Verifiable without a ControlFrame server in the trust path and fetchable as JSON.
Open the posture receiptSubprocessors
Current and deployment-selected subprocessors are listed with purpose, data categories, region, and DPA status, each row derived from the module that establishes the outbound dependency.
See the subprocessor listData residency
Five residency questions answered separately, with the live model routing table and the egress gate decisions rendered from the code that makes them rather than described.
Read the residency answersThe private runner
A protocol-specific boundary: what remains runner-side, what legacy collection can submit for governed custody, and what the released Runner v2 verify-only package expressly cannot execute.
Read the runner boundaryVulnerability disclosure
Scope, safe-reporting guidance, triage, out-of-scope categories, and the remediation priorities that protect artifact custody and audit-log integrity.
Report a vulnerabilityAI governance
Prompts are source-controlled; agent runs are traceable; humans keep review and signature authority. Restricted evidence is denied to external model endpoints by default.
Read the responsible-AI postureProof room
Current product proof, safe claims, demo route, and diligence gaps for investor, buyer, security, and audit review.
Open the proof roomPrivacy and legal artifacts
The privacy notice is effective for the implemented public lead-data path. Terms, DPA, BAA, and subprocessor contracting artifacts remain under counsel review.
Read the privacy noticeProduct assurance
ControlFrame exercises its own release, tenant-isolation, dependency, evidence-integrity, and adversarial boundary checks. These internal controls are not an independent SOC 2 examination or third-party audit.