net-kingdom/tools/coordination-frame/render.py
tegwick 2d0681f361
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Adopt shared hourly coordination frame and prepare guarded runtime patches
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2
2026-10-15 20:45:06 +02:00

214 lines
8.3 KiB
Python

#!/usr/bin/env python3
"""Compile owner-reviewed cadence bindings from the ecosystem coordination frame."""
from __future__ import annotations
import argparse
import hashlib
import importlib.util
import json
import re
import sys
from pathlib import Path
import yaml
ROOT = Path(__file__).resolve().parents[2]
FRAME_REF = "coordination-engine/config/coordination-frame.json"
def owner_frame(workspace: Path):
source = workspace / "coordination-engine/src/coordination_engine/timing.py"
spec = importlib.util.spec_from_file_location("coordination_frame_owner", source)
if spec is None or spec.loader is None:
raise ValueError("coordination-engine frame API is required; no fallback")
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)
return module.load_frame(workspace / FRAME_REF)
def generated_module(frame, digest):
return (
'"""Generated cadence timings; regenerate with NetKingdom coordination-frame tool."""\n'
f"# Source: {FRAME_REF}\n"
f'FRAME_CONFIG_SHA256 = "{digest}"\n'
f"FRAME_SECONDS = {frame.frame_seconds}\n"
f"RECEIVER_WAIT_SECONDS = {frame.seconds(2)}\n"
f"EFFECTIVE_DEADLINE_SECONDS = {frame.seconds(3)}\n"
)
def bind_frame_annotation(text, digest, metadata_prefix):
key = "coordination.coulomb.social/frame-sha256"
pattern = r"(?m)^(\s*" + re.escape(key) + r": )[^\n]+"
if re.search(pattern, text):
updated, count = re.subn(pattern, lambda match: match[1] + json.dumps(digest), text)
else:
replacement = (
metadata_prefix
+ "annotations:\n"
+ " " * (len(metadata_prefix.splitlines()[-1]) + 2)
+ key
+ ": "
+ json.dumps(digest)
+ "\n"
)
# metadata_prefix ends with the indentation for annotations. Existing
# annotation maps retain their contents; otherwise insert a new map.
if metadata_prefix + "annotations:\n" in text:
updated = text.replace(metadata_prefix + "annotations:\n", replacement, 1)
count = 1
else:
updated = text.replace(
metadata_prefix, replacement + metadata_prefix.rsplit("\n", 1)[-1], 1
)
count = int(updated != text)
if count != 1:
raise ValueError("expected one runtime frame provenance binding")
return updated
def compile_bindings(workspace: Path):
frame = owner_frame(workspace)
digest = hashlib.sha256((workspace / FRAME_REF).read_bytes()).hexdigest()
provenance = {
"ref": FRAME_REF,
"sha256": digest,
"frame_seconds": frame.frame_seconds,
"heartbeat_frames": 1,
"registered_wait_frames": 2,
"effective_deadline_frames": 3,
}
outputs = {}
for relative in (
"approval-engine/approval_engine/coordination.py",
"qonto-assistant/src/qonto_assistant/coordination.py",
):
outputs[workspace / relative] = generated_module(frame, digest)
approval_path = workspace / "approval-engine/cadence.yaml"
approval = json.loads(approval_path.read_text())
for entry in approval["sources"]:
if "heartbeat" in entry:
beat = entry["heartbeat"]
beat["interval_seconds"] = frame.frame_seconds
ext = beat["extensions"]["approval-engine"]
ext["requested_observer_max_gap_seconds"] = frame.seconds(2)
ext["effective_deadline_seconds"] = frame.seconds(3)
approval["extensions"].setdefault("netkingdom", {})["coordination_frame"] = provenance
outputs[approval_path] = json.dumps(approval, indent=2) + "\n"
qonto_path = workspace / "qonto-assistant/specs/audit-emission-cadence.yaml"
qonto = yaml.safe_load(qonto_path.read_text())
for entry in qonto["sources"]:
if "heartbeat" in entry:
entry["heartbeat"]["interval"] = f"PT{frame.frame_seconds}S"
heartbeat = qonto["extensions"]["qonto-assistant"]["heartbeat"]
heartbeat["interval"] = f"PT{frame.frame_seconds}S"
heartbeat["default_interval_seconds"] = frame.frame_seconds
qonto["extensions"]["netkingdom"]["coordination_frame"] = provenance
outputs[qonto_path] = (
"# Source-owned cadence; coordination timings generated from "
+ FRAME_REF
+ "\n"
+ yaml.safe_dump(qonto, sort_keys=False)
)
deploy_path = workspace / "approval-engine/deploy/approval-engine.yaml"
deploy = deploy_path.read_text()
if re.search(r"^\s+- --heartbeat-seconds\s*$", deploy, re.M):
deploy, count = re.subn(
r"(?m)^(\s+- --heartbeat-seconds\n\s+- )[^\n]+",
lambda m: m[1] + json.dumps(str(frame.frame_seconds)),
deploy,
)
else:
# Explicit runtime arg also works with the already pinned image; no image
# pin, storage migration, authority or unrelated deployment change here.
deploy, count = re.subn(
r"(?m)^(\s+)- --audit-url$",
lambda m: (
f'{m[1]}- --heartbeat-seconds\n{m[1]}- "{frame.frame_seconds}"\n{m[1]}- --audit-url'
),
deploy,
)
if count != 1:
raise ValueError("expected one Approval Engine heartbeat argument binding")
outputs[deploy_path] = bind_frame_annotation(
deploy, digest, " template:\n metadata:\n "
)
deploy_path = workspace / "rapp-qonto/runtime/knative/service.yaml"
deploy, count = re.subn(
r"(?m)(name: QONTO_AUDIT_HEARTBEAT_INTERVAL_SECONDS\n\s+value: )[^\n]+",
lambda m: m[1] + json.dumps(str(frame.frame_seconds)),
deploy_path.read_text(),
)
if count != 1:
raise ValueError("expected one Qonto heartbeat environment binding")
outputs[deploy_path] = bind_frame_annotation(
deploy, digest, " template:\n metadata:\n "
)
fixture_path = (
workspace / "kings-guard/src/kings_guard/fixtures/qonto_assistant_source_cadence.json"
)
fixture = json.loads(fixture_path.read_text())
for entry in fixture["sources"]:
if "heartbeat" in entry:
entry["heartbeat"]["interval_seconds"] = frame.frame_seconds
fixture["extensions"].setdefault("netkingdom", {})["coordination_frame"] = provenance
outputs[fixture_path] = json.dumps(fixture, indent=2) + "\n"
receiver = {
"status": "proposed-not-applied",
"coordination_frame": provenance,
"sender": "approval-engine",
"source": "approval-engine",
"tenant": "tenant:platform",
"may_read": False,
"emission_cadence_ref": "approval-engine/cadence.yaml",
"emission_cadence_sha256": hashlib.sha256(outputs[approval_path].encode()).hexdigest(),
"heartbeat_classes": {
name: frame.seconds(2) for name in ("issuance", "use", "supersession", "revocation")
},
"receiver_grace_factor": 1.5,
"effective_deadline_seconds": frame.seconds(3),
"preserve_existing_credentials_and_other_registry_fields": True,
}
outputs[
workspace / "net-kingdom/generated/coordination-frame/approval-engine-receiver.json"
] = json.dumps(receiver, indent=2) + "\n"
return frame, outputs
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--workspace", type=Path, default=ROOT.parent)
mode = parser.add_mutually_exclusive_group()
mode.add_argument("--check", action="store_true")
mode.add_argument("--write", action="store_true")
args = parser.parse_args(argv)
try:
frame, outputs = compile_bindings(args.workspace)
changed = {
p: text for p, text in outputs.items() if not p.exists() or p.read_text() != text
}
if args.write:
for path, text in changed.items():
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(text)
report = {
"frame": frame.as_dict(),
"mode": "write" if args.write else "check" if args.check else "plan",
"changed": [str(p.relative_to(args.workspace)) for p in changed],
"live_operations": False,
}
print(json.dumps(report, indent=2, sort_keys=True))
return 1 if args.check and changed else 0
except (OSError, ValueError, KeyError, TypeError) as exc:
parser.error(str(exc))
if __name__ == "__main__":
raise SystemExit(main())