peter
5e8589bbf8
fix(i18n): read every refusal from the backend's syntax tree, not by regex
...
The contract read Python with regexes, and each guard added for a missed shape had shapes of its own
it missed: a reason after another key, a status passed by name, a second `e.reason` handler with the
same text, a pin naming a type nothing checked.
backend/tests/refusal_sites.py (stdlib `ast`, run by the contract on the host's Python) reads every
`{"code": ...}` detail and follows each reason to its values: literals, both arms of a conditional,
module constants, the `Literal` on the parameter or attribute it travels in (on the class an `except`
catches), every call of a `str` helper with its defaults, a map's values with its keys held to the
index's type. What it cannot follow fails the contract, unless no screen shows that code; no pins.
The reason attributes are typed with their Literal, so a subclass or an assignment cannot widen
them; InvalidSetting takes a SettingReason, and the settings map is held to it (a reason the map
lacked was a 500). The per-family reverse checks are one check by prefix (the admin actions
included), and the leaf-key filter applies only to the suffixed sign-in family.
2026-10-31 15:07:38 +01:00
..
2026-10-24 16:00:37 +02:00
2026-10-23 22:07:11 +02:00
2026-10-16 01:13:31 +02:00
2026-10-31 15:07:38 +01:00
2026-10-19 00:53:44 +02:00
2026-10-23 20:48:23 +02:00
2026-10-10 15:35:12 +02:00
2026-09-19 19:19:29 +02:00
2026-10-17 23:08:55 +02:00
2026-10-05 00:19:39 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 15:38:32 +02:00
2026-10-21 01:05:12 +02:00
2026-10-20 00:45:22 +02:00
2026-09-29 21:21:19 +02:00
2026-10-23 20:48:23 +02:00
2026-10-05 00:19:39 +02:00
2026-10-19 00:19:03 +02:00
2026-10-19 02:36:19 +02:00
2026-10-24 11:29:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:32:20 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-25 13:51:26 +01:00
2026-10-18 23:45:53 +02:00
2026-10-05 03:16:27 +02:00
2026-10-12 20:54:47 +02:00
2026-10-18 23:45:53 +02:00
2026-10-19 00:19:03 +02:00
2026-10-19 00:19:03 +02:00
2026-10-05 03:16:27 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 23:45:53 +02:00
2026-09-04 20:29:33 +02:00
2026-10-05 00:19:39 +02:00
2026-09-04 20:29:33 +02:00
2026-10-19 21:42:07 +02:00
2026-10-20 01:56:31 +02:00
2026-10-05 00:19:39 +02:00
2026-10-18 23:45:53 +02:00
2026-10-19 01:28:38 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-08-23 07:43:06 +02:00
2026-10-06 21:02:07 +02:00
2026-10-18 23:45:53 +02:00
2026-10-20 00:45:22 +02:00
2026-10-18 23:45:53 +02:00
2026-10-19 00:19:03 +02:00
2026-10-19 02:03:14 +02:00
2026-10-10 21:56:47 +02:00
2026-08-28 02:37:56 +02:00
2026-10-21 02:05:33 +02:00
2026-10-28 18:48:21 +01:00
2026-10-28 18:48:21 +01:00
2026-09-19 07:34:17 +02:00
2026-10-05 00:19:39 +02:00
2026-10-18 23:45:53 +02:00
2026-10-19 02:32:20 +02:00
2026-10-18 23:45:53 +02:00
2026-10-15 04:58:16 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-19 02:03:14 +02:00
2026-09-01 23:31:49 +02:00
2026-10-21 02:05:33 +02:00
2026-10-25 00:32:26 +02:00
2026-10-05 00:19:50 +02:00
2026-10-13 00:14:09 +02:00
2026-10-11 04:42:55 +02:00
2026-10-13 00:14:09 +02:00
2026-10-13 00:14:09 +02:00
2026-10-15 04:58:16 +02:00
2026-10-18 21:21:19 +02:00
2026-10-18 02:23:15 +02:00
2026-10-20 01:56:30 +02:00
2026-10-24 11:29:14 +02:00
2026-10-05 00:19:39 +02:00
2026-08-23 07:43:06 +02:00
2026-10-19 02:03:14 +02:00
2026-10-29 23:07:54 +01:00
2026-08-23 07:43:06 +02:00
2026-10-18 23:45:53 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-10-18 23:45:53 +02:00
2026-10-05 00:19:39 +02:00
2026-10-20 01:56:31 +02:00
2026-10-25 02:50:34 +02:00
2026-10-18 23:45:53 +02:00
2026-10-05 03:16:27 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 02:03:14 +02:00
2026-10-19 21:42:07 +02:00
2026-10-25 13:51:26 +01:00
2026-10-19 02:03:14 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-08 21:18:48 +02:00
2026-10-19 22:11:20 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-28 21:53:59 +01:00
2026-10-28 18:48:21 +01:00
2026-10-20 04:36:26 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-05 00:19:39 +02:00
2026-10-19 22:11:20 +02:00
2026-10-19 22:11:20 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 22:11:57 +02:00
2026-10-28 18:56:12 +01:00
2026-10-28 18:48:21 +01:00
2026-10-28 21:53:59 +01:00
2026-10-20 04:36:26 +02:00
2026-09-27 13:58:23 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-19 21:42:07 +02:00
2026-10-20 01:56:30 +02:00
2026-10-06 23:55:41 +02:00
2026-10-11 05:34:25 +02:00
2026-10-05 00:19:39 +02:00
2026-10-25 02:50:34 +02:00
2026-10-04 17:53:19 +02:00
2026-10-05 00:19:38 +02:00
2026-10-20 01:56:30 +02:00
2026-10-31 15:07:38 +01:00
2026-10-25 04:01:42 +01:00
2026-10-25 00:32:27 +02:00
2026-10-06 23:55:41 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:50 +02:00
2026-10-25 00:32:26 +02:00
2026-10-19 22:11:20 +02:00
2026-08-23 07:43:06 +02:00
2026-10-18 15:38:32 +02:00
2026-10-05 00:19:39 +02:00
2026-10-23 22:07:11 +02:00
2026-10-25 13:51:25 +01:00
2026-10-25 00:32:26 +02:00
2026-10-24 16:00:37 +02:00
2026-08-23 07:43:06 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-11 05:34:25 +02:00
2026-10-15 04:58:16 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-05 00:19:39 +02:00
2026-10-18 03:45:18 +02:00
2026-10-19 02:03:14 +02:00
2026-10-23 22:07:11 +02:00
2026-08-23 07:43:06 +02:00
2026-08-23 07:43:06 +02:00
2026-10-23 23:45:54 +02:00
2026-10-18 23:45:53 +02:00
2026-10-18 23:45:53 +02:00
2026-09-05 04:02:57 +02:00
2026-10-05 00:19:38 +02:00
2026-10-05 00:19:39 +02:00
2026-10-27 05:29:49 +01:00
2026-10-24 11:29:14 +02:00
2026-10-05 00:19:39 +02:00
2026-10-18 23:45:53 +02:00
2026-10-13 00:14:09 +02:00
2026-09-18 22:50:37 +02:00
2026-09-19 04:51:31 +02:00
2026-10-25 13:51:25 +01:00
2026-10-05 00:19:39 +02:00