Skip to content

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 21:53
· 137 commits to main since this release
3cee546

Minor Changes

  • 04a48e2: catherd 1.2: scores and model facts from public sources, bars that span several dimensions, and a profile that never breaks because a rung lacks a score. Run catherd init after upgrading (it asks for an optional Artificial Analysis key and syncs), then start a new Claude Code session (see MIGRATION.md, "From 1.1 to 1.2").

    • Public sources. models.dev, OpenRouter, LiteLLM, Arena (LMArena), Vectara's hallucination leaderboard and Epoch AI, keyless, plus Artificial Analysis with your own free key (init asks after Jev's, so piped init now reads four lines: the Jev key, the Artificial Analysis key, the profile, whether to replace it; ARTIFICIAL_ANALYSIS_API_KEY wins; it is saved in credentials.json and workers never see it). The MCP server syncs them in the background at session start, each at most every 12 hours; catherd catalog sync [--force] [--unmatched] and the catalog_sync tool (26 MCP tools) sync on demand. A failed source keeps its last good answer; offline, catherd routes on the scores it ships. CATHERD_NO_SYNC=1 turns the automatic syncs off.
    • Calibration and confidence. Each dimension has an anchor unit; other sources are fitted onto it (at least 5 shared rungs, R² ≥ 0.5). A value's confidence is verified, measured, calibrated, adjacent (the same model at another effort), secondary or inferred; the override still wins, then the better level, then the newer date, and a value older than 90 days drops a level.
    • New dimensions and bars. agentic, steer and frontend join repo_code, terminal and honesty. The default bars span several dimensions per kind and difficulty (a terminal lane gates on Terminal-Bench, a ui lane on WebDev), at the 25th, 50th, 60th and 75th percentiles of the rungs measured or better, each with its barsWhy in scores.json. Your override's bars now override per dimension; null removes a threshold.
    • Unscored is a warning. A rung with no value on a dimension the bars use takes its nearest stand-in's (ranked on price, context, release date, vendor, family, effort and its own values; Artificial Analysis's features with a key) as inferred, and profile validate and doctor list it as a "stand-in to confirm". The error "unscored rung without a treat-like" is gone. A save that fixes one of a profile's errors and adds none now goes through (profile set, profile_set, the dashboard's save), listing the errors still open.
    • treat-like. catherd catalog treat-like --suggest <rung> ranks the three nearest stand-ins; --clear <rung> and --reset remove your mappings, naming first the profile rungs left on an inferred stand-in or left unscored.
    • Why a rung. route reports each threshold of the lane's bar, the value used, its confidence and source (inferred values marked), the rung's speed and cost facts, and catherd's own run evidence ("12 lanes, 2 climbed, 1 partial"), which never changes routing; catalog_query and catalog list show the same. In the dashboard, r in Profiles syncs and shows each source's age and last error, i shows a rung's values and runs, and t opens the treat-like picker with the three nearest stand-ins first.
    • Shipped scores. catalog/scores.json carries the keyless sources' values with their source, date and confidence (never Artificial Analysis's), attributed in catalog/ATTRIBUTION.md; a weekly workflow refreshes them in a chore(catalog): refresh scores PR.