Skip to main content
This page summarises Causeloop’s readiness for a SOC 2 Type I and Type II report, drawn directly from docs/SOC2-TYPE-I-READINESS-PLAN.md and docs/SOC2-TYPE-II-READINESS-AUDIT.md. Controls that are not yet fully implemented are represented accurately as partial or gaps — not as complete.
Where we are: Causeloop has an unusually strong security-by-design foundation for a pre-audit product. The technical architecture — real JWT + Clerk RS256/JWKS, RBAC permission catalogue, RLS on tenant tables, rate limiting, idempotency, a comprehensive audit log, TLS, and envelope encryption design — positions it well for Type I. The gaps that block a Type II report are real and documented below.

Target scope

The planned SOC 2 scope covers three Trust Services Categories:
CategoryIn scopeNotes
Security (CC1–CC9)YesPrimary category
Availability (A1)YesHealth endpoints, uptime
Confidentiality (C1)YesEncryption, export controls
Processing Integrity (PI1)PartiallyDeferred for Type I pending ingestion engine
Privacy (P1–P8)PartiallyRTBF + export APIs exist; full pipeline pending

Type I vs. Type II

Type IType II
What’s testedControls designed and in place on a specific dateControls operated effectively over a 3–12 month window
Evidence burdenEach control exists and is documentedEach control kept working throughout the window
Realistic timeline~8–12 weeksType I work + observation window + audit
Buyer signal”We built this correctly""We’ve been running this reliably”
Current state: Type I is achievable within 8–12 weeks if organizational tracks (policy suite, risk assessment, vendor inventory) run in parallel with the remaining technical work. Type II requires the additional observation window after Type I controls are in place.

Controls in place

ControlStatusEvidence
JWT auth — HS256 tokens, scoped permission catalogueIn placeapp/security.py, app/models.py PERMISSIONS constant
Clerk RS256/JWKS — frontend session verificationIn placePOST /auth/exchange verifies Clerk JWTs against JWKS URL
RBAC — role-based access with typed scopesIn placerequire_scope() decorators on all protected routes; admin/owner/analyst/viewer roles
Personal Access Tokens — SHA-256 hashed, scopedIn placepersonal_access_tokens table; pat_hash stored, never plaintext
Row-Level Security — tenant data isolation at DB layerPartial — see gapsRLS + FORCE RLS on ~18 tenant tables; two-role model documented
Rate limiting — 1,000 req/min token bucketIn placeapp/middleware/rate_limit.py
IdempotencyIdempotency-Key deduplicationIn placeapp/middleware/idempotency.py
Audit log — append-only, RLS-scoped, workspace-retainedIn placeaudit_log table; 0002_audit_trace_append_only.sql trigger; ~121 call sites
TLS in transit — Caddy + Let’s EncryptIn placeCaddyfile; HSTS + security headers
CORS allowlistIn placeCORS_ORIGINS env var; no wildcard in production
Inbound webhook HMAC — fail-closedIn placex-causeloop-signature verified with hmac.compare_digest; fails closed if missing
Envelope encryption design — AES-256-GCM KEK/DEKIn place (partial wiring)app/crypto/envelope.py; workspace_keys table; 0003_workspace_keys.sql
Retention policy model — per-workspace configurable retentionIn placeworkspace_settings retention columns; app/services/retention.py
RTBF API — Article 17 request trackingIn placePOST /governance/rtbf/requests; subject_ref HMAC-hashed; duplicate-request guard; erasure certificate endpoint
Data export API — tenant data exportIn placePOST /governance/exports; RLS-scoped; secrets excluded from export
Non-root containerIn placeDockerfileadduser appuser; USER appuser
NOSUPERUSER app rolecauseloop_appIn place0006_resolve_inbound_webhook.sql GRANT guidance; docs specify NOBYPASSRLS

Partial controls and gaps

Technical gaps (code-addressable)

