The repo is intentionally simple. Each country is a self-contained folder under
countries/. There is no template rendering, no common/ directory, and
no build step. To read a challenge, open the markdown file directly.
countries/<iso2>/
├── README.md # scenario, region, challenge index
├── challenges/ # the markdown attendees read
├── walkthrough/ # solutions (coaches only)
├── bootstrap/ # main.bicep + build / teardown scripts (ZA only today)
├── subscription-prep/ # idempotent multi-attendee prep (ZA only today)
├── demo-vms/ # ArcBox + LocalBox deployers (ZA only today)
└── cleanup/ # post-event resource-group purge
Only the South Africa folder (countries/za/) currently ships the bootstrap
automation. The other country folders are scaffolded with country-specific
challenges only.
- Copy
countries/za/tocountries/<iso2>/. - Update
README.mdwith the regulator(s), primary region, and sovereignty pattern for the new country. - Edit
bootstrap/main.bicepandmain.bicepparam:primaryRegion= new country's preferred region- allowed-locations list reflects that country's residency requirements
- Rename
build-za.sh/build-za.ps1/teardown-za.shto use the new ISO code (e.g.build-ae.sh). Update the banner text. - Rewrite each
challenges/challenge-*.mdso the regulator names, citations, and acceptance criteria reflect the new country's law and supervisor. - Add or update walkthroughs in
walkthrough/to match the new acceptance criteria. - Validate locally before committing (see below).
Run from the repo root:
# Bicep compiles
az bicep build --file countries/<iso2>/bootstrap/main.bicep --stdout >/dev/null
# Bash scripts parse
bash -n countries/<iso2>/bootstrap/build-*.sh
bash -n countries/<iso2>/bootstrap/teardown-*.sh
# PowerShell scripts parse
pwsh -NoProfile -Command "[System.Management.Automation.Language.Parser]::ParseFile('countries/<iso2>/bootstrap/build-<iso2>.ps1',[ref]\$null,[ref]\$errs); if(\$errs){\$errs;exit 1}"
# Dry-run the deployment
./countries/<iso2>/bootstrap/build-<iso2>.sh --what-ifThe CI workflow (.github/workflows/ci.yml) runs the bicep + bash + markdown
checks on every push.
Private preparation helpers (user / TAP / CA-exclusion scripts, prep PDFs,
internal docs) must not be committed to this repo. Coaches keep them in a
separate private location and point the bootstrap at it via the
--internal-helpers-path <dir> flag or the $SOVSUMMIT_INTERNAL_HELPERS
environment variable. Without those helpers the repo still runs end-to-end in
engineer mode and in coach mode without --create-users.
If you ever need to redact the bootstrap script for a public mirror, the
internal-only blocks are wrapped in # <<<INTERNAL_ONLY>>> ... # <<<END_INTERNAL_ONLY>>>
markers so they can be stripped with sed.
- Markdown: use ATX headings (
#), unordered lists with-, code fences for every command block. - PowerShell scripts:
param()block,Set-StrictMode -Version Latest,$ErrorActionPreference = 'Stop', support-NonInteractivewhere attended prompts exist. - Bash scripts:
#!/usr/bin/env bash,set -euo pipefail,--helptext in leading#comments. - Bicep: prefer modules under
bootstrap/modules/. Parameters that need customisation per country live inmain.bicepparam.