qonto-assistant/specs/audit-emission-cadence.yaml
tegwick 5eb7e86f7a Use the shared coordination frame for audit heartbeat defaults
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2
2026-10-15 20:42:29 +02:00

118 lines
3.9 KiB
YAML

# Source-owned cadence; coordination timings generated from coordination-engine/config/coordination-frame.json
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: &id001
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: *id001
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: *id001
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.
'
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.
'
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