Robin Fernandes
59fad62a40
fix(free-tier): review follow-ups — read the classifier's context, never replace a locked identity, re-inventory on retry
...
Correctness
- The welcome-tier recovery hooks (model_not_free move, wrong-host heal) and
the long-wait rate-limit check read the turn's extract_api_error_context()
dict, which never carries welcome_refusal / welcome_route. They now read
classified.error_context, where _nous_welcome_tier parks them; the guard
records the classifier's reset_at. Tests drive the real classifier and the
real extractor so the two-context boundary is exercised.
- The connector path caught every AnonCredentialDead and re-minted; a locked
account (anon_account_locked) is now retired without replacement, matching
the inference resolver.
- A background bootstrap retry reused the boot-time provider inventory; it
re-inventories, so a provider connected during the cooldown keeps
inference.
- The desktop's setup.ready listener only refreshes an untouched picker
(oauth mode, no local endpoint, idle flow) and re-checks after the
readiness round, so an API-key form opened meanwhile is never dismissed.
- /__log on the rehearsal server sent its response while holding the state
lock that _send re-acquires; the log is copied out first.
Reductions
- One shared FakePortal / install_portal (tests/hermes_cli/anon_portal.py)
behind both free-tier fixtures, with a single httpx.Client transport seam.
- The rehearsal server's static inference answers are a table; dead
scaffolding (REAL_PAID_URL, claim_codes, the no-op dead_once branch,
extra_headers) removed.
- Setup-notice copy is a code-to-key map; its test uses real codes (the old
loop built nonexistent ones and only exercised the fallback).
- The ineffective FreeTierErrorCode union is gone.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-15 20:44:42 +05:30
..
2026-09-12 05:09:11 -07:00
2026-09-13 05:07:50 -07:00
2026-09-03 17:13:22 -07:00
2026-09-13 05:07:11 -07:00
2026-09-13 05:07:11 -07:00
2026-09-15 05:42:35 -07:00
2026-09-15 04:56:01 -07:00
2026-09-06 20:50:02 +05:30
2026-09-02 13:29:48 -07:00
2026-09-15 04:53:38 -07:00
2026-09-02 18:56:06 -07:00
2026-09-13 09:18:02 -07:00
2026-09-15 03:34:20 -07:00
2026-09-15 04:51:15 -07:00
2026-09-13 05:20:26 -07:00
2026-09-14 20:01:19 +05:30
2026-09-13 05:07:11 -07:00
2026-09-06 05:37:03 -07:00
2026-09-06 05:37:03 -07:00
2026-09-14 20:01:19 +05:30
2026-09-02 20:10:26 -07:00
2026-09-02 21:38:20 -07:00
2026-09-03 17:13:22 -07:00
2026-09-15 04:52:47 -07:00
2026-09-11 19:39:12 -07:00
2026-09-07 06:02:22 -07:00
2026-09-13 05:19:48 -07:00
2026-09-07 07:06:58 -07:00
2026-09-14 06:55:54 -07:00
2026-09-02 18:18:18 -07:00
2026-09-15 04:45:33 -07:00
2026-09-02 18:49:57 -07:00
2026-09-02 18:49:57 -07:00
2026-09-02 18:49:57 -07:00
2026-09-03 17:13:22 -07:00
2026-09-03 17:13:22 -07:00
2026-09-04 00:15:16 -07:00
2026-09-15 03:39:07 -07:00
2026-09-15 04:12:13 -07:00
2026-09-07 05:24:15 -07:00
2026-09-07 05:24:15 -07:00
2026-09-15 20:44:42 +05:30
2026-09-02 18:47:54 -07:00
2026-09-15 04:49:47 -07:00
2026-09-15 03:39:07 -07:00
2026-09-06 22:45:31 +05:30
2026-09-15 03:47:15 -07:00
2026-09-03 09:44:26 -07:00
2026-09-03 09:44:26 -07:00
2026-09-13 05:09:43 -07:00
2026-09-07 05:59:08 -07:00
2026-09-13 05:09:43 -07:00
2026-09-11 02:07:48 -07:00
2026-09-15 03:37:49 -07:00
2026-09-15 04:17:31 -07:00
2026-09-13 05:20:26 -07:00
2026-09-15 05:19:57 -07:00
2026-09-15 04:12:13 -07:00
2026-09-15 04:17:31 -07:00
2026-09-02 18:57:14 -07:00
2026-09-07 08:06:48 -07:00
2026-09-13 05:09:43 -07:00
2026-09-03 22:00:01 -07:00
2026-09-11 03:45:33 +05:30
2026-09-03 09:44:26 -07:00
2026-09-12 05:56:15 -07:00
2026-09-07 08:19:32 -07:00
2026-09-15 06:08:20 -07:00
2026-09-15 04:12:13 -07:00
2026-09-03 04:31:46 -07:00
2026-09-15 20:44:42 +05:30
2026-09-15 04:12:13 -07:00
2026-09-02 13:29:48 -07:00
2026-09-03 17:13:22 -07:00
2026-09-09 11:29:56 -07:00
2026-09-02 18:22:13 -07:00
2026-09-15 06:20:15 -07:00
2026-09-15 03:54:01 -07:00
2026-09-14 06:44:54 -07:00
2026-09-11 15:26:46 -07:00
2026-09-03 17:13:22 -07:00
2026-09-04 00:15:16 -07:00
2026-09-07 08:08:04 -07:00
2026-09-12 01:35:05 -07:00
2026-09-15 03:58:05 -07:00
2026-09-12 08:23:13 -07:00
2026-09-02 18:53:53 -07:00
2026-09-09 13:08:25 +05:30
2026-09-09 10:58:16 -07:00
2026-09-07 08:28:43 -07:00
2026-09-02 18:22:13 -07:00
2026-09-02 18:58:42 -07:00
2026-09-02 18:22:13 -07:00
2026-09-11 11:54:49 -07:00
2026-09-03 22:00:01 -07:00
2026-09-15 05:38:31 -07:00
2026-09-03 09:44:26 -07:00
2026-09-02 18:22:13 -07:00
2026-09-02 18:29:05 -07:00
2026-09-02 22:21:06 -07:00
2026-09-13 05:19:48 -07:00
2026-09-15 03:47:15 -07:00
2026-09-02 18:28:38 -07:00
2026-09-02 18:28:38 -07:00
2026-09-14 20:35:28 +05:30
2026-09-03 09:44:26 -07:00
2026-09-15 06:29:50 -07:00
2026-09-02 19:10:21 -07:00
2026-09-15 03:54:58 -07:00
2026-09-11 16:50:20 -07:00
2026-09-02 18:33:06 -07:00
2026-09-13 05:09:43 -07:00
2026-09-15 20:44:42 +05:30
2026-09-06 09:11:04 -07:00
2026-09-13 05:09:06 -07:00
2026-09-02 19:05:15 -07:00
2026-09-03 09:44:26 -07:00
2026-09-11 15:26:46 -07:00
2026-09-09 12:17:57 +05:30
2026-09-03 09:44:26 -07:00
2026-09-03 15:07:39 -07:00
2026-09-02 19:10:21 -07:00
2026-09-02 18:22:01 -07:00
2026-09-13 05:09:43 -07:00
2026-09-15 06:29:50 -07:00
2026-09-03 17:13:22 -07:00
2026-09-14 06:55:54 -07:00
2026-09-03 09:44:26 -07:00
2026-09-02 18:33:06 -07:00
2026-09-12 13:44:52 -07:00
2026-09-02 18:44:36 -07:00
2026-09-02 19:10:21 -07:00
2026-09-15 06:16:38 -07:00
2026-09-11 03:45:33 +05:30
2026-09-02 19:18:18 -07:00
2026-09-02 18:51:24 -07:00
2026-09-13 05:19:48 -07:00
2026-09-14 20:35:28 +05:30
2026-09-13 21:27:35 -07:00
2026-09-10 09:22:31 -07:00
2026-09-15 06:26:29 -07:00
2026-09-03 17:13:22 -07:00
2026-09-15 03:44:36 -07:00
2026-09-03 17:13:22 -07:00
2026-09-03 09:44:26 -07:00
2026-09-13 19:23:09 +05:30
2026-09-13 05:09:43 -07:00
2026-09-08 04:38:47 -07:00
2026-09-03 17:13:22 -07:00
2026-09-02 19:18:18 -07:00
2026-09-03 04:56:59 +05:30
2026-09-15 04:56:40 -07:00
2026-09-06 05:35:12 -07:00
2026-09-15 04:18:34 -07:00
2026-09-13 05:07:11 -07:00
2026-09-02 19:19:44 -07:00
2026-09-03 17:13:22 -07:00
2026-09-15 03:34:20 -07:00
2026-09-07 07:10:28 -07:00
2026-09-15 06:29:50 -07:00
2026-09-03 17:13:22 -07:00
2026-09-03 03:31:03 -07:00
2026-09-03 10:40:25 -07:00
2026-09-03 12:29:52 -07:00
2026-09-03 13:29:35 -07:00
2026-09-02 19:42:28 -07:00
2026-09-03 03:31:03 -07:00
2026-09-12 08:34:07 -07:00
2026-09-02 19:36:47 -07:00
2026-09-09 10:31:26 +05:30
2026-09-15 04:13:13 -07:00
2026-09-03 13:24:04 -07:00
2026-09-04 00:15:16 -07:00
2026-09-13 05:20:26 -07:00
2026-09-15 04:12:13 -07:00
2026-09-02 19:42:28 -07:00
2026-09-15 06:08:20 -07:00
2026-09-10 02:21:16 +05:30
2026-09-15 04:17:31 -07:00
2026-09-12 21:07:46 -07:00
2026-09-06 22:56:51 +05:30
2026-09-12 08:25:14 -07:00
2026-09-03 17:13:22 -07:00
2026-09-04 00:15:16 -07:00
2026-09-04 00:15:16 -07:00
2026-09-03 09:44:26 -07:00
2026-09-04 00:15:16 -07:00
2026-09-15 20:44:42 +05:30
2026-09-15 20:44:42 +05:30
2026-09-14 20:35:28 +05:30
2026-09-10 10:45:57 -07:00
2026-09-06 13:21:17 -07:00
2026-09-15 04:18:34 -07:00
2026-09-15 04:12:13 -07:00
2026-09-15 04:12:13 -07:00
2026-09-15 04:18:34 -07:00
2026-09-15 04:18:34 -07:00
2026-09-15 04:12:13 -07:00
2026-09-13 14:46:42 -07:00
2026-09-15 04:12:13 -07:00
2026-09-15 04:12:13 -07:00
2026-09-09 12:17:57 +05:30
2026-09-15 04:12:13 -07:00
2026-09-15 04:12:13 -07:00
2026-09-06 13:21:17 -07:00
2026-09-06 13:21:17 -07:00
2026-09-15 20:44:42 +05:30
2026-09-07 06:15:43 -07:00
2026-09-15 04:12:13 -07:00
2026-09-02 18:40:01 -07:00
2026-09-15 20:44:42 +05:30
2026-09-02 19:30:27 -07:00
2026-09-02 19:26:50 -07:00
2026-09-03 09:44:26 -07:00
2026-09-15 04:12:13 -07:00
2026-09-15 04:12:13 -07:00
2026-09-06 14:19:42 -07:00
2026-09-06 13:21:17 -07:00
2026-09-10 02:44:26 -07:00
2026-09-10 11:48:01 -07:00
2026-09-15 04:56:01 -07:00
2026-09-13 05:08:29 -07:00
2026-09-02 19:19:54 -07:00
2026-09-02 18:29:10 -07:00
2026-09-02 19:07:07 -07:00
2026-09-12 13:44:52 -07:00
2026-09-04 00:15:16 -07:00
2026-09-15 04:48:20 -07:00
2026-09-03 17:13:22 -07:00
2026-09-04 07:17:00 -07:00