Stratify
Legal and compliance

PLAN

docs/compliance/isms/PLAN.md

Source updated 03. Aug. 2026

Stratify — Compliance Documentation Plan

v0.1 · 1 August 2026 · Owner: ISMS Owner (Toby)


1. The actual problem

Stratify has real, running production infrastructure (self-hosted on Hetzner since 2026-06-03), real personal data flowing through it, and a genuinely substantive privacy document already (docs/compliance/dsgvo-data-flow.md, owned by Antonios) — but no ISO 27001-shaped management system sits above the technical controls, and the existing compliance docs have drifted out of sync with the real infrastructure (Vercel → Hetzner, Resend → AWS SES, neither corrected yet). The gap isn't "get certified" — it's build the ISMS from the ground up, grounded in verified facts (see `register/facts.md`), so that:

  • Every claim Stratify makes to a neobroker partner, an institutional investor, or eventually an

FMA regulator is traceable to a controlled document and a piece of evidence, in that order.

  • The documentation set is itself credibility collateral for B2B partner onboarding — partners

integrating via REST/webhook/MCP will ask what's behind the audit-log claims.

  • Certification (ISO 27001, if ever pursued) becomes a formality on top of an existing system,

not a scramble to retrofit one.

Two things worth being honest about upfront, straight from facts.md:

  • Production is real and live, unlike a pre-launch product — this ISMS is retrofitting

controls around a running system with real subscriber and signal data, not writing ahead of go-live. Several controls score implemented (RLS, audit-log append-only enforcement, GDPR export/erasure) because they genuinely are, not aspirationally.

  • Zero required human PR reviewers (single-committer repo) is a real, current

segregation-of-duties gap (Annex A 5.3) — document it as what it is.


2. Scope decisions

