Standalone mode — your ETL hook is not configured. Reset and Deploy-changes will only remove rows tagged metadata.source='training'. Any unmarked rows are presumed to be real customer data and will be preserved. To configure an ETL hook, edit cfg.app2.etl_hook in your config.yaml.

Triage

ETL feed gaps the Probe + Refresh Data passes surfaced. Each row points at the L2 shape + the SQL fragment that would close the gap.

56 gaps across 4 kinds.

Unmatched rail_name 2,341 rows total · 4 distinct

CardSaleDailySettlement

2,076 rows

2076 rows arrived with rail_name="CardSaleDailySettlement" but the L2 declares no Rail of that name.

sample tx
tx-base-cascade-038153-src
declared_rails
ACHOriginationDailySweep, ConcentrationToFRBSweep, CustomerCashDeposit, CustomerCashWithdrawal, CustomerFeeAccrual, CustomerFeeMonthlySettlement, CustomerInboundACH, CustomerInboundACHReturnNSF, CustomerInboundACHReturnStopPay, CustomerInboundWire, CustomerOutboundACH, CustomerOutboundWire, EnhancedFraudReview, ExternalCardSettlement, InternalTransferCredit, InternalTransferDebit, InternalTransferSuspenseClose, MerchantCardSale, MerchantDailySettleAggregator, MerchantPayoutACH, MerchantPayoutCheck, MerchantPayoutWire, MerchantWeeklyBatchClose, NoFraudReview, SettlementAutoSettle, SettlementSlowSettle, SettlementStandardSettle, StandardFraudReview, ZBASweep

→ Open Rails editor

_spine_plant

148 rows

148 rows arrived with rail_name="_spine_plant" but the L2 declares no Rail of that name.

sample tx
tx-drift-CustomerDDA-cust-0001-snb-1
declared_rails
ACHOriginationDailySweep, ConcentrationToFRBSweep, CustomerCashDeposit, CustomerCashWithdrawal, CustomerFeeAccrual, CustomerFeeMonthlySettlement, CustomerInboundACH, CustomerInboundACHReturnNSF, CustomerInboundACHReturnStopPay, CustomerInboundWire, CustomerOutboundACH, CustomerOutboundWire, EnhancedFraudReview, ExternalCardSettlement, InternalTransferCredit, InternalTransferDebit, InternalTransferSuspenseClose, MerchantCardSale, MerchantDailySettleAggregator, MerchantPayoutACH, MerchantPayoutCheck, MerchantPayoutWire, MerchantWeeklyBatchClose, NoFraudReview, SettlementAutoSettle, SettlementSlowSettle, SettlementStandardSettle, StandardFraudReview, ZBASweep

→ Open Rails editor

ZBAFundingInbound

102 rows

102 rows arrived with rail_name="ZBAFundingInbound" but the L2 declares no Rail of that name.

sample tx
tx-base-cascade-038872-src
declared_rails
ACHOriginationDailySweep, ConcentrationToFRBSweep, CustomerCashDeposit, CustomerCashWithdrawal, CustomerFeeAccrual, CustomerFeeMonthlySettlement, CustomerInboundACH, CustomerInboundACHReturnNSF, CustomerInboundACHReturnStopPay, CustomerInboundWire, CustomerOutboundACH, CustomerOutboundWire, EnhancedFraudReview, ExternalCardSettlement, InternalTransferCredit, InternalTransferDebit, InternalTransferSuspenseClose, MerchantCardSale, MerchantDailySettleAggregator, MerchantPayoutACH, MerchantPayoutCheck, MerchantPayoutWire, MerchantWeeklyBatchClose, NoFraudReview, SettlementAutoSettle, SettlementSlowSettle, SettlementStandardSettle, StandardFraudReview, ZBASweep

→ Open Rails editor

MerchantWeeklyPayoutBatch

15 rows

15 rows arrived with rail_name="MerchantWeeklyPayoutBatch" but the L2 declares no Rail of that name.

sample tx
tx-fanin-healthy-MerchantWeeklyPayoutBatch-child-0
declared_rails
ACHOriginationDailySweep, ConcentrationToFRBSweep, CustomerCashDeposit, CustomerCashWithdrawal, CustomerFeeAccrual, CustomerFeeMonthlySettlement, CustomerInboundACH, CustomerInboundACHReturnNSF, CustomerInboundACHReturnStopPay, CustomerInboundWire, CustomerOutboundACH, CustomerOutboundWire, EnhancedFraudReview, ExternalCardSettlement, InternalTransferCredit, InternalTransferDebit, InternalTransferSuspenseClose, MerchantCardSale, MerchantDailySettleAggregator, MerchantPayoutACH, MerchantPayoutCheck, MerchantPayoutWire, MerchantWeeklyBatchClose, NoFraudReview, SettlementAutoSettle, SettlementSlowSettle, SettlementStandardSettle, StandardFraudReview, ZBASweep

→ Open Rails editor

Unmatched template_name 15 rows total · 1 distinct

MerchantDailySettleAggregator

15 rows

15 rows tagged with template_name="MerchantDailySettleAggregator" — no such template in the L2.

sample tx
tx-fanin-healthy-MerchantWeeklyPayoutBatch-parent-0
declared_templates
InternalTransferCycle, MerchantSettlementCycle, MerchantWeeklyPayoutBatch

→ Open Templates editor

Missing LimitSchedule 17,008 rows total · 46 distinct

DDAControl::CustomerCashDeposit

5,331 rows

5331 CustomerCashDeposit rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::CustomerInboundWire

5,191 rows

5191 CustomerInboundWire rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::CustomerInboundACHReturnNSF

2,928 rows

2928 CustomerInboundACHReturnNSF rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::CustomerInboundACHReturnStopPay

2,811 rows

2811 CustomerInboundACHReturnStopPay rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::InternalTransferDebit

126 rows

126 InternalTransferDebit rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::_spine_plant

124 rows

124 _spine_plant rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::InternalTransferCredit

122 rows

122 InternalTransferCredit rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

DDAControl::CustomerFeeAccrual

68 rows

68 CustomerFeeAccrual rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

ConcentrationMaster::ZBAFundingInbound

51 rows

51 ZBAFundingInbound rows landed against ConcentrationMaster but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_ConcentrationMaster
(none for this parent_role)

→ Open Limits editor

ConcentrationMaster::ZBASweep

51 rows

51 ZBASweep rows landed against ConcentrationMaster but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_ConcentrationMaster
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantDailySettleAggregator

21 rows

21 MerchantDailySettleAggregator rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

DDAControl::ConcentrationToFRBSweep

21 rows

21 ConcentrationToFRBSweep rows landed against DDAControl but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_DDAControl
(DDAControl, CustomerCashWithdrawal, Outbound) cap=10000.0; (DDAControl, CustomerInboundACH, Inbound) cap=20000.0; (DDAControl, CustomerOutboundACH, Outbound) cap=12000.0; (DDAControl, CustomerOutboundWire, Outbound) cap=15000.0

→ Open Limits editor

CustomerLedger::MerchantWeeklyPayoutBatch

15 rows

15 MerchantWeeklyPayoutBatch rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerCashDeposit

9 rows

9 CustomerCashDeposit rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::ConcentrationToFRBSweep

8 rows

8 ConcentrationToFRBSweep rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerInboundACH

8 rows

8 CustomerInboundACH rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerInboundACHReturnNSF

7 rows

7 CustomerInboundACHReturnNSF rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerInboundACHReturnStopPay

7 rows

7 CustomerInboundACHReturnStopPay rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::InternalTransferDebit

7 rows

7 InternalTransferDebit rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::SettlementAutoSettle

7 rows

7 SettlementAutoSettle rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::ACHOriginationDailySweep

6 rows

6 ACHOriginationDailySweep rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerCashWithdrawal

6 rows

6 CustomerCashWithdrawal rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerInboundWire

6 rows

6 CustomerInboundWire rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerOutboundACH

6 rows

6 CustomerOutboundACH rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerOutboundWire

6 rows

6 CustomerOutboundWire rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantCardSale

6 rows

6 MerchantCardSale rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantPayoutCheck

6 rows

6 MerchantPayoutCheck rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantPayoutWire

6 rows

6 MerchantPayoutWire rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerFeeAccrual

4 rows

4 CustomerFeeAccrual rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::InternalTransferCredit

4 rows

4 InternalTransferCredit rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::InternalTransferSuspenseClose

4 rows

4 InternalTransferSuspenseClose rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::NoFraudReview

4 rows

4 NoFraudReview rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::SettlementStandardSettle

4 rows

4 SettlementStandardSettle rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::CustomerFeeMonthlySettlement

3 rows

3 CustomerFeeMonthlySettlement rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::EnhancedFraudReview

3 rows

3 EnhancedFraudReview rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::ExternalCardSettlement

