Wintermute and Garry Tan
c356ea4651
feat: structured error code summary for sync --skip-failed ( #500 )
...
When sync encounters per-file failures, the blocked/skip-failed messages
now include a breakdown by error code (SLUG_MISMATCH, YAML_PARSE, etc.)
instead of just a raw count. This makes it immediately obvious *why*
files failed without requiring manual investigation.
Changes:
- Add classifyErrorCode() — maps error messages to ParseValidationCode
- Add summarizeFailuresByCode() — groups failures into sorted code summary
- SyncFailure now carries a 'code' field (backfilled on acknowledge)
- acknowledgeSyncFailures() returns AcknowledgeResult {count, summary}
- sync blocked + skip-failed messages show code breakdown
- doctor sync_failures check shows code breakdown for both unacked and historical
- 12 new tests for classifyErrorCode, summarizeFailuresByCode, and structured returns
Before:
Sync blocked: 2688 file(s) failed to parse.
After:
Sync blocked: 2688 file(s) failed to parse:
SLUG_MISMATCH: 2685
YAML_DUPLICATE_KEY: 3
Closes #500
2026-04-28 08:47:16 -07:00
..
2026-04-25 12:25:34 -07:00
2026-04-27 16:56:07 -07:00
2026-04-28 02:16:23 -07:00
2026-04-24 00:24:10 -07:00
2026-04-22 01:34:22 -07:00
2026-04-26 20:45:05 -07:00
2026-04-18 16:57:38 +08:00
2026-04-21 18:35:45 -07:00
2026-04-11 21:25:44 -10:00
2026-04-14 19:41:34 -10:00
2026-04-22 01:34:22 -07:00
2026-04-20 07:30:00 +08:00
2026-04-20 07:30:00 +08:00
2026-04-18 18:16:18 +08:00
2026-04-28 02:16:23 -07:00
2026-04-24 00:08:54 -07:00
2026-04-20 23:14:38 +08:00
2026-04-26 20:45:05 -07:00
2026-04-21 11:51:32 -07:00
2026-04-25 12:25:34 -07:00
2026-04-23 19:34:27 -07:00
2026-04-26 20:45:05 -07:00
2026-04-09 12:25:04 -10:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-21 17:54:13 -07:00
2026-04-12 07:48:47 -10:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-06 16:50:15 -07:00
2026-04-26 15:49:48 -07:00
2026-04-26 15:49:48 -07:00
2026-04-14 19:41:34 -10:00
2026-04-22 16:24:23 -07:00
2026-04-20 21:54:36 +08:00
2026-04-26 15:49:48 -07:00
2026-04-26 20:45:05 -07:00
2026-04-24 00:08:54 -07:00
2026-04-20 21:54:36 +08:00
2026-04-25 12:25:34 -07:00
2026-04-26 15:49:48 -07:00
2026-04-11 00:01:09 -10:00
2026-04-14 19:41:34 -10:00
2026-04-20 07:30:00 +08:00
2026-04-25 12:25:34 -07:00
2026-04-13 21:03:40 -10:00
2026-04-24 00:08:54 -07:00
2026-04-22 01:34:22 -07:00
2026-04-26 15:49:48 -07:00
2026-04-20 07:05:27 +08:00
2026-04-20 07:30:00 +08:00
2026-04-14 21:40:48 -10:00
2026-04-25 12:25:34 -07:00
2026-04-09 10:17:13 -07:00
2026-04-13 07:49:13 -10:00
2026-04-16 23:03:15 -07:00
2026-04-13 07:49:13 -10:00
2026-04-23 19:34:27 -07:00
2026-04-26 20:45:05 -07:00
2026-04-26 20:45:05 -07:00
2026-04-18 18:16:18 +08:00
2026-04-22 08:23:24 -07:00
2026-04-19 07:14:24 +08:00
2026-04-09 10:17:13 -07:00
2026-04-12 07:48:47 -10:00
2026-04-25 12:25:34 -07:00
2026-04-18 16:57:38 +08:00
2026-04-16 23:03:15 -07:00
2026-04-22 01:34:22 -07:00
2026-04-13 21:03:40 -10:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-24 00:08:54 -07:00
2026-04-26 20:45:05 -07:00
2026-04-11 21:25:44 -10:00
2026-04-26 20:45:05 -07:00
2026-04-24 00:08:54 -07:00
2026-04-21 21:14:17 -07:00
2026-04-28 02:16:23 -07:00
2026-04-26 20:45:05 -07:00
2026-04-20 23:14:38 +08:00
2026-04-18 16:57:38 +08:00
2026-04-18 16:57:38 +08:00
2026-04-18 18:16:18 +08:00
2026-04-19 07:14:24 +08:00
2026-04-22 01:34:22 -07:00
2026-04-20 07:30:00 +08:00
2026-04-21 13:19:23 -07:00
2026-04-22 01:34:22 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-26 20:45:05 -07:00
2026-04-22 01:34:22 -07:00
2026-04-24 01:09:28 -07:00
2026-04-26 16:54:32 -07:00
2026-04-24 00:08:54 -07:00
2026-04-24 00:08:54 -07:00
2026-04-25 12:25:34 -07:00
2026-04-08 23:26:11 -10:00
2026-04-25 12:25:34 -07:00
2026-04-12 17:38:48 -07:00
2026-04-23 19:34:27 -07:00
2026-04-20 07:30:00 +08:00
2026-04-21 18:35:45 -07:00
2026-04-18 16:57:38 +08:00
2026-04-21 17:54:13 -07:00
2026-04-12 13:23:55 -10:00
2026-04-21 21:14:17 -07:00
2026-04-25 12:25:34 -07:00
2026-04-16 23:03:15 -07:00
2026-04-22 01:34:22 -07:00
2026-04-22 01:34:22 -07:00
2026-04-25 12:25:34 -07:00
2026-04-23 19:34:27 -07:00
2026-04-25 12:25:34 -07:00
2026-04-19 07:14:24 +08:00
2026-04-23 19:34:27 -07:00
2026-04-11 21:25:44 -10:00
2026-04-25 12:25:34 -07:00
2026-04-21 18:35:45 -07:00
2026-04-24 01:39:58 -07:00
2026-04-22 01:34:22 -07:00
2026-04-23 19:34:27 -07:00
2026-04-28 02:16:23 -07:00
2026-04-27 22:59:08 -07:00
2026-04-25 12:25:34 -07:00
2026-04-16 23:03:15 -07:00
2026-04-18 18:16:18 +08:00
2026-04-09 10:17:13 -07:00
2026-04-23 19:34:27 -07:00
2026-04-22 02:07:00 -07:00
2026-04-23 19:34:27 -07:00
2026-04-18 16:57:38 +08:00
2026-04-23 19:34:27 -07:00
2026-04-23 19:34:27 -07:00
2026-04-14 19:41:34 -10:00
2026-04-11 10:52:30 -10:00
2026-04-22 16:24:23 -07:00
2026-04-22 16:24:23 -07:00
2026-04-25 23:35:27 -07:00
2026-04-22 16:24:23 -07:00
2026-04-13 07:49:13 -10:00
2026-04-21 21:14:17 -07:00
2026-04-21 21:14:17 -07:00
2026-04-22 01:34:22 -07:00
2026-04-22 01:34:22 -07:00
2026-04-09 10:17:13 -07:00
2026-04-26 16:54:32 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-04-28 08:47:16 -07:00
2026-04-25 12:25:34 -07:00
2026-04-22 08:23:24 -07:00
2026-04-14 19:41:34 -10:00
2026-04-20 23:14:38 +08:00
2026-04-25 12:25:34 -07:00
2026-04-18 18:16:18 +08:00
2026-04-19 18:23:02 +08:00
2026-04-22 01:34:22 -07:00
2026-04-20 07:30:00 +08:00
2026-04-09 10:17:13 -07:00