-
Notifications
You must be signed in to change notification settings - Fork 0
Phase 2.6.Q — models.dev as the model-metadata source (ADR-0071) #76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
cemililik
wants to merge
53
commits into
main
Choose a base branch
from
development
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
53 commits
Select commit
Hold shift + click to select a range
796e10f
docs(roadmap): 2.6.C merged (PR #75) — and file the e2e/real-history.…
cemililik eaa7511
docs(adr): ADR-0071 — models.dev becomes the model-metadata source; t…
cemililik 996d0fb
docs(adr): ADR-0071 §10 — the section I dropped in the rewrite, incl.…
cemililik 394acb7
feat(llm): the generated model catalog — 90 models, priced offline, w…
cemililik 4bd00a7
style: prettier-format package.json after the sync:models script addi…
cemililik 2d7b051
fix(llm): fold the Step-1 review — both money guards were blind, and …
cemililik 79e0d95
feat(llm): the effort bridge — the accepted tiers are COMPUTED from t…
cemililik 344bc83
fix(llm): the reasoning field is chosen PER MODEL — the live bug, in …
cemililik 1395b9a
fix(llm): the adapters asked whether an effort axis EXISTED, not whet…
cemililik bda0b10
feat(core,cli): the effort gate and the picker now ask the MODEL whic…
cemililik fbb83ca
fix(llm): the acceptance set described ONE axis of a model that publi…
cemililik edaffac
fix(cli,core): the CLI had FOUR answers to "can this model take an ef…
cemililik 466445e
fix(cli,llm): the withheld-tier notice was wired at TWO of the nine p…
cemililik 9030339
fix(llm): the output cap had no ceiling to check against, and the fie…
cemililik 94636a1
fix(llm): renaming the cap field stopped it shadowing the escape hatc…
cemililik ce6cfbf
fix(llm,core,cli): the estimate clamped a gateway it must not — under…
cemililik 5216c43
feat(llm,cli)!: retire the hand-typed price table — the catalog is th…
cemililik 0b0b9b2
fix(llm,cli): the swap shipped three of its own safety properties bro…
cemililik e9c4367
fix(cli,db,llm): a partial override was not partial, and I told the u…
cemililik dddb001
feat(cli,llm,shared): models refresh gets its second axis — and it st…
cemililik 3f3d084
fix(llm,cli): the refresh "floor" was `if (true)` — a downgrade recor…
cemililik 77c88ac
fix(cli): the refresh count could exceed what installed, and the byte…
cemililik 785468d
feat(core,cli,shared): an unpriced model is said out loud, and strict…
cemililik 70f086e
fix(cli): the unpriced notice was dropped on the in-Home chat and two…
cemililik 3945c0d
fix(core,cli): WorkflowEngine took onUnpriced + resolveEndpoint and d…
cemililik ec0b2ee
ci(llm): the two ADR-0071 §9 guards — a weekly price-change check, a …
cemililik 21943b4
fix(llm,ci): the Gemini effort probe was a tautology — on the one pro…
cemililik 95a5880
fix(llm,repo): the gate meant to stop a tautological probe did not ch…
cemililik 987d8df
fix: fold the PR #76 review — CI unblock, real bugs, and Sonar/comple…
cemililik 7a12a5a
test(cli): de-flake the reseat-carry O(n) perf guard (min-of-21, thre…
cemililik aff4960
test(cli): make the O(n) wrap SHAPE ratio local-only; consolidate a d…
cemililik 5702ee0
style: prettier --write the repo (format:check drift); test(cli): per…
cemililik 589b103
fix(cli): persist the picked model's provider so a chat over an un-in…
cemililik af5281d
fix(cli): couple default_provider to default_model's config layer (Bu…
cemililik ff71911
fix(llm): rescue an alias↔dated-pin sibling from a wrong not-on-key dim
cemililik 953d9d4
test(llm): anchor Bug-2's anthropic-only + fabrication-guard scoping …
cemililik d509f6b
feat(cli): present reasoning effort as "one row per distinct outcome"
cemililik e96735d
fix(cli): close the global-boundary coupling gap; normalize the provi…
cemililik 78c5115
fix(cli): fold the Bug-1 review — project the picker highlight/✓/labe…
cemililik d7697ac
fix(ci,repo): build @relavium/shared before the model-catalog guards …
cemililik 9ff9446
fix(core,llm,cli): key the pre-egress endpoint on the routing provide…
cemililik 5aecd84
fix(db): reset the user pricing columns on clearUserPricing so a re-p…
cemililik be165bc
fix(cli): couple the in-Home default model/provider and buffer pre-st…
cemililik fb9e40e
fix(llm): send OpenAI's per-model top reasoning tier so `max` reaches…
cemililik e1809ee
feat(core,llm,cli): surface the cap-driven reasoning withhold as a `c…
cemililik 8278057
fix(llm): parse models.dev enrichment fields leniently so a shape cha…
cemililik b839edd
feat(llm): gate request parameters on per-model capability so a model…
cemililik 665aca8
feat(llm,cli): collapse alias↔dated-pin pairs to the rolling alias in…
cemililik cfd4517
fix(llm,cli): review lows — cost-cap safety, sanitization, and a misl…
cemililik 9315bd8
docs: fold the 2.6.Q doc-drift lows — pricing precedence, the phantom…
cemililik d674a1b
fix(db,cli,ci): fold the 2.6.Q polish — migration idiom, redirect mes…
cemililik 957db49
fix(llm): tolerate a reasoning_options CONTAINER shape change too (ad…
cemililik 14f6817
refactor(llm,core,docs): fold the review nits — Sonar smells, one cat…
cemililik File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| # The model-catalog guards (ADR-0071 §9). Two scheduled lanes, neither of which gates a PR: | ||
| # | ||
| # • weekly-catalog-check — did any ALREADY-SHIPPED model's price MOVE or VANISH? A moved price feeds the | ||
| # ADR-0028 cost cap, so it is a HUMAN decision surfaced as a red check, never a silent bot commit. `pnpm | ||
| # sync:models` exits non-zero on a moved/vanished shipped price; benign additive drift stays green (a weekly | ||
| # red-no-matter-what trains the maintainer to ignore it — the erosion sync.mjs's own comments warn against). | ||
| # | ||
| # • nightly-effort-conformance — the ONLY mechanism that catches a stale catalog re-introducing the reasoning | ||
| # bug: for each shipped reasoning model it asks the REAL provider whether it accepts every tier the catalog | ||
| # claims. A one-off manual probe proves a fact once; the catalog drifts continuously, so this runs nightly. | ||
| # | ||
| # Third-party actions are pinned to a full commit SHA (the `# vX.Y.Z` comment tracks the release) — the same | ||
| # convention ci.yml uses, so a moved tag cannot inject unreviewed code. | ||
| name: model-catalog | ||
|
|
||
| on: | ||
| schedule: | ||
| # Monday 06:00 UTC — the drift check. Ahead of a typical review week, so a red one is seen on Monday. | ||
| - cron: '0 6 * * 1' | ||
| # 07:00 UTC nightly — the live effort conformance (key-gated; skips with no key). | ||
| - cron: '0 7 * * *' | ||
| # Manual trigger for both, so a maintainer can run either on demand without waiting for the cron. | ||
| workflow_dispatch: {} | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: model-catalog-${{ github.event_name }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| weekly-catalog-check: | ||
| name: shipped-price-change guard | ||
| # Only the weekly cron (and a manual run); the nightly cron skips this job. | ||
| if: github.event.schedule != '0 7 * * *' | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 10 | ||
| steps: | ||
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 | ||
| with: | ||
| persist-credentials: false | ||
| - name: Set up pnpm | ||
| uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 | ||
| - name: Set up Node | ||
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | ||
| with: | ||
| node-version-file: .nvmrc | ||
| cache: pnpm | ||
| - name: Install (frozen lockfile) | ||
| run: pnpm install --frozen-lockfile | ||
| # `pnpm sync:models` builds `@relavium/llm` AND its `@relavium/shared` dependency first (via turbo `^build`) — | ||
| # the `@relavium/*` `exports` resolve only to `dist/`, which is gitignored, so a fresh runner has no built | ||
| # `@relavium/shared` and the sync's own `tsc`/dist import would otherwise die on TS2307 before any guard runs. | ||
| # `pnpm sync:models` fetches models.dev, normalizes it, and applies the money guards. It fails RED on the ONE | ||
| # thing that must be a human decision: a MOVED or VANISHED price on a model we already ship (a rate that | ||
| # silently moves also silently moves how much the ADR-0028 cost cap protects). It does NOT red on benign | ||
| # additive drift — models.dev adds models in our four providers constantly, and a check that is red every | ||
| # week trains the maintainer to ignore it, which is exactly how the price-change protection would erode | ||
| # (sync.mjs says so in its own comments). New models "merge automatically" via the deferred auto-PR | ||
| # (deferred-tasks.md); until it lands they are simply picked up by the next local `pnpm sync:models`. The | ||
| # snapshot this job writes into the ephemeral CI checkout is discarded — only the exit code is the guard. | ||
| - name: No ALREADY-SHIPPED model's price moved or vanished | ||
| run: pnpm sync:models | ||
|
|
||
| nightly-effort-conformance: | ||
| name: effort conformance (live) | ||
| # Only the nightly cron (and a manual run); the weekly cron skips this job. | ||
| if: github.event.schedule != '0 6 * * 1' | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 20 | ||
| steps: | ||
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 | ||
| with: | ||
| persist-credentials: false | ||
| - name: Set up pnpm | ||
| uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 | ||
| - name: Set up Node | ||
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | ||
| with: | ||
| node-version-file: .nvmrc | ||
| cache: pnpm | ||
| - name: Install (frozen lockfile) | ||
| run: pnpm install --frozen-lockfile | ||
| # Build the dependency closure first: the conformance suite imports `@relavium/shared`, whose `exports` resolve | ||
| # only to a gitignored `dist/`. Without this a fresh runner cannot resolve the cross-package entry and EVERY | ||
| # conformance file errors out before a single live probe — a red that looks identical to a real catalog drift. | ||
| # Turbo `^build` builds `@relavium/shared` ahead of `@relavium/llm` (mirrors ci.yml's pre-test build). | ||
| - name: Build workspace dependencies | ||
| run: pnpm turbo run build --filter=@relavium/llm | ||
| # Guard against a FALSE-GREEN nightly: the live cases are `it.skipIf(<key> === '')`, so with NO provider secret | ||
| # configured EVERY probe skips and the suite passes — a green that means "nothing was checked", indistinguishable | ||
| # from "all tiers verified". Fail loudly instead, so a green nightly is proof that probes actually ran. | ||
| - name: Require at least one provider secret | ||
| run: | | ||
| if [ -z "${ANTHROPIC_API_KEY}${OPENAI_API_KEY}${GEMINI_API_KEY}${DEEPSEEK_API_KEY}" ]; then | ||
| echo "::error::No provider secret is configured — every live effort probe would SKIP, and a green run would falsely read as 'all tiers verified'. Configure at least one of ANTHROPIC/OPENAI/GEMINI/DEEPSEEK_API_KEY." | ||
| exit 1 | ||
| fi | ||
| env: | ||
| ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} | ||
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | ||
| GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} | ||
| DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | ||
| # The conformance suite (fixtures + the `it.skipIf(<key> === '')` live cases). With the provider keys set here | ||
| # the live cases execute — and a catalog that claims a tier a model rejects fails red — while a missing key | ||
| # simply skips that provider's lane. Scoped to `src/conformance` so a flaky live case cannot widen the red | ||
| # surface to the whole package's unit suite. | ||
| - name: Live effort conformance | ||
| run: pnpm --filter @relavium/llm exec vitest run src/conformance | ||
| env: | ||
| ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} | ||
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | ||
| GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} | ||
| DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: HodeTech/Relavium
Length of output: 874
🌐 Web query:
GitHub Actions Node 20 deprecation actions/checkout v4 setup-node v4 pnpm action-setup v4 Node 24 runners June 2 2026 September 16 2026💡 Result:
GitHub Actions has deprecated Node.js 20 in favor of Node.js 24 as part of the runner runtime migration [1][2]. The transition involves two key dates in 2026: 1. June 16, 2026: Node.js 24 became the default runtime for GitHub Actions [3][4]. Actions that rely on Node.js 20 will trigger deprecation warnings if they have not been updated to support Node.js 24 [5]. 2. September 16, 2026: Node.js 20 is scheduled to be removed from GitHub Actions runners [5]. To address deprecation warnings and ensure compatibility, maintainers must update their workflows to use versions of actions that support Node.js 24 (often v5 or higher for core actions like actions/checkout, actions/setup-node, and pnpm/action-setup) [6]. Migration details: - Environment Variables: During the transition, users could use FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true to force Node.js 24 usage or ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true to temporarily continue using Node.js 20 after it was deprecated [2][5]. - Action Compatibility: Standard actions such as actions/checkout@v4 and pnpm/action-setup@v4 may trigger warnings if they are not updated to a version explicitly configured for the Node.js 24 runtime environment [7][6][5]. Users are encouraged to bump these to the latest available major versions [6].
Citations:
🏁 Script executed:
Repository: HodeTech/Relavium
Length of output: 5753
🌐 Web query:
actions/checkout v5 node24 runtime release notes actions/setup-node v5 node24 runtime release notes pnpm/action-setup v5 node24 runtime release notes GitHub Actions Node 20 deprecation warning current runners 2026💡 Result:
As of July 13, 2026, the migration from Node.js 20 to Node.js 24 for GitHub Actions is in effect. Node.js 20 reached end-of-life in April 2026 [1][2][3], and GitHub has deprecated Node.js 20 support on GitHub Actions runners, with an enforcement date of June 2, 2026 [4][5]. Key Details: - Official Actions Support: The major versions of standard actions, including actions/checkout (v5.0.0+) [6][7] and actions/setup-node (v5.0.0+) [8][9], have been updated to use the Node.js 24 runtime. - Runner Requirement: To use these v5 versions, your GitHub Actions runner must be updated to at least version v2.327.1 [10][8][11]. - Deprecation Status: Node.js 20-based actions will trigger a deprecation warning annotation at the end of job runs [5]. Users are expected to migrate their workflows to use actions that support the Node.js 24 runtime [1][5]. - pnpm/action-setup: While specific v5 release notes for pnpm/action-setup were not explicitly surfaced in the same format as official actions/ repositories, the broader migration requires that all actions running on GitHub-hosted runners be compatible with the Node.js 24 environment [5]. Users should check the repository's latest release for v5+ updates to ensure Node.js 24 compatibility.
Citations:
Upgrade these pinned GitHub Actions off the Node 20 line
.github/workflows/models-catalog.yml:40-46,70-76—actions/checkout,actions/setup-node, andpnpm/action-setupare still on v4 releases; move them to the current Node 24-compatible majors to avoid deprecation warnings and future runner failures.🤖 Prompt for AI Agents