Keep source-derived cadence fixture bound to the coordination frame

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2
This commit is contained in:
tegwick 2026-10-15 20:43:18 +02:00
parent f66165fbe4
commit 164a4cdaf1
3 changed files with 33 additions and 4 deletions

View file

@ -38,8 +38,10 @@ Approval Engine already publishes receiver-compatible heartbeats and has exact
sender/source `approval-engine`, tenant `tenant:platform`. Its local transition
classes use bare issuance/use/supersession/revocation while accepted event types
are approval.issuance/use/supersession/revocation; owner mapping must preserve
both count coordinates. Requested heartbeat_classes bare classes at172800sec
must be reconciled with emitted interval86400sec and the receiver's1.5grace.
both count coordinates. Current prepared source settings derive from the shared coordination frame:
heartbeat f=3600s, registration 2f=7200s and effective deadline 3f=10800s
after the receiver's 1.5 grace. The copied source fixture retains the same
frame digest; neither source configuration nor a fixture is live admission.
Canonical declaration admission and heartbeat mapping need actual owner receipts;
existing ingestion evidence alone does not prove cadence monitoring was enabled.
@ -106,3 +108,15 @@ Receiver applies 1.5 grace to registered heartbeat intervals: the requested
172800 seconds would produce a 259200-second effective deadline. Record the
source/receiver owner decision before admitting that bound; do not silently
claim a 48-hour alert from that registration.
## Shared frame decision — 2026-10-15
Founder resolved the earlier daily 48h/72h question by introducing one
coordination frame, initially f=1h. Canonical configuration is
coordination-engine/config/coordination-frame.json; NetKingdom's compiler
regenerates the source-derived Qonto fixture alongside source/receiver
artifacts and records the config digest. The historical Taxonomy draft
fixture remains a historical worked example. Live admission must supply the
actual configured frame/interval and preserve per-class scope; the source
fixture cannot prove that a deployed process emits hourly heartbeats.

View file

@ -9,7 +9,7 @@
"form": "heartbeat-or-reconciliation",
"heartbeat": {
"event_class": "audit.heartbeat",
"interval_seconds": 86400,
"interval_seconds": 3600,
"assertion": "nothing-to-report",
"missing": "finding"
},
@ -33,6 +33,16 @@
"drafter": "qonto-assistant",
"owner": "qonto-assistant",
"reference_instance": "QONTO-WP-0005"
},
"netkingdom": {
"coordination_frame": {
"ref": "coordination-engine/config/coordination-frame.json",
"sha256": "d15e092387f128ffdfd00b9815707a05ff77c5bb0ba4d9a428fbc37b8c440b67",
"frame_seconds": 3600,
"heartbeat_frames": 1,
"registered_wait_frames": 2,
"effective_deadline_frames": 3
}
}
}
}

View file

@ -1,3 +1,4 @@
import json
from pathlib import Path
import pytest
@ -32,7 +33,11 @@ def test_qonto_source_declaration_is_consumed_separately_from_the_taxonomy_draft
assert cadence.reference_instance == "QONTO-WP-0005"
assert cadence.forms() == {"heartbeat-or-reconciliation"}
assert cadence.rates == ()
assert cadence.heartbeats[0].interval.total_seconds() == 86400
fixture = json.loads(
(ROOT / "src/kings_guard/fixtures/qonto_assistant_source_cadence.json").read_text()
)
frame = fixture["extensions"]["netkingdom"]["coordination_frame"]["frame_seconds"]
assert cadence.heartbeats[0].interval.total_seconds() == frame
@pytest.mark.skipif(