#!/usr/bin/env pwsh # CASAN H5 Risk Registry Auto-Updater # Usage: # update-risk-registry.ps1 -ActionName [-DefaultRisk ] # # If action not in registry, adds it with DefaultRisk (default: high = fail-secure). param( [Parameter(Mandatory=$true)][string]$ActionName, [ValidateSet("low","medium","high")][string]$DefaultRisk = "high" ) $scriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent $projectRoot = (Resolve-Path (Join-Path $scriptDir "../../..")).Path $registryPath = Join-Path $projectRoot ".specify/governance/risk-registry.yaml" if (!(Test-Path $registryPath)) { Write-Warning "Risk registry not found at $registryPath — skipping auto-update" exit 0 } $content = Get-Content $registryPath -Raw if ($content -match "(?m)^\s+-\s+id:\s+$([regex]::Escape($ActionName))") { Write-Output "RISK_REGISTRY_EXISTS: $ActionName already registered" exit 0 } $timestamp = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") $newEntry = @" - id: $ActionName risk_level: $DefaultRisk added_by: auto_update added_at: $timestamp note: "Auto-added (unknown action — defaulting to $DefaultRisk per fail-secure policy)" "@ # Append before the last line (end of YAML file) $lines = (Get-Content $registryPath) + $newEntry.Split("`n") Set-Content -Path $registryPath -Value $lines -Encoding UTF8 Write-Warning "[RISK_REGISTRY] Auto-added unknown action '$ActionName' with risk_level=$DefaultRisk (fail-secure)" Write-Output "RISK_REGISTRY_UPDATED: $ActionName risk=$DefaultRisk"