#GapCriteriaEffortStatus
1Real password hashing — password login currently accepts any password (no Argon2/bcrypt)CC6.1SGap
2Centralized logging + SIEM + metrics/tracing — no structured log aggregation, no security alertingCC7.1–7.3, CC4.1LGap
3Security alerting — no automated alerts on auth failures, rate-limit spikes, anomaliesCC7.2, CC7.3MGap
4Real MFA — TOTP + recovery codes endpoint is a stubCC6.1MGap — stub
5Real SSO/SAML + OIDC/sso endpoints are stubsCC6.1LGap — stub
6SCIM on Postgres — SCIM endpoints exist but are not backed by real data; no auto-deprovisioningCC6.1, CC6.5MGap — stub
7Full KMS wiringconfig_encrypted / secret_encrypted columns exist; app-layer encrypt/decrypt not fully wiredCC6.1, C1.1MPartial
8Complete RLS coverage — ~18 of ~45 tenant tables have policiesCC6.1, C1.1MPartial
9Automated verified backups — current approach is manual pg_dump runbookA1.2, A1.3MGap
10Retention purge jobpurge_expired() exists but is not scheduled; no cron or worker runs itC1.2, P4MPartial
11RTBF deletion pipeline — request tracking exists; actual hard-delete execution via erase_workspace() is wired on approve but requires DATABASE_URL at runtimeP4, P5, P8MPartial
12Export pipeline to object storage — exports return data in-response; no S3/GCS presigned URL, no checksumPI1.4, C1.1LPartial
13Dependency + container scanning in CICC6.8, CC7.1SGap
14Change-management gates — no branch protection, no expanded CI, no migration framework (Alembic)CC8.1MGap
15Real X-RateLimit-* headers — current headers are stubsCC6.1SGap

Organizational gaps (not code)

These require policies, people, and process — not code changes:
AreaGap
Security ownershipAssign a named security owner
Policy suiteWritten security policy, acceptable use policy, incident response plan, BCP/DR plan
Risk assessmentFormal, documented risk assessment
Access reviewsPeriodic (quarterly) access review sign-off
Vendor inventorySub-processor list with their SOC 2 reports (AWS/GCP/Neon, Clerk, Anthropic, OpenAI)
Data classificationFormal data classification policy
Employee security trainingAnnual security awareness training records
Physical accessRely on sub-processor SOC 2 — collect and review their reports
Incident response tabletopRun and document at least one IR simulation
Run two tracks in parallel over ~8–12 weeks: Weeks 1–2 — Foundations
  • Eng: real password hashing (Argon2id); centralized logging (Sentry + OTel); branch protection + CI + dependency scanning
  • Org: kick off policy suite; assign security owner; start risk assessment
Weeks 3–5 — Identity & access
  • Eng: real MFA (TOTP + recovery); SCIM on Postgres; extend RLS to all tenant tables; secrets management
  • Org: asset inventory; data-flow diagrams; vendor/sub-processor inventory
Weeks 4–7 — SSO, encryption, availability
  • Eng: real SSO/SAML + OIDC; full KMS wiring; automated backups + restore test; security alerting
  • Org: BCP/DR plan; incident-response plan
Weeks 6–9 — Data lifecycle & privacy
  • Eng: schedule retention purge job; wire RTBF deletion pipeline; export to object storage; LLM PII-redaction layer
  • Org: privacy notice; DPAs; data classification and retention policies
Weeks 8–12 — Readiness review
  • Assemble evidence pack; internal gap walkthrough; set “as of” date; engage auditor
Engage an auditor around week 2 to confirm scope — particularly whether to narrow Processing Integrity and Privacy for Type I. This avoids building to the wrong target.Every control put “in place” for Type I should also emit evidence logs, so the Type II observation window starts accumulating data immediately with no rework.
  • docs/SOC2-TYPE-I-READINESS-PLAN.md — sprint plan, Type I scope, evidence pack checklist
  • docs/SOC2-TYPE-II-READINESS-AUDIT.md — full five-category control matrix and gap register
  • Security model — technical implementation details
  • GDPR & data governance — privacy controls