Skip to content

fix(tui): never trim the lane dial on missing logins; make lean a real blend - #54

Merged
atyrode merged 1 commit into
mainfrom
fix/lane-availability
Aug 23, 2026
Merged

fix(tui): never trim the lane dial on missing logins; make lean a real blend#54
atyrode merged 1 commit into
mainfrom
fix/lane-availability

Conversation

@atyrode

@atyrode atyrode commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Fixes the live regression where a machine without an OpenRouter login lost mixed and every led/only blend, leaving only gpt-only/claude-only.

What happened

New contract

  • The dial never shrinks on credentials. Every catalog lane stays listed; unusable ones render struck with a DeepSeek, OpenRouter — not logged in note, and cycling steps past them. A lane needs its genLanePolicies pools plus the Required pools (pure lanes only their own) — an optional login gates exactly its own lanes.
  • lean is a first-class blend: the blend dial offers led | lean | only per what the catalog serves; a lead switch re-clamps the blend (composeLane) so gpt never lands on a nonexistent gpt-lean.
  • Selection moves off unusable lanes (clampSel), suggestions skip them (quotaLane), noProviders still guards the accountless case.
  • filterRows drops fallback rungs on unconnected pools from the preview and the launch overlay, so relief tails degrade gracefully instead of naming models omp cannot route; the relief note names only spill pools a login backs.

Verification

  • Suite green (5 new/rewritten tests: availability marking, cycle skipping, lean round-trip + blend dial, rung filtering).
  • tmux smoke against a generated 4-pool catalog (O/A/D/R) with a fake omp token granting only O+A: all five leads visible with the login note, 3×Right pins at claude-led, blend child intact, persisted state clean.
  • Same smoke with all pools granted: ox lead exposes led lean only, selecting lean persists ox-lean and flips routing to paid-leads/ox-drains.

…l blend

Two regressions from the #47/#49/#52 window, both hit live:

- applyProviderAvailability deleted lanes from the dial, and required
  EVERY catalog pool connected before any blended lane survived. A
  catalog carrying the optional OpenRouter pool on a machine without an
  OpenRouter login therefore lost mixed and every led lane, leaving only
  gpt-only/claude-only - a missing optional credential nuked the blends
  between providers that WERE connected.

  Availability is now an annotation, not a trim: the dial always shows
  every catalog lane; unusable ones render struck with a '<providers> -
  not logged in' note and cycling steps past them (laneUsable). A lane
  needs its policy pools plus the Required pools (pure lanes only their
  own), so an optional login gates exactly its own lanes. The selection
  is moved off unusable lanes (clampSel); suggestions skip them
  (quotaLane); noProviders still guards the accountless case. Fallback
  rungs on unconnected pools are filtered from the preview and the
  launch overlay (filterRows), so relief tails degrade instead of
  naming models omp cannot route, and the relief note only names spill
  pools a login actually backs.

- laneSplit collapsed ox-lean into ('ox','led'), colliding with ox-led:
  the lean blend was unreachable from the split dial. laneSplit now
  carries the lane suffix verbatim, the blend dial offers led|lean|only
  (whatever the catalog serves per lead), and a lead switch re-clamps
  the blend to a served lane (composeLane) so gpt never lands on a
  nonexistent gpt-lean.
@atyrode
atyrode merged commit 52dd1bb into main Aug 23, 2026
1 check passed
@atyrode
atyrode deleted the fix/lane-availability branch August 23, 2026 11:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant