[2026-08-09 00:30:03] local.INFO: Run start {"mode":"LIVE","thresholds":[180,365,547,730,1095]} 
[2026-08-09 00:30:03] local.INFO: Threshold start {"days":180,"dry_run":false} 
[2026-08-09 00:30:09] local.INFO: S1 done {"days":180,"count":0,"dry_run":false} 
[2026-08-09 00:30:10] local.INFO: S2 done {"days":180,"count":105214,"dry_run":false} 
[2026-08-09 00:30:10] local.INFO: S3 done {"days":180,"count":25280,"dry_run":false} 
[2026-08-09 00:30:11] local.INFO: S4 done {"days":180,"count":2440,"dry_run":false} 
[2026-08-09 00:30:11] local.INFO: Threshold complete {"days":180,"stats":{"s1_seeds":0,"s2_reset":105214,"s3_partslink_agg":25280,"s4_partnum_agg":2440,"errors":0}} 
[2026-08-09 00:30:11] local.INFO: Threshold start {"days":365,"dry_run":false} 
[2026-08-09 00:30:17] local.INFO: S1 done {"days":365,"count":0,"dry_run":false} 
[2026-08-09 00:30:17] local.INFO: S2 done {"days":365,"count":105216,"dry_run":false} 
[2026-08-09 00:30:19] local.INFO: S3 done {"days":365,"count":40042,"dry_run":false} 
[2026-08-09 00:30:19] local.INFO: S4 done {"days":365,"count":4906,"dry_run":false} 
[2026-08-09 00:30:19] local.INFO: Threshold complete {"days":365,"stats":{"s1_seeds":0,"s2_reset":105216,"s3_partslink_agg":40042,"s4_partnum_agg":4906,"errors":0}} 
[2026-08-09 00:30:19] local.INFO: Threshold start {"days":547,"dry_run":false} 
[2026-08-09 00:30:24] local.INFO: S1 done {"days":547,"count":0,"dry_run":false} 
[2026-08-09 00:30:25] local.INFO: S2 done {"days":547,"count":105217,"dry_run":false} 
[2026-08-09 00:30:27] local.INFO: S3 done {"days":547,"count":53230,"dry_run":false} 
[2026-08-09 00:30:28] local.INFO: S4 done {"days":547,"count":7890,"dry_run":false} 
[2026-08-09 00:30:28] local.INFO: Threshold complete {"days":547,"stats":{"s1_seeds":0,"s2_reset":105217,"s3_partslink_agg":53230,"s4_partnum_agg":7890,"errors":0}} 
[2026-08-09 00:30:28] local.INFO: Threshold start {"days":730,"dry_run":false} 
[2026-08-09 00:30:33] local.INFO: S1 done {"days":730,"count":0,"dry_run":false} 
[2026-08-09 00:30:34] local.INFO: S2 done {"days":730,"count":105206,"dry_run":false} 
[2026-08-09 00:30:36] local.INFO: S3 done {"days":730,"count":65124,"dry_run":false} 
[2026-08-09 00:30:36] local.ERROR: S4 exception {"days":730,"error":"SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'cnt' cannot be null (Connection: mysql, SQL: INSERT INTO non_selling_items (partslink, cnt, days_limit)
                     SELECT oi.part_num AS partslink, SUM(qty) AS cnt, 730 AS days_limit
                     FROM orders o, orders_items oi
                     WHERE o.order_id = oi.order_id
                       AND o.source IN (1,200,500)
                       AND oi.part_num IS NOT NULL
                       AND oi.part_num REGEXP ^[[:alpha:]]{2}[[:digit:]]{7}[CN]?$
                       AND oi.created_at >= DATE_SUB(NOW(), INTERVAL 730 DAY)
                     GROUP BY 1
                     ON DUPLICATE KEY UPDATE cnt = cnt + VALUES(cnt), updated_at = NOW())"} 
[2026-08-09 00:30:36] local.INFO: Threshold complete {"days":730,"stats":{"s1_seeds":0,"s2_reset":105206,"s3_partslink_agg":65124,"s4_partnum_agg":0,"errors":1}} 
[2026-08-09 00:30:36] local.INFO: Threshold start {"days":1095,"dry_run":false} 
[2026-08-09 00:30:42] local.INFO: S1 done {"days":1095,"count":0,"dry_run":false} 
[2026-08-09 00:30:42] local.INFO: S2 done {"days":1095,"count":105209,"dry_run":false} 
[2026-08-09 00:30:45] local.INFO: S3 done {"days":1095,"count":85762,"dry_run":false} 
[2026-08-09 00:30:46] local.ERROR: S4 exception {"days":1095,"error":"SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'cnt' cannot be null (Connection: mysql, SQL: INSERT INTO non_selling_items (partslink, cnt, days_limit)
                     SELECT oi.part_num AS partslink, SUM(qty) AS cnt, 1095 AS days_limit
                     FROM orders o, orders_items oi
                     WHERE o.order_id = oi.order_id
                       AND o.source IN (1,200,500)
                       AND oi.part_num IS NOT NULL
                       AND oi.part_num REGEXP ^[[:alpha:]]{2}[[:digit:]]{7}[CN]?$
                       AND oi.created_at >= DATE_SUB(NOW(), INTERVAL 1095 DAY)
                     GROUP BY 1
                     ON DUPLICATE KEY UPDATE cnt = cnt + VALUES(cnt), updated_at = NOW())"} 
[2026-08-09 00:30:46] local.INFO: Threshold complete {"days":1095,"stats":{"s1_seeds":0,"s2_reset":105209,"s3_partslink_agg":85762,"s4_partnum_agg":0,"errors":1}} 
[2026-08-09 00:30:46] local.INFO: Run complete {"mode":"LIVE","per_threshold":{"180":{"s1_seeds":0,"s2_reset":105214,"s3_partslink_agg":25280,"s4_partnum_agg":2440,"errors":0},"365":{"s1_seeds":0,"s2_reset":105216,"s3_partslink_agg":40042,"s4_partnum_agg":4906,"errors":0},"547":{"s1_seeds":0,"s2_reset":105217,"s3_partslink_agg":53230,"s4_partnum_agg":7890,"errors":0},"730":{"s1_seeds":0,"s2_reset":105206,"s3_partslink_agg":65124,"s4_partnum_agg":0,"errors":1},"1095":{"s1_seeds":0,"s2_reset":105209,"s3_partslink_agg":85762,"s4_partnum_agg":0,"errors":1}}} 
