Skip to content

Refresh merge folds two new OpenAI snapshots that share a bare name #135

Closed

Description

@thossullivan

When two OpenAI deprecation rows share a bare name with different shutdown dates, and neither snapshot is in the committed feed yet, mergeFeed folds one snapshot into the other. The earlier snapshot becomes an alias of the later one and takes its date.

Repro on main (refresh/providers.mjs):

import { mergeFeed, parseOpenAIDeprecations, PROVIDERS } from './refresh/providers.mjs'
const page = `<h2>2026-10-01: X</h2><table><tr><th>Shutdown date</th><th>Model / system</th><th>Recommended replacement</th></tr>
<tr><td>Apr 1, 2027</td><td><code>gpt-x</code> | <code>gpt-x-2025-01-01</code></td><td><code>gpt-y</code></td></tr>
<tr><td>Jun 1, 2027</td><td><code>gpt-x</code> | <code>gpt-x-2025-06-01</code></td><td><code>gpt-y</code></td></tr></table>`
const r = mergeFeed({ spec: 'model-eol/0.1', publisher: 'openai', models: [] },
  { deprecations: parseOpenAIDeprecations(page), currentIds: null, provider: PROVIDERS.openai, notice: () => {} })
console.log(JSON.stringify(r.feed.models))

Output:

[{"id":"gpt-x-2025-06-01","announced":"2026-10-01","shutdown":"2027-06-01","aliases":["gpt-x-2025-01-01","gpt-x"],...}]

Expected: gpt-x-2025-01-01 is its own entry with shutdown 2027-04-01. A repo that uses it should see the earlier date, not the later one.

The bare name binds both rows, so the second row finds the first entry through the shared alias and merges into it. The lifecycle-conflict checks added in #128 do not catch this case: both entries are new in the same run.

No live row has this shape today. OpenAI started listing rows as alias | snapshot on 2026-10-23, so it can appear on any future page.

Fix: refuse (fail closed) when a row reaches an entry created earlier in the same run through an alias and gives a different lifecycle, or give each dated snapshot its own entry and leave the bare name to whichever rule we choose for it.

Activity

  1. thossullivan commented on Oct 24, 2026

    @thossullivan
    OwnerAuthor

    Decision: each dated snapshot keeps its own entry, and the shared bare name goes with the snapshot that retires first (the existing "earliest retirement wins" rule).

  2. added a commit that references this issue on Oct 25, 2026
    c01643e
  3. added a commit that references this issue on Oct 25, 2026
    0993d40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions