Skip to content

EventBridge domain event catalogue

Every domain event emitted by bank services onto Amazon EventBridge. Governed by ADR-029 (superseded by ADR-051 — see ADR-051 for current EventBridge bus naming convention) (domain event routing) and enforced by MOD-043 (EventBridge domain event governance).

Architecture constraints:

  • One bus per system domain. Bus names follow bank-<domain> (e.g. bank-core, bank-kyc).
  • Event name pattern: bank.<domain>.<noun>_<past-tense-verb>
  • All events carry a schema_version field. Consumers must validate this before processing.
  • Money amounts are always fixed-point decimal strings — never floats.
  • event_id and idempotency_key are always required. Consumers must deduplicate on idempotency_key.
  • All timestamps are ISO 8601 UTC.
  • Events document only fields that cross module boundaries. Internal state fields stay in the emitting service.

Related: ADR-029 (superseded by ADR-051 — see ADR-051 for current EventBridge bus naming convention) · Interface contracts · Data contracts


SD01 — Core Banking (bank-core bus)

bank.core.posting_completed

Emitted by MOD-001 on every successful double-entry posting committed to the ledger.

Field Type Required Notes
event_id uuid Unique event ID
event_time ISO8601 UTC
schema_version string e.g. "1.1.0"
posting_id uuid Stable posting reference
account_id uuid
amount string Fixed-point decimal e.g. "123.45" — never float
currency string ISO 4217
direction string DEBIT or CREDIT
posting_type string PAYMENT / ACCRUAL / FX_CONVERSION / ADJUSTMENT / REVERSAL / PROVISION
ledger_balance_after string Fixed-point decimal
available_balance_after string Fixed-point decimal
idempotency_key string Caller-supplied; deduplication key
counterparty_account_id uuid Present for internal transfers
jurisdiction string NZ or AU — matches the credit-leg account's registered jurisdiction per FR-424
payment_id uuid Present when the posting originates from SD04 payments; set by rail-integration callers (MOD-119/120/122/124/135/136/141 etc.) — absent for non-payment postings (ACCRUAL, ADJUSTMENT, PROVISION)

Consumers: MOD-022 (payment audit trail), MOD-002 (immutable transaction log), MOD-042 (CDC → Snowflake Iceberg), MOD-043 (EventBridge governance), MOD-087 (transaction enrichment — PAYMENT type only)


bank.core.balance_updated

Emitted by MOD-003 whenever a customer or nostro account balance changes, after the posting is committed. Enables downstream cache invalidation without polling, and provides the full before/after balance context needed by overdraft alert and collections consumers.

Schema version 1.1.0 — additive extension of v1.0.0. Existing consumers remain valid; new fields (previous_*, trace_id, correlation_id, jurisdiction, effective_at) are optional reads for v1.0.0 consumers.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.1.0"
trace_id uuid Added v1.1.0 — end-to-end trace from originating request
correlation_id uuid Added v1.1.0 — links to originating payment or batch run
account_id uuid
currency string ISO 4217
jurisdiction string Added v1.1.0 — NZ or AU
previous_ledger_balance string Added v1.1.0 — fixed-point decimal before this posting
ledger_balance string Fixed-point decimal after this posting
previous_available_balance string Added v1.1.0 — fixed-point decimal before this posting
available_balance string Fixed-point decimal after this posting
posting_id uuid Causal posting reference; doubles as the idempotency sequence
effective_at ISO8601 Added v1.1.0 — timestamp of the causal posting (postings.created_at)
idempotency_key string mod003:balance:{posting_id}

Emission cadence: one event per bank.core.posting_completed that affects a deposit account. MOD-003 consumes posting_completed and re-emits balance_updated with the before/after snapshot. No producer-side filtering — all deposit account balance changes are emitted unconditionally; consumers apply EventBridge detail-pattern filters.

Consumers: MOD-070 (transaction history & search), MOD-077 (account dashboard), MOD-032 (LCR/NSFR calculator), MOD-042 (CDC → Snowflake), MOD-117 (overdraft — CON-008 unarranged facility alert uses previous_available_balance + available_balance to detect the moment a balance crosses into overdraft territory)


bank.core.account_status_changed

Emitted by MOD-007 when an account transitions between states (PENDING → ACTIVE → RESTRICTED → DORMANT → CLOSED).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
account_id uuid
party_id uuid Canonical cross-domain party reference
previous_status string PENDING / ACTIVE / RESTRICTED / DORMANT / CLOSED
new_status string
restriction_reason string Populated when new_status = RESTRICTED: SANCTIONS / FRAUD_INVESTIGATION / HARDSHIP_ARRANGEMENT / ADMIN
reason_code string Stable machine key e.g. SANCTIONS_HOLD, KYC_VERIFIED, DORMANCY_NZ, MANUAL_CLOSE
triggered_by string SYSTEM / AGENT / CUSTOMER
triggering_event_id uuid Upstream event ID when transition was EB-driven (e.g. identity_verified event ID for KYC gate)
idempotency_key string

Consumers: MOD-020 (pre-payment validation — gates payments on Restricted/Closed), MOD-013 (sanctions screener), MOD-039 (customer risk score), MOD-043 (governance), MOD-074 (back-office customer 360)


bank.core.interest_accrued

Emitted by MOD-005 after each daily accrual run completes for an account.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
account_id uuid
accrual_date string YYYY-MM-DD
accrual_amount string Fixed-point decimal
currency string ISO 4217
rate_applied string Percentage as decimal string e.g. "5.25"
posting_id uuid Ledger posting reference
idempotency_key string accrual-<account_id>-<accrual_date>

Consumers: MOD-002 (immutable log), MOD-042 (CDC → Snowflake), MOD-035 (IRRBB/NII model)


bank.core.accrual_run_completed

Emitted by MOD-005 once per accrual run after completeRun writes totals. Carries the full run summary so downstream analytics and monitoring modules do not need to query core.accrual_runs directly.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
run_id uuid FK to core.accrual_runs
jurisdiction string NZ / AU
accrual_date string YYYY-MM-DD
run_type string DAILY / CORRECTION
status string COMPLETED / FAILED
accounts_processed int
accounts_posted int
accounts_skipped int
accounts_errored int
interest_credited string Fixed-point decimal — total savings interest credited
interest_charged string Fixed-point decimal — total overdraft interest charged
by_product object Per product_code breakdown {count, amount}
variance_flags array Accounts with amount deviation (empty array when none)
idempotency_key string Matches core.accrual_runs.idempotency_key

Consumers: MOD-002 (transaction log), MOD-042 (CDC → Snowflake), MOD-031 (rate sensitivity / NII model), MOD-076 (operational dashboards)


bank.core.accrual_correction_posted

Emitted by MOD-005 after a retroactive correction run completes (FR-064). Carries references to both the original accrual posting and the correction so audit and compliance modules can reconstruct the full correction chain without joining tables.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
run_id uuid FK to the CORRECTION core.accrual_runs row
correction_of_run_id uuid FK to the original DAILY run
account_id uuid
accrual_date string YYYY-MM-DD — date of the original accrual being corrected
original_accrual_posting_id uuid The core.accrual_postings row being corrected
corrected_accrual_posting_id uuid The new CORRECTED core.accrual_postings row
original_amount string Fixed-point signed decimal — amount from the original run
corrected_amount string Fixed-point signed decimal — amount after correction
correction_reason string Free text — supplied by authorising staff
authorised_by string Role or identity that authorised the correction
idempotency_key string Matches correction run's idempotency_key

Consumers: MOD-002 (transaction log), MOD-042 (CDC → Snowflake), MOD-047 (audit trail), compliance reporting


bank.core.rate_change_proposed

Emitted by MOD-006 when a rate change proposal is submitted for maker/checker review.

Bus: bank-core · Source: bank.core · Detail-type: rate_change_proposed

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string "1"
tenant_id string
proposal_id string UUID — FK to core.rate_change_proposals
product_code string
rate_type string BASE / BONUS / PENALTY / OVERDRAFT / FIXED_LENDING / VARIABLE_LENDING
new_annual_rate string Decimal string
previous_annual_rate string Null on first-ever rate for this product+type
change_kind string INCREASE / DECREASE
effective_from string YYYY-MM-DD
is_retroactive boolean
customer_notice_required boolean True for retail variable-rate increases (FR-516)
proposed_by string Cross-domain staff UUID
trace_id string
correlation_id string

Consumers: (audit dashboards)


bank.core.rate_change_approved

Emitted by MOD-006 when a second authorised user approves a rate change proposal.

Bus: bank-core · Source: bank.core · Detail-type: rate_change_approved

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string "1"
tenant_id string
proposal_id string UUID
product_code string
rate_type string
new_annual_rate string Decimal string
change_kind string INCREASE / DECREASE
effective_from string YYYY-MM-DD
reviewed_by string Cross-domain staff UUID (must differ from proposed_by)
customer_notice_required boolean
trace_id string
correlation_id string

Consumers: (audit dashboards)


bank.core.rate_change_rejected

Emitted by MOD-006 when a reviewer rejects a rate change proposal.

Bus: bank-core · Source: bank.core · Detail-type: rate_change_rejected

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string "1"
tenant_id string
proposal_id string UUID
product_code string
rate_type string
reviewed_by string Cross-domain staff UUID
review_comment string
trace_id string
correlation_id string

Consumers: (audit dashboards)


bank.core.rate_change_notified

Emitted by MOD-006 at approval time when a rate increase on a retail variable-rate product requires the 14-day advance-notice period (FR-516). The notice period starts ticking from event_time.

Bus: bank-core · Source: bank.core · Detail-type: rate_change_notified

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string "1"
tenant_id string
proposal_id string UUID
product_code string
rate_type string
product_type string e.g. SAVINGS / VARIABLE_HOME_LOAN
jurisdiction string NZ / AU / NZ + AU
new_annual_rate string Decimal string
previous_annual_rate string
effective_from string YYYY-MM-DD
notice_period_days number Minimum 14 for NZ + AU retail (FR-516)
trace_id string
correlation_id string

Consumers: MOD-063 (notification orchestration — dispatches 14-day advance-notice to affected customers)


bank.core.rate_change_activated

Emitted by MOD-006 within 30 seconds of a rate becoming active (FR-068). Carries complete payload for downstream consumers.

Bus: bank-core · Source: bank.core · Detail-type: rate_change_activated

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string "1"
tenant_id string
proposal_id string UUID
rate_id string UUID — new accounts.interest_rates row created on activation
product_code string
rate_type string
new_annual_rate string Decimal string
previous_annual_rate string
change_kind string INCREASE / DECREASE
effective_from string YYYY-MM-DD
is_retroactive boolean When true, MOD-005 triggers FR-064 retroactive correction
notification_required boolean True when CON-004/CON-005 disclosure must be dispatched
authorised_by string Cross-domain staff UUID of approving reviewer
trace_id string
correlation_id string

Consumers: MOD-005 (FR-062 rate read — must see new rate before next accrual run; triggers FR-064 correction if is_retroactive=true), MOD-031 (CLQ-004 IRRBB repricing gap derivation), MOD-042 (CDC)


bank.core.dormancy_triggered

Emitted by MOD-008 at each stage of the dormancy lifecycle: initial dormancy classification, pre-escheatment notice crossings (90/30/7 days), and escheatment completion. One event per stage transition per account.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
account_id uuid
party_id uuid Canonical cross-domain party reference
dormancy_stage string DORMANT / ESCHEATMENT_PENDING / ESCHEATMENT_SUBMITTED
inactive_since string YYYY-MM-DD — date of last customer-initiated transaction
statutory_escheatment_date string YYYY-MM-DD — present for ESCHEATMENT_PENDING and ESCHEATMENT_SUBMITTED
days_until_escheatment integer Present when dormancy_stage = ESCHEATMENT_PENDING; 90, 30, or 7
balance string Fixed-point decimal at time of event
currency string ISO 4217
jurisdiction string NZ / AU
regulator string IRD (NZ) or ASIC (AU) — present for ESCHEATMENT_PENDING and ESCHEATMENT_SUBMITTED
idempotency_key string

Consumers: MOD-007 (account state machine — transitions to Dormant), MOD-063 (notification orchestration — routes 90/30/7-day notice to customer), MOD-057 (statistical returns — unclaimed money reporting)


bank.core.fx_rate_received

Published by the Snowflake marketplace rate-feed provider (upstream of MOD-004) when a fresh mid-market FX rate is available. MOD-004's Mod004FxRateIngest Lambda consumes this to insert a row into accounts.fx_rates and trigger revaluation if configured. In non-prod, MOD-004's Mod004DevRateSeeder Lambda fires this event on a rate(30 minutes) cron.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
source_currency string ISO 4217
target_currency string ISO 4217
mid_rate string Decimal string — target per 1 source unit
spread_pct string Decimal string
provider_id string Rate provider identifier
rate_timestamp ISO8601 Point-in-time the rate was valid
idempotency_key string

Consumers: MOD-004 (multi-currency ledger — inserts into accounts.fx_rates, triggers EOD revaluation)


bank.core.fx_conversion_completed

Emitted by MOD-004 after a committed 4-leg multi-currency conversion (FR-434). MOD-002's EventBridge ingest rule subscribes to this event alongside posting_completed and interest_accrued.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
conversion_id uuid FK to accounts.fx_conversions.id
party_id uuid
source_account_id uuid
target_account_id uuid
source_amount string Fixed-point decimal
target_amount string Fixed-point decimal
source_currency string ISO 4217
target_currency string ISO 4217
applied_rate string Decimal string
cross_border boolean AML-008 AUTO — set when currency or jurisdiction crosses
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log — ingests via widened event-rules pattern)


bank.core.fx_revaluation_completed

Emitted by MOD-004 after each EOD revaluation run that produced a non-zero P&L delta (FR-435). Used by downstream analytics and audit consumers.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
jurisdiction string NZ / AU
rate_timestamp ISO8601 Rate used for this revaluation run
pnl_delta string Fixed-point decimal — gain/loss for this run
cumulative_pnl string Running total after this run
revaluation_posting_id uuid The P&L posting row in accounts.postings
idempotency_key string

Consumers: MOD-002 (immutable transaction log), internal finance reporting


bank.core.fee_assessed

Emitted by MOD-110 whenever a fee is evaluated for an account — both when it will be posted and when it is waived. Enables downstream audit reconstruction without replaying fee engine logic.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
fee_event_id uuid FK to core.fee_events.event_id
account_id uuid
party_id uuid
fee_type string e.g. MONTHLY_FEE / TRANSACTION_FEE / DISHONOUR_FEE
assessed_amount string Fixed-point decimal
currency string ISO 4217
waived boolean True when no posting will follow
waiver_reason string Present when waived=true — name of the applied waiver condition
waiver_check object {"evaluated": ["zero_balance","promo"], "applied": "zero_balance" \| null}
schedule_version integer Fee schedule version active at assessment time
jurisdiction string NZ / AU
idempotency_key string Caller-supplied; matches the fee posting idempotency key

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC → Snowflake), MOD-043 (EventBridge governance)


bank.core.fee_posted

Emitted by MOD-110 after a fee has been successfully committed to the ledger via MOD-001. Enables real-time fee revenue reporting and downstream audit reconciliation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
fee_event_id uuid FK to core.fee_events.event_id — correlates to fee_assessed
account_id uuid
party_id uuid
fee_type string
amount string Fixed-point decimal — posted amount
currency string ISO 4217
posting_id uuid FK to accounts.postings.id — debit leg
income_account string GL income account credited — MOD-110-FEE-INCOME-NZ or MOD-110-FEE-INCOME-AU
schedule_version integer
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC → Snowflake), MOD-043 (EventBridge governance)


bank.core.fee_reversed

Emitted by MOD-110 after a fee reversal is committed to the ledger. The reversing posting is a compensating credit to the customer account and a debit to the fee income account. In v1 no approval tier is validated — reversals are record-only, authorised by staff via MOD-083; tier gating is deferred to MOD-109.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
reversal_event_id uuid New core.fee_events row for this reversal
original_fee_event_id uuid The fee_assessed / fee_posted event being reversed
original_posting_id uuid Original debit leg posting
reversal_posting_id uuid New credit leg posting
account_id uuid
party_id uuid
fee_type string
amount string Fixed-point decimal — reversed amount (positive)
currency string ISO 4217
reversal_reason string Free text — required by CON-004
authorised_by string staff_id of the agent who initiated the reversal
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC → Snowflake), MOD-043 (EventBridge governance)


bank.core.fee_waived

Emitted by MOD-110 when a previously posted fee is waived as a deliberate policy decision — hardship accommodation, goodwill gesture, or regulatory remedy. Distinct from fee_reversed (which corrects an erroneously posted fee) and from the waived flag on fee_assessed (which signals an automated pre-posting waiver condition). CON-004 and CON-008 audit surface.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
waiver_event_id uuid New core.fee_events row for this waiver
original_fee_event_id uuid The fee_posted event being waived
original_posting_id uuid Original debit leg posting
credit_posting_id uuid Compensating credit leg posting
account_id uuid
party_id uuid
fee_type string
amount string Fixed-point decimal — waived amount (positive)
currency string ISO 4217
waiver_reason string Structured reason code: HARDSHIP_ARRANGEMENT / GOODWILL / REGULATORY_REMEDY / RELATIONSHIP_RETENTION
waiver_notes string Optional free-text supporting note
authorised_by string staff_id of the approving officer (checker leg)
proposed_by string staff_id of the proposing officer (maker leg)
checker_proposal_id uuid MOD-168 proposal reference; present once MOD-168 is deployed
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC → Snowflake), MOD-043 (EventBridge governance), MOD-063 (notification orchestration — customer confirmation of waiver)


Future event: bank.core.fee_schedule_published — will be emitted by MOD-006 when the product catalogue admin API ships. MOD-110 will subscribe to apply updated fee schedules. Not yet catalogued as MOD-006 has no event contract; v1 loads schedules via direct SQL seed only.


bank.core.trust_account_activated

Emitted by MOD-133 after the activate Lambda successfully calls applyTransitionInClient with reason_code = "TRUST_GATE_PASS" and the account transitions PENDING → ACTIVE.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
trust_account_id uuid core.trust_accounts.trust_account_id
account_id uuid accounts.accounts.id
trust_type string family_discretionary / testamentary / charitable / commercial_unit
jurisdiction string NZ / AU
activated_at ISO8601
trace_id string
correlation_id string

Consumers: MOD-042 (CDC → Snowflake), MOD-043 (EventBridge governance), MOD-047 (staff.action_taken audit trail)


