feat: implement institutional governance and recovery architecture
Dependency Audit / dependency-audit (push) Failing after 10s
Deployment Installer / deployment-installer (push) Successful in 6s
Security Audit / security-audit (push) Failing after 9s

This commit is contained in:
2026-08-01 17:46:53 +02:00
parent 3c658fa32d
commit d78b13f9d3
45 changed files with 4388 additions and 262 deletions
@@ -330,6 +330,13 @@ def _manifest_catalog_metadata(manifest: ModuleManifest | None) -> dict[str, obj
payload["dependencies"] = list(manifest.dependencies)
if manifest.optional_dependencies:
payload["optional_dependencies"] = list(manifest.optional_dependencies)
if manifest.architecture is not None:
payload["architecture"] = manifest.architecture.to_dict()
if manifest.external_providers:
payload["external_providers"] = [
declaration.to_dict()
for declaration in manifest.external_providers
]
if manifest.migration_spec is not None:
payload["migration_safety"] = "requires_review"
payload["migration_notes"] = "Module owns database migrations; review release notes and migration output before activation."
@@ -165,6 +165,13 @@ def manifest_catalog_entry(
entry["dependencies"] = list(manifest.dependencies)
if manifest.optional_dependencies:
entry["optional_dependencies"] = list(manifest.optional_dependencies)
if manifest.architecture is not None:
entry["architecture"] = manifest.architecture.to_dict()
if manifest.external_providers:
entry["external_providers"] = [
declaration.to_dict()
for declaration in manifest.external_providers
]
if manifest.provides_interfaces:
entry["provides_interfaces"] = [
{"name": item.name, "version": item.version}
+4 -6
View File
@@ -9,6 +9,7 @@ import re
import subprocess
import tomllib
from .contracts import parse_manifest_contract
from .model import RepositorySnapshot, RepositorySpec, VersionSnapshot
from .workspace import resolve_repo_path
@@ -130,12 +131,9 @@ def read_manifest_versions(path: Path) -> tuple[str, ...]:
return ()
versions: list[str] = []
for manifest in sorted(src.glob("**/backend/manifest.py")):
text = manifest.read_text(encoding="utf-8")
match = re.search(r'(?m)^\s*version\s*=\s*["\']([^"\']+)["\']', text)
if match is None:
match = re.search(r'(?m)^MODULE_VERSION\s*=\s*["\']([^"\']+)["\']', text)
if match is not None:
versions.append(match.group(1))
contract = parse_manifest_contract(manifest, repo_name=path.name)
if contract is not None and contract.module_version is not None:
versions.append(contract.module_version)
return tuple(versions)
@@ -401,6 +401,7 @@ def manifest_shape_gate_issue(workspace: Path) -> str | None:
str(META_ROOT / "tools" / "checks" / "check-manifest-shapes.py"),
"--workspace-root",
str(workspace),
"--require-architecture",
)
result = run(
command,
+8 -3
View File
@@ -82,6 +82,7 @@ PACKAGE_MODULE_REPOS=(
"$PARENT/govoplan-booking"
"$PARENT/govoplan-calendar"
"$PARENT/govoplan-campaign"
"$PARENT/govoplan-cases"
"$PARENT/govoplan-certificates"
"$PARENT/govoplan-committee"
"$PARENT/govoplan-consultation"
@@ -90,6 +91,7 @@ PACKAGE_MODULE_REPOS=(
"$PARENT/govoplan-dashboard"
"$PARENT/govoplan-dataflow"
"$PARENT/govoplan-datasources"
"$PARENT/govoplan-decisions"
"$PARENT/govoplan-docs"
"$PARENT/govoplan-encryption"
"$PARENT/govoplan-facilities"
@@ -103,15 +105,19 @@ PACKAGE_MODULE_REPOS=(
"$PARENT/govoplan-tickets"
"$PARENT/govoplan-learning"
"$PARENT/govoplan-mail"
"$PARENT/govoplan-mandates"
"$PARENT/govoplan-ops"
"$PARENT/govoplan-organizations"
"$PARENT/govoplan-parties"
"$PARENT/govoplan-permits"
"$PARENT/govoplan-policy"
"$PARENT/govoplan-poll"
"$PARENT/govoplan-portal"
"$PARENT/govoplan-procurement"
"$PARENT/govoplan-records"
"$PARENT/govoplan-resources"
"$PARENT/govoplan-risk-compliance"
"$PARENT/govoplan-services"
"$PARENT/govoplan-tenancy"
"$PARENT/govoplan-transparency"
"$PARENT/govoplan-evaluation"
@@ -122,7 +128,6 @@ PACKAGE_MODULE_REPOS=(
TAG_ONLY_MODULE_REPOS=(
"$PARENT/govoplan-addresses"
"$PARENT/govoplan-appointments"
"$PARENT/govoplan-cases"
"$PARENT/govoplan-projects"
"$PARENT/govoplan-dms"
"$PARENT/govoplan-dist-lists"
@@ -133,7 +138,6 @@ TAG_ONLY_MODULE_REPOS=(
"$PARENT/govoplan-ledger"
"$PARENT/govoplan-notifications"
"$PARENT/govoplan-payments"
"$PARENT/govoplan-portal"
"$PARENT/govoplan-postbox"
"$PARENT/govoplan-reporting"
"$PARENT/govoplan-rest"
@@ -504,7 +508,8 @@ run_manifest_shape_gate() {
run env PYTHONDONTWRITEBYTECODE=1 \
"$PYTHON" \
"$META_ROOT/tools/checks/check-manifest-shapes.py" \
--workspace-root "$PARENT"
--workspace-root "$PARENT" \
--require-architecture
}
run_migration_release_audit() {