audit-core/docs/cadence-registration.md
tegwick 2e97f37c01
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Accept native Qonto sender admission and hourly receiver registration
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2
2026-10-15 21:41:46 +02:00

5.3 KiB

Cadence registry admission — NK-WP-0035

Prepared source, not live acceptance

The 2026-10-15 source frame is f=3600 seconds. Approval Engine declares issuance, use, supersession and revocation heartbeats every f. Register each class wait at 2f=7200; audit-core's existing 1.5 grace makes the effective missing-heartbeat deadline 3f=10800. Class keys are the asserted class names, not the action names approval.issuance etc. Retain write true/read false, source approval-engine and tenant tenant:platform.

audit_core.cadence_registration.prepare takes the protected KV data object, raw source declaration bytes and the reviewed nonsecret proposal. It validates the exact declaration SHA256, source/class/interval/provenance agreement and incumbent scope. It returns the proposed in-memory KV object and metadata-only receipt. Only heartbeat_classes and emission_cadence may change. Every token, rotation overlap, expiry, policy, sibling sender and other KV property remains unchanged. Existing unexpected heartbeat classes refuse a destructive drop. The entire candidate is parsed by the real receiver sender registry parser.

No registry values belong in operator terminals, agent outputs, local files, Git or State Hub. Root's sanctioned contained platform owner process may call this pure API. scripts/register-approval-engine-cadence.py is a silent attended wrapper requiring the warden isolated HOME and non-root platform-admin identity. It defaults to preflight and uses KV-v2 CAS plus exact readback with --apply. It does not mint credentials, synchronize ESO or restart workloads. Consult the current custody route before invoking any credential operation; this helper does not create custody authority.

Receiver artifact and database prerequisite

Read-only native metadata on 2026-10-15 found receiver Deployment UID b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb, ready replicas 1 and image forgejo.coulomb.social/coulomb/audit-core@sha256:ec15f63d49226bfe507af2bc38ffbd5e83f549ba2c6d1ae7a338e7e053f34615. That artifact has heartbeat_classes and stream findings, but does not contain audit_core.emission_cadence or stream_instance_id filtering in either ingest or PostgreSQL. Its database ledger reports migrations 0001-events through 0006-chain. Source adds additive 0007-import-receipts. Applying registry cadence alone to that old image is not receiver cadence admission.

Release gates: verify backup and rollback position; build/test current committed source and pin its immutable image; run the migration Job with the existing migration lease (runtime cannot migrate); verify ledger 0007; update the receiver image without widening selectors/credentials; wait readyz and native feature proof. Then the protected metadata CAS, exact ESO readback and receiver reload must agree on the admitted declaration and class waits. Own-source counts, wrong-scope refusals and actual heartbeat findings need native receipts. No absence-of-finding claim proves completeness or adversarial omission.

Qonto receiver mapping

rapp-qonto owns the collector, qonto-assistant owns declaration/classification, and King's Guard owns independent observation. Proposed sender rapp-qonto-collector permits source qonto-assistant, tenant tenant:friendly:binky, subject qonto-assistant.audit, write true/read false, explicit redact policy. Qonto source ownership must confirm that exact tenant binding. The mixed sender is load-bearing; allow remains attributive in the per-class source inventory. Stable original instance/sequence drives one retry-safe event ID. Allow and deny retain their class; audit.heartbeat maps one-to-one to audit-core.heartbeat, retains event_class audit.heartbeat, and asserts data.class=audit.deny. It does not assert quiet allow activity.

deploy/qonto-collector-ingress.yaml is prepared separately from the general network policies. It admits only namespace rapp-qonto AND pod label app.kubernetes.io/name=rapp-qonto-audit-collector to receiver port8080. The endpoint is http://audit-core.audit-core.svc.cluster.local:8080. Sender admission and collector egress remain independently required. No bank credential or bank API operation is required. Retain sequence, instance, source counters/window boundaries and receiver acceptance-time boundaries; compare only after the explicitly bounded drain lag. Per-instance filtering isolates instances but does not detect gaps on its own.

AUDIT-WP-0013-T05 and NK-WP-0035 remain open until actual accepted records, duplicate/refusal/reconciliation receipts and independent observer evidence are available. Local tests and this prepared ingress are not those receipts.

Native registration follow-up — 2026-10-15

The initial prepared/source and old-artifact observations above are historical. Current b479801b (source5227fb1) passed its native capability gate; migration0007 completed. The guarded protected registry metadata update15→16, ESO projection and receiver reload succeeded. Existing Approval credentials/scope and sibling senders were preserved. Approval cadence and four waits7200 are now loaded; Qonto collector native heartbeat/deny admission and own counts/refusals passed. Local metadata evidence is in docs/evidence/2026-10-15-cadence-admission/. These receipts do not claim independent operational acceptance, four fresh Approval heartbeat observations or an actual hourly periodic Qonto observation.