Procurement & Delivery Framework
Audience: Procurement Officers, Vendor Management, Technical Authorities, Delivery Leads
The goal is to create a robust catalogue of cloud services to host in the CloudStack hyperscaler infrastructure. This requires a structured approach to procurement, development standards, CI/CD integration, and cooperative sign-off that ensures quality, security, and interoperability across all participating jurisdictions.
Running a single tender across four different procurement regimes is legally impractical. See the Procurement Law Compliance Analysis for detailed analysis of UK Procurement Act 2023, EU Directive 2014/24, Canadian Buy Canadian policies, and Australian Commonwealth Procurement Rules 2025 - plus our recommended Coordinated Parallel Procurement model.
1. Executive Summary
This framework establishes:
- Capability Catalogue: A structured list of ~35 core capabilities needed to replace AWS/Azure/GCP services
- Tender Process: How SMEs in each jurisdiction bid for capability development contracts
- Development Standards: Mandatory IaC, security, documentation, and testing requirements
- CI/CD Pipeline: Shared infrastructure for build, test, security scan, and deployment
- Acceptance Process: How capabilities are reviewed, tested, and signed off by the cooperative
- Ongoing Maintenance: Support, patching, and evolution responsibilities
2. Resource Pool Estimation
Based on population ratios and typical SME density in cloud technology sectors:
| Jurisdiction | Population Ratio vs UK | Implied Supplier Count | Implied People (5 per supplier) |
|---|---|---|---|
| United Kingdom | 1.0 | 15 | 75 |
| European Union (27 members) | ~6.4 | ~96 | ~480 |
| Australia | ~0.39 | ~6 | ~30 |
| Canada | ~0.57 | ~9 | ~45 |
| Total Cooperative | - | ~126 SMEs | ~630 specialists |
3. Capability Catalogue Structure
The catalogue organises capabilities into domains, with each capability defined as a discrete, tendered unit of work:
3.1 Catalogue Domains
| Domain | Capability Count | AWS Equivalents | Priority |
|---|---|---|---|
| A. Compute & App Hosting | 4 | EC2, EKS, Lambda, App Runner | Critical |
| B. Storage | 4 | S3, EBS, EFS, Glacier | Critical |
| C. Databases | 5 | RDS, DynamoDB, ElastiCache, DocumentDB, Aurora | Critical |
| D. Networking | 5 | VPC, Route 53, ELB/ALB, CloudFront, API Gateway | Critical |
| E. Security & Identity | 5 | IAM, KMS, Secrets Manager, Cognito, WAF | Critical |
| F. Messaging & Integration | 4 | SQS, SNS, Kinesis, EventBridge | High |
| G. DevOps & Observability | 5 | CloudWatch, CloudTrail, X-Ray, ECR, CloudFormation | High |
| H. Analytics & Data | 4 | Redshift, Athena, Glue, QuickSight | Medium |
| Total Core Capabilities | ~36 | - | - |
3.2 Capability Definition Template
Each capability in the catalogue is defined using this standard template:
CAP-B01: Object Storage Service (S3-Compatible)
| Capability ID | CAP-B01 |
| Domain | B. Storage |
| AWS Equivalent | Amazon S3 |
| Open Source Base | MinIO / Ceph RGW |
| Priority | Critical |
| Estimated Effort | 3-person team, 12 weeks |
| Dependencies | CAP-E02 (IAM/RBAC), CAP-E03 (KMS) |
Functional Requirements
- S3-compatible API (GetObject, PutObject, ListBucket, etc.)
- Bucket policies and ACLs
- Object versioning
- Lifecycle policies (transition, expiration)
- Cross-region replication (between cooperative jurisdictions)
- Server-side encryption (SSE-S3, SSE-KMS)
- Event notifications to message queue
Non-Functional Requirements
- 99.99% availability SLA
- 11 nines durability
- Maximum latency: 100ms P99 for GET operations
- Scale to 100PB+ per jurisdiction
Deliverables
- OpenTofu module for MinIO cluster deployment
- Helm chart for Kubernetes deployment
- Integration with CAP-E02 (Keycloak) for IAM
- Integration with CAP-E03 (OpenBao) for KMS
- Prometheus metrics and Grafana dashboards
- Operational runbook
- Disaster recovery playbook
- Security hardening documentation
4. Tender Process
4.1 Process Overview
PHASE 1: PREPARATION
PHASE 2: TENDER
PHASE 3: DEVELOPMENT
PHASE 4: ACCEPTANCE
PHASE 5: DEPLOYMENT
PHASE 6: OPERATIONS
4.2 Tender Eligibility Requirements
To tender for capability development, suppliers must meet these baseline criteria:
| Criterion | Requirement | Evidence |
|---|---|---|
| Jurisdiction | Incorporated in UK, EU-27, Canada, or Australia | Certificate of incorporation |
| Ownership | No US parent company or majority US ownership | Ownership structure disclosure |
| Security Clearance | Ability to obtain national security vetting (SC/CTC equivalent) | Prior clearance or eligibility statement |
| Technical Capability | Demonstrated experience with open-source cloud technologies | Portfolio, GitHub contributions, references |
| Financial Stability | 3+ years trading, positive net assets | Audited accounts |
| Insurance | Professional indemnity £2M+, Public liability £5M+ | Insurance certificates |
| Quality Management | ISO 9001 or equivalent quality processes | Certification or process documentation |
| Security Management | ISO 27001 or Cyber Essentials Plus (or national equivalent) | Certification |
4.3 Evaluation Criteria
| Criterion | Weighting | Assessment Method |
|---|---|---|
| Technical Approach | 40% | Written proposal + technical presentation |
| Team Experience | 25% | CVs, references, portfolio review |
| Delivery Track Record | 15% | Case studies, reference calls |
| Price | 15% | Fixed price for deliverables + support rate card |
| Social Value | 5% | SME status, apprenticeships, environmental policy |
4.4 Jurisdiction Allocation
Capabilities are allocated to jurisdictions based on expertise and proportional contribution:
| Jurisdiction | Target Allocation | Recommended Focus Areas |
|---|---|---|
| EU (Germany/France lead) | ~50% (18 capabilities) | CloudStack core, Kubernetes, GDPR compliance tooling |
| United Kingdom | ~25% (9 capabilities) | Security (IAM, KMS, OpenBao), GDS patterns, identity |
| Canada | ~15% (5 capabilities) | Edge computing, bilingual support, analytics |
| Australia | ~10% (4 capabilities) | DR/resilience, APAC optimisation, PSPF compliance |
5. Development Standards
5.1 Mandatory Technical Requirements
All capability deliverables must meet these standards:
Infrastructure as Code
- OpenTofu modules for CloudStack deployment
- Helm charts for Kubernetes workloads
- Ansible playbooks for configuration management
- All IaC version-controlled in shared GitLab
- Module versioning using semantic versioning
Security Requirements
- Security hardening guide per capability
- Encryption at rest and in transit mandatory
- Integration with CAP-E02 (IAM/Keycloak)
- Integration with CAP-E03 (OpenBao) for secrets
- CIS benchmark compliance where applicable
Testing Requirements
- Unit tests with >80% code coverage
- Integration tests against CloudStack
- Performance benchmarks with defined baselines
- Chaos engineering tests (failure scenarios)
- Security tests (SAST, DAST, dependency scan)
Documentation Requirements
- Architecture decision records (ADRs)
- API documentation (OpenAPI 3.0)
- Operator runbook (deployment, scaling, backup)
- Disaster recovery playbook
- Security hardening guide
5.2 Code Repository Structure
sovereign-catalogue/
├── capabilities/
│ ├── CAP-A01-compute-vm/
│ │ ├── opentofu/
│ │ │ ├── modules/
│ │ │ ├── examples/
│ │ │ └── tests/
│ │ ├── helm/
│ │ │ ├── charts/
│ │ │ └── values/
│ │ ├── docs/
│ │ │ ├── architecture.md
│ │ │ ├── runbook.md
│ │ │ ├── security.md
│ │ │ └── adr/
│ │ ├── tests/
│ │ │ ├── unit/
│ │ │ ├── integration/
│ │ │ ├── performance/
│ │ │ └── security/
│ │ ├── CHANGELOG.md
│ │ ├── OWNERS.md # Responsible supplier
│ │ └── VERSION
│ ├── CAP-B01-object-storage/
│ │ └── ...
│ └── ...
├── shared/
│ ├── opentofu-modules/ # Common modules
│ ├── helm-library/ # Base charts
│ ├── security-policies/ # OPA policies
│ └── test-framework/ # Shared test utilities
├── pipelines/
│ ├── build.yml
│ ├── test.yml
│ ├── security-scan.yml
│ └── deploy.yml
└── docs/
├── contributing.md
├── standards.md
└── catalogue-index.md
6. CI/CD Pipeline
6.1 Pipeline Architecture
Developer
Local Dev
- Code changes
- Local testing
Code Review
- 2 approvers from different jurisdictions
Merge to main
- Protected branch
Release Tag
- Semantic versioning
Pipeline Stages
1. BUILD
- OpenTofu
- Helm
- Container
2. TEST
- Unit
- Integration
- Security
3. SECURITY
- SAST
- DAST
- SCA
- Secrets scan
4. STAGING
- Deploy to all jurisdictions
5. PRODUCTION (Gated)
- Steering Committee approval
Outputs
Artifacts Registry
- MinIO storage
Test Reports
- Coverage reports
Security Dashboard
- Vulnerability reports
Environments
Staging
- UK Staging
- EU Staging
- CA Staging
- AU Staging
Production
- UK Prod
- EU Prod
- CA Prod
- AU Prod
6.2 Pipeline Stages Detail
# .gitlab-ci.yml - Sovereign Capability Pipeline
stages:
- build
- test
- security
- staging
- approval
- production
variables:
CAPABILITY_ID: "CAP-B01"
VERSION: "${CI_COMMIT_TAG}"
# ════════════════════════════════════════════════════════════════════
# STAGE 1: BUILD
# ════════════════════════════════════════════════════════════════════
build:opentofu:
stage: build
image: opentofu/opentofu:1.7
script:
- cd capabilities/${CAPABILITY_ID}/opentofu
- opentofu init -backend=false
- opentofu validate
- opentofu fmt -check -recursive
artifacts:
paths:
- capabilities/${CAPABILITY_ID}/opentofu/
build:helm:
stage: build
image: alpine/helm:3.14
script:
- cd capabilities/${CAPABILITY_ID}/helm
- helm lint charts/*
- helm package charts/* -d packages/
artifacts:
paths:
- capabilities/${CAPABILITY_ID}/helm/packages/
build:container:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker build -t sovereign-registry.eu/${CAPABILITY_ID}:${VERSION} .
- docker push sovereign-registry.eu/${CAPABILITY_ID}:${VERSION}
# ════════════════════════════════════════════════════════════════════
# STAGE 2: TEST
# ════════════════════════════════════════════════════════════════════
test:unit:
stage: test
script:
- cd capabilities/${CAPABILITY_ID}/tests/unit
- pytest --cov=../ --cov-report=xml --junitxml=report.xml
coverage: '/TOTAL.*\s+(\d+%)/'
artifacts:
reports:
junit: capabilities/${CAPABILITY_ID}/tests/unit/report.xml
coverage_report:
coverage_format: cobertura
path: capabilities/${CAPABILITY_ID}/tests/unit/coverage.xml
test:integration:
stage: test
needs: [build:opentofu, build:helm]
script:
# Spin up ephemeral CloudStack environment
- cd capabilities/${CAPABILITY_ID}/tests/integration
- opentofu init
- opentofu apply -auto-approve -var="env=ci-${CI_PIPELINE_ID}"
- pytest test_integration.py
after_script:
- opentofu destroy -auto-approve -var="env=ci-${CI_PIPELINE_ID}"
test:performance:
stage: test
script:
- cd capabilities/${CAPABILITY_ID}/tests/performance
- k6 run benchmark.js --out json=results.json
artifacts:
paths:
- capabilities/${CAPABILITY_ID}/tests/performance/results.json
# ════════════════════════════════════════════════════════════════════
# STAGE 3: SECURITY
# ════════════════════════════════════════════════════════════════════
security:sast:
stage: security
image: returntocorp/semgrep
script:
- semgrep scan --config=p/security-audit --config=p/owasp-top-ten --json > sast-results.json
artifacts:
reports:
sast: sast-results.json
security:dependency-scan:
stage: security
script:
- trivy fs --format json --output deps-scan.json .
artifacts:
reports:
dependency_scanning: deps-scan.json
security:opentofu-scan:
stage: security
image: aquasec/tfsec
script:
- tfsec capabilities/${CAPABILITY_ID}/opentofu --format json > tfsec-results.json
artifacts:
paths:
- tfsec-results.json
security:secrets-scan:
stage: security
image: zricethezav/gitleaks
script:
- gitleaks detect --source . --report-format json --report-path secrets-scan.json
artifacts:
paths:
- secrets-scan.json
# ════════════════════════════════════════════════════════════════════
# STAGE 4: STAGING DEPLOYMENT (All Jurisdictions)
# ════════════════════════════════════════════════════════════════════
.deploy_staging:
stage: staging
script:
- cd capabilities/${CAPABILITY_ID}/opentofu/environments/staging-${JURISDICTION}
- opentofu init
- opentofu apply -auto-approve
environment:
name: staging/${JURISDICTION}
url: https://${CAPABILITY_ID}.staging.${JURISDICTION}.sovereign-cloud.gov
staging:uk:
extends: .deploy_staging
variables:
JURISDICTION: uk
staging:eu:
extends: .deploy_staging
variables:
JURISDICTION: eu
staging:ca:
extends: .deploy_staging
variables:
JURISDICTION: ca
staging:au:
extends: .deploy_staging
variables:
JURISDICTION: au
# ════════════════════════════════════════════════════════════════════
# STAGE 5: APPROVAL GATE
# ════════════════════════════════════════════════════════════════════
approval:steering-committee:
stage: approval
script:
- echo "Awaiting steering committee approval"
environment:
name: production
when: manual
allow_failure: false
rules:
- if: $CI_COMMIT_TAG
# ════════════════════════════════════════════════════════════════════
# STAGE 6: PRODUCTION DEPLOYMENT
# ════════════════════════════════════════════════════════════════════
.deploy_production:
stage: production
needs: [approval:steering-committee]
script:
- cd capabilities/${CAPABILITY_ID}/opentofu/environments/prod-${JURISDICTION}
- opentofu init
- opentofu plan -out=tfplan
- opentofu apply tfplan
environment:
name: production/${JURISDICTION}
url: https://${CAPABILITY_ID}.${JURISDICTION}.sovereign-cloud.gov
rules:
- if: $CI_COMMIT_TAG
production:uk:
extends: .deploy_production
variables:
JURISDICTION: uk
production:eu:
extends: .deploy_production
variables:
JURISDICTION: eu
production:ca:
extends: .deploy_production
variables:
JURISDICTION: ca
production:au:
extends: .deploy_production
variables:
JURISDICTION: au
6.3 Security Gates
| Gate | Tool | Failure Threshold | Action on Failure |
|---|---|---|---|
| SAST (Static Analysis) | Semgrep | Any HIGH/CRITICAL | Pipeline blocked |
| Dependency Scan | Trivy | Any CRITICAL CVE | Pipeline blocked |
| OpenTofu Scan | tfsec | Any HIGH/CRITICAL | Pipeline blocked |
| Secrets Scan | Gitleaks | Any detected secret | Pipeline blocked + alert |
| Container Scan | Trivy | Any CRITICAL CVE | Pipeline blocked |
| DAST (Staging) | OWASP ZAP | Any HIGH risk | Production blocked |
7. Acceptance & Sign-off Process
7.1 Acceptance Criteria
Each capability must satisfy all acceptance criteria before production sign-off:
| Category | Criteria | Verified By |
|---|---|---|
| Functional | All requirements in capability spec are implemented and tested | Working Group Technical Lead |
| Security | All security gates passed; pen test completed (if applicable) | Security Working Group |
| Performance | Meets defined SLA targets under load testing | Platform Engineering WG |
| Documentation | Runbook, DR playbook, security guide completed and reviewed | Documentation Review Board |
| Integration | Successfully deployed to all 4 jurisdiction staging environments | Jurisdiction Technical Leads |
| Interoperability | Integrates correctly with dependent capabilities | Integration Test Suite |
7.2 Sign-off Authorities
| Sign-off | Authority | Scope |
|---|---|---|
| Technical Sign-off | Domain Working Group Lead | Confirms technical requirements met |
| Security Sign-off | Security Working Group Lead | Confirms security requirements met |
| Jurisdiction Sign-off | Each Jurisdiction Technical Lead (x4) | Confirms capability works in their environment |
| Production Sign-off | Steering Committee (majority vote) | Authorises production deployment |
7.3 Dispute Resolution
If a jurisdiction raises concerns blocking sign-off:
- Technical Resolution (5 days): Working group attempts to resolve with supplier
- Escalation (5 days): Steering Committee reviews and mediates
- Conditional Deployment: If unresolved, capability may deploy to consenting jurisdictions only
- Long-term Resolution: Issue tracked, remediation funded in next development phase
8. Ongoing Operations & Support
8.1 Support Model
| Support Tier | Responsibility | SLA |
|---|---|---|
| L1: Jurisdiction Operations | Local government ops teams using runbooks | First response: 15 min (P1) |
| L2: Capability Owner | Original development supplier (contracted support) | Escalation response: 1 hour (P1) |
| L3: Working Group | Cross-jurisdiction expert escalation | Complex issue resolution: 4 hours (P1) |
8.2 Maintenance & Evolution
- Security Patches: Critical patches within 24 hours; high within 7 days
- Dependency Updates: Quarterly review and update cycle
- Feature Enhancements: Annual roadmap aligned with jurisdiction priorities
- Deprecation: 12-month notice for capability retirement
9. Governance Structure
9.1 Bodies
| Body | Composition | Responsibilities | Meeting Cadence |
|---|---|---|---|
| Steering Committee | 1 senior rep per jurisdiction (4 total) | Strategic direction, budget, production approvals | Monthly |
| Technical Board | Technical leads from all working groups | Architecture decisions, standards, interoperability | Bi-weekly |
| Working Groups (8) | Domain experts from across jurisdictions | Capability development oversight, technical review | Weekly |
| Security Council | Security leads from each jurisdiction | Security standards, incident response, pen testing | Weekly |
10. Next Steps
- Establish Steering Committee: Each jurisdiction nominates senior representative
- Finalise Capability Catalogue: Working groups complete all 36 capability specifications
- Set Up Shared Infrastructure: Deploy GitLab, artifact registry, CI/CD runners in EU
- Pilot Tender: Run first tender for 2-3 critical capabilities (e.g., S3, IAM, PostgreSQL)
- Refine Process: Iterate on framework based on pilot learnings
- Scale: Launch full tender programme for remaining capabilities
Related Documentation
- Organisation Structure Diagrams - Visual Mermaid diagrams of governance, working groups, CI/CD flow, and jurisdiction allocation
- CloudStack Use Cases - Technical implementation details
- Infrastructure Templates - OpenTofu module standards
- Security Hardening - Security requirements detail
- Governance Model - Cooperative governance structure