feat(security): expand /security into an honest trust center#220
Merged
Conversation
Rework the thin security page into a full trust center for regulated buyers, with a truthful current status for every area a security review asks about — no aspirational compliance claims. - At-a-glance status table linking to each section - Architecture and data-flow map (local vs on-prem vs hosted boundary; where PHI can and cannot go), lifted from openadapt-flow docs/PRIVACY.md - Encryption boundaries: optional AES-256-GCM at-rest bundle/checkpoint sealing, hosted per-org secrets vault, bundle integrity manifest, TLS + Windows control-channel fingerprint pinning, HMAC-bound ingest - Data retention and deletion (operator-owned locally; no fixed hosted schedule yet) - Real subprocessors: Netlify, Supabase, Modal, Stripe, PostHog, Cal.com, GitHub; no default model provider - Identity/access: real org RBAC + row-level tenant isolation today; SSO/SAML/SCIM stated as not yet available - Release integrity: SLSA provenance + PEP 740 attestations today; desktop installers unsigned/ad-hoc (signing not yet); no SBOM - Vulnerability disclosure, incident response, and secure-development posture stated honestly - DPA/BAA scoped per engagement; no standing BAA program - SOC 2: no active audit, not held; never "built to meet SOC 2" Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The trust-center rewrite reworded the SOC 2 line to "report"; the security-boundary e2e contract asserts the exact honest phrase "OpenAdapt does not hold a SOC 2 attestation today". Restore it (still fully truthful: no attestation, no report, no audit in progress). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Review issue #7
The
/securitypage was too thin for the regulated buyers OpenAdapt targets. This reworks it into a full trust center that gives a security reviewer a truthful, current status for every area they ask about — with no aspirational compliance claims. (Note: the earlier "architecture built to meet SOC 2 requirements" overclaim is not present on currentmain; this PR makes the honest SOC 2 posture explicit and prominent so it cannot creep back.)Same URL (
/security), so every existing inbound link, the sitemap entry, and the docs.openadapt.ai "Security" header link keep resolving to one canonical trust home. I deliberately did not fork this into a separate openadapt-ops docs page — mkdocs already points its "Security" link atopenadapt.ai/security, so a second page would fragment the source of truth.Sections added, each with a verified status
openadapt-flow/docs/PRIVACY.mdPHI touchpoint map +docs/LIMITS.md(local / optional on-prem VLM / hosted zones; where PHI can & can't go)openadapt-flow/openadapt_flow/crypto.py(opt-in AES-256-GCM, scrypt KDF),docs/phi_at_rest.md; hosted secrets vaultopenadapt-cloud/src/lib/secrets.ts+secretsCrypto.ts(per-org AES-256-GCM, write-only, single-use replay token); bundle manifestopenadapt_flow/ir.py; TLS pinningdocs/phi_in_transit.md; ingest HMACopenadapt-cloud/src/lib/runtimeValidationContract.tsopenadapt-cloudmigrations0001_init.sql/0013_fix_tenant_isolation.sql: real owner/admin/member RBAC + Postgres RLS tenant isolation. SSO/SAML/SCIM explicitly NOT available (auth = Supabase Auth)SHA256SUMS) + OpenAdapt wheel; PEP 740 PyPI attestations on flow/tray/desktop-wheel. Desktop installers unsigned (Win/Linux) / ad-hoc (macOS) — filenames literally say so; signing CI is credential-gated & disabled. No SBOM anywhereopenadapt-flow/SECURITY.md+dependabot.yml: SHA-pinned Actions, Dependabot, PR-gated changes, PHI choke point. (No CodeQL/SAST claimed — none exists)openadapt-flow/SECURITY.md: private GitHub advisory, 5-business-day ack, reporter creditdeploy/on-prem/COMPLIANCE.md: "we do not sign a BAA." DPA scoped per engagementSOC 2 wording used (verbatim)
Status chip: "No active audit." This never overclaims regardless of the true stage.
security@openadapt.aimailbox (verified: code search returns 0 hits across repos). The page uses the real channels: GitHub private advisories +hello@openadapt.ai. If you want a dedicatedsecurity@, create the mailbox and I'll switch the page to it.publicTruth impact
No
publicTruth.test.jsorlegalTruth.test.jsassertion changed or relaxed./securitystays in the sitemap (required by thesitemap includes … trust surfacestest). The subprocessor list matches the gated Privacy Notice. All copy is honest/hedged in the house style.Gates
npm test(73 node tests incl. publicTruth/legalTruth/navContract): passnpm run build(static export of/security): passNot merging — for review.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NyCHrzA1psrKMFfroYbzaM