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
| Question | Decision | Why |
|---|---|---|
| Purpose | Readiness/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 statement | The 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 record | wait, what. Advisory, pending Stratify AG/GmbH incorporation. | [CONFIRMED with Toby, 2026-08-01] — matches dsgvo-data-flow.md's own placeholder. |
| ISMS roles | ISMS 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 framework | ISO 27001:2022 Annex A as the control spine. | What was asked for; the harder superset if SOC 2 is ever added later. |
| Privacy regime | Dual-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. |
| Language | English 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. |
| Format | Markdown 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. |
| Location | docs/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 corpus | Reuse ~/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 ApplicabilityPhase 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)
| # | Document | Clause | Status |
|---|---|---|---|
| GOV-01 | ISMS Scope & Context | 4.1–4.3 | pending |
| GOV-02 | Information Security Policy | 5.2 | pending |
| GOV-03 | Roles, Responsibilities & Authorities (RACI) | 5.3 | pending — roles now confirmed, just needs writing up |
| GOV-04 | Risk Assessment & Treatment Methodology | 6.1.2 | pending |
| — | Information Risk Register (register/risks.yaml) | 6.1.2 | seeded, 9 real risks |
| GOV-06 | Statement of Applicability | 6.1.3d | generated from controls.yaml |
| GOV-07 | Risk Treatment Plan | 6.1.3e | pending |
| GOV-08 | Security Objectives & Metrics | 6.2 | pending |
| GOV-09 | Competence, Awareness & Training Plan | 7.2–7.3 | pending |
| GOV-10 | Control of Documented Information | 7.5 | pending |
| GOV-11 | Internal Audit Programme & Procedure | 9.2 | pending |
| GOV-12 | Management Review — Procedure & Record Template | 9.3 | pending |
| GOV-13 | Nonconformity & Corrective Action Log | 10.2 | pending — 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
| # | Procedure | Grounds it in reality (from facts.md) | Evidence it produces |
|---|---|---|---|
| PRO-01 | Joiner / Mover / Leaver | Single-engineer today — write for the team stratify is growing into | access-change log |
| PRO-02 | Access review (quarterly) | RBAC roles exist (subscriber_roles); no review process yet | signed review export |
| PRO-03 | Partner/B2B onboarding & key provisioning | partner_api_keys, partner_users are real tables | provisioning/revocation log |
| PRO-04 | Secure SDLC & code-review gate | Partially real — dos-ci.yml required check exists; SCA scanning is a gap to close here | CI run history |
| PRO-05 | Change & release management | Pull-based systemd deploy timer is real (docs/runbooks/deploy.md) | deploy log |
| PRO-06 | Vulnerability & patch management | Real gap — no SCA scanning exists; this procedure should specify and then close it | scanner reports, once wired |
| PRO-07 | Backup & restore (incl. restore test) | Already real but incomplete — nightly pg_dump exists, restore never tested (RISK-004) | restore test report |
| PRO-08 | Incident response — dual-clock decision tree | GDPR 72h / revDSG "so rasch als möglich"; a real P0 runbook already exists for one scenario (audit-chain corruption) to generalise from | incident log |
| PRO-09 | Data subject / access request handling | Already real — gdpr-export.ts + eraseSubscriberData, admin-triggered | request log (audit_log already captures gdpr.erasure.completed) |
| PRO-10 | Sub-processor onboarding & review | Real supplier list in facts.md — seeded into suppliers.yaml | suppliers.yaml, DPAs |
| PRO-11 | Cryptographic key / secrets management | Keychain (dev) / Docker env (prod) per docs/secrets.md; no formal rotation cadence enforced | key inventory |
| PRO-12 | Logging, monitoring & alerting | Sentry (server-only, gap) + PostHog exist; no alerting rules documented | log/alert config |
| PRO-13 | Business continuity & DR test | Single-host, no redundancy (RISK-007, accepted risk) | annual test report |
| PRO-14 | Penetration test & remediation | Real gap — RFP drafted, never sent, infra-scope stale (RISK-006) | test report, tracker |
| PRO-15 | Asset & information classification | Seeded assets.yaml from real tables in facts.md | assets.yaml |
| PRO-16 | Security awareness training delivery | Not yet run — team of one, easy first pass | completion 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).
| # | Document | Basis | Relationship to existing docs |
|---|---|---|---|
| PRIV-01 | Records of Processing — controller | GDPR 30(1), revDSG 12 | Splits dsgvo-data-flow.md §1-3 into controller-role entries |
| PRIV-02 | Records of Processing — processor-role activities (B2B partner data) | GDPR 30(2) | Splits dsgvo-data-flow.md §1-3 into processor-role entries |
| PRIV-03 | Bearbeitungsreglement | VDSG Art. 5 | Net new — no equivalent exists yet, see note below |
| PRIV-04 | Technical & Organisational Measures | GDPR 32, DSG 8 + VDSG 3 | Formalises dsgvo-data-flow.md §9, adds the RLS/audit-log/OTP specifics from facts.md |
| PRIV-05 | Data Processing Agreement (Stratify's own paper, for B2B partners) | GDPR 28 | Net new — needed once partners hand Stratify any personal data |
| PRIV-06 | Sub-processor list + change-notification process | GDPR 28(2) | Cites register/suppliers.yaml, formalises the quarterly-review cadence already stated in dsgvo-data-flow.md §10 |
| PRIV-07 | DPIA / DSFA — core product | GDPR 35, DSG 22 | Formalises dsgvo-data-flow.md §8's "not required in Phase A" determination — needs re-evaluation trigger tied to Phase C (suitability engine, KYC) |
| PRIV-08 | Transfer Impact Assessment | Schrems 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-09 | Data subject rights procedure | GDPR 15–22 | Documents 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-10 | Breach notification procedure | GDPR 33/34, DSG 24 | = PRO-08 |
| PRIV-11 | Retention & deletion schedule | GDPR 5(1)(e) | Formalises dsgvo-data-flow.md §2's per-table retention column |
| PRIV-12 | Privacy notices — website, candidates, partners | GDPR 13/14, DSG 19 | Net 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
| Phase | Output | Done when |
|---|---|---|
| 0 — Baseline ✅ | facts.md, schema.md, all four register YAMLs, full build pipeline, controls.yaml judged for all 93 controls | Complete |
| 1 — Governance ✅ | Tier 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 — Policies ✅ | Tier 1, all 12 | Complete, all drafted — approval + version-tag pending |
| 3 — Procedures ✅ | Tier 2, all 16 | Complete, 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 — Privacy ✅ | Tier 3, all 12 | Complete, 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 gaps | Management review #1 held (GOV-12); all 52 docs move draft → approved; 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 corrected | Each closes a RISK-* entry in register/risks.yaml or a GOV-13 nonconformity |
| 6 — Evidence automation | CI 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
- 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.
- 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.
- 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.
- 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).