build: derive coordination receiver from staged owner sources

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a15374-f59f-7a31-86d2-d23b5d2ed181
This commit is contained in:
tegwick 2026-10-19 13:44:36 +02:00
parent 4c7f32adc7
commit bde143e030
9 changed files with 284 additions and 22 deletions

View file

@ -69,7 +69,27 @@ def bind_frame_annotation(text, digest, metadata_prefix):
return updated
def compile_bindings(workspace: Path):
def receiver_binding(frame, provenance, approval_text):
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(approval_text.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,
}
return json.dumps(receiver, indent=2) + "\n"
def compile_bindings(workspace: Path, *, receiver_only=False):
frame = owner_frame(workspace)
digest = hashlib.sha256((workspace / FRAME_REF).read_bytes()).hexdigest()
provenance = {
@ -97,6 +117,9 @@ def compile_bindings(workspace: Path):
ext["effective_deadline_seconds"] = frame.seconds(3)
approval["extensions"].setdefault("netkingdom", {})["coordination_frame"] = provenance
outputs[approval_path] = json.dumps(approval, indent=2) + "\n"
if receiver_only:
path = workspace / "net-kingdom/generated/coordination-frame/approval-engine-receiver.json"
return frame, {path: receiver_binding(frame, provenance, outputs[approval_path])}
qonto_path = workspace / "qonto-assistant/specs/audit-emission-cadence.yaml"
qonto = yaml.safe_load(qonto_path.read_text())
@ -160,37 +183,20 @@ def compile_bindings(workspace: Path):
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"
outputs[workspace / "net-kingdom/generated/coordination-frame/approval-engine-receiver.json"] = receiver_binding(frame, provenance, outputs[approval_path])
return frame, outputs
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--workspace", type=Path, default=ROOT.parent)
parser.add_argument("--receiver-only", action="store_true")
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)
frame, outputs = compile_bindings(args.workspace, receiver_only=args.receiver_only)
changed = {
p: text for p, text in outputs.items() if not p.exists() or p.read_text() != text
}