From bd1bed731fe30b2de1963138991fc86eae03c1b6 Mon Sep 17 00:00:00 2001 From: tegwick Date: Thu, 15 Oct 2026 21:43:38 +0200 Subject: [PATCH] Register hourly cadence receiver and deploy verified durable Qonto collector Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2 --- ...approval-engine-cadence-release-patch.json | 22 + ...oval-engine-native-source-coordinates.json | 593 ++++++++++++++++++ .../approval-engine-pre-schema6-backup.json | 26 + .../approval-engine-schema6-rollout.json | 63 ++ .../approval-engine-v6-isolated-restore.json | 23 + .../audit-core-cadence-migration-job-r2.json | 107 ++++ .../audit-core-cadence-migration-job-r3.json | 108 ++++ .../audit-core-cadence-migration-job.json | 106 ++++ .../audit-core-cadence-release-patch.json | 17 + .../audit-core-migrate-egress.json | 69 ++ .../cadence-release-preparation.json | 60 ++ .../owner-acceptance-plan.json | 39 +- .../qonto-collector-native-admission.json | 59 ++ .../qonto-collector-restart-persistence.json | 37 ++ .../qonto-hourly-observation-job.json | 64 ++ .../receiver-cadence-release-native.json | 23 + .../receiver-custody-live.json | 87 +++ .../receiver-custody-packet-approved.json | 236 +++++++ .../receiver-custody-packet.json | 236 +++++++ .../receiver-migration-attempts.json | 11 + .../receiver-migration-completed.json | 31 + ...receiver-pre-release-backup-completed.json | 9 + .../receiver-pre-release-backup-metadata.json | 49 ++ .../receiver-pre-release-backup-request.json | 14 + .../receiver-release-container-check.json | 37 ++ ...-0035-emission-cadence-security-profile.md | 67 +- 26 files changed, 2178 insertions(+), 15 deletions(-) create mode 100644 docs/evidence/2026-10-15-cadence-adoption/approval-engine-cadence-release-patch.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/approval-engine-native-source-coordinates.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/approval-engine-pre-schema6-backup.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/approval-engine-schema6-rollout.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/approval-engine-v6-isolated-restore.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r2.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r3.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-release-patch.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/audit-core-migrate-egress.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/cadence-release-preparation.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/qonto-collector-native-admission.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/qonto-collector-restart-persistence.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/qonto-hourly-observation-job.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-cadence-release-native.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-custody-live.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet-approved.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-migration-attempts.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-migration-completed.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-completed.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-metadata.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-request.json create mode 100644 docs/evidence/2026-10-15-cadence-adoption/receiver-release-container-check.json diff --git a/docs/evidence/2026-10-15-cadence-adoption/approval-engine-cadence-release-patch.json b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-cadence-release-patch.json new file mode 100644 index 0000000..978d1b5 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-cadence-release-patch.json @@ -0,0 +1,22 @@ +[ + { + "op": "test", + "path": "/metadata/uid", + "value": "8b44c901-024f-4472-a822-2fd07aa2be5f" + }, + { + "op": "test", + "path": "/metadata/resourceVersion", + "value": "75772235" + }, + { + "op": "replace", + "path": "/spec/template/spec/containers/0/image", + "value": "forgejo.coulomb.social/coulomb/approval-engine@sha256:16e5d222d58e179f4836f649e8f8128321a8b644d29dc426b4d21a65ff97845d" + }, + { + "op": "replace", + "path": "/spec/template/spec/initContainers/0/image", + "value": "forgejo.coulomb.social/coulomb/approval-engine@sha256:16e5d222d58e179f4836f649e8f8128321a8b644d29dc426b4d21a65ff97845d" + } +] diff --git a/docs/evidence/2026-10-15-cadence-adoption/approval-engine-native-source-coordinates.json b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-native-source-coordinates.json new file mode 100644 index 0000000..f6e8b70 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-native-source-coordinates.json @@ -0,0 +1,593 @@ +{ + "source_window": { + "source": "approval-engine", + "tenant": "tenant:platform", + "since": "2026-09-13T23:02:55+00:00", + "until": "2026-10-15T19:38:39.029733+00:00", + "bounds": "since-inclusive-until-exclusive", + "window_basis": "created_at", + "counts": { + "issuance": { + "committed": 47, + "drained": 47, + "pending": 0, + "acknowledged_in_window": 47 + }, + "use": { + "committed": 11, + "drained": 11, + "pending": 0, + "acknowledged_in_window": 11 + }, + "supersession": { + "committed": 0, + "drained": 0, + "pending": 0, + "acknowledged_in_window": 0 + }, + "revocation": { + "committed": 0, + "drained": 0, + "pending": 0, + "acknowledged_in_window": 0 + }, + "heartbeat": { + "committed": 33, + "drained": 33, + "pending": 0, + "acknowledged_in_window": 33 + } + }, + "means": "Source occurrence counts and local acknowledgments; receiver acceptance-time comparison requires drain-lag and boundary accounting. Agreement does not prove completeness." + }, + "outbox_coordinates": [ + { + "event_id": "b4f82b2f-c63e-4e56-8eaf-b7019feb0d11", + "class": "heartbeat", + "created_at": "2026-09-13T23:02:55+00:00", + "drained_at": "2026-09-13T23:02:56+00:00" + }, + { + "event_id": "7f302456-dccb-4c65-b017-fab8fa3b0a29", + "class": "issuance", + "created_at": "2026-09-14T01:05:11+00:00", + "drained_at": "2026-09-14T01:05:13+00:00" + }, + { + "event_id": "c6a4bfef-29db-447e-bc03-feca26b49367", + "class": "issuance", + "created_at": "2026-09-14T01:05:49+00:00", + "drained_at": "2026-09-14T01:05:53+00:00" + }, + { + "event_id": "337dc3e2-c531-4e73-bbc1-e2fd680b03c5", + "class": "issuance", + "created_at": "2026-09-14T01:06:17+00:00", + "drained_at": "2026-09-14T01:06:18+00:00" + }, + { + "event_id": "1db440ca-4e92-454c-befa-7fb2276a9b26", + "class": "heartbeat", + "created_at": "2026-09-14T23:02:59+00:00", + "drained_at": "2026-09-14T23:02:59+00:00" + }, + { + "event_id": "ba93918f-cdbf-4e93-be65-b74b25bd296d", + "class": "heartbeat", + "created_at": "2026-09-15T23:03:01+00:00", + "drained_at": "2026-09-15T23:03:01+00:00" + }, + { + "event_id": "ff2d2273-576a-445f-9fac-cc1ca03b09c7", + "class": "issuance", + "created_at": "2026-09-15T23:53:32+00:00", + "drained_at": "2026-09-15T23:53:36+00:00" + }, + { + "event_id": "669bf0fb-8a30-4470-a810-c1c3be7a2efc", + "class": "issuance", + "created_at": "2026-09-15T23:56:08+00:00", + "drained_at": "2026-09-15T23:56:11+00:00" + }, + { + "event_id": "fadbdb84-ec2e-4572-99a0-13fcb5ecc8a3", + "class": "issuance", + "created_at": "2026-09-15T23:56:41+00:00", + "drained_at": "2026-09-15T23:56:46+00:00" + }, + { + "event_id": "4d2b4918-e23d-4e72-91f8-97d0ceb6be5c", + "class": "use", + "created_at": "2026-09-16T00:05:09+00:00", + "drained_at": "2026-09-16T00:05:11+00:00" + }, + { + "event_id": "0fbf7112-8835-4967-be01-629ce99fbc1f", + "class": "use", + "created_at": "2026-09-16T00:05:11+00:00", + "drained_at": "2026-09-16T00:05:16+00:00" + }, + { + "event_id": "ad6e96ab-2e8b-4ebd-b5ec-8a027477c931", + "class": "use", + "created_at": "2026-09-16T00:08:32+00:00", + "drained_at": "2026-09-16T00:08:36+00:00" + }, + { + "event_id": "74f4019b-1dac-46f6-9126-a86f63075ecb", + "class": "heartbeat", + "created_at": "2026-09-16T23:03:03+00:00", + "drained_at": "2026-09-16T23:03:03+00:00" + }, + { + "event_id": "b224ac95-1df7-462a-b7b9-fc0e49388319", + "class": "heartbeat", + "created_at": "2026-09-17T23:03:05+00:00", + "drained_at": "2026-09-17T23:03:05+00:00" + }, + { + "event_id": "06044e25-0436-43f4-8552-4f7b49f867d3", + "class": "heartbeat", + "created_at": "2026-09-18T23:03:07+00:00", + "drained_at": "2026-09-18T23:03:07+00:00" + }, + { + "event_id": "18f2b687-f3f7-40db-a056-3e91c39401be", + "class": "heartbeat", + "created_at": "2026-09-19T23:03:10+00:00", + "drained_at": "2026-09-19T23:03:10+00:00" + }, + { + "event_id": "ef66421f-3cd8-457a-8f8f-c6f4310667c6", + "class": "heartbeat", + "created_at": "2026-09-20T23:03:12+00:00", + "drained_at": "2026-09-20T23:03:12+00:00" + }, + { + "event_id": "75cbfc23-3f48-4dfd-99b1-5234fa327915", + "class": "issuance", + "created_at": "2026-09-21T19:51:29+00:00", + "drained_at": "2026-09-21T19:51:30+00:00" + }, + { + "event_id": "dfb1220b-25e0-43c6-b74e-1575bf5188af", + "class": "heartbeat", + "created_at": "2026-09-21T23:03:12+00:00", + "drained_at": "2026-09-21T23:03:12+00:00" + }, + { + "event_id": "2b125feb-7363-4187-a776-f3961f8e991e", + "class": "heartbeat", + "created_at": "2026-09-22T23:03:12+00:00", + "drained_at": "2026-09-22T23:03:12+00:00" + }, + { + "event_id": "c0b97e60-3198-46b1-a482-d38030817768", + "class": "heartbeat", + "created_at": "2026-09-23T23:03:16+00:00", + "drained_at": "2026-09-23T23:03:16+00:00" + }, + { + "event_id": "5e735adb-b9ca-457a-bbcf-aac1669384db", + "class": "heartbeat", + "created_at": "2026-09-24T23:03:20+00:00", + "drained_at": "2026-09-24T23:03:20+00:00" + }, + { + "event_id": "4c8c19be-378b-49f3-9207-a4e8091044b1", + "class": "heartbeat", + "created_at": "2026-09-25T23:03:20+00:00", + "drained_at": "2026-09-25T23:03:20+00:00" + }, + { + "event_id": "6bf120bb-ff63-46a8-b3cb-5486ace348a9", + "class": "heartbeat", + "created_at": "2026-09-26T23:03:24+00:00", + "drained_at": "2026-09-26T23:03:24+00:00" + }, + { + "event_id": "7fc26b94-9fb8-4492-b2d8-3ee48942ff73", + "class": "issuance", + "created_at": "2026-09-27T18:05:35+00:00", + "drained_at": "2026-09-27T18:05:36+00:00" + }, + { + "event_id": "8984622e-193c-42c5-812c-372e17d836f9", + "class": "issuance", + "created_at": "2026-09-27T18:22:57+00:00", + "drained_at": "2026-09-27T18:23:02+00:00" + }, + { + "event_id": "11e42f81-84c2-4d5a-9743-ed598faea076", + "class": "issuance", + "created_at": "2026-09-27T19:23:59+00:00", + "drained_at": "2026-09-27T19:24:02+00:00" + }, + { + "event_id": "c89e909f-f576-44ed-b107-69f64dc3d686", + "class": "issuance", + "created_at": "2026-09-27T19:24:15+00:00", + "drained_at": "2026-09-27T19:24:17+00:00" + }, + { + "event_id": "c2677abf-e3ff-44c2-9818-86838c259f5f", + "class": "issuance", + "created_at": "2026-09-27T19:24:32+00:00", + "drained_at": "2026-09-27T19:24:32+00:00" + }, + { + "event_id": "c9d418c8-1f74-4561-82d5-3510c2439172", + "class": "issuance", + "created_at": "2026-09-27T19:24:43+00:00", + "drained_at": "2026-09-27T19:24:47+00:00" + }, + { + "event_id": "33254695-544c-4da6-a22d-c0dc360d1f89", + "class": "issuance", + "created_at": "2026-09-27T19:24:55+00:00", + "drained_at": "2026-09-27T19:24:57+00:00" + }, + { + "event_id": "5ec40d6f-351f-4b02-ae2a-db73af6ff43c", + "class": "issuance", + "created_at": "2026-09-27T19:25:10+00:00", + "drained_at": "2026-09-27T19:25:12+00:00" + }, + { + "event_id": "e81c0b4c-cc0f-4dc9-94e1-dbe0646505e7", + "class": "use", + "created_at": "2026-09-27T19:48:20+00:00", + "drained_at": "2026-09-27T19:48:23+00:00" + }, + { + "event_id": "d35d0720-33bc-4d0d-8307-05b9b67b5cdb", + "class": "use", + "created_at": "2026-09-27T19:48:22+00:00", + "drained_at": "2026-09-27T19:48:23+00:00" + }, + { + "event_id": "27044b2d-1aab-4239-bf38-59118dfd06bb", + "class": "use", + "created_at": "2026-09-27T19:48:25+00:00", + "drained_at": "2026-09-27T19:48:28+00:00" + }, + { + "event_id": "c5c9220c-29d7-4aaa-bd93-3df355caf59c", + "class": "use", + "created_at": "2026-09-27T19:48:30+00:00", + "drained_at": "2026-09-27T19:48:33+00:00" + }, + { + "event_id": "9a0c1fec-3105-4d6f-b062-991a8345d16d", + "class": "use", + "created_at": "2026-09-27T20:01:37+00:00", + "drained_at": "2026-09-27T20:01:38+00:00" + }, + { + "event_id": "66b91546-36c0-4a25-82ca-4a52eb1eae21", + "class": "use", + "created_at": "2026-09-27T20:01:38+00:00", + "drained_at": "2026-09-27T20:01:38+00:00" + }, + { + "event_id": "496e4119-3112-4818-93b8-658ad24c745f", + "class": "heartbeat", + "created_at": "2026-09-27T23:03:25+00:00", + "drained_at": "2026-09-27T23:03:25+00:00" + }, + { + "event_id": "a65454b3-0db9-4cb7-9c7d-9c35d9e15e57", + "class": "heartbeat", + "created_at": "2026-09-28T23:03:27+00:00", + "drained_at": "2026-09-28T23:03:27+00:00" + }, + { + "event_id": "79a37132-a514-4c95-ac6c-65d08b6967d0", + "class": "heartbeat", + "created_at": "2026-09-29T23:03:28+00:00", + "drained_at": "2026-09-29T23:03:28+00:00" + }, + { + "event_id": "0c281084-cb88-44be-9666-5c3e6a59b035", + "class": "heartbeat", + "created_at": "2026-09-30T23:03:32+00:00", + "drained_at": "2026-09-30T23:03:32+00:00" + }, + { + "event_id": "36224702-dedd-4bfa-a0a4-383e30f1f781", + "class": "heartbeat", + "created_at": "2026-10-01T23:03:33+00:00", + "drained_at": "2026-10-01T23:03:33+00:00" + }, + { + "event_id": "c64733d3-f474-4266-a5ed-6be5cb3ac3a5", + "class": "heartbeat", + "created_at": "2026-10-02T23:03:33+00:00", + "drained_at": "2026-10-02T23:03:33+00:00" + }, + { + "event_id": "bd40f557-3927-4fdf-984a-cf8af60f4b5e", + "class": "issuance", + "created_at": "2026-10-03T18:45:15+00:00", + "drained_at": "2026-10-03T18:45:17+00:00" + }, + { + "event_id": "f2b199d5-2cca-47c9-ba27-389e79edcc59", + "class": "heartbeat", + "created_at": "2026-10-03T23:03:34+00:00", + "drained_at": "2026-10-03T23:03:34+00:00" + }, + { + "event_id": "8589a736-f8e7-42b5-8b1d-6b0681fd7450", + "class": "issuance", + "created_at": "2026-10-04T00:16:08+00:00", + "drained_at": "2026-10-04T00:16:09+00:00" + }, + { + "event_id": "02ff2545-0628-4dc3-8428-31246c0e5a98", + "class": "issuance", + "created_at": "2026-10-04T13:14:06+00:00", + "drained_at": "2026-10-04T13:14:51+00:00" + }, + { + "event_id": "9511a221-f392-484f-8984-54b4a0be1ac8", + "class": "issuance", + "created_at": "2026-10-04T13:14:20+00:00", + "drained_at": "2026-10-04T13:14:51+00:00" + }, + { + "event_id": "3942043a-4cfd-41d4-9c61-ef6510e12f97", + "class": "issuance", + "created_at": "2026-10-04T13:15:31+00:00", + "drained_at": "2026-10-04T13:15:36+00:00" + }, + { + "event_id": "46d1d50c-ff4c-45d3-a23d-1ee33fdc10ad", + "class": "issuance", + "created_at": "2026-10-04T13:15:51+00:00", + "drained_at": "2026-10-04T13:15:56+00:00" + }, + { + "event_id": "f4b74a51-06c1-43e7-b751-d2ddd2bd1171", + "class": "issuance", + "created_at": "2026-10-04T14:45:00+00:00", + "drained_at": "2026-10-04T14:45:01+00:00" + }, + { + "event_id": "1471937f-315a-4cc2-8bd6-6675ba3113b4", + "class": "issuance", + "created_at": "2026-10-04T14:45:11+00:00", + "drained_at": "2026-10-04T14:45:11+00:00" + }, + { + "event_id": "34040261-f64d-484a-90e0-aaf3ce68e233", + "class": "issuance", + "created_at": "2026-10-04T14:45:29+00:00", + "drained_at": "2026-10-04T14:45:31+00:00" + }, + { + "event_id": "92f9ca1d-c11d-4c89-b685-6b8ac3609900", + "class": "use", + "created_at": "2026-10-04T15:10:13+00:00", + "drained_at": "2026-10-04T15:10:17+00:00" + }, + { + "event_id": "a13f7c5d-1e33-480c-8367-64ef088b4e9a", + "class": "use", + "created_at": "2026-10-04T15:10:19+00:00", + "drained_at": "2026-10-04T15:10:22+00:00" + }, + { + "event_id": "cc55501a-eba5-4584-81cb-bf9e96000bc0", + "class": "issuance", + "created_at": "2026-10-04T22:17:19+00:00", + "drained_at": "2026-10-04T22:17:20+00:00" + }, + { + "event_id": "dedea3c2-fa4b-433c-a035-697cbd6ae6d5", + "class": "heartbeat", + "created_at": "2026-10-04T23:03:35+00:00", + "drained_at": "2026-10-04T23:03:35+00:00" + }, + { + "event_id": "a0975609-d8d1-4807-bc51-734584bfc6b8", + "class": "issuance", + "created_at": "2026-10-05T22:31:45+00:00", + "drained_at": "2026-10-05T22:31:46+00:00" + }, + { + "event_id": "57f20fdc-dbca-44a5-b888-7c51846f1430", + "class": "issuance", + "created_at": "2026-10-05T22:32:21+00:00", + "drained_at": "2026-10-05T22:32:26+00:00" + }, + { + "event_id": "d0a58fc8-a3bc-4d81-a53a-0b260c04b627", + "class": "issuance", + "created_at": "2026-10-05T22:32:41+00:00", + "drained_at": "2026-10-05T22:32:46+00:00" + }, + { + "event_id": "a10e31d7-1316-4120-9b75-8ac5881d03f7", + "class": "issuance", + "created_at": "2026-10-05T22:33:00+00:00", + "drained_at": "2026-10-05T22:33:01+00:00" + }, + { + "event_id": "89724e03-1740-4f61-aefa-b1351424f7d2", + "class": "issuance", + "created_at": "2026-10-05T22:33:20+00:00", + "drained_at": "2026-10-05T22:33:21+00:00" + }, + { + "event_id": "f8508c41-1c83-4dde-a9c1-f8da3af838c4", + "class": "issuance", + "created_at": "2026-10-05T22:33:42+00:00", + "drained_at": "2026-10-05T22:33:46+00:00" + }, + { + "event_id": "73a369d4-e559-4518-93f1-4254fcb9021f", + "class": "heartbeat", + "created_at": "2026-10-05T23:03:36+00:00", + "drained_at": "2026-10-05T23:03:36+00:00" + }, + { + "event_id": "b867057c-1d26-4bf9-b6c0-9d69437f0a6a", + "class": "heartbeat", + "created_at": "2026-10-06T23:03:38+00:00", + "drained_at": "2026-10-06T23:03:38+00:00" + }, + { + "event_id": "f3b7020b-7fd3-4a80-8bee-beb01f944681", + "class": "heartbeat", + "created_at": "2026-10-07T23:03:39+00:00", + "drained_at": "2026-10-07T23:03:39+00:00" + }, + { + "event_id": "67d7aae5-43e9-40ca-ab7a-7e3cb40439d4", + "class": "issuance", + "created_at": "2026-10-08T21:51:11+00:00", + "drained_at": "2026-10-08T21:51:14+00:00" + }, + { + "event_id": "621a0f5b-65e2-40c9-b263-58434898709e", + "class": "issuance", + "created_at": "2026-10-08T21:56:39+00:00", + "drained_at": "2026-10-08T21:56:39+00:00" + }, + { + "event_id": "4248054f-5cda-4b3e-9896-4dbe7a1179f2", + "class": "heartbeat", + "created_at": "2026-10-08T23:03:39+00:00", + "drained_at": "2026-10-08T23:03:39+00:00" + }, + { + "event_id": "e58d50c2-5f6f-4cdb-8b1a-dce2373b1d9f", + "class": "issuance", + "created_at": "2026-10-09T10:12:25+00:00", + "drained_at": "2026-10-09T10:12:29+00:00" + }, + { + "event_id": "ca825088-173e-47ed-ab2c-b07587399772", + "class": "heartbeat", + "created_at": "2026-10-09T23:03:39+00:00", + "drained_at": "2026-10-09T23:03:39+00:00" + }, + { + "event_id": "712df824-df06-4674-a3c3-f75a2bed8625", + "class": "heartbeat", + "created_at": "2026-10-10T23:03:40+00:00", + "drained_at": "2026-10-10T23:03:40+00:00" + }, + { + "event_id": "f0bd2e80-cde7-49bd-9d4b-0695290114a8", + "class": "issuance", + "created_at": "2026-10-10T23:23:31+00:00", + "drained_at": "2026-10-10T23:23:35+00:00" + }, + { + "event_id": "044a520f-cc68-4a69-8be6-b173ffabbaeb", + "class": "issuance", + "created_at": "2026-10-10T23:23:53+00:00", + "drained_at": "2026-10-10T23:23:55+00:00" + }, + { + "event_id": "09c05fcb-5426-4c0c-ad27-45aba842b6e5", + "class": "issuance", + "created_at": "2026-10-11T00:48:11+00:00", + "drained_at": "2026-10-11T00:48:15+00:00" + }, + { + "event_id": "c2040c95-8a38-405b-be58-39d146cab281", + "class": "issuance", + "created_at": "2026-10-11T01:14:23+00:00", + "drained_at": "2026-10-11T01:14:31+00:00" + }, + { + "event_id": "ce26d525-e8c8-4e8b-bd74-3640167ce744", + "class": "issuance", + "created_at": "2026-10-11T01:46:25+00:00", + "drained_at": "2026-10-11T01:46:26+00:00" + }, + { + "event_id": "80e6f45f-0071-4161-9a80-c1f0b2214744", + "class": "issuance", + "created_at": "2026-10-11T02:07:09+00:00", + "drained_at": "2026-10-11T02:07:11+00:00" + }, + { + "event_id": "8966501f-a75f-44a5-a8dd-76f3e6458a7c", + "class": "issuance", + "created_at": "2026-10-11T02:34:20+00:00", + "drained_at": "2026-10-11T02:34:21+00:00" + }, + { + "event_id": "db163410-52bd-4ef9-9da8-43b553650b24", + "class": "issuance", + "created_at": "2026-10-11T06:47:39+00:00", + "drained_at": "2026-10-11T06:47:43+00:00" + }, + { + "event_id": "9a81f17a-cbac-438d-8e2d-27a0bd8d774e", + "class": "issuance", + "created_at": "2026-10-11T06:53:43+00:00", + "drained_at": "2026-10-11T06:53:48+00:00" + }, + { + "event_id": "901d01ac-8655-4596-803a-8f8d2ab95dad", + "class": "issuance", + "created_at": "2026-10-11T10:40:55+00:00", + "drained_at": "2026-10-11T10:40:55+00:00" + }, + { + "event_id": "3cf709a4-e867-4ecd-9f4f-843093ecc4eb", + "class": "issuance", + "created_at": "2026-10-11T17:19:01+00:00", + "drained_at": "2026-10-11T17:19:03+00:00" + }, + { + "event_id": "0d1763bf-7407-4b84-9fe3-a7655b2a60ac", + "class": "heartbeat", + "created_at": "2026-10-11T23:03:41+00:00", + "drained_at": "2026-10-11T23:03:41+00:00" + }, + { + "event_id": "32257a42-f68f-4f6e-9815-507f13bdc940", + "class": "heartbeat", + "created_at": "2026-10-12T23:03:41+00:00", + "drained_at": "2026-10-12T23:03:41+00:00" + }, + { + "event_id": "dafdf67b-7be0-4c8e-9063-c7a8d9c40c0d", + "class": "heartbeat", + "created_at": "2026-10-13T23:03:42+00:00", + "drained_at": "2026-10-13T23:03:42+00:00" + }, + { + "event_id": "3160500d-f313-4055-96d2-8a3e7ba1d235", + "class": "issuance", + "created_at": "2026-10-14T07:37:00+00:00", + "drained_at": "2026-10-14T07:37:01+00:00" + }, + { + "event_id": "2ceb8f47-bdcb-4637-a371-f8145b9caef4", + "class": "heartbeat", + "created_at": "2026-10-14T23:03:46+00:00", + "drained_at": "2026-10-14T23:03:46+00:00" + }, + { + "event_id": "d66c2b9f-c30b-4db6-8ec0-2c12857d1dc8", + "class": "issuance", + "created_at": "2026-10-15T03:19:34+00:00", + "drained_at": "2026-10-15T03:19:38+00:00" + }, + { + "event_id": "76df9dbb-837b-47c4-8026-56db990a59bb", + "class": "heartbeat", + "created_at": "2026-10-15T18:54:55+00:00", + "drained_at": "2026-10-15T18:54:55+00:00" + } + ], + "observed_at": "2026-10-15T19:38:37.453790+00:00", + "boundary": "Source-owned occurrence and local acknowledgment coordinates only; independent receiver event-ID/acceptance comparison pending. Existing probe events outside this outbox must be accounted separately." +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/approval-engine-pre-schema6-backup.json b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-pre-schema6-backup.json new file mode 100644 index 0000000..6380348 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-pre-schema6-backup.json @@ -0,0 +1,26 @@ +{ + "expected_schema_version": 5, + "foreign_key_violations": 0, + "integrity": [ + "ok" + ], + "ok": true, + "persistent": true, + "required_tables": { + "approvals": true, + "entries": true, + "outbox": true + }, + "schema_current": true, + "schema_version": 5, + "live_table_counts": { + "approvals": 54, + "entries": 47, + "outbox": 91 + }, + "local_copy": "/tmp/nk-wp-0035-approval-backup/pre-schema6.sqlite", + "local_mode": "0600", + "sha256": "70ebf5d0f6218655b3ad3ddb5cc50c52a8210cf061735e45bd0f96d8452367ed", + "persistent_path": "/data/nk-wp-0035-pre-schema6-20261015.sqlite", + "observed_at": "2026-10-15T19:27:13.223863+00:00" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/approval-engine-schema6-rollout.json b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-schema6-rollout.json new file mode 100644 index 0000000..b33b9af --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-schema6-rollout.json @@ -0,0 +1,63 @@ +{ + "storage": { + "schema_version": 6, + "expected_schema_version": 6, + "schema_current": true, + "persistent": true, + "required_tables": { + "approvals": true, + "entries": true, + "outbox": true + }, + "integrity": [ + "ok" + ], + "foreign_key_violations": 0, + "ok": true + }, + "outbox": { + "total": 91, + "pending": 0, + "max_age_seconds": 0, + "attempts": 101, + "failed_pending": 0, + "counts": { + "issuance": 47, + "use": 11, + "supersession": 0, + "revocation": 0, + "heartbeat": 33 + } + }, + "table_counts": { + "approvals": 54, + "entries": 47, + "outbox": 91 + }, + "new_class_heartbeats": [ + { + "asserted_class": "heartbeat", + "created_at": "2026-10-15T18:54:55+00:00", + "drained_at": "2026-10-15T18:54:55+00:00" + }, + { + "asserted_class": "heartbeat", + "created_at": "2026-10-14T23:03:46+00:00", + "drained_at": "2026-10-14T23:03:46+00:00" + }, + { + "asserted_class": "heartbeat", + "created_at": "2026-10-13T23:03:42+00:00", + "drained_at": "2026-10-13T23:03:42+00:00" + }, + { + "asserted_class": "heartbeat", + "created_at": "2026-10-12T23:03:41+00:00", + "drained_at": "2026-10-12T23:03:41+00:00" + } + ], + "readiness": 200, + "observed_at": "2026-10-15T19:29:46.446307+00:00", + "pod_uid": "0aff01bc-8719-4229-8f2f-c26781d2e033", + "image": "forgejo.coulomb.social/coulomb/approval-engine@sha256:16e5d222d58e179f4836f649e8f8128321a8b644d29dc426b4d21a65ff97845d" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/approval-engine-v6-isolated-restore.json b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-v6-isolated-restore.json new file mode 100644 index 0000000..9cdc90e --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/approval-engine-v6-isolated-restore.json @@ -0,0 +1,23 @@ +{ + "pre_schema": 5, + "post_storage": { + "schema_version": 6, + "expected_schema_version": 6, + "schema_current": true, + "persistent": true, + "required_tables": { + "approvals": true, + "entries": true, + "outbox": true + }, + "integrity": [ + "ok" + ], + "foreign_key_violations": 0, + "ok": true + }, + "counts_unchanged": true, + "live_database_overwritten": false, + "nonroot_uid": 10001, + "source_commit": "a786b061da4d7730c0827cf4919ab9206aed6d3e" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r2.json b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r2.json new file mode 100644 index 0000000..91cc58b --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r2.json @@ -0,0 +1,107 @@ +{ + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "audit-core-migrate-nk-wp-0035-r2", + "namespace": "audit-core", + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "backoffLimit": 0, + "ttlSecondsAfterFinished": 86400, + "template": { + "metadata": { + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "restartPolicy": "Never", + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 10001, + "fsGroup": 10001, + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "containers": [ + { + "name": "migrate", + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "imagePullPolicy": "IfNotPresent", + "command": [ + "python", + "-m", + "audit_core", + "migrate" + ], + "env": [ + { + "name": "AUDIT_CORE_CREDENTIAL_DIR", + "value": "/etc/audit-core/db" + }, + { + "name": "AUDIT_CORE_DATABASE_SCHEMA", + "value": "audit_core" + }, + { + "name": "AUDIT_CORE_MIGRATE_ROLE", + "value": "audit_core_migrate" + } + ], + "resources": { + "requests": { + "cpu": "25m", + "memory": "64Mi" + }, + "limits": { + "cpu": "250m", + "memory": "128Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true + }, + "volumeMounts": [ + { + "name": "tmp", + "mountPath": "/tmp" + }, + { + "name": "database-credential", + "mountPath": "/etc/audit-core/db", + "readOnly": true + } + ], + "terminationMessagePolicy": "FallbackToLogsOnError" + } + ], + "volumes": [ + { + "name": "tmp", + "emptyDir": {} + }, + { + "name": "database-credential", + "secret": { + "secretName": "audit-core-database-migrate", + "defaultMode": 288 + } + } + ] + } + }, + "activeDeadlineSeconds": 300 + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r3.json b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r3.json new file mode 100644 index 0000000..ea3e56e --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job-r3.json @@ -0,0 +1,108 @@ +{ + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "audit-core-migrate-nk-wp-0035-r3", + "namespace": "audit-core", + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "backoffLimit": 0, + "ttlSecondsAfterFinished": 86400, + "template": { + "metadata": { + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "restartPolicy": "Never", + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 10001, + "fsGroup": 10001, + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "containers": [ + { + "name": "migrate", + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "imagePullPolicy": "IfNotPresent", + "command": [ + "python", + "-m", + "audit_core", + "migrate" + ], + "env": [ + { + "name": "AUDIT_CORE_CREDENTIAL_DIR", + "value": "/etc/audit-core/db" + }, + { + "name": "AUDIT_CORE_DATABASE_SCHEMA", + "value": "audit_core" + }, + { + "name": "AUDIT_CORE_MIGRATE_ROLE", + "value": "audit_core_migrate" + } + ], + "resources": { + "requests": { + "cpu": "25m", + "memory": "64Mi" + }, + "limits": { + "cpu": "250m", + "memory": "128Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true + }, + "volumeMounts": [ + { + "name": "tmp", + "mountPath": "/tmp" + }, + { + "name": "database-credential", + "mountPath": "/etc/audit-core/db", + "readOnly": true + } + ], + "terminationMessagePolicy": "FallbackToLogsOnError" + } + ], + "volumes": [ + { + "name": "tmp", + "emptyDir": {} + }, + { + "name": "database-credential", + "secret": { + "secretName": "audit-core-database-migrate", + "defaultMode": 288 + } + } + ], + "automountServiceAccountToken": false + } + }, + "activeDeadlineSeconds": 300 + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job.json b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job.json new file mode 100644 index 0000000..2ecdbcf --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-migration-job.json @@ -0,0 +1,106 @@ +{ + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "audit-core-migrate-nk-wp-0035", + "namespace": "audit-core", + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "backoffLimit": 0, + "ttlSecondsAfterFinished": 86400, + "template": { + "metadata": { + "labels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "spec": { + "restartPolicy": "OnFailure", + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 10001, + "fsGroup": 10001, + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "containers": [ + { + "name": "migrate", + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "imagePullPolicy": "IfNotPresent", + "command": [ + "python", + "-m", + "audit_core", + "migrate" + ], + "env": [ + { + "name": "AUDIT_CORE_CREDENTIAL_DIR", + "value": "/etc/audit-core/db" + }, + { + "name": "AUDIT_CORE_DATABASE_SCHEMA", + "value": "audit_core" + }, + { + "name": "AUDIT_CORE_MIGRATE_ROLE", + "value": "audit_core_migrate" + } + ], + "resources": { + "requests": { + "cpu": "25m", + "memory": "64Mi" + }, + "limits": { + "cpu": "250m", + "memory": "128Mi" + } + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true + }, + "volumeMounts": [ + { + "name": "tmp", + "mountPath": "/tmp" + }, + { + "name": "database-credential", + "mountPath": "/etc/audit-core/db", + "readOnly": true + } + ] + } + ], + "volumes": [ + { + "name": "tmp", + "emptyDir": {} + }, + { + "name": "database-credential", + "secret": { + "secretName": "audit-core-database-migrate", + "defaultMode": 288 + } + } + ] + } + }, + "activeDeadlineSeconds": 300 + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-release-patch.json b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-release-patch.json new file mode 100644 index 0000000..15d34e8 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/audit-core-cadence-release-patch.json @@ -0,0 +1,17 @@ +[ + { + "op": "test", + "path": "/metadata/uid", + "value": "b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb" + }, + { + "op": "test", + "path": "/metadata/resourceVersion", + "value": "75782608" + }, + { + "op": "replace", + "path": "/spec/template/spec/containers/0/image", + "value": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271" + } +] diff --git a/docs/evidence/2026-10-15-cadence-adoption/audit-core-migrate-egress.json b/docs/evidence/2026-10-15-cadence-adoption/audit-core-migrate-egress.json new file mode 100644 index 0000000..91d70f0 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/audit-core-migrate-egress.json @@ -0,0 +1,69 @@ +{ + "apiVersion": "networking.k8s.io/v1", + "kind": "NetworkPolicy", + "metadata": { + "name": "audit-core-migrate-egress", + "namespace": "audit-core" + }, + "spec": { + "podSelector": { + "matchLabels": { + "app.kubernetes.io/name": "audit-core", + "app.kubernetes.io/component": "migrate" + } + }, + "policyTypes": [ + "Egress" + ], + "egress": [ + { + "to": [ + { + "namespaceSelector": { + "matchLabels": { + "kubernetes.io/metadata.name": "databases" + } + }, + "podSelector": { + "matchLabels": { + "cnpg.io/cluster": "platform-pg" + } + } + } + ], + "ports": [ + { + "protocol": "TCP", + "port": 5432 + } + ] + }, + { + "to": [ + { + "namespaceSelector": { + "matchLabels": { + "kubernetes.io/metadata.name": "kube-system" + } + }, + "podSelector": { + "matchLabels": { + "k8s-app": "kube-dns" + } + } + } + ], + "ports": [ + { + "protocol": "UDP", + "port": 53 + }, + { + "protocol": "TCP", + "port": 53 + } + ] + } + ] + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/cadence-release-preparation.json b/docs/evidence/2026-10-15-cadence-adoption/cadence-release-preparation.json new file mode 100644 index 0000000..51d33f2 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/cadence-release-preparation.json @@ -0,0 +1,60 @@ +{ + "prepared_at": "2026-10-15T19:22:57.217356+00:00", + "images": { + "approval-engine": "forgejo.coulomb.social/coulomb/approval-engine@sha256:16e5d222d58e179f4836f649e8f8128321a8b644d29dc426b4d21a65ff97845d", + "audit-core": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "rapp-qonto-collector": "forgejo.coulomb.social/coulomb/rapp-qonto-audit-collector@sha256:82bfd4100e14ddb2cefc4acc02b6b74609846b4a26ad40d9089ed564693f250a" + }, + "source_commits": { + "approval-engine": "a786b061da4d7730c0827cf4919ab9206aed6d3e", + "audit-core": "5227fb14e47f26a01930be4611360fd90f740662", + "rapp-qonto": "62a7cc0" + }, + "scan_high_critical": { + "approval-engine": { + "count": 0, + "report_sha256": "5e787b9d4bf9514a8182476206bcc01d1d9497cee30efb876373964b1a6a6563", + "created_at": "2026-10-15T19:17:24.836393899Z" + }, + "audit-core": { + "count": 0, + "report_sha256": "f7522e60a2f37e3a85cd5ba1f0754a73d637bcb430c2f4bdf0bec925ee5f0e88", + "created_at": "2026-10-15T19:20:34.959522138Z" + }, + "rapp-qonto-collector": { + "count": 0, + "report_sha256": "0496a10c3f41925c7f2d2e92220ccc74a1814a2a924b7a3be76e88d8b8e58eb9", + "created_at": "2026-10-15T19:22:30.723382718Z" + } + }, + "approval_migration": "v5 to v6; isolated actual backup migration verified with unchanged table counts", + "receiver_migration": "additive0007-import-receipts with native migration lease; no historical import", + "live_applied": false, + "server_dry_run": { + "approval_engine_images": 0, + "receiver_image": 0, + "receiver_migration_job": 0, + "collector_runtime_ingress": 0, + "hourly_observation_job": 0 + }, + "observation_job": "qonto-hourly-observation-job.json", + "new_sender_scope": { + "name": "rapp-qonto-collector", + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "may_write": true, + "may_read": false, + "secret_policy": "redact", + "bank_credentials_or_calls": false + }, + "collector_access": { + "kubernetes": [ + "namespace rapp-qonto: get/list pods, get pods/log" + ], + "audit_custody": "only its exact writer bearer;1Gi persistent outbox", + "api_egress_ips": [ + "10.43.0.1/32", + "92.205.62.239/32" + ] + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/owner-acceptance-plan.json b/docs/evidence/2026-10-15-cadence-adoption/owner-acceptance-plan.json index 89acfa3..3e0fcf5 100644 --- a/docs/evidence/2026-10-15-cadence-adoption/owner-acceptance-plan.json +++ b/docs/evidence/2026-10-15-cadence-adoption/owner-acceptance-plan.json @@ -1,6 +1,6 @@ { "workplan": "NK-WP-0035", - "status": "hourly runtime bindings deployed and verified; operational observer acceptance pending", + "status": "receiver registered; source/receiver upgrades and durable collector deployed; elapsed-hour and independent acceptance pending", "profile_status": "proposed", "live_observer_proved": false, "source_files": { @@ -26,7 +26,7 @@ } }, "approval_engine_registration_proposal": { - "status": "not-applied; founder selected configurable f=1h", + "status": "registered in protected registry version16 and verified after receiver reload", "sender": "approval-engine", "source": "approval-engine", "tenant": "tenant:platform", @@ -51,10 +51,10 @@ "source_requested_bound_seconds": 7200, "receiver_grace_factor": 1.5, "live_steps": [ - "Complete: founder approved timing-only rollout; Approval Engine backup/restart and Qonto candidate/promotion verified on unchanged images", - "Review exact protected-registry metadata-only patch preserving credentials and all unrelated entries", - "Obtain separate approval for exact registry metadata change; use governed owner custody with contained session and CAS/readback", - "Receiver reload under owner change gate; prove actual per-class registration and class-isolated heartbeats", + "Complete: approved immutable Approval schema6 and Audit schema7 releases; verified backups and readiness", + "Complete: protected metadata CAS changed Approval cadence/heartbeat waits only, preserving existing credentials and all other senders", + "Complete: explicit new CCR0047 approval; contained operator identity, CAS/readback, session revocation confirmed", + "Complete: exact runtime registry readback after ESO sync/reload; native per-class beats and independent observer findings remain observation-phase checks", "Emit/drain actual lifecycle transitions under owner-scoped authority; correlate occurrence, acknowledgment and receiver acceptance windows including lag and duplicates", "Independent readback/count comparison and missing-class/lag findings; retain value-safe receipts" ], @@ -72,7 +72,7 @@ }, "qonto": { "required_owner": "rapp-qonto", - "missing": "Actual stdout collector/sender source/image/config and governed delivery lane", + "missing": "Elapsed real hourly periodic capture plus independent readback/observer acceptance (collector source/runtime and sender admission are now supplied)", "authoritative_workload_tenant": "tenant:friendly:binky (rapp-qonto binding; collector mapping still needs source/receiver review)", "receiver_commitment": "AUDIT-WP-0013-T05", "receiver_instance_filter": "Implemented in AUDIT-WP-0013-T04; reviewed release and native proof still required", @@ -80,7 +80,9 @@ "observer_acceptance": "KG-WP-0005-T03 then QONTO-WP-0006-T03", "historical_receipt_limit": "Source-path capture with startup and deny; not independent collector/feed acceptance", "source_interval_seconds": 3600, - "runtime_status": "rapp-qonto-00010 promoted to 100 percent after candidate health, denial and source-count checks; periodic-hour and independent collector observation pending" + "runtime_status": "rapp-qonto-00010 hourly source unchanged; scanned durable collector82bfd deployed, admitted and restarted with original202 receipts preserved", + "native_admission_receipt": "qonto-collector-native-admission.json", + "collector_restart_receipt": "qonto-collector-restart-persistence.json" }, "local_identity": { "status": "explicit incompatibility retained", @@ -133,8 +135,23 @@ "backup_receipt": "approval-engine-frame-backup.json", "qonto_candidate_receipt": "rapp-qonto-frame-candidate.json", "qonto_rollout_receipt": "rapp-qonto-frame-rollout.json", - "receiver_registry_changed": false, - "registered_2f_and_effective_3f_live": false, - "periodic_hour_observed": false + "receiver_registry_changed": true, + "registered_2f_and_effective_3f_live": true, + "periodic_hour_observed": false, + "receiver_registry_receipt": "receiver-custody-live.json", + "receiver_image": "b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "approval_image": "16e5d222d58e179f4836f649e8f8128321a8b644d29dc426b4d21a65ff97845d", + "collector_image": "82bfd4100e14ddb2cefc4acc02b6b74609846b4a26ad40d9089ed564693f250a" + }, + "observation": { + "job": "default/nk-wp-0035-hourly-observation", + "uid": "f81f6e4b-b8ab-42d8-ac36-80f1386f9a14", + "started_at": "2026-10-15T19:36:07Z", + "expected_completion_utc": "2026-10-15T20:37:00Z", + "expected_completion_berlin": "2026-10-15T22:37:00+02:00", + "capture_monitor": "hourly-observation-monitor.json", + "capture_output": "hourly-observation-capture", + "status": "running; not accepted", + "fresh_operator_oidc_needed_for_independent_readback": true } } diff --git a/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-native-admission.json b/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-native-admission.json new file mode 100644 index 0000000..7ba89c4 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-native-admission.json @@ -0,0 +1,59 @@ +{ + "own_reconciliation_status": 200, + "own_reconciliation": { + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "since": "2026-10-15T19:36:00+00:00", + "until": "2026-10-15T19:37:05.369346+00:00", + "counts": [ + { + "class": "audit-core.heartbeat", + "count": 1 + }, + { + "class": "audit.deny", + "count": 1 + } + ], + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "means": "the count of events audit-core accepted and stored in this window. Divergence from the source's own count is a finding for the source; agreement proves neither completeness nor that any event occurred." + }, + "duplicate_status": 200, + "wrong_source_status": 400, + "wrong_tenant_status": 400, + "read_refusal_status": 403, + "invalid_bearer_status": 401, + "global_pending_count": 0, + "instance_receipts": [ + { + "accepted_at": "2026-10-15T19:36:30.769604+00:00", + "covered_event_classes": [ + "audit.deny" + ], + "event_id": "28dad6de11fb25fe6e0e145351f047360d6898afb53afd4cd677e560ec69132a", + "source": "qonto-assistant", + "status_code": 202, + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 1, + "tenant": "tenant:friendly:binky", + "type": "audit-core.heartbeat" + }, + { + "accepted_at": "2026-10-15T19:36:30.861014+00:00", + "covered_event_classes": [], + "event_id": "6a9f34445e13062e38ab309a6fc800dc9a2fa24cb8a46ecd919ae18fe9409874", + "source": "qonto-assistant", + "status_code": 202, + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 2, + "tenant": "tenant:friendly:binky", + "type": "audit.deny" + } + ], + "observed_at": "2026-10-15T19:37:03.422744+00:00", + "credential_values_emitted": false, + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "independent_readback": false +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-restart-persistence.json b/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-restart-persistence.json new file mode 100644 index 0000000..2196930 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/qonto-collector-restart-persistence.json @@ -0,0 +1,37 @@ +{ + "receipts": [ + { + "accepted_at": "2026-10-15T19:36:30.769604+00:00", + "covered_event_classes": [ + "audit.deny" + ], + "event_id": "28dad6de11fb25fe6e0e145351f047360d6898afb53afd4cd677e560ec69132a", + "source": "qonto-assistant", + "status_code": 202, + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 1, + "tenant": "tenant:friendly:binky", + "type": "audit-core.heartbeat" + }, + { + "accepted_at": "2026-10-15T19:36:30.861014+00:00", + "covered_event_classes": [], + "event_id": "6a9f34445e13062e38ab309a6fc800dc9a2fa24cb8a46ecd919ae18fe9409874", + "source": "qonto-assistant", + "status_code": 202, + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 2, + "tenant": "tenant:friendly:binky", + "type": "audit.deny" + } + ], + "pending_count": 0, + "started_at": "2026-10-15T19:37:41.503622+00:00", + "pod_uid_before": "1a39bd4b-19dc-4c1f-adaa-56a11423d945", + "native_admission_receipt": "qonto-collector-native-admission.json", + "pod_uid_after": "92ef9104-469c-4b28-a0cc-f781f53bb26e", + "observed_at": "2026-10-15T19:38:35.874453+00:00", + "first_202_receipts_preserved": true, + "pvc": "rapp-qonto-audit-outbox", + "image": "forgejo.coulomb.social/coulomb/rapp-qonto-audit-collector@sha256:82bfd4100e14ddb2cefc4acc02b6b74609846b4a26ad40d9089ed564693f250a" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/qonto-hourly-observation-job.json b/docs/evidence/2026-10-15-cadence-adoption/qonto-hourly-observation-job.json new file mode 100644 index 0000000..9703814 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/qonto-hourly-observation-job.json @@ -0,0 +1,64 @@ +{ + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "name": "nk-wp-0035-hourly-observation", + "namespace": "default", + "labels": { + "netkingdom.workplan": "NK-WP-0035" + } + }, + "spec": { + "backoffLimit": 0, + "activeDeadlineSeconds": 3900, + "ttlSecondsAfterFinished": 86400, + "template": { + "metadata": { + "labels": { + "netkingdom.workplan": "NK-WP-0035" + } + }, + "spec": { + "restartPolicy": "Never", + "automountServiceAccountToken": false, + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 100, + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "containers": [ + { + "name": "observe", + "image": "docker.io/curlimages/curl@sha256:94e9e444bcba979c2ea12e27ae39bee4cd10bc7041a472c4727a558e213744e6", + "command": [ + "sh", + "-ec", + "set -eu\nu=http://rapp-qonto.rapp-qonto.svc.cluster.local\ncurl -fsS --max-time 50 \"$u/v1/health\" >/dev/null\ncurl -fsS --max-time 30 \"$u/v1/audit/reconciliation\"\necho\nstatus=$(curl -sS --max-time 30 -o /dev/null -w '%{http_code}' -H 'X-Actor-ID: nk-wp-0035-hourly-observation' -H 'X-Actor-Lane: agent' \"$u/v1/accounts\")\n[ \"$status\" = 403 ]\necho '{\"denial_status\":403,\"bank_operation_requested\":false}'\nend=$(( $(date +%s) + 3630 ))\nwhile [ \"$(date +%s)\" -lt \"$end\" ]; do\n curl -fsS --max-time 30 \"$u/v1/health\" >/dev/null\n sleep 20\ndone\ncurl -fsS --max-time 30 \"$u/v1/audit/reconciliation\"\necho\n" + ], + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "drop": [ + "ALL" + ] + } + }, + "resources": { + "requests": { + "cpu": "5m", + "memory": "8Mi" + }, + "limits": { + "cpu": "100m", + "memory": "32Mi" + } + } + } + ] + } + } + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-cadence-release-native.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-cadence-release-native.json new file mode 100644 index 0000000..8e1589f --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-cadence-release-native.json @@ -0,0 +1,23 @@ +{ + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "deployment_uid": "b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb", + "deployment_resource_version": "75784583", + "pod_uid": "22e4df05-dfb0-4e70-8d5a-5a5950c860bd", + "capabilities": { + "load_bearing": true, + "redact": true, + "write_only": true, + "source_exact": true, + "tenant_exact": true + }, + "synthetic_probe_only": true, + "credential_reads": 0, + "cadence_instance_capabilities": { + "cadence_registration": true, + "sqlite_instance_filter": true, + "postgres_instance_filter": true, + "synthetic_cadence_parse": true, + "synthetic_heartbeat_parse": true, + "synthetic_exact_scope": true + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-live.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-live.json new file mode 100644 index 0000000..14014d2 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-live.json @@ -0,0 +1,87 @@ +{ + "schema_version": "platform.cadence-custody/v1", + "status": "delivered_pending_native_producer_and_independent_acceptance", + "credential_values_emitted": false, + "started_at": "2026-10-15T19:35:14.571483+00:00", + "packet_sha256": "81478f43abd2dbcb924966e9a3404e26bc226c91f2921b493ef0d5e2c23d4729", + "receiver_before": { + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "deployment_uid": "b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb", + "deployment_resource_version": "75784583", + "pod_uid": "22e4df05-dfb0-4e70-8d5a-5a5950c860bd", + "capabilities": { + "load_bearing": true, + "redact": true, + "write_only": true, + "source_exact": true, + "tenant_exact": true + }, + "synthetic_probe_only": true, + "credential_reads": 0, + "cadence_instance_capabilities": { + "cadence_registration": true, + "sqlite_instance_filter": true, + "postgres_instance_filter": true, + "synthetic_cadence_parse": true, + "synthetic_heartbeat_parse": true, + "synthetic_exact_scope": true + } + }, + "phase": "delivery", + "registry_version_before": 15, + "custody_version": 1, + "custody_request_id": "77a526ef-dbcc-147d-b98b-a339f4efcd62", + "approval": { + "sender": "approval-engine", + "source": "approval-engine", + "tenant": "tenant:platform", + "may_read": false, + "emission_cadence_sha256": "cc58c8d53ebf50acf540d73b7607d579942bda7734c3e8722108e9c9204af655", + "heartbeat_classes": { + "issuance": 7200, + "use": 7200, + "supersession": 7200, + "revocation": 7200 + }, + "effective_deadline_seconds": 10800, + "changed": true, + "credentials_preserved": true, + "other_registry_fields_preserved": true + }, + "registry_request_id": "47ca933d-4a5d-699b-c474-094947f78fb9", + "registry_version_after": 16, + "registry_readback_matches": true, + "other_senders_preserved": true, + "approval_credentials_preserved": true, + "reader_exact_path_negatives_and_revocation": true, + "wrong_identity_denied": true, + "coding_agent_deny_wins": true, + "projection_matches": true, + "receiver_registry_projection_matches": true, + "receiver_after": { + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271", + "deployment_uid": "b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb", + "deployment_resource_version": "75785764", + "pod_uid": "8333754a-eca0-4dd0-9230-72e41bb1e632", + "capabilities": { + "load_bearing": true, + "redact": true, + "write_only": true, + "source_exact": true, + "tenant_exact": true + }, + "synthetic_probe_only": true, + "credential_reads": 0, + "cadence_instance_capabilities": { + "cadence_registration": true, + "sqlite_instance_filter": true, + "postgres_instance_filter": true, + "synthetic_cadence_parse": true, + "synthetic_heartbeat_parse": true, + "synthetic_exact_scope": true + } + }, + "receiver_reloaded": true, + "receiver_runtime_registry_matches": true, + "completed_at": "2026-10-15T19:35:47.205117+00:00" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet-approved.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet-approved.json new file mode 100644 index 0000000..e0980f5 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet-approved.json @@ -0,0 +1,236 @@ +{ + "schema_version": "platform.cadence-custody-packet/v1", + "sha256": "81478f43abd2dbcb924966e9a3404e26bc226c91f2921b493ef0d5e2c23d4729", + "status": "proposed", + "credential_values_emitted": false, + "qonto_sender_metadata": { + "name": "rapp-qonto-collector", + "sources": [ + "qonto-assistant" + ], + "tenants": [ + "tenant:friendly:binky" + ], + "may_write": true, + "may_read": false, + "secret_policy": "redact", + "evidence_kind": "load-bearing", + "heartbeat_classes": { + "audit.deny": 7200 + }, + "emission_cadence": { + "schema_version": "0.1", + "declaration_id": "qonto-assistant.audit.v1", + "source": "qonto-assistant", + "stream_id": "qonto-assistant.audit", + "sources": [ + { + "source_id": "qonto-assistant.audit.allow", + "source_system": "qonto-assistant", + "event_class": "audit.allow", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "attributive", + "completeness_claimed": false + } + }, + "reconciliation": { + "compare_local": "source_transition_counts.audit.allow", + "compare_observed": "evidence_counts.audit.allow", + "divergence": "finding", + "undrained_local": "lag-not-divergence" + } + }, + { + "source_id": "qonto-assistant.audit.deny", + "source_system": "qonto-assistant", + "event_class": "audit.deny", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "load-bearing", + "completeness_claimed": false, + "rate_monitoring": "forbidden" + } + }, + "reconciliation": { + "compare_local": "source_transition_counts.audit.deny", + "compare_observed": "evidence_counts.audit.deny", + "divergence": "finding", + "undrained_local": "lag-not-divergence" + } + }, + { + "source_id": "qonto-assistant.audit.heartbeat", + "source_system": "qonto-assistant", + "event_class": "audit.heartbeat", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "load-bearing", + "completeness_claimed": false + } + } + } + ], + "extensions": { + "netkingdom": { + "contract_digest": "b08b4d95fc4b0bd3", + "contract_document_version": "0.2.0", + "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 + } + }, + "qonto-assistant": { + "transport": "structured-stdout", + "instance_boundary": "process", + "ordering": { + "instance_field": "stream_instance_id", + "sequence_field": "stream_sequence", + "sequence_starts_at": 1, + "gap": "finding", + "reset": "permitted-only-when-stream_instance_id-changes" + }, + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "interval_config": "QONTO_AUDIT_HEARTBEAT_INTERVAL_SECONDS", + "default_interval_seconds": 3600, + "lifecycle": { + "startup": "required", + "periodic_while_process_active": "required", + "shutdown": "best-effort" + }, + "quiet_assertion": "nothing-to-report", + "active_instance_missing": "finding", + "scale_to_zero_semantics": "No periodic heartbeat is promised while no process instance exists. Observers track each stream_instance_id from its startup heartbeat until a shutdown heartbeat or expiry after a missing active-instance cadence.\n" + }, + "reconciliation": { + "source_counts_field": "source_transition_counts", + "window_counts_field": "window_transition_counts", + "counted_classes": [ + "audit.allow", + "audit.deny" + ], + "snapshot_endpoint": "/v1/audit/reconciliation", + "compare_observed": "Count received request events by event_class and stream_instance_id, then compare them with the heartbeat source counts and stream sequence.\n", + "divergence": "finding", + "undrained_local": "lag-not-divergence", + "persistence": "process-local" + }, + "event_context": { + "identity_binding_field": "identity_binding", + "egress_destination_field": "egress_destination", + "qonto_egress_destination": "qonto-thirdparty-api" + }, + "operational_acceptance": "pending-audit-core-sender-mapping-and-independent-observer" + } + } + } + }, + "source_file_checksums": [ + { + "path": "railiance-platform/credential-change-requests/CCR-2026-0047-rapp-qonto-audit-sender.yaml", + "digest_sha256": "8a574c1bd1d8292b184b5bf0366b8fc09421e8aa5a7ec880cab2772c56df5be0" + }, + { + "path": "railiance-platform/manifests/rapp-qonto-audit-sender.yaml", + "digest_sha256": "841d437a785fe453e23866a5caa5b6b707955a998143aae8923fcbe80f45901a" + }, + { + "path": "railiance-platform/openbao/policies/workload-kv-read-rapp-qonto-audit.hcl", + "digest_sha256": "2d17cd763c9c36a7fb7110121d30c2e53731d04482412d6f99f98cfe52af3c0c" + }, + { + "path": "railiance-platform/scripts/cadence_receiver_custody.py", + "digest_sha256": "3973ba4b332061d06a6280300df0847342846f5aa8b1545724ce1dfeb9c7539d" + }, + { + "path": "railiance-platform/scripts/factory_audit_custody.py", + "digest_sha256": "3a4dbbed69a956bf0656d89b31f9de070626440d7dba289d1adf6493293721ee" + }, + { + "path": "railiance-platform/scripts/factory_audit_delivery.py", + "digest_sha256": "a5b917435b01ac7982a9e9c7c480d53fbcd428c5a9b3e03856179a1ec3f070ef" + }, + { + "path": "railiance-platform/scripts/keycape_approval_custody.py", + "digest_sha256": "18bddb524fe4c9f4c1c4b30f46d93cfa2b19ce8e4c1f138069df040f99a26fb2" + }, + { + "path": "railiance-platform/scripts/state_hub_preflight_lane.py", + "digest_sha256": "8bf63beda028de7c2375084afb7c22fb00a731c54ebf0b3ba369a699d920e0f5" + }, + { + "path": "railiance-platform/scripts/credential-change.py", + "digest_sha256": "54ca1bc33ed4bb7807917f71ed45b6b35da978bc789e013386e1e90a20bee06d" + }, + { + "path": "approval-engine/cadence.yaml", + "digest_sha256": "cc58c8d53ebf50acf540d73b7607d579942bda7734c3e8722108e9c9204af655" + }, + { + "path": "qonto-assistant/specs/audit-emission-cadence.yaml", + "digest_sha256": "adedbe06e04c38812057db97364557644157eb5f72f16adebb6f7beec1587005" + }, + { + "path": "net-kingdom/generated/coordination-frame/approval-engine-receiver.json", + "digest_sha256": "c96cd1344193c1e146470d6b1d79f3033ff5f44a432293ef6a8db5dacc7d4c57" + }, + { + "path": "audit-core/audit_core/cadence_registration.py", + "digest_sha256": "faf1c72fe06c8bc3de1a5fdde3aeb826c16e8e390ba70c1ef3218c2e25a599c7" + }, + { + "path": "audit-core/audit_core/senders.py", + "digest_sha256": "bc091ce63dc2cd0fcdc9f26423b258cb94a6db863daced6706c11dba3bbf67e1" + }, + { + "path": "audit-core/audit_core/emission_cadence.py", + "digest_sha256": "8852152bf65d25631f73b3553ae9036424ea4a99f34b7530c8773232f551f1f8" + } + ], + "checksum_representation": "Lossless path/digest pairs; original packet hash retained unchanged. Offline plan contained no credential values." +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet.json new file mode 100644 index 0000000..0108010 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-custody-packet.json @@ -0,0 +1,236 @@ +{ + "schema_version": "platform.cadence-custody-packet/v1", + "sha256": "0142744f57a10988c7cccf6384b4d5ddd65203b261bc05af6e104fe7b4c53e1d", + "status": "proposed", + "credential_values_emitted": false, + "qonto_sender_metadata": { + "name": "rapp-qonto-collector", + "sources": [ + "qonto-assistant" + ], + "tenants": [ + "tenant:friendly:binky" + ], + "may_write": true, + "may_read": false, + "secret_policy": "redact", + "evidence_kind": "load-bearing", + "heartbeat_classes": { + "audit.deny": 7200 + }, + "emission_cadence": { + "schema_version": "0.1", + "declaration_id": "qonto-assistant.audit.v1", + "source": "qonto-assistant", + "stream_id": "qonto-assistant.audit", + "sources": [ + { + "source_id": "qonto-assistant.audit.allow", + "source_system": "qonto-assistant", + "event_class": "audit.allow", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "attributive", + "completeness_claimed": false + } + }, + "reconciliation": { + "compare_local": "source_transition_counts.audit.allow", + "compare_observed": "evidence_counts.audit.allow", + "divergence": "finding", + "undrained_local": "lag-not-divergence" + } + }, + { + "source_id": "qonto-assistant.audit.deny", + "source_system": "qonto-assistant", + "event_class": "audit.deny", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "load-bearing", + "completeness_claimed": false, + "rate_monitoring": "forbidden" + } + }, + "reconciliation": { + "compare_local": "source_transition_counts.audit.deny", + "compare_observed": "evidence_counts.audit.deny", + "divergence": "finding", + "undrained_local": "lag-not-divergence" + } + }, + { + "source_id": "qonto-assistant.audit.heartbeat", + "source_system": "qonto-assistant", + "event_class": "audit.heartbeat", + "form": "heartbeat-or-reconciliation", + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "assertion": "nothing-to-report", + "missing": "finding", + "extensions": { + "qonto-assistant": { + "assertion_scope": "no-deny-transitions-in-window", + "active_instance_only": true + } + } + }, + "extensions": { + "netkingdom": { + "evidence_class": "load-bearing", + "completeness_claimed": false + } + } + } + ], + "extensions": { + "netkingdom": { + "contract_digest": "b08b4d95fc4b0bd3", + "contract_document_version": "0.2.0", + "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 + } + }, + "qonto-assistant": { + "transport": "structured-stdout", + "instance_boundary": "process", + "ordering": { + "instance_field": "stream_instance_id", + "sequence_field": "stream_sequence", + "sequence_starts_at": 1, + "gap": "finding", + "reset": "permitted-only-when-stream_instance_id-changes" + }, + "heartbeat": { + "event_class": "audit.heartbeat", + "interval": "PT3600S", + "interval_config": "QONTO_AUDIT_HEARTBEAT_INTERVAL_SECONDS", + "default_interval_seconds": 3600, + "lifecycle": { + "startup": "required", + "periodic_while_process_active": "required", + "shutdown": "best-effort" + }, + "quiet_assertion": "nothing-to-report", + "active_instance_missing": "finding", + "scale_to_zero_semantics": "No periodic heartbeat is promised while no process instance exists. Observers track each stream_instance_id from its startup heartbeat until a shutdown heartbeat or expiry after a missing active-instance cadence.\n" + }, + "reconciliation": { + "source_counts_field": "source_transition_counts", + "window_counts_field": "window_transition_counts", + "counted_classes": [ + "audit.allow", + "audit.deny" + ], + "snapshot_endpoint": "/v1/audit/reconciliation", + "compare_observed": "Count received request events by event_class and stream_instance_id, then compare them with the heartbeat source counts and stream sequence.\n", + "divergence": "finding", + "undrained_local": "lag-not-divergence", + "persistence": "process-local" + }, + "event_context": { + "identity_binding_field": "identity_binding", + "egress_destination_field": "egress_destination", + "qonto_egress_destination": "qonto-thirdparty-api" + }, + "operational_acceptance": "pending-audit-core-sender-mapping-and-independent-observer" + } + } + } + }, + "source_file_checksums": [ + { + "path": "railiance-platform/credential-change-requests/CCR-2026-0047-rapp-qonto-audit-sender.yaml", + "digest_sha256": "dc2e04a64449bde7c2cdee028752157cd38d2d21577fd8ecf4f847814bb7e4f6" + }, + { + "path": "railiance-platform/manifests/rapp-qonto-audit-sender.yaml", + "digest_sha256": "c2aba320d124d86ea0042e57a9bf53c71a9db3e1edd54d10d6e1db73fd0c9f4b" + }, + { + "path": "railiance-platform/openbao/policies/workload-kv-read-rapp-qonto-audit.hcl", + "digest_sha256": "2d17cd763c9c36a7fb7110121d30c2e53731d04482412d6f99f98cfe52af3c0c" + }, + { + "path": "railiance-platform/scripts/cadence_receiver_custody.py", + "digest_sha256": "3973ba4b332061d06a6280300df0847342846f5aa8b1545724ce1dfeb9c7539d" + }, + { + "path": "railiance-platform/scripts/factory_audit_custody.py", + "digest_sha256": "3a4dbbed69a956bf0656d89b31f9de070626440d7dba289d1adf6493293721ee" + }, + { + "path": "railiance-platform/scripts/factory_audit_delivery.py", + "digest_sha256": "a5b917435b01ac7982a9e9c7c480d53fbcd428c5a9b3e03856179a1ec3f070ef" + }, + { + "path": "railiance-platform/scripts/keycape_approval_custody.py", + "digest_sha256": "18bddb524fe4c9f4c1c4b30f46d93cfa2b19ce8e4c1f138069df040f99a26fb2" + }, + { + "path": "railiance-platform/scripts/state_hub_preflight_lane.py", + "digest_sha256": "8bf63beda028de7c2375084afb7c22fb00a731c54ebf0b3ba369a699d920e0f5" + }, + { + "path": "railiance-platform/scripts/credential-change.py", + "digest_sha256": "54ca1bc33ed4bb7807917f71ed45b6b35da978bc789e013386e1e90a20bee06d" + }, + { + "path": "approval-engine/cadence.yaml", + "digest_sha256": "cc58c8d53ebf50acf540d73b7607d579942bda7734c3e8722108e9c9204af655" + }, + { + "path": "qonto-assistant/specs/audit-emission-cadence.yaml", + "digest_sha256": "adedbe06e04c38812057db97364557644157eb5f72f16adebb6f7beec1587005" + }, + { + "path": "net-kingdom/generated/coordination-frame/approval-engine-receiver.json", + "digest_sha256": "c96cd1344193c1e146470d6b1d79f3033ff5f44a432293ef6a8db5dacc7d4c57" + }, + { + "path": "audit-core/audit_core/cadence_registration.py", + "digest_sha256": "faf1c72fe06c8bc3de1a5fdde3aeb826c16e8e390ba70c1ef3218c2e25a599c7" + }, + { + "path": "audit-core/audit_core/senders.py", + "digest_sha256": "bc091ce63dc2cd0fcdc9f26423b258cb94a6db863daced6706c11dba3bbf67e1" + }, + { + "path": "audit-core/audit_core/emission_cadence.py", + "digest_sha256": "8852152bf65d25631f73b3553ae9036424ea4a99f34b7530c8773232f551f1f8" + } + ], + "checksum_representation": "Lossless path/digest pairs; original packet hash retained unchanged. Offline plan contained no credential values." +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-attempts.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-attempts.json new file mode 100644 index 0000000..72e03d8 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-attempts.json @@ -0,0 +1,11 @@ +{ + "initial_job": "audit-core-migrate-nk-wp-0035", + "initial_result": "failed; no pod retained after OnFailure/backoff0 controller cleanup", + "diagnostic_job": "audit-core-migrate-nk-wp-0035-r2", + "diagnostic_result": "failed DNS resolution; migration pods had no egress policy after old network policy was narrowed to receiver only", + "repair": "Added audit-core-migrate-egress selecting only name=audit-core AND component=migrate; DNS to kube-dns, TCP5432 to platform-pg pods only; no API or other egress", + "retry_job": "audit-core-migrate-nk-wp-0035-r3", + "retry_restart_policy": "Never", + "retry_service_account_automount": false, + "receiver_rollout_held_until_migration_success": true +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-completed.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-completed.json new file mode 100644 index 0000000..7345f77 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-migration-completed.json @@ -0,0 +1,31 @@ +{ + "job": "audit-core-migrate-nk-wp-0035-r3", + "uid": "ba24c60e-ceb6-4cc2-b8c4-840381deea53", + "status": { + "completionTime": "2026-10-15T19:31:33Z", + "conditions": [ + { + "lastProbeTime": "2026-10-15T19:31:33Z", + "lastTransitionTime": "2026-10-15T19:31:33Z", + "message": "Reached expected number of succeeded pods", + "reason": "CompletionsReached", + "status": "True", + "type": "SuccessCriteriaMet" + }, + { + "lastProbeTime": "2026-10-15T19:31:33Z", + "lastTransitionTime": "2026-10-15T19:31:33Z", + "message": "Reached expected number of succeeded pods", + "reason": "CompletionsReached", + "status": "True", + "type": "Complete" + } + ], + "ready": 0, + "startTime": "2026-10-15T19:31:24Z", + "succeeded": 1, + "terminating": 0, + "uncountedTerminatedPods": {} + }, + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:b479801b0bc76df66a36a85376c45aaf399c6d82feade9ba81430b774c4a8271" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-completed.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-completed.json new file mode 100644 index 0000000..34804e6 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-completed.json @@ -0,0 +1,9 @@ +{ + "name": "platform-pg-nk-wp-0035-pre-cadence", + "uid": "a9789e86-6d8a-414a-a805-404185863f64", + "phase": "completed", + "startedAt": "2026-10-15T19:27:07Z", + "stoppedAt": "2026-10-15T19:27:24Z", + "method": "barmanObjectStore", + "cluster": "platform-pg" +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-metadata.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-metadata.json new file mode 100644 index 0000000..ab4f0e3 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-metadata.json @@ -0,0 +1,49 @@ +{ + "observed_at": "2026-10-15T19:19:55.033457+00:00", + "cluster": { + "uid": "74c22737-fbdd-4fb0-b3ab-419484585fbf", + "phase": "Cluster in healthy state", + "conditions": [ + { + "lastTransitionTime": "2026-09-24T13:50:15Z", + "message": "Cluster is Ready", + "reason": "ClusterIsReady", + "status": "True", + "type": "Ready" + }, + { + "lastTransitionTime": "2026-08-19T00:55:48Z", + "message": "Continuous archiving is working", + "reason": "ContinuousArchivingSuccess", + "status": "True", + "type": "ContinuousArchiving" + }, + { + "lastTransitionTime": "2026-10-15T02:15:29Z", + "message": "Backup was successful", + "reason": "LastBackupSucceeded", + "status": "True", + "type": "LastBackupSucceeded" + } + ], + "lastSuccessfulBackup": "2026-10-15T02:15:22Z", + "firstRecoverabilityPoint": "2026-09-15T02:15:14Z" + }, + "recent_backups": [ + { + "name": "platform-pg-daily-20261013021500", + "phase": "completed", + "stoppedAt": "2026-10-13T02:15:21Z" + }, + { + "name": "platform-pg-daily-20261014021500", + "phase": "completed", + "stoppedAt": "2026-10-14T02:15:21Z" + }, + { + "name": "platform-pg-daily-20261015021500", + "phase": "completed", + "stoppedAt": "2026-10-15T02:15:22Z" + } + ] +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-request.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-request.json new file mode 100644 index 0000000..f24230c --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-pre-release-backup-request.json @@ -0,0 +1,14 @@ +{ + "apiVersion": "postgresql.cnpg.io/v1", + "kind": "Backup", + "metadata": { + "name": "platform-pg-nk-wp-0035-pre-cadence", + "namespace": "databases" + }, + "spec": { + "method": "barmanObjectStore", + "cluster": { + "name": "platform-pg" + } + } +} diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-release-container-check.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-release-container-check.json new file mode 100644 index 0000000..8a03ecb --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-release-container-check.json @@ -0,0 +1,37 @@ +{ + "image": "audit-core:nk-wp-0035-5227fb1", + "native_credentials_used": false, + "checks": { + "operational_ready": true, + "nonroot_readonly": true, + "approval-engine": { + "accepted": 202, + "duplicate": 200, + "wrong_source": 400, + "wrong_tenant": 400, + "read_routes_denied": 7, + "independent_read": 200, + "redacted": true, + "stored_once": true + }, + "informed-decision": { + "accepted": 202, + "duplicate": 200, + "wrong_source": 400, + "wrong_tenant": 400, + "read_routes_denied": 7, + "independent_read": 200, + "redacted": true, + "stored_once": true + }, + "sigterm": { + "exit_code": 0, + "inflight_committed_once": true, + "restart_retry_duplicate": true, + "chain_intact": true + } + }, + "started_at": "2026-10-15T19:20:56.324227+00:00", + "status": "passed", + "own_fixture_cleanup": true +} diff --git a/workplans/NK-WP-0035-emission-cadence-security-profile.md b/workplans/NK-WP-0035-emission-cadence-security-profile.md index e957319..63f2f55 100644 --- a/workplans/NK-WP-0035-emission-cadence-security-profile.md +++ b/workplans/NK-WP-0035-emission-cadence-security-profile.md @@ -4,7 +4,7 @@ type: workplan title: "Publish the NetKingdom emission-cadence security profile" domain: infotech repo: net-kingdom -status: blocked +status: active flavor: implementation owner: codex topic_slug: netkingdom @@ -88,9 +88,7 @@ Python compilation and `git diff --check` pass. ```task id: NK-WP-0035-T04 -status: wait -blocked_on: message-from:approval-engine -blocking_reason: "Founder chose configurable frame f=1h: source heartbeat f, receiver wait 2f, effective deadline 3f. Hourly runtime bindings are deployed and verified after explicit founder approval. Receiver registry admission and actual lifecycle reconciliation remain pending. Qonto still needs an actual rapp-qonto collector and AUDIT-WP-0013-T05 sender admission before KG-WP-0005-T03 observation. Existing bearer-revocation proof is delivered; local-identity incompatibility remains explicit." +status: progress priority: high state_hub_task_id: "e3fbc8b8-00d5-57ce-ba0c-19b58044c950" ``` @@ -354,3 +352,64 @@ existing scale-to-zero setting. Receiver registration of 2f=7200s / effective lifecycle reconciliation and independent silence/lag findings remain T04; local-identity's explicit incompatibility remains. Profile stays proposed and the workplan stays 5/6 done. + + +## Receiver registration and operational setup — 2026-10-15 + +Founder explicitly approved the complete reviewed live packet as platform +operator and owner of Audit Core, rapp-qonto and qonto-assistant. Workers +implemented the missing durable collector, guarded credential-preserving +registry update, exact-path CCR0047 projection and independent capture/readback +seams. Source verification: Audit Core **333 passed including PostgreSQL**, +King's Guard **144 passed**, collector/capture package **51 passed**, platform +custody/readback **20 focused tests passed**. All three released images scanned +zero HIGH/CRITICAL findings. Source tests do not substitute for native receipts. + +Approval Engine is now on scanned source a786b06/image16e5d222…, schema6, +with a fresh verified online backup, independent mode0600 copy, isolated +migration proof and unchanged 54 approval/47 entry counts. Audit Core is on +source5227fb1/imageb479801b…, additive migration0007, after a new completed +Barman backup. Initial migration attempts exposed absent migration DNS/database +egress after the receiver policy had been narrowed; a dedicated migration-only +DNS/platform-pg5432 policy repaired it. Successful r3 migration preceded the +receiver replacement; native readiness/cadence/instance support passed. + +The first attended command refused an inherited OPENBAO_TOKEN variable before +writing a receipt; its session was revoked. A fresh contained login with all +three ambient token aliases removed completed successfully. Protected registry +CAS advanced **15→16**, preserving incumbent credentials and sibling entries. +Approval Engine now carries its exact declaration and all four class waits7200s +(effective10800s). CCR0047 independently generated the Qonto collector's exact +source/tenant writer bearer, delivered via its namespace-restricted ESO lane. +Reader path/identity/agent-deny negatives and revocation passed; complete ESO +projection and running receiver registry agreed after reload. Warden exit0 +confirms session revocation and helper cleanup. +[Registry/custody receipt](../docs/evidence/2026-10-15-cadence-adoption/receiver-custody-live.json). + +The scanned collector image82bfd410… is deployed with its own service account, +namespace-only pod/log reads, exact Kubernetes API egress, audit-core-only +receiver egress and 1Gi durable outbox. It has no bank Secret mount. A real +startup heartbeat and denied request were accepted202; duplicate200, +wrong-source400, wrong-tenant400, read403 and invalid-bearer401 passed. Source +own reconciliation reports heartbeat1/deny1, pending0. Controlled collector +replacement preserved original first202 receipts through the same PVC. +[Admission](../docs/evidence/2026-10-15-cadence-adoption/qonto-collector-native-admission.json) +and [restart persistence](../docs/evidence/2026-10-15-cadence-adoption/qonto-collector-restart-persistence.json). + +The bounded hourly observation Job started **19:36:07UTC /21:36:07Berlin**; +expected finish is approximately **20:37UTC /22:37Berlin**. Health-only polling +keeps this one source instance alive while retaining normal scale-to-zero +configuration. Its only finance-route request is intentionally denied before +any bank call. Read-only capture monitoring automatically retains exact-instance +source JSONL/snapshots, durable collector receipts and observed pod inventory. +After elapsed capture, the separately implemented owner readback requires a +fresh attended login; King's Guard then verifies accepted counts, sequence, +coverage and lag. Approval Engine's four native class beats and actual source +outbox coordinates are retained/checked in this acceptance phase. Do not invent +an elapsed-hour or three-hour silence result from test timestamps. + +T04 stays **progress**, plan active5/6, profile proposed. Receiver registration +and collector implementation are no longer missing. Remaining work is actual +elapsed-time capture, independent source/receiver correlation and observer +acceptance. Local-identity remains explicitly incompatible, with no completeness +claim. Detailed state: [owner acceptance plan](../docs/evidence/2026-10-15-cadence-adoption/owner-acceptance-plan.json).