model-eol 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,13 +3,14 @@
3
3
  ![npm](https://img.shields.io/npm/v/model-eol)
4
4
  [![marketplace](https://img.shields.io/badge/marketplace-model--eol%20check-blue?logo=github)](https://github.com/marketplace/actions/model-eol-check)
5
5
  ![CI](https://github.com/thossullivan/model-eol/actions/workflows/ci.yml/badge.svg)
6
+ [![feed refresh](https://github.com/thossullivan/model-eol/actions/workflows/feed-refresh.yml/badge.svg)](https://github.com/thossullivan/model-eol/actions/workflows/feed-refresh.yml)
6
7
  ![spec](https://img.shields.io/badge/spec-model--eol%2F0.1-blue)
7
8
  ![deps](https://img.shields.io/badge/runtime%20deps-zero-brightgreen)
8
9
  ![node](https://img.shields.io/badge/node-%3E%3D20-brightgreen)
9
10
  ![license](https://img.shields.io/badge/license-MIT-blue)
10
11
 
11
12
  **A machine-readable deprecation feed format for AI models, plus the reference
12
- tooling that turns it into a Dependabot for models.** v0.2.4.
13
+ tooling that turns it into a Dependabot for models.**
13
14
 
14
15
  ![model-eol demo: retired models, distributor clocks, worst-case date](docs/img/demo.gif)
15
16
 
@@ -32,7 +33,7 @@ second, so the existing trackers can converge instead of each scraping alone.
32
33
  replacement, `distributions` for per-channel lifecycles, and publisher `policy`
33
34
  floors. Small enough that a provider could serve it at
34
35
  `/.well-known/model-eol.json` in an afternoon.
35
- - **`feeds/`** - <!-- feeds-status -->Amazon (4 entries), Anthropic (29 entries), Google (64 entries) and OpenAI (194 entries), generated from the providers' live deprecation pages plus the AWS Bedrock and Google Vertex AI lifecycle pages, feed data generated 2026-08-03<!-- /feeds-status -->. Every
36
+ - **`feeds/`** - <!-- feeds-status -->Amazon (4 entries), Anthropic (29 entries), Google (86 entries) and OpenAI (194 entries), generated from the providers' live deprecation pages plus the AWS Bedrock and Google Vertex AI lifecycle pages, feed data generated 2026-08-18<!-- /feeds-status -->. Every
36
37
  dated entry carries a source URL.
37
38
  - **`check.mjs`** - zero-dependency CLI: CI gate, PR diff gate, inventory, CycloneDX
38
39
  ML-BOM export, retirement schedule, alerts and badges, migration plan/apply.
@@ -162,6 +163,37 @@ coverage limits are counted. With no config the CLI keeps its historical
162
163
  (`days: 90`, `scope: direct`, and the publisher clock). The complete contract is
163
164
  [`schema/model-eol.bot-config.schema.json`](schema/model-eol.bot-config.schema.json).
164
165
 
166
+ Mixed-provider monorepos can keep those top-level values as repository defaults,
167
+ then apply path policies and a lifecycle channel per reference:
168
+
169
+ ```json
170
+ {
171
+ "days": 90,
172
+ "scope": "direct",
173
+ "overrides": [
174
+ { "paths": ["services/**"], "scope": "all" },
175
+ { "paths": ["services/bedrock/**"], "days": 180, "via": "aws-bedrock" }
176
+ ],
177
+ "routes": [
178
+ { "paths": ["services/vertex/**"], "via": "vertex-ai" },
179
+ {
180
+ "paths": ["services/bedrock/**"],
181
+ "match": "chat-prod",
182
+ "model": "claude-3-7-sonnet-20250219",
183
+ "via": "aws-bedrock"
184
+ }
185
+ ]
186
+ }
187
+ ```
188
+
189
+ Matching overrides apply in order: later scalar values win and ignore lists are
190
+ additive. The last matching route wins. Exact `match`/`model` pairs resolve a
191
+ repository deployment alias without making cloud or gateway references patchable.
192
+ Explicit CLI flags and Action inputs still take precedence. JSON inventory and
193
+ plan output records each reference's effective threshold, scope, requested
194
+ channel, and matching rule indexes, so a Bedrock service and a direct publisher
195
+ call in the same repository do not silently share one global clock.
196
+
165
197
  ## Same weights, different clocks
166
198
 
167
199
  The same model retires on different dates per channel, and a checker that ignores
@@ -202,20 +234,24 @@ stay visible without generating false alarms.
202
234
  The scanner covers code and configuration files with [`CODE_EXT`](lib/scanner.mjs)
203
235
  as the source of truth - Python, TypeScript/JavaScript, JSON/YAML/TOML, shell,
204
236
  Ruby, Go, Java, C#, Rust, C/C++, PHP, Swift, Kotlin, Terraform, SQL, Scala, and
205
- Objective-C. Terraform files (`.tf`, `.tfvars`) are scanned while `.terraform`
206
- directories stay excluded.
237
+ Objective-C, including `.baml` sources. Publisher-compatible BAML provider/model
238
+ pairs are eligible plan targets; generated BAML clients and conservative
239
+ `DO NOT EDIT`/`@generated` sources are skipped. Model-eol's own JSON reports are
240
+ also skipped on reruns, while third-party CycloneDX files remain scannable unless
241
+ they carry explicit model-eol generator provenance. Terraform files (`.tf`,
242
+ `.tfvars`) are scanned while `.terraform` directories stay excluded.
207
243
 
208
244
  ## The bot
209
245
 
210
246
  Copy `bot.yml.example` to `.github/workflows/model-eol-bot.yml` for a weekly run
211
247
  that maintains exactly one labelled migration PR per retiring model (full feed
212
248
  context in the body, never auto-merged) and one issue per finding that needs a
213
- human. The workflow runs `model-eol@0` from npm in both jobs; consumer repositories
214
- do not need to copy `check.mjs` or the `bot/` source directory. Dismissals are
215
- respected; a changed shutdown date reopens. Configure via `.model-eol.json`:
216
- thresholds, scope, ignores, and an optional plan-level eval hook that can inspect
217
- `MODEL_EOL_PLAN` before publication. Preview everything with no GitHub calls and
218
- without adding a project dependency:
249
+ human. The workflow resolves `model-eol@0` from npm once and reuses that exact
250
+ version across its plan, read-only evaluation, and write-token publication jobs;
251
+ consumer repositories do not copy `check.mjs` or the `bot/` source directory.
252
+ Dismissals are respected, reintroduced retired models create fresh work, and
253
+ bot-owned PRs/issues close when their finding disappears. Preview everything with
254
+ no GitHub calls and without adding a project dependency:
219
255
 
220
256
  ```sh
221
257
  npx --yes --package=model-eol@0 model-eol-bot --dry-run --target-dir . --repo OWNER/REPO
@@ -224,21 +260,26 @@ npx --yes --package=model-eol@0 model-eol-bot --dry-run --target-dir . --repo OW
224
260
  The workflow honors configured `days`, `scope`, and `via` values; without a config
225
261
  it uses the bot defaults of 90 days and direct references. `eval.command` also
226
262
  comes from the config unless the `MODEL_EOL_EVAL_COMMAND` repository variable is
227
- set as an explicit workflow override. In the split workflow this command runs
228
- once in the unmodified, read-only checkout; it is a plan preflight, not a test of
229
- each patched migration branch.
263
+ set as an explicit workflow override. Each patchable model is applied in an
264
+ isolated checkout and evaluated independently with its own old/new IDs, timeout,
265
+ bounded report, and explicitly allowed environment. The content-bound result
266
+ manifest is also pinned to the evaluated Git commit, letting passing migrations
267
+ proceed while a failing peer remains blocked without publishing against a newer,
268
+ unevaluated default branch.
230
269
 
231
270
  On its first actionable run, the bot creates the `model-eol` label. If repository
232
- policy prevents label creation or assignment, it warns and still publishes work;
233
- metadata in each PR or issue preserves idempotence. For HTTPS remotes—including
234
- private repositories—the bot passes `GITHUB_TOKEN` to its temporary Git processes
235
- as a host-scoped authorization header and never places it in a remote URL.
271
+ policy prevents label creation or assignment, it fails closed rather than publish
272
+ work whose ownership cannot be authenticated. Existing work is trusted only when
273
+ the label, metadata, deterministic branch, repository, base, and Git lease agree.
274
+ For HTTPS remotes—including private repositories—the bot passes `GITHUB_TOKEN` to
275
+ temporary Git processes as a host-scoped authorization header and never places it
276
+ in a remote URL.
236
277
 
237
278
  Two operational notes the hard way teaches: PRs created with `GITHUB_TOKEN` do not
238
279
  trigger `pull_request` workflows (use a fine-grained PAT or GitHub App token when
239
280
  checks must run, stored as the optional `MODEL_EOL_BOT_TOKEN` secret), and the
240
- workflow splits privileges—provider keys live only in the read-only plan/eval job,
241
- write tokens only in the publish job.
281
+ workflow splits privileges—provider keys live only in the read-only evaluation
282
+ job, while write tokens live only in the reconciliation job.
242
283
 
243
284
  ## Keeping the feeds honest
244
285