bank.core.trustee_changed

Emitted by MOD-133 when a trustee is added or removed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
trust_account_id uuid
account_id uuid
party_id uuid Trustee's party_id
change string ADDED / REMOVED
trace_id string
correlation_id string

Consumers: MOD-034 (risk elevation trigger — CDD review), MOD-042 (Snowflake CDC), MOD-047 (audit)


bank.core.beneficial_owner_changed

Emitted by MOD-133 when a beneficial owner is added, changed, or removed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
trust_account_id uuid
account_id uuid
party_id uuid Beneficial owner's party_id
change string ADDED / CHANGED / REMOVED
ownership_pct number Trust ownership percentage; nullable for discretionary BOs
trace_id string
correlation_id string

Consumers: MOD-034 (risk elevation trigger — CDD review), MOD-042 (Snowflake CDC), MOD-047 (audit)


bank.core.cdd_review_required

Emitted by MOD-133 when a CDD review is triggered for a trust account (30-day SLA, FR-595).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
trust_account_id uuid
account_id uuid
review_trigger string TRUSTEE_CHANGE / BENEFICIARY_CHANGE / RISK_ELEVATION / PERIODIC
due_at ISO8601 triggered_at + 30 days
governance_event_id uuid core.trust_governance_events.event_id of the CDD_REVIEW_TRIGGERED row
trace_id string
correlation_id string

Consumers: MOD-047 (staff.action_taken audit), MOD-043 (EventBridge governance)


bank.core.cdd_review_completed

Emitted by MOD-133 when a CDD review is marked complete.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
trust_account_id uuid
account_id uuid
triggered_event_id uuid Links back to the CDD_REVIEW_TRIGGERED governance event
next_review_date string ISO date; nullable
trace_id string
correlation_id string

Consumers: MOD-047 (staff.action_taken audit), MOD-043 (EventBridge governance)


bank.core.community_account_activated

Emitted by MOD-134 after the activate Lambda successfully calls applyTransitionInClient with reason_code = "COMMUNITY_GATE_PASS" and the account transitions PENDING → ACTIVE.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
community_account_id uuid core.community_accounts.community_account_id
account_id uuid
entity_type string e.g. sports_club, incorporated_society
signing_rule string any_one / any_two / all
jurisdiction string NZ / AU
activated_at ISO8601
trace_id string
correlation_id string

Consumers: MOD-002 (transaction log), MOD-042 (CDC → Snowflake), MOD-047 (audit)


bank.core.community_signatory_changed

Emitted by MOD-134 when a signatory is added, removed, or updated during annual committee refresh.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
community_account_id uuid
account_id uuid
party_id uuid Affected signatory's party_id
change string ADDED / REMOVED / REFRESHED
committee_role string president / treasurer / secretary / authorised_signatory
trace_id string
correlation_id string

Consumers: MOD-042 (Snowflake CDC), MOD-047 (audit)


bank.core.community_signing_rule_changed

Emitted by MOD-134 when the signing rule is updated for a community account.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
community_account_id uuid
account_id uuid
previous_signing_rule string
new_signing_rule string any_one / any_two / all
trace_id string
correlation_id string

Consumers: MOD-042 (Snowflake CDC), MOD-047 (audit)


bank.core.community_authorisation_completed

Emitted by MOD-134 when a community account authorisation accumulates the required number of signatory approvals (FR-598). The authorisation_id is the reference callers present when initiating a payment debit against a community account.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
community_account_id uuid
account_id uuid
authorisation_id uuid core.community_authorisations.authorisation_id
signing_rule string Rule that was satisfied
approver_count integer Number of distinct approvers
completed_at ISO8601
trace_id string
correlation_id string

Consumers: Future SD04 payment caller (must verify a COMPLETE authorisation before debiting a community account — named debt per ADR per orchestrator Q2)


bank.core.community_account_restricted_insufficient_signatories

Emitted by MOD-134 when active verified signatory count drops below the signing-rule minimum and the account is transitioned to RESTRICTED (FR-600).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
community_account_id uuid
account_id uuid
signing_rule string The rule that can no longer be met
active_verified_count integer Count of currently VERIFIED signatories
required_count integer Minimum required by the signing rule
trace_id string
correlation_id string

Consumers: MOD-063 (notify account holder and signatories — routes once deployed), MOD-002 (transaction log), MOD-042 (Snowflake CDC)


bank.core.joint_account_activated

Emitted by MOD-125 when all activation gate conditions pass (≥ 2 active verified holders, all consented, ownership shares sum to 100) and the account is transitioned from PENDING to ACTIVE.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid core.joint_accounts.joint_account_id
account_id uuid
holder_count integer Number of active holders at activation
jurisdiction string "NZ" or "AU"
trace_id string
correlation_id string

Consumers: MOD-002 (transaction log), MOD-042 (Snowflake CDC)


bank.core.joint_holder_changed

Emitted by MOD-125 when a holder is added (action='ADDED'), removed (action='REMOVED'), or a death is recorded (action='DECEASED').

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid
account_id uuid
action string "ADDED", "REMOVED", or "DECEASED"
holder_relationship_id uuid The changed holder's relationship ID
trace_id string
correlation_id string

Consumers: MOD-002, MOD-042, MOD-063 (notify surviving holders)


bank.core.joint_signing_authority_changed

Emitted by MOD-125 when the account's signing_authority field is updated.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid
account_id uuid
previous_signing_authority string
new_signing_authority string
trace_id string
correlation_id string

Consumers: MOD-002, MOD-042


bank.core.joint_share_adjusted

Emitted by MOD-125 when ownership share percentages are updated. Reserved for future server-driven re-allocation flows.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid
account_id uuid
share_snapshot array [{holder_relationship_id, ownership_share_pct}]
trace_id string
correlation_id string

Consumers: MOD-042


bank.core.joint_authorisation_completed

Emitted by MOD-125 when all required holder approvals are collected and an authorisation reaches status='COMPLETE'.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid
account_id uuid
authorisation_id uuid core.joint_authorisations.authorisation_id
action_type string "PAYMENT", "ADD_HOLDER", "REMOVE_HOLDER", or "CHANGE_SIGNING"
trace_id string
correlation_id string

Consumers: Future SD04 payment caller (consume to proceed with debit once SD04 ships)


bank.core.joint_holder_death_recorded

Emitted by MOD-125 when recordDeath is called and a holder's status is flipped to 'deceased'. The account is frozen (death_documentation_status = 'frozen') until acceptDeathDocumentation is called.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
tenant_id string "totara-bank"
joint_account_id uuid
account_id uuid
holder_relationship_id uuid The deceased holder's relationship ID
deceased_at ISO8601
trace_id string
correlation_id string

Consumers: MOD-063 (notify surviving holders), MOD-002, MOD-042


bank.core.term_deposit_opened

Emitted by MOD-111 when a new term deposit is created.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
account_id uuid
amount string Decimal string
currency string ISO 4217
term_months integer
annual_interest_rate string Decimal string
maturity_date string YYYY-MM-DD
jurisdiction string NZ / AU
idempotency_key string
trace_id string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.term_deposit_pre_maturity_notice

Emitted by MOD-111 pre-maturity-notices Lambda at 30, 14, and 7 days before maturity (FR-494).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
account_id uuid
party_id uuid Customer reference
maturity_date string YYYY-MM-DD
days_until_maturity integer 30 / 14 / 7
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-063 (notification orchestration — dispatches pre-maturity notice to customer per FR-494)


bank.core.term_deposit_instruction_captured

Emitted by MOD-111 when a maturity instruction (ROLLOVER or WITHDRAW) is recorded.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
instruction_type string ROLLOVER / WITHDRAW
source string CUSTOMER / AUTO_DEFAULT
idempotency_key string
trace_id string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.term_deposit_break_cost_disclosed

Emitted by MOD-111 when a break-cost disclosure is generated for an early-withdrawal request.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
disclosure_id uuid
break_cost_amount string Decimal string
currency string ISO 4217
remaining_term_days integer
idempotency_key string

Consumers: MOD-002 (immutable transaction log)


bank.core.term_deposit_break_cost_accepted

Emitted by MOD-111 when the customer accepts the break-cost disclosure.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
disclosure_id uuid
accepted_at ISO8601
idempotency_key string

Consumers: MOD-002 (immutable transaction log)


bank.core.term_deposit_rolled_over

Emitted by MOD-111 apply-maturity Lambda when a deposit is rolled over into a new term.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
previous_deposit_id uuid Closed (ROLLED) deposit
new_deposit_id uuid New deposit created by rollover
account_id uuid
principal string Decimal string — rolled principal
accrued_interest string Decimal string — interest credited
new_maturity_date string YYYY-MM-DD
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.term_deposit_proceeds_disbursed

Emitted by MOD-111 apply-maturity Lambda when a deposit matures and proceeds are credited to the nominated account (PAY-001 AUTO path).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
account_id uuid Source account
nominated_account_id uuid Destination account
principal string Decimal string
accrued_interest string Decimal string
final_proceeds string Decimal string
currency string ISO 4217
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.term_deposit_broken_early

Emitted by MOD-111 when an early withdrawal is processed after break-cost acceptance.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
deposit_id uuid
disclosure_id uuid Accepted break-cost disclosure
account_id uuid
principal string Decimal string
break_cost_amount string Decimal string — deducted from proceeds
net_proceeds string Decimal string — principal minus break cost
currency string ISO 4217
broken_at ISO8601
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.notice_lodged

Emitted by MOD-130 when a customer successfully lodges a notice of withdrawal.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
lodgement_id uuid
account_id uuid
party_id uuid
amount string Decimal string — full balance if partial not specified
currency string ISO 4217
notice_period_days integer
withdrawal_date string YYYY-MM-DD — today + notice_period_days
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-063 (notification orchestration — lodgement confirmation per CON-004)


bank.core.notice_pre_withdrawal_reminder

Emitted by MOD-130 daily cron when withdrawal_date = today + 7 (FR-551).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
lodgement_id uuid
account_id uuid
party_id uuid
withdrawal_date string YYYY-MM-DD
amount string Decimal string
currency string ISO 4217
idempotency_key string

Consumers: MOD-063 (notification orchestration — 7-day reminder per CON-004)


bank.core.notice_funds_available

Emitted by MOD-130 daily cron after auto-release posting succeeds on maturity day (FR-551).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
lodgement_id uuid
account_id uuid
party_id uuid
amount string Decimal string — withdrawn amount
currency string ISO 4217
withdrawal_date string YYYY-MM-DD
idempotency_key string

Consumers: MOD-063 (notification orchestration — funds available per CON-004 / FR-551)


bank.core.notice_early_withdrawal_disclosed

Emitted by MOD-130 when an early-withdrawal penalty disclosure is generated.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
disclosure_id uuid
lodgement_id uuid
account_id uuid
penalty_amount string Decimal string
withdrawal_amount string Decimal string
currency string ISO 4217
idempotency_key string

Consumers: MOD-002 (immutable transaction log)


bank.core.notice_early_withdrawal_accepted

Emitted by MOD-130 after customer accepts the penalty disclosure and the withdrawal + penalty postings commit (CON-005 evidence).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
disclosure_id uuid Accepted disclosure
lodgement_id uuid
account_id uuid
party_id uuid
penalty_amount string Decimal string
net_proceeds string Decimal string — withdrawal minus penalty
currency string ISO 4217
accepted_at ISO8601
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-042 (CDC)


bank.core.notice_liquidity_snapshot

Emitted by MOD-130 daily cron — notice account balances bucketed by withdrawal date horizon for LCR/NSFR (FR-552 / CLQ-002 CALC).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
snapshot_date string YYYY-MM-DD — date of calculation
jurisdiction string NZ / AU
within_30_days string Decimal string — aggregate balance with withdrawal_date ≤ today+30
days_31_to_60 string Decimal string
days_61_to_90 string Decimal string
currency string ISO 4217
lodgement_count integer Number of active pending lodgements included
idempotency_key string

Consumers: MOD-032 (LCR/NSFR calculator — notice account stable funding contribution per CLQ-002)


bank.core.obr_activated

Emitted by MOD-143 at the moment the OBR partition transaction commits. Triggers customer-notification dispatch via MOD-063 and provides the primary audit anchor for the resolution event under the RBNZ DTA OBR Pre-positioning Standard.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string SHA256 of partition_event_id
rbnz_instruction_ref string RBNZ-supplied instruction reference number
haircut_pct string Decimal string — e.g. "0.2000" for 20% haircut
accounts_partitioned_count integer Number of deposit accounts stamped
total_frozen_amount string Decimal string — aggregate obr_frozen_amount across all affected accounts
total_available_amount string Decimal string — aggregate obr_available_amount across all affected accounts
activated_at ISO8601 Timestamp of partition commit
activated_by string Cognito staff-identity UUID of the resolution officer (v1: record-only; cryptographic verification is follow-up)
jurisdiction string NZ — OBR is an RBNZ instrument; AU equivalent is APRA-governed separately

Consumers: MOD-063 (customer notification — single summary comms-plan dispatch; per-depositor fan-out is a named follow-up)


bank.core.obr_resolved

Emitted by MOD-143 at the moment the resolution-unwind transaction commits. Signals that resolution_state has returned to normal, frozen amounts have been unwound, and confirmed credit-loss write-offs have been posted via MOD-001.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
rbnz_instruction_ref string Matches the original activation instruction ref
total_writeoff_amount string Decimal string — sum of credit-loss postings applied
accounts_unwound_count integer
resolved_at ISO8601
resolved_by string Cognito staff-identity UUID

Consumers: MOD-063 (resolution-end customer notification — named follow-up)


bank.core.obr_state_verified

Emitted by MOD-143 on each authenticated call to the RBNZ-facing get-resolution-state endpoint. Provides an immutable audit trail of every RBNZ inquiry, satisfying FR-633's "all transitions audited" obligation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
resolution_state string normal | pre_positioned | activated
queried_by string Cognito staff-identity UUID of the querying officer
rbnz_instruction_ref string Present only when resolution_state = activated

Consumers: audit / RBNZ reporting dashboards


bank.core.amortisation_schedule_generated

Emitted by MOD-112 at loan origination when the initial amortisation schedule is produced. Triggers customer delivery of the repayment schedule (CON-004 / CRE-002). Must be delivered to the customer via MOD-063 + MOD-113 within 60 seconds of loan settlement (FR-498).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
account_id uuid
schedule_id uuid References loans.amortisation_schedules
schedule_type string PI | IO | REVOLVING
total_instalments integer
total_interest_payable string Fixed-point decimal
effective_annual_rate string Fixed-point decimal
first_payment_due string ISO 8601 date

Consumers: MOD-063 (notification orchestration — schedule delivery to customer), MOD-113 (document vault — schedule document generation)


bank.core.amortisation_schedule_recalculated

Emitted by MOD-112 after any schedule-changing event (variable-rate change, extra repayment acceptance, interest-only expiry, hardship restructure). New schedule version committed before event is emitted (CON-004). Customer delivery within 24h required (FR-499).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
account_id uuid
new_schedule_id uuid
prior_schedule_id uuid
trigger string RATE_CHANGE | EXTRA_REPAYMENT | IO_EXPIRY | HARDSHIP_RESTRUCTURE
new_total_interest_payable string Fixed-point decimal
new_effective_annual_rate string Fixed-point decimal

Consumers: MOD-063 (notification — updated schedule delivery), MOD-113 (document vault — revised schedule document)


bank.core.amortisation_extra_repayment_options

Emitted by MOD-112 when a customer submits an extra repayment and previews their restructure options. Contains both options before the customer accepts (FR-500 step 1 of 2).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
account_id uuid
extra_repayment_amount string Fixed-point decimal
reduce_term_option_id uuid Preview schedule ID for option (a)
reduce_instalment_option_id uuid Preview schedule ID for option (b)

Consumers: MOD-068 (customer app — displays option choice to customer)


bank.core.revolving_minimum_repayment_posted

Emitted by MOD-112 daily cron when the revolving credit minimum repayment is automatically posted for a PRD-008 account (FR-501). One event per account per cycle.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
account_id uuid
minimum_repayment string Fixed-point decimal — max(floor, balance × pct)
posting_id uuid References accounts.postings
balance_at_posting string Fixed-point decimal

Consumers: MOD-063 (notification — repayment reminder / confirmation)


bank.core.revolving_late_payment_assessed

Emitted by MOD-112 when a revolving credit payment is received but falls below the minimum repayment threshold (FR-501). Triggers MOD-110 fee assessment.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
idempotency_key string
account_id uuid
minimum_repayment string Fixed-point decimal — the floor that was not met
amount_received string Fixed-point decimal — what the customer paid
shortfall string Fixed-point decimal

Consumers: MOD-110 (fee engine — late payment fee assessment)


bank.core.share_transaction_completed

Emitted by MOD-118 after each share capital movement (purchase, redemption, transfer, dividend reinvestment, or correction) settles or is blocked by the CLQ-001 capital gate. Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
tx_id uuid FK to core.share_transactions
member_id uuid
party_id uuid
tx_type string PURCHASE | REDEMPTION | TRANSFER_IN | TRANSFER_OUT | DIVIDEND_REINVESTMENT | CORRECTION
shares string Fixed-point decimal; negative for deductions
total_amount string Fixed-point decimal
status string SETTLED | BLOCKED
blocked_reason string capital_gate when CLQ-001 fires
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-063 (member notification on SETTLED or BLOCKED status).


bank.core.dividend_declared

Emitted by MOD-118 when a board dividend declaration is created with status = 'DECLARED'. Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
declaration_id uuid
record_date string ISO 8601 date
payment_date string ISO 8601 date
rate_per_share string Fixed-point decimal
total_declared string Fixed-point decimal
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-063 (back-office acknowledgement of declaration), MOD-022 (audit trail).


bank.core.dividend_paid

Emitted by MOD-118 once per member per dividend declaration when the net credit is confirmed by MOD-001. Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
payment_id uuid FK to core.dividend_payments
declaration_id uuid
member_id uuid
party_id uuid
gross_dividend string Fixed-point decimal
tax_withheld string Fixed-point decimal
net_dividend string Fixed-point decimal
posting_id uuid SD01 posting reference
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-063 (member notification — "dividend credited to your account"), MOD-022 (audit trail).


bank.core.member_status_changed

Emitted by MOD-118 on any member register status transition (APPLICANT → MEMBER, MEMBER → SUSPENDED, MEMBER → FORMER, etc.). Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
member_id uuid
party_id uuid
status_from string Previous status
status_to string New status
reason string Present for SUSPENDED and FORMER transitions
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-063 (member notification on status changes), MOD-022 (audit trail).


