Juan Denis and Claude Opus 5
009d9c4d7f
fix(ai): raise a typed error for a malformed attachment manifest
...
The attachment round added two hand-shaped `jsonify({'error': str(exc)}), 400`
returns in api/ai.py, which pushed the error-shape census to 1146 against a
ceiling of 1144 and turned shard 2 red. The census policy is not "raise the
ceiling" -- new endpoints raise, and these are new.
AttachmentValidationError now subclasses app.exceptions.ValidationError, so the
global handler owns the 400 body, the `code`, and the X-Request-ID correlation.
It is still a ValueError (ValidationError subclasses one), so every existing
`except ValueError` caller and the pytest.raises assertions in
test_ai_attachments.py are unchanged, and the two try/except blocks in the
routes disappear entirely.
Census back to 1144 = ceiling. Verified: test_ai_attachments, test_ai_assistant,
test_error_shape_ratchet all green.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-21 20:14:34 -04:00
..
2026-08-21 09:20:54 -04:00
2026-01-17 04:22:12 -05:00
2026-08-19 00:10:09 -04:00
2026-08-19 00:10:09 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 19:33:57 -04:00
2026-08-19 02:04:29 -04:00
2026-08-21 20:14:34 -04:00
2026-03-07 12:15:02 -05:00
2026-08-19 21:44:17 -04:00
2026-08-18 19:33:57 -04:00
2026-08-19 05:43:53 -04:00
2026-08-20 19:04:09 -04:00
2026-08-18 02:42:39 -04:00
2026-08-19 10:10:40 -04:00
2026-08-19 21:44:17 -04:00
2026-08-18 02:42:39 -04:00
2026-07-01 01:35:44 -04:00
2026-07-08 02:05:50 -04:00
2026-08-18 02:47:57 -04:00
2026-08-12 20:26:04 -04:00
2026-07-25 19:30:51 -04:00
2026-08-18 19:33:57 -04:00
2026-08-19 05:43:53 -04:00
2026-08-19 01:49:42 -04:00
2026-08-18 23:55:17 -04:00
2026-08-19 21:44:17 -04:00
2026-08-21 10:34:52 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 18:22:01 -04:00
2026-07-03 23:18:08 -04:00
2026-08-18 19:33:57 -04:00
2026-08-19 21:44:17 -04:00
2026-03-04 01:53:46 -05:00
2026-08-21 10:40:42 -04:00
2026-08-18 02:42:39 -04:00
2026-08-12 20:26:04 -04:00
2026-08-18 19:33:57 -04:00
2026-08-19 00:10:09 -04:00
2026-08-18 02:56:33 -04:00
2026-08-18 23:49:09 -04:00
2026-08-17 19:28:24 -04:00
2026-08-18 20:38:20 -04:00
2026-08-19 21:44:17 -04:00
2026-05-01 00:37:48 -04:00
2026-08-12 20:26:04 -04:00
2026-07-03 15:22:05 -04:00
2026-08-18 23:52:40 -04:00
2026-08-18 03:11:37 -04:00
2026-08-21 10:34:52 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 02:42:39 -04:00
2026-07-03 14:24:15 -04:00
2026-08-18 18:22:01 -04:00
2026-08-18 20:38:20 -04:00
2026-02-08 23:14:13 -05:00
2026-08-19 21:44:17 -04:00
2026-08-17 22:40:12 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 02:42:39 -04:00
2026-08-19 21:44:17 -04:00
2026-08-19 21:44:17 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 20:38:20 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 02:42:39 -04:00
2026-08-20 00:16:04 -04:00
2026-08-18 19:33:57 -04:00
2026-08-12 20:26:04 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 02:42:39 -04:00
2026-08-19 21:44:17 -04:00
2026-08-19 21:44:17 -04:00
2026-08-19 21:44:17 -04:00
2026-08-18 02:47:57 -04:00
2026-08-19 06:04:59 -04:00
2026-08-21 09:20:54 -04:00
2026-08-19 00:00:36 -04:00
2026-08-18 23:54:06 -04:00
2026-08-19 21:44:17 -04:00
2026-08-19 21:44:17 -04:00
2026-08-18 20:38:20 -04:00
2026-08-19 21:44:17 -04:00
2026-07-07 20:29:26 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 19:33:57 -04:00
2026-08-18 20:38:20 -04:00
2026-08-18 02:42:39 -04:00
2026-08-18 20:38:20 -04:00
2026-08-18 20:38:20 -04:00
2026-07-07 20:29:24 -04:00
2026-08-19 10:10:40 -04:00
2026-08-19 00:10:09 -04:00
2026-08-19 21:44:17 -04:00
2026-07-20 22:26:19 -04:00
2026-08-18 23:56:15 -04:00
2026-07-18 00:59:19 -04:00
2026-08-19 21:44:17 -04:00
2026-08-18 23:51:34 -04:00
2026-08-18 18:22:01 -04:00
2026-08-19 00:05:33 -04:00
2026-08-19 21:44:17 -04:00