QuestionDecisionWhy
PurposeReadiness/sales-enablement documentation, not an audit-track certification effort. No external auditor booked.[CONFIRMED with Toby, 2026-08-01] — mirrors the approach already validated on the sedAI ISMS.
ISMS scope statementThe stratify product (web + mobile + B2B API) and its Hetzner-hosted infrastructure. Exclude the wait, what. Advisory entity's other ventures — Stratify is a distinct product/data boundary even though it shares the controller entity pre-incorporation.A narrow, honest scope beats a broad one nobody can actually stand behind.
Controller of recordwait, what. Advisory, pending Stratify AG/GmbH incorporation.[CONFIRMED with Toby, 2026-08-01] — matches dsgvo-data-flow.md's own placeholder.
ISMS rolesISMS Owner + Security Officer = Toby; DPO / Privacy Owner = Antonios. Philipp not assigned an ISMS role.[CONFIRMED with Toby, 2026-08-01] — matches existing README role descriptions and dsgvo-data-flow.md's existing Owner: Antonios.
Lead frameworkISO 27001:2022 Annex A as the control spine.What was asked for; the harder superset if SOC 2 is ever added later.
Privacy regimeDual-track GDPR (EEA subscribers) + revDSG (CH controller entity). Single document set, dual citations, same as the existing dsgvo-data-flow.md approach.Two parallel sets diverge within a year; GDPR/revDSG substantive overlap is high enough to share one document per topic.
**Relationship to existing docs/compliance/*.md**Not replaced. dsgvo-data-flow.md, signalgeber-classification.md, regulatory-roadmap-ch-eea.md, pentest-rfp.md, etc. stay where they are as the operational/regulatory-strategy layer Antonios and Toby already maintain. The new privacy/PRIV-* docs are thin ISO-formatted wrappers that cite dsgvo-data-flow.md sections rather than duplicating them — one source of truth, two shapes (operational doc + audit-ready doc set).Duplicating a 150-line, actively-maintained document into a second copy guarantees drift. Citing it doesn't.
LanguageEnglish primary. German only where a Swiss/German authority specifically reads it (matches the existing regulatory-roadmap-ch-eea.md/dsgvo-data-flow.md convention of German for those).Consistency with the existing compliance corpus.
FormatMarkdown in git, generated outputs (SoA) on release, same register/build pattern as sedAI's ISMS.Version control *is* the change-management evidence ISO 27001 cl. 7.5 asks for; already proven on sedAI.
Locationdocs/compliance/isms/ (in-repo, git-tracked) — not a sibling untracked folder like sedAI's.stratify already tracks its compliance narrative in-repo (docs/compliance/); the ISMS is a natural subtree of that, not a separate concern.
Source corpusReuse ~/thoughtful-toby/sedAI/compliance/sources/ (ISO27k Toolkit, BSI, GDPR/DSG legal texts, EDÖB guidance) rather than re-downloading — that material is generic to the frameworks, not sedAI-specific.Saves a redundant ~116MB download and re-licensing exercise for material that's already on disk.

3. Architecture — one register, many outputs

docs/compliance/isms/
├── PLAN.md                   # this file
├── README.md                 # entry point / what's here
├── register/
│   ├── facts.md               # verified stratify ground truth — cite this, don't restate it
│   ├── schema.md               # front-matter + register field conventions
│   ├── controls.yaml           # Annex A 93 controls: applicability, justification, owner,
│   │                           #   status, evidence pointer, GDPR/revDSG crosswalk
│   ├── risks.yaml               # risk register — 9 real risks seeded from facts.md
│   ├── assets.yaml               # information assets — 13 real assets seeded from facts.md
│   └── suppliers.yaml             # sub-processors, DPA status, review dates — 12 seeded
├── governance/                # Tier 0 — ISO 27001 cl. 4-10 mandatory documents
├── policies/                  # Tier 1 — what we commit to
├── procedures/                # Tier 2 — how it actually gets done
├── privacy/                   # Tier 3 — GDPR + revDSG (cross-references dsgvo-data-flow.md)
├── evidence/                  # generated + collected, dated, immutable
└── tools/
    ├── build_controls.py      # Annex A list + crosswalk → controls.yaml
    ├── fill_controls.py       # Phase 0 gap-analysis judgments → controls.yaml
    ├── link_controls.py       # document front-matter → controls.yaml policy_doc/procedure_docs
    └── soa.py                 # controls.yaml → Statement of Applicability

Phase 0 complete as of this plan: facts.md, schema.md, all four register YAMLs, and the full build pipeline (all four scripts) exist and run cleanly — controls.yaml has all 93 controls judged (5 implemented, 39 partial, 35 not_started, 13 not_applicable, 1 planned), and `governance/GOV-06-statement-of-applicability.md` is generated from it.


4. Document set

Tier 0 — Governance (ISO 27001 cl. 4–10, mandatory)

#DocumentClauseStatus
GOV-01ISMS Scope & Context4.1–4.3pending
GOV-02Information Security Policy5.2pending
GOV-03Roles, Responsibilities & Authorities (RACI)5.3pending — roles now confirmed, just needs writing up
GOV-04Risk Assessment & Treatment Methodology6.1.2pending
Information Risk Register (register/risks.yaml)6.1.2seeded, 9 real risks
GOV-06Statement of Applicability6.1.3dgenerated from controls.yaml
GOV-07Risk Treatment Plan6.1.3epending
GOV-08Security Objectives & Metrics6.2pending
GOV-09Competence, Awareness & Training Plan7.2–7.3pending
GOV-10Control of Documented Information7.5pending
GOV-11Internal Audit Programme & Procedure9.2pending
GOV-12Management Review — Procedure & Record Template9.3pending
GOV-13Nonconformity & Corrective Action Log10.2pending — first entries already known (stale hosting/vendor docs, see RISK-001)

Tier 1 — Policies (Annex A grouped into 12 domains)

Information Security · Acceptable Use & Asset Management · Access Control & IAM · Cryptography & Key Management · Supplier & Cloud Security · Secure Development · Operations & Change · Logging & Monitoring · Incident Management · Business Continuity & ICT Resilience · HR Security · Physical & Remote Working.

Tier 2 — Procedures

#ProcedureGrounds it in reality (from facts.md)Evidence it produces
PRO-01Joiner / Mover / LeaverSingle-engineer today — write for the team stratify is growing intoaccess-change log
PRO-02Access review (quarterly)RBAC roles exist (subscriber_roles); no review process yetsigned review export
PRO-03Partner/B2B onboarding & key provisioningpartner_api_keys, partner_users are real tablesprovisioning/revocation log
PRO-04Secure SDLC & code-review gatePartially realdos-ci.yml required check exists; SCA scanning is a gap to close hereCI run history
PRO-05Change & release managementPull-based systemd deploy timer is real (docs/runbooks/deploy.md)deploy log
PRO-06Vulnerability & patch managementReal gap — no SCA scanning exists; this procedure should specify and then close itscanner reports, once wired
PRO-07Backup & restore (incl. restore test)Already real but incomplete — nightly pg_dump exists, restore never tested (RISK-004)restore test report
PRO-08Incident response — dual-clock decision treeGDPR 72h / revDSG "so rasch als möglich"; a real P0 runbook already exists for one scenario (audit-chain corruption) to generalise fromincident log
PRO-09Data subject / access request handlingAlready realgdpr-export.ts + eraseSubscriberData, admin-triggeredrequest log (audit_log already captures gdpr.erasure.completed)
PRO-10Sub-processor onboarding & reviewReal supplier list in facts.md — seeded into suppliers.yamlsuppliers.yaml, DPAs
PRO-11Cryptographic key / secrets managementKeychain (dev) / Docker env (prod) per docs/secrets.md; no formal rotation cadence enforcedkey inventory
PRO-12Logging, monitoring & alertingSentry (server-only, gap) + PostHog exist; no alerting rules documentedlog/alert config
PRO-13Business continuity & DR testSingle-host, no redundancy (RISK-007, accepted risk)annual test report
PRO-14Penetration test & remediationReal gap — RFP drafted, never sent, infra-scope stale (RISK-006)test report, tracker
PRO-15Asset & information classificationSeeded assets.yaml from real tables in facts.mdassets.yaml
PRO-16Security awareness training deliveryNot yet run — team of one, easy first passcompletion records

PRO-08 gets special attention. Stratify is exposed to two notification clocks today (GDPR Art. 33's 72h to the supervisory authority, and revDSG Art. 24's "as soon as possible", no fixed deadline) — and a third (DORA-equivalent 4h/24h clocks) becomes live once the FMA Liechtenstein licence lands per regulatory-roadmap-ch-eea.md. Write the decision tree for two clocks now, extend for the third at Phase C.

Tier 3 — Privacy (GDPR + revDSG)

Each of these is a thin ISO-formatted wrapper that cites `docs/compliance/dsgvo-data-flow.md` rather than re-deriving its content — see scope decision in §2. The wrapper adds the ISO front matter, the Annex A controls: linkage, and the one or two things the operational doc doesn't cover (the RoPA split, the Bearbeitungsreglement).

#DocumentBasisRelationship to existing docs
PRIV-01Records of Processing — controllerGDPR 30(1), revDSG 12Splits dsgvo-data-flow.md §1-3 into controller-role entries
PRIV-02Records of Processing — processor-role activities (B2B partner data)GDPR 30(2)Splits dsgvo-data-flow.md §1-3 into processor-role entries
PRIV-03BearbeitungsreglementVDSG Art. 5Net new — no equivalent exists yet, see note below
PRIV-04Technical & Organisational MeasuresGDPR 32, DSG 8 + VDSG 3Formalises dsgvo-data-flow.md §9, adds the RLS/audit-log/OTP specifics from facts.md
PRIV-05Data Processing Agreement (Stratify's own paper, for B2B partners)GDPR 28Net new — needed once partners hand Stratify any personal data
PRIV-06Sub-processor list + change-notification processGDPR 28(2)Cites register/suppliers.yaml, formalises the quarterly-review cadence already stated in dsgvo-data-flow.md §10
PRIV-07DPIA / DSFA — core productGDPR 35, DSG 22Formalises dsgvo-data-flow.md §8's "not required in Phase A" determination — needs re-evaluation trigger tied to Phase C (suitability engine, KYC)
PRIV-08Transfer Impact AssessmentSchrems II, GDPR 44 ff.Formalises dsgvo-data-flow.md §6 — AWS SES, Apple/Google/Expo push are the live third-country transfers to assess
PRIV-09Data subject rights procedureGDPR 15–22Documents the already-implemented export/erasure code path (facts.md) — the self-service gap (Phase B per dsgvo-data-flow.md) is the honest open item
PRIV-10Breach notification procedureGDPR 33/34, DSG 24= PRO-08
PRIV-11Retention & deletion scheduleGDPR 5(1)(e)Formalises dsgvo-data-flow.md §2's per-table retention column
PRIV-12Privacy notices — website, candidates, partnersGDPR 13/14, DSG 19Net new — check consistency against whatever's live on the marketing site

PRIV-03 is a hard legal obligation, not optional, same reasoning as on the sedAI ISMS: under VDSG Art. 5 a private controller must maintain a Bearbeitungsreglement where it carries out large-scale processing or high-risk profiling. Stratify processes financial-signal delivery data at scale (signal_deliveries, audit_log) — the determination needs to be made and documented either way; an assessed "not required" is defensible, silence is not.


5. Phasing

PhaseOutputDone when
0 — Baselinefacts.md, schema.md, all four register YAMLs, full build pipeline, controls.yaml judged for all 93 controlsComplete
1 — GovernanceTier 0 complete (GOV-01,02,03,04,07,08,09,10,11,12,13 — GOV-06 SoA generated in Phase 0)Complete, all drafted (`status: draft`) — not yet approved; first management review (GOV-12) not yet held
2 — PoliciesTier 1, all 12Complete, all drafted — approval + version-tag pending
3 — ProceduresTier 2, all 16Complete, all drafted — several (PRO-04, PRO-05, PRO-09) document controls already operating; several (PRO-06, PRO-07's restore test, PRO-14) describe a procedure not yet exercised, stated honestly in each document
4 — PrivacyTier 3, all 12Complete, all drafted — PRIV-03's VDSG Art. 5 determination documented (threshold not currently met, concrete trigger defined); dsgvo-data-flow.md's two stale references (Vercel, Resend) flagged inline throughout but not yet corrected in that source document itself — still open, tracked in GOV-13
5 — Approval + close known gapsManagement review #1 held (GOV-12); all 52 docs move draftapproved; SCA scanning wired into dos-ci.yml; one restore drill logged; pentest RFP sent (post infra-scope fix); dsgvo-data-flow.md/pentest-rfp.md correctedEach closes a RISK-* entry in register/risks.yaml or a GOV-13 nonconformity
6 — Evidence automationCI jobs emit access reviews / scan reports / restore-test results into evidence/Auditor (if ever engaged) can self-serve

6. Open decisions — need answers before the phase they block

  1. Stratify AG/GmbH incorporation timeline — blocks nothing in Phase 1-4 (controller-of-record

is confirmed as wait, what. Advisory for now) but should be re-verified before PRIV-01/GOV-01 are marked approved.

  1. Buy ISO 27001 + 27002 texts (~CHF 380)? Recommend yes before Phase 2 (policy drafting) —

27002's control text drives Tier 1 wording directly. Same recommendation as the sedAI ISMS.

  1. Who fixes the stale `dsgvo-data-flow.md`/`pentest-rfp.md` references (Vercel→Hetzner,

Resend→SES) — Toby (infra author) or Antonios (document owner)? Either works; just needs an owner before Phase 4 closes PRIV-01/02/08.

  1. Second human reviewer timeline — no date established. RACI (GOV-03) needs to either name a

target or document why single-engineer is an accepted risk for now (RISK-002).