Files
turnstone/tests
Patrick Buckley c3beb202eb fix(ui): apply round-2 review + fix-sanity findings (composer caches)
An unprimed convergence re-review found a real login-recovery seam gap plus
cleanups (round 1's fix round manufactured one of them); fix-sanity vetted the plan.

- console onLoginSuccess recovery seam [0]+[2]: it re-warmed only skills+models
  after an in-place login; projects+personas (same pre-auth-401 gap) stayed empty
  (rail group-by-project flat, saved-coordinator raw slugs). Now force-refreshes
  ALL FOUR caches on login — force so a still-in-flight failing pre-auth fetch
  yields a trailing AUTHENTICATED refetch rather than coalescing onto the 401
  (skills/personas have no *_changed event to recover). Threads an optional
  callOpts through the four cache modules + console wrappers (backward-compatible;
  every non-console caller passes nothing).

- fork skill paint [4]: the round-1 wrapper extraction left the modal skill paint
  unconditional on a fork (wasted GET /v1/api/skills + hidden-select rebuild);
  fork-gate it like model/persona/project.

- persona wrapper [5]: extract _paintPersonaSelect so all four composer pickers
  share the sync-then-refresh wrapper instead of persona being inline-duplicated.

- dead machinery [6]: remove the zero-subscriber onModelsChange/onSkillsChange and
  the models fpExtra fingerprint fold (and the now-orphaned core fpExtra branch).
  The console repaints models via its direct models_changed handler, not a
  subscription; the fold only fed the subscriber-only fingerprint.

- O(1) modelLabel [7]: index the models cache by alias (keyField) so modelLabel is
  a getByKey, not a per-paint scan.

Declines documented in-code: forks-inherit-model [1] (deliberate) and the
fail-open cache [3] (intended, same policy as projects/personas). Deferral comment
at the ui onLoginSuccess twin (recovers on dashboard re-focus; follow-up).

Tests: rewrote the 7 guards the code changes moved (persona relocation, callOpts
threading, force, fpExtra removal) preserving their ordering intent, and added
fork-skill-gate, persona-wrapper, all-four-force, keyField, and
onModelsChange-removed coverage. 106 pass; ruff + mypy green.
2026-07-19 02:39:38 -07:00
..