v0.25.1 — a model catalog synlynk actually trusts
v0.25.1 — a model catalog synlynk actually trusts
The previous goalpost, set across #2293/#2296/#2297/#2295, was to stop synlynk's dispatch layer from trusting a static, hand-maintained model list. That work landed in four independently reviewed PRs this cycle. This release closes the loop: it is the first version where every one of those pieces is live on main together, and where README.md's own release-doc gate (synlynk release --check-docs) has verified the public-facing claims against the actual code.
What changed
Four sub-tasks, four PRs, one spec (docs/superpowers/specs/2026-10-14-model-catalog-discovery-design.md):
- Schema (#2293).
harness_modelsgrew a 3-column primary key (harness_name, model_id, provider) and ten new columns — rate-card figures per Mtok,complexity_tier,max_effort_level, context/output token limits, and adiscovered_attimestamp distinct fromfirst_seen_at/last_seen_at. - Discovery pipeline (#2296).
run_model_catalog_discovery()iterates every harness inHARNESS_CAPABILITY_BASELINES— not a hardcoded four — probing live CLI listings where they exist, falling back to a config-file read or a curated default where they don't, and marking previously-seen-now-absent modelsstatus='stale'instead of deleting their history. - 24h auto-refresh (#2297).
is_model_catalog_stale()sits next to the existingis_probe_stale/is_smoke_test_stalechecks incapability_watch.pyand rides the same daemon-tick/CLI-startup trigger path — no new scheduler. - Dispatch-time resolution (#2295).
resolve_tier_model()now reads the live catalog first, falling back to the static seed only on a model-less fresh install. An explicit--modelonsynlynk dispatchis validated against the live catalog before the subprocess ever launches, failing fast with the current valid ids instead of burning a job to discover the id was wrong.
The goalpost moved itself mid-release
This spec existed because two live dispatch failures (grok-code-fast-1, a rejected Agy model id) traced back to the static catalog. While reviewing and merging these same four PRs, the exact failure mode recurred twice more — a dispatch to grok-code-fast-1 and a stale Agy model id (gemini-3.1-pro-low) both failed live, independent of this release's own code, simply because synlynk/models.py's BUILTIN_MODEL_CATALOG was already out of date against the real CLIs. That isn't a coincidence to note in passing; it's the strongest evidence this cycle produced that the fix was overdue, generated by the review process for the fix itself.
Also fixed in this release, found along the way rather than planned: gh:#2288's recurring daemon crash on _repo_common_dir() when the daemon was started from a non-root worktree (#2289) — unrelated to the catalog work, but it kept interrupting role-token refresh mid-session and was worth clearing before the cut.
Goalpost
With a live, periodically-refreshed catalog in state.db and dispatch validating against it, the next goalpost is gh:#2076's GenericAPIAdapter — wiring an actual OpenRouter/LiteLLM gateway into the now-ready provider column and no-op gateway loop, so a model's rate card can come from a provider API response instead of a curated guess.