Continuous Control Monitoring and GRC Architecture¶
Purpose. Describes Soon's home-grown GRC — how we automatically and continuously collect evidence and monitor that controls are operating, connecting live systems (AWS, GitHub, Google Workspace, WorkOS, Aikido, …) to the ISMS. It is the automation layer on top of the control catalog, policies, evidence store and dashboards Soon already has. Supports clause 9.1 (monitoring, measurement, analysis, evaluation) and controls A.8.16 (monitoring activities) and A.5.36 (compliance monitoring) — and will satisfy them once operating.
Status: DRAFT — architecture agreed, not yet built. This document is the blueprint and the honest go/no-go. The collectors themselves are built in Soon's app/infra repo, not here (see §2). Concrete account/repo/threshold choices are
TODO(owner).
1. Can we build our own GRC? Yes — and we're ~half-way¶
A GRC platform is five things: (1) a control catalog mapped to frameworks, (2) policy management, (3) evidence collection, (4) continuous control monitoring (drift detection), and (5) dashboards/reporting. Soon already has 1, 2 and 5 in this repo:
| GRC capability | Soon already has | Status |
|---|---|---|
| Control catalog + framework mapping | Statement of Applicability, ROADMAP.md | ✅ |
| Policy management | this repo (Markdown + tools/isms.py, PR-reviewed, human-approved) |
✅ |
| Evidence store + index | Evidence Register + hardened S3 store | ✅ designed |
| Dashboards | STATUS.md (auto-generated) | ✅ |
| Automated evidence collection | — | ⬜ this is what we add |
| Continuous drift detection | prompts/evidence-scan.md ("enforce with AI") |
🟡 designed, manual |
So "build our own GRC" = build the automated collection + continuous-monitoring layer and wire it to what exists. We are not starting from zero.
2. The one thing that stops us doing it here — and where it goes instead¶
This policy repo is documentation only — never application code or secrets (AGENTS.md). A GRC collector authenticates to AWS/GitHub/live environments; it is application code and it holds credentials. So the collectors cannot live in this repo. That is the hard boundary — not a blocker on building the GRC, just a rule about where each part lives:
CONTROL PLANE — the "brain" (THIS repo, no secrets) DATA PLANE — the "hands" (app/infra repo)
─────────────────────────────────────────────── ──────────────────────────────────────────
• Control catalog / SoA / policies • Collectors: read-only API calls to AWS,
• Automated Control Check Catalog (ISMS-FORM-09-6) ─spec─▶ GitHub, Google Workspace, WorkOS, Aikido…
• Evidence Register (ISMS-FORM-07-2) ◀──PR updates──── • AI drift-scan (prompts/evidence-scan.md)
• Dashboards (STATUS.md) ◀──results───── • Runs on a schedule (GitHub Actions / Lambda)
• Human review + approval (PRs) • Writes artefacts ──▶ S3 evidence store (WORM)
The bridge between the planes is exactly what we've already built: the S3 evidence
store (artefacts land there), a PR back to this repo updating the Evidence Register
(the same workflow every ISMS change uses), and prompts/evidence-scan.md (the AI
drift check). The collector layer lives in the dedicated soon-grc repo — separate
from this policy repo so no code or credentials ever enter here. soon-grc is scaffolded
(read-only AWS/GitHub collectors, a check catalog mirroring ISMS-FORM-09-6, and a
readiness dashboard); TODO(owner): connect it to the live environments and schedule it
to make CCM operate.
3. Three collection modes (not everything auto-collects — be honest)¶
| Mode | What | Good for | Rough share of controls |
|---|---|---|---|
| API collector | Read-only API/CLI call → JSON evidence + pass/fail vs a predicate | Technical config state (backups, encryption, MFA, branch protection, public access) | ~40–50% |
| AI drift-scan | Scheduled Claude Code run of evidence-scan.md in the app/infra repo — reality-vs-policy |
"Does the code/IaC still match the policy?" | overlaps the above |
| Attestation | A human records that a process happened (training, screening, restore test, management review) | People/process controls that have no API | ~50–60% |
A realistic home-grown GRC automates the technical controls and tracks the rest as attestations — it does not magically collect a signed NDA or a management-review decision. Each check in the catalog is tagged with its mode.
4. The loop (how a check runs, end to end)¶
schedule (cron) ─▶ collector authenticates read-only ─▶ runs check from the Catalog
│ │
│ pass/fail + evidence artefact
│ │
│ artefact ──▶ S3 evidence store (Object Lock / WORM)
│ │
└──────────────▶ opens a PR to THIS repo: update Evidence Register row
(status, last-collected) + append CCM results
│
merge (human) ─▶ STATUS.md dashboard refreshes
│
FAIL / drift ─▶ alert to Slack #security (a human fixes)
This mirrors Soon's existing "enforce with AI = detect drift, then a human fixes it" principle: the GRC detects and evidences; it does not auto-remediate production.
5. Security model for the collectors (do this right — Soon has had secret-hygiene gaps)¶
A service that can read everything is a high-value target. Non-negotiables:
- Read-only against monitored systems — least-privilege per integration: AWS
SecurityAudit+ViewOnlyAccess; a GitHub App (short-lived installation token — a fine-grained PAT only as a rotated fallback held in the secrets manager); Google Workspace read-only Admin SDK scopes. The collector holds no write/admin on any monitored system. Its only write is proposing a PR to this policy repo (item 6), which cannot self-merge. - No long-lived keys where avoidable. Prefer GitHub Actions OIDC → AWS role
assumption (short-lived credentials). Any unavoidable tokens live in a secrets
manager (GCP Secret Manager — already in Soon's stack), never in code or
.env. (Avoids reintroducing the Q1 plaintext-secret problem — see OPEN-QUESTIONS.md.) - Put-only to S3. The collector can
PutObjectto the evidence store but cannot delete (Object Lock/WORM anyway). Its actions are logged via CloudTrail. - No self-marking. The collector proposes register updates via PR; a human merges, and Andrea's independent internal audit samples the evidence. This stops the GRC "marking its own homework."
- Tight blast radius — collectors run in a controlled account/repo with restricted membership; rotate credentials; alert on collector auth failures.
- The one write path. Updating the Evidence Register needs a GitHub identity that can
open a PR against
SoonHQ/isms(contents:write+pull_requests:write) — ideally a dedicated bot fork that holds zero write on the canonical repo. This is the highest-trust credential in the loop: scope it to the isms repo only, keep it in the secrets manager, rotate it. Branch protection (CHK-SDLC-01) enforces a human merge — the collector can never self-approve.
6. What would stop us — the honest assessment¶
| # | Consideration | Blocker? | Mitigation |
|---|---|---|---|
| 1 | Collectors + secrets can't live in the policy repo | No | Put them in the app/infra repo (§2) |
| 2 | Broad read-access is a security risk | No | Least-privilege, short-lived creds, logging (§5) |
| 3 | Maintenance burden — we own every integration as vendor APIs change | No (real cost) | Start narrow; automate only stable, high-value APIs; this is the main reason to consider buying |
| 4 | Breadth — commercial tools ship 100s of prebuilt checks + auditor workflows | No | Start with high-sample technical controls; grow the catalog |
| 5 | Auditor trust in home-grown evidence | No | Reliable, complete, tamper-evident (WORM), method documented — auditors accept this |
| 6 | Independence ("marking own homework") | No | PR review + independent audit (§5.4) |
Verdict: nothing blocks it. The only non-negotiable is the repo boundary. The genuine
trade-off is maintenance vs. buying (Vanta/Drata/Secureframe): build if you value
control/cost and can carry upkeep on a 4-person team; buy for breadth/speed. A pragmatic
path is hybrid — build API collectors for the core AWS/GitHub controls (high value,
stable APIs), keep attestations for people/process, and re-evaluate a commercial tool if
breadth becomes painful. TODO(owner): confirm build-vs-buy-vs-hybrid.
7. Phased build plan¶
| Phase | Build | Where | Output |
|---|---|---|---|
| 0 | Stand up the S3 evidence store + finalise the Check Catalog | this repo + infra | Store live; checks defined |
| 1 (MVP) | ~10 API collectors for the top technical controls (backup, encryption, S3 public-access, MFA, branch protection, access lists, vuln scans) on GitHub Actions + OIDC | app/infra repo | Nightly evidence → S3 + PR to register |
| 2 | Scheduled AI drift-scan (evidence-scan.md) + Slack #security drift alerts |
app/infra repo | Reality-vs-policy alerts |
| 3 | Attestation tracking for people/process controls; coverage view (extend tools/isms.py or a small read-only dashboard) |
this repo | Full coverage picture |
| 4 | Broaden the catalog; add the SOC 2 TSC cross-walk (for the GetAgency Type 1) | both | Multi-framework GRC |
8. Roles¶
- ISM (Olaf) — owns the GRC design, the catalog and the control plane; reviews collector PRs.
- Platform/infra (Thomas / Melvin) — build and run the collectors in the app/infra repo; own the read-only credentials and the schedule.
- Independent auditor (Andrea) — samples the automatically-collected evidence; confirms the collection method is trustworthy.
9. Related documents¶
- Automated Control Check Catalog (ISMS-FORM-09-6) — the check definitions
- Evidence Collection and Management Procedure (ISMS-DOC-07-7) — the S3 store the collectors write to
- Evidence Register (ISMS-FORM-07-2) — what the collectors update
- Monitoring, Measurement, Analysis and Evaluation (ISMS-DOC-09-1) — the process this automates
prompts/evidence-scan.md— the AI drift-scan;.github/workflows/isms.yml— the scheduled-CI pattern to copy- Logging & Monitoring Policy (A.8.15/16) · Vulnerability Management (A.8.8)
Change log¶
| Version | Date | Author | Comments |
|---|---|---|---|
| 0.1 | 2026-07-12 | ISMS | First draft — home-grown GRC architecture: two-plane (control plane here / collectors in app-infra repo), three collection modes, the collect→store→PR→dashboard→alert loop, collector security model, honest "what would stop us", phased build plan. |