3 rows

3 ExternalCardSettlement rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantWeeklyBatchClose

3 rows

3 MerchantWeeklyBatchClose rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::SettlementSlowSettle

3 rows

3 SettlementSlowSettle rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::StandardFraudReview

3 rows

3 StandardFraudReview rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::MerchantPayoutACH

2 rows

2 MerchantPayoutACH rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

CustomerLedger::_spine_plant

2 rows

2 _spine_plant rows landed against CustomerLedger but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_CustomerLedger
(none for this parent_role)

→ Open Limits editor

LedgerDriftTestControl_d0::_spine_plant

1 row

1 _spine_plant rows landed against LedgerDriftTestControl_d0 but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_LedgerDriftTestControl_d0
(none for this parent_role)

→ Open Limits editor

LedgerDriftTestControl_d1::_spine_plant

1 row

1 _spine_plant rows landed against LedgerDriftTestControl_d1 but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_LedgerDriftTestControl_d1
(none for this parent_role)

→ Open Limits editor

LedgerDriftTestControl_d2::_spine_plant

1 row

1 _spine_plant rows landed against LedgerDriftTestControl_d2 but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_LedgerDriftTestControl_d2
(none for this parent_role)

→ Open Limits editor

LedgerDriftTestControl_d3::_spine_plant

1 row

1 _spine_plant rows landed against LedgerDriftTestControl_d3 but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_LedgerDriftTestControl_d3
(none for this parent_role)

→ Open Limits editor

LedgerDriftTestControl_d4::_spine_plant

1 row

1 _spine_plant rows landed against LedgerDriftTestControl_d4 but no LimitSchedule covers this (parent_role, rail) tuple. L1 Limit Breach renders these as "no cap" in dashboards.

existing_schedules_for_LedgerDriftTestControl_d4
(none for this parent_role)

→ Open Limits editor

Missing required metadata key 50 rows total · 5 distinct

MerchantWeeklyPayoutBatch::merchant_id

15 rows

Template MerchantWeeklyPayoutBatch declares "merchant_id" as required. 15 of 150 MerchantWeeklyPayoutBatch rows landed without it — L1 Conservation can't bucket them. Operator decides: fix the ETL to emit "merchant_id", or drop the key from the template if upstream genuinely doesn't carry it.

sample tx
tx-fanin-healthy-MerchantWeeklyPayoutBatch-child-0
template_total_rows
150
missing_key
merchant_id

→ Open template editor

MerchantWeeklyPayoutBatch::payout_batch_id

15 rows

Template MerchantWeeklyPayoutBatch declares "payout_batch_id" as required. 15 of 150 MerchantWeeklyPayoutBatch rows landed without it — L1 Conservation can't bucket them. Operator decides: fix the ETL to emit "payout_batch_id", or drop the key from the template if upstream genuinely doesn't carry it.

sample tx
tx-fanin-healthy-MerchantWeeklyPayoutBatch-child-0
template_total_rows
150
missing_key
payout_batch_id

→ Open template editor

InternalTransferCycle::internal_transfer_id

8 rows

Template InternalTransferCycle declares "internal_transfer_id" as required. 8 of 188 InternalTransferCycle rows landed without it — L1 Conservation can't bucket them. Operator decides: fix the ETL to emit "internal_transfer_id", or drop the key from the template if upstream genuinely doesn't carry it.

sample tx
tx-cpd-InternalTransferCycle-0
template_total_rows
188
missing_key
internal_transfer_id

→ Open template editor

MerchantSettlementCycle::merchant_id

6 rows

Template MerchantSettlementCycle declares "merchant_id" as required. 6 of 266 MerchantSettlementCycle rows landed without it — L1 Conservation can't bucket them. Operator decides: fix the ETL to emit "merchant_id", or drop the key from the template if upstream genuinely doesn't carry it.

sample tx
tx-xor-missed-MerchantSettlementCycle-0
template_total_rows
266
missing_key
merchant_id

→ Open template editor

MerchantSettlementCycle::settlement_period

6 rows

Template MerchantSettlementCycle declares "settlement_period" as required. 6 of 266 MerchantSettlementCycle rows landed without it — L1 Conservation can't bucket them. Operator decides: fix the ETL to emit "settlement_period", or drop the key from the template if upstream genuinely doesn't carry it.

sample tx
tx-xor-missed-MerchantSettlementCycle-0
template_total_rows
266
missing_key
settlement_period

→ Open template editor