bank.core.member_statement_due

Emitted by MOD-118 once per active member at FY end, carrying the full annual statement data payload. MOD-113 subscribes when deployed and renders the statement for delivery via MOD-073 + email. Deferred rendering path — FR-536 delivery is pending MOD-113 (Gap #2 ruling — Option C). Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
member_id uuid
party_id uuid
fy_end_date string ISO 8601 date
opening_shares string Fixed-point decimal
closing_shares string Fixed-point decimal
transactions array Array of {tx_id, tx_type, shares, total_amount, created_at}
dividends_declared array Array of {declaration_id, gross_dividend, tax_withheld, net_dividend, paid_at}
last_voted_at string ISO 8601 date; null if did not vote
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-113 (annual statement rendering + MOD-073 storage + email delivery — pending MOD-113 deployment).


bank.core.tax_certificate_due

Emitted by MOD-118 once per member who received a dividend payment during the FY. MOD-113 subscribes when deployed and renders the tax certificate. Deferred rendering path — FR-535 delivery pending MOD-113 (Gap #2 ruling — Option C). Mutual-institution tenants only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
member_id uuid
party_id uuid
fy_end_date string ISO 8601 date
total_gross_dividend string Fixed-point decimal — sum for the year
total_tax_withheld string Fixed-point decimal
total_net_dividend string Fixed-point decimal
dividend_payments array Array of {declaration_id, payment_date, gross_dividend, tax_withheld, net_dividend}
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-113 (tax certificate rendering + MOD-073 storage + email delivery — pending MOD-113 deployment).


SD02 — KYC Platform (bank-kyc bus)

bank.kyc.identity_verified

Emitted by MOD-009 when an identity verification attempt produces a PASS result with sufficient confidence to proceed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
party_id uuid Canonical cross-domain party reference — replaces earlier customer_id
verification_id uuid FK to kyc.kyc_checks.id
document_type string PASSPORT / DRIVERS_LICENCE / NATIONAL_ID
confidence_score string Decimal string "0.00""1.00"
jurisdiction string NZ / AU
kyc_status string VERIFIED (FR-444 required field)
cdd_tier string SIMPLIFIED / STANDARD / ENHANCED — derived by MOD-009 from score thresholds in FR-443; consumed by MOD-010 and MOD-007 (FR-444 required field)
edd_required boolean True when confidence is 0.70–0.89 (VERIFIED but flagged for periodic review)
verified_at ISO8601
idempotency_key string

Consumers: MOD-010 (CDD tier assignment — primary consumer), MOD-013 (sanctions screener — triggers initial screen), MOD-012 (KYC audit trail), MOD-007 (account state machine — enables activation gate)


bank.kyc.identity_failed

Emitted by MOD-009 when a verification attempt produces a FAIL or irrecoverable REFER result that cannot proceed without manual intervention.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
party_id uuid Canonical cross-domain party reference — replaces earlier customer_id
verification_id uuid FK to kyc.kyc_checks.id
jurisdiction string NZ / AU — consumers (MOD-007, MOD-018) need jurisdiction to route correctly
kyc_status string FAILED or PENDING_EDD
failure_reason string DOCUMENT_REJECTED / BIOMETRIC_MISMATCH / WATCHLIST_HIT / UNSUPPORTED_DOCUMENT / EXPIRED_DOCUMENT
confidence_score string Decimal string — allows MOD-018 to assess whether EDD path is viable
attempt_number integer Retry count
max_attempts_reached boolean
idempotency_key string

Consumers: MOD-018 (alert case management — creates manual review task), MOD-012 (KYC audit trail), MOD-063 (notification orchestration — customer notification)


bank.kyc.cdd_tier_assigned

Emitted by MOD-010 after CDD classification is complete for a customer.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
customer_id uuid
cdd_tier string LOW / MEDIUM / HIGH / ENHANCED
previous_tier string Omitted on initial assignment
tier_rationale string Human-readable reason
sanctions_check_status string CLEAR / MATCH_FOUND / PENDING
account_activation_permitted boolean
idempotency_key string

Consumers: MOD-007 (account state machine — activation gate), MOD-039 (customer risk score — informs risk model), MOD-016 (typology engine — AML risk parameter), MOD-012 (KYC audit trail)


bank.kyc.sanctions_match_found

Emitted by MOD-013 when a customer or payment counterparty matches an entry on OFAC, UN, MFAT, or DFAT lists.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
screening_id uuid
entity_type string CUSTOMER / COUNTERPARTY
entity_id uuid customer_id or counterparty reference
list_source string OFAC / UN / MFAT / DFAT
match_score string Decimal string "0.00""1.00"
match_type string EXACT / FUZZY / ALIAS
triggering_context string ONBOARDING / PAYMENT / LIST_UPDATE / PERIODIC_REVIEW
idempotency_key string

Consumers: MOD-007 (account state machine — immediate restriction), MOD-020 (pre-payment validation — blocks all payments), MOD-018 (alert case management — creates sanctions case), MOD-022 (payment audit trail)


bank.kyc.sanctions_match_cleared

Emitted by MOD-015 only when an adjudication resolves as FALSE_POSITIVE and the sanctions hold is lifted. Not emitted for CONFIRMED_MATCH or ESCALATED outcomes. Schema v1 registered by MOD-015.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
screening_id uuid FK to originating kyc.sanctions_results.id
party_id uuid NULL for counterparty matches
queue_id uuid FK to kyc.fp_review_queue.id
adjudication_id uuid FK to kyc.false_positive_decisions.id
list_source string e.g. OFAC, UN, MFAT
match_entry_id string Sanctions list entry that was cleared
cleared_by string Staff ID of adjudicating analyst
suppress_until string YYYY-MM-DD — suppression window end date
idempotency_key string

Consumers: MOD-007 (account state machine — lifts restriction), MOD-020 (pre-payment validation — removes payment block), MOD-012 (KYC audit trail)


bank.kyc.kyc_review_due

Emitted by MOD-011 daily sweep at exact milestone days before/after due date, and for AML-003 expiring-document hits. Cadences: Simplified 1095d / Standard 730d / Enhanced 365d (FR-085). Milestone bands: T-60 / T-30 / T-7 / T_DUE / OVERDUE / DOCUMENT_EXPIRY.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
party_id uuid
schedule_id uuid periodic_review_schedule.id; for DOCUMENT_EXPIRY carries document UUID
milestone string T_MINUS_60 / T_MINUS_30 / T_MINUS_7 / T_DUE / OVERDUE / DOCUMENT_EXPIRY
review_type string PERIODIC / DOCUMENT_EXPIRY
due_date string YYYY-MM-DD
days_overdue integer Present when milestone = OVERDUE; ≥ 1
expiring_document_id uuid Present when review_type = DOCUMENT_EXPIRY
current_cdd_tier string SIMPLIFIED / STANDARD / ENHANCED
idempotency_key string

Consumers: MOD-062 (workflow orchestration — creates review task), MOD-064 (operations work queue — queues for analyst), MOD-063 (notification orchestration — may trigger customer outreach)


bank.kyc.kyc_review_completed

Emitted by MOD-011 when POST /kyc/reviews/complete records a successful periodic review. MOD-012 (KYC audit trail) consumes this to write an immutable audit entry (FR-088).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
party_id uuid
schedule_id uuid periodic_review_schedule.id
kyc_check_id uuid Inserted row in kyc.kyc_checks
outcome string Review outcome (pass / refer / escalate)
reviewer_id string Agent/user who completed the review
next_review_due string YYYY-MM-DD — recalculated forward date
idempotency_key string Caller-supplied

Consumers: MOD-012 (KYC audit trail — writes immutable review record)


bank.kyc.kyc_review_overdue_block

Emitted by MOD-011 sweep when a review is ≥ 15 days overdue (14-day grace, FR-087). MOD-007 (account state machine) consumes this to restrict new-product origination until the review is completed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
party_id uuid
schedule_id uuid periodic_review_schedule.id
due_date string YYYY-MM-DD — original due date
days_overdue integer ≥ 15
idempotency_key string

Consumers: MOD-007 (account state machine — restricts new-product origination)


bank.kyc.false_positive_recorded

Emitted by MOD-013 (back-office FR-452 API path) and MOD-015 (analyst workflow adjudication path) on every adjudication decision regardless of outcome. Both publish the same v1 schema; MOD-013 owns schema registration. MOD-015 projects non-standard list_source values (e.g. REFINITIV, DOW_JONES) to the nearest standard enum value for v1 compatibility; a v2 schema bump will widen the enum when confirmed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
screening_id uuid FK to kyc.sanctions_results.id
party_id uuid
list_source string OFAC / UN / MFAT / DFAT (v1 enum)
decision string FALSE_POSITIVE / CONFIRMED_MATCH / ESCALATED
adjudicated_by string Staff ID of analyst
decision_rationale string ≥ 20 characters
reason_code string Stable false-positive category
idempotency_key string

Consumers: MOD-012 (KYC audit trail), MOD-037 (AML reporting pipeline — RBNZ/AUSTRAC disclosures)


bank.kyc.list_updated

Emitted by MOD-014 when a sanctions list version transitions to ACTIVE (ingest + activate path) or when a list is ROLLED_BACK to a previous version within the 48-hour rollback window. The list_id is the kyc.sanctions_lists.id of the newly-active version. Consumers use this event as the trigger for list-change re-screening of the full customer portfolio.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
list_id uuid FK to kyc.sanctions_lists.id — the newly-active version
list_source string OFAC / UN / MFAT / DFAT / REFINITIV / DOW_JONES
list_version string Provider-stamped version identifier
previous_version string Previous active version; null on first ingest
change_type string ACTIVATED / ROLLED_BACK
entry_count integer Total entries in the now-active version
added_count integer Diff: entries added vs previous version
removed_count integer Diff: entries removed vs previous version
modified_count integer Diff: entries modified vs previous version
idempotency_key string Deduplication key (list_id + change_type)
trace_id string

Consumers: MOD-013 (sanctions screening — triggers LIST_UPDATE re-screen of all active parties), MOD-037 (AML reporting)


bank.kyc.acceptance_decided

Emitted by MOD-153 (customer acceptance engine) after persisting an acceptance decision to kyc.acceptance_decisions. Published to the bank-kyc bus before any downstream side-effects. FR-715 requires the corresponding bank.platform.system_decision_recorded to be published to the bank-platform bus in the same handler flow, before downstream activation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
party_id uuid
product_id text
decision string ACCEPT / DECLINE / REFER / HOLD_FOR_EDD
product_category string CREDIT / DEPOSIT / PAYMENT / OTHER — FR-714 adverse-action routing
reason_codes string[] Machine-readable codes e.g. ["CDD_TIER_INSUFFICIENT"]
decision_at ISO8601 Matches kyc.acceptance_decisions.decision_at
methodology_version string Rule-set release identifier — AML-012 traceability
re_evaluation_trigger string Present on FR-716 re-evals; null on initial evaluation
trace_id string
idempotency_key string

Consumers: MOD-007 (account activation gate — v2 follow-on; reads kyc.acceptance_decisions view before PENDING→ACTIVE), MOD-048 (system decision log — FR-715; receives bank.platform.system_decision_recorded cross-bus), MOD-063 (adverse action notice — FR-714; filters on decision=DECLINE AND product_category=CREDIT; event-driven stub in v1), MOD-151 / MOD-053 (risk case creation — FR-713; filters on decision IN (REFER, HOLD_FOR_EDD); event-driven fan-out)


SD03 — AML Monitoring (bank-aml bus)

bank.aml.alert_raised

Emitted by MOD-016 (rule-based typology) or MOD-017 (ML behavioural scoring) when a transaction or behavioural pattern crosses an alert threshold.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
alert_id uuid
alert_source string RULE_ENGINE / ML_MODEL
customer_id uuid
alert_type string FATF typology code e.g. STRUCTURING, RAPID_MOVEMENT, UNUSUAL_CROSS_BORDER
risk_score string Decimal string "0""100"
triggering_transaction_ids array of uuid Present when alert is transaction-specific
rule_ids array of string Present when alert_source is RULE_ENGINE
idempotency_key string

Consumers: MOD-018 (alert case management — primary consumer, creates analyst queue entry), MOD-022 (payment audit trail), MOD-042 (CDC → Snowflake)


bank.aml.case_opened

Emitted by MOD-018 when an alert is promoted to a formal AML investigation case.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
case_id uuid
alert_id uuid Causal alert reference
customer_id uuid
assigned_analyst string Agent ID; null if unassigned
priority string LOW / MEDIUM / HIGH / CRITICAL
idempotency_key string

Consumers: MOD-064 (operations work queue), MOD-047 (agent action logger), MOD-042 (CDC → Snowflake)


bank.aml.case_escalated

Emitted by MOD-018 when a case is escalated to MLRO or senior analyst review.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
case_id uuid
escalated_to string MLRO / SENIOR_ANALYST / BOARD
escalation_reason string Human-readable
idempotency_key string

Consumers: MOD-063 (notification orchestration — MLRO notification), MOD-047 (agent action logger), MOD-042 (CDC → Snowflake)


bank.aml.case_closed

Emitted by MOD-018 when a case is closed with a final disposition.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
case_id uuid
customer_id uuid
disposition string SAR_FILED / NO_ACTION / ENHANCED_MONITORING / ACCOUNT_CLOSED
closed_by string Agent ID
sar_reference string Present when disposition is SAR_FILED
idempotency_key string

Consumers: MOD-019 (regulatory report submission — when SAR filed), MOD-039 (customer risk score — re-scores on close), MOD-012 (KYC audit trail), MOD-042 (CDC → Snowflake)


bank.aml.regulatory_submission_completed

Emitted by MOD-019 after a SAR, IFTI, or CMIR is successfully submitted to AUSTRAC or RBNZ/FMA.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
submission_id uuid
report_type string SAR / IFTI / CMIR
jurisdiction string NZ / AU
regulator string AUSTRAC / RBNZ / FMA
case_id uuid Present when linked to a case
submitted_at ISO8601
idempotency_key string

Consumers: MOD-047 (agent action logger — immutable record), MOD-048 (system decision log), MOD-042 (CDC → Snowflake)


SD04 — Payments (bank-payments bus)

bank.payments.payment_initiated

Emitted by MOD-020 (pre-payment validation) when a payment instruction is received and passes initial structural validation, before full validation and posting.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid Stable payment reference
customer_id uuid
source_account_id uuid
destination_account_id uuid Internal transfers only
destination_bsb_account string External AU payments
destination_sort_account string External NZ payments
amount string Fixed-point decimal
currency string ISO 4217
payment_type string INTERNAL / DOMESTIC / INTERNATIONAL / FX
channel string APP / API / OPEN_BANKING / AGENT
trace_id uuid ADR-031 trace propagation
idempotency_key string Caller-supplied

Consumers: MOD-022 (payment audit trail — opens audit record), MOD-023 (transaction fraud scorer — immediate scoring trigger), MOD-024 (device & session intelligence)


bank.payments.payment_validated

Emitted by MOD-020 when all pre-payment validation checks pass and the payment is cleared for posting.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid
validation_checks_passed array of string e.g. ["BALANCE", "LIMITS", "SANCTIONS", "FRAUD", "ACCOUNT_STATUS"]
fraud_score string Decimal string from MOD-023
trace_id uuid ADR-031 trace propagation
idempotency_key string

Consumers: MOD-001 (posting engine — proceeds to ledger posting), MOD-022 (payment audit trail)


bank.payments.payment_completed

Emitted by MOD-022 (triggered by bank.core.posting_completed) once the ledger posting is confirmed and settlement is initiated. MOD-022's audit-consumer processes the core posting event, writes the SETTLEMENT_CONFIRMED audit row, and re-emits this event on the bank-payments bus to close the SD04→SD01→SD04 loop that rail integrations need.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id uuid ADR-031 trace propagation
payment_id uuid
posting_id uuid Ledger posting reference
customer_id uuid
amount string Fixed-point decimal
currency string ISO 4217
payment_type string
settled_at ISO8601 Present when settled in same event cycle
idempotency_key string

Consumers: MOD-063 (notification orchestration — payment confirmation), MOD-026 (IFTI/CMIR trigger — threshold check), MOD-039 (customer risk score — transaction signal), MOD-042 (CDC → Snowflake), MOD-070 (transaction history)


bank.payments.payment_failed

Emitted by MOD-020 or MOD-001 when a payment cannot be completed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid
customer_id uuid
failure_stage string VALIDATION / FRAUD_BLOCK / SANCTIONS_BLOCK / POSTING
failure_code string Stable machine key
failure_message string Human-readable operator message
trace_id uuid ADR-031 trace propagation
idempotency_key string

Consumers: MOD-022 (payment audit trail), MOD-063 (notification orchestration — customer notification), MOD-042 (CDC → Snowflake)


bank.payments.payment_reversed

Emitted by MOD-001 (general reversals), MOD-119 (BPAY returns), MOD-120 (Osko returns), and MOD-122 (NZ interbank returns) after a reversal posting pair is committed to the ledger.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid Original payment reference
reversal_posting_id uuid
customer_id uuid
amount string Fixed-point decimal
currency string ISO 4217
reversal_reason string CUSTOMER_REQUEST / FRAUD / SETTLEMENT_FAILURE / COMPLIANCE_HOLD / BPAY_RETURN / OSKO_RETURN / NZ_INTERBANK_RETURN
reversed_by string Agent ID, SYSTEM, BPAY_SCHEME, NPP_SCHEME, or NZ_PAYMENTS_NZ_SCHEME
idempotency_key string
trace_id uuid ADR-031 trace propagation

Consumers: MOD-022 (payment audit trail), MOD-063 (notification orchestration), MOD-042 (CDC → Snowflake)


bank.payments.fx_rate_locked

Emitted by MOD-025 when an FX rate lock is granted to a payment instruction. Lock duration is 30–60 seconds; expired locks must trigger a new lock request.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
lock_id uuid
payment_id uuid
source_currency string ISO 4217
target_currency string ISO 4217
rate string Fixed-point decimal — locked rate
inverse_rate string For display purposes
source_amount string Fixed-point decimal
target_amount string Fixed-point decimal
lock_expires_at ISO8601
idempotency_key string

Consumers: MOD-022 (payment audit trail), MOD-082 (nostro & FX treasury — hedging trigger)


bank.payments.fx_conversion_completed

Emitted by MOD-025 when the FX conversion posting pair is committed and settlement is instructed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
conversion_id uuid
lock_id uuid Reference to bank.payments.fx_rate_locked
payment_id uuid
source_posting_id uuid Debit ledger posting
target_posting_id uuid Credit ledger posting
source_currency string
target_currency string
source_amount string Fixed-point decimal
target_amount string Fixed-point decimal
rate_applied string Fixed-point decimal
idempotency_key string

Consumers: MOD-022 (payment audit trail), MOD-082 (nostro & FX treasury), MOD-042 (CDC → Snowflake)


bank.payments.limit_breach_detected

Emitted by MOD-021 when a payment instruction would exceed a customer's per-transaction or daily velocity limit.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid
customer_id uuid
limit_type string DAILY_VALUE / PER_TRANSACTION / DAILY_COUNT
limit_value string Fixed-point decimal
attempted_value string Fixed-point decimal
idempotency_key string

Consumers: MOD-020 (pre-payment validation — blocks payment), MOD-022 (payment audit trail), MOD-016 (typology engine — structuring signal), MOD-063 (notification orchestration — customer notification of breach via FR-128)


bank.payments.approval_required

Emitted by MOD-021 when a payment instruction exceeds the configured multi-step approval threshold. The payment is held; the approval workflow is owned by MOD-062.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
payment_id uuid
customer_id uuid
amount string Fixed-point decimal
currency string
approval_threshold string Fixed-point decimal threshold that was exceeded
required_approver_count int Number of approvals required to release
expires_at ISO8601 Payment hold expiry; if not approved by this time, auto-cancelled
idempotency_key string

Consumers: MOD-062 (workflow orchestration — approval chain state machine), MOD-022 (payment audit trail), MOD-063 (notification orchestration — approval request to designated approvers)


bank.payments.approval_granted

Emitted by MOD-062 when a multi-step approval chain completes and the payment is released for execution.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
payment_id uuid
customer_id uuid
approved_by array List of approver IDs who completed the chain
workflow_id uuid MOD-062 workflow instance ID

Consumers: MOD-020 (pre-payment validation — re-enters payment into execution pipeline), MOD-063 (notification — payment released confirmation to initiator)


bank.payments.approval_rejected

Emitted by MOD-062 when a multi-step approval chain is rejected or expires without sufficient approvals.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
payment_id uuid
customer_id uuid
rejection_reason string APPROVER_REJECTED / EXPIRED / INSUFFICIENT_APPROVALS
workflow_id uuid MOD-062 workflow instance ID

Consumers: MOD-022 (payment audit trail — terminal state for held payment), MOD-063 (notification — payment declined notification to initiator)


bank.payments.ifti_threshold_crossed

Emitted by MOD-026 when a cross-border electronic transfer triggers an IFTI reporting obligation, or when a physical cash movement meets the CMIR threshold. IFTI-E has no monetary minimum — every cross-border electronic transfer is reportable; the applied threshold is configurable per jurisdiction via SSM/AppConfig (production default: every cross-border transfer).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
payment_id uuid
customer_id uuid
amount string Fixed-point decimal
currency string ISO 4217
direction string INBOUND / OUTBOUND
counterparty_country string ISO 3166-1 alpha-2
report_type string IFTI / CMIR
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-019 (regulatory report submission — files IFTI/CMIR), MOD-022 (payment audit trail)


bank.payments.settlement_file_received

Emitted by MOD-081 when an inbound settlement file is received from a payment rail (NPP, RTGS, SWIFT, DIRECT_ENTRY, BPAY, CARD).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
file_id uuid FK to payments.settlement_files.id
rail string NPP / RTGS / SWIFT / DIRECT_ENTRY / BPAY / CARD — matches payments.settlement_files.rail CHECK enum
settlement_date string YYYY-MM-DD
transaction_count integer
total_value string Fixed-point decimal
currency string ISO 4217
idempotency_key string

Consumers: MOD-081 (reconciliation engine — self-consume to trigger matching run), MOD-082 (nostro & FX treasury — position update)


bank.payments.reconciliation_exception_raised

Emitted by MOD-081 when a settlement item cannot be matched to a payment instruction, or when a mismatch is detected during reconciliation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
exception_id uuid FK to payments.reconciliation_exceptions.id
payment_id uuid NULL for inbound unmatched items with no matched instruction
settlement_file_id uuid
exception_type string UNMATCHED_OUTBOUND / SHORT_SETTLED / OVER_SETTLED / DUPLICATE / MISSING_RETURN / UNMATCHED_INBOUND — matches payments.reconciliation_exceptions.exception_type CHECK enum
instructed_amount string Fixed-point decimal; NULL for UNMATCHED_INBOUND
settled_amount string Fixed-point decimal
variance string Fixed-point decimal, signed (instructed − settled); NULL for UNMATCHED_OUTBOUND / UNMATCHED_INBOUND
currency string ISO 4217
rail string Matches payments.settlement_files.rail CHECK enum
idempotency_key string

Consumers: MOD-064 (operations work queue — creates reconciliation task, when built), MOD-047 (agent action logger), MOD-042 (CDC → Snowflake)


bank.payments.reconciliation_daily_summary

Emitted by MOD-081 daily-report Lambda after aggregating the day's reconciliation results per rail. The corresponding row is written to payments.reconciliation_daily_summary in Postgres before the event fires. MOD-042 replicates the table to Snowflake for treasury analysis and visualisation.

Bus: bank-payments · Source: bank.payments · Detail-type: reconciliation_daily_summary

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
summary_id uuid FK to payments.reconciliation_daily_summary.id
report_date string YYYY-MM-DD
rail string Matches payments.settlement_files.rail CHECK enum
currency string ISO 4217
total_count integer Total items in settlement files for this rail/date
matched_count integer
unmatched_count integer
short_settled_count integer
over_settled_count integer
duplicate_count integer
missing_return_count integer
total_instructed_amount string Fixed-point decimal
total_settled_amount string Fixed-point decimal
net_variance string Fixed-point decimal, signed
open_exceptions_count integer Open + under-review at time of report
escalated_exceptions_count integer
idempotency_key string

Consumers: MOD-042 (CDC → Snowflake — daily summary table replicated for treasury analytics), MOD-047 (agent action logger)


bank.payments.nostro_threshold_breached

Emitted by MOD-082 when a nostro position's current_balance crosses the configured minimum_threshold (under-funded) or maximum_threshold (over-funded). Triggers treasury action.

Bus: bank-payments · Source: bank.payments · Detail-type: nostro_threshold_breached

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string semver string
trace_id string
position_id string UUID — FK to payments.nostro_positions
correspondent_bank string BIC or internal code
nostro_account_ref string
currency string ISO 4217
threshold_kind string MINIMUM / MAXIMUM
current_balance string Fixed-point decimal
threshold_value string Fixed-point decimal
idempotency_key string

Consumers: MOD-022 (payment audit trail), MOD-064 (operations work queue — treasury action task, when deployed)


bank.payments.device_anomaly_detected

Emitted by MOD-024 (device & session intelligence) whenever an anomaly is detected during session observation (observe-device path) or payment device check (check-device path).

Bus: bank-payments · Source: bank.payments · Detail-type: device_anomaly_detected

Field Type Required Notes
event_id string UUID
event_time ISO8601
schema_version string semver string
trace_id string
anomaly_id string UUID — FK to payments.device_anomalies.id
customer_id string UUID
device_fingerprint_hash string Same hash used by MOD-068 access.device_registry
anomaly_type string NEW_DEVICE / KNOWN_FRAUD_DEVICE / IMPOSSIBLE_TRAVEL / EMULATOR_DETECTED / ROOTED_DEVICE
severity string INFO / WARN / CRITICAL
action_recommended string NONE / STEP_UP / BLOCK
session_id string UUID
payment_id string UUID; populated when anomaly detected via check-device (payment-specific); null on observe path
idempotency_key string

Consumers: MOD-022 (payment audit trail — links anomaly to payment audit record via payment_id), MOD-018 (case management — future, when deployed), MOD-068 (step-up authentication — future; could subscribe to drive STEP_UP/BLOCK actions directly)


bank.payments.direct_debit_mandate_created

Emitted by MOD-114 when a new mandate is registered (customer in-app pre-approval or biller-initiated authorisation processed by the bank).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0"
trace_id string
idempotency_key string
mandate_id string UUID of the new mandate
party_id string
account_id string
jurisdiction string "NZ" or "AU"
biller_id string
biller_name string
max_amount number Null if no cap set
frequency string WEEKLY / FORTNIGHTLY / MONTHLY / VARIABLE
effective_date string ISO8601 date

Consumers: MOD-063 (sends "Mandate created" confirmation to customer).


bank.payments.direct_debit_mandate_cancelled

Emitted by MOD-114 when a customer cancels a mandate (FR-507). Effective immediately — subsequent debit presentations from that biller return MANDATE_CANCELLED.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0"
trace_id string
idempotency_key string
mandate_id string
party_id string
account_id string
jurisdiction string
biller_id string
biller_name string
cancel_reason string Customer or system reason
cancelled_at string ISO8601

Consumers: MOD-063 (sends "Mandate cancelled" notification to customer per FR-507).


bank.payments.direct_debit_dishonoured

Emitted by MOD-114 when a debit presentation is returned due to dishonour (insufficient funds, account blocked, etc.). Triggers fee assessment and customer notification (FR-508).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0"
trace_id string
idempotency_key string
presentation_id string UUID of the failed presentation
mandate_id string
party_id string
account_id string
jurisdiction string
biller_id string
biller_name string
amount number
currency string "NZD" or "AUD"
return_code string Scheme return code (DDR or BECS)
return_reason string Plain-language reason for customer notification
dishonour_fee_assessed boolean True if MOD-110 assessed a dishonour fee

Consumers: MOD-063 (sends "Direct debit returned — biller name + reason" notification within 60 s per FR-508), MOD-022 (payment audit trail).

bank.payments.bpay_biller_registered

Emitted by MOD-136 when a business customer's BPAY biller registration moves to ACTIVE status (sponsor has assigned and confirmed a BPAY code). AU-only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
biller_id uuid FK to payments.bpay_inbound_billers
party_id uuid Business customer party
bpay_code string BPAY biller code assigned by sponsor
biller_name string
jurisdiction string AU
trace_id string

Consumers: MOD-063 (back-office notification to staff that biller is now ACTIVE).


bank.payments.bpay_inbound_received

Emitted by MOD-136 after a successful MOD-001 credit posting for an inbound BPAY payment. Triggers biller notification within 60 s (FR-607 / CON-005). AU-only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
payment_id uuid FK to synthetic payments.payments row
posting_id uuid SD01 posting reference from MOD-001 credit
biller_id uuid
bpay_code string
crn string Customer reference number — validated before this event is emitted
amount string Fixed-point decimal e.g. "123.45"
currency string AUD
settlement_date string ISO 8601 date
settlement_batch_reference string Sponsor's batch reference
trace_id string

Consumers: MOD-063 (biller notification — "BPAY payment received" within 60 s per FR-607), MOD-022 (payment audit trail).


bank.payments.bpay_inbound_returned

Emitted by MOD-136 when an inbound BPAY payment fails CRN validation and is quarantined as RETURNED. Triggers ops-queue notification and the scheme return mechanism (FR-606). AU-only.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
payment_id uuid
biller_id uuid
bpay_code string
crn string The CRN as received — invalid
amount string Fixed-point decimal
currency string AUD
return_reason_code string Scheme return reason code
settlement_batch_reference string
trace_id string

Consumers: MOD-063 (ops-queue alert — quarantined item within 60 min per FR-606), MOD-022 (payment audit trail).


bank.payments.batch_validated

Emitted by MOD-135 when a batch file passes format validation (FR-601) and the MOD-020 aggregate balance gate (FR-602). Batch moves to PENDING_APPROVAL; customer must confirm before processing begins (CON-005).

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid FK to payments.batch_files
party_id uuid Business/SME customer party
account_id uuid Source debit account
file_format string ABA or CSV
validated_item_count integer
validated_total_amount string Fixed-point decimal
currency string ISO-4217
jurisdiction string NZ or AU
shortfall_amount string Present if insufficient funds — customer must confirm partial-funding intent
trace_id string

Consumers: MOD-063 (customer notification: batch ready for confirmation).


bank.payments.batch_confirmed

Emitted by MOD-135 when the customer explicitly confirms the batch (CON-005). Processing begins immediately after this event.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
party_id uuid
account_id uuid
item_count integer
total_amount string Fixed-point decimal
currency string
jurisdiction string
trace_id string

Consumers: (triggers batch submission orchestrator internally).


bank.payments.batch_item_quarantined

Emitted by MOD-135 per item that receives a fraud or sanctions alert from the per-item MOD-020 call (FR-603). Must be published within 60 s of batch submission; quarantined items do not block sibling items.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
item_id uuid FK to payments.batch_items
payment_id uuid MOD-135-minted payment_id for this item
party_id uuid
amount string Fixed-point decimal
currency string
quarantine_reason string MOD-020 failure_reason e.g. SANCTIONS_MATCH, FRAUD_BLOCK
sequence_number integer Position in source file
trace_id string

Consumers: MOD-063 (customer notification of quarantined item within 60 s per FR-603).


bank.payments.batch_item_returned

Emitted by MOD-135 when an item cannot be credited (account closed, invalid account) and a re-credit has been posted to the source account (FR-604).

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
item_id uuid
payment_id uuid
party_id uuid
amount string Fixed-point decimal — returned amount
currency string
return_reason string e.g. ACCOUNT_CLOSED, INVALID_ACCOUNT
return_posting_id uuid Re-credit posting to source account
sequence_number integer
trace_id string

Consumers: MOD-063 (return notification to customer per FR-604).


bank.payments.batch_settled

Emitted by MOD-135 when all non-quarantined, non-failed items have reached a terminal state (SETTLED, RETURNED, or FAILED). Terminal success event for the batch.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
party_id uuid
account_id uuid
settled_item_count integer Items that reached SETTLED
settled_total_amount string Fixed-point decimal
quarantined_item_count integer Items held as QUARANTINED
returned_item_count integer Items returned (FR-604)
currency string
jurisdiction string
settled_at string ISO8601 UTC
trace_id string

Consumers: MOD-063 (batch settlement confirmation to customer), MOD-022 (payment audit trail).


bank.payments.batch_failed

Emitted by MOD-135 on a batch-level failure (source account closed mid-batch, system error during processing). Items not yet submitted at failure are not charged.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
party_id uuid
account_id uuid
failure_reason string e.g. SOURCE_ACCOUNT_CLOSED, SUBMISSION_TIMEOUT
items_submitted integer Items that reached MOD-020 before failure
items_not_submitted integer Items not yet processed
currency string
jurisdiction string
trace_id string

Consumers: MOD-063 (failure notification to customer), MOD-022 (payment audit trail).


bank.payments.agency_batch_received

Emitted by MOD-137 when an agency batch file has landed in S3, been parsed, and per-item processing has been queued. File-level idempotency key is file_reference.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid FK to payments.agency_batch_files
agency_network string AUSTRALIA_POST | NZ_POST | OTHER
file_reference string Network-assigned file identifier
batch_date string ISO-8601 date — transaction date from file header
declared_item_count integer
jurisdiction string NZ or AU
trace_id string

Consumers: MOD-022 (payment audit trail).


bank.payments.agency_batch_settled

Emitted by MOD-137 when all items in the batch have reached a terminal state and the reconciliation pass is complete.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
agency_network string
posted_count integer Items that reached POSTED
posted_total_amount string Fixed-point decimal
quarantined_count integer Items held as QUARANTINED
currency string ISO-4217
jurisdiction string
settled_at string ISO8601 UTC
trace_id string

Consumers: MOD-063 (batch settlement summary to customer), MOD-022 (payment audit trail).


bank.payments.agency_item_quarantined

Emitted by MOD-137 per item that fails account matching, account-active validation, or available-balance check (FR-609). Must be published within 2 hours of batch receipt.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
transaction_id uuid FK to payments.agency_transactions
agency_network string
transaction_type string DEPOSIT | WITHDRAWAL
amount string Fixed-point decimal
currency string
failure_reason string ACCOUNT_NOT_FOUND | ACCOUNT_INACTIVE | INSUFFICIENT_BALANCE | PARSE_ERROR
terminal_id string
agent_outlet_code string
sequence_number integer Position in source file
trace_id string

Consumers: MOD-063 (ops queue notification per FR-609).


bank.payments.agency_aml_threshold_flagged

Emitted by MOD-137 for each agency cash transaction at or above the jurisdiction-specific AML reporting threshold (default AUD/NZD 10,000). Published in the same handler invocation as the MOD-001 posting — the flag never delays the transaction (FR-611). Carries terminal_id and agent_outlet_code as required location metadata.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
transaction_id uuid FK to payments.agency_transactions
account_id uuid Resolved account — soft ref SD01
transaction_type string DEPOSIT | WITHDRAWAL
amount string Fixed-point decimal
currency string ISO-4217
jurisdiction string NZ or AU
threshold_value string Threshold that was triggered (e.g. "10000.00")
terminal_id string FR-611 required location metadata
agent_outlet_code string FR-611 required location metadata
trace_id string

Consumers: SD03 MOD-016 (typology engine — cash transaction analysis), SD06 MOD-037 (CDC consumer — regulatory reporting pipeline).


bank.payments.agency_reconciliation_discrepancy

Emitted by MOD-137 when the reconciliation pass (FR-612) finds a mismatch between processed totals and the agency network's settlement file. Must be published within 2 hours of reconciliation completing.

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
batch_id uuid
agency_network string
discrepancy_type string COUNT_MISMATCH | AMOUNT_MISMATCH | BOTH
expected_count integer From settlement file
actual_count integer Items processed by MOD-137
expected_amount string Fixed-point decimal — settlement file total
actual_amount string Fixed-point decimal — MOD-137 processed total
currency string ISO-4217
jurisdiction string
trace_id string

Consumers: MOD-063 (ops queue alert per FR-612; escalation to agency network within 1 business day if unresolved), MOD-022 (payment audit trail).


bank.payments.card_ordered

Emitted by MOD-124 when a physical card order is submitted to the bureau.

Bus: bank-payments · Source: bank.payments · Detail-type: card_ordered

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid payments.physical_cards(id)
party_id uuid
account_id uuid
card_scheme string VISA | MASTERCARD
jurisdiction string NZ | AU
bureau_order_ref string Bureau tracking reference
idempotency_key string
trace_id uuid

Consumers: MOD-063 (notify customer — card ordered confirmation).


bank.payments.card_dispatched

Emitted by MOD-124 when the bureau webhook confirms the card has been printed and dispatched to the customer address.

Bus: bank-payments · Source: bank.payments · Detail-type: card_dispatched

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid
party_id uuid
card_number_last4 string For display in customer notification
estimated_delivery_date string ISO 8601 date if provided by bureau
pci_disclosure_required boolean Always true; MOD-073 subscribes to deliver PCI disclosure document
bureau_order_ref string
idempotency_key string
trace_id uuid

Consumers: MOD-063 (dispatch notification to customer), MOD-073 (PCI disclosure document delivery — triggered by pci_disclosure_required: true).


bank.payments.card_activated

Emitted by MOD-124 when the customer successfully activates their physical card.

Bus: bank-payments · Source: bank.payments · Detail-type: card_activated

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid
party_id uuid
account_id uuid
card_number_last4 string
idempotency_key string
trace_id uuid

Consumers: MOD-063 (activation confirmation notification), MOD-078 (card controls — initialise default control profile for this card once deployed).


bank.payments.card_frozen

Emitted by MOD-124 when a card is frozen (lost, stolen, or customer request). Separate from MOD-078 control-level freezes.

Bus: bank-payments · Source: bank.payments · Detail-type: card_frozen

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid
party_id uuid
freeze_reason string LOST | STOLEN | CUSTOMER_REQUEST | SYSTEM
idempotency_key string
trace_id uuid

Consumers: MOD-063 (freeze confirmation notification), MOD-022 (payment audit trail — freeze event).


bank.payments.card_cancelled

Emitted by MOD-124 when a card is permanently cancelled. Terminal state — no further events will be emitted for this card_id.

Bus: bank-payments · Source: bank.payments · Detail-type: card_cancelled

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid
party_id uuid
cancel_reason string LOST_STOLEN_REPLACEMENT | CUSTOMER_REQUEST | EXPIRY_REPLACED | SYSTEM
idempotency_key string
trace_id uuid

Consumers: MOD-063 (cancellation notification where cancel_reason = CUSTOMER_REQUEST), MOD-078 (remove control profile for cancelled card).


bank.payments.card_replaced

Emitted by MOD-124 when a replacement card order has been submitted following a lost/stolen report. The original card is simultaneously cancelled.

Bus: bank-payments · Source: bank.payments · Detail-type: card_replaced

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
original_card_id uuid The cancelled card
replacement_card_id uuid The newly ordered card
party_id uuid
replace_reason string LOST | STOLEN | DAMAGED
bureau_order_ref string Replacement order reference
idempotency_key string
trace_id uuid

Consumers: MOD-063 (replacement order confirmation notification).


bank.payments.card_pin_changed

Emitted by MOD-124 after the processor's HSM confirms a successful PIN change. No PIN data included — this is an audit event only.

Bus: bank-payments · Source: bank.payments · Detail-type: card_pin_changed

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
card_id uuid
party_id uuid
change_channel string APP | ATM | BRANCH
idempotency_key string
trace_id uuid

Consumers: MOD-063 (PIN change confirmation notification — security event), MOD-022 (payment audit trail).


bank.payments.card_renewed

Emitted by MOD-124 when the 60-day pre-expiry EventBridge Scheduler scan orders a renewal card for an active card approaching expiry.

Bus: bank-payments · Source: bank.payments · Detail-type: card_renewed

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
expiring_card_id uuid Card approaching expiry
renewal_card_id uuid Newly ordered renewal card
party_id uuid
expiry_date string ISO 8601 YYYY-MM of expiring card
bureau_order_ref string
idempotency_key string
trace_id uuid

Consumers: MOD-063 (renewal dispatch notification sent when card_dispatched subsequently fires for the renewal_card_id).


SD05 — Credit Decisioning (bank-credit bus)

bank.credit.application_received

Emitted by MOD-029 (pre-approval engine) or the credit application intake flow when a complete credit application is submitted.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
application_id uuid
customer_id uuid
product_id string e.g. PRD-002
requested_amount string Fixed-point decimal
currency string ISO 4217
application_source string APP / AGENT / PRE_APPROVAL
idempotency_key string

Consumers: MOD-027 (affordability calculator — starts assessment), MOD-028 (credit score & risk rating), MOD-062 (workflow orchestration)


bank.credit.credit_decision_made

Emitted by MOD-029 (pre-approval engine) when a credit decision is recorded in credit.credit_decisions — whether from a live synchronous application or the nightly pre-approval batch.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
application_id uuid
customer_id uuid
decision_type string APPROVE / CONDITIONALLY_APPROVE / DECLINE / PRE_APPROVE
decision_source string AUTO / MANUAL / PRE_APPROVAL_ENGINE
approved_amount string Fixed-point decimal; present on APPROVE / PRE_APPROVE
approved_interest_rate string Decimal string; present on APPROVE / PRE_APPROVE
approved_term_months int Present on APPROVE / PRE_APPROVE for term products
validity_period_days int Present on APPROVE / PRE_APPROVE — offer expiry window
risk_rating string Internal credit risk grade e.g. A1, B2
decline_reason_codes array of string Present on DECLINE
model_version string
idempotency_key string

Consumers: MOD-007 (account state — gates account activation on APPROVE), MOD-063 (notification orchestration — decision notification to customer), MOD-033 (RWA engine — updates RWA on approval), MOD-048 (system decision log), MOD-059 (credit bureau submission engine — submits SUBMISSION record to bureau on APPROVE per FR-189)


bank.credit.loan_account_opened

Emitted by MOD-001 (via credit servicing) when a loan account is created in the ledger following credit approval and customer acceptance.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
loan_account_id uuid
customer_id uuid
application_id uuid
principal_amount string Fixed-point decimal
currency string ISO 4217
term_months integer
interest_rate string Decimal string
product_id string
jurisdiction string NZ / AU
idempotency_key string

Consumers: MOD-030 (stage allocation model — initial IFRS 9 staging), MOD-031 (ECL calculation), MOD-033 (RWA engine), MOD-059 (credit bureau submission)


bank.credit.loan_disbursed

Emitted by MOD-065 (credit servicing) when a loan facility transitions to DISBURSED status and funds are credited to the customer account via MOD-001. Provides a dedicated disbursement signal distinct from facility_status_changed (which covers all loan status transitions). Required by MOD-026 (IFTI/CMIR trigger — large cash disbursements above threshold), MOD-016 (AML typology — large disbursement pattern), and MOD-042 (CDC for credit portfolio analytics).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
loan_account_id uuid
customer_id uuid
posting_id uuid Credit-leg posting reference from MOD-001
disbursed_amount string Fixed-point decimal — net disbursement after fees
principal_amount string Fixed-point decimal — gross principal
currency string ISO 4217
product_id string
product_type string PERSONAL_LOAN / CREDIT_LINE / OVERDRAFT / MORTGAGE / BUSINESS_LOAN
disbursement_account_id uuid Customer account receiving the credit
term_months integer
interest_rate string Decimal string
first_repayment_date date ISO 8601 date
jurisdiction string NZ / AU
channel string APP / BRANCH / API
idempotency_key string

Consumers: MOD-026 (IFTI/CMIR trigger — disbursements above reporting threshold), MOD-016 (AML typology — large disbursement monitoring), MOD-031 (ECL — marks facility as active for expected credit loss calculation), MOD-042 (CDC → Snowflake — credit portfolio analytics), MOD-063 (notification orchestration — disbursement confirmation to customer)


bank.credit.repayment_received

Emitted by MOD-001 after a scheduled or unscheduled loan repayment posting is committed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
loan_account_id uuid
customer_id uuid
posting_id uuid
repayment_amount string Fixed-point decimal
principal_component string Fixed-point decimal
interest_component string Fixed-point decimal
outstanding_balance_after string Fixed-point decimal
currency string ISO 4217
repayment_type string SCHEDULED / UNSCHEDULED / EARLY_REPAYMENT
idempotency_key string

Consumers: MOD-030 (stage allocation model), MOD-031 (ECL calculation), MOD-059 (credit bureau submission), MOD-065 (credit servicing & collections — clears arrears flag if applicable)


bank.credit.arrears_triggered

Emitted by MOD-065 when a loan account enters arrears following a missed payment.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
loan_account_id uuid
customer_id uuid
days_past_due integer
overdue_amount string Fixed-point decimal
currency string ISO 4217
idempotency_key string

Consumers: MOD-030 (stage allocation model — triggers stage migration), MOD-031 (ECL calculation — recalculates provision), MOD-059 (credit bureau submission), MOD-063 (notification orchestration — hardship outreach), MOD-040 (churn & health score — financial stress signal)


bank.credit.ecl_updated

Emitted by MOD-031 after each ECL recalculation cycle. Three run types produce this event: MONTHLY (month-end full portfolio), DAILY_INCREMENTAL (overnight sweep), and EVENT_TRIGGERED (on bank.credit.stage_allocated). Consumed by the GL posting engine and the risk platform for capital reporting.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id uuid ADR-031 trace propagation
ecl_run_id uuid Links to credit.ecl_runs(id) for run-level audit
loan_account_id uuid
jurisdiction string "NZ" / "AU" — needed by MOD-033 for capital framework selection
run_type string "MONTHLY" / "DAILY_INCREMENTAL" / "EVENT_TRIGGERED" — lets consumers distinguish month-end snapshots from intraday updates
stage integer 1, 2, or 3 (IFRS 9)
ecl_amount string Fixed-point decimal
previous_ecl_amount string Fixed-point decimal
currency string ISO 4217
pd string Probability of default decimal string
lgd string Loss given default decimal string
ead string Exposure at default decimal string
idempotency_key string

Consumers: MOD-001 (posting engine — GL provision entry), MOD-033 (RWA engine), MOD-036 (prudential return builder), MOD-042 (CDC → Snowflake)


bank.credit.stage_allocated

Emitted by MOD-030 after each IFRS 9 staging event (initial allocation, periodic reassessment, SICR trigger, or cure). Consumed by MOD-031 for ECL recalculation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id uuid ADR-031 propagation
loan_account_id uuid
customer_id uuid party_id
jurisdiction string "NZ" / "AU"
ifrs9_stage integer 1, 2, or 3
previous_ifrs9_stage integer 1, 2, 3, or null
trigger_reason string Enum — see credit.ifrs9_stage_allocations.trigger_reason
arrears_days integer ≥0
exposure_at_default string Fixed-point decimal
risk_rating string "A1".."E"or null — denormalised fromcredit.credit_scores` (AD k-7)
effective_date string YYYY-MM-DD
idempotency_key string

Consumers: MOD-031 (ECL trigger), MOD-033 (IRRBB/RWA capital engine), MOD-042 (CDC — Snowflake analytics)


bank.credit.application_accepted

Emitted by MOD-029 (accept-application handler) after the application status has transitioned to ACCEPTED (DB committed). Emission failure is non-fatal — the handler logs accept.event_publish_failed and still returns success to the client. Added as part of the MOD-162 build (k-10); MOD-029 patch is backwards-compatible.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
application_id uuid
customer_id uuid aka party_id
approved_amount string Decimal-as-string
currency string
jurisdiction string "NZ" / "AU"
product_type string PERSONAL_LOAN / CREDIT_LINE / OVERDRAFT / MORTGAGE / BUSINESS_LOAN / FLEXIBLE_FACILITY
idempotency_key string Recommended key: mod029:application-accepted:{application_id}
trace_id uuid ADR-031 propagation

Consumers: MOD-065 (loan account provisioning for standard products), MOD-162 (filters on product_type='FLEXIBLE_FACILITY' to create facility envelope)


bank.credit.facility_status_changed

Emitted by MOD-065 on every loan status transition (disbursement, arrears escalation, default, write-off, payoff).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id uuid
loan_account_id uuid
customer_id uuid
previous_loan_status string Enum — see credit.loan_accounts.loan_status
new_loan_status string Enum
arrears_days integer
idempotency_key string

Consumers: MOD-030 (stage allocation — arrears_triggered), MOD-031 (ECL recalculation), MOD-059 (CCR submission on DEFAULT — follow-on), MOD-022 (audit)


bank.credit.hardship_declared

Emitted by MOD-065 when a customer invokes their hardship rights.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id uuid
loan_account_id uuid
customer_id uuid
case_id uuid
channel string APP / BRANCH / API / EMAIL
idempotency_key string

Consumers: MOD-063 (customer notification), MOD-022 (audit)


bank.credit.hardship_resolved

Emitted by MOD-065 when a hardship case is closed with an outcome.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id uuid
loan_account_id uuid
customer_id uuid
case_id uuid
outcome string UPHELD / REJECTED
restructure_type string Nullable — PAYMENT_PAUSE / REDUCED_AMOUNT / TERM_EXTENSION / INTEREST_RATE_FREEZE
idempotency_key string

Consumers: MOD-063 (customer notification), MOD-022 (audit), MOD-031 (provisioning adjustment for restructured loans)


bank.credit.collateral_registered

Emitted by MOD-066 when a new security interest is registered against a credit facility.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
jurisdiction string NZ or AU
collateral_type string REAL_PROPERTY / VEHICLE / TERM_DEPOSIT / GUARANTEE / BUSINESS_ASSETS / OTHER
security_interest_type string
net_collateral_value string Fixed-point decimal
currency string ISO 4217
ltv_ratio string Nullable — present when outstanding principal known
ltv_breach boolean
registration_expiry_date string ISO date; nullable
idempotency_key string

Consumers: MOD-115 (LVR monitoring), MOD-033 (RWA), MOD-076 (compliance alerting)


bank.credit.collateral_revalued

Emitted by MOD-066 after each valuation record is committed. Carries both previous and current LTV breach state so consumers can derive cure without a separate event.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
valuation_id uuid FK to credit.collateral_valuations.id
estimated_value string Fixed-point decimal
net_collateral_value string Fixed-point decimal
currency string
ltv_ratio string Nullable
previous_ltv_breach boolean State before this revaluation
ltv_breach boolean State after this revaluation; cure = previous true, current false
model_version string
idempotency_key string

Consumers: MOD-115 (LVR monitoring), MOD-033 (RWA), MOD-031 (ECL provisioning)


bank.credit.collateral_ltv_breached

Emitted by MOD-066 only on ltv_breach false → true transitions. Cure detection is via the previous_ltv_breach / ltv_breach fields on bank.credit.collateral_revalued.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
ltv_ratio string Fixed-point decimal — the breaching ratio
product_policy_max_ltv string The policy cap that was exceeded
jurisdiction string
idempotency_key string

Consumers: MOD-115 (LVR monitoring), MOD-033 (RWA), MOD-076 (compliance alerting)


bank.credit.collateral_released

Emitted by MOD-066 on APPROVED release decision (not on REJECTED). Carries full governance trail for FR-200 audit.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
release_request_id uuid FK to credit.collateral_release_requests.id
approval_committee_ref string Governance ticket reference
approved_by_staff_id string
idempotency_key string

Consumers: MOD-115 (LVR monitoring), MOD-033 (RWA), MOD-031 (ECL provisioning)


bank.credit.collateral_renewal_due

Emitted by MOD-066 daily-expiry-sweep Lambda at the 90/30/7 day windows ahead of registration expiry.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
task_id uuid FK to credit.collateral_renewal_tasks.id
days_until_expiry int 90, 30, or 7
registration_authority string Nullable
registration_reference string Nullable
registration_expiry_date string ISO date
idempotency_key string

Consumers: MOD-076 (compliance alerting)


bank.credit.collateral_writeoff_violation

Emitted by MOD-066 consume-facility-status Lambda when a bank.credit.facility_status_changed event shows WRITE_OFF_PENDING for a loan that has active collateral with no APPROVED release request. Detection-only in v1 (FR-200 v1 alarm); prevention gate is MOD-065 follow-on.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid Required for MOD-076 on-call actionability
collateral_id uuid
release_request_id uuid Present if PENDING release request exists; null otherwise
collateral_status string
attempted_loan_status string WRITE_OFF_PENDING
jurisdiction string
idempotency_key string

Consumers: MOD-076 (compliance alerting — fires SNS alert to on-call)


bank.credit.property_security_registered

Emitted by MOD-115 when a property security instrument is registered against a mortgage at settlement (FR-521). Distinct from bank.credit.collateral_registered (MOD-066, which handles all collateral types via the staff-facing back-office flow) — this event is the customer-drawdown-path registration triggered by MOD-116.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid FK to credit.collateral_register.id (MOD-066 row)
loan_account_id uuid
customer_id uuid
jurisdiction string NZ or AU
property_subtype string RESIDENTIAL / RURAL_RESIDENTIAL / APARTMENT / TOWNHOUSE
borrower_intent string OWNER_OCCUPIER or INVESTOR
title_reference string LINZ / LRS title reference
lvr_pct string Fixed-point decimal — LVR at registration
policy_max_lvr string Fixed-point decimal
policy_breach boolean Should be false at registration (FR-521 GATE blocks breaching registrations)
idempotency_key string

Consumers: MOD-033 (RWA), MOD-076 (compliance alerting)


bank.credit.lvr_breach_detected

Emitted by MOD-115 within 5 minutes of detecting that a loan's LVR has breached its policy maximum (FR-523). Emitted by both the daily-lvr-sweep Lambda (catch-up) and the consume-collateral-revalued Lambda (event-triggered, primary path for the 5-min SLA).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
collateral_id uuid
customer_id uuid
snapshot_id uuid FK to credit.lvr_snapshots.id for the breaching snapshot
lvr_pct string Fixed-point decimal — the breaching ratio
policy_max_lvr string
lvr_band string e.g. 80-90 or >90
borrower_intent string OWNER_OCCUPIER or INVESTOR
jurisdiction string
idempotency_key string

Consumers: MOD-063 (customer notification), MOD-076 (compliance alerting), MOD-033 (RWA)


bank.credit.security_discharged

Emitted by MOD-115 when a property security instrument is discharged following full loan repayment (FR-524). The discharge is triggered by MOD-116's payoff handler, which posts the final repayment to MOD-001 and then calls MOD-115's discharge-property-security URL with the resulting posting_id as the idempotency key. Distinct from bank.credit.collateral_released (MOD-066 — staff-initiated committee-approval release flow).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
collateral_id uuid
loan_account_id uuid
customer_id uuid
posting_id uuid The final repayment posting from MOD-001; idempotency anchor for replay safety
title_reference string LINZ / LRS title reference
jurisdiction string
idempotency_key string

Consumers: MOD-066 (collateral register status update), MOD-033 (RWA), MOD-031 (ECL provisioning), MOD-076 (compliance alerting)


bank.credit.mortgage_rate_elected

Emitted by MOD-116 (elect-rate Lambda) when a customer elects a rate type for their mortgage — either fixing for a new term or choosing to revert to variable. FR-525.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
rate_period_id uuid Newly created credit.mortgage_rate_periods row
rate_type string FIXED or VARIABLE
interest_rate string Fixed-point decimal
fixed_term_months int Present when rate_type = 'FIXED'
idempotency_key string

Consumers: MOD-033 (balance sheet rate re-pricing), MOD-076 (audit)


bank.credit.mortgage_rate_expired

Emitted by MOD-116 (daily-fixed-rate-sweep Lambda) when a fixed rate period reaches its end_date and the loan auto-reverts to variable. FR-525.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
expired_rate_period_id uuid The EXPIRING → EXPIRED row
new_rate_period_id uuid New VARIABLE period created on reversion
reverted_to_rate string Fixed-point decimal (current variable rate)
idempotency_key string

Consumers: MOD-033 (rate re-pricing), MOD-076 (audit)


bank.credit.fixed_rate_expiring

Emitted by MOD-116 (daily-fixed-rate-sweep Lambda) when a fixed rate period crosses the 90, 60, or 30-day notification boundary. FR-525 disclosure obligations.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
rate_period_id uuid
days_remaining int 90, 60, or 30
end_date date Fixed period expiry date
idempotency_key string loan_account_id + ':' + days_remaining + ':' + rate_period_id

Consumers: MOD-076 (audit), MOD-063 (notification dispatch — when built)


bank.credit.break_cost_disclosed

Emitted by MOD-116 (request-break-cost-quote Lambda) when a break cost quote is calculated and disclosed to the customer. CON-005 audit record. FR-526.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
disclosure_id uuid credit.break_cost_disclosures.id
break_cost_amount string Fixed-point decimal
currency string NZD or AUD
expires_at ISO8601 Quote validity window
idempotency_key string

Consumers: MOD-076 (audit / CON-005 compliance record)


bank.credit.mortgage_discharged

Emitted by MOD-116 (discharge-mortgage Lambda) after full discharge: final repayment posted to MOD-001, MOD-115 security released, and credit.loan_accounts.loan_status set to PAID_OFF. FR-527.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
final_posting_id uuid MOD-001 posting_type='PAYMENT' final repayment posting
break_cost_included boolean True if a fixed rate period was active at discharge
discharge_idempotency_key string Customer-supplied discharge reference
idempotency_key string

Consumers: MOD-066 (audit — collateral register cross-check), MOD-031 (ECL — loan closed, provision reversal), MOD-076 (compliance alerting)


bank.credit.mortgage_notification_dispatched

Emitted by MOD-116 (daily-fixed-rate-sweep and consume-repayment-missed Lambdas) when a mortgage notification stub fires. In v1 audit-only mode, this event provides observability into MOD-063's pending work queue until the notification orchestration module ships. FR-525 / FR-528.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
loan_account_id uuid
customer_id uuid
notification_id uuid credit.mortgage_notifications.id
notification_type string See mortgage_notifications.notification_type CHECK
channel string STUB in v1
idempotency_key string

Consumers: MOD-076 (observability — tracks v1 stub backlog for MOD-063 handover)


bank.credit.overdraft_facility_created

Emitted by MOD-117 create-facility Lambda when an overdraft facility is activated and the paired credit.loan_accounts row is created. FR-529.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid credit.overdraft_facilities.facility_id
account_id uuid Linked SD01 transaction account
loan_account_id uuid Paired credit.loan_accounts row (product_type='OVERDRAFT')
approved_limit string Fixed-point decimal
interest_rate_pct string Annual rate as decimal string
facility_fee string Monthly fee as decimal string
currency string ISO 4217
idempotency_key string

Consumers: MOD-031 (ECL — OVERDRAFT asset class now present in loan_accounts), MOD-059 (CCR — new credit exposure)


bank.credit.overdraft_limit_changed

Emitted by MOD-117 adjust-limit Lambda on any limit increase or reduction. FR-529.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid
account_id uuid
loan_account_id uuid
old_limit string Fixed-point decimal
new_limit string Fixed-point decimal
change_reason string INCREASE / REDUCTION / REVIEW
idempotency_key string

Consumers: MOD-031 (ECL — limit change affects EAD for revolving product), MOD-059 (CCR)


bank.credit.overdraft_interest_charged

Emitted by MOD-117 monthly-close Lambda after the aggregated monthly interest debit is posted to MOD-001. FR-530.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid
account_id uuid
posting_id uuid MOD-001 posting reference
period_start string ISO date — first day of the billing month
period_end string ISO date — last day of the billing month
total_interest string Fixed-point decimal — sum of daily_interest for the period
accrual_days_count int Number of days with a negative balance in the period
currency string ISO 4217
idempotency_key string (facility_id, period_end)

Consumers: MOD-076 (ops dashboard — monthly interest income), MOD-031 (EIR accrual confirmation)


bank.credit.overdraft_fee_assessed

Emitted by MOD-117 monthly-close Lambda. Covers both charge and waiver outcomes with a single event type. FR-531.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid
account_id uuid
period_month string YYYY-MM
fee_amount string Fixed-point decimal; "0.00" when waived
waived boolean True when balance was positive throughout the month and fee is waived
posting_id uuid Present when waived=false; MOD-001 posting reference
currency string ISO 4217
idempotency_key string (facility_id, period_month)

Consumers: MOD-110 (fee waiver record — when waived=true), MOD-076 (ops dashboard)


bank.credit.overdraft_hardship_flag

Emitted by MOD-117 daily-accrual-sweep Lambda when consecutive_drawn_days reaches 60. FR-532. Triggers MOD-007 hardship flag and MOD-063 customer notification (both v1 stubs).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid
account_id uuid
loan_account_id uuid
consecutive_drawn_days int Value at threshold trigger (≥ 60)
flagged_at ISO8601
idempotency_key string (facility_id, flagged_at date) — one event per day per facility at threshold

Consumers: MOD-007 (hardship flag — v1 stub), MOD-063 (customer notification — v1 stub), MOD-065 (collections — hardship escalation path)


bank.credit.overdraft_unarranged_detected

Emitted by MOD-117 when a negative balance is detected on an account with no active overdraft facility (timing edge case from payment settlement or fee debits).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
account_id uuid
negative_balance string Fixed-point decimal (negative value)
detected_at ISO8601
idempotency_key string (account_id, detected_at date)

Consumers: MOD-063 (immediate customer notification — v1 stub), MOD-076 (ops alerting — manual review queue)


bank.credit.overdraft_facility_closed

Emitted by MOD-117 when a facility is closed (balance repaid, limit zeroed, loan_accounts.loan_status set to PAID_OFF).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
facility_id uuid
account_id uuid
loan_account_id uuid
close_reason string CUSTOMER_REQUEST / BANK_INITIATED / ACCOUNT_CLOSED
final_balance string Fixed-point decimal at closure (should be "0.00")
closed_at ISO8601
idempotency_key string

Consumers: MOD-031 (ECL — remove from active portfolio), MOD-059 (CCR — remove from credit exposure)


bank.credit.construction_schedule_created

Emitted by MOD-121 (create-schedule handler) when a new construction loan drawdown schedule is created and linked to an existing mortgage.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
trace_id uuid
schedule_id uuid
loan_account_id uuid
party_id uuid
total_facility string Fixed-point decimal
construction_end_date string ISO8601 date
tranche_count int Number of tranches on the schedule
currency string ISO 4217

Consumers: MOD-063 (customer notification — schedule confirmed)


bank.credit.construction_milestone_certified

Emitted by MOD-121 (certify-tranche handler) when a tranche milestone is certified by the valuer/certifier and the tranche transitions to certified status.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
trace_id uuid
schedule_id uuid
tranche_id uuid
tranche_number int
certifier_reference string
certification_date string ISO8601 date
status string "certified"

Consumers: MOD-063 (customer notification — milestone approved)


bank.credit.construction_drawdown_posted

Emitted by MOD-121 (request-drawdown handler) after MOD-001 PAYMENT posting succeeds and the tranche transitions to drawn status.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
trace_id uuid
schedule_id uuid
tranche_id uuid
drawdown_amount string Fixed-point decimal
total_drawn string Cumulative drawn after this posting
posting_id uuid MOD-001 posting reference

Consumers: MOD-063 (customer notification — funds disbursed)


bank.credit.construction_phase_completed

Emitted by MOD-121 when the construction phase ends: either all tranches are drawn (all_tranches_drawn) or the construction_end_date is reached without full drawdown (construction_end_date_reached). Triggers amortisation setup in MOD-112.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
trace_id uuid
schedule_id uuid
total_drawn string Fixed-point decimal — final drawn amount at completion
conversion_date string ISO8601 date
trigger_reason string all_tranches_drawn | construction_end_date_reached

Consumers: MOD-112 (amortisation schedule setup — AD k-7), MOD-063 (customer notification — construction phase complete)


bank.credit.loan_balance_updated

Emitted by MOD-121 (request-drawdown handler) after each successful drawdown to notify downstream systems of the updated principal balance. This event is the interface contract between MOD-121 (publisher) and MOD-115 (consumer — consume-loan-balance-updated handler for LVR refresh; AD k-8).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
trace_id uuid
loan_account_id uuid
previous_balance string Fixed-point decimal
new_balance string Fixed-point decimal
reason string "construction_drawdown"

Publisher: MOD-121 (construction drawdown engine) Consumers: MOD-115 (LVR refresh — consume-loan-balance-updated handler, already deployed)


bank.credit.facility_created

Emitted by MOD-162 (create-facility handler) when a Flexible Loan Facility is provisioned from an accepted credit decision.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
facility_id uuid
customer_id uuid
credit_decision_id uuid
application_id uuid
facility_limit string Decimal-as-string
currency string
expiry_date string ISO8601 date
jurisdiction string "NZ" / "AU"
initial_floating_component_seq int
initial_loan_account_id uuid
status string "ACTIVE"
trace_id uuid

Consumers: MOD-030 (IFRS 9 stage allocation), MOD-042 (CDC — Snowflake analytics)


bank.credit.component_created

Emitted by MOD-162 (create-component handler) when a new facility component is added. Carries component_type so downstream consumers can filter without joining (k-7 ruling).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
facility_id uuid
component_id uuid loan_facility_components.id
component_seq int
component_type string "FIXED" / "FLOATING"
loan_account_id uuid Backing loan_accounts row
principal_amount string Decimal-as-string
interest_rate string Decimal-as-string
term_months int
start_date string ISO8601 date
maturity_date string ISO8601 date
amortisation_type string
trace_id uuid

Consumers: MOD-112 (amortisation schedule creation — filters on component_type='FIXED'), MOD-031 (EIR calculation), MOD-163 (break-cost setup — component matures)


bank.credit.component_status_changed

Emitted by MOD-162 (update-component-status, daily-maturity-sweep, reprice-floating handlers) on any status transition of a facility component.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
facility_id uuid
component_id uuid
component_seq int
loan_account_id uuid
old_status string
new_status string
trigger_reason string
remaining_principal string Decimal-as-string
trace_id uuid

Consumers: MOD-030 (IFRS 9 stage re-allocation), MOD-042 (CDC)


bank.credit.effective_rate_changed

Emitted by MOD-162 whenever any component event causes the facility's blended effective interest rate to change (k-6 recompute).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
source string "bank.credit"
facility_id uuid
customer_id uuid
previous_effective_rate string Decimal-as-string
new_effective_rate string Decimal-as-string
trigger_reason string
trace_id uuid

Consumers: MOD-031 (IFRS 9 EIR re-compute), MOD-113 (customer statements — when built)

bank.credit.break_cost_acknowledged

Emitted by MOD-163 (break-cost calculator) after a customer acknowledges a BINDING break-cost quote via MOD-050 and the calculation row transitions to status='ACKNOWLEDGED'.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id string
break_cost_calculation_id uuid FK credit.break_cost_calculations.id
loan_facility_id uuid
component_id uuid
party_id string
break_cost string Signed decimal: positive = customer pays; negative = break benefit (k-7)
currency string "NZD" | "AUD"
outstanding_principal string
remaining_term_months int
contracted_rate string
current_market_rate string
formula_version string e.g. "v1.0.0" — for downstream consumers branching on formula evolution
valid_until ISO8601 MOD-065 MUST apply before this expires
acknowledged_at ISO8601
disclosure_acknowledgement_id uuid MOD-050 disclosure id
idempotency_key string mod163:break-cost-acknowledged:{calculation_id}
jurisdiction string "NZ" | "AU"

Consumers: MOD-065 (credit servicing & collections — prepayment processor; same bank-credit bus, no cross-bus grant needed). When break_cost < 0 (break benefit), MOD-065 posts the credit to the customer account via MOD-001 at prepayment time. MOD-132 (loan restructure & variation — variation-path break cost gate).


bank.credit.loan_variation_requested

Emitted by MOD-132 (loan restructure & variation workflow) when a customer submits a loan variation request. Triggers the materiality assessment path (MOD-029) and customer acknowledgement notification.

Bus: bank-credit · Source: bank.credit · Detail-type: loan_variation_requested

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id string
variation_id uuid FK credit.loan_variations.id
loan_account_id uuid
party_id string
variation_type string One of TERM_EXTENSION, RATE_TYPE_CHANGE, REPAYMENT_FREQUENCY_CHANGE, CAPITALISE_ARREARS, COMBINATION
requires_assessment boolean FR-589 materiality result — true for material variations
requires_break_cost boolean True when variation involves early repayment or fixed-rate conversion
jurisdiction string "NZ" | "AU"
idempotency_key string mod132:variation-requested:{variation_id}

Consumers: MOD-029 (credit decision engine — affordability re-assessment on material variations), MOD-053 (notification service — request acknowledgement to customer).


bank.credit.loan_variation_confirmed

Emitted by MOD-132 after all gates pass and the variation is confirmed — disclosure acknowledged, assessment passed (if required), break cost acknowledged (if applicable), and the variation is persisted as effective.

Bus: bank-credit · Source: bank.credit · Detail-type: loan_variation_confirmed

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id string
variation_id uuid FK credit.loan_variations.id
loan_account_id uuid
party_id string
variation_type string
before_terms object Snapshot of prior rate, term, repayment frequency, repayment amount
after_terms object Confirmed new terms
break_cost_calculation_id uuid Present when break cost was applicable; FK credit.break_cost_calculations.id
disclosure_acknowledgement_id uuid MOD-050 disclosure acknowledgement id — CON-004 GATE evidence
confirmed_at ISO8601
jurisdiction string "NZ" | "AU"
idempotency_key string mod132:variation-confirmed:{variation_id}

Consumers: MOD-112 (amortisation schedule engine — regenerate schedule via originate-schedule with generated_by='restructure'), MOD-050 (disclosure management — confirmation disclosure dispatch), MOD-053 (notification service — confirmation notification to customer).


bank.credit.loan_variation_rejected

Emitted by MOD-132 when a variation request is rejected — by the credit assessment engine, by the customer declining the disclosed terms, or by a system validation failure.

Bus: bank-credit · Source: bank.credit · Detail-type: loan_variation_rejected

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
trace_id string
variation_id uuid FK credit.loan_variations.id
loan_account_id uuid
party_id string
variation_type string
rejection_reason string Human-readable reason description
rejected_by string "ASSESSMENT_FAILED" | "CUSTOMER_DECLINED" | "SYSTEM"
rejected_at ISO8601
jurisdiction string "NZ" | "AU"
idempotency_key string mod132:variation-rejected:{variation_id}

Consumers: MOD-053 (notification service — rejection notification to customer).


SD06 — Analytics & Risk (bank-risk-platform bus)

bank.risk.capital_ratio_breach

Emitted by MOD-033 (ALERT_CAPITAL_RATIO_BREACH Snowflake Alert, 5-minute poll) when any capital ratio falls below the regulatory minimum or internal management buffer in risk_capital.capital_config. MOD-033 is dbt + DCM only — no Lambda; the alert fires directly from Snowflake via BANK_SNS_INTEGRATION and publishes to the bank-risk-platform EventBridge bus.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: capital_ratio_breach

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id uuid
run_id uuid Matches risk_capital.capital_run_audit.run_id
ratio_type string CET1 / TIER1 / TOTAL_CAPITAL
jurisdiction string NZ / AU
ratio_value string Fixed-point decimal
regulatory_minimum string Fixed-point decimal — from risk_capital.capital_config
internal_buffer string Fixed-point decimal — from risk_capital.capital_config
breach_severity string regulatory_minimum / internal_buffer
position_date string YYYY-MM-DD
calculated_at ISO8601

Consumers: MOD-076 (alarm-intake — routes to CFO + CRO per FR-207), MOD-058 (breach notification engine)

Note: MOD-036 (prudential return builder) is an SD06 Snowflake-native module. It consumes RWA and capital ratio data by referencing MOD-033's output schema via dbt source() — not by subscribing to this event (ADR-046).


bank.risk.liquidity_ratio_updated

Emitted by MOD-032 after each LCR/NSFR calculation run.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
calculation_id uuid
lcr string Percentage as decimal string
nsfr string Percentage as decimal string
lcr_breach_flag boolean
nsfr_breach_flag boolean
idempotency_key string

Consumers: MOD-063 (notification orchestration — Board/ALCO alert on breach)

Note: MOD-036 (prudential return builder) is an SD06 Snowflake-native module. It consumes LCR/NSFR data by referencing MOD-032's output schema via dbt source() — not by subscribing to this event (ADR-046).


bank.risk.customer_risk_score_updated

Emitted by MOD-039 when a customer's risk score is recalculated and the score or tier changes.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: customer_risk_score_updated

Subscribers read bus ARN and detail-type from SSM: /bank/{env}/risk-platform/risk-customer/event-source-name and /bank/{env}/risk-platform/risk-customer/event-detail-type.

Field Type Required Notes
event_id uuid Envelope field
event_time ISO8601 Envelope field — UTC
schema_version string
party_id uuid Cross-domain stable identifier (SD02 party.parties.id)
composite_risk_score float 0–100 numeric score (risk scores are not money — float is correct here)
risk_tier string LOW / MEDIUM / HIGH / CRITICAL
previous_risk_tier string Omitted on first score
tier_changed boolean
score_version string Model version identifier e.g. "v1-abc123def456"
triggering_event string Cause of recalculation e.g. "sanctions_hit"
scored_at ISO8601 When the score was calculated — use as idempotency anchor with party_id
idempotency_key string Subscriber deduplication key

Idempotency: Subscribers MUST be idempotent on (party_id, scored_at) — the EB publisher Lambda may republish rows if it crashes before advancing its cursor.

Consumers: MOD-010 (CDD tier assignment — may trigger tier upgrade), MOD-016 (typology engine — threshold adjustment), MOD-039 itself publishes; MOD-079 (decision publication service — write-back)


bank.risk.fraud_alert_raised

Emitted by MOD-023 (transaction fraud scorer) or MOD-055 (onboarding fraud scoring) when a fraud probability exceeds the configured alert threshold.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id uuid ADR-031 propagation
alert_id uuid
alert_source string TRANSACTION_FRAUD / ONBOARDING_FRAUD
entity_type string CUSTOMER / PAYMENT / APPLICATION
entity_id uuid
fraud_score string Decimal string "0.00""1.00"
action_taken string BLOCK / STEP_UP_AUTH / ALERT_ONLY
idempotency_key string

Consumers: MOD-020 (pre-payment validation — blocks if action_taken is BLOCK), MOD-018 (alert case management), MOD-024 (device & session intelligence), MOD-063 (notification orchestration)


bank.risk.irrbb_outlier_breach

Emitted by MOD-035 (IRRBB model) when EVE sensitivity exceeds the BCBS supervisory outlier threshold (15% of Tier 1 capital) in any scenario. Published via Snowflake Alert → SNS → alert-publish Lambda → EventBridge.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id string
run_id string MOD-035 IRRBB_RUNS row identifier
jurisdiction string NZ / AU
scenario_code string PARALLEL_UP / PARALLEL_DOWN / STEEPENER / FLATTENER / SHORT_UP / SHORT_DOWN
shock_basis string BCBS / RBNZ / APRA
eve_change string Decimal string — EVE delta under scenario
eve_change_pct_tier1 string Decimal string — e.g. "0.17" for 17%
tier1_capital string Decimal string — snapshot at calc time
supervisory_threshold string "0.15" (BCBS threshold)
position_date string ISO 8601 date
calculated_at ISO8601
idempotency_key string

Consumers: MOD-076 (observability & dashboards — ALCO/CRO escalation alert), MOD-036 (prudential returns builder — breach flag on regulatory submission)


bank.risk.stress_test_completed

Emitted by MOD-034 after a stress test scenario run completes.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
run_id uuid
scenario_name string Human-readable scenario identifier
scenario_type string REGULATORY / INTERNAL / REVERSE
cet1_post_stress string Decimal string
lcr_post_stress string Decimal string
passed boolean True when all thresholds met
idempotency_key string

Consumers: MOD-036 (prudential return builder), MOD-048 (system decision log)


bank.risk.customer_churn_at_risk_identified

Emitted by MOD-040 once per customer per weekly scoring cycle when a customer transitions into the HIGH_CHURN segment (churn_probability_90d > 0.7) for the first time that week. Published by the outreach cron Lambda after reading V_CHURN_AT_RISK_NEW_ENTRIES.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: customer_churn_at_risk_identified

Subscribers read bus ARN and detail-type from SSM: /bank/{env}/risk-platform/churn/event-source-name and /bank/{env}/risk-platform/churn/outreach-lambda-arn.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
idempotency_key string
customer_id uuid
churn_probability_90d string Fixed-point decimal string
churn_segment string HIGH_CHURN
previous_segment string Segment before this week's score
financial_health_score string Fixed-point decimal string (0–100)
health_segment string HEALTHY | STRETCHED | STRESSED
primary_churn_signal string Top contributing signal code
model_version string
scored_at ISO8601

Consumers: MOD-018 (case management — creates operations work queue task per FR-234), MOD-107 (NBA engine — proactive retention offer trigger)


bank.risk-platform.market_rates_updated

Emitted by MOD-085 after each market-rates ingestion and normalisation run. Published on the bank-risk-platform EventBridge bus.

Field Type Required Notes
trace_id string
refresh_id uuid Unique ID for this ingestion run
refresh_type string SCHEDULED / MANUAL
provider_id string Source provider identifier
pairs_updated array List of currency pair / curve identifiers refreshed
event_time ISO8601

Consumers: MOD-025 (rate lock — SD04), MOD-071 (payment validation — SD04)

Note: This event is the ADR-047 confirmation event — it signals that the MOD-085 write-back Lambda has successfully written fresh reference data to SD04 Postgres. SD04 operational modules subscribe to this event to invalidate caches and trigger downstream processing. MOD-032, MOD-035, and MOD-086 are SD06 Snowflake-native modules — they consume market rate data by referencing the market.* schema directly via dbt source() and must not subscribe to this event (ADR-046 § 5).


bank.risk-platform.data_quality_run_failed

Emitted by MOD-038 when a dbt test run exits non-zero — i.e. at least one gated dataset scores below the configured quality threshold. Published on the bank-risk-platform EventBridge bus for human alerting only. The downstream risk calculation halt is enforced by the Snowflake Task DAG dependency (Task exits non-zero → dependent Tasks do not start), not by this event.

Field Type Required Notes
trace_id string
run_id uuid Unique ID for this DQ run
failed_datasets array List of dataset names that failed
quality_scores object Map of dataset → score (e.g. {"raw_cdc_core.postings": 0.962})
threshold number Configured minimum quality score
reconciliation_breaks integer Count of open reconciliation breaks this run
event_time ISO8601

Consumers: MOD-076 (observability platform — alerts data engineering team)

Note: This event is a human notification. It is not a machine gate. SD06 modules (MOD-032/033/035/036) must not subscribe to this event to decide whether to run — their execution is blocked by the Task DAG dependency on MOD-038's Task completing successfully.


bank.risk-platform.unattributed_cost_threshold_exceeded

Emitted by MOD-098 when the daily unattributed cost share exceeds the configured threshold. Triggers ops alert via MOD-076.

Field Type Required Notes
trace_id string
alert_id uuid
cost_date string ISO 8601 date, e.g. 2026-04-30
total_aws_cost_usd number Total AWS cost for the day
unattributed_cost_usd number Cost not attributable to a module
unattributed_share number Fraction 0–1
threshold number Configured threshold fraction
event_time ISO8601

Consumers: MOD-076 (observability platform — alarm fanout), ops team


bank.transactions.categorised

Emitted by MOD-041 for every transaction row newly visible in V_CATEGORISED_CURRENT since the last cursor position. The EB-publisher Lambda fires every minute (aligned with the 1-minute DT target_lag). Schema locked at v1.0 — JSON Schema at docs/event-schemas/bank.transactions.categorised.v1.schema.json in bank-risk-platform.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: transactions_categorised

Field Type Required Notes
event_id uuid Per-event UUID generated by publisher Lambda
event_time ISO8601 UTC — when the Lambda emitted the event
schema_version string "1.0"
trace_id string OpenTelemetry trace context (AWS_LAMBDA_REQUEST_ID)
idempotency_key string SHA-256 hex of posting_id\|model_version — consumers deduplicate on this; cursor-not-advanced retries produce identical keys
posting_id string SD01 accounts.postings.id — the categorisation overlay key
customer_id string
jurisdiction string NZ or AU — per scope ruling k-2; needed by MOD-033 and MOD-036 downstream
merchant_name string|null Normalised location name from risk_customer.merchant_directory (e.g. "Caltex – Parnell"); null when normaliser had no match
logo_url uri|null CDN-prefixed chain logo URL; publisher Lambda prefixes /bank/{env}/risk-platform/merchant-assets/cdn-base-url from SSM onto the relative path stored in the DT; null when directory entry has no logo
merchant_location_map_url uri|null CDN-prefixed per-location static map URL; location-level (Caltex Parnell ≠ Caltex Takapuna per scope ruling k-4); null for non-card transactions or unlisted locations
mcc string|null ISO 18245 4-digit MCC; from SD04 payment record or directory match; null when neither source has it
category_l1 string Top-level spend category (e.g. GROCERIES, TRANSPORT); OTHER when model confidence < 0.60
category_l2 string|null Sub-category (e.g. SUPERMARKET, FUEL); null when category_l1 is OTHER or below L2 threshold
categorisation_confidence string Decimal-string in [0.0000, 1.0000] (e.g. "0.9234") — serialised as string to preserve precision; backed by NUMBER(5,4) in the DT
model_version string Champion model version, format v<YYYY-MM-DD>-<6-char-hash>

Consumers: MOD-042 → SD08 dashboard insight feed (FR-240 spend-by-category refresh); MOD-042 → SD01 enrichment write-back (FR-238 — populates merchant_canonical, merchant_logo_id, category on the source posting in Postgres); MOD-070 (transaction history — cross-bus subscriber; updates enrichment columns on app.transaction_view rows matching posting_id)

Note: Amount is intentionally absent — money is the source-of-truth in SD01 accounts.postings. Consumers that need the transaction amount look it up via posting_id.


bank.statutory.report_produced

Emitted by MOD-080 after a successful period-close run: trial balance, IFRS statements, and S3 archive all complete. Published on the bank-risk-platform bus.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
period_id string References statutory.reporting_periods
period_type string MONTHLY / QUARTERLY / ANNUAL
period_end_date string ISO date
report_types_produced array e.g. ["TRIAL_BALANCE","P&L","BALANCE_SHEET","CASH_FLOW"]
s3_archive_path string S3 URI of the archived report package
trial_balance_run_id uuid FK to statutory.report_runs.id for lineage
gl_lines_count int Number of GL lines in the trial balance
idempotency_key string

Consumers: MOD-036 (prudential return builder), MOD-037 (AML reporting)


bank.statutory.reconciliation_variance_detected

Emitted by MOD-080 reconciliation Lambda when Snowflake trial balance diverges from SD01 accounts.balance beyond the configured tolerance. Blocks the ERP push. Published on the bank-risk-platform bus.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
period_id string
total_variance_dollars string Fixed-point decimal — aggregate absolute variance
gl_lines_with_variance_count int Number of GL lines exceeding tolerance
max_variance_dollars string Largest single-line variance
idempotency_key string

Consumers: MOD-076 (ops alerting)


bank.regulatory.wiki_sync_completed

Emitted by MOD-056 wiki-import Lambda after each successful sync from the bank-wiki AI context pages. Signals that the REGULATORY.WIKI_* tables in Snowflake are up to date with the latest compiled wiki output.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
sync_run_id uuid FK to regulatory.wiki_import_log.run_id
policies_imported int Total policy rows upserted
modules_imported int Total module rows upserted
satisfaction_entries_imported int Total wiki_policy_satisfaction rows upserted
synced_at ISO8601 Timestamp of the completed sync
idempotency_key string

Consumers: CCO compliance dashboard (Streamlit refresh trigger)


bank.regulatory.obligation_deadline_approaching

Emitted by MOD-056 deadline-alerter Lambda at 09:00 daily, one event per time-bound obligation within the configured alert window (default 90 days) with no compliance evidence recorded for the current obligation period.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
policy_code string e.g. "REP-006"
policy_title string
risk_domain string e.g. "D08"
due_date string ISO date of the obligation deadline
days_until_due int Calendar days remaining
has_evidence boolean Always false when this event fires
idempotency_key string Deduplication key: (policy_code, due_date)

Consumers: MOD-076 (ops alerting — SNS to CCO), CCO dashboard

Note: The DCM alert ALERT_OBLIGATION_DEADLINE_APPROACHING routes independently to MOD-076 SNS via SYSTEM$SEND_SNS_MESSAGE. This EB event is the structured machine-readable counterpart for non-alarm subscribers (same pattern as MOD-080's variance event vs alarm).


bank.regulatory.policy_without_satisfaction

Emitted by MOD-056 when the NFR-011 check (V_POLICIES_WITHOUT_SATISFACTION) finds any active wiki policy with zero satisfying module entries. NFR-011 threshold is zero — any row in this view is a compliance gap.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
policy_code string The policy with no satisfying module
policy_title string
risk_domain string
jurisdiction string NZ / AU / NZ + AU / Global
detected_at ISO8601 When the check ran
idempotency_key string (policy_code, detected_at date) — one event per policy per day

Consumers: MOD-076 (ops alerting — critical gap notification to CCO and CTO)


bank.risk-platform.model_register_entry_created

Emitted by MOD-173 when a new model is added to RISK_MGMT.MODEL_REGISTER (initial registration). Provides visibility to compliance and governance consumers without polling.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: model_register_entry_created

Field Type Required Notes
event_id uuid Client-generated
event_time ISO8601 UTC
schema_version string "1.0.0"
model_id string e.g. MOD-028
model_name string
model_type string CREDIT | MARKET | LIQUIDITY | OPERATIONAL | AML | OTHER
tier integer 1, 2, or 3
regulator string RBNZ | APRA | BOTH | INTERNAL
evidence_pack_complete boolean True if all 10 DT-013 artefacts are present at registration time
idempotency_key string model_register_created:{model_id}

Consumers: MOD-076 (alarm intake — new model registered), MOD-056 (compliance visibility — optional integration per yaml, v1 additive).


bank.risk-platform.model_validation_due_soon

Emitted by MOD-173 (DCM alert ALERT_VALIDATION_OVERDUE + EB publisher) once per overdue-or-imminently-due model per day. Feeds the compliance team's validation scheduling workflow.

Bus: bank-risk-platform · Source: bank.risk-platform · Detail-type: model_validation_due_soon

Field Type Required Notes
event_id uuid Client-generated
event_time ISO8601 UTC
schema_version string "1.0.0"
model_id string
model_name string
tier integer
validator_role string Assigned validator if set
next_validation_due string ISO 8601 date
days_overdue integer Negative = days remaining; positive = days past due
evidence_pack_complete boolean
idempotency_key string model_validation_due:{model_id}:{due_date}

Consumers: MOD-076 (alarm intake — overdue validation alert to risk team), MOD-056 (compliance visibility — optional).


SD07 — Data Platform (bank-platform bus)

bank.platform.decision_published

Emitted by MOD-079 after a Snowflake decision result is written back to the Neon operational database. Signals to consumers that a new decision is available to read.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
decision_id uuid Matches the decision_id in the decision publication contract
entity_type string APPLICATION / CUSTOMER / PAYMENT
entity_id string
decision_type string e.g. ONBOARDING / CREDIT / RISK_SCORE
decision_status string ACCEPT / REFER / REJECT / HOLD / CLEAR
target_table string Neon schema.table where result was written
idempotency_key string

Consumers: MOD-062 (workflow orchestration — resumes paused workflows), MOD-010 (CDD tier assignment), MOD-028 (credit score), MOD-048 (system decision log)


bank.platform.decision_applied

Emitted by the consuming service after it reads a published decision and applies the operational state change. Provides end-to-end traceability.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
decision_id uuid
applied_by_module string e.g. MOD-010
state_change string Human-readable description of what changed
idempotency_key string

Consumers: MOD-048 (system decision log — audit trail), MOD-047 (agent action logger)


bank.platform.notification_sent

Emitted by MOD-063 after a customer or operator notification is dispatched.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
notification_id uuid
recipient_id uuid customer_id or agent_id
channel string PUSH / SMS / EMAIL / IN_APP
template_id string
causal_event_id uuid Event that triggered this notification
idempotency_key string

Consumers: MOD-048 (system decision log), MOD-047 (agent action logger — for agent-directed notifications)


bank.platform.notification_dispatched

Emitted by MOD-063 after a campaign-level notification dispatch completes, when the inbound trigger event carried an external_trigger block identifying the requesting module. Enables upstream modules to close the loop on their advance-notice obligation (FR-574 / CON-005).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
trace_id string Propagated from the inbound trigger event
notification_id string MOD-063 internal dispatch identifier
dispatched_at ISO8601 Latest per-recipient send timestamp
recipient_count number Total customers dispatched to (v1: always 1 per invocation)
external_trigger object { module: string, proposal_id: string, ...string fields } — verbatim from trigger event

Consumers: MOD-127 (product config panel — flips notification_confirmed_at from optimistic v1 timestamp to actual dispatch time; filter: detail.external_trigger.module = "MOD-127")


bank.platform.workflow_step_completed

Emitted by MOD-062 when a workflow step completes, enabling choreography-based workflow advancement.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
workflow_id uuid
workflow_type string e.g. ONBOARDING / KYC_REVIEW / CREDIT_APPLICATION
step_name string
step_result string PASS / FAIL / REFER / SKIP
next_step string Omitted when workflow is terminal
idempotency_key string

Consumers: MOD-062 (itself — advances to next step), MOD-064 (operations work queue — creates task if REFER)


bank.platform.secret_rotated

Emitted by MOD-045 after a secret rotation event in AWS Secrets Manager completes successfully. Allows consumers to refresh cached credentials.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
secret_arn string ARN — not the secret value
secret_name string Logical name e.g. bank-core/db-password
rotation_reason string SCHEDULED / MANUAL / BREACH_RESPONSE
idempotency_key string

Consumers: All modules that cache the affected credential (resolved at deployment by secret-name subscriptions in consumer Lambda event filters).


bank.platform.usage_event

Emitted by every platform module on each billable operation (API call, ML inference, Snowflake query, enrichment call, notification send, document store, CDC record, decision publication, login, KYC check, payment initiated). Normalised and routed to S3 Iceberg by MOD-097.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string semver, e.g. 1.0.0
idempotency_key string
tenant_id string Licensee ID for SaaS billing, or self for the bank's own customers
module_id string Pattern MOD-\d{3} — emitting module
facility_id string Pattern SD\d{2} — emitting system domain
event_type string API_CALL / ML_INFERENCE / SNOWFLAKE_QUERY / ENRICHMENT_CALL / NOTIFICATION_SEND / DOCUMENT_STORE / CDC_EVENT / DECISION_PUBLICATION / LOGIN / PAYMENT_INITIATED / KYC_CHECK
quantity number Count of billable units (≥ 0)
resource_unit_type string CALLS / INFERENCES / CREDITS / MB / RECORDS / WRITES / SENDS / LAMBDA_GB_SECONDS
environment string local / dev / uat / prod
resource_units number Cost-unit count (e.g. Lambda GB-seconds, MB stored, Snowflake credits)
resource_id string Opaque ID for the resource the event was emitted for (e.g. payment_id, document_id)
correlation_id string Originating request/trace id — links back to source operation

Consumers: MOD-097 (normaliser Lambda — routes to S3 Iceberg), MOD-099 (usage and billing report — reads daily aggregate)


bank.platform.transaction_enriched

Emitted by MOD-087 (transaction enrichment engine) after each successful enrichment of a bank.core.posting_completed event. Only posting_type = 'PAYMENT' events are enriched — non-merchant posting types (ACCRUAL, FX_CONVERSION, ADJUSTMENT, REVERSAL, PROVISION) are silently skipped; no event is emitted for them. Carries the canonical merchant identity and geolocation. Consumed by the Expense Intelligence Platform modules and the customer app layer.

Field Type Required Notes
event_id uuid Unique event ID
event_time ISO8601 UTC
schema_version string e.g. "1.0.0"
posting_id uuid Source posting from bank.core.posting_completed — dedup key
party_id uuid Customer party
account_id uuid Account the posting was applied to
raw_merchant_name string v1: accounts.postings.narrative (cross-schema SELECT); v2: dedicated field on posting_completed or external API input
canonical_merchant_name string Normalised canonical merchant name
mcc string ISO 18245 4-digit MCC; null when unknown
logo_url string CDN URL for merchant logo; null in v1 (requires external API)
lat number Merchant latitude; null when location unavailable (FR-763 conditional)
lng number Merchant longitude; null when location unavailable
enrichment_source string DICTIONARY | MCC_INFERENCE | MANUAL
trace_id string ADR-031 trace propagation from originating posting_completed

Consumers: MOD-088 (expense classification engine), MOD-089 (geo-spatial processor), MOD-091 (receipt processor), MOD-077 (account dashboard — customer app layer).


SD08 — Customer App (bank-app bus)

bank.app.session_created

Emitted by MOD-068 when a customer successfully authenticates and a new session token is issued.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
session_id uuid
customer_id uuid
device_fingerprint_id uuid Reference to MOD-068's access.device_registry.id — MOD-024 maintains a parallel fraud-grade store (payments.device_intelligence) keyed on the same device_fingerprint_hash
auth_method string BIOMETRIC / PIN / PASSWORD / MFA_SMS
ip_region string Coarse geolocation; never precise coordinates
idempotency_key string

Consumers: MOD-024 (device & session intelligence — anomaly detection), MOD-023 (transaction fraud scorer — session context), MOD-047 (agent action logger)


bank.app.session_revoked

Emitted by MOD-068 when a session is invalidated — on explicit logout, password change, fraud signal, or admin revocation.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
session_id uuid
customer_id uuid
revocation_reason string USER_LOGOUT / PASSWORD_CHANGE / FRAUD_SIGNAL / STEP_UP_FAILED / ADMIN_REVOKE / EXPIRED / CONCURRENT_SESSION_REPLACED
device_id uuid Present when revocation is device-specific
idempotency_key string

Consumers: MOD-024 (device & session intelligence — session termination), MOD-063 (notification orchestration — concurrent session alert per FR-343)


bank.app.consent_granted

Emitted by MOD-049 when a customer grants a new consent — either a simple purpose consent (privacy, marketing) or a full open banking consent arrangement.

Field Type Required Notes
trace_id uuid
event_id uuid
event_time ISO8601
schema_version string
party_id uuid Cross-domain customer identifier
consent_id uuid Stable public consent reference
consent_type string PRIVACY_POLICY / MARKETING_EMAIL / MARKETING_SMS / OPEN_BANKING / etc.
jurisdiction_profile string Present for OB consents: au_cdr / nz_payments_nz / generic_fapi2
third_party_id uuid Present for OB consents
expires_at ISO8601 Omitted for indefinite consents
idempotency_key string

Consumers: MOD-061 (Open Banking API gateway — activates consent enforcement), MOD-050 (disclosure enforcement linkage), MOD-012 (KYC audit trail)


bank.app.consent_withdrawn

Emitted by MOD-049 when a customer withdraws any consent (FR-316). Revocation propagates to dependent systems within 60 seconds via TTL cache invalidation.

Field Type Required Notes
trace_id uuid
event_id uuid
event_time ISO8601
schema_version string
party_id uuid
consent_id uuid References app.ob_consents.consent_id or app.consents.id
consent_type string
withdrawn_via string APP / API / STAFF
idempotency_key string

Consumers: MOD-061 (Open Banking gateway — immediately blocks data access), MOD-063 (in-app notification to customer — when built; stop-gap: logged as notification_dispatch_pending in v1), MOD-012 (KYC audit trail)


bank.app.consent_amended

Emitted by MOD-049 when the scopes of an active open banking consent are changed.

Field Type Required Notes
trace_id uuid
event_id uuid
event_time ISO8601
schema_version string
party_id uuid
consent_id uuid
changed_scopes array of string Delta: scopes added or removed
idempotency_key string

Consumers: MOD-061 (Open Banking gateway — updates cached scope set)


bank.app.consent_expired

Emitted by MOD-049 consent expiry sweeper (hourly EventBridge rule, FR-315) when an open banking consent's expires_at is reached and the status is transitioned to expired.

Field Type Required Notes
trace_id uuid
event_id uuid
event_time ISO8601
schema_version string
party_id uuid
consent_id uuid
idempotency_key string

Consumers: MOD-061 (Open Banking gateway — invalidates consent cache entry), MOD-063 (expiry notification to customer — when built)


bank.app.disclosure_acknowledged

Emitted by MOD-050 when a customer acknowledges a mandatory regulatory or product disclosure within the onboarding or product-change flow.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
disclosure_id uuid
customer_id uuid
disclosure_type string FSG / PDS / RATE_CHANGE / CREDIT_CONTRACT / TERMS_AND_CONDITIONS
version string Document version string
channel string APP / AGENT / EMAIL
acknowledged_at ISO8601
idempotency_key string

Consumers: MOD-007 (account state machine — gates activation), MOD-062 (workflow orchestration), MOD-012 (KYC audit trail)


bank.app.case_opened

Emitted by MOD-053 (open-case handler) when a new app.cases row is created. Published on the bank-app EventBridge bus.

Field Type Required Notes
case_id uuid app.cases.id
case_reference string ^CAS-[0-9]{4}-[0-9]{6}$
party_id uuid
case_type string COMPLAINT / SERVICE_REQUEST / HARDSHIP / DISPUTE / FRAUD_REPORT / REGULATORY_ENQUIRY / INTERNAL_REVIEW / AML_REFER
case_status string Initial status at open
priority string LOW / MEDIUM / HIGH / URGENT
channel string APP / WEB / PHONE / EMAIL / BRANCH / REGULATOR / SYSTEM
jurisdiction string NZ / AU
subject string max 200 chars
sla_deadline ISO8601 | null
vulnerability_flag boolean
related_account_id uuid | null cross-domain bare UUID
related_payment_id uuid | null cross-domain bare UUID
actor_user_id uuid | null
actor_type string CUSTOMER / STAFF / SYSTEM / REGULATOR
idempotency_key string
trace_id string | null
effective_at ISO8601

Consumers: MOD-063 (FR-329 acknowledgement to customer), MOD-064 (work queue), MOD-074 (back-office 360 timeline)


bank.app.case_status_changed

Emitted by MOD-053 (update-case-status handler) on every case_status transition. Published on the bank-app EventBridge bus.

Field Type Required Notes
case_id uuid
case_reference string ^CAS-[0-9]{4}-[0-9]{6}$
party_id uuid
previous_status string
new_status string
resolution_summary string | null Required when transitioning to RESOLVED
actor_user_id uuid | null
actor_type string CUSTOMER / STAFF / SYSTEM / REGULATOR
trace_id string | null
effective_at ISO8601

Consumers: MOD-063 (customer status notification), MOD-074 (back-office timeline)


bank.app.case_sla_at_risk

Emitted by MOD-053 SLA sweeper (daily EventBridge scheduled rule) when a case is within 5 days of statutory deadline. FR-330 / CON-002 obligation. Published on the bank-app EventBridge bus.

Field Type Required Notes
case_id uuid
case_reference string ^CAS-[0-9]{4}-[0-9]{6}$
party_id uuid
case_type string Full enum — same as case_opened
jurisdiction string NZ / AU
sla_deadline ISO8601
days_until_breach integer 0–5
assigned_to string | null
team string | null
effective_at ISO8601

Consumers: MOD-063 (complaints-manager notification)


bank.app.case_resolved

Emitted by MOD-053 when a case reaches RESOLVED or CLOSED status. Published on the bank-app EventBridge bus.

Field Type Required Notes
case_id uuid
case_reference string ^CAS-[0-9]{4}-[0-9]{6}$
party_id uuid
case_type string Full enum — same as case_opened
resolved_at ISO8601
resolution_summary string
escalated_to_external_scheme boolean true if AFCA/FSCL referral made
regulatory_reference string | null External scheme reference
actor_user_id uuid | null
effective_at ISO8601

Consumers: MOD-063 (customer notification), MOD-074, SD06 analytics


bank.app.document_uploaded

Emitted by MOD-073 (finalize-upload handler) after an upload is confirmed — S3 object exists, checksum verified, metadata row written. Published on the bank-app EventBridge bus.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
document_id uuid app.document_metadata.id
party_id uuid Customer the document belongs to
document_category string e.g. IDENTITY, STATEMENT, SUPPORTING_EVIDENCE
document_type string More specific type within category
s3_key string S3 object key
actor_user_id uuid Uploader identity
idempotency_key string
trace_id uuid ADR-031 propagation
effective_at ISO8601

Consumers: MOD-009 (eIDV scan trigger — filters on document_category='IDENTITY'; cross-bus IAM grant via MOD-104), MOD-053 (case attachment)


bank.app.document_retention_purged

Emitted by MOD-073 (retention-sweeper Lambda, EventBridge hourly schedule) when a document is deleted from S3 and soft-deleted in metadata after passing retention_delete_at. Satisfies PRI-003 AUTO.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "v1"
document_id uuid
party_id uuid
document_category string
s3_key string Key of the deleted S3 object
retention_delete_at string ISO8601 date — the retention date that triggered deletion
effective_at ISO8601

Consumers: SD06 compliance archive (analytics/audit trail of purged documents)


bank.app.access_denied

Emitted by MOD-052 (role-scoped data access enforcement library) on every enforce() call that results in one or more attributes being denied. Consumed by SIEM to satisfy NFR-023 (MTTD ≤ 5 minutes for anomalous access events).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
trace_id uuid ADR-031 propagation
staff_id uuid Requesting staff user_id
role string Staff role at time of request
entity string Entity path evaluated (e.g. aml.alerts)
denied_attributes string[] Attributes blocked by enforcement
deny_reason string INSUFFICIENT_ROLE_SCOPE or RESTRICTED_COMPLIANCE_AND_LEGAL
jurisdiction string NZ or AU

Consumers: SIEM subscription on bank-app bus (NFR-023). Also mirrored to access.access_log (Postgres, ADR-048 Cat 1) which is the durable compliance record.


bank.app.role_assigned

Emitted by MOD-052 when a staff role assignment is committed via the admin endpoint. Propagation signal for FR-328 (60-second propagation SLA — warm Lambda cache TTL).

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
trace_id uuid
staff_id uuid Staff member whose role was assigned
role string Role assigned (customer-facing, compliance, operations, senior)
granted_by_staff_id uuid Admin who made the assignment

Consumers: SIEM/observability. Lambdas do not subscribe — role propagation is via 60s TTL cache expiry (FR-328 satisfied).


bank.app.role_revoked

Emitted by MOD-052 when a staff role is revoked via the admin endpoint.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1"
trace_id uuid
staff_id uuid Staff member whose role was revoked
role string Role revoked
revoked_by_staff_id uuid Admin who revoked the role

Consumers: SIEM/observability. Lambdas do not subscribe — stale role cache expires within 60s (FR-328 satisfied). For emergency revocations requiring immediate effect, a Lambda restart clears the cache.


bank.app.product_config_proposed

Emitted by MOD-127 (propose-change Lambda) when a product configuration change proposal is created and enters the maker/checker workflow. FR-573 / GOV-007 audit anchor.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
proposal_id uuid app.product_config_proposals.id
product_id text e.g. PRD-001
jurisdiction string NZ or AU
parameter_key string e.g. rate.lending.variable
previous_value string JSON-encoded before-state
proposed_value string JSON-encoded proposed value
change_kind string FAVOURABLE or UNFAVOURABLE
proposed_by string Staff user ID
effective_date string YYYY-MM-DD
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-047 (agent action audit), SIEM


bank.app.product_config_reviewed

Emitted by MOD-127 (review-change Lambda) when a proposal is approved or rejected by the second reviewer. FR-573 / GOV-007 audit anchor.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
proposal_id uuid
product_id text
jurisdiction string
parameter_key string
status string approved or rejected
reviewed_by string Staff user ID of reviewer (guaranteed ≠ proposed_by by DB CHECK)
review_comment string Present on rejection
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-047 (agent action audit), SIEM


bank.app.product_config_applied

Emitted by MOD-127 (apply-due-proposals Lambda) when an approved proposal's effective_date has passed and the change is applied to app.product_parameters. FR-575 REP-002 AUTO mechanism. Published only after the Postgres write succeeds; EventBridge PutEvents failure leaves the proposal in approved status for next-day retry.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
proposal_id uuid
product_id text
jurisdiction string
parameter_key string
previous_value string JSON-encoded value before this change
current_value string JSON-encoded new live value
applied_at ISO8601 Timestamp the change was applied
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-110 (fee engine — refresh live fee schedule), MOD-050 (disclosure — refresh config version), MOD-113 (statement gen — when built)


bank.app.product_config_superseded

Emitted by MOD-127 (propose-change Lambda) when a new proposal supersedes an existing pending or under_review proposal for the same (product_id, jurisdiction, parameter_key). FR-573 GOV-006 audit trail.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
proposal_id uuid The proposal being superseded
superseded_by uuid The new proposal ID
product_id text
jurisdiction string
parameter_key string
idempotency_key string

Consumers: MOD-002 (immutable transaction log), SIEM


bank.app.product_config_change_proposed_unfavourable

Emitted by MOD-127 (propose-change Lambda) when a proposal is classified as unfavourable by classify-unfavourable.ts. This event crosses the bus boundary to bank-platform to trigger MOD-063 notification dispatch. FR-574 / CON-005 GATE trigger. Published in the same proposal creation flow as bank.app.product_config_proposed.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string "1.0.0"
trace_id uuid
proposal_id uuid
product_id text
jurisdiction string
parameter_key string
change_kind string UNFAVOURABLE
advance_days int advance_notice_days from app.product_parameter_metadata
previous_value string JSON-encoded before-state
proposed_value string JSON-encoded proposed value
idempotency_key string

Consumers: MOD-002 (immutable transaction log), MOD-063 (notification orchestration — cross-bus via EventBridge rule on bank-platform bus; triggers advance-notice dispatch to affected customers)


bank.app.profile_updated

Emitted by MOD-072 (commit-profile-update Lambda) when a customer profile field is successfully committed. When re_verification_required = true, bank-kyc subscribes and re-triggers CDD. MOD-063 subscribes to refresh notification-preference cache. Published on the bank-app EventBridge bus.

Field Type Required Notes
party_id uuid Customer whose profile changed
fields_changed array Each entry: {field_path, previous_value_sha256, new_value_sha256, regulated}
re_verification_required boolean True when a regulated field (email, phone, residential_address) was changed
actor_type string CUSTOMER or STAFF
actor_user_id uuid access.user_identities.user_id of the actor
actor_justification string Required when actor_type = STAFF
session_id uuid MOD-068 session that authorised the change
channel string APP, WEB, BACK_OFFICE, or API
idempotency_key uuid Unique per commit transaction
trace_id uuid Distributed trace ID
effective_at ISO8601 Timestamp of the committed change

Consumers: bank-kyc (MOD-009/010 re-verification when re_verification_required=true; cross-bus — BankKycRole requires events:PutRule/PutTargets on bank-app bus via MOD-104), bank-app MOD-063 (notification routing refresh — intra-bus), bank-app statement modules (intra-bus)

Consumers: MOD-002 (immutable transaction log), MOD-063 (notification orchestration — cross-bus via EventBridge rule on bank-platform bus; triggers advance-notice dispatch to affected customers)


bank.app.card_control_changed

Emitted by MOD-078 on every successful card control action — freeze, unfreeze, limit change, or channel toggle. Intra-bus on bank-app. Consumed by MOD-063 to confirm the change to the customer via push notification within the FR-373 5 s SLA.

Field Type Required Notes
event_id uuid
event_time ISO8601
schema_version string
party_id uuid
card_id uuid
control_type string FREEZE / UNFREEZE / LIMIT_SET / CHANNEL_TOGGLE / VIRTUAL_CARD
prev_state object Snapshot of control state before change
new_state object Snapshot of control state after change
audit_id uuid References app.card_control_audit(id)
idempotency_key string

Consumers: MOD-063 (notification orchestration — customer push confirmation)


bank.app.automation_rule_fired

Emitted by MOD-051 when a rule evaluation results in an action being taken or a significant outcome (condition passed, funds swept, notification sent). NOT emitted for no-op NOT_APPLICABLE evaluations. Consumed by MOD-063 for the FR-324 "notify within 60s" obligation.

Bus: bank-app · Source: bank.app · Detail-type: automation_rule_fired

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
rule_id uuid
execution_id uuid app.automation_rule_executions(execution_id)
party_id uuid
rule_type string e.g. ROUND_UP | SCHEDULED_TRANSFER
action_outcome string EXECUTED | NOTIFICATION_ONLY | SKIPPED_INSUFFICIENT_FUNDS | SKIPPED_RULE_PAUSED
amount string Fixed-point decimal; present when funds moved
currency char(3) ISO 4217
source_account_id uuid
dest_account_id uuid
mod_020_payment_id uuid Present when action_outcome = EXECUTED
idempotency_key string Matches app.automation_rule_executions.idempotency_key
trace_id uuid

Consumers: MOD-063 (notification orchestration — FR-324 customer notification within 60s of rule action).


bank.app.automation_rule_failed

Emitted by MOD-051 when a rule evaluation or action fails with an error (distinct from SKIPPED_INSUFFICIENT_FUNDS which is an expected fail-soft outcome). Used for operational alerting on the low-balance safety-net fail path and unexpected MOD-020 errors.

Bus: bank-app · Source: bank.app · Detail-type: automation_rule_failed

Field Type Required Notes
event_id uuid
event_time ISO8601 UTC
schema_version string "1.0.0"
rule_id uuid
execution_id uuid
party_id uuid
rule_type string
failure_reason string Human-readable failure description
action_outcome string FAILED | MOD_020_DECLINED
idempotency_key string
trace_id uuid

Consumers: MOD-063 (fail-soft notification to customer where relevant), MOD-076 (ops alerting — unexpected rule failures).