SnowOps β Full Asset Catalog¶
Status: β¬ Not Started Β· π¨ Scaffolding Β· π§ In Progress Β· π¦ Code Complete Β· π© Shipped Each asset leads with its human-readable name; the short code (e.g.
E0) is kept as a secondary tag β it remains the stable cross-reference anchor used elsewhere in the repo. Code β name lookup:docs/context/00-asset-glossary.md. For compact status table:docs/context/04-asset-status.mdFor full version history:docs/context/05-history.md
A. Sales & CRM Automation (HubSpot) [X][SO]¶
-
π¦ HubSpot Lead Enrichment (
A1) β HubSpot Private App + lead-enrichment Custom Code Action (Clearbit/Apollo β contact props).[M1][CA]β Test: Clearbit/Apollo lookups enriching contact properties. Manual runbook:docs/runbooks/test/A1.md. -
β¬ ICP Lead Scoring & Routing (
A2) β ICP scoring Custom Code Action (TS) β routes to Sagar/Nidhi.[M2b]βΈοΈ postponed β Test: fixture leads covering ICP / near-ICP / out-of-ICP; assert routing. -
β¬ Proposal PDF Generator (
A3) β Proposal generator (Deal stage β templated PDF; DocRaptor or Google Docs API).[M2b]βΈοΈ postponed β Test: golden-file diff on rendered PDF text content for 3 sample deals. -
β¬ Project Kickoff Webhook (
A4) β Project kickoff webhook (Closed Wonβ triggers the GitHub Onboarder App (B1) + Notion + Slack).[M2b]βΈοΈ postponed β Test: simulate webhook payload β assert repo created + Slack channel. -
π¦ Discovery Trigger Automation (
A5) β Discovery trigger Custom Code Action (Qualifiedβ dispatches the Discovery Run Workflow (G4) + sends offer email).[M1][CA]β Test: Deal stage change βG4dispatched, offer email sent. Manual runbook:docs/runbooks/test/A5.md.
B. Client Onboarding [B]¶
-
π¦ GitHub Onboarder App (
B1) β GitHub Appsnowops-onboarder(Probot/TS): repo + branch protection + CODEOWNERS + checks + env vars + federated OIDC to client Azure AD.[M1][SOβCO]β Test: install on test org, trigger create β assert all settings via GH API. Manual runbook:docs/runbooks/test/B1.md. -
π¦ Azure Client Bootstrap Module (
B2) βmodules/azure/client-bootstrap/β Azure AD application + service principal + federated identity credentials (GitHub OIDC only,repo:prefix validated) + role assignments (sub/ACR/KV/freeform). No client secret ever created.[M2a][SOβCO]β Test: Terratest validates SP + fed creds + role-assignment IDs. Manual runbook:docs/runbooks/test/B2.md. -
π¦ Subscription Baseline Module (
B3) βmodules/azure/subscription-baseline/β composes the Azure Baseline (F1) + group RBAC (6 named shortcuts: Owner/Contributor/Reader/Security Admin/Security Reader/UAA + freeform escape hatch) + MCSB regulatory-compliance initiative (system-assigned identity, audit-only until remediation role granted out-of-band). Defender ON by default. azurerm-only (RBAC binds by group object ID).[M2a][CO]β Test: Terratest validates (offline composition + RBAC flatten + MCSB block) + integration applies to sandbox asserts LAW + SnowOps Standard set + MCSB assignment + system-assigned identity GUID + 3 RBAC role-assignment IDs. Manual runbook:docs/runbooks/test/B3.md. -
π¦ Client State Backend Module (
B4) βmodules/azure/client-state-backend/β wraps the State Backend (F6) + Blob Data RBAC (Contributor/Reader/Owner,principal_typeunset for mixed SP+group) + optional Private Endpoint + optional network-rule lockdown (standaloneazurerm_storage_account_network_rules, default-deny; precondition requires reach-path) + optional diagnostics.backend_configforcesuse_azuread_auth = true. azurerm-only.[M2a][CO]β Test: Terratest validates (offline composition + RBAC flatten) + integration asserts SA ARM ID +backend_config+ Blob Data role-assignment IDs + contractversioning_enabled. Manual runbook:docs/runbooks/test/B4.md. -
π¦ Azure Resource PIM Module (
B5) βmodules/azure/pim-azure-resources/β PIM for Azure resource roles. Tier-0 (Owner + UAA) β MFA + justification + ticketing + approval + max 8h; tier-1 (Contributor) β MFA + justification + max 4h. Uses azurerm's nativeazurerm_pim_eligible_role_assignment+azurerm_role_management_policy. Eligibility permanent; time-box is on activation. Requires Entra ID P2 at apply. Precondition: β₯1 break-glass Owner so PIM can't lock the sub out.[M2a][CO]β Test: Terratest validates (offline). Live activation drill is manual (can't Terratest MFA/approval flow). Manual runbook:docs/runbooks/test/B5.md. -
π¦ Client Prerequisite Checker (
B6) βapps/client-bootstrap/β client self-service bootstrap: prerequisite checker + Azure permission validator a prospective client runs in their OWN tenant pre-engagement. Pure evaluator over anEnvironmentSnapshotbehind aCollectorseam (FixtureCollectortests/offline;AzureCliCollectorliveaz). Read-only, no secrets. Checks tooling (az β₯ 2.50, terraform β₯ 1.6), auth, permissions (assign RBAC = Owner/UAA not Contributor; create Entra apps+SPs; required providers registered), Entra ID P2 (warn). READY only when every required check passes;summary.mdends in a remediation list;status.jsoncarriesready/blockers/warnings. Single entrypointbootstrap.sh(exit 0/2).[M3][CA](14-asset M2b core) β Test:examples/snapshot.ok.jsonβ READY/exit 0;examples/snapshot.restricted.json(restricted SP) β NOT READY + clear remediation/exit 2. Manual runbook:docs/runbooks/test/B6.md.
C. CI/CD & Delivery Pipelines [B]¶
-
π¦ Terraform Plan/Apply Pipeline (
C1) βterraform-plan-apply.ymlGitHub Actions reusable workflow (Azure OIDC, plan-on-PR comment, apply-on-merge, environment gates, conftest OPA check post-plan).[M2a][CA]β KEYSTONE β Test: create test repo consuming workflow; open PR β plan comment; merge β apply against sandbox. Manual runbook:docs/runbooks/test/C1.md. -
π¦ Container Build & Sign Pipeline (
C2) βcontainer-build-sign.yml(build β ACR push by digest β Notation v2 sign via AKV plugin β Syft SBOM β Grype scan with severity cutoff). Signing by digest not tag. 13 inputs;grype_severity_cutoffdefaultscritical;fail_on_scan_findingsdefaults true.[M2a][CA]β Test: clean image passes; planted-CVE image fails at critical cutoff;notation verifysucceeds. Manual runbook:docs/runbooks/test/C2.md. -
π¦ AKS Deploy Pipeline (
C3) βaks-deploy.yml(ArgoCD image override β sync β wait Healthy β smoke probe β optional rollback drill; Kustomize XOR Helm modes, rejected if both/neither set). ArgoCD-token-only auth.[M2a][CA]β Test: happy-path Kustomize deploy + smoke green; rollback drill exercises revert + roll-forward; ambiguous + empty image-set inputs both rejected. Manual runbook:docs/runbooks/test/C3.md. -
π© GitOps Branching Standard (
C4) β GitOps branching standard doc + client-repo template + branch protection rules.[M1][QW][CA]β Test: branching standard doc + template structure + protection validation. Manual runbook:docs/runbooks/test/C4.md. Signed off 26/05 (Sagar). -
π¦ Azure DevOps Pipeline Templates (
C5) βpipelines/azure-devops/β ADO Pipeline templates:terraform-plan-apply.yml(mirrorsC1),container-build-sign.yml(C2),aks-deploy.yml(C3),quality-gates.yml(D2) + caller examples + README. Same underlying tools as the GH Actions workflows; only the CI wrapper changes. Callers reference viaresources: repositories:.[M3][CA]π¦ code-complete (commit 51c7fc4) β Test: ADO test project consuming pipeline; PR triggers plan; stage approval gates apply on merge. Runbook:docs/runbooks/test/C5.md(pending).
D. Quality & Security Gates (PR-time) [B]¶
-
π© Pre-Commit Quality Hooks (
D1) β.pre-commit-config.yaml(tflint, fmt, checkov, tfsec, gitleaks, trivy fs, conftest verify on pre-push).[M1][QW][CA]β Test: planted bad commits blocked locally. Manual runbook:docs/runbooks/test/D1.md. Signed off 26/05 (Sagar). -
π¦ PR Quality-Gate Workflow (
D2) β PR-blocking GH Actions mirroring the Pre-Commit Quality Hooks (D1) (.github/workflows/quality-gates.yml).[M1][QW][CA]β Test: planted bad PRs blocked; clean PRs pass. Manual runbook:docs/runbooks/test/D2.md. -
π© Terraform OPA Policy Bundle (
D3) β Conftest/OPA policy bundle forterraform planJSON (encryption, tags, no public network, allowed regions, cost caps, managed-identity / no-standing-secrets, Azure naming-constraint pre-flight).[M1][QW][CA]β Test:conftest verifysuite (Conftest Test SuiteX3) β every rule has pass + fail fixture. Manual runbook:docs/runbooks/test/D3.md. Signed off 26/05. -
π¦ Kyverno AKS Policy Bundle (
D4) β Kyverno policy bundle for AKS β 9 ClusterPolicies (disallow-latest-tag,require-signed-images,require-pod-labels,disallow-privileged-containers,require-network-policywithgenerateof default-deny NetPol,require-resource-limits,require-non-root,disallow-host-namespaces,require-probes). All Enforce. System namespaces excluded viaexclude.any.resources.namespaces.[M2a][CO]β Test:kyverno testper rule (Kyverno Test FrameworkX4) β 9 suites / 35 assertions. Live admission round-trip is manual. Manual runbook:docs/runbooks/test/D4.md. -
π¦ Policy Waiver Engine (
D5) βwaivers/+policy/opa/rules/main.regowaiver engine β time-boxed OPA exception records (waivers/exceptions.yaml:rule_prefix+resource_address+expiry_date+owner+justification) + CI enforcement. The Terraform OPA Policy Bundle (D3) rule files (tags/locations/network/encryption/cost) now emitraw_violation;main.regofilters them throughhas_active_waiver(suppress matching, non-expired) and hard-denies expired waivers (snowops.waiver_expired) so they fail the pipeline. Wired intoterraform-plan-apply.ymlviaconftest test plan.json --data waivers/exceptions.yaml.[M2b][CA]π¦ code-complete (external, gemini-work PR #13). Runbookdocs/runbooks/test/D5.md. β Test: unexpired waiver suppresses aD3finding; expired waiver causes CI failure.
E. Automated Evidence Collection [A]¶
-
π¦ Compliance Snapshot Collector (
E0) βapps/evidence-collector/β Lightweight compliance snapshot[B]: read-only TS tool collecting Azure Policy compliance state (summarize) + Defender secure score (secureScores/ascScore) into a versioned JSON artifact (schemaVersion 1.0).diffSnapshotsis the regression signal. Wired into the Terraform Plan/Apply Pipeline (C1) ascontinue-on-errorpost-apply step. Reader + Security Reader only.[M2b][SH]β¬ in scope (14-asset core) β Test: jest (3 suites / 18 tests) β required-field validation, seeded-policy-violation diff, markdown render. Manual runbook:docs/runbooks/test/E0.md. -
π¦ Evidence Platform Interface (
E1) βEvidencePlatformTS interface +EvidenceUpsertApiseam +DryRunEvidencePlatform+KeyedEvidencePlatform+selectEvidencePlatformfactory (apps/evidence-collector/src/platforms/). The evidence-chain equivalent of E7'sTicketPlatform: one contract, one shared keyed upsert algorithm, thin per-platform adapters.[M4][SO]π¦ code-complete (v0.61) β Test: jest β controlKey, KeyedEvidencePlatform create/update/idempotence, DryRunEvidencePlatform, factory resolution. -
π¦ Vanta Adapter (
E2) βVantaApi implements EvidenceUpsertApiover the Vanta REST API (apps/evidence-collector/src/platforms/vanta.ts). Pushes test results keyed byframework:controlId;vantaPlatform()factory. Resolves fromVANTA_API_KEY+VANTA_ACCOUNT_ID. InjectableFetchLikefor unit tests.[M4][SO]π¦ code-complete (v0.61) β Test: jest β listExisting mapping, create (PASS/FAIL/NOT_APPLICABLE status), update URL, source_ref, idempotency, non-2xx errors. Runbook:docs/runbooks/test/E2.md. -
π¦ Drata Adapter (
E3) βDrataApi implements EvidenceUpsertApistub over the Drata REST API (apps/evidence-collector/src/platforms/drata.ts).DRATA_CONTROL_MAPmapsframework:controlIdβ Drata check IDs.drataPlatform()factory.[M4][SO]π¦ code-complete (v0.61) β stub (API paths subject to validation against live workspace) β Test: jest β listExisting filtering, create with/without controlMap, update, idempotency. Runbook:docs/runbooks/test/E3.md. -
π¦ Resource Graph Query Library (
E4) β 7 pre-built KQL queries (apps/evidence-collector/src/resource-graph/) mapped to SOC 2 CC + ISO 27001 A.x controls: storage CMK, public network access, TLS enforcement, owner role assignments, Defender plans, diagnostic settings, required tags.runAllQueries()client +mapQueryResultsToEvidence()mapper βEvidenceItem[].[M4][SH]π¦ code-complete (v0.61) β Test: jest (query evaluators Γ 7 + mapper). Runbook:docs/runbooks/test/E4.md. -
π¦ Evidence Sync (
E5) βsyncEvidence()(apps/evidence-collector/src/sync.ts) maps E0 snapshot (policy compliance % β SOC2 CC7.1 + ISO A.8.15; Defender score β SOC2 CC7.1) + E4 resource-graph results toEvidenceItem[]and pushes via any E1 platform. Configurable pass thresholds. Scheduled via.github/workflows/evidence-sync.yml(weekly Monday 02:00 UTC).[M4][SO]π¦ code-complete (v0.61) β Test: jest β snapshot items, pass/fail thresholds, null score β not_applicable, resource-graph items, error isolation, empty options. Runbook:docs/runbooks/test/E5.md. -
π¦ Access Review Automation (
E6) βapps/access-review/β quarterly Azure RBAC access review:AzureCliCollector(liveaz rest) orFixtureCollector(offline);buildReview()sorts high-privilege first;renderCsv()(RFC 4180, reviewer-fillable action column) +renderMarkdown()(high-privilege section, summary table); tickets via E7snowops-ticketCLI. Artifact committed tocompliance/access-reviews/<period>/. Scheduled quarterly via.github/workflows/access-review.yml.[M4][SO]π¦ code-complete (v0.61) β Test: jest β FixtureCollector, buildReview sorting + schemaVersion, renderCsv header/rows/escaping/empty-action, renderMarkdown high-priv section/"None found", quarterLabel Q1βQ4. Runbook:docs/runbooks/test/E6.md. - π¦ Ticket Platform Library (
E7) βapps/ticket-platform/(@snowops/ticket-platform) β platform-neutralTicketPlatforminterface + adapters (GitHub Issues, Jira REST v2, Linear GraphQL, Azure DevOps Boards) +DryRunTicketPlatform+selectPlatformfactory +snowops-ticketCLI. One shared marker-basedupsertByMarker(idempotent create-or-update via an HTML-comment dedupe marker); each adapter implements the sameMarkerUpsertApiseam (listOpen/create/update) with an injectablefetch. Generalizes the Drift Detector (S1) seed (D15/D39); closes G8.[M3][CO/CA]π¦ code-complete (v0.54) β Test:npm test(6 suites / 26 β shared upsert + each adapter's HTTP mapping + factory) + dry-run CLI. Runbook:docs/runbooks/test/E7.md.
F. SnowOps Module Library (Azure-First, Cloud-Agnostic Contracts) [B]/[A]¶
Sequencing constraint: the Cloud-Agnostic Module Contracts (
F0) must land before any new F-module. The Azure Baseline (F1) and State Backend (F6) were retrofitted in v0.17.
-
π¦ Cloud-Agnostic Module Contracts (
F0) βmodules/_contracts/β 7 contracts: network, identity, cluster, registry, kv, observability, object_store. Each: typedvariable "candidate"+ echoingoutput "candidate"+ no providers.[M2a][B][SO]β Test: every contract validates standalone;F1/F6conformance tests; 4 negative-literal tests. Manual runbook:docs/runbooks/test/F0.md. -
π¦ Azure Baseline Module (
F1) βmodules/azure/baseline/(Mgmt Group, Subs, Policy, Defender, Log Analytics, Activity Log). Emitsidentity_contract+observability_contract.[M2a][B][CO]β Test: Terratest applies to sandbox; asserts policy assignment + Defender plans. Manual runbook:docs/runbooks/test/F1.md. -
π¦ Network Hub Module (
F2) βmodules/azure/network-hub/(hub-spoke vNets, optional Azure Firewall, optional Private DNS zones, NSG flow logs to the Azure Baseline (F1), per-spoke route-table forcing 0.0.0.0/0 through firewall). Emits F0spoke_network_contractsmap.[M2a][B][CO]β Test: Terratest validates topology + routing. Manual runbook:docs/runbooks/test/F2.md. -
π¦ Secure AKS Module (
F3) βmodules/azure/aks-secure/(private AKS, Workload Identity, OIDC issuer, AAD-RBAC + local accounts disabled, Azure CNI Overlay + Calico NetworkPolicy, Defender for Containers, KEDA, Image Cleaner, AKV CSI driver, system + user node pools across 3 AZs on AzureLinux+Ephemeral OS). Emits F0cluster_contract.[M2a][B][CO]β Test: Terratest provisions cluster; AAD-only kubectl smoke; private API confirmed. Manual runbook:docs/runbooks/test/F3.md. -
π¦ Container Registry Module (
F4) βmodules/azure/acr/(Premium SKU, Private Endpoint + auto-A-record inprivatelink.azurecr.io, AAD-only auth, public access disabled, optional geo-replication + AcrPull bindings + Defender scanning passthrough). Emits F0registry_contract.[M2a][B][CO]β Test: Terratest provisions; push + sign sample image; pull from private endpoint only. Manual runbook:docs/runbooks/test/F4.md. -
π¦ Key Vault Module (
F5) βmodules/azure/key-vault/(Premium SKU default, RBAC mode enforced, purge protection enforced, default-deny network ACLs + AzureServices bypass, Private Endpoint + auto-A-record inprivatelink.vaultcore.azure.net, optional role bindings across 5 built-in KV roles, optional diag forward). Emits F0kv_contract.[M2a][B][CO]β Test: Terratest; secret CRUD via Workload Identity; public access denied. Manual runbook:docs/runbooks/test/F5.md. -
π¦ State Backend Module (
F6) βmodules/azure/state-backend/(state SA + container per env, used by the Client State Backend (B4)). Emitsobject_store_contract.[M2a][B][CO]β Test: Terratest applies; init a dummy Terraform stack against it; lease lock observed. Manual runbook:docs/runbooks/test/F6.md. -
π¦ Terragrunt Live-Infra Reference (
F7) βlive/β Terragrunt live-infra reference:root.hcl(remote state in the State Backend (F6), generated OIDC azurerm provider, common Β§3 tags) + DRY_envcommon/templates (Azure BaselineF1, Network HubF2, Key VaultF5, Container RegistryF4) +bootstrap/(F6state account, local state β breaks the chicken-and-egg) + per-env/per-region units (prod eastus full chain + westus2, staging, sandbox). Real dependency DAG: baseline β network-hub/key-vault/acr viadependency.baseline.outputs.log_analytics_workspace_id(mock_outputs for pre-apply plan). Variance isolated inenv.hcl/region.hcl; units are 3-line includes. In-reposourceviaget_repo_root(); Module Registry (F11) registry-pin form documented for external use. Offlinelive/validate.shstructural gate +terragrunt hcl validate.[M2b][B][CO]π¦ code-complete (v0.55) β Test:live/validate.sh(offline structural gate, A) +terragrunt hcl validate/hclfmt --check(B); live:run-all plan/applyagainst sandbox (C). Runbook:docs/runbooks/test/F7.md. -
π¦ ArgoCD GitOps Bundle (
F8) βgitops/β K8s reference manifests bundle as ArgoCD app-of-apps (cert-manager + Kyverno + ESO wave 0 β ingress-nginx wave 1 β Kyverno AKS Policy Bundle (D4) policies + ClusterSecretStore wave 2). TheD4bundle is reused not forked.[M2b][B][CO]β Test:gitops/validate.sh(offline β 13 files / 7 Applications) +kyverno test. Live kind-cluster bootstrap is runbook. Manual runbook:docs/runbooks/test/F8.md. -
β¬ AWS Module Parity (
F9) βmodules/aws/*parity.[M5][B]/[A]βΈοΈ deferred - β¬ GCP Module Parity (
F10) βmodules/gcp/*parity.[M5][B]/[A]βΈοΈ deferred - π¦ Module Registry & Versioning (
F11) βapps/module-registry/+modules/registry.json+ per-moduleCHANGELOG.md+.github/workflows/module-release.ymlβ module versioning + private Terraform registry. Private registry = the monorepo itself: modules publish as git tags<module>/v<version>, consumers pin viasource = "git::β¦//<path>?ref=<module>/vX.Y.Z"(no hosted service). Manifest is the source of truth (10 modules:F00.1.0;F1βF6+J1/J2/J61.0.0). TS tool (Client Prerequisite CheckerB6/ Automated Restore DrillL4mold; pure core over aRegistrySnapshotbehind aCollectorseam): validate (unique names/paths, strict semver, CHANGELOG top == manifest version, no version-regression), buildIndex, planReleases, auditPins (flagsunpinned/ref-mismatch/unknown-versionin a consumer tree).module-releaseworkflow tags + GitHub-Releases pending modules on merge to main (CHANGELOG section as body, idempotent). 3 jest suites / 27 tests incl. a guard over the real manifest+CHANGELOGs. Convention:docs/conventions/module-versioning.md.[M3][SO]π¦ code-complete (v0.51) β Test:npm test(27);--manifest modules/registry.json --fail-on-issuesβ OK/exit 0;--consumer-dir examples/consumer-unpinned --fail-on-issuesβ exit 2. Manual runbook:docs/runbooks/test/F11.md. - π¦ Brownfield Import Library (
F12) βmodules/azure/import-blocks/β brownfield import library[B]: config-driven Terraformimport {}blocks (one<module>.tfper module) that adopt pre-existing Azure resources into the F-modules β covers Azure BaselineF1, Network HubF2, Secure AKSF3, Container RegistryF4, Key VaultF5, State BackendF6+ Log AnalyticsJ1, Policy DiagnosticsJ2, Audit Log ArchiveJ6(9 modules). Each file pairs the import blocks with a placeholdermodulecall so the whole directory is self-validating βterraform validateconfirms everyto =address resolves (incl.count[0]+for_each["key"]instances); for_each key schemes are derived from source + documented per file. OfflineTestImportBlocksValidategate. Each covered module's README brownfield section now points at its real file; adoption procedure indocs/runbooks/import/F12.md.[M3][B][CO]π¦ code-complete (v0.49) β Test:docs/runbooks/import/F12.mdβ offlinevalidate/fmt+TestImportBlocksValidate(A+B); live: adopt a real sandbox resource with a zero-change plan (C).
G. Pre-Sales Discovery & Audit Automation [X][SH]¶
Azure-only through M3. AWS Discovery Mode (
G7) lands in M4.
- π¦ Discovery SP Bootstrap (
G0) β Client-side scoped Reader + Security Reader SP bootstrap script + Bicep alt; time-boxed federated cred; no secrets leave client tenant.[M1] - π¦ Discovery Auditor Collectors (
G1) βapps/discovery-auditor/(Node/TS) collectors: Resource Graph KQL, Defender REST, Azure Policy state, AAD audit logs, Cost Mgmt.[M1] - π¦ Discovery Rule Pack (
G2) β YAML rule pack mapped to SOC2 CC + ISO27001 A.x + CIS Azure Benchmark; severity/evidence/remediation/effort. Each finding includesremediation_asset_id. 11 rules / 22 fixtures.[M1] - π¦ Discovery Report Renderer (
G3) β Report renderer (Markdown β PDF via Pandoc/Playwright; branded cover, exec summary, control table, prioritized roadmap).[M1] - π¦ Discovery Run Workflow (
G4) β.github/workflows/discovery-run.yml(manual dispatch withtenant_id+sub_id; artifact upload; Slack notify with reviewer checklist).[M1] - π¦ Discovery HubSpot Integration (
G5) β HubSpot integration (Discovery Trigger Automation (A5) β Deal propertydiscovery_report_url).[M1] - π¦ Discovery Audit Log (
G6) β Immutable run audit log (client/scope/timestamp/operator/findings hash β WORM blob, SHA-256 hash chain).[M1] - β¬ AWS Discovery Mode (
G7) β AWS discovery mode.[M4][X][SH]βΈοΈ postponed
H. Identity & Access Management [B]/[A]¶
-
π¦ Entra ID Baseline Module (
H1) βmodules/azure/aad-baseline/(IP + country named locations viaazuread_named_location, custom Authentication Strength Policy for phishing-resistant MFA, password protection + tenant branding emitted as*_patch_bodyJSON foraz restPATCH). Precondition: verified custom domain required.[M2a][B][CO]β Test: Terratest validate; theH1runbook applies in sandbox + applies Graph PATCHes. -
π¦ Conditional Access Module (
H2) βmodules/azure/conditional-access/(6 SnowOps CA policies: MFA Mandatory / Tier-0 Phishing-Resistant+Compliant Device / Block Legacy Auth / Geo-Block / High-Risk Block / Medium-Risk MFA; every policy excludes break-glass group; risk policies gated on P2).[M2a][B][CO]β Test: Terratest validate; theH2runbook applies in report-only β CA What-If β enforce + live sign-in. -
π¦ Entra PIM Templates Module (
H3) βmodules/azure/pim-templates/(tier-0 + tier-1 AAD role eligibility viaazuread_directory_role_eligibility_schedule_request; activation rule bodies emitted as JSON for Graphaz restPATCH sinceroleManagementPolicieshas no TF resource). Precondition: β₯1 permanent break-glass tier-0 holder.[M2a][B][CO]β Test: Terratest validate; theH3runbook applies eligibility + Graph PATCHes + live activation drill. -
π¦ SCIM Provisioning (
H4) βmodules/azure/scim-provisioning/(azuread) β Entra automatic user provisioning to a SaaS app over SCIM: instantiates the gallery app (azuread_application_from_template), sets the SCIM endpoint + bearer token (azuread_synchronization_secret, sensitive), and starts the provisioning job (azuread_synchronization_job). Joiner/mover/leaver lifecycle flows from Entra automatically.[M4][A][CO]π¦ code-complete (v0.70) β Test: offlineTestScimProvisioningValidate. Runbook:docs/runbooks/test/H4.md. -
π¦ Service Principal Inventory (
H5) βapps/sp-inventory/(read-only-Graph TS,Application.Read.All) +.github/workflows/sp-inventory-rotation.yml(scheduled reusable workflow). Inventories app registration credentials; flags aged (β₯threshold_days=90) / expiring-soon (withinexpiry_warning_days=30) / expired. Opens/idempotently updates rotation PR. Never rotates a secret itself. Federated-OIDC-only SPs never stale. 2 test suites / 19 tests.[M2a][B][CA]β Test: jest unit suite covers stale SP path + federated-OIDC-only SP path. Live tenant read + PR drill is manual. -
π¦ Access Review Automation (
H6) βmodules/azure/access-reviews/(azuread) β recurring Entra access reviews via Entitlement Management: a catalog + access packages, each with anazuread_access_package_assignment_policycarryingassignment_review_settings(frequency, duration, reviewers, timeout behavior). The native-config counterpart to E6 (apps/access-review, the evidence/reporting app). Completes the H series.[M4][A][CO]π¦ code-complete (v0.70) β Test: offlineTestAccessReviewsValidate. Runbook:docs/runbooks/test/H6.md. -
π¦ Break-Glass Account Module (
H7) βmodules/azure/break-glass/β dual-provider (azuread + azurerm). Role-assignable group +azuread_group_memberper member + permanent (active, non-PIM) Global Administrator + severity-0 sign-in alert (azurerm_monitor_scheduled_query_rules_alert_v2, KQL on UserId, threshold=0). Producer of break-glass group the Conditional Access (H2) / Subscription Baseline (B3) / Azure Resource PIM (B5) modules consume. Takes existing account object IDs as input (no account or password creation β Identity > Secrets).[M2a][B][CO]β Test: Terratest validate (offline β 4 preconditions). Live sign-in drill is manual (needs P1 + real LAW).
I. Vulnerability & Patch Management [B]/[A]¶
- π¦ Container Image Scan (
I1) β.github/workflows/image-scan.ymlβ reusable (workflow_call) Trivy image scan; fails on High/Critical OS+library CVEs, SARIF β Code Scanning, optional registry login,ignore_unfixed/fail_on_findings/severity_cutoffinputs. Closes G6 (container security for non-K8s clients). Distinct from the Container Build & Sign Pipeline (C2, build-time grype):I1scans an arbitrary image ref.[M2a][B][CA]π¦ code-complete (v0.53) β Test: YAML lint (offline) + dispatch scan of an old image fails / current passes. Runbook:docs/runbooks/test/I1.md. - π¦ Dependency Scanning (
I2) β.github/dependabot.yml(4 ecosystems) +.github/workflows/dependency-review.yml(PR-blocking SCA gate,fail-on-severity: high+ licence deny-list) +.github/workflows/dependency-digest.yml(weekly idempotent Dependabot-alert digest issue).[M2a][B][CA]π¦ code-complete (v0.53) β Test: config lint (offline) + PR introduces vuln dep β review fails; digest run upserts one rolling issue. Runbook:docs/runbooks/test/I2.md. - π¦ CodeQL SAST (
I3) β.github/workflows/codeql.ymlβ CodeQL SAST overjavascript-typescript(apps/) +go(terratest),security-extended,security-and-qualityqueries, PR + push + weekly schedule, SARIF β Code Scanning.[M2a][B][CA]π¦ code-complete (v0.53) β Test: YAML lint (offline) + PR with a planted CWE finding surfaces in Code Scanning. Runbook:docs/runbooks/test/I3.md. - π¦ Defender Ticketer (
I5) βapps/defender-ticketer/β Defender for Cloud alerts β tickets via the Ticket Platform Library CLI (E7); seedocs/context/04-asset-status.md.[M2b][A]π¦ code-complete - π¦ DAST (
I4) β.github/workflows/dast-scan.ymlβ reusableworkflow_callOWASP ZAP gate (baseline|full) against a deployed app URL, fails on High web findings, uploads the ZAP report; tuned by a committed.zap/rules.tsv. The dynamic-analysis layer (I1 images / I3 SAST are at-rest).[M4][A]π¦ code-complete (v0.68) β Test: YAML lint + rules.tsv shape (offline); live ZAP scan vs a vulnerable target. Runbook:docs/runbooks/test/I4.md. - π¦ Azure Update Manager Report (
I6) βapps/patch-compliance/β pure adaptβrender (S4/L5 mold): an Azure Update Manager assessment β patch-compliance report (coverage %, machines out of compliance, pending Critical/Security counts, SLA aging); self-contained HTML + optional Pandoc PDF; never fabricates a patch date.[M4][A]π¦ code-complete (v0.68) β Test: jest (coverage math, compliant-rule, SLA breach, honest-empty, HTML self-containment, determinism). Runbook:docs/runbooks/test/I6.md. - π¦ CVE Triage Runbook (
I7) βdocs/runbooks/vuln/cve-triage.md(triage β severity β SLA Critical 7d/High 30d/Medium 90d β owner/E7 ticket β remediate or D5 waiver β verify) + the vuln-triage Grafana dashboard (snowops-vuln-triage.json: open Defender findings by severity via ARG + SLA aging from the exportedSecurityRecommendationtable). Finishes the I vulnerability series.[M4][A]π¦ code-complete (v0.68) β Test: J5 dashboards-as-code gate covers the new JSON; runbookdocs/runbooks/test/I7.md.
J. Logging, Monitoring & SIEM [B]/[A]¶
-
π¦ Log Analytics Module (
J1) βmodules/azure/log-analytics/β standalone hardened LAW: per-table retention (30-730d interactive + archive,total >= retentionvalidated),CanNotDeletemanagement lock, scoped RBAC (Log Analytics Reader/Contributor + Monitoring Reader + freeform), self-auditazurerm_monitor_diagnostic_setting(who ran KQL queries). AAD-only by default. Optionaldaily_quota_gbcost cap. Emits F0observability_contract. azurerm-only.[M2a][B][CO]β Test: Terratest validate +TestJ1ObservabilityContractConformance+ build-tagged integration (~$0) asserts workspace + self-audit diag + contract shape. -
π¦ Policy Diagnostics Module (
J2) βmodules/azure/policy-diagnostics/β customazurerm_policy_set_definition(DINE initiative, not Deny) bundling built-in DeployIfNotExists diagnostic policies. GUID-agnostic (caller supplies GUIDs viadiagnostic_policiesinput map sourced fromaz policy definition list). Sub- or MG-scope. System-assigned identity + remediation roles. Emitsaz policy remediation createcommand. Validate-only in CI.[M2a][B][CO]β Test: Terratest validate (offline). Live apply + DINE remediation drill is manual. -
π¦ Microsoft Sentinel Deployment (
J3) βmodules/azure/sentinel/β the SIEM layer over the Log Analytics workspace (J1): onboards Microsoft Sentinel onto the CONSUMED workspace (by ARM ID), toggleable first-party data connectors (Entra ID / Defender for Cloud / Threat Intelligence / Office 365 / MDCA, all default off), and curated Sentinel-native scheduled analytics rules β incidents with entity mappings + MITRE tactics (identity + privilege domains; per-domain toggles + per-rule overrides +custom_rulesescape hatch), plus an opt-in Microsoft incident-creation rule promoting Defender alerts to incidents. Scope boundary vs the Alert Rule Pack (J4): J4 = Monitor scheduled-query alerts β action groups (paging); J3 = Sentinel analytics rules β incidents the SOC + Sentinel SOAR Playbooks (K3) act on. UnblocksK3+ Managed Grafana Dashboards (J5). OfflineTestSentinelValidate.[M4][A][CO]π¦ code-complete (v0.66) β Test:docs/runbooks/test/J3.mdβ fmt/validate + Terratest validate (A+B); live: onboard + ingest logs + watch an analytics rule raise an incident in a sandbox workspace (C). - π¦ Alert Rule Pack (
J4) βmodules/azure/alert-rule-pack/β curated scheduled-query alert rules across identity/network/privilege/data-exfil; consumes the Log Analytics workspace (J1) + On-Call Integration (K2) action groups by ARM ID.[M2b][B][CO]π¦ code-complete (v0.56) -
π¦ Managed Grafana Dashboards (
J5) βmodules/azure/grafana-dashboards/β Azure Managed Grafana + dashboards-as-code over the Log Analytics workspace (J1):azurerm_dashboard_grafanainstance (SystemAssigned identity) + a Monitoring Reader grant to the identity (so panels can query Azure Monitor + Log Analytics) + a Grafana Admin/Editor/Viewer Azure-role fan-out to caller principals, plus version-controlled dashboard JSON underdashboards/(Security Posture; Reliability & Cost β reading the workspace via aworkspacetemplate variable). Dashboards-as-code = committed JSON + an always-on offline gate (scripts/validate.sh) + an idempotentaz grafana dashboard createdeploy script β the same "infra + declarative artifacts + validate.sh + tooling deploy" shape as the ArgoCD bundle (F8). OfflineTestGrafanaDashboardsValidate+ the dashboards JSON gate.[M4][A][CO]π¦ code-complete (v0.66) β Test:docs/runbooks/test/J5.mdβ fmt/validate + dashboards gate + Terratest validate (A+B); live: stand up the instance, deploy dashboards, confirm a panel queries the workspace, destroy (C). -
π¦ Audit Log Archive Module (
J6) βmodules/azure/audit-log-archive/β RA-GZRS StorageV2 with account-level time-based immutability (allow_protected_append_writes = true,statedefaultsUnlockedfor teardown safety). Forwards subscription Activity Log; optional Log Analytics data export; optional Storage Blob Data Reader grants.shared_access_key_enableddefaults true (platform diagnostic writer requires it). Distinct from the State Backend (F6).[M2a][B][CO]β Test: Terratest validate + build-tagged integration (~$0, immutability OFF). WORM mutation-refused drill is manual. -
π¦ Cost-Controlled Log Strategy (
J7) βmodules/azure/log-analytics-cost/β applies a Basic-Logs-tier cost strategy to an existing J1 workspace by ID: per-tableplan(Basic vs Analytics) + retention viaazurerm_log_analytics_workspace_table, a curated overridabledefault_strategy(security/audit tables β Analytics for KQL + alerting; high-volume telemetry β Basic), and an advisory daily-quota note (J7 does not re-manage the workspace; the cap belongs on J1'sdaily_quota_gb). States the Basic-tier mechanism (fixed 8-day interactive retention; can't back log alerts) rather than fabricating dollar figures.[M4][A][CO]β Test: offlineTestLogAnalyticsCostValidate(Terratest validate). Manual runbook:docs/runbooks/test/J7.md. - β¬ Client Overview Dashboard (
J8) β Tier 1 of the client-facing posture-visibility initiative (D65). A curated, read-only client-facing Grafana dashboard added to the Managed Grafana Dashboards (J5) module (modules/azure/grafana-dashboards/dashboards/snowops-client-overview.json) in a dedicated "client" Grafana folder, with the client's AAD group granted Grafana Viewer via J5's existinggrafana_viewersinput. Panels are organized by SnowOps deliverable, not by raw metric β guardrails (policy compliance %, Defender Secure Score), data protection (backup job statusL1, last restore drillL4), compliance posture (framework rollup), incidents handled (open Sentinel incidentsJ3), cost governance (budget vs. actualU1) β each panel degrades honestly when its source table isn't flowing (the same stance as J5's existing dashboards). Reuses J5 wholesale (instance, Monitoring Reader grant, the offline dashboards-as-code gatescripts/validate.sh, theaz grafana dashboard createdeploy script); the only new artifacts are one dashboard JSON + the client-folder/Viewer access pattern. No multi-tenant lift β the per-client-subscription model (B-series) means each client's J5 instance is already isolated; the shared cross-client portal is the postponed W-series (W5, D35). Shares the section taxonomy with the Client Cloud Posture Report (V5) β J8 is the live view, V5 the periodic snapshot. Shipped: one dashboard JSON (passes the J5 offline gate), a distinctclient_grafana_viewersaccess hook (auditable apart from internal-ops viewers), and a folder-aware deploy script that routessnowops-client-*dashboards into a dedicated client folder; cost (U1) is omitted rather than fabricated (no FinOps feed yet β U4/U5 postponed).[M4][A][SH]π¦ code-complete (v0.67) β Test: J5 dashboards-as-code gate covers the new JSON; offlineTestGrafanaDashboardsValidateexercisesclient_grafana_viewers. Manual runbook:docs/runbooks/test/J8.md. β Test: extends J5's offline dashboards gate (validates the new JSON automatically); live access proof (client group sees only the client folder, read-only) is the J8 runbook Part C.
K. Incident Response & SecOps [B]/[A]¶
- π¦ Incident Response Runbooks (
K1) β IR runbook library (docs/runbooks/incident/: compromise, ransomware, data leak, DDoS, vendor breach).[M2b][B][CO]π¦ code-complete (external, gemini-work PR #12) - π¦ On-Call Integration Module (
K2) βmodules/azure/oncall-integration/β PagerDuty/Opsgenie + Slack (Sentinel incidents β on-call).[M2b][B][CO]π¦ code-complete (external, gemini-work PR #12) - π¦ Sentinel SOAR Playbooks (
K3) βmodules/azure/sentinel-soar/β active incident-response containment playbooks (Logic Apps) for a Microsoft Sentinel Deployment (J3) incident:isolate-compromised-account(Graph PATCH useraccountEnabled=false),disable-risky-service-principal(Graph PATCH SP),quarantine-vm(ARM PATCH the NIC to attach a deny-all quarantine NSG). Reuses the Auto-Remediation Playbooks (S3) structural dry_run/enforce split (Compose intent-record vs. real Http action viaManagedServiceIdentity, rendered at plan time β a dry_run playbook is structurally incapable of running containment); the K3 addition is a per-playbook Graph/ARMaudience. HTTP-trigger accepts the incident+entity payload; ships the playbooks (wiring to incidents via a Sentinel automation rule is the out-of-band step, same stance asS3). Retires theapps/soar-playbooks/scaffold (G20). Scope vsS3: S3 fixes drift findings (low blast radius), K3 contains active incidents (high). OfflineTestSentinelSoarValidate.[M4][A][CO]π¦ code-complete (v0.66) β Test:docs/runbooks/test/K3.mdβ fmt/validate + Terratest validate (A+B); live: apply the pack, prove every dry_run definition is a Compose with no Http action, destroy (C). - π¦ Post-Incident Review (
K4) βapps/post-incident-review/β turns closed security/ops incidents into blameless post-incident review docs + idempotent tracking issues via the Ticket Platform Library (E7) CLI bridge (third E7 consumer, the Defender Ticketer (I5)/Production Change Log (R2) mold: pure core behind a collector seam, E7 consumed at run time). Defensive normalize across theaz sentinel incident listshape + a flat shape; filters to closed β§ β₯severity floor; computes time-to-detect / MTTR / duration from real timestamps; renders a standard postmortem (supplied root-cause/timeline render verbatim, missing sections become honest "to be completed" prompts β never fabricates a root cause). Dedupe keypost-incident-review=<incidentId>. 23 jest tests.[M4][A][CA]π¦ code-complete (v0.66) β Test:docs/runbooks/test/K4.mdβ build/typecheck/test (A) + offline dry-run on the sample (B, 1/3 reviewed at Medium floor); live: real closed Sentinel incidents β issues via E7, second run updates (C). - π¦ Tabletop Exercise Pack (
K5) βdocs/runbooks/tabletop/β five facilitated, discussion-based IR rehearsals (account compromise / ransomware / data exfiltration / DDoS / vendor breach) mapped 1:1 to the K1 incident runbooks, each with timed injects, phase-by-phase discussion questions (Identificationββ¦βPost-Incident), an evaluation rubric, and an after-action stub that seeds a K4 post-incident review. Ships a README + facilitation guide + scenario template + after-action template + an offlinevalidate.pygate (required sections, all five K1 phases referenced, cross-links resolve).[M4][A][CO]β Test: offlinevalidate.sh/validate.pygate. Manual runbook:docs/runbooks/test/K5.md.
L. Backup & Disaster Recovery [B]/[A]¶
- π¦ Azure Backup Policy Module (
L1) βmodules/azure/backup-policy/β Azure Backup policy module[B]: creates (toggleable) a GeoRedundant Recovery Services vault + a Data Protection Backup vault and the four per-env-retention backup policies β VM (azurerm_backup_policy_vm), Azure Files/"Storage" (azurerm_backup_policy_file_share), SQL-in-VM (azurerm_backup_policy_vm_workload), AKS (azurerm_data_protection_backup_policy_kubernetes_cluster). Per-env profiles (dev 7d / staging 14d+5w / prod 30d+12w+12m+7y) expand daily/weekly/monthly/yearly tiers via dynamic blocks; plan-time preconditions enforce CRRβGeoRedundant and the yearlyβmonthlyβweekly nesting. Defines reusable policies (not per-instance bindings); vault MIs exported for consumers. GeoRedundant +cross_region_restore_enabled= the on-ramp to Cross-Region Replication (L2). OfflineTestBackupPolicyValidategate.[M2b][B][CO]π¦ code-complete (v0.46) β Test:docs/runbooks/test/L1.mdβ fmt/validate + Terratest validate (A+B); live: apply both vaults + four policies to sandbox, assert redundancy/retention, destroy (C). - π¦ Cross-Region Replication Module (
L2) βmodules/azure/cross-region-replication/β cross-region replication wiring[B]: blob object replication (azurerm_storage_object_replication, sourceβDR account, rule per container mapping; optionally creates the destination containers) + geo-redundant SQL failover group (azurerm_mssql_failover_group, primaryβpartner server, per-env failover posture). Consumes existing accounts/servers by ARM ID (brownfield-safe wiring, not resource creation β same stance as the Azure Backup Policy (L1)). Per-env SQL failover: dev Manual / staging Automatic 60m / prod Automatic 120m; preconditions enforce cross-region locations differ, distinct accounts/servers, and Automaticβgrace / Manualβno-grace coherence. The active-replication half of DR;L1is the recoverability half; the Automated Restore Drill (L4) is the drill. OfflineTestCrossRegionReplicationValidategate.[M2b][B][CO]π¦ code-complete (v0.47) β Test:docs/runbooks/test/L2.mdβ fmt/validate + Terratest validate (A+B); live: apply two storage accounts + two SQL servers + the links to sandbox, assert failover group Automatic/120m + cross-region, destroy (C). - π¦ DR Runbook Templates (
L3) βdocs/runbooks/dr/β copy-per-workload DR templates that turn the DR machinery into executable procedures: masterdr-plan-template.md+ scenarios (region-failover, data-restore, sql-failover, full-region-loss) with RTO/RPO tables,azcommands, validation + fail-back + sign-off blocks. Completes the DR series with the Azure Backup Policy Module (L1), Cross-Region Replication Module (L2), and Automated Restore Drill (L4).[M4][A][CO]π¦ code-complete (v0.62) - π¦ Automated Restore Drill (
L4) βapps/restore-drill/β automated restore drill[B]: standalone TS tool (pure offline logic + thin executor seam + jest, same mold as the Compliance Snapshot Collector (E0) / Drift Detector (S1) / Compliance Dashboard (S2)) that restores an Azure Backup (L1) backup (or fails over a Cross-Region Replication (L2) SQL failover group) into an ephemeral sandbox RG β validates β tears down β records a versionedRestoreDrillReport(schemaVersion 1.0). Outcome classified passed/partial/failed (partial = recovered but RTO missed or teardown failed); measured RTO = restore+validate duration;diffReportsis the recoverability-regression signal. Executors:DryRunExecutor(deterministic β tests/demos/workflow rehearsal) +AzureCliExecutor(liveaz). Reports land in thecompliance/restore-drills/evidence store; the Compliance Dashboard (S2) gains an additive--restore-drills-dir"DR restore drills" panel (gated, so its golden output is unchanged) β that's how pass/fail reaches the dashboard. Scheduled via.github/workflows/restore-drill.yml(monthly cron; dispatch defaults to dry-run, schedule runs live; commits the report). Teardown always runs (Sandbox Cleanup (X7) backstop).[M2b][B][CO]π¦ code-complete (v0.48) β Test:docs/runbooks/test/L4.mdβ offline classify/orchestrate/render +S2panel wiring (A+B, 17 + 34 tests); live: real restoreβvalidateβteardown in the sandbox, dated report to the evidence store (C). - π¦ RTO/RPO Doc Generator (
L5) βapps/rto-rpo-doc-generator/β generates a versioned, evidence-backed RTO/RPO objectives document[A]: standalone TS tool (pure adapt β render + jest, same mold asE0/S1/S2/L4) that merges the Azure Backup Policy retention posture (L1retention_summary), the Cross-Region Replication posture (L2replication_summary), and the Automated Restore Drill's versioned evidence (L4RestoreDrillReports) into one markdown report. RPO is derived β never asserted beyond the configuration: backup-restored workloads get a minute bound from the shortest enabled L1 cadence (daily/weekly/monthly/yearly); continuously-replicating SQL failover-group workloads get the mechanism plus the configured grace window, deliberately not a fabricated minute figure. Documents only workloads with L4 drill evidence β "a backup you have never restored is a hope, not a backup" β with a per-workload table (defined vs measured RTO, status badgemet/at-risk/failing), an inline RPO-derivation trace per row, and a gap-analysis section naming every at-risk/failing workload with a concrete next step. Completes the DR series withL1/L2/L3/L4.[M4][A][CO]π¦ code-complete (v0.63) β Test:docs/runbooks/test/L5.mdβ offline build/typecheck/test (15 tests) + fixture CLI run (posture + 3-workload table + gap analysis + honest empty state); no live phase (pure doc generator).
M. Data Protection & Privacy [B]/[A]¶
-
π¦ Encryption Policy Module (
M1) βmodules/azure/encryption-policy/β customazurerm_policy_set_definitionDeny initiative: encryption-at-rest built-ins (storage infrastructure encryption, SQL CMK, managed-disk double-encryption + CMK). Initiative-leveleffectparameter (Audit/Deny/Disabled). No system-assigned identity (Deny effect, not DINE). GUIDs caller-overridable.[M2a][B][CO]β Test: Terratest validate (offline). Live AuditβDeny rollout + "unencrypted create denied" is manual. -
π¦ Customer-Managed Key Module (
M2) βmodules/azure/cmk/β Customer-Managed Key: HSM-backedazurerm_key_vault_key(RSA-HSM/EC-HSM only, software keys rejected) + auto-rotation policy (rotate_before_expiry_days < expire_after_daysprecondition) in an EXISTING Key Vault (F5) Premium RBAC-mode vault. Optional user-assigned identity auto-granted Crypto Service Encryption User. Consumers wire to versionless key ID for transparent rotation.[M2a][B][CO]β Test: Terratest validate +TestCMKModuleintegration (~$1 β Premium vault + deployer Crypto Officer + HSM key, asserts versionless ID + rotation policy). -
π¦ TLS Policy Module (
M3) βmodules/azure/tls-policy/β custom Deny initiative: secure-transport built-ins (storage secure-transfer, storage min-TLS, App Service + Function HTTPS-only). Two initiative parameters:effect+minimumTlsVersion. Thestorage_min_tlsreference threads BOTH via explicitparameter_values.[M2a][B][CO]β Test: Terratest validate (offline). Live AuditβDeny + "HTTP/TLS<1.2 create denied" is manual. -
π¦ Microsoft Purview Baseline (
M4) βmodules/azure/purview-baseline/β the data-classification foundation:azurerm_purview_account(system identity) + self-audit diagnostics to the J1 workspace + Reader/Storage Blob Data Reader grants over caller-suppliedscan_scopesso the account can register + scan in-subscription sources. Honest boundary: collections/scans/classifications are data-plane (governance portal/REST) β Terraform owns the account + access. Cost note: bills per capacity unit even when idle; destroy in sandboxes.[M4][A][CO]π¦ code-complete (v0.71) β Test: offlineTestPurviewBaselineValidate. Runbook:docs/runbooks/test/M4.md. - π¦ DLP Policies (
M5) βpolicy/dlp/β M365 DLP as policy-as-code (Terraform can't manage M365 DLP): three committed YAML policy definitions (PII-financial, PII-personal, PHI β audit-firstTestWithNotificationsmode, the enforce=falseβtrue stance) + a pure-stdlib offline gate (validate.py+ unit tests) + an idempotentdeploy-dlp.ps1(Security & ComplianceNew/Set-DlpCompliancePolicy/Rule). The "cloud storage" half of DLP is already enforced by N5/M1/M3/M6 β the README states the division.[M4][A][CO]π¦ code-complete (v0.71) β Test:policy/dlp/validate.sh+ unit tests (offline); live deploy + test-email detection is Part C. Runbook:docs/runbooks/test/M5.md. -
π¦ GDPR-CCPA Evidence (
M7) βcompliance/data-inventory/(RoPA register: per-activity system/owner/purpose/lawful-basis/retention-with-basis/residency/processors-with-DPA/dsar_lookup; PyYAML offline gate, fail-closed on enum/field violations) +docs/runbooks/privacy/dsar-workflow.md(GDPR 30-day / CCPA 45-day clocks, identity-verify-first, mechanical inventory walk, documented retention exemptions, honest backups statement) + per-request evidence records incompliance/dsar/. Finishes the M series.[M4][A][CO]π¦ code-complete (v0.71) β Test:python3 compliance/data-inventory/validate.py+ worked DSAR dry-run. Runbook:docs/runbooks/test/M7.md. -
π¦ Data Residency Policy Module (
M6) βmodules/azure/data-residency-policy/β custom Deny initiative: Allowed-locations built-ins (resources + optional resource groups) withlistOfAllowedLocations. Noeffectparameter (Allowed-locations is intrinsic-Deny); rollout usesenforce=falseβtrue. Standalone residency boundary distinct from the Azure Baseline (F1)'s bundled allowed-locations.[M2a][B][CO]β Test: Terratest validate (offline).enforce=falseβtrue+ "out-of-region create denied" is manual.
N. Network Security [B]/[A]¶
- π¦ Landing-Zone Connectivity (
N1) βmodules/azure/landing-zone-connectivity/β the connectivity-subscription edge F2 lacks, attached to the existing F2 hub vNet by name: Azure Bastion (+ AzureBastionSubnet + Standard PIP) always; an optional VPN/ExpressRoute gateway (+ GatewaySubnet) and optional Private DNS Resolver (+ delegated inbound/outbound subnets) behindenable_*flags. Owns no RG/vNet/spoke/firewall (no F2 duplication).[M4][CO]π¦ code-complete (v0.69) β Test: offlineTestLandingZoneConnectivityValidate. Runbook:docs/runbooks/test/N1.md. -
π¦ Azure Firewall Premium (
N2) βmodules/azure/firewall-premium-policy/β the Premiumazurerm_firewall_policylayer F2's Standard firewall lacks:sku = "Premium"+ IDPSintrusion_detection(mode + signature overrides + traffic bypass) + optional TLS inspection (tls_certificate+ UserAssigned identity, KV-cert gated) + optional DNS proxy + overridable application/network rule collection groups (deny-by-default). Attaches to a Premiumazurerm_firewallbyfirewall_policy_id.[M4][CO]π¦ code-complete (v0.69) β Test: offlineTestFirewallPremiumPolicyValidate. Runbook:docs/runbooks/test/N2.md. -
π¦ WAF Policy Module (
N3) βmodules/azure/waf-policy/β Web Application Firewall policy for Application Gateway WAF v2 and Azure Front Door Premium. OWASP 3.2 managed rule set by default (configurable toMicrosoft_DefaultRuleSetfor Front Door orMicrosoft_BotManagerRuleSetfor bot mitigation). Prevention or Detection mode. Per-rule-group overrides (disable individual managed rules to tune false positives); managed-rule exclusions for known-safe request components; map-keyed custom rules (IP block list, geo-block, string match, rate limiting viaRateLimitRule). Association is the caller's responsibility β N3 exportspolicy_idfor wiring to an AppGw firewall policy or Front Door security policy. Optional resource group creation.[M2b][B][CO]π¦ code-complete (v0.60) β Test:terraform validate(TerratestTestWAFPolicyValidate) β exercises Prevention mode + OWASP 3.2 + per-rule override + exclusion + two custom rules (IPMatch + GeoMatch). Live apply (policy created + associated with AppGw, blocked request returns 403) is the N3 runbook Part C. Manual runbook:docs/runbooks/test/N3.md. -
π¦ DDoS Protection (
N4) βmodules/azure/ddos-protection/β Azure DDoS Network Protection plan. Creates oneazurerm_network_ddos_protection_plan; callers associate VNets by adding addos_protection_plan { id = module.ddos.plan_id; enable = true }block to theirazurerm_virtual_networkresources (the F2 hub vNet, spoke vNets, or standalone VNets). Exportsplan_idand Azure-reportedvirtual_network_ids. Optional resource group creation. Cost: ~$2,944/month for the plan β budget approval required before applying.[M2b][B][CO]π¦ code-complete (v0.60) β Test:terraform validate(TerratestTestDDoSProtectionValidate). Live apply (plan created + VNet associated + protection confirmed) is the N4 runbook Part C β incurs ~$2,944/month, destroy immediately. Manual runbook:docs/runbooks/test/N4.md. -
π¦ Private Endpoint Policy Module (
N5) βmodules/azure/private-endpoint-policy/β custom Deny initiative: "disable public network access" built-ins (storage / Key Vault / Cosmos DB / SQL). Initiative-leveleffectparameter. No system-assigned identity. Pairs with the Container Registry (F4) / Key Vault (F5) (PEs) + Network Hub (F2) (Private DNS). Curated, caller-overridable GUIDs.[M2a][B][CO]β Test: Terratest validate (offline). AuditβDeny rollout + "public PaaS create denied" is manual. -
π¦ NSG Baseline Module (
N6) βmodules/azure/nsg-baseline/β hardened NSG (dynamic security_ruleover mergedbaseline_rules+custom_rulesmap; curated defaults deny SSH/RDP/Internet-inbound; cross-map key collision = plan-time merge error) + optional subnet associations + optional NSG flow logs + Traffic Analytics (10-min interval, gated on BOTH workspace ID AND flow-log storage account ID). Standalone counterpart to the Network Hub (F2)'s bundled NSG.[M2a][B][CO]β Test: Terratest validate +TestNSGBaselineModuleintegration (~$0, flow logs OFF). "Flow logs landing within 10 min" is manual Part D. -
π¦ Zero-Trust Reference Architecture (
N7) βdocs/architecture/zero-trust-reference.mdβ maps the three zero-trust principles (verify explicitly / least privilege / assume breach) + the five pillars (identity / devices / network / applications / data) + the visibility-automation spine to concrete SnowOps assets, with an honest maturity/gap table. The engineering counterpart to the GTM Z-series platform refs. Finishes the N series.[M4][A][CO]π¦ code-complete (v0.69) β Test: content review + offline cross-link check. Runbook:docs/runbooks/test/N7.md.
OβQ. Endpoint, Vendor Risk, HR Security [A]¶
All items β Endpoint & Workforce Security (O1βO4), Vendor & Third-Party Risk (P1βP4), HR Security & Training (Q1βQ5) β are βΈοΈ postponed to M4.
R. Change Management [B]/[A]¶
-
π© PR Template Enforcement (
R1) β PR template enforcement + required-fields validation workflow.[M1][QW][CA]β Signed off 26/05 (Sagar Chhabra). -
π¦ Production Change Log (
R2) βapps/change-log/β merged PRs / squash commits β categorized changelog (+ optional change-record ticket via the Ticket Platform Library (E7)). π¦ code-complete (v0.59). - π¦ Emergency Change Workflow (
R3) β.github/workflows/emergency-change.ymlβ label-gated (emergency-change/break-glass) PR workflow that bypasses CAB pre-approval for speed but (1) validates an inline Emergency Change Record via a stdlib gate (tests/emergency-change/), (2) drives R4'sapps/cab-automationin emergency mode through the E7snowops-ticketCLI to file a retroactive CAB review ticket (dry-run unless a tracker secret is set), and (3) posts a mandatory retrospective-review checklist comment. Human process documented indocs/runbooks/change/emergency-change.md.[M4][A][CA]β Test:tests/emergency-change/validate.sh(14 stdlib unit tests + valid/broken fixture proof). Manual runbook:docs/runbooks/test/R3.md. - π¦ CAB Automation (
R4) βapps/cab-automation/β high-impact changes β Change Advisory Board review tickets via the Ticket Platform Library (E7) CLI bridge (fourth E7 consumer, the Defender Ticketer (I5)/Production Change Log (R2) mold). Assesses each change (open PRs viagh pr list, or fixture) against a configurable CAB policy: requires CAB on a CAB label (impact:high/cab-required), an emergency label (emergency/break-glassβ retroactive review framing), or a high-risk path touched (modules/,live/,policy/,pipelines/,waivers/,gitops/); impact = high for label/emergency, medium for path-only β reasons are always the matched labels/paths, never invented. Renders a CAB review (what/who/why + matched surfaces + backout-plan prompt + approval checklist; SOC2 CC8.1 / ISO A.12.1.2 evidence), dedupecab=<pr-number>,--fail-on-cabfor branch-protection gate use. 24 jest tests.[M4][A][CA]π¦ code-complete (v0.66) β Test:docs/runbooks/test/R4.mdβ build/typecheck/test (A) + offline dry-run on the sample (B, 2/4 require CAB); live: real open PRs β CAB issues via E7, second run updates (C).
S. Continuous Compliance Monitoring & Drift [B]/[A]¶
-
π¦ Drift Detector (
S1) βapps/drift-detector/β Drift detection[B]: read-only TS tool that turnsterraform show -jsoninto a versionedDriftReport(schemaVersion 1.0), classifies managed-resource changes (create/update/delete/replace; no-op + data reads excluded), and files/updates one ticket per stack.diffReportsis the change signal (mirrors the Compliance Snapshot Collector (E0)'sdiffSnapshots). Ships theTicketPlatforminterface (D15 β the Ticket Platform Library (E7) seed) with GitHub Issues + dry-run adapters; idempotent upsert via an embedded dedupe marker. Scheduled via.github/workflows/drift-detection.yml(daily cron, per-stack matrix). Plans only, never applies.[M2b][B][CO]π¦ code-complete (v0.44) β Test:docs/runbooks/test/S1.mdβ offline classifier/diff/ticket (A+B); live: mutate sandbox resource, next run opens/updates the issue (C). -
π¦ Compliance Dashboard (
S2) βapps/compliance-dashboard/β Azure Policy compliance dashboard[B]: fully offline TS tool that renders a history of Compliance Snapshot Collector (E0)ComplianceSnapshots into a versionedComplianceDashboard(schemaVersion 1.0) plus a self-contained static HTML page + markdown summary. Current posture, latest-vs-previous regressiondelta(vendorsE0'sdiffSnapshots), a trend line, and a best-effort name-based framework rollup (SOC 2 / ISO 27001 / CIS Azure / HIPAA; MCSB fans out; unmatched β "Unmapped"). Reads thecompliance/snapshots/evidence store (fed byE0); never touches Azure. Scheduled via.github/workflows/compliance-dashboard.yml(E0collect βS2render β artifact; Pages opt-in).[M2b][B][CO]π¦ code-complete (v0.45) β Test:docs/runbooks/test/S2.mdβ offline aggregation/framework/render golden (A+B); live: workflow collects a snapshot and uploads a renderable dashboard (C). -
π¦ Auto-Remediation Playbooks (
S3) βmodules/azure/auto-remediation-playbooks/β Curated pack of Logic App playbooks[A]that turn a posture/compliance/drift finding into a remediation action: each workflow exposes an HTTP trigger accepting a structured finding (findingKind/resourceId/...) and runs a single action that either composes an intent record (dry_run) or issues the real ARM REST call (enforce) via its system-assigned identity. Structural dry-run/enforce split β Terraform renders an entirely different action body (Composevs.Http+ManagedServiceIdentity) at plan time, so adry_runplaybook is structurally incapable of writing to Azure regardless of RBAC (extends the B3/D21 audit-only-by-default stance). Curated pack:enforce-mandatory-tags(PATCH missing U2 tags),lock-down-public-storage(PATCH to disable public blob access + deny network),remove-risky-nsg-rule(DELETE an Internet/* management-port rule),enable-resource-diagnostics(PUT a diagnostic setting β consumed J1 workspace; auto-dropped when no workspace is wired). Per-playbookenabled/modeoverrides +custom_playbooksescape hatch with collision precondition. Consumes the Log Analytics Module (J1) workspace by ARM ID for run-history diagnostics ("define the link, not the instance" β same stance as L2/J4/X8). Distinct from K3 (Sentinel SOAR incident-response): S3 fixes drift findings, K3 contains active incidents. Offlineterraform validateTerratest gate (TestAutoRemediationPlaybooksValidate).[M4][A][CO]π¦ code-complete (v0.64) β Test:docs/runbooks/test/S3.mdβ offline validate + curated-pack/override/custom-playbook exercise (A+B); live: apply in dry_run, POST a finding, confirm intent record + no Azure write; inspect enforce-mode definition + absent RBAC (C). -
π¦ Compliance Scorecard Generator (
S4) βapps/compliance-scorecard-generator/β Turns one E0ComplianceSnapshot(+ optionally an S2ComplianceDashboardfor framework rollups and trend) into a versioned, branded one-page scorecard βscorecard.md+ a self-containedscorecard.html(+ optional Pandocscorecard.pdf) +model.json(schema v1.0). The sales/client-facing counterpart to S2's detailed technical dashboard: S4 measures and re-derives nothing from Azure β every figure is a re-presentation of an E0/S2 number, with one transparent extra, a documented AβF grading band (simple mean of policy-compliance % and Secure Score %, banded through a fixed five-way split A=Strong/B=Good/C=Fair/D=Weak/F=At risk, or "β" when neither is measured), with its derivation printed inline ("Overall 88.2% = mean of policy compliance 95.3% and Secure Score 81%, banded to grade 'B' β¦") β the same "never fabricate, show your work" stance as L5/S3. Framework badges and the trend arrow are even more conservative β 1:1 re-presentations of S2's already-computedpass/attentionstatus and the sign of its real deltas (declining wins on any negative signal or the dashboard's ownregressedflag), never independently derived. Branding resolves against documented neutral defaults so an unbranded run still looks professional (preparedBy/title/accentColor/logoUrlβ text-wordmark fallback); onlyclientNameis required. Pureadapt β render+ jest, mirroring E0/S1/S2/L4/L5 β no live Azure phase (offline-only). PDF rendering is a near-copy of G3's Pandoc-spawn pattern (independent build, D37/D40). 24 jest tests (2 suites).[M4][A][SH]π¦ code-complete (v0.65) β runbookdocs/runbooks/test/S4.md
T. Trust Center & Customer-Facing [A]¶
Trust Center (T1), Status Page (T2), Subprocessor List (T3), Security-Questionnaire Library (T4) β all βΈοΈ postponed to M4.
U. Cost Governance [B]/[A]¶
-
π¦ Budget Alert Module (
U1) βmodules/azure/budget-alert/βazurerm_consumption_budget_subscription(Monthly, configurable thresholds) + dynamicnotificationblocks (actual + forecasted) + optional dedicatedazurerm_monitor_action_group(email/sms/webhook, reusing the Break-Glass (H7) pattern) + optionalfilter_tag/filter_resource_groups. 4 preconditions (β€5 notifications per Azure cap, β₯1 recipient). Build-tagged integration test (~$0).[M2a][B][CO]β Test: Terratest validate +TestBudgetAlertModuleintegration asserts budget ARM ID + action-group ID + 4 notification keys + recipient_count. -
π¦ Tag Policy Module (
U2) βmodules/azure/tag-policy/β mandatory-tag Deny initiative:Require a tag on resources+Require a tag on resource groupsper tag. Per-reference literaltagName(initiative has no parameters β each reference needs a distinct value, unlike the Data Residency Policy (M6)'s shared parameter). Default Β§8 set minus ManagedBy.enforce=falseβtruerollout (Deny is intrinsic to these built-ins).[M2a][B][CO]β Test: Terratest validate (offline).enforce=falseβtrue+ "untagged create denied" is manual. -
π¦ FinOps Dashboard (
U4) βmodules/azure/grafana-dashboards/dashboards/snowops-finops.json(extends J5) β FinOps cost-governance dashboard: daily billable log ingestion (GB) + top tables by ingestion (the J7 Basic-Logs lever,Usagetable) + tag governance (untagged-resource count, cost allocation byCostCenter, resources by type, via Azure Resource Graph). Honest about its boundary β subscription $ spend needs a Cost Management export (U1 budgets + U5 anomaly alerts cover spend alerting meanwhile).[M4][CO]π¦ code-complete (v0.68) β Test: J5 dashboards-as-code gate. Runbook:docs/runbooks/test/U4.md. - π¦ Cost Anomaly Detection (
U5) βmodules/azure/cost-anomaly-alert/β Azure Cost Management daily anomaly alerts (azurerm_cost_anomaly_alert) β email recipients; the detection complement to U1 budgets ("threshold crossed" vs "spend pattern changed"). Finishes the U cost series.[M4][CO]π¦ code-complete (v0.68) β Test: offlineTestCostAnomalyAlertValidate(Terratest validate). Runbook:docs/runbooks/test/U5.md. - β¬ Idle Resource Cleanup (
U3) β Idle-resource cleanup Function App.[M5][SO]βΈοΈ postponed
V. Documentation & Policy Management [B]/[A]¶
-
π¦ Policy Repo Template (
V1) βtemplates/policies/β six ratifiable security-policy templates (Information Security, Acceptable Use, Incident Response, Business Continuity & DR, Change Management, Vendor Risk), each with the standard skeleton +{{PLACEHOLDERS}}and an Enforcement section cross-referencing the SnowOps assets that operationalize it. These satisfy theπ Manualdocument controls the control mappings flag. Offlinevalidate.pygate (sections + placeholders + cross-link integrity).[M4][A][CO]π¦ code-complete (v0.69) β Test:python3 templates/policies/validate.py. Runbook:docs/runbooks/test/V1.md. -
π¦ Diagram Generator (
V2) βapps/diagram-generator/β zero-cloud TS tool:terraform output -jsonβ F0 contracts β cloud-neutralStackModelβd2langarchitecture diagram. Shape-based contract detection (name-agnostic; classifies by fields not output names). Deterministic renderer (stableslug()node ids + sorted emission β clean golden-file diffs).[M2b][B][CO]β¬ in scope (14-asset core) β Test: jest (2 suites / 9 tests) β adapter normalizes all F0 contracts from sample stack + golden-file byte match + determinism + empty-stack safety. Manual runbook:docs/runbooks/test/V2.md. -
π¦ Runbook Generator (
V3) βapps/runbook-generator/β zero-cloud TS CLI:terraform output -jsonβ shape-based adapter (all 7 F0 contracts) β per-domain operational runbooks (infrastructure.mdindex + identity/network/compute/registry/secrets/storage/observability) with key-facts tables, Day-Zero Hardening posture digest (β /β οΈ), ops CLI + failure modes. Mirrors the Diagram Generator (V2)'s adaptβmodelβrender pattern. Legacy Handlebars mode kept via--templates.[M2b][B][CO]β¬ in scope (14-asset core) β Test: jest (4 suites / 16 tests) β parser + legacy Handlebars + shape-based adapt + model-driven render. Manual runbook:docs/runbooks/test/V3.md. -
π¦ Compliance Manual Generator (
V4) βapps/compliance-manual/β pure adaptβrender (S4/V5 mold): composes a framework-scoped manual spec (per-control requirement + implementation statement + enforcing SnowOps asset(s) + evidence refs + governing policy) plus an optional E0 snapshot (posture appendix) into a brandedcompliance-manual.md/.html(+ optional Pandoc PDF) +model.json. Honest about undocumented controls (never invents an implementation); coverage % derivation shown. Finishes the V series.[M4][A][SH]π¦ code-complete (v0.69) β Test: jest (coverage math, honest-missing, status derivation, HTML self-containment, determinism). Runbook:docs/runbooks/test/V4.md. - β¬ Client Cloud Posture Report (
V5) β Tier 2 of the client-facing posture-visibility initiative (D65).apps/posture-report/β an offline composer (pure adapt β render + jest, the E0/S2/S4/L5 mold; re-declares input contracts, no cross-package build import per D37/D40; reuses S4's branding + Pandoc-PDF pattern) that bundles the latest Compliance Snapshot (E0), Compliance Dashboard (S2), Compliance Scorecard (S4), RTO/RPO doc (L5), and architecture diagram (V2) into ONE branded, client-facing Cloud Posture Report (posture-report.htmlself-contained + best-effortposture-report.pdf+ versionedmodel.json). Organized by SnowOps deliverable β exec summary + overall grade (S4); your guardrails (policy/Defender,E0); your data is protected (backup coverageL1, restore-drill evidence + RTO/RPOL4/L5); your compliance posture (framework rollup + trendS2); incidents we handled (reuses aK4report when supplied); cost governance (roadmap until aU-series feed exists); architecture (V2) β each section tagged by package tier (Baseline/Advanced) so ungated sections become upsell teasers. Every figure is a re-presentation of what the source tools computed; missing inputs render honest "not supplied" sections (the L5/S4 never-fabricate stance). Safe to deliver β point-in-time, sanitizable, no client cloud access required (unlike J8). Delivered via.github/workflows/posture-report.yml(monthly + dispatch; PRIVATE artifact by default, same sensitivity stance as S2) + a QBR template underdocs/client-guides/. Powers retention/QBR (Y11) and is a sales proof asset. Shares the section taxonomy with the Client Overview Dashboard (J8). Shipped: re-declared E0/S2/S4/L5/V2/K4 contracts βPostureReportModel; the headline grade is the S4 scorecard verbatim when supplied, else derived from E0 like S4; cost is an honest U4/U5 roadmap note; HTML is self-contained; 27 jest tests.[M4][A][SH]π¦ code-complete (v0.67) β Test: V5 runbook β offline build/typecheck/test (section composition, honest-missing-input handling, tier tagging, branding, never-fabricate) + fixture CLI run producing a branded report; no live phase (pure composer over JSON/markdown artifacts).
W. Multi-Tenant Client Management [X][SO] βΈοΈ ALL POSTPONED (D35)¶
The Client Repo Template (W1), Per-Client State Backend (W2), Per-Client Secret Scoping (W3) are marked [M2aβpostponed] and are NOT part of the M2a-complete bar. Pull up only when a second concurrent client forces the multi-tenant isolation question, or after M2b/M3 are underway.
- β¬βΈοΈ Client Repo Template (
W1) β Client repo template + provisioning (extends the GitHub Onboarder App (B1)). - β¬βΈοΈ Per-Client State Backend (
W2) β Per-client state backend (extends the State Backend (F6)). - β¬βΈοΈ Per-Client Secret Scoping (
W3) β Per-client secret scoping in SnowOps GH org (environments). - π¦ Client Offboarding Playbook (
W4) βdocs/runbooks/offboarding/β ownership-aware, phased offboarding playbook (the inverse of the GitHub Onboarder App (B1) + Azure Client Bootstrap Module (B2)): freeze & snapshot evidence (E0/S2/L1/L4/G6), knowledge transfer (V2/V3/F11), identity teardown (B2/H7/B5/H3/H2), repo/CI hand-back (B1/S1/H5), state & secrets transfer (F6/B4/F5), cost & monitoring (U1/K2/J4/J1/J6), decommission (terraform destroy/X7), and final attestation β with sign-off + client counter-sign.[M3]π¦ code-complete (v0.62) - β¬ Internal Client Dashboard (
W5) β SnowOps internal client dashboard.[M5]
X. Testing Framework & Sandbox [X]¶
Nothing in F/B/E/etc. can be marked π© Shipped without the Azure Sandbox Subscription (
X1), Terratest Harness (X2), and Manual Test Runbooks (X6) in place.
- π¦ Azure Sandbox Subscription (
X1) β SnowOps Azure sandbox subscription (Terraform-managed): isolated tenant or sub, budget-capped, auto-cleanup tagephemeral=true.[M1] - π¦ Terratest Harness (
X2) β Terratest harness (tests/terratest/): Go-based, parallel-safe, sandbox-scoped; mandatory per F module. Currently 35 top-level tests.[M1] - π© Conftest Test Suite (
X3) β Conftest test suite for the Terraform OPA Policy Bundle (D3) (policy/opa/tests/).[M1] - π¦ Kyverno Test Framework (
X4) β Kyverno test framework for the Kyverno AKS Policy Bundle (D4) (policy/kyverno/tests/). 9 sub-suites / 35 assertions +run-tests.shwrapper + pre-push hook.[M2a] - π¦ Pipeline Integration Tests (
X5) β Pipeline integration tests (test consumer repos for reusable workflows).[M2b]π¦ code-complete (v0.57) - β¬ Manual Test Runbooks (
X6) β Manual test runbooks (docs/runbooks/test/<asset_id>.md).[ongoing] - π¦ Sandbox Cleanup (
X7) βsandbox/cleanup/+.github/workflows/sandbox-cleanup.ymlβ nightly cleanup ofephemeral=trueRGs. Three guards: (1)ephemeral=truetag only, (2) protected-name globs, (3)--min-age-hours(default 6). 12 offline assertions. Cron 03:17 UTC (always deletes); dispatch (defaults dry-run).[M2a][SO] - π¦ Synthetic Monitoring (
X8) β App Insights standard availability tests + per-test alerts.[M2b]π¦ code-complete (v0.57)
Y. Go-To-Market & Sales Engine [X][SO] β all π¦¶
See docs/context/04-asset-status.md Β§ Y for full table.
All 14 assets (the GTM Operating Doc Y0 through the Sales Pipeline & CRM Config Y13) drafted under docs/gtm/. Human sign-offs pending.
Z. Reference Architectures [X][SOβCO] β all π¦¶
See docs/context/04-asset-status.md Β§ Z for full table.
All 4 assets (the Reference-Architecture Framework Z0 through the Healthcare / HealthTech Reference Platform Z3) drafted under docs/gtm/z/. Human sign-offs pending.