Skip to content

fix(launch): pool-qualify leveled tokens; ox advisor net; ox-lean lane - #49

Merged
atyrode merged 1 commit into
mainfrom
fix/ox-config-and-lean-lane
Aug 22, 2026
Merged

fix(launch): pool-qualify leveled tokens; ox advisor net; ox-lean lane#49
atyrode merged 1 commit into
mainfrom
fix/ox-config-and-lean-lane

Conversation

@atyrode

@atyrode atyrode commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Fixes for the first live ox session, plus the reshape that makes the next lane cheap.

Bugs from live use

  1. Wrong provider prefix in every ox fallback chainopenai-codex/stealth/ox-alpha:high in launched configs. Root cause: prefixed() is handed routing tokens that still carry their thinking level (id:level), while the catalog facts are keyed on the bare id. Every ox token missed the pool lookup and fell through to the two-provider name heuristic. The fix strips the level before the lookup and qualifies the full token. Regression coverage: a leveled-token unit test plus an end-to-end genConfigYAML assertion that no heuristic prefix leaks onto ox ids.

  2. Advisor blind spotsadvisorChain didn't know the ox lanes: ox-only's second opinion was Claude (pure lanes keep their own pool), and the mixed ox lanes shipped a bare lead with no fallback. Now ox-only maps to the ox advisor context, and ox-led/ox-lean append an explicit spend-order net to the chain: the other paid pool's glance rung, then the free pool itself — Anthropic → OpenAI → Ox Alpha, exactly the shape a dead quota needs.

  3. Data-level (dotfiles side, riding the next pin bump): the ox entries declared low→high / low→max — ranges claim contiguous scales, and Ox Alpha skips medium/xhigh. Comma lists now.

The reshape

genCombo's lane logic was becoming an arm per lane. It's now a declarative lanePolicy tableprimary / delib / util / vision / visionSmart / pure per lane, one pool(role) resolution rule (pure → primary; delib override; reviewer crossing; util override; else primary). lanePrimary/lanePure are gone. New setups are table rows, not branches.

That immediately buys ox-lean — the mirror of ox-led, i.e. your paid-default ask: OpenAI (primary) keeps default/task/librarian, Anthropic keeps the deliberative roles, and the free pool absorbs scout/sonic/smol/tiny/commit and vision. fable may lead deliberative roles and fable-as-main is allowed — handing the elite the default seat on a paid-work lane is coherent here (unlike ox-led, where it would defeat the point). spark is invalid (its drain-bucket leads are ox on this lane); fast stays (the OpenAI primary is real).

Notes

  • listW cap raised for the eight-value lane dial (verified unclipped at 150 cols).
  • Function inventory diffed against HEAD: only lanePrimary/lanePurelanePolicy.pool changed; nothing else lost.
  • Full suite green locally before push, including new TestOxLeanRoutingPolicy, TestPrefixedLeveledTokens, TestGenConfigYAMLOxLed.

Three fixes from live use, one reshape:

- prefixed() received tokens still carrying their thinking level
  ("stealth/ox-alpha:high") while the catalog facts are keyed on the bare
  id — every ox reference missed the pool lookup and fell to the
  two-provider name heuristic, launching configs whose fallback chains
  named openai-codex/stealth/ox-alpha. Strip the level before the lookup,
  qualify the full token; regression-tested end to end against a rendered
  grid.

- The advisor context ignored the ox lanes: ox-only's second opinion was
  Claude, and the mixed ox lanes shipped no cross-pool net. advisorChain
  now maps ox-only to the ox table and gives ox-led/ox-lean an explicit
  spend-order tail — the other paid pool's glance rung, then the free pool
  — so a dead quota never leaves the second eye blind.

- genCombo's lane logic moved from hand-written branches to a declarative
  lanePolicy table (primary/delib/util/vision/pure per lane). New lanes are
  data rows now; that immediately buys ox-lean, the mirror of ox-led: paid
  providers keep default/task/librarian while the free pool absorbs
  scout/sonic/smol/tiny/commit and vision. Fable may lead the deliberative
  roles and fable-as-main may take the default seat — on this lane that is
  a feature, not a contradiction. spark is invalid here (its drain leads
  are ox), fast stays (the OpenAI primary is real).

Also widens listW for the eight-value lane dial and updates the models-file
docs: ranges claim contiguous thinking scales, so holed models must be
comma lists — the exact mistake the Ox Alpha entries made.
@atyrode
atyrode merged commit de0bac8 into main Aug 22, 2026
1 check passed
@atyrode
atyrode deleted the fix/ox-config-and-lean-lane branch August 22, 2026 13:32
atyrode added a commit to atyrode/dotfiles that referenced this pull request Aug 22, 2026
* feat(catalog): Ox Alpha on pool R; pin code 0.4.13 + omp 18.0.0

- omp/models.yml: add stealth/ox-alpha as the first pool-R family — one
  model declared once per tier with ascending thinking ceilings
  (low→low / low→high / low→max), which is how a single-model family rides
  the generator's ladder. Free while OpenRouter's promotional window lasts;
  the file notes how to retire it. refreshed: 2026-08-22.
- omp/refresh-model-facts.py: know pool R (openrouter) so the refresher can
  update the ox facts in place, and adapt to omp 18's bench payload — the
  run aggregate moved from models[].average (flat) to models[].stats (per-
  field min/p50/mean/...); both shapes accepted, mean selected.
- pkgs/code: 0.4.12 → 0.4.13 (pool R + ox lanes; required — the previous
  release rejects pool R and would fail the catalog build).
- pkgs/omp: 17.4.0 → 18.0.0. Contract review v17.4.1..v18.0.0: no model-id
  or agent renames; new settings additive with defaults; hashline edit mode
  unchanged (sloppy is only a fallback for models without it); extensions
  use none of the reshaped pi-tui macOS APIs; bench --json shape change is
  handled above. nix build .#omp + omp --smoke-test pass.

* fix(catalog): declare ox thinking as comma lists; pin code 0.4.15

Ox Alpha skips medium/xhigh, so ranges claim levels the API rejects —
declare the offered set explicitly (per atyrode/code#49). The pin rides
the first release carrying the DeepSeek provider pool (